Merge branch release-2021
authorMark Abraham <mark.j.abraham@gmail.com>
Fri, 29 Jan 2021 07:57:31 +0000 (08:57 +0100)
committerMark Abraham <mark.j.abraham@gmail.com>
Fri, 29 Jan 2021 09:17:20 +0000 (10:17 +0100)
Resolved conflicts:

        admin/gitlab-ci/gromacs.gitlab-ci.yml
        admin/gitlab-ci/python-gmxapi01.gitlab-ci.yml
        api/nblib/gmxsetup.cpp
        api/nblib/listed_forces/gmxcalculator.cpp
        api/nblib/listed_forces/tests/calculator.cpp
        api/nblib/molecules.cpp
        api/nblib/molecules.h
        api/nblib/ppmap.h
        api/nblib/tests/integrator.cpp
        api/nblib/topologyhelpers.cpp
        docs/install-guide/index.rst
        python_packaging/src/setup.py
        src/gromacs/gmxpreprocess/pdb2gmx.cpp
        src/gromacs/gmxpreprocess/readir.cpp
        src/gromacs/gmxpreprocess/topdirs.cpp
        src/gromacs/math/densityfit.cpp
        src/gromacs/mdrun/md.cpp
        src/gromacs/mdrunutility/handlerestart.cpp
        src/gromacs/modularsimulator/simulatoralgorithm.cpp
        src/gromacs/nbnxm/cuda/nbnxm_cuda_data_mgmt.cu
        src/gromacs/nbnxm/nbnxm_gpu_data_mgmt.cpp
        src/gromacs/nbnxm/nbnxm_gpu_data_mgmt.h
        src/gromacs/nbnxm/opencl/nbnxm_ocl_data_mgmt.cpp
        src/gromacs/pulling/pull.cpp

Mostly from refactoring in master that clashed with fixes in
release-2021. Preserved the functionality from the latter in the form
of the former.

Some changes are simply due to the change to clang-format
configuration.

One CI configuration change for mdrun-only build is adapted, since
mdrun-only build has been removed.

204 files changed:
.gitlab-ci.yml
CMakeLists.txt
admin/containers/utility.py
admin/copyright.py
admin/git-pre-commit
admin/gitlab-ci/gromacs.gitlab-ci.yml
admin/gitlab-ci/gromacs.matrix.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.clang-8-cuda-10.0.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.clang-8-cuda-10.1-release.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.clang-8.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.clang-9-mpi.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.clang-9-release.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.clang-ASAN.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.clang-TSAN.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.clang-UBSAN.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.clang-static-analyzer.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.gcc-10.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.gcc-7-cuda-10.2.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.gcc-8-cuda-11.0-release.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.gcc-8-cuda-11.0.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.gcc-9-release.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.icc-2021.1.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-opencl-release.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-opencl.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-sycl.gitlab-ci.yml [new file with mode: 0644]
admin/gitlab-ci/python-gmxapi01.gitlab-ci.yml
admin/gitlab-ci/sample_restraint.gitlab-ci.yml
api/legacy/include/gromacs/fileio/tpxio.h
api/nblib/CMakeLists.txt
api/nblib/box.h
api/nblib/exception.h
api/nblib/forcecalculator.cpp
api/nblib/gmxsetup.cpp
api/nblib/gmxsetup.h
api/nblib/interactions.cpp
api/nblib/interactions.h
api/nblib/kerneloptions.h
api/nblib/listed_forces/bondtypes.h
api/nblib/listed_forces/calculator.cpp
api/nblib/listed_forces/calculator.h
api/nblib/listed_forces/conversions.hpp
api/nblib/listed_forces/dataflow.hpp
api/nblib/listed_forces/definitions.h
api/nblib/listed_forces/gmxcalculator.cpp [deleted file]
api/nblib/listed_forces/gmxcalculator.h [deleted file]
api/nblib/listed_forces/helpers.hpp
api/nblib/listed_forces/kernels.hpp
api/nblib/listed_forces/tests/CMakeLists.txt
api/nblib/listed_forces/tests/bondtypes.cpp
api/nblib/listed_forces/tests/calculator.cpp
api/nblib/listed_forces/tests/conversions.cpp
api/nblib/listed_forces/tests/helpers.cpp
api/nblib/listed_forces/tests/linear_chain_input.hpp
api/nblib/listed_forces/tests/refdata/FourCenter_ProperDihedralTest_CheckListed_0.xml [moved from api/nblib/listed_forces/tests/refdata/FourCenter_ListedForcesProperDihedralTest_CheckListed_0.xml with 100% similarity]
api/nblib/listed_forces/tests/refdata/FourCenter_ProperDihedralTest_CheckListed_1.xml [moved from api/nblib/listed_forces/tests/refdata/FourCenter_ListedForcesProperDihedralTest_CheckListed_1.xml with 100% similarity]
api/nblib/listed_forces/tests/refdata/FourCenter_ProperDihedralTest_CheckListed_2.xml [moved from api/nblib/listed_forces/tests/refdata/FourCenter_ListedForcesProperDihedralTest_CheckListed_2.xml with 100% similarity]
api/nblib/listed_forces/tests/refdata/ListedExampleData_CanReduceEnergies.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/ListedExampleData_CanReduceForces.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicAngleEnergies.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicAngleForces.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicBondEnergies.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicBondForces.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/ThreeCenter_HarmonicAngleTest_CheckListed_0.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/ThreeCenter_HarmonicAngleTest_CheckListed_1.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/ThreeCenter_HarmonicAngleTest_CheckListed_2.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/TwoCenter_HarmonicBondTest_CheckListed_0.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/TwoCenter_HarmonicBondTest_CheckListed_1.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/refdata/TwoCenter_HarmonicBondTest_CheckListed_2.xml [new file with mode: 0644]
api/nblib/listed_forces/tests/transformations.cpp
api/nblib/listed_forces/tests/typetests.cpp
api/nblib/listed_forces/traits.h
api/nblib/listed_forces/transformations.cpp
api/nblib/listed_forces/transformations.h
api/nblib/molecules.cpp
api/nblib/molecules.h
api/nblib/nblib.h
api/nblib/particlesequencer.cpp [new file with mode: 0644]
api/nblib/particlesequencer.h [new file with mode: 0644]
api/nblib/particletype.h
api/nblib/pbc.hpp
api/nblib/ppmap.h [deleted file]
api/nblib/samples/CMakeLists.txt
api/nblib/samples/argon-forces-integration.cpp
api/nblib/samples/methane-water-integration.cpp [new file with mode: 0644]
api/nblib/samples/tests/CMakeLists.txt [deleted file]
api/nblib/sequencing.hpp [new file with mode: 0644]
api/nblib/simulationstate.cpp
api/nblib/simulationstate.h
api/nblib/tests/gmxcalculator.cpp
api/nblib/tests/integrator.cpp
api/nblib/tests/molecules.cpp
api/nblib/tests/nbkernelsystem.cpp
api/nblib/tests/testhelpers.h
api/nblib/tests/testsystems.cpp
api/nblib/tests/topology.cpp
api/nblib/topology.cpp
api/nblib/topology.h
api/nblib/topologyhelpers.cpp
api/nblib/topologyhelpers.h
api/nblib/util/CMakeLists.txt
api/nblib/util/setup.cpp [moved from api/nblib/util/user.cpp with 91% similarity]
api/nblib/util/setup.h [new file with mode: 0644]
api/nblib/util/tests/CMakeLists.txt
api/nblib/util/tests/setup.cpp [moved from api/nblib/util/tests/user.cpp with 97% similarity]
api/nblib/util/tests/traits.cpp [moved from api/nblib/util/tests/internal.cpp with 74% similarity]
api/nblib/util/traits.hpp [moved from api/nblib/util/internal.h with 54% similarity]
api/nblib/util/util.hpp [moved from api/nblib/util/user.h with 60% similarity]
api/nblib/vector.h
cmake/gmxGenerateVersionInfoWithoutGit.cmake
cmake/gmxVersionInfo.cmake
docs/CMakeLists.txt
docs/conf.cmakein.py
docs/install-guide/index.rst
docs/reference-manual/plots/GMX_logos/gmx_falcon_black.eps [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_black.png [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_black.svg [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.eps [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.png [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.svg [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.eps [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.png [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.svg [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_white.png [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_falcon_white.svg [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_black.eps [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_black.png [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_black.svg [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_blue.eps [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_blue.png [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_blue.svg [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.eps [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.png [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.svg [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_white.png [new file with mode: 0644]
docs/reference-manual/plots/GMX_logos/gmx_logo_white.svg [new file with mode: 0644]
docs/reference-manual/plots/peregrine-old.jpg [moved from docs/reference-manual/plots/peregrine.jpg with 100% similarity]
docs/reference-manual/plots/peregrine-old.png [moved from docs/reference-manual/plots/peregrine.png with 100% similarity]
docs/reference-manual/special/free-energy-implementation.rst
docs/reference-manual/special/plots/lambda-values.pdf [new file with mode: 0644]
docs/reference-manual/special/plots/lambda-values.svg [new file with mode: 0644]
docs/reference-manual/topologies/particle-type.rst
docs/reference-manual/topologies/topology-file-formats.rst
docs/release-notes/2020/2020.5.rst
docs/release-notes/2020/2020.6.rst [new file with mode: 0644]
docs/release-notes/2021/2021.1.rst [new file with mode: 0644]
docs/release-notes/2021/major/bugs-fixed.rst
docs/release-notes/2021/major/deprecated-functionality.rst
docs/release-notes/2021/major/highlights.rst
docs/release-notes/2021/major/performance.rst
docs/release-notes/index.rst
docs/user-guide/mdp-options.rst
python_packaging/docker/gromacs-dependencies.dockerfile
python_packaging/docker/gromacs.dockerfile
python_packaging/src/gmxapi/version.py
python_packaging/src/setup.py
src/gromacs/applied_forces/awh/biasstate.cpp
src/gromacs/applied_forces/electricfield.cpp
src/gromacs/fileio/checkpoint.cpp
src/gromacs/fileio/tpxio.cpp
src/gromacs/gmxana/gmx_msd.cpp
src/gromacs/gmxana/gmx_xpm2ps.cpp
src/gromacs/gmxpreprocess/pdb2gmx.cpp
src/gromacs/gmxpreprocess/readir.cpp
src/gromacs/gmxpreprocess/tests/fragment2.pdb
src/gromacs/gmxpreprocess/tests/fragment4.pdb
src/gromacs/gmxpreprocess/topdirs.cpp
src/gromacs/gmxpreprocess/topdirs.h
src/gromacs/gmxpreprocess/topio.cpp
src/gromacs/gpu_utils/cuda_arch_utils.cuh
src/gromacs/gpu_utils/tests/devicetransfers_sycl.cpp
src/gromacs/gpu_utils/tests/hostallocator.cpp
src/gromacs/hardware/device_management_sycl.cpp
src/gromacs/listed_forces/gpubonded_impl.cu
src/gromacs/listed_forces/gpubondedkernels.cu
src/gromacs/listed_forces/listed_forces.cpp
src/gromacs/math/densityfit.cpp
src/gromacs/math/paddedvector.h
src/gromacs/math/tests/paddedvector.cpp
src/gromacs/math/tests/testarrayrefs.h
src/gromacs/mdlib/coupling.cpp
src/gromacs/mdlib/expanded.cpp
src/gromacs/mdlib/expanded_internal.cpp [new file with mode: 0644]
src/gromacs/mdlib/expanded_internal.h [moved from api/nblib/samples/tests/samples.cpp with 65% similarity]
src/gromacs/mdlib/tests/CMakeLists.txt
src/gromacs/mdlib/tests/expanded.cpp [new file with mode: 0644]
src/gromacs/mdrunutility/handlerestart.cpp
src/gromacs/modularsimulator/signallers.cpp
src/gromacs/modularsimulator/signallers.h
src/gromacs/modularsimulator/simulatoralgorithm.cpp
src/gromacs/nbnxm/cuda/nbnxm_cuda_data_mgmt.cu
src/gromacs/nbnxm/gpu_data_mgmt.h
src/gromacs/nbnxm/nbnxm_gpu_data_mgmt.cpp
src/gromacs/nbnxm/nbnxm_gpu_data_mgmt.h
src/gromacs/nbnxm/opencl/nbnxm_ocl_data_mgmt.cpp
src/gromacs/pulling/pull.cpp
src/gromacs/random/seed.cpp
src/gromacs/simd/impl_arm_sve/impl_arm_sve_definitions.h
src/gromacs/simd/impl_arm_sve/impl_arm_sve_simd_double.h
src/gromacs/simd/impl_arm_sve/impl_arm_sve_util_double.h
src/gromacs/simd/impl_arm_sve/impl_arm_sve_util_float.h
src/gromacs/taskassignment/resourcedivision.cpp
src/gromacs/topology/idef.cpp
src/gromacs/utility/binaryinformation.cpp
tests/CMakeLists.txt

index 14a91b6e8cedb8655469925aa7c9b738ee731f2c..61a480878599dc246589d664df588ebaf91bcba5 100644 (file)
@@ -53,6 +53,7 @@ include:
   # To do: Consider expanding matrix here to improve transparency and reduce file sizes.
   # E.g. '/admin/gitlab-ci/matrix/clang-8.gitlab-ci.yml
   - local: '/admin/gitlab-ci/gromacs.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix.gitlab-ci.yml'
   # Repository cleanliness. Source tidiness, linting, and policy compliance.
   - local: '/admin/gitlab-ci/lint.gitlab-ci.yml'
   # Web page and manual.
index 684ece050b17a362f467832972717cf5f4e51dfb..de9a8d67a185a5820943bca51be6856e47178093 100644 (file)
@@ -508,7 +508,7 @@ if (GMX_HWLOC)
         message(FATAL_ERROR "HWLOC package support required, but not found.")
     endif()
 
-    if (HWLOC_VERSION VERSION_LESS "2")
+    if (HWLOC_FOUND AND HWLOC_VERSION VERSION_LESS "2")
         message(STATUS "Support for hwloc versions 1.x is deprecated")
     endif()
 
index 046a8982452961fefa37460de0d1707889fa9c1f..47e943e0526090040f307b5603a8bdd4347e5392 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2020, by the GROMACS development team, led by
+# Copyright (c) 2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -130,7 +130,7 @@ parser.add_argument('--doxygen', type=str, nargs='?', const='1.8.5', default=Non
                     help='Add doxygen environment for documentation builds. Also adds other requirements needed for final docs images.')
 
 # Supported Python versions for maintained branches.
-_python_versions = ['3.6.10', '3.7.7', '3.8.2']
+_python_versions = ['3.6.10', '3.7.7', '3.8.2', '3.9.1']
 parser.add_argument('--venvs', nargs='*', type=str, default=_python_versions,
                     help='List of Python versions ("major.minor.patch") for which to install venvs. '
                          'Default: {}'.format(' '.join(_python_versions)))
index e54d602851034a93132373b1ebb92738d7e8d610..65b1fbec87e89e517c563106fb2b06c5520be7ae 100755 (executable)
@@ -3,7 +3,7 @@
 # This file is part of the GROMACS molecular simulation package.
 #
 # Copyright (c) 2013,2014,2015,2016,2018 by the GROMACS development team.
-# Copyright (c) 2019,2020, by the GROMACS development team, led by
+# Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -434,7 +434,7 @@ def main():
             if filename == '-':
                 sys.stdout.write(output)
             else:
-                with open(filename, 'w') as outputfile:
+                with open(filename, 'w', encoding='utf-8') as outputfile:
                     outputfile.write(output)
 
 if __name__ == "__main__":
index 6638b414fcbabc9869fbeb34bd0edb5fcd8a8071..e6506adaa1532ea5dc6df65320ea042c4d32a396 100755 (executable)
@@ -2,7 +2,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2013,2014,2015,2019,2020, by the GROMACS development team, led by
+# Copyright (c) 2013,2014,2015,2019,2020,2021, by the GROMACS development team.
 # Mark Abraham, David van der Spoel, Berk Hess, and 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.
 
 # This script is intended as a pre-commit hook that optionally runs all
-# changes through some formatting check.  Currently, it runs uncrustify and
+# changes through some formatting check.  Currently, it runs clang-format and
 # checks copyright headers.
 #
 # It needs to be copied as .git/hooks/pre-commit and configured with
-#   git config hooks.uncrustifypath /path/to/uncrustify
-#   git config hooks.uncrustifymode check
+#   git config hooks.clangformatpath /path/to/clang-format-7
+#   git config hooks.clangformatmode check
 #   git config hooks.copyrightmode update
 #
 # To disable the hook temporarily for a commit, set NO_FORMAT_CHECK environment
@@ -109,7 +109,8 @@ then
     clangformat_path=`git config hooks.clangformatpath`
     if [ -z "$clangformat_path" ]
     then
-        echo "Please set the path to clang-format using 'git config hooks.clangformatpath'."
+        echo "Please set the path to clang-format using 'git config hooks.clangformatpath /path/to/clang-format'."
+        echo "See https://manual.gromacs.org/current/dev-manual/code-formatting.html#gmx-clang-format"
         exit 1
     fi
     export CLANG_FORMAT="$clangformat_path"
index a4bfb3c13084c5395dfbcc2d65cb568183746cad..b2e2dd56e78080b982ed3a17201f1904a7a2f635 100644 (file)
@@ -1,7 +1,19 @@
-# Build, test, and install variously configured GROMACS installations.
+# Test goal: Initial build with close-to-default settings that always needs to pass before follow-up CI stages run
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: Clang
+#   Build type: Debug
+#   GPU: no
+#   SIMD: no
+#   Scope: configure, build, unit tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Compiler: Clang 9
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2
 
-# Initial build that always needs to pass before follow-up stages run
 simple-build:
+  # Test scope: configure, build, unit tests
   extends:
     - .variables:default
     - .use-ccache
@@ -77,1280 +89,3 @@ simple-build:
       - $BUILD_DIR/*log
     when: always
     expire_in: 1 week
-
-# Jobs running in first pre-build stage
-
-.gromacs:base:configure:
-  extends:
-    - .variables:default
-  stage: configure-build
-  cache: {}
-  variables:
-    KUBERNETES_CPU_LIMIT: 1
-    KUBERNETES_CPU_REQUEST: 1
-    KUBERNETES_MEMORY_REQUEST: 2Gi
-    CMAKE_COMPILER_SCRIPT: ""
-    CMAKE_EXTRA_OPTIONS: ""
-    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=AVX2_256"
-    CMAKE_MPI_OPTIONS: "-DGMX_THREAD_MPI=ON"
-    CMAKE_PRECISION_OPTIONS: "-DGMX_DOUBLE=OFF"
-    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=Debug"
-    CMAKE_GPU_OPTIONS: "-DGMX_GPU=OFF"
-  script:
-    - CMAKE=${CMAKE:-$(which cmake)}
-    - echo $CMAKE_COMPILER_SCRIPT
-    - echo $CMAKE_EXTRA_OPTIONS
-    - echo $CMAKE_SIMD_OPTIONS
-    - echo $CMAKE_GPU_OPTIONS
-    - echo $CMAKE_MPI_OPTIONS
-    - echo $CMAKE_PRECISION_OPTIONS
-    - echo $CMAKE_BUILD_TYPE_OPTIONS
-    - echo $CMAKE_GMXAPI_OPTIONS
-    - if [[ -d $BUILD_DIR ]] ; then
-      rm -rf $BUILD_DIR && mkdir $BUILD_DIR ;
-      else
-      echo "Preparing new build directory" ;
-      mkdir $BUILD_DIR ;
-      fi
-    - cd $BUILD_DIR
-    - $CMAKE ..
-      -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
-      $CMAKE_COMPILER_SCRIPT
-      $CMAKE_EXTRA_OPTIONS
-      $CMAKE_SIMD_OPTIONS
-      $CMAKE_MPI_OPTIONS
-      $CMAKE_PRECISION_OPTIONS
-      $CMAKE_BUILD_TYPE_OPTIONS
-      $CMAKE_GPU_OPTIONS
-      $CMAKE_GMXAPI_OPTIONS
-      -DCMAKE_INSTALL_PREFIX=../$INSTALL_DIR -DGMX_COMPILER_WARNINGS=ON
-      2>&1 | tee cmakeLog.log
-    - awk '/CMake Warning/,/^--|^$/' cmakeLog.log | tee cmakeErrors.log
-    - if [ -s cmakeErrors.log  ] ; then echo "Found CMake warning while processing build"; cat cmakeErrors.log ; exit 1; fi
-    - cd ..
-  artifacts:
-    when: always
-    paths:
-      - $BUILD_DIR
-
-.gromacs:base:release:configure:
-  extends:
-    - .variables:default
-  stage: release-configure
-  cache: {}
-  variables:
-    KUBERNETES_CPU_LIMIT: 1
-    KUBERNETES_CPU_REQUEST: 1
-    KUBERNETES_MEMORY_REQUEST: 2Gi
-    CMAKE_COMPILER_SCRIPT: ""
-    CMAKE_EXTRA_OPTIONS: ""
-    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=AVX2_256"
-    CMAKE_MPI_OPTIONS: "-DGMX_THREAD_MPI=ON"
-    CMAKE_PRECISION_OPTIONS: "-DGMX_DOUBLE=OFF"
-    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithAssert"
-    CMAKE_GPU_OPTIONS: "-DGMX_GPU=OFF"
-    CMAKE_REGRESSIONTEST_OPTIONS: "-DREGRESSIONTEST_PATH=../\\$RELEASE_REGRESSIONTESTS"
-    RELEASE_BUILD_DIR: release-builds
-    RELEASE_SOURCE: release-source-from-tarball
-    RELEASE_REGRESSIONTESTS: release-regressiontests-from-tarball
-  script:
-    - CMAKE=${CMAKE:-$(which cmake)}
-    - VERSION=`cat version.json |
-      python3 -c "import json,sys; print(json.load(sys.stdin)['version'])"`
-    - if [[ $GROMACS_RELEASE != "true" ]] ; then
-      VERSION=$VERSION-dev ;
-      fi
-    - SOURCENAME=gromacs-$VERSION
-    - SOURCETARBALL=$SOURCENAME.tar.gz
-    - REGTESTNAME=regressiontests-$VERSION
-    - REGTESTTARBALL=$REGTESTNAME.tar.gz
-    - echo "$SOURCETARBALL"
-    - echo "$REGTESTTARBALL"
-    - RELEASE_TARBALLS=release-tarballs
-    - rm -rf $RELEASE_TARBALLS $RELEASE_SOURCE $RELEASE_REGRESSIONTESTS && mkdir $RELEASE_TARBALLS
-    - mv $SOURCETARBALL $RELEASE_TARBALLS
-    - mv $REGTESTTARBALL $RELEASE_TARBALLS
-    - cd $RELEASE_TARBALLS
-    # We rename the source and regressiontest directories
-    # to have names for them that don't change for different versions.
-    - tar -xf $SOURCETARBALL
-    - mv $SOURCENAME ../$RELEASE_SOURCE
-    - tar -xf $REGTESTTARBALL
-    - mv $REGTESTNAME ../$RELEASE_REGRESSIONTESTS
-    - rm $SOURCETARBALL $REGTESTTARBALL
-    - cd ..
-    - echo $CMAKE_COMPILER_SCRIPT
-    - echo $CMAKE_EXTRA_OPTIONS
-    - echo $CMAKE_SIMD_OPTIONS
-    - echo $CMAKE_GPU_OPTIONS
-    - echo $CMAKE_MPI_OPTIONS
-    - echo $CMAKE_PRECISION_OPTIONS
-    - echo $CMAKE_BUILD_TYPE_OPTIONS
-    - echo $CMAKE_GMXAPI_OPTIONS
-    - if [[ -d $RELEASE_BUILD_DIR ]] ; then
-      echo "Cleaning up build directory" ;
-      rm -rf $RELEASE_BUILD_DIR && mkdir $RELEASE_BUILD_DIR ;
-      else
-      echo "Preparing new build directory" ;
-      mkdir $RELEASE_BUILD_DIR ;
-      fi
-    - cd $RELEASE_BUILD_DIR
-    - cmake ../$RELEASE_SOURCE/
-      -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
-      $CMAKE_COMPILER_SCRIPT
-      $CMAKE_EXTRA_OPTIONS
-      $CMAKE_SIMD_OPTIONS
-      $CMAKE_MPI_OPTIONS
-      $CMAKE_PRECISION_OPTIONS
-      $CMAKE_BUILD_TYPE_OPTIONS
-      $CMAKE_GPU_OPTIONS
-      $CMAKE_GMXAPI_OPTIONS
-      $CMAKE_REGRESSIONTEST_OPTIONS
-      -DCMAKE_INSTALL_PREFIX=../$INSTALL_DIR
-      2>&1 | tee cmakeLog.log
-    - awk '/CMake Warning/,/^--|^$/' cmakeLog.log | tee cmakeErrors.log
-    - if [ -s cmakeErrors.log  ] ; then echo "Found CMake warning while processing build"; cat cmakeErrors.log ; exit 1; fi
-    - cd ..
-  artifacts:
-    when: always
-    paths:
-      - $RELEASE_BUILD_DIR
-      - $RELEASE_REGRESSIONTESTS
-      - $RELEASE_SOURCE
-
-# Templates for configuration stage
-
-gromacs:gcc-10:configure:
-  extends:
-    - .gromacs:base:configure
-    - .use-gcc:base
-    - .use-opencl
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-gcc-10
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=AVX2_256"
-    CMAKE_EXTRA_OPTIONS: "-DGMX_EXTERNAL_CLFFT=ON -DGMX_INSTALL_LEGACY_API=ON"
-    COMPILER_MAJOR_VERSION: 10
-
-gromacs:clang-8-cuda-10.0:configure:
-  extends:
-    - .gromacs:base:configure
-    - .use-clang:base
-    - .use-cuda
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    CMAKE_SIMD_OPTIONS: "-DGMX_USE_SIMD_KERNELS=off"
-    CMAKE_EXTRA_OPTIONS: "-DGMX_CLANG_CUDA=ON"
-    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
-    COMPILER_MAJOR_VERSION: 8
-
-gromacs:gcc-7-cuda-10.2:configure:
-  extends:
-    - .gromacs:base:configure
-    - .use-gcc:base
-    - .use-cuda
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=SSE4.1"
-    COMPILER_MAJOR_VERSION: 7
-
-gromacs:gcc-8-cuda-11.0:configureMPI:
-  extends:
-    - .gromacs:base:configure
-    - .use-gcc:base
-    - .use-cuda
-    - .use-mpi
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=SSE4.1"
-    COMPILER_MAJOR_VERSION: 8
-
-gromacs:clang-TSAN:configure:
-  extends:
-    - .gromacs:base:configure
-    - .use-clang:base
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    COMPILER_MAJOR_VERSION: 8
-    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=TSAN"
-
-gromacs:icc-2021.1:configure:
-  extends:
-   - .gromacs:base:configure
-   - .use-icc-oneapi:base
-   - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-    COMPILER_MAJOR_VERSION: 2021
-
-gromacs:clang-8:configure:
-  extends:
-    - .gromacs:base:configure
-    - .use-clang:base
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
-  variables:
-    COMPILER_MAJOR_VERSION: 8
-
-gromacs:clang-9-mpi:configure:
-  extends:
-   - .gromacs:base:configure
-   - .use-clang:base
-   - .use-mpi
-   - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    COMPILER_MAJOR_VERSION: 9
-    CMAKE_PRECISION_OPTIONS: -DGMX_DOUBLE=ON
-
-gromacs:clang-static-analyzer:configure:
-  extends:
-    - .gromacs:base:configure
-    - .use-clang:base
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    CMAKE_COMPILER_SCRIPT: "-DCMAKE_CXX_COMPILER=/usr/local/libexec/c++-analyzer -DCMAKE_C_COMPILER=gcc"
-    CMAKE_EXTRA_OPTIONS: "-DGMX_CLANG_ANALYZER=ON -DGMX_OPENMP=OFF -DGMX_USE_RDTSCP=OFF -DGMX_FFT_LIBRARY=fftpack -DGMX_DEVELOPER_BUILD=ON"
-    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=None"
-
-gromacs:clang-ASAN:configure:
-  extends:
-    - .gromacs:base:configure
-    - .use-clang:base
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    COMPILER_MAJOR_VERSION: 8
-    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=ASAN"
-
-gromacs:oneapi-2021.1.1-opencl:configure:
-  extends:
-   - .gromacs:base:configure
-   - .use-oneapi:base
-   - .use-opencl
-   - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-    COMPILER_MAJOR_VERSION: 2021
-
-gromacs:oneapi-2021.1.1-sycl:configure:
-  extends:
-   - .gromacs:base:configure
-   - .use-oneapi:base
-   - .use-sycl
-   - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-    COMPILER_MAJOR_VERSION: 2021
-
-gromacs:clang-UBSAN:configure:
-  extends:
-    - .gromacs:base:configure
-    - .use-clang:base
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    COMPILER_MAJOR_VERSION: 8
-    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=UBSAN"
-
-gromacs:gcc-8-cuda-11.0:release:configure:
-  extends:
-    - .gromacs:base:release:configure
-    - .use-gcc:base
-    - .use-mpi
-    - .use-cuda
-    - .rules:nightly-only-for-release
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    COMPILER_MAJOR_VERSION: 8
-    RELEASE_BUILD_DIR: release-builds-gcc
-    CMAKE_BUILD_TYPE_OPTIONS : "-DCMAKE_BUILD_TYPE=RelWithAssert"
-    CMAKE_REGRESSIONTEST_OPTIONS: ""
-  dependencies:
-    - archive:package
-    - regressiontests:package
-    - prepare-release-version
-
-gromacs:gcc-9:release:configure:
-  extends:
-    - .gromacs:base:release:configure
-    - .use-gcc:base
-    - .use-opencl
-    - .rules:nightly-only-for-release
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-9
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    COMPILER_MAJOR_VERSION: 9
-    RELEASE_BUILD_DIR: release-builds-gcc
-    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithAssert"
-  dependencies:
-    - archive:package
-    - regressiontests:package
-    - prepare-release-version
-
-gromacs:clang-9:release:configure:
-  extends:
-    - .gromacs:base:release:configure
-    - .use-clang:base
-    - .use-mpi
-    - .rules:nightly-only-for-release
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    COMPILER_MAJOR_VERSION: 9
-    RELEASE_BUILD_DIR: release-builds-clang
-    CMAKE_PRECISION_OPTIONS: "-DGMX_DOUBLE=ON"
-    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithAssert"
-  dependencies:
-    - archive:package
-    - regressiontests:package
-    - prepare-release-version
-
-gromacs:clang-8-cuda-10.1:release:configure:
-  extends:
-    - .gromacs:base:release:configure
-    - .use-clang:base
-    - .use-cuda
-    - .rules:nightly-only-for-release
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.1
-  variables:
-    COMPILER_MAJOR_VERSION: 8
-    RELEASE_BUILD_DIR: release-builds-clang
-    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithAssert"
-
-gromacs:oneapi-2021.1.1-opencl:release:configure:
-  extends:
-   - .gromacs:base:release:configure
-   - .use-oneapi:base
-   - .use-opencl
-   - .rules:nightly-only-for-release
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-    COMPILER_MAJOR_VERSION: 2021
-    RELEASE_BUILD_DIR: release-builds-oneapi
-
-# Jobs running during build stage
-
-.gromacs:base:build:
-  stage: build
-  script:
-    - CMAKE=${CMAKE:-$(which cmake)}
-    - cd $BUILD_DIR
-    - $CMAKE --build . -- -j$KUBERNETES_CPU_LIMIT 2>&1 | tee buildLogFile.log
-    - $CMAKE --build . --target tests -- -j$KUBERNETES_CPU_LIMIT 2>&1 | tee testBuildLogFile.log
-    - awk '/warning/,/warning.*generated|^$/' buildLogFile.log testBuildLogFile.log
-      | grep -v "CMake" | tee buildErrors.log || true
-    - grep "cannot be built" buildLogFile.log testBuildLogFile.log | tee -a buildErrors.log || true
-    - $CMAKE --build . --target install 2>&1 | tee installBuildLogFile.log
-    - if [ -s buildErrors.log ] ; then echo "Found compiler warning during build"; cat buildErrors.log; exit 1; fi
-    - for file in `find . -mindepth 1 -name "*.o" ! -type l` ; do echo $file ; rm $file ; done 2>&1 > remove-build-objects.log
-    - cd ..
-  artifacts:
-    when: always
-    paths:
-      - $BUILD_DIR
-      - $INSTALL_DIR/
-
-.gromacs:static-analyzer-build:
-  stage: build
-  script:
-    - CMAKE=${CMAKE:-$(which cmake)}
-    - cd $BUILD_DIR
-    - scan-build -o scan_html $CMAKE --build . -- -j8 2>&1 | tee buildLogFile.log
-    - awk '/warning/,/warning.*generated|^$/' buildLogFile.log
-      | grep -v "CMake" | tee buildErrors.log || true
-    - grep "cannot be built" buildLogFile.log | tee -a buildErrors.log || true
-    - if [ -s buildErrors.log ] ; then echo "Found compiler warning during build"; cat buildErrors.log; exit 1; fi
-    - cd ..
-  artifacts:
-    when: always
-    paths:
-      - $BUILD_DIR/scan_html
-
-gromacs:gcc-10:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .before_script:default
-    - .use-ccache
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-gcc-10
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  needs:
-    - job: gromacs:gcc-10:configure
-
-gromacs:clang-8-cuda-10.0:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .use-clang:base
-    - .use-ccache
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  needs:
-    - job: gromacs:clang-8-cuda-10.0:configure
-
-gromacs:gcc-7-cuda-10.2:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .before_script:default
-    - .use-ccache
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-  needs:
-    - job: gromacs:gcc-7-cuda-10.2:configure
-
-gromacs:gcc-8-cuda-11.0:buildMPI:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .before_script:default
-    - .use-ccache
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-  needs:
-    - job: gromacs:gcc-8-cuda-11.0:configureMPI
-
-gromacs:clang-TSAN:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .use-clang:base
-    - .use-ccache
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  needs:
-    - job: gromacs:clang-TSAN:configure
-
-gromacs:icc-2021.1:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .use-icc-oneapi:base
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-  needs:
-    - job: gromacs:icc-2021.1:configure
-
-gromacs:clang-ASAN:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .use-clang:base
-    - .use-ccache
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-ASAN:configure
-
-gromacs:clang-UBSAN:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .use-clang:base
-    - .use-ccache
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-UBSAN:configure
-
-gromacs:clang-static-analyzer:build:
-  extends:
-    - .variables:default
-    - .gromacs:static-analyzer-build
-    - .use-clang:base
-    - .use-ccache
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-static-analyzer:configure
-
-gromacs:clang-8:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .before_script:default
-    - .use-ccache
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
-  needs:
-    - job: gromacs:clang-8:configure
-
-gromacs:oneapi-2021.1.1-opencl:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .use-ccache
-    - .use-oneapi:base
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-  needs:
-    - job: gromacs:oneapi-2021.1.1-opencl:configure
-
-gromacs:oneapi-2021.1.1-sycl:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .use-ccache
-    - .use-oneapi:base
-    - .rules:merge-and-post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-  needs:
-    - job: gromacs:oneapi-2021.1.1-sycl:configure
-
-gromacs:clang-9-mpi:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .before_script:default
-    - .use-ccache
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-  needs:
-    - job: gromacs:clang-9-mpi:configure
-
-gromacs:gcc-8-cuda-11.0:release:build:
-  extends:
-    - .variables:default  
-    - .gromacs:base:build
-    - .before_script:default
-    - .use-ccache
-    - .rules:nightly-only-for-release
-  stage: release-build
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    BUILD_DIR: release-builds-gcc
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
-  needs:
-    - job: gromacs:gcc-8-cuda-11.0:release:configure
-
-gromacs:gcc-9:release:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .before_script:default
-    - .use-ccache
-    - .rules:nightly-only-for-release
-  stage: release-build
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    BUILD_DIR: release-builds-gcc
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-9
-  needs:
-    - job: gromacs:gcc-9:release:configure
-
-gromacs:clang-9:release:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .before_script:default
-    - .use-ccache
-    - .rules:nightly-only-for-release
-  stage: release-build
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    BUILD_DIR: release-builds-clang
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
-  needs:
-    - job: gromacs:clang-9:release:configure
-
-gromacs:clang-8-cuda-10.1:release:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .before_script:default
-    - .use-ccache
-    - .rules:nightly-only-for-release
-  stage: release-build
-  variables:
-    BUILD_DIR: release-builds-clang
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.1
-  needs:
-    - job: gromacs:clang-8-cuda-10.1:release:configure
-
-gromacs:oneapi-2021.1.1-opencl:release:build:
-  extends:
-    - .variables:default
-    - .gromacs:base:build
-    - .use-oneapi:base
-    - .use-opencl
-    - .use-ccache
-    - .rules:nightly-only-for-release
-  stage: release-build
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-    BUILD_DIR: release-builds-oneapi
-    COMPILER_MAJOR_VERSION: 2021
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  needs:
-    - job: gromacs:oneapi-2021.1.1-opencl:release:configure
-
-# Jobs running during test stage
-
-.gromacs:base:test:
-  extends:
-    - .variables:default
-  stage: test
-  cache: {}
-  retry:
-    max: 1
-  variables:
-    CTEST_RUN_MODE: "ExperimentalTest"
-  script:
-    - CMAKE=${CMAKE:-$(which cmake)}
-    - cd $BUILD_DIR
-    - export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1:suppressions=$CI_PROJECT_DIR/admin/ubsan-suppressions.txt
-    # Needed to run MPI enabled code in the docker images, until we set up different users
-    - export OMPI_ALLOW_RUN_AS_ROOT=1
-    - export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1
-    - export ASAN_OPTIONS="check_initialization_order=1:detect_invalid_pointer_pairs=1:strict_init_order=true:strict_string_checks=true:detect_stack_use_after_return=true"
-    # If $GMX_TEST_REQUIRED_NUMBER_OF_DEVICES is not set and we have GPUs, set it
-    - if [ -z $GMX_TEST_REQUIRED_NUMBER_OF_DEVICES ] && [ -n $KUBERNETES_EXTENDED_RESOURCE_NAME ] ; then
-      if grep -q '/gpu$' <<< "$KUBERNETES_EXTENDED_RESOURCE_NAME"; then
-      echo "export GMX_TEST_REQUIRED_NUMBER_OF_DEVICES=\"$KUBERNETES_EXTENDED_RESOURCE_LIMIT\"";
-      export GMX_TEST_REQUIRED_NUMBER_OF_DEVICES="$KUBERNETES_EXTENDED_RESOURCE_LIMIT";
-      fi
-      fi
-    - if grep -qF 'nvidia.com/gpu' <<< "$KUBERNETES_EXTENDED_RESOURCE_NAME"; then
-      nvidia-smi || true;
-      fi
-    - ctest -D $CTEST_RUN_MODE --output-on-failure | tee ctestLog.log || true
-    - awk '/The following tests FAILED/,/^Errors while running CTest|^$/'
-      ctestLog.log | tee ctestErrors.log
-    - xsltproc $CI_PROJECT_DIR/scripts/CTest2JUnit.xsl Testing/`head -n 1 < Testing/TAG`/*.xml > JUnitTestResults.xml
-    - if [ -s ctestErrors.log ] ; then
-      echo "Error during running ctest";
-      exit 1;
-      fi
-    - cd ..
-  artifacts:
-    reports:
-      junit: $BUILD_DIR/JUnitTestResults.xml
-    paths:
-      - $BUILD_DIR/Testing
-      - $BUILD_DIR/tests
-    when: always
-    expire_in: 1 week
-
-.gromacs:base:regressiontest:
-  extends:
-    - .variables:default
-  variables:
-    KUBERNETES_CPU_LIMIT: 4
-    KUBERNETES_CPU_REQUEST: 4
-    KUBERNETES_MEMORY_REQUEST: 4Gi
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 4
-    REGRESSIONTEST_OMP_RANK_NUMBER: 2
-    REGRESSIONTEST_PME_RANK_NUMBER: 1
-    REGRESSIONTEST_MPI_RUN_COMMAND: ""
-    REGRESSIONTEST_DOUBLE: ""
-    REGRESSIONTEST_PARALLEL: "-nt"
-  stage: test
-  cache: {}
-  retry:
-    max: 1
-  script:
-    - export LSAN_OPTIONS="suppressions=$CI_PROJECT_DIR/admin/lsan-suppressions.txt:print_suppressions=0"
-    - export ASAN_OPTIONS="check_initialization_order=1:detect_invalid_pointer_pairs=1:strict_init_order=true:strict_string_checks=true:detect_stack_use_after_return=true"
-    # Needed to run MPI enabled code in the docker images, until we set up different users
-    - export OMPI_ALLOW_RUN_AS_ROOT=1
-    - export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1
-    - tar xzf gmx-regressiontests.tar.gz
-    - source $INSTALL_DIR/bin/GMXRC
-    - cd regressiontests
-    - perl gmxtest.pl $REGRESSIONTEST_PARALLEL $REGRESSIONTEST_TOTAL_RANK_NUMBER -ntomp $REGRESSIONTEST_OMP_RANK_NUMBER -npme $REGRESSIONTEST_PME_RANK_NUMBER $REGRESSIONTEST_DOUBLE $REGRESSIONTEST_MPI_RUN_COMMAND -xml all
-  artifacts:
-    paths:
-      - regressiontests/gmxtest.xml
-    when: always
-    expire_in: 1 week
-
-gromacs:gcc-10:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-gcc-10
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "amd.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    LD_LIBRARY_PATH: "/opt/rocm-3.5.0/opencl/lib"
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-10:build
-
-gromacs:clang-8-cuda-10.0:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-8-cuda-10.0:build
-
-gromacs:gcc-7-cuda-10.2:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-7-cuda-10.2:build
-
-gromacs:gcc-8-cuda-10.2:test-gpucommupd:
-  extends:
-    - .gromacs:base:test
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    GMX_GPU_DD_COMMS: 1
-    GMX_GPU_PME_PP_COMMS: 1
-    GMX_FORCE_UPDATE_DEFAULT_GPU: 1
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-7-cuda-10.2:build
-
-gromacs:clang-8:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
-  needs:
-    - job: gromacs:clang-8:build
-
-gromacs:clang-TSAN:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  needs:
-    - job: gromacs:clang-TSAN:build
-
-gromacs:icc-2021.1:test:
-  extends:
-    - .gromacs:base:test
-    - .use-icc-oneapi:base
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-  needs:
-    - job: gromacs:icc-2021.1:build
-
-gromacs:clang-ASAN:test:
-  extends:
-    - .gromacs:base:test
-    - .use-clang:base
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    CTEST_RUN_MODE: "ExperimentalMemCheck"
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-ASAN:build
-
-gromacs:clang-UBSAN:test:
-  extends:
-    - .gromacs:base:test
-    - .use-clang:base
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-UBSAN:build
-
-gromacs:oneapi-2021.1.1-opencl:test:
-  extends:
-    - .gromacs:base:test
-    - .use-oneapi:base
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-  needs:
-    - job: gromacs:oneapi-2021.1.1-opencl:build
-
-gromacs:oneapi-2021.1.1-sycl:test:
-  extends:
-    - .gromacs:base:test
-    - .use-oneapi:base
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-  needs:
-    - job: gromacs:oneapi-2021.1.1-sycl:build
-
-gromacs:clang-9-mpi:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-9-mpi:build
-
-gromacs:gcc-10:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-gcc-10
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "amd.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    REGRESSIONTEST_PME_RANK_NUMBER: 0
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
-    REGRESSIONTEST_OMP_RANK_NUMBER: 1
-    LD_LIBRARY_PATH: "/opt/rocm-3.5.0/opencl/lib"
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-10:build
-    - job: regressiontests:prepare
-
-gromacs:clang-8-cuda-10.0:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    REGRESSIONTEST_PME_RANK_NUMBER: 0
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
-    REGRESSIONTEST_OMP_RANK_NUMBER: 1
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-8-cuda-10.0:build
-    - job: regressiontests:prepare
-
-
-gromacs:gcc-7-cuda-10.2:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    REGRESSIONTEST_PME_RANK_NUMBER: 0
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
-    REGRESSIONTEST_OMP_RANK_NUMBER: 1
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-7-cuda-10.2:build
-    - job: regressiontests:prepare
-
-gromacs:gcc-7-cuda-10.2:regressiontest-gpucommupd-tMPI:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 2
-    REGRESSIONTEST_PME_RANK_NUMBER: 0
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 4
-    REGRESSIONTEST_OMP_RANK_NUMBER: 1
-    GMX_GPU_DD_COMMS: 1
-    GMX_GPU_PME_PP_COMMS: 1
-    GMX_FORCE_UPDATE_DEFAULT_GPU: 1
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-7-cuda-10.2:build
-    - job: regressiontests:prepare
-  artifacts:
-    paths:
-      - regressiontests
-    when: always
-    expire_in: 1 week
-
-gromacs:gcc-7-cuda-10.2:regressiontest-upd-tMPI:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
-  variables:
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 2
-    REGRESSIONTEST_PME_RANK_NUMBER: 0
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 4
-    REGRESSIONTEST_OMP_RANK_NUMBER: 1
-    GMX_FORCE_UPDATE_DEFAULT_GPU: 1
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-7-cuda-10.2:build
-    - job: regressiontests:prepare
-  artifacts:
-    paths:
-      - regressiontests
-    when: always
-    expire_in: 1 week
-
-gromacs:gcc-8-cuda-11.0:regressiontest-gpucommupd-MPI:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 2
-    REGRESSIONTEST_PME_RANK_NUMBER: 0
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 4
-    REGRESSIONTEST_OMP_RANK_NUMBER: 1
-    REGRESSIONTEST_PARALLEL: "-np"
-    GMX_GPU_DD_COMMS: 1  
-    GMX_GPU_PME_PP_COMMS: 1
-    GMX_FORCE_UPDATE_DEFAULT_GPU: 1
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-8-cuda-11.0:buildMPI
-    - job: regressiontests:prepare
-  artifacts:
-    paths:
-      - regressiontests
-    when: always
-    expire_in: 1 week
-
-gromacs:clang-8:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-8:build
-    - job: regressiontests:prepare
-
-gromacs:clang-TSAN:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-TSAN:build
-    - job: regressiontests:prepare
-
-gromacs:icc-2021.1:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .use-icc-oneapi:base
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-  needs:
-    - job: gromacs:icc-2021.1:build
-    - job: regressiontests:prepare
-
-gromacs:clang-ASAN:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .use-clang:base
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-ASAN:build
-    - job: regressiontests:prepare
-
-gromacs:clang-9:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    REGRESSIONTEST_DOUBLE: "-double"
-    REGRESSIONTEST_PARALLEL: "-np"
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-9-mpi:build
-    - job: regressiontests:prepare
-
-gromacs:oneapi-2021.1.1-opencl:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .use-oneapi:base
-    - .rules:merge-requests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-  needs:
-    - job: gromacs:oneapi-2021.1.1-opencl:build
-    - job: regressiontests:prepare
-
-gromacs:oneapi-2021.1.1-sycl:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .use-oneapi:base
-    - .rules:post-merge-acceptance
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-  needs:
-    - job: gromacs:oneapi-2021.1.1-sycl:build
-    - job: regressiontests:prepare
-
-gromacs:gcc-8-cuda-11.0:release:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    BUILD_DIR: release-builds-gcc
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-8-cuda-11.0:release:configure
-    - job: gromacs:gcc-8-cuda-11.0:release:build
-
-gromacs:gcc-9:release:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-9
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    BUILD_DIR: release-builds-gcc
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "amd.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    LD_LIBRARY_PATH: "/opt/rocm-3.5.0/opencl/lib"
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-9:release:configure
-    - job: gromacs:gcc-9:release:build
-
-gromacs:clang-9:release:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    BUILD_DIR: release-builds-clang
-  needs:
-    - job: gromacs:clang-9:release:configure
-    - job: gromacs:clang-9:release:build
-
-gromacs:clang-8-cuda-10.1:release:test:
-  extends:
-    - .gromacs:base:test
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.1
-  variables:
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    BUILD_DIR: release-builds-clang
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-8-cuda-10.1:release:configure
-    - job: gromacs:clang-8-cuda-10.1:release:build
-
-gromacs:oneapi-2021.1.1-opencl:release:test:
-  extends:
-    - .gromacs:base:test
-    - .use-oneapi:base
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-    BUILD_DIR: release-builds-oneapi
-  needs:
-    - job: gromacs:oneapi-2021.1.1-opencl:release:configure
-    - job: gromacs:oneapi-2021.1.1-opencl:release:build
-
-gromacs:gcc-9:release:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-9
-  variables:
-    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
-    BUILD_DIR: release-builds-gcc
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "amd.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    LD_LIBRARY_PATH: "/opt/rocm-3.5.0/opencl/lib"
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-9:release:build
-    - job: regressiontests:package
-
-gromacs:gcc-8-cuda-11.0:release:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    BUILD_DIR: release-builds-gcc
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    REGRESSIONTEST_PME_RANK_NUMBER: 0
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
-    REGRESSIONTEST_OMP_RANK_NUMBER: 1
-    REGRESSIONTEST_PARALLEL: "-np"
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:gcc-8-cuda-11.0:release:build
-    - job: regressiontests:package
-
-gromacs:clang-9:release:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
-  variables:
-    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
-    BUILD_DIR: release-builds-clang
-    REGRESSIONTEST_DOUBLE: "-double"
-    REGRESSIONTEST_PARALLEL: "-np"
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-9:release:build
-    - job: regressiontests:package
-
-gromacs:clang-8-cuda-10.1:release:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.1
-  variables:
-    BUILD_DIR: release-builds-clang
-    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
-    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
-    REGRESSIONTEST_PME_RANK_NUMBER: 0
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
-    REGRESSIONTEST_OMP_RANK_NUMBER: 1
-  tags:
-    - k8s-scilifelab
-  needs:
-    - job: gromacs:clang-8-cuda-10.1:release:build
-    - job: regressiontests:package
-
-gromacs:oneapi-2021.1.1-opencl:release:regressiontest:
-  extends:
-    - .gromacs:base:regressiontest
-    - .use-oneapi:base
-    - .rules:nightly-only-for-release
-  stage: release-tests
-  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
-  variables:
-    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
-    BUILD_DIR: release-builds-oneapi
-    REGRESSIONTEST_PME_RANK_NUMBER: 0
-    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
-    REGRESSIONTEST_OMP_RANK_NUMBER: 1
-  needs:
-    - job: gromacs:oneapi-2021.1.1-opencl:release:build
-    - job: regressiontests:package
diff --git a/admin/gitlab-ci/gromacs.matrix.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..4a7e1ae
--- /dev/null
@@ -0,0 +1,276 @@
+# Build, test, and install variously configured GROMACS installations.
+#
+# This file contains job templates. Actual job configurations are inside gromacs.matrix/ directory.
+
+.gromacs:base:configure:
+  extends:
+    - .variables:default
+  stage: configure-build
+  cache: {}
+  variables:
+    KUBERNETES_CPU_LIMIT: 1
+    KUBERNETES_CPU_REQUEST: 1
+    KUBERNETES_MEMORY_REQUEST: 2Gi
+    CMAKE_COMPILER_SCRIPT: ""
+    CMAKE_EXTRA_OPTIONS: ""
+    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=AVX2_256"
+    CMAKE_MPI_OPTIONS: "-DGMX_THREAD_MPI=ON"
+    CMAKE_PRECISION_OPTIONS: "-DGMX_DOUBLE=OFF"
+    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=Debug"
+    CMAKE_GPU_OPTIONS: "-DGMX_GPU=OFF"
+  script:
+    - CMAKE=${CMAKE:-$(which cmake)}
+    - echo $CMAKE_COMPILER_SCRIPT
+    - echo $CMAKE_EXTRA_OPTIONS
+    - echo $CMAKE_SIMD_OPTIONS
+    - echo $CMAKE_GPU_OPTIONS
+    - echo $CMAKE_MPI_OPTIONS
+    - echo $CMAKE_PRECISION_OPTIONS
+    - echo $CMAKE_BUILD_TYPE_OPTIONS
+    - echo $CMAKE_GMXAPI_OPTIONS
+    - if [[ -d $BUILD_DIR ]] ; then
+      rm -rf $BUILD_DIR && mkdir $BUILD_DIR ;
+      else
+      echo "Preparing new build directory" ;
+      mkdir $BUILD_DIR ;
+      fi
+    - cd $BUILD_DIR
+    - $CMAKE ..
+      -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
+      $CMAKE_COMPILER_SCRIPT
+      $CMAKE_EXTRA_OPTIONS
+      $CMAKE_SIMD_OPTIONS
+      $CMAKE_MPI_OPTIONS
+      $CMAKE_PRECISION_OPTIONS
+      $CMAKE_BUILD_TYPE_OPTIONS
+      $CMAKE_GPU_OPTIONS
+      $CMAKE_GMXAPI_OPTIONS
+      -DCMAKE_INSTALL_PREFIX=../$INSTALL_DIR -DGMX_COMPILER_WARNINGS=ON
+      2>&1 | tee cmakeLog.log
+    - awk '/CMake Warning/,/^--|^$/' cmakeLog.log | tee cmakeErrors.log
+    - if [ -s cmakeErrors.log  ] ; then echo "Found CMake warning while processing build"; cat cmakeErrors.log ; exit 1; fi
+    - cd ..
+  artifacts:
+    when: always
+    paths:
+      - $BUILD_DIR
+
+.gromacs:base:release:configure:
+  extends:
+    - .variables:default
+  stage: release-configure
+  cache: {}
+  variables:
+    KUBERNETES_CPU_LIMIT: 1
+    KUBERNETES_CPU_REQUEST: 1
+    KUBERNETES_MEMORY_REQUEST: 2Gi
+    CMAKE_COMPILER_SCRIPT: ""
+    CMAKE_EXTRA_OPTIONS: ""
+    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=AVX2_256"
+    CMAKE_MPI_OPTIONS: "-DGMX_THREAD_MPI=ON"
+    CMAKE_PRECISION_OPTIONS: "-DGMX_DOUBLE=OFF"
+    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithAssert"
+    CMAKE_GPU_OPTIONS: "-DGMX_GPU=OFF"
+    CMAKE_REGRESSIONTEST_OPTIONS: "-DREGRESSIONTEST_PATH=../\\$RELEASE_REGRESSIONTESTS"
+    RELEASE_BUILD_DIR: release-builds
+    RELEASE_SOURCE: release-source-from-tarball
+    RELEASE_REGRESSIONTESTS: release-regressiontests-from-tarball
+  script:
+    - CMAKE=${CMAKE:-$(which cmake)}
+    - VERSION=`cat version.json |
+      python3 -c "import json,sys; print(json.load(sys.stdin)['version'])"`
+    - if [[ $GROMACS_RELEASE != "true" ]] ; then
+      VERSION=$VERSION-dev ;
+      fi
+    - SOURCENAME=gromacs-$VERSION
+    - SOURCETARBALL=$SOURCENAME.tar.gz
+    - REGTESTNAME=regressiontests-$VERSION
+    - REGTESTTARBALL=$REGTESTNAME.tar.gz
+    - echo "$SOURCETARBALL"
+    - echo "$REGTESTTARBALL"
+    - RELEASE_TARBALLS=release-tarballs
+    - rm -rf $RELEASE_TARBALLS $RELEASE_SOURCE $RELEASE_REGRESSIONTESTS && mkdir $RELEASE_TARBALLS
+    - mv $SOURCETARBALL $RELEASE_TARBALLS
+    - mv $REGTESTTARBALL $RELEASE_TARBALLS
+    - cd $RELEASE_TARBALLS
+    # We rename the source and regressiontest directories
+    # to have names for them that don't change for different versions.
+    - tar -xf $SOURCETARBALL
+    - mv $SOURCENAME ../$RELEASE_SOURCE
+    - tar -xf $REGTESTTARBALL
+    - mv $REGTESTNAME ../$RELEASE_REGRESSIONTESTS
+    - rm $SOURCETARBALL $REGTESTTARBALL
+    - cd ..
+    - echo $CMAKE_COMPILER_SCRIPT
+    - echo $CMAKE_EXTRA_OPTIONS
+    - echo $CMAKE_SIMD_OPTIONS
+    - echo $CMAKE_GPU_OPTIONS
+    - echo $CMAKE_MPI_OPTIONS
+    - echo $CMAKE_PRECISION_OPTIONS
+    - echo $CMAKE_BUILD_TYPE_OPTIONS
+    - echo $CMAKE_GMXAPI_OPTIONS
+    - if [[ -d $RELEASE_BUILD_DIR ]] ; then
+      echo "Cleaning up build directory" ;
+      rm -rf $RELEASE_BUILD_DIR && mkdir $RELEASE_BUILD_DIR ;
+      else
+      echo "Preparing new build directory" ;
+      mkdir $RELEASE_BUILD_DIR ;
+      fi
+    - cd $RELEASE_BUILD_DIR
+    - cmake ../$RELEASE_SOURCE/
+      -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
+      $CMAKE_COMPILER_SCRIPT
+      $CMAKE_EXTRA_OPTIONS
+      $CMAKE_SIMD_OPTIONS
+      $CMAKE_MPI_OPTIONS
+      $CMAKE_PRECISION_OPTIONS
+      $CMAKE_BUILD_TYPE_OPTIONS
+      $CMAKE_GPU_OPTIONS
+      $CMAKE_GMXAPI_OPTIONS
+      $CMAKE_REGRESSIONTEST_OPTIONS
+      -DCMAKE_INSTALL_PREFIX=../$INSTALL_DIR
+      2>&1 | tee cmakeLog.log
+    - awk '/CMake Warning/,/^--|^$/' cmakeLog.log | tee cmakeErrors.log
+    - if [ -s cmakeErrors.log  ] ; then echo "Found CMake warning while processing build"; cat cmakeErrors.log ; exit 1; fi
+    - cd ..
+  artifacts:
+    when: always
+    paths:
+      - $RELEASE_BUILD_DIR
+      - $RELEASE_REGRESSIONTESTS
+      - $RELEASE_SOURCE
+
+.gromacs:base:build:
+  stage: build
+  script:
+    - CMAKE=${CMAKE:-$(which cmake)}
+    - cd $BUILD_DIR
+    - $CMAKE --build . -- -j$KUBERNETES_CPU_LIMIT 2>&1 | tee buildLogFile.log
+    - $CMAKE --build . --target tests -- -j$KUBERNETES_CPU_LIMIT 2>&1 | tee testBuildLogFile.log
+    - awk '/warning/,/warning.*generated|^$/' buildLogFile.log testBuildLogFile.log
+      | grep -v "CMake" | tee buildErrors.log || true
+    - grep "cannot be built" buildLogFile.log testBuildLogFile.log | tee -a buildErrors.log || true
+    - $CMAKE --build . --target install 2>&1 | tee installBuildLogFile.log
+    - if [ -s buildErrors.log ] ; then echo "Found compiler warning during build"; cat buildErrors.log; exit 1; fi
+    - for file in `find . -mindepth 1 -name "*.o" ! -type l` ; do echo $file ; rm $file ; done 2>&1 > remove-build-objects.log
+    - cd ..
+  artifacts:
+    when: always
+    paths:
+      - $BUILD_DIR
+      - $INSTALL_DIR/
+
+.gromacs:static-analyzer-build:
+  stage: build
+  script:
+    - CMAKE=${CMAKE:-$(which cmake)}
+    - cd $BUILD_DIR
+    - scan-build -o scan_html $CMAKE --build . -- -j8 2>&1 | tee buildLogFile.log
+    - awk '/warning/,/warning.*generated|^$/' buildLogFile.log
+      | grep -v "CMake" | tee buildErrors.log || true
+    - grep "cannot be built" buildLogFile.log | tee -a buildErrors.log || true
+    - if [ -s buildErrors.log ] ; then echo "Found compiler warning during build"; cat buildErrors.log; exit 1; fi
+    - cd ..
+  artifacts:
+    when: always
+    paths:
+      - $BUILD_DIR/scan_html
+
+.gromacs:base:test:
+  extends:
+    - .variables:default
+  stage: test
+  cache: {}
+  retry:
+    max: 1
+  variables:
+    CTEST_RUN_MODE: "ExperimentalTest"
+  script:
+    - CMAKE=${CMAKE:-$(which cmake)}
+    - cd $BUILD_DIR
+    - export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1:suppressions=$CI_PROJECT_DIR/admin/ubsan-suppressions.txt
+    # Needed to run MPI enabled code in the docker images, until we set up different users
+    - export OMPI_ALLOW_RUN_AS_ROOT=1
+    - export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1
+    - export ASAN_OPTIONS="check_initialization_order=1:detect_invalid_pointer_pairs=1:strict_init_order=true:strict_string_checks=true:detect_stack_use_after_return=true"
+    # If $GMX_TEST_REQUIRED_NUMBER_OF_DEVICES is not set and we have GPUs, set it
+    - if [ -z $GMX_TEST_REQUIRED_NUMBER_OF_DEVICES ] && [ -n $KUBERNETES_EXTENDED_RESOURCE_NAME ] ; then
+      if grep -q '/gpu$' <<< "$KUBERNETES_EXTENDED_RESOURCE_NAME"; then
+      echo "export GMX_TEST_REQUIRED_NUMBER_OF_DEVICES=\"$KUBERNETES_EXTENDED_RESOURCE_LIMIT\"";
+      export GMX_TEST_REQUIRED_NUMBER_OF_DEVICES="$KUBERNETES_EXTENDED_RESOURCE_LIMIT";
+      fi
+      fi
+    - if grep -qF 'nvidia.com/gpu' <<< "$KUBERNETES_EXTENDED_RESOURCE_NAME"; then
+      nvidia-smi || true;
+      fi
+    - ctest -D $CTEST_RUN_MODE --output-on-failure | tee ctestLog.log || true
+    - awk '/The following tests FAILED/,/^Errors while running CTest|^$/'
+      ctestLog.log | tee ctestErrors.log
+    - xsltproc $CI_PROJECT_DIR/scripts/CTest2JUnit.xsl Testing/`head -n 1 < Testing/TAG`/*.xml > JUnitTestResults.xml
+    - if [ -s ctestErrors.log ] ; then
+      echo "Error during running ctest";
+      exit 1;
+      fi
+    - cd ..
+  artifacts:
+    reports:
+      junit: $BUILD_DIR/JUnitTestResults.xml
+    paths:
+      - $BUILD_DIR/Testing
+      - $BUILD_DIR/tests
+    when: always
+    expire_in: 1 week
+
+.gromacs:base:regressiontest:
+  extends:
+    - .variables:default
+  variables:
+    KUBERNETES_CPU_LIMIT: 4
+    KUBERNETES_CPU_REQUEST: 4
+    KUBERNETES_MEMORY_REQUEST: 4Gi
+    REGRESSIONTEST_TOTAL_RANK_NUMBER: 4
+    REGRESSIONTEST_OMP_RANK_NUMBER: 2
+    REGRESSIONTEST_PME_RANK_NUMBER: 1
+    REGRESSIONTEST_MPI_RUN_COMMAND: ""
+    REGRESSIONTEST_DOUBLE: ""
+    REGRESSIONTEST_PARALLEL: "-nt"
+  stage: test
+  cache: {}
+  retry:
+    max: 1
+  script:
+    - export LSAN_OPTIONS="suppressions=$CI_PROJECT_DIR/admin/lsan-suppressions.txt:print_suppressions=0"
+    - export ASAN_OPTIONS="check_initialization_order=1:detect_invalid_pointer_pairs=1:strict_init_order=true:strict_string_checks=true:detect_stack_use_after_return=true"
+    # Needed to run MPI enabled code in the docker images, until we set up different users
+    - export OMPI_ALLOW_RUN_AS_ROOT=1
+    - export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1
+    - tar xzf gmx-regressiontests.tar.gz
+    - source $INSTALL_DIR/bin/GMXRC
+    - cd regressiontests
+    - perl gmxtest.pl $REGRESSIONTEST_PARALLEL $REGRESSIONTEST_TOTAL_RANK_NUMBER -ntomp $REGRESSIONTEST_OMP_RANK_NUMBER -npme $REGRESSIONTEST_PME_RANK_NUMBER $REGRESSIONTEST_DOUBLE $REGRESSIONTEST_MPI_RUN_COMMAND -xml all
+  artifacts:
+    paths:
+      - regressiontests/gmxtest.xml
+    when: always
+    expire_in: 1 week
+
+include:
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.clang-8-cuda-10.0.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.clang-8-cuda-10.1-release.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.clang-8.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.clang-9-mpi.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.clang-9-release.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.clang-ASAN.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.clang-static-analyzer.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.clang-TSAN.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.clang-UBSAN.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-10.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-7-cuda-10.2.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-8-cuda-11.0.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-8-cuda-11.0-release.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-9-release.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.icc-2021.1.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-opencl.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-opencl-release.gitlab-ci.yml'
+  - local: '/admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-sycl.gitlab-ci.yml'
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.clang-8-cuda-10.0.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.clang-8-cuda-10.0.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..acedae2
--- /dev/null
@@ -0,0 +1,75 @@
+# Test goal: Clang-CUDA build
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   GPU: Clang CUDA
+#   HW: NVIDIA GPU
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: RelWithDebInfo
+#   Compiler: Clang 8
+#   MPI: thread_MPI
+#   GPU: Clang CUDA 10.0, CUDA 10.0
+#   SIMD: AVX2_256, no kernels
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2 (unit tests)
+#   Parallelism nt/ntomp: 2/1 (regression tests)
+
+gromacs:clang-8-cuda-10.0:configure:
+  extends:
+    - .gromacs:base:configure
+    - .use-clang:base
+    - .use-cuda
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    CMAKE_SIMD_OPTIONS: "-DGMX_USE_SIMD_KERNELS=off"
+    CMAKE_EXTRA_OPTIONS: "-DGMX_CLANG_CUDA=ON"
+    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
+    COMPILER_MAJOR_VERSION: 8
+
+gromacs:clang-8-cuda-10.0:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .use-clang:base
+    - .use-ccache
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  needs:
+    - job: gromacs:clang-8-cuda-10.0:configure
+
+gromacs:clang-8-cuda-10.0:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-8-cuda-10.0:build
+
+gromacs:clang-8-cuda-10.0:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    REGRESSIONTEST_PME_RANK_NUMBER: 0
+    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
+    REGRESSIONTEST_OMP_RANK_NUMBER: 1
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-8-cuda-10.0:build
+    - job: regressiontests:prepare
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.clang-8-cuda-10.1-release.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.clang-8-cuda-10.1-release.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..e6ea818
--- /dev/null
@@ -0,0 +1,78 @@
+# Test goal: old Clang with old CUDA
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   GPU: CUDA oldest supported
+#   HW: NVIDIA GPU
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: RelWithAssert
+#   Compiler: Clang 8
+#   GPU: CUDA 10.1
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2 (unit tests)
+#   Parallelism nt/ntomp: 2/1 (regression tests)
+
+gromacs:clang-8-cuda-10.1:release:configure:
+  extends:
+    - .gromacs:base:release:configure
+    - .use-clang:base
+    - .use-cuda
+    - .rules:nightly-only-for-release
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.1
+  variables:
+    COMPILER_MAJOR_VERSION: 8
+    RELEASE_BUILD_DIR: release-builds-clang
+    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithAssert"
+
+gromacs:clang-8-cuda-10.1:release:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .before_script:default
+    - .use-ccache
+    - .rules:nightly-only-for-release
+  stage: release-build
+  variables:
+    BUILD_DIR: release-builds-clang
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.1
+  needs:
+    - job: gromacs:clang-8-cuda-10.1:release:configure
+
+gromacs:clang-8-cuda-10.1:release:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:nightly-only-for-release
+  stage: release-tests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.1
+  variables:
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    BUILD_DIR: release-builds-clang
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-8-cuda-10.1:release:configure
+    - job: gromacs:clang-8-cuda-10.1:release:build
+
+gromacs:clang-8-cuda-10.1:release:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:nightly-only-for-release
+  stage: release-tests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.1
+  variables:
+    BUILD_DIR: release-builds-clang
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    REGRESSIONTEST_PME_RANK_NUMBER: 0
+    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
+    REGRESSIONTEST_OMP_RANK_NUMBER: 1
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-8-cuda-10.1:release:build
+    - job: regressiontests:package
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.clang-8.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.clang-8.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..5a590b9
--- /dev/null
@@ -0,0 +1,54 @@
+# Test goal: Simple Clang build with no GPU
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: Clang
+#   GPU: no
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: Debug
+#   Compiler: Clang 8
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2
+
+gromacs:clang-8:configure:
+  extends:
+    - .gromacs:base:configure
+    - .use-clang:base
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
+  variables:
+    COMPILER_MAJOR_VERSION: 8
+
+gromacs:clang-8:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .before_script:default
+    - .use-ccache
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
+  needs:
+    - job: gromacs:clang-8:configure
+
+gromacs:clang-8:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
+  needs:
+    - job: gromacs:clang-8:build
+
+gromacs:clang-8:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-cuda-10.0
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-8:build
+    - job: regressiontests:prepare
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.clang-9-mpi.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.clang-9-mpi.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..81f3e1f
--- /dev/null
@@ -0,0 +1,71 @@
+# Test goal: Clang build with MPI and double precision
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: Clang
+#   GPU: no
+#   MPI: OpenMPI
+#   Features: double precision FP
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: Debug
+#   Compiler: Clang 9
+#   MPI: OpenMPI 3.1
+#   SIMD: AVX2_256
+#   FFT: FFTW3
+#   Parallelism np/ntomp: 4/2
+
+gromacs:clang-9-mpi:configure:
+  extends:
+   - .gromacs:base:configure
+   - .use-clang:base
+   - .use-mpi
+   - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    COMPILER_MAJOR_VERSION: 9
+    CMAKE_PRECISION_OPTIONS: -DGMX_DOUBLE=ON
+
+gromacs:clang-9-mpi:build:
+  # Test using configuration: gromacs:clang-9-mpi:configure
+  # Test scope: build
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .before_script:default
+    - .use-ccache
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+  needs:
+    - job: gromacs:clang-9-mpi:configure
+
+gromacs:clang-9-mpi:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-9-mpi:build
+
+gromacs:clang-9:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    REGRESSIONTEST_DOUBLE: "-double"
+    REGRESSIONTEST_PARALLEL: "-np"
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-9-mpi:build
+    - job: regressiontests:prepare
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.clang-9-release.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.clang-9-release.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..c6c7768
--- /dev/null
@@ -0,0 +1,80 @@
+# Test goal: Release build with Clang, MPI, and double-precision
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: Clang
+#   MPI: OpenMPI
+#   GPU: no
+#   Features: double precision FP
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: RelWithAssert
+#   Compiler: Clang 9
+#   MPI: OpenMPI 3.1
+#   SIMD: AVX2_256
+#   FFT: FFTW3
+#   Parallelism np/ntomp: 4/2
+
+gromacs:clang-9:release:configure:
+  extends:
+    - .gromacs:base:release:configure
+    - .use-clang:base
+    - .use-mpi
+    - .rules:nightly-only-for-release
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    COMPILER_MAJOR_VERSION: 9
+    RELEASE_BUILD_DIR: release-builds-clang
+    CMAKE_PRECISION_OPTIONS: "-DGMX_DOUBLE=ON"
+    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithAssert"
+  dependencies:
+    - archive:package
+    - regressiontests:package
+    - prepare-release-version
+
+gromacs:clang-9:release:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .before_script:default
+    - .use-ccache
+    - .rules:nightly-only-for-release
+  stage: release-build
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    BUILD_DIR: release-builds-clang
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
+  needs:
+    - job: gromacs:clang-9:release:configure
+
+gromacs:clang-9:release:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:nightly-only-for-release
+  stage: release-tests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    BUILD_DIR: release-builds-clang
+  needs:
+    - job: gromacs:clang-9:release:configure
+    - job: gromacs:clang-9:release:build
+
+gromacs:clang-9:release:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:nightly-only-for-release
+  stage: release-tests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-9
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    BUILD_DIR: release-builds-clang
+    REGRESSIONTEST_DOUBLE: "-double"
+    REGRESSIONTEST_PARALLEL: "-np"
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-9:release:build
+    - job: regressiontests:package
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.clang-ASAN.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.clang-ASAN.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..3052a62
--- /dev/null
@@ -0,0 +1,69 @@
+# Test goal: Clang AddressSanitizer build
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: Clang
+#   Build type: ASAN
+#   GPU: no
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Compiler: Clang 8
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2
+
+gromacs:clang-ASAN:configure:
+  extends:
+    - .gromacs:base:configure
+    - .use-clang:base
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    COMPILER_MAJOR_VERSION: 8
+    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=ASAN"
+
+gromacs:clang-ASAN:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .use-clang:base
+    - .use-ccache
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-ASAN:configure
+
+gromacs:clang-ASAN:test:
+  extends:
+    - .gromacs:base:test
+    - .use-clang:base
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    CTEST_RUN_MODE: "ExperimentalMemCheck"
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-ASAN:build
+
+gromacs:clang-ASAN:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .use-clang:base
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-ASAN:build
+    - job: regressiontests:prepare
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.clang-TSAN.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.clang-TSAN.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..64834ff
--- /dev/null
@@ -0,0 +1,62 @@
+# Test goal: Clang ThreadSanitizer
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: Clang
+#   Build type: TSAN
+#   GPU: None
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Compiler: Clang 8
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2
+
+gromacs:clang-TSAN:configure:
+  extends:
+    - .gromacs:base:configure
+    - .use-clang:base
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    COMPILER_MAJOR_VERSION: 8
+    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=TSAN"
+
+gromacs:clang-TSAN:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .use-clang:base
+    - .use-ccache
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  needs:
+    - job: gromacs:clang-TSAN:configure
+
+gromacs:clang-TSAN:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  needs:
+    - job: gromacs:clang-TSAN:build
+
+gromacs:clang-TSAN:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-TSAN:build
+    - job: regressiontests:prepare
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.clang-UBSAN.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.clang-UBSAN.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..8676952
--- /dev/null
@@ -0,0 +1,54 @@
+# Test goal: Clang UndefinedBehaviorSanitizer build
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: Clang
+#   Build type: UBSAN
+#   GPU: no
+#   Scope: configure, build, unit tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Compiler: Clang 8
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2
+
+gromacs:clang-UBSAN:configure:
+  extends:
+    - .gromacs:base:configure
+    - .use-clang:base
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    COMPILER_MAJOR_VERSION: 8
+    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=UBSAN"
+
+gromacs:clang-UBSAN:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .use-clang:base
+    - .use-ccache
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-UBSAN:configure
+
+gromacs:clang-UBSAN:test:
+  extends:
+    - .gromacs:base:test
+    - .use-clang:base
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-UBSAN:build
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.clang-static-analyzer.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.clang-static-analyzer.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..0d6624c
--- /dev/null
@@ -0,0 +1,41 @@
+# Test goal: Clang static analyzer build
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: Clang
+#   Build type: Static Analuzer
+#   GPU: no
+#   SIMD: no
+#   FFT: fftpack
+#   MPI: thread_MPI
+#   Scope: configure, build
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Compiler: Clang 8
+
+gromacs:clang-static-analyzer:configure:
+  extends:
+    - .gromacs:base:configure
+    - .use-clang:base
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    CMAKE_COMPILER_SCRIPT: "-DCMAKE_CXX_COMPILER=/usr/local/libexec/c++-analyzer -DCMAKE_C_COMPILER=gcc"
+    CMAKE_EXTRA_OPTIONS: "-DGMX_CLANG_ANALYZER=ON -DGMX_OPENMP=OFF -DGMX_USE_RDTSCP=OFF -DGMX_FFT_LIBRARY=fftpack -DGMX_DEVELOPER_BUILD=ON"
+    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=None"
+
+gromacs:clang-static-analyzer:build:
+  extends:
+    - .variables:default
+    - .gromacs:static-analyzer-build
+    - .use-clang:base
+    - .use-ccache
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-llvm-8-tsan
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:clang-static-analyzer:configure
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-10.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-10.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..0b4f7a7
--- /dev/null
@@ -0,0 +1,77 @@
+# Test goal: newest GCC with OpenCL
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu newest supported
+#   Compiler: GCC newest supported
+#   GPU: OpenCL
+#   FFT: CLFFT
+#   HW: AMD GPU
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 20.04
+#   Build type: Debug
+#   Compiler: GCC 10
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   Parallelism nt/ntomp: 4/2 (unit tests)
+#   Parallelism nt/ntomp: 2/1 (regression tests)
+
+gromacs:gcc-10:configure:
+  extends:
+    - .gromacs:base:configure
+    - .use-gcc:base
+    - .use-opencl
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-gcc-10
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=AVX2_256"
+    CMAKE_EXTRA_OPTIONS: "-DGMX_EXTERNAL_CLFFT=ON"
+    COMPILER_MAJOR_VERSION: 10
+
+gromacs:gcc-10:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .before_script:default
+    - .use-ccache
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-gcc-10
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+  needs:
+    - job: gromacs:gcc-10:configure
+
+gromacs:gcc-10:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-gcc-10
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "amd.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    LD_LIBRARY_PATH: "/opt/rocm-3.5.0/opencl/lib"
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-10:build
+
+gromacs:gcc-10:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-gcc-10
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "amd.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    REGRESSIONTEST_PME_RANK_NUMBER: 0
+    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
+    REGRESSIONTEST_OMP_RANK_NUMBER: 1
+    LD_LIBRARY_PATH: "/opt/rocm-3.5.0/opencl/lib"
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-10:build
+    - job: regressiontests:prepare
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-7-cuda-10.2.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-7-cuda-10.2.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..41ed398
--- /dev/null
@@ -0,0 +1,144 @@
+# Test goal: old versions of GCC with CUDA; GPU communications with tMPI
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: GCC oldest supported
+#   GPU: CUDA oldest supported
+#   HW: NVIDIA GPU, dual NVIDIA GPU
+#   MPI: thread_MPI
+#   Features: GPU direct communications + update (unit tests)
+#   Features: GPU direct communications + update (regression tests with dual GPU)
+#   Features: GPU update (regression tests with dual GPU)
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: Debug
+#   Compiler: GCC 7
+#   GPU: CUDA 10.2
+#   SIMD: SSE 4.1
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2 (unit tests)
+#   Parallelism nt/ntomp: 2/1 (regression tests)
+#   Parallelism nt/ntomp: 4/1 (regression tests with dual GPU)
+
+gromacs:gcc-7-cuda-10.2:configure:
+  extends:
+    - .gromacs:base:configure
+    - .use-gcc:base
+    - .use-cuda
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=SSE4.1"
+    COMPILER_MAJOR_VERSION: 7
+
+gromacs:gcc-7-cuda-10.2:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .before_script:default
+    - .use-ccache
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+  needs:
+    - job: gromacs:gcc-7-cuda-10.2:configure
+
+gromacs:gcc-7-cuda-10.2:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-7-cuda-10.2:build
+
+gromacs:gcc-7-cuda-10.2:test-gpucommupd:
+  extends:
+    - .gromacs:base:test
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    GMX_GPU_DD_COMMS: 1
+    GMX_GPU_PME_PP_COMMS: 1
+    GMX_FORCE_UPDATE_DEFAULT_GPU: 1
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-7-cuda-10.2:build
+
+gromacs:gcc-7-cuda-10.2:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    REGRESSIONTEST_PME_RANK_NUMBER: 0
+    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
+    REGRESSIONTEST_OMP_RANK_NUMBER: 1
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-7-cuda-10.2:build
+    - job: regressiontests:prepare
+
+gromacs:gcc-7-cuda-10.2:regressiontest-gpucommupd-tMPI:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 2
+    REGRESSIONTEST_PME_RANK_NUMBER: 0
+    REGRESSIONTEST_TOTAL_RANK_NUMBER: 4
+    REGRESSIONTEST_OMP_RANK_NUMBER: 1
+    GMX_GPU_DD_COMMS: 1
+    GMX_GPU_PME_PP_COMMS: 1
+    GMX_FORCE_UPDATE_DEFAULT_GPU: 1
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-7-cuda-10.2:build
+    - job: regressiontests:prepare
+  artifacts:
+    paths:
+      - regressiontests
+    when: always
+    expire_in: 1 week
+
+gromacs:gcc-7-cuda-10.2:regressiontest-upd-tMPI:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-cuda-10.2
+  variables:
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 2
+    REGRESSIONTEST_PME_RANK_NUMBER: 0
+    REGRESSIONTEST_TOTAL_RANK_NUMBER: 4
+    REGRESSIONTEST_OMP_RANK_NUMBER: 1
+    GMX_FORCE_UPDATE_DEFAULT_GPU: 1
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-7-cuda-10.2:build
+    - job: regressiontests:prepare
+  artifacts:
+    paths:
+      - regressiontests
+    when: always
+    expire_in: 1 week
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-8-cuda-11.0-release.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-8-cuda-11.0-release.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..0b9458e
--- /dev/null
@@ -0,0 +1,67 @@
+# Test goal: GCC with newest CUDA
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   GPU: CUDA newest supported
+#   HW: NVIDIA GPU
+#   Scope: configure, build, unit tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: RelWithAssert
+#   Compiler: GCC 8
+#   MPI: thread_MPI
+#   GPU: CUDA 11.0
+#   SIMD: AVX2_256
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2 (unit tests)
+
+gromacs:gcc-8-cuda-11.0:release:configure:
+  extends:
+    - .gromacs:base:release:configure
+    - .use-gcc:base
+    - .use-mpi
+    - .use-cuda
+    - .rules:nightly-only-for-release
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    COMPILER_MAJOR_VERSION: 8
+    RELEASE_BUILD_DIR: release-builds-gcc
+    CMAKE_BUILD_TYPE_OPTIONS : "-DCMAKE_BUILD_TYPE=RelWithAssert"
+    CMAKE_REGRESSIONTEST_OPTIONS: ""
+  dependencies:
+    - archive:package
+    - regressiontests:package
+    - prepare-release-version
+
+gromacs:gcc-8-cuda-11.0:release:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .before_script:default
+    - .use-ccache
+    - .rules:nightly-only-for-release
+  stage: release-build
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    BUILD_DIR: release-builds-gcc
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
+  needs:
+    - job: gromacs:gcc-8-cuda-11.0:release:configure
+
+gromacs:gcc-8-cuda-11.0:release:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:nightly-only-for-release
+  stage: release-tests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    BUILD_DIR: release-builds-gcc
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-8-cuda-11.0:release:configure
+    - job: gromacs:gcc-8-cuda-11.0:release:build
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-8-cuda-11.0.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-8-cuda-11.0.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..59a8e11
--- /dev/null
@@ -0,0 +1,72 @@
+# Test goal: CUDA GPU communications with OpenMPI
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   GPU: CUDA newest supported
+#   HW: dual NVIDIA GPU
+#   MPI: OpenMPI
+#   Features: GPU direct communications + update (regression tests with dual GPU)
+#   Scope: configure, build, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: RelWithDebInfo
+#   Compiler: GCC 8
+#   GPU: CUDA 11.0
+#   SIMD: SSE 4.1
+#   FFT: FFTW3
+#   Parallelism np/ntomp: 4/1 (regression tests with dual GPU)
+
+gromacs:gcc-8-cuda-11.0:configureMPI:
+  extends:
+    - .gromacs:base:configure
+    - .use-gcc:base
+    - .use-cuda
+    - .use-mpi
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    CMAKE_SIMD_OPTIONS: "-DGMX_SIMD=SSE4.1"
+    COMPILER_MAJOR_VERSION: 8
+
+gromacs:gcc-8-cuda-11.0:buildMPI:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .before_script:default
+    - .use-ccache
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+  needs:
+    - job: gromacs:gcc-8-cuda-11.0:configureMPI
+
+gromacs:gcc-8-cuda-11.0:regressiontest-gpucommupd-MPI:
+  # Test parallelism np/ntomp: 4/1
+  # Test parallelism GPU: direct communications, update
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-8-cuda-11.0
+  variables:
+    CMAKE: /usr/local/cmake-3.15.7/bin/cmake
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 2
+    REGRESSIONTEST_PME_RANK_NUMBER: 0
+    REGRESSIONTEST_TOTAL_RANK_NUMBER: 4
+    REGRESSIONTEST_OMP_RANK_NUMBER: 1
+    REGRESSIONTEST_PARALLEL: "-np"
+    GMX_GPU_DD_COMMS: 1  
+    GMX_GPU_PME_PP_COMMS: 1
+    GMX_FORCE_UPDATE_DEFAULT_GPU: 1
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-8-cuda-11.0:buildMPI
+    - job: regressiontests:prepare
+  artifacts:
+    paths:
+      - regressiontests
+    when: always
+    expire_in: 1 week
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-9-release.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.gcc-9-release.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..4e05b53
--- /dev/null
@@ -0,0 +1,86 @@
+# Test goal: Release build with GCC and OpenCL
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: GCC
+#   GPU: OpenCL
+#   HW: AMD GPU
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: RelWithAssert
+#   Compiler: GCC 9
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   FFT: FFTW3
+#   Parallelism nt/ntomp: 4/2
+
+gromacs:gcc-9:release:configure:
+  extends:
+    - .gromacs:base:release:configure
+    - .use-gcc:base
+    - .use-opencl
+    - .rules:nightly-only-for-release
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-9
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    COMPILER_MAJOR_VERSION: 9
+    RELEASE_BUILD_DIR: release-builds-gcc
+    CMAKE_BUILD_TYPE_OPTIONS: "-DCMAKE_BUILD_TYPE=RelWithAssert"
+  dependencies:
+    - archive:package
+    - regressiontests:package
+    - prepare-release-version
+
+gromacs:gcc-9:release:build:
+  # Test using configuration: gromacs:gcc-9:release:configure
+  # Test scope: build
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .before_script:default
+    - .use-ccache
+    - .rules:nightly-only-for-release
+  stage: release-build
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    BUILD_DIR: release-builds-gcc
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-9
+  needs:
+    - job: gromacs:gcc-9:release:configure
+
+gromacs:gcc-9:release:test:
+  extends:
+    - .gromacs:base:test
+    - .rules:nightly-only-for-release
+  stage: release-tests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-9
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    BUILD_DIR: release-builds-gcc
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "amd.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    LD_LIBRARY_PATH: "/opt/rocm-3.5.0/opencl/lib"
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-9:release:configure
+    - job: gromacs:gcc-9:release:build
+
+gromacs:gcc-9:release:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .rules:nightly-only-for-release
+  stage: release-tests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-9
+  variables:
+    CMAKE: /usr/local/cmake-3.13.0/bin/cmake
+    BUILD_DIR: release-builds-gcc
+    KUBERNETES_EXTENDED_RESOURCE_NAME: "amd.com/gpu"
+    KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    LD_LIBRARY_PATH: "/opt/rocm-3.5.0/opencl/lib"
+  tags:
+    - k8s-scilifelab
+  needs:
+    - job: gromacs:gcc-9:release:build
+    - job: regressiontests:package
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.icc-2021.1.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.icc-2021.1.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..849eb19
--- /dev/null
@@ -0,0 +1,63 @@
+# Test goal: Newest ICC CPU-only build
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: ICC newest supported
+#   FFT: MKL
+#   GPU: no
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: Debug
+#   Compiler: ICC 2021.1
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   Parallelism nt/ntomp: 4/2
+
+gromacs:icc-2021.1:configure:
+  # Test SIMD: AVX2_256
+  # Test FFT: MKL
+  # Test scope: configure
+  extends:
+   - .gromacs:base:configure
+   - .use-icc-oneapi:base
+   - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+    COMPILER_MAJOR_VERSION: 2021
+
+gromacs:icc-2021.1:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .use-icc-oneapi:base
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+  needs:
+    - job: gromacs:icc-2021.1:configure
+
+gromacs:icc-2021.1:test:
+  extends:
+    - .gromacs:base:test
+    - .use-icc-oneapi:base
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+  needs:
+    - job: gromacs:icc-2021.1:build
+
+gromacs:icc-2021.1:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .use-icc-oneapi:base
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+  needs:
+    - job: gromacs:icc-2021.1:build
+    - job: regressiontests:prepare
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-opencl-release.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-opencl-release.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..db672a5
--- /dev/null
@@ -0,0 +1,75 @@
+# Test goal: Newest ICPX build with OpenCL, release build
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: ICPX newest supported
+#   Build type: RelWithAssert
+#   FFT: MKL
+#   GPU: OpenCL
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Compiler: ICPX 2021.1
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   Parallelism nt/ntomp: 4/2 (unit tests)
+#   Parallelism nt/ntomp: 2/1 (regression tests)
+
+gromacs:oneapi-2021.1.1-opencl:release:configure:
+  extends:
+   - .gromacs:base:release:configure
+   - .use-oneapi:base
+   - .use-opencl
+   - .rules:nightly-only-for-release
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+    COMPILER_MAJOR_VERSION: 2021
+    RELEASE_BUILD_DIR: release-builds-oneapi
+
+gromacs:oneapi-2021.1.1-opencl:release:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .use-oneapi:base
+    - .use-opencl
+    - .use-ccache
+    - .rules:nightly-only-for-release
+  stage: release-build
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+    BUILD_DIR: release-builds-oneapi
+    COMPILER_MAJOR_VERSION: 2021
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  needs:
+    - job: gromacs:oneapi-2021.1.1-opencl:release:configure
+
+gromacs:oneapi-2021.1.1-opencl:release:test:
+  extends:
+    - .gromacs:base:test
+    - .use-oneapi:base
+    - .rules:nightly-only-for-release
+  stage: release-tests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+    BUILD_DIR: release-builds-oneapi
+  needs:
+    - job: gromacs:oneapi-2021.1.1-opencl:release:configure
+    - job: gromacs:oneapi-2021.1.1-opencl:release:build
+
+gromacs:oneapi-2021.1.1-opencl:release:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .use-oneapi:base
+    - .rules:nightly-only-for-release
+  stage: release-tests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+    BUILD_DIR: release-builds-oneapi
+    REGRESSIONTEST_PME_RANK_NUMBER: 0
+    REGRESSIONTEST_TOTAL_RANK_NUMBER: 2
+    REGRESSIONTEST_OMP_RANK_NUMBER: 1
+  needs:
+    - job: gromacs:oneapi-2021.1.1-opencl:release:build
+    - job: regressiontests:package
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-opencl.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-opencl.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..4f304b8
--- /dev/null
@@ -0,0 +1,62 @@
+# Test goal: Newest ICPX build with OpenCL
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: ICPX newest supported
+#   FFT: MKL
+#   GPU: OpenCL
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: Debug
+#   Compiler: ICPX 2021.1
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   Parallelism nt/ntomp: 4/2
+
+gromacs:oneapi-2021.1.1-opencl:configure:
+  extends:
+   - .gromacs:base:configure
+   - .use-oneapi:base
+   - .use-opencl
+   - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+    COMPILER_MAJOR_VERSION: 2021
+
+gromacs:oneapi-2021.1.1-opencl:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .use-ccache
+    - .use-oneapi:base
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+  needs:
+    - job: gromacs:oneapi-2021.1.1-opencl:configure
+
+gromacs:oneapi-2021.1.1-opencl:test:
+  extends:
+    - .gromacs:base:test
+    - .use-oneapi:base
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+  needs:
+    - job: gromacs:oneapi-2021.1.1-opencl:build
+
+gromacs:oneapi-2021.1.1-opencl:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .use-oneapi:base
+    - .rules:merge-requests
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+  needs:
+    - job: gromacs:oneapi-2021.1.1-opencl:build
+    - job: regressiontests:prepare
+
diff --git a/admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-sycl.gitlab-ci.yml b/admin/gitlab-ci/gromacs.matrix/gromacs.oneapi-2021.1.1-sycl.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..5f01e0d
--- /dev/null
@@ -0,0 +1,62 @@
+# Test goal: Newest ICPX build with SYCL
+# Test intents (should change rarely and conservatively):
+#   OS: Ubuntu oldest supported
+#   Compiler: ICPX newest supported
+#   FFT: MKL
+#   GPU: SYCL
+#   Scope: configure, build, unit tests, regression tests
+# Test implementation choices (free to change as needed):
+#   OS: Ubuntu 18.04
+#   Build type: Debug
+#   Compiler: ICPX 2021.1
+#   MPI: thread_MPI
+#   SIMD: AVX2_256
+#   Parallelism nt/ntomp: 4/2
+
+gromacs:oneapi-2021.1.1-sycl:configure:
+  extends:
+   - .gromacs:base:configure
+   - .use-oneapi:base
+   - .use-sycl
+   - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+    COMPILER_MAJOR_VERSION: 2021
+
+gromacs:oneapi-2021.1.1-sycl:build:
+  extends:
+    - .variables:default
+    - .gromacs:base:build
+    - .use-ccache
+    - .use-oneapi:base
+    - .rules:merge-and-post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+  needs:
+    - job: gromacs:oneapi-2021.1.1-sycl:configure
+
+gromacs:oneapi-2021.1.1-sycl:test:
+  extends:
+    - .gromacs:base:test
+    - .use-oneapi:base
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+  needs:
+    - job: gromacs:oneapi-2021.1.1-sycl:build
+
+gromacs:oneapi-2021.1.1-sycl:regressiontest:
+  extends:
+    - .gromacs:base:regressiontest
+    - .use-oneapi:base
+    - .rules:post-merge-acceptance
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-18.04-gcc-7-oneapi-2021.1.1
+  variables:
+    CMAKE: /usr/local/cmake-3.17.2/bin/cmake
+  needs:
+    - job: gromacs:oneapi-2021.1.1-sycl:build
+    - job: regressiontests:prepare
+
index 1038badd0b368183480475025192b17897310334..32de191be57460f81a52de89e0a5c1a710c76f04 100644 (file)
@@ -73,3 +73,69 @@ gmxapi-0.1:clang-8:py-3.8.2:
   variables:
     VENVPATH: "/root/venv/py3.8"
     PY_VER: "3.8.2"
+
+.gmxapi-0.2:gcc-10:gmx2021:
+  extends:
+    - .variables:default
+    - .use-clang:base
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-gcc-10
+  stage: test
+  variables:
+    KUBERNETES_CPU_LIMIT: 2
+    KUBERNETES_CPU_REQUEST: 2
+    KUBERNETES_MEMORY_LIMIT: 2Gi
+    KUBERNETES_MEMORY_REQUEST: 2Gi
+    PY_UNIT_TEST_XML: $CI_PROJECT_DIR/py-JUnitTestResults.xml
+    PY_MPI_UNIT_TEST_XML: $CI_PROJECT_DIR/py-mpi-JUnitTestResults.xml
+    PY_ACCEPTANCE_TEST_XML: $CI_PROJECT_DIR/gmxapi-acceptance-JUnitTestResults.xml
+    PY_MPI_ACCEPTANCE_TEST_XML: $CI_PROJECT_DIR/gmxapi-acceptance-mpi-JUnitTestResults.xml
+  script:
+    - source $INSTALL_DIR/bin/GMXRC
+    - source $VENVPATH/bin/activate && INSTALL_DIR=$PWD/$INSTALL_DIR OMP_NUM_THREADS=1 bash admin/ci-scripts/build-and-test-py-gmxapi-0.2.sh
+  artifacts:
+    reports:
+      junit:
+        - $PY_UNIT_TEST_XML
+        - $PY_MPI_UNIT_TEST_XML
+        - $PY_ACCEPTANCE_TEST_XML
+        - $PY_MPI_ACCEPTANCE_TEST_XML
+    when: always
+    expire_in: 1 week
+  tags:
+    - k8s-scilifelab
+  # The dependency means we need to use the same tag restriction as upstream.
+  needs:
+    - job: gromacs:gcc-10:build
+      artifacts: true
+
+gmxapi-0.2:gcc-10:gmx2021:py-3.6.10:
+  extends:
+    - .gmxapi-0.2:gcc-10:gmx2021
+    - .rules:merge-requests:release-2021
+  variables:
+    VENVPATH: "/root/venv/py3.6"
+    PY_VER: "3.6.10"
+
+gmxapi-0.2:gcc-10:gmx2021:py-3.7.7:
+  extends:
+    - .gmxapi-0.2:gcc-10:gmx2021
+    - .rules:merge-requests:release-2021
+  variables:
+    VENVPATH: "/root/venv/py3.7"
+    PY_VER: "3.7.7"
+
+gmxapi-0.2:gcc-10:gmx2021:py-3.8.2:
+  extends:
+    - .gmxapi-0.2:gcc-10:gmx2021
+    - .rules:merge-requests:release-2021
+  variables:
+    VENVPATH: "/root/venv/py3.8"
+    PY_VER: "3.8.2"
+
+gmxapi-0.2:gcc-10:gmx2021:py-3.9.1:
+  extends:
+    - .gmxapi-0.2:gcc-10:gmx2021
+    - .rules:merge-requests:release-2021
+  variables:
+    VENVPATH: "/root/venv/py3.9"
+    PY_VER: "3.9.1"
index 454a079627f258339723bd0b0d17667491febab6..629efb245dead094929003ec113c1c5edeb76041 100644 (file)
@@ -53,3 +53,11 @@ sample_restraint:gcc-10:gmx2021:py-3.8.2:
   variables:
     VENVPATH: "/root/venv/py3.8"
     PY_VER: "3.8.2"
+
+sample_restraint:gcc-10:gmx2021:py-3.9.1:
+  extends:
+    - .sample_restraint:gcc-10:gmx2021
+    - .rules:merge-requests:release-2021
+  variables:
+    VENVPATH: "/root/venv/py3.9"
+    PY_VER: "3.9.1"
index 5fc0bea2bce3b675c67b49982c45d42d541fb849..08229c62a4bcb7866b3c3d91352a41267850330b 100644 (file)
@@ -4,7 +4,7 @@
  * 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.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -63,6 +63,9 @@ class ArrayRef;
  * \brief
  * First part of the TPR file structure containing information about
  * the general aspect of the system.
+ *
+ * When adding to or making breaking changes to reading this struct,
+ * update TpxGeneration.
  */
 struct TpxFileHeader
 {
index 99fcfae3d5126ff8b58c1a386c4f6c8f805c7503..fb700b2387de19fa49546be682edc21d103d998a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2020, by the GROMACS development team, led by
+# Copyright (c) 2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -31,7 +31,7 @@
 #
 # To help us fund GROMACS development, we humbly ask that you cite
 # the research papers on the package. Check out http://www.gromacs.org.
-#
+
 # \author Victor Holanda <victor.holanda@cscs.ch>
 # \author Joe Jordan <ejjordan@kth.se>
 # \author Prashanth Kanduri <kanduri@cscs.ch>
@@ -100,6 +100,7 @@ target_sources(nblib
         integrator.cpp
         interactions.cpp
         molecules.cpp
+        particlesequencer.cpp
         particletype.cpp
         simulationstate.cpp
         topologyhelpers.cpp
@@ -136,11 +137,10 @@ if(GMX_INSTALL_NBLIB_API)
             molecules.h
             kerneloptions.h
             nblib.h
+            particlesequencer.h
             particletype.h
-            ppmap.h
             simulationstate.h
             topology.h
-            topologyhelpers.h
             DESTINATION include/nblib)
 endif()
 
index c1aaead24bbb57e8608652f2b632c54ef998139a..ea729f0d2e807aa96fdb407d237efdbdc008167d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
index c83a53b2c28ae80dee8f8533b3cd730c769fd369..e99dad8d577ccca375aa4b5d822c105d3c091ae0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
index 5287d4af7de6b22610e7a5b1e343617b8dd88a71..e9811f46fb12f4007b799592c8b60e02e4a14148 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -44,6 +44,7 @@
 #include "nblib/forcecalculator.h"
 #include "nblib/gmxcalculator.h"
 #include "nblib/gmxsetup.h"
+#include "gromacs/utility/arrayref.h"
 
 namespace nblib
 {
@@ -52,7 +53,11 @@ ForceCalculator::~ForceCalculator() = default;
 
 ForceCalculator::ForceCalculator(const SimulationState& system, const NBKernelOptions& options)
 {
-    gmxForceCalculator_ = nblib::GmxSetupDirector::setupGmxForceCalculator(system, options);
+    if (options.useGpu)
+    {
+        throw InputException("GPUs are not supported for force calculations yet.");
+    }
+    gmxForceCalculator_ = GmxSetupDirector::setupGmxForceCalculator(system, options);
 }
 
 void ForceCalculator::compute(gmx::ArrayRef<const Vec3> coordinates, gmx::ArrayRef<Vec3> forces)
index 0853099e7c73bc28a1d74084ae135924caf7935a..362105448a080b7a6a930756b61837ba54ff8bd7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -57,6 +57,7 @@
 #include "gromacs/nbnxm/pairsearch.h"
 #include "gromacs/pbcutil/pbc.h"
 #include "gromacs/utility/logger.h"
+#include "gromacs/utility/listoflists.h"
 #include "gromacs/utility/smalloc.h"
 #include "nblib/exception.h"
 #include "nblib/kerneloptions.h"
@@ -193,13 +194,9 @@ void NbvSetupUtil::setupNbnxmInstance(const size_t numParticleTypes, const NBKer
 
     auto atomData = std::make_unique<nbnxn_atomdata_t>(pinPolicy);
 
-    // Put everything together
-    auto nbv = std::make_unique<nonbonded_verlet_t>(
-            std::move(pairlistSets), std::move(pairSearch), std::move(atomData), kernelSetup, nullptr, nullWallcycle);
-
     // Needs to be called with the number of unique ParticleTypes
     nbnxn_atomdata_init(gmx::MDLogger(),
-                        nbv->nbat.get(),
+                        atomData.get(),
                         kernelSetup.kernelType,
                         combinationRule,
                         numParticleTypes,
@@ -207,6 +204,10 @@ void NbvSetupUtil::setupNbnxmInstance(const size_t numParticleTypes, const NBKer
                         1,
                         numThreads);
 
+    // Put everything together
+    auto nbv = std::make_unique<nonbonded_verlet_t>(
+            std::move(pairlistSets), std::move(pairSearch), std::move(atomData), kernelSetup, nullptr, nullWallcycle);
+
     gmxForceCalculator_->nbv_ = std::move(nbv);
 }
 
@@ -302,8 +303,10 @@ void NbvSetupUtil::setParticlesOnGrid(const std::vector<Vec3>& coordinates, cons
     gmxForceCalculator_->setParticlesOnGrid(particleInfoAllVdw_, coordinates, box);
 }
 
-void NbvSetupUtil::constructPairList(const gmx::ListOfLists<int>& exclusions)
+void NbvSetupUtil::constructPairList(ExclusionLists<int> exclusionLists)
 {
+    gmx::ListOfLists<int> exclusions(std::move(exclusionLists.ListRanges),
+                                     std::move(exclusionLists.ListElements));
     gmxForceCalculator_->nbv_->constructPairlist(
             gmx::InteractionLocality::Local, exclusions, 0, gmxForceCalculator_->nrnb_.get());
 }
@@ -322,7 +325,7 @@ std::unique_ptr<GmxForceCalculator> GmxSetupDirector::setupGmxForceCalculator(co
     nbvSetupUtil.setupStepWorkload(options);
     nbvSetupUtil.setupNbnxmInstance(system.topology().getParticleTypes().size(), options);
     nbvSetupUtil.setParticlesOnGrid(system.coordinates(), system.box());
-    nbvSetupUtil.constructPairList(system.topology().getGmxExclusions());
+    nbvSetupUtil.constructPairList(system.topology().exclusionLists());
     nbvSetupUtil.setAtomProperties(system.topology().getParticleTypeIdOfAllParticles(),
                                    system.topology().getCharges());
     nbvSetupUtil.setupForceRec(system.box().legacyMatrix());
index 1e5d81b25881dc4ba35f15e3bd75c2b3240d93d2..4b61b2e77eabb4179a2f97446372989a8546d1e3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -105,7 +105,7 @@ public:
     void setParticlesOnGrid(const std::vector<Vec3>& coordinates, const Box& box);
 
     //! Constructs pair lists
-    void constructPairList(const gmx::ListOfLists<int>& exclusions);
+    void constructPairList(ExclusionLists<int> exclusionLists);
 
     //! Sets up t_forcerec object on the GmxForceCalculator
     void setupForceRec(const matrix& box);
index 9297521875cc933bab07c2950bd7968365478bb6..461e26ff68dfe276014995d8c22a626bead5d950 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -47,7 +47,6 @@
 
 #include "nblib/exception.h"
 #include "nblib/interactions.h"
-#include "nblib/util/internal.h"
 
 namespace nblib
 {
index 7a3e24501d917c1cb6a6f9688fda5d2a1bf31478..fd563d0cd15cb62030112044689cf5ceae616624 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -51,7 +51,7 @@
 
 #include "nblib/kerneloptions.h"
 #include "nblib/particletype.h"
-#include "nblib/util/user.h"
+#include "nblib/util/util.hpp"
 
 namespace nblib
 {
index dfd72e74caa1a01b706c8b8d160fe1f3200c6246..86ee4325c7790c2af3ad19e44e633fd063db2a41 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
index 676ee944b7e832f2c3c61882b86b082bf23ecbb9..73bdfe2ee96a2d0bbaee51217727247014fbe979 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -55,8 +55,7 @@
 #include <array>
 
 #include "nblib/particletype.h"
-#include "nblib/ppmap.h"
-#include "nblib/util/user.h"
+#include "nblib/util/util.hpp"
 
 namespace nblib
 {
@@ -221,22 +220,22 @@ inline bool operator==(const MorseBondType& a, const MorseBondType& b)
 }
 
 
-/*! \brief default angle type
+/*! \brief Harmonic angle type
  *
  * Note: the angle is always stored as radians internally
  */
-struct DefaultAngle : public TwoParameterInteraction<struct DefaultAngleParameter>
+struct HarmonicAngleType : public TwoParameterInteraction<struct HarmonicAngleTypeParameter>
 {
-    DefaultAngle() = default;
+    HarmonicAngleType() = default;
     //! \brief construct from angle given in radians
-    DefaultAngle(Radians angle, ForceConstant f) :
-        TwoParameterInteraction<struct DefaultAngleParameter>{ f, angle }
+    HarmonicAngleType(Radians angle, ForceConstant f) :
+        TwoParameterInteraction<struct HarmonicAngleTypeParameter>{ f, angle }
     {
     }
 
     //! \brief construct from angle given in degrees
-    DefaultAngle(Degrees angle, ForceConstant f) :
-        TwoParameterInteraction<struct DefaultAngleParameter>{ f, angle * DEG2RAD }
+    HarmonicAngleType(Degrees angle, ForceConstant f) :
+        TwoParameterInteraction<struct HarmonicAngleTypeParameter>{ f, angle * DEG2RAD }
     {
     }
 };
index 09e305d7b2ce8138972d643e6115ea09ebec170d..7122001a6fb7efb301a052bad47af96e1a8f5fd5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -36,8 +36,6 @@
  * \brief
  * Implements a bonded force calculator
  *
- * Intended for internal use inside the ForceCalculator.
- *
  * \author Victor Holanda <victor.holanda@cscs.ch>
  * \author Joe Jordan <ejjordan@kth.se>
  * \author Prashanth Kanduri <kanduri@cscs.ch>
index dc44055c40aa119c6dc59efeac05525b0c7b7c0d..d5c149367b447774e11e992ffca45ffc8ed95217 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -52,6 +52,7 @@
 #include <unordered_map>
 
 #include "nblib/listed_forces/definitions.h"
+#include "nblib/vector.h"
 
 namespace gmx
 {
@@ -66,7 +67,7 @@ class PbcHolder;
 template<class T>
 class ForceBuffer;
 
-/*! \internal \brief object to calculate listed forces
+/*! \internal \brief Object to calculate forces and energies of listed forces
  *
  */
 class ListedForceCalculator
index 1385963e9306f11d5bd8d2ffbea9cfca64f076cd..c8319857405f9d2755d90089622a13b68f540e18 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -34,7 +34,9 @@
  */
 /*! \internal \file
  * \brief
- * This implements basic nblib utility tests
+ * This implements conversion utilities between the internal
+ * representations of the listed forces parameters for NBLIB
+ * and that of the GROMACS backend
  *
  * \author Victor Holanda <victor.holanda@cscs.ch>
  * \author Joe Jordan <ejjordan@kth.se>
@@ -45,6 +47,8 @@
 #ifndef NBLIB_LISTEDFORCES_CONVERSION_HPP
 #define NBLIB_LISTEDFORCES_CONVERSION_HPP
 
+#include <memory>
+
 #include "gromacs/topology/forcefieldparameters.h"
 #include "gromacs/topology/idef.h"
 #include "nblib/listed_forces/traits.h"
@@ -87,7 +91,7 @@ struct ListedIndex<G96BondType> : std::integral_constant<int, F_G96BONDS>
 };
 
 template<>
-struct ListedIndex<DefaultAngle> : std::integral_constant<int, F_ANGLES>
+struct ListedIndex<HarmonicAngleType> : std::integral_constant<int, F_ANGLES>
 {
 };
 
@@ -121,7 +125,7 @@ void transferParameters([[maybe_unused]] const InteractionData& interactionData,
 }
 
 template<>
-void transferParameters(const TwoCenterData<HarmonicBondType>& interactions, gmx_ffparams_t& gmx_params)
+void transferParameters(const ListedTypeData<HarmonicBondType>& interactions, gmx_ffparams_t& gmx_params)
 {
     for (const auto& hbond : interactions.parameters)
     {
@@ -133,7 +137,7 @@ void transferParameters(const TwoCenterData<HarmonicBondType>& interactions, gmx
 }
 
 template<>
-void transferParameters(const ThreeCenterData<DefaultAngle>& interactions, gmx_ffparams_t& gmx_params)
+void transferParameters(const ListedTypeData<HarmonicAngleType>& interactions, gmx_ffparams_t& gmx_params)
 {
     for (const auto& angle : interactions.parameters)
     {
@@ -145,7 +149,7 @@ void transferParameters(const ThreeCenterData<DefaultAngle>& interactions, gmx_f
 }
 
 template<>
-void transferParameters(const FourCenterData<ProperDihedral>& interactions, gmx_ffparams_t& gmx_params)
+void transferParameters(const ListedTypeData<ProperDihedral>& interactions, gmx_ffparams_t& gmx_params)
 {
     for (const auto& dihedral : interactions.parameters)
     {
@@ -158,7 +162,8 @@ void transferParameters(const FourCenterData<ProperDihedral>& interactions, gmx_
 }
 
 template<class TwoCenterType>
-void transferIndicesImpl(const TwoCenterData<TwoCenterType>& interactions, InteractionDefinitions& idef, int offset)
+std::enable_if_t<Contains<TwoCenterType, SupportedTwoCenterTypes>{}>
+transferIndicesImpl(const ListedTypeData<TwoCenterType>& interactions, InteractionDefinitions& idef, int offset)
 {
     for (const auto& index : interactions.indices)
     {
@@ -170,7 +175,8 @@ void transferIndicesImpl(const TwoCenterData<TwoCenterType>& interactions, Inter
 }
 
 template<class ThreeCenterType>
-void transferIndicesImpl(const ThreeCenterData<ThreeCenterType>& interactions, InteractionDefinitions& idef, int offset)
+std::enable_if_t<Contains<ThreeCenterType, SupportedThreeCenterTypes>{}>
+transferIndicesImpl(const ListedTypeData<ThreeCenterType>& interactions, InteractionDefinitions& idef, int offset)
 {
     for (const auto& index : interactions.indices)
     {
@@ -183,7 +189,8 @@ void transferIndicesImpl(const ThreeCenterData<ThreeCenterType>& interactions, I
 }
 
 template<class FourCenterType>
-void transferIndicesImpl(const FourCenterData<FourCenterType>& interactions, InteractionDefinitions& idef, int offset)
+std::enable_if_t<Contains<FourCenterType, SupportedFourCenterTypes>{}>
+transferIndicesImpl(const ListedTypeData<FourCenterType>& interactions, InteractionDefinitions& idef, int offset)
 {
     for (const auto& index : interactions.indices)
     {
@@ -197,7 +204,8 @@ void transferIndicesImpl(const FourCenterData<FourCenterType>& interactions, Int
 }
 
 template<class FiveCenterType>
-void transferIndicesImpl(const FiveCenterData<FiveCenterType>& interactions, InteractionDefinitions& idef, int offset)
+std::enable_if_t<Contains<FiveCenterType, SupportedFiveCenterTypes>{}>
+transferIndicesImpl(const ListedTypeData<FiveCenterType>& interactions, InteractionDefinitions& idef, int offset)
 {
     for (const auto& index : interactions.indices)
     {
index 79b3676353a49154e2d0516e731290985f374ca4..d078e176afea2fa665bc8ed58162efb92915bfd2 100644 (file)
 
 #include "nblib/listed_forces/traits.h"
 #include "nblib/listed_forces/kernels.hpp"
+#include "nblib/util/util.hpp"
 #include "nblib/pbc.hpp"
+#include "nblib/vector.h"
 #include "gromacs/math/vec.h"
 #include "gromacs/utility/arrayref.h"
 
+#define NBLIB_ALWAYS_INLINE __attribute((always_inline))
+
 namespace nblib
 {
 
@@ -83,16 +87,21 @@ auto computeTwoCenter(const TwoCenterType& parameters, const BasicVector& dx, Ba
 
 /*! \brief calculate two-center interactions
  *
- * \tparam BondType
- * \param index
- * \param bondInstances
- * \param x
- * \param forces
- * \return
+ * \tparam Force buffer type
+ * \tparam TwoCenterType The bond type to compute; used for type deduction
+ * \tparam Cartesian vector type
+ * \tparam PBC type
+ * \param[in] index The atom and parameter indices used for computing the interaction
+ * \param[in] bondInstances The full type-specific interaction list
+ * \param[in] x The coordinates
+ * \param[in/out] forces The forces
+ * \param[in] pbc Object used for computing distances accounting for PBC's
+ * \return Computed kernel energies
  */
-template <class Buffer, class TwoCenterType, class BasicVector, class Pbc>
+template <class Buffer, class TwoCenterType, class BasicVector, class Pbc,
+          std::enable_if_t<Contains<TwoCenterType, SupportedTwoCenterTypes>{}>* = nullptr>
 inline NBLIB_ALWAYS_INLINE
-auto dispatchInteraction(const TwoCenterInteractionIndex& index,
+auto dispatchInteraction(const InteractionIndex<TwoCenterType>& index,
                          const std::vector<TwoCenterType>& bondInstances,
                          gmx::ArrayRef<const BasicVector> x,
                          Buffer* forces,
@@ -155,12 +164,12 @@ auto computeThreeCenter(const ThreeCenterType& parameters, const BasicVector& ri
                         BasicVector* fi, BasicVector* fj, BasicVector* fk)
 {
     using ValueType = BasicVectorValueType_t<BasicVector>;
-    //! calculate 3-center common quantities: angle between x1-x2 and x2-x3
-    //! Todo: after sufficient evaluation, switch over to atan2 based algorithm
+    // calculate 3-center common quantities: angle between x1-x2 and x2-x3
+    // Todo: after sufficient evaluation, switch over to atan2 based algorithm
     ValueType costh = cos_angle(rij, rkj); /* 25             */
     ValueType theta = std::acos(costh);    /* 10             */
 
-    //! call type-specific angle kernel, e.g. harmonic, linear, quartic,  etc.
+    // call type-specific angle kernel, e.g. harmonic, linear, quartic,  etc.
     auto [force, energy] = threeCenterKernel(theta, parameters);
 
     spreadThreeCenterForces(costh, force, rij, rkj, fi, fj, fk);
@@ -168,18 +177,23 @@ auto computeThreeCenter(const ThreeCenterType& parameters, const BasicVector& ri
     return energy;
 }
 
-/*! \brief calculate three-center interactions
+/*! \brief Calculate three-center interactions
  *
- * \tparam BondType
- * \param index
- * \param bondInstances
- * \param x
- * \param forces
- * \return
+ * \tparam Force buffer type
+ * \tparam Three centre interaction parameters
+ * \tparam Cartesian vector type
+ * \tparam PBC type
+ * \param[in] index
+ * \param[in] Bond parameters
+ * \param[in] x coordinate array
+ * \param[in/out] Force buffer
+ * \param[in] PBC
+ * \return Computed kernel energies
  */
-template <class Buffer, class ThreeCenterType, class BasicVector, class Pbc>
+template <class Buffer, class ThreeCenterType, class BasicVector, class Pbc,
+          std::enable_if_t<Contains<ThreeCenterType, SupportedThreeCenterTypes>{}>* = nullptr>
 inline NBLIB_ALWAYS_INLINE
-auto dispatchInteraction(const ThreeCenterInteractionIndex& index,
+auto dispatchInteraction(const InteractionIndex<ThreeCenterType>& index,
                          const std::vector<ThreeCenterType>& parameters,
                          gmx::ArrayRef<const BasicVector> x,
                          Buffer* forces,
@@ -246,22 +260,26 @@ addThreeCenterAggregate([[maybe_unused]] const FourCenterType& parameters,
                         [[maybe_unused]] BasicVector* fk,
                         [[maybe_unused]] BasicVector* fl)
 {
-return 0.0;
+    return 0.0;
 };
 
-/*! \brief calculate four-center interactions
+/*! \brief Calculate four-center interactions
  *
+ * \tparam Force buffer type
  * \tparam FourCenterType The bond type to compute; used for type deduction
+ * \tparam Cartesian vector type
+ * \tparam PBC type
  * \param[in] index The atom and parameter indices used for computing the interaction
  * \param[in] parameters The full type-specific interaction list
  * \param[in] x The coordinates
  * \param[in/out] forces The forces
  * \param[in] pbc Object used for computing distances accounting for PBC's
- * \return
+ * \return Computed kernel energies
  */
-template <class Buffer, class FourCenterType, class BasicVector, class Pbc>
+template <class Buffer, class FourCenterType, class BasicVector, class Pbc,
+          std::enable_if_t<Contains<FourCenterType, SupportedFourCenterTypes>{}>* = nullptr>
 inline NBLIB_ALWAYS_INLINE
-auto dispatchInteraction(const FourCenterInteractionIndex& index,
+auto dispatchInteraction(const InteractionIndex<FourCenterType>& index,
                          const std::vector<FourCenterType>& parameters,
                          gmx::ArrayRef<const BasicVector> x,
                          Buffer* forces,
@@ -306,18 +324,23 @@ auto dispatchInteraction(const FourCenterInteractionIndex& index,
     return energy;
 }
 
-/*! \brief calculate five-center interactions
+/*! \brief Calculate five-center interactions
  *
- * \tparam BondType
- * \param index
- * \param bondInstances
- * \param x
- * \param forces
- * \return
+ * \tparam Force buffer type
+ * \tparam FiveCenterType The bond type to compute; used for type deduction
+ * \tparam Cartesian vector type
+ * \tparam PBC type
+ * \param[in] index The atom and parameter indices used for computing the interaction
+ * \param[in] parameters The full type-specific interaction list
+ * \param[in] x The coordinates
+ * \param[in/out] forces The forces
+ * \param[in] pbc Object used for computing distances accounting for PBC's
+ * \return Computed kernel energies
  */
-template <class Buffer, class FiveCenterType, class BasicVector, class Pbc>
+template <class Buffer, class FiveCenterType, class BasicVector, class Pbc,
+          std::enable_if_t<Contains<FiveCenterType, SupportedFiveCenterTypes>{}>* = nullptr>
 inline NBLIB_ALWAYS_INLINE
-auto dispatchInteraction(const FiveCenterInteractionIndex& index,
+auto dispatchInteraction(const InteractionIndex<FiveCenterType>& index,
                          const std::vector<FiveCenterType>& parameters,
                          gmx::ArrayRef<const BasicVector> x,
                          Buffer* forces,
@@ -345,7 +368,12 @@ auto dispatchInteraction(const FiveCenterInteractionIndex& index,
 
     const FiveCenterType& fiveCenterTypeParams = parameters[std::get<5>(index)];
 
-    ignore_unused(x, forces, fiveCenterTypeParams);
+    // this dispatch function is not in use yet, because CMap is not yet implemented
+    // we don't want to add [[maybe_unused]] in the signature
+    // and we also don't want compiler warnings, so we cast to void
+    (void)fiveCenterTypeParams;
+    (void)forces;
+
     return energy;
 }
 
@@ -353,13 +381,12 @@ auto dispatchInteraction(const FiveCenterInteractionIndex& index,
 /*! \brief implement a loop over bonds for a given BondType and Kernel
  *  corresponds to e.g. the "bonds" function at Gromacs:bonded.cpp@450
  *
- * \tparam BondType
- * \tparam Kernel unused for now
- * \param indices interaction atom pair indices + bond parameter index
- * \param bondInstances bond parameters
- * \param x coordinate input
- * \param kernel unused for now
- * \return
+ * \param[in] indices interaction atom pair indices + bond parameter index
+ * \param[in] interactionParameters bond/interaction parameters
+ * \param[in] x coordinate input
+ * \param[in/out] forces The forces
+ * \param[in] pbc Object used for computing distances accounting for PBC's
+ * \return Computed kernel energies
  */
 template <class Index, class InteractionType, class Buffer, class Pbc>
 auto computeForces(const std::vector<Index>& indices,
@@ -380,9 +407,11 @@ auto computeForces(const std::vector<Index>& indices,
 
 /*! \brief implement a loop over bond types and accumulate their force contributions
  *
- * \param interactions interaction pairs and bond parameters
- * \param x coordinate input
- * \param forces output force buffer
+ * \param[in] interactions interaction pairs and bond parameters
+ * \param[in] x coordinate input
+ * \param[in/out] forces output force buffer
+ * \param[in] pbc Object used for computing distances accounting for PBC's
+ * \return Computed kernel energies
  */
 template<class Buffer, class Pbc>
 auto reduceListedForces(const ListedInteractionData& interactions,
@@ -414,4 +443,6 @@ auto reduceListedForces(const ListedInteractionData& interactions,
 
 } // namespace nblib
 
+#undef NBLIB_ALWAYS_INLINE
+
 #endif // NBLIB_LISTEDFORCES_DATAFLOW_HPP
index 5240837164f8ec9e4802c3a0fc88bdf531979018..04c1e10bd4ca2253be10721dace4bd5484fdca65 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
  * \author Prashanth Kanduri <kanduri@cscs.ch>
  * \author Sebastian Keller <keller@cscs.ch>
  * \author Artem Zhmurov <zhmurov@gmail.com>
- *
- * A note on the preprocessor (PP) usage in this file:
- *
- * The PP macros defined here are used exclusively to generate
- * template instantiations declarations of the form "extern template function(X)"
- * in header files and "template function(X)" in .cpp files.
- * These declarations do not affect the program logic in any way and neither are they
- * required to read and understand the behavior of the code as they do not
- * result in any executable instructions.
- * In fact, it would even be technically possible to omit these PP generated
- * declarations in the header files and replace them with an unused static function
- * in the .cpp file that calls the template function in question
- * (e.g. Molecule::addInteraction) once with each type from the variadic template
- * TypeLists declared in this file. This would be enough to create the required instantiations.
- * It would, however, create more work for the compiler which then has to instantiate the
- * templates in the header in each translation unit where the header is included.
- * Doing this results in a compiler warning.
- *
  */
 #ifndef NBLIB_LISTEDFORCES_DEFINITIONS_H
 #define NBLIB_LISTEDFORCES_DEFINITIONS_H
 
-#include "nblib/util/user.h"
+#include <variant>
+
+#include "nblib/util/traits.hpp"
 #include "bondtypes.h"
 
 namespace nblib
@@ -71,7 +55,7 @@ namespace nblib
 
 //***********************************************************************************
 
-/*! \brief These macros define what interaction types are supported in
+/*! \brief These type lists define what interaction types are supported in
  *  -Molecule
  *  -Topology
  *  -ListedForceCalculator
@@ -81,101 +65,87 @@ namespace nblib
  *  a kernel in kernels.hpp
  */
 
-#define SUPPORTED_TWO_CENTER_TYPES \
-    HarmonicBondType, G96BondType, CubicBondType, FENEBondType, HalfAttractiveQuarticBondType
-
-#define SUPPORTED_THREE_CENTER_TYPES DefaultAngle
-
-#define SUPPORTED_FOUR_CENTER_TYPES ProperDihedral, ImproperDihedral, RyckaertBellemanDihedral
-
-#define SUPPORTED_FIVE_CENTER_TYPES Default5Center
+using SupportedTwoCenterTypes =
+        TypeList<HarmonicBondType, G96BondType, CubicBondType, FENEBondType, HalfAttractiveQuarticBondType>;
+using SupportedThreeCenterTypes = TypeList<HarmonicAngleType>;
+using SupportedFourCenterTypes = TypeList<ProperDihedral, ImproperDihedral, RyckaertBellemanDihedral>;
+using SupportedFiveCenterTypes = TypeList<Default5Center>;
 
 //***********************************************************************************
 
-#define SUPPORTED_LISTED_TYPES                                                             \
-    SUPPORTED_TWO_CENTER_TYPES, SUPPORTED_THREE_CENTER_TYPES, SUPPORTED_FOUR_CENTER_TYPES, \
-            SUPPORTED_FIVE_CENTER_TYPES
-
-#define NBLIB_ALWAYS_INLINE __attribute((always_inline))
-
-//! \brief encodes the number of integers needed to represent 2-center interactions (bonds, pairs)
-using TwoCenterInteractionIndex = std::array<int, 3>;
-//! \brief encodes the number of integers needed to represent 3-center interactions (angles)
-using ThreeCenterInteractionIndex = std::array<int, 4>;
-//! \brief encodes the number of integers needed to represent 4-center interactions (dihedrals)
-using FourCenterInteractionIndex = std::array<int, 5>;
-//! \brief encodes the number of integers needed to represent 5-center interactions (CMAP)
-using FiveCenterInteractionIndex = std::array<int, 6>;
+using SupportedListedTypes =
+        Fuse<SupportedTwoCenterTypes, SupportedThreeCenterTypes, SupportedFourCenterTypes, SupportedFiveCenterTypes>;
 
-//! \brief data type for pairwise interactions, e.g. bonds
-template<class TwoCenterType>
-struct TwoCenterData
+//! \brief meta function to map from an Interaction type to the number of interaction centers
+template<class Interaction, class = void>
+struct NCenter
 {
-    using type = TwoCenterType;
-
-    // tuple format: <particleID i, particleID j, TwoCenterInstanceIndex>
-    std::vector<TwoCenterInteractionIndex> indices;
-    // vector of unique TwoCenterType instances
-    std::vector<TwoCenterType> parameters;
 };
 
-//! \brief data type for three-center interactions, e.g. angles
-template<class ThreeCenterType>
-struct ThreeCenterData
+//! \brief meta function return value for two-center interactions
+template<class Interaction>
+struct NCenter<Interaction, std::enable_if_t<Contains<Interaction, SupportedTwoCenterTypes>{}>> :
+    std::integral_constant<std::size_t, 2>
 {
-    using type = ThreeCenterType;
-
-    // tuple format: <particleID i, particleID j, particleID k, ThreeCenterInstanceIndex>
-    std::vector<ThreeCenterInteractionIndex> indices;
-    // vector of unique ThreeCenterType instances
-    std::vector<ThreeCenterType> parameters;
 };
 
-//! \brief data type for four-center interactions, e.g. dihedrals
-template<class FourCenterType>
-struct FourCenterData
+//! \brief meta function return value for three-center interactions
+template<class Interaction>
+struct NCenter<Interaction, std::enable_if_t<Contains<Interaction, SupportedThreeCenterTypes>{}>> :
+    std::integral_constant<std::size_t, 3>
 {
-    using type = FourCenterType;
-
-    // tuple format: <particleID i, particleID j, particleID k, particleID l, FourCenterInstanceIndex>
-    std::vector<FourCenterInteractionIndex> indices;
-    // vector of unique FiveCenterType instances
-    std::vector<FourCenterType> parameters;
 };
 
-//! \brief data type for five-center interactions, e.g. CMAP
-template<class FiveCenterType>
-struct FiveCenterData
+//! \brief meta function return value for four-center interactions
+template<class Interaction>
+struct NCenter<Interaction, std::enable_if_t<Contains<Interaction, SupportedFourCenterTypes>{}>> :
+    std::integral_constant<std::size_t, 4>
 {
-    using type = FiveCenterType;
+};
 
-    // tuple format: <particleID i, particleID j, particleID k, particleID l, particleID m, FiveCenterInstanceIndex>
-    std::vector<FiveCenterInteractionIndex> indices;
-    // vector of unique FiveCenterType instances
-    std::vector<FiveCenterType> parameters;
+//! \brief meta function return value for five-center interactions
+template<class Interaction>
+struct NCenter<Interaction, std::enable_if_t<Contains<Interaction, SupportedFiveCenterTypes>{}>> :
+    std::integral_constant<std::size_t, 5>
+{
 };
 
+template<size_t N>
+using IndexArray = std::array<int, N>;
 
-using SupportedTwoCenterTypes = TypeList<SUPPORTED_TWO_CENTER_TYPES>;
-// std::tuple<TwoCenterData<TwoCenterType1>, ...>
-using TwoCenterInteractionData = Reduce<std::tuple, Map<TwoCenterData, SupportedTwoCenterTypes>>;
+/*! \brief encodes the number of integers needed to represent N-center interactions
+ *
+ *  number of indices to store is the the number of interaction center
+ *  plus 1 index for the interaction parameter lookup
+ */
+template<class Interaction>
+using InteractionIndex = IndexArray<NCenter<Interaction>{} + 1>;
 
-using SupportedThreeCenterTypes = TypeList<SUPPORTED_THREE_CENTER_TYPES>;
-// std::tuple<AngleData<ThreeCenterType1>, ...>
-using ThreeCenterInteractionData = Reduce<std::tuple, Map<ThreeCenterData, SupportedThreeCenterTypes>>;
+// same as InteractionIndex, but just the coordinate indices
+template<class Interaction>
+using CoordinateIndex = IndexArray<NCenter<Interaction>{}>;
 
-using SupportedFourCenterTypes = TypeList<SUPPORTED_FOUR_CENTER_TYPES>;
-// std::tuple<FourCenterData<FourCenterType1>, ...>
-using FourCenterInteractionData = Reduce<std::tuple, Map<FourCenterData, SupportedFourCenterTypes>>;
+//! \brief container data type for listed interactions
+template<class InteractionType>
+struct ListedTypeData
+{
+    using type = InteractionType;
 
-using SupportedFiveCenterTypes = TypeList<SUPPORTED_FIVE_CENTER_TYPES>;
-// std::tuple<FiveCenterData<FiveCenterType1>, ...>
-using FiveCenterInteractionData = Reduce<std::tuple, Map<FiveCenterData, SupportedFiveCenterTypes>>;
+    // tuple format: <particleID i, particleID j, ..., InteractionInstanceIndex>
+    std::vector<InteractionIndex<InteractionType>> indices;
+    // vector of unique TwoCenterType instances
+    std::vector<InteractionType> parameters;
+};
+
+using TwoCenterInteraction   = Reduce<std::variant, SupportedTwoCenterTypes>;
+using ThreeCenterInteraction = Reduce<std::variant, SupportedThreeCenterTypes>;
+using FourCenterInteraction  = Reduce<std::variant, SupportedFourCenterTypes>;
+using FiveCenterInteraction  = Reduce<std::variant, SupportedFiveCenterTypes>;
 
 //! This is the complete type that holds all listed interaction data
-using ListedInteractionData = decltype(std::tuple_cat(TwoCenterInteractionData{},
-                                                      ThreeCenterInteractionData{},
-                                                      FourCenterInteractionData{},
-                                                      FiveCenterInteractionData{}));
+// result: std::tuple<ListedTypeData<SupportedListedType1>, ...>
+using ListedInteractionData = Reduce<std::tuple, Map<ListedTypeData, SupportedListedTypes>>;
+
 } // namespace nblib
+
 #endif // NBLIB_LISTEDFORCES_DEFINITIONS_H
diff --git a/api/nblib/listed_forces/gmxcalculator.cpp b/api/nblib/listed_forces/gmxcalculator.cpp
deleted file mode 100644 (file)
index 7895b98..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 2020, by the GROMACS development team, led by
- * Mark Abraham, David van der Spoel, Berk Hess, and 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
- * This implements basic nblib utility tests
- *
- * \author Victor Holanda <victor.holanda@cscs.ch>
- * \author Joe Jordan <ejjordan@kth.se>
- * \author Prashanth Kanduri <kanduri@cscs.ch>
- * \author Sebastian Keller <keller@cscs.ch>
- */
-#include "nblib/exception.h"
-#include "nblib/listed_forces/gmxcalculator.h"
-#include "gromacs/listed_forces/listed_forces.cpp"
-#include "gromacs/listed_forces/manage_threading.h"
-#include "gromacs/timing/wallcycle.h"
-#include "conversions.hpp"
-
-namespace nblib
-{
-
-ListedGmxCalculator::ListedGmxCalculator(const ListedInteractionData& interactions,
-                                         int                          nP,
-                                         int                          nThr,
-                                         const Box&                   box) :
-    numParticles(nP),
-    numThreads(nThr),
-    bondedThreading(numThreads, 1, nullptr),
-    shiftBuffer(SHIFTS), // this is gromacs setup code so here use SHIFTS instead of numShiftVectors
-    forceBuffer(2 * numParticles, gmx::RVec{ 0, 0, 0 }),
-    shiftProxy(gmx::ArrayRefWithPadding<gmx::RVec>(&forceBuffer[0],
-                                                   &forceBuffer[numParticles],
-                                                   &forceBuffer[2 * numParticles]),
-               false,
-               shiftBuffer),
-    virialProxy(forceBuffer, false),
-    forceOutputs(shiftProxy, false, virialProxy),
-    enerd(1, 0),
-    lambdaBuffer(numParticles) // just something big enough
-{
-    std::tie(idef, ffparams) = createFFparams(interactions);
-    idef->ilsort             = ilsortNO_FE;
-
-    setup_bonded_threading(&bondedThreading, numParticles, false, *idef);
-
-    wcycle = wallcycle_init(nullptr, 0, &cr);
-    set_pbc(&pbc, PbcType::Xyz, box.legacyMatrix());
-
-    stepWork.computeDhdl   = false;
-    stepWork.computeVirial = false;
-    stepWork.computeEnergy = true;
-
-    fr.natoms_force = numParticles;
-}
-
-void ListedGmxCalculator::compute(const std::vector<gmx::RVec>&      x,
-                                  std::vector<gmx::RVec>&            forces,
-                                  ListedForceCalculator::EnergyType& energies)
-{
-    if (forces.size() != x.size() || forces.size() >= forceBuffer.size())
-    {
-        throw InputException("Provided force and/or coordinate buffers inconsistent");
-    }
-
-    const rvec* xdata = &(x[0].as_vec());
-
-    energies.fill(0);
-    std::fill(enerd.term, enerd.term + F_NRE, 0.0);
-
-    calc_listed(wcycle,
-                *idef,
-                &bondedThreading,
-                xdata,
-                &forceOutputs,
-                &fr,
-                &pbc,
-                &enerd,
-                &nrnb,
-                lambdaBuffer.data(),
-                nullptr,
-                nullptr,
-                nullptr,
-                stepWork);
-
-    auto transferEnergy = [&energies, this](auto& interactionElement) {
-        using InteractionType = typename std::decay_t<decltype(interactionElement)>::type;
-        if constexpr (ListedTypeIsImplemented<InteractionType>{})
-        {
-            constexpr int index = FindIndex<InteractionType, ListedInteractionData>::value;
-            energies[index]     = this->enerd.term[ListedIndex<InteractionType>::value];
-        }
-    };
-    for_each_tuple(transferEnergy, ListedInteractionData{});
-
-    // add forces to output force buffers
-    for (int pIndex = 0; pIndex < forces.size(); pIndex++)
-    {
-        forces[pIndex] += forceBuffer[pIndex];
-    }
-}
-
-const InteractionDefinitions& ListedGmxCalculator::getIdef() const
-{
-    return *idef;
-}
-
-
-} // namespace nblib
diff --git a/api/nblib/listed_forces/gmxcalculator.h b/api/nblib/listed_forces/gmxcalculator.h
deleted file mode 100644 (file)
index cd6a9ed..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 2020, by the GROMACS development team, led by
- * Mark Abraham, David van der Spoel, Berk Hess, and 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
- * This implements a fixture for calling calc_listed in gromacs
- * with nblib interaction data
- *
- * \author Victor Holanda <victor.holanda@cscs.ch>
- * \author Joe Jordan <ejjordan@kth.se>
- * \author Prashanth Kanduri <kanduri@cscs.ch>
- * \author Sebastian Keller <keller@cscs.ch>
- */
-
-#ifndef NBLIB_LISTEDFORCES_GMXCALCULATOR_H
-#define NBLIB_LISTEDFORCES_GMXCALCULATOR_H
-
-#include "gromacs/gmxlib/nrnb.h"
-#include "gromacs/listed_forces/listed_forces.h"
-#include "gromacs/listed_forces/listed_internal.h"
-#include "gromacs/mdtypes/commrec.h"
-#include "gromacs/mdtypes/fcdata.h"
-#include "gromacs/mdtypes/forceoutput.h"
-#include "gromacs/mdtypes/forcerec.h"
-#include "gromacs/mdtypes/simulation_workload.h"
-#include "gromacs/pbcutil/pbc.h"
-#include "gromacs/timing/wallcycle.h"
-#include "gromacs/topology/forcefieldparameters.h"
-#include "gromacs/topology/idef.h"
-#include "nblib/box.h"
-#include "calculator.h"
-
-namespace nblib
-{
-
-/*  an encapsulation class for gmx calc_listed
- *
- *  Holds all the necessary data to call calc_listed
- *  same ctor signature and behavior as the corresponding nblib
- *  ListedForceCalculator
- */
-class ListedGmxCalculator
-{
-public:
-    ListedGmxCalculator(const ListedInteractionData& interactions, int nP, int nThr, const Box& box);
-
-    void compute(const std::vector<gmx::RVec>&      x,
-                 std::vector<gmx::RVec>&            forces,
-                 ListedForceCalculator::EnergyType& energies);
-
-    [[nodiscard]] const InteractionDefinitions& getIdef() const;
-
-private:
-    int numParticles;
-    int numThreads;
-
-
-    std::unique_ptr<InteractionDefinitions> idef;
-    std::unique_ptr<gmx_ffparams_t>         ffparams;
-
-    bonded_threading_t bondedThreading;
-
-    std::vector<gmx::RVec> shiftBuffer;
-    std::vector<gmx::RVec> forceBuffer;
-
-    gmx::ForceWithShiftForces shiftProxy;
-    gmx::ForceWithVirial      virialProxy;
-    gmx::ForceOutputs         forceOutputs; // yet another proxy
-
-    t_forcerec fr;
-    t_fcdata   fcdata; // unused
-
-    t_pbc             pbc;
-    gmx_wallcycle_t   wcycle;
-    gmx_enerdata_t    enerd;
-    gmx::StepWorkload stepWork;
-
-    t_nrnb            nrnb;
-    t_commrec         cr;
-    std::vector<real> lambdaBuffer;
-};
-
-} // namespace nblib
-
-#endif // NBLIB_LISTEDFORCES_GMXCALCULATOR_H
index 4415e9a6ca423027baddc51a008dd2800f94a2e1..b5e89ba4aa9126b843dfa2f5503209c0d3c13823 100644 (file)
@@ -51,7 +51,9 @@
 
 #include "nblib/pbc.hpp"
 #include "definitions.h"
-#include "nblib/util/internal.h"
+#include "nblib/util/util.hpp"
+
+#define NBLIB_ALWAYS_INLINE __attribute((always_inline))
 
 namespace nblib
 {
@@ -191,4 +193,6 @@ std::vector<ListedInteractionData> splitListedWork(const ListedInteractionData&
 
 } // namespace nblib
 
+#undef NBLIB_ALWAYS_INLINE
+
 #endif // NBLIB_LISTEDFORCSES_HELPERS_HPP
index 425820bb10dbd33ea344332451b7b4acdaff5961..94b6b4c33c601f6a81277833fe23e067badcdd79 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -396,7 +396,7 @@ inline auto bondKernel(T dr, const HalfAttractiveQuarticBondType& bond)
 //! Three-center interaction type dispatch
 
 template <class T>
-inline auto threeCenterKernel(T dr, const DefaultAngle& angle)
+inline auto threeCenterKernel(T dr, const HarmonicAngleType& angle)
 {
     return harmonicScalarForce(angle.forceConstant(), angle.equilDistance(), dr);
 }
index af67386835331497efd306725b4743351cd97c22..c7e1dc2de1d0e59eaf592e19b48659b1706acda8 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2020, by the GROMACS development team, led by
+# Copyright (c) 2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
index 31ddb4de4fe8864493e67a95648b5954c70a263e..c26fb10acb05c4f436858e8f650a1155bcf9b006 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -42,7 +42,7 @@
  * \author Sebastian Keller <keller@cscs.ch>
  */
 #include "nblib/listed_forces/bondtypes.h"
-#include "nblib/util/internal.h"
+#include "nblib/util/util.hpp"
 
 #include "testutils/testasserts.h"
 
@@ -53,9 +53,8 @@ namespace test_detail
 {
 
 template<class B>
-void testTwoParameterBondEquality(const B& deduceType)
+void testTwoParameterBondEquality([[maybe_unused]] const B& deduceType)
 {
-    ignore_unused(deduceType);
     B a(1, 2);
     B b(1, 2);
     EXPECT_TRUE(a == b);
@@ -65,9 +64,8 @@ void testTwoParameterBondEquality(const B& deduceType)
 }
 
 template<class B>
-void testThreeParameterBondEquality(const B& deduceType)
+void testThreeParameterBondEquality([[maybe_unused]] const B& deduceType)
 {
-    ignore_unused(deduceType);
     B a(1, 2, 3);
     B b(1, 2, 3);
     EXPECT_TRUE(a == b);
@@ -77,9 +75,8 @@ void testThreeParameterBondEquality(const B& deduceType)
 }
 
 template<class B>
-void testTwoParameterBondLessThan(const B& deduceType)
+void testTwoParameterBondLessThan([[maybe_unused]] const B& deduceType)
 {
-    ignore_unused(deduceType);
     B a(1, 2);
     B b(1, 3);
     EXPECT_TRUE(a < b);
@@ -96,9 +93,8 @@ void testTwoParameterBondLessThan(const B& deduceType)
 }
 
 template<class B>
-void testThreeParameterBondLessThan(const B& deduceType)
+void testThreeParameterBondLessThan([[maybe_unused]] const B& deduceType)
 {
-    ignore_unused(deduceType);
     B a(1, 2, 1);
     B b(1, 3, 1);
     EXPECT_TRUE(a < b);
index b1876581b8515167c2efca386ac40ee45b9584f2..fe0c107cd5ff3b372ad6aef7ce783df312f13487 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -104,46 +104,20 @@ protected:
         // one bond between atoms 0-1 with bond1 parameters and another between atoms 1-2 with bond2 parameters
         std::vector<InteractionIndex<HarmonicBondType>> bondIndices{ { 0, 1, 0 }, { 1, 2, 1 } };
 
-        DefaultAngle                                angle(Degrees(108.53), 397.5);
-        std::vector<DefaultAngle>                   angles{ angle };
-        std::vector<InteractionIndex<DefaultAngle>> angleIndices{ { 0, 1, 2, 0 } };
+        HarmonicAngleType                                angle(Degrees(108.53), 397.5);
+        std::vector<HarmonicAngleType>                   angles{ angle };
+        std::vector<InteractionIndex<HarmonicAngleType>> angleIndices{ { 0, 1, 2, 0 } };
 
         pickType<HarmonicBondType>(interactions).indices    = bondIndices;
         pickType<HarmonicBondType>(interactions).parameters = bonds;
 
-        pickType<DefaultAngle>(interactions).indices    = angleIndices;
-        pickType<DefaultAngle>(interactions).parameters = angles;
+        pickType<HarmonicAngleType>(interactions).indices    = angleIndices;
+        pickType<HarmonicAngleType>(interactions).parameters = angles;
 
         // initial position for the methanol atoms from the spc-water example
         x = std::vector<gmx::RVec>{ { 1.97, 1.46, 1.209 }, { 1.978, 1.415, 1.082 }, { 1.905, 1.46, 1.03 } };
         forces = std::vector<gmx::RVec>(3, gmx::RVec{ 0, 0, 0 });
 
-        refBondForcesFloat =
-                std::valarray<gmx::BasicVector<float>>{ { -22.8980637, 128.801575, 363.505951 },
-                                                        { -43.2698593, -88.0130997, -410.639252 },
-                                                        { 66.167923, -40.788475, 47.1333084 } };
-        refAngleForcesFloat =
-                std::valarray<gmx::BasicVector<float>>{ { 54.7276611, -40.1688995, 17.6805191 },
-                                                        { -81.8118973, 86.1988525, 60.1752243 },
-                                                        { 27.0842342, -46.0299492, -77.8557434 } };
-
-        refBondForcesDouble = std::valarray<gmx::BasicVector<double>>{
-            { -22.89764839974935, 128.79927224858977, 363.50016834602064 },
-            { -43.24622441913251, -88.025652017772231, -410.61635172385434 },
-            { 66.14387281888186, -40.773620230817542, 47.116183377833721 }
-        };
-        refAngleForcesDouble = std::valarray<gmx::BasicVector<double>>{
-            { 54.726206806506234, -40.167809526198099, 17.680008528590257 },
-            { -81.809781666748606, 86.196545126117257, 60.173723525141448 },
-            { 27.083574860242372, -46.028735599919159, -77.853732053731704 }
-        };
-
-        refBondEnergyFloat  = 0.2113433;
-        refAngleEnergyFloat = 0.112774156;
-
-        refBondEnergyDouble  = 0.2113273434867636;
-        refAngleEnergyDouble = 0.11276812148357591;
-
         box.reset(new Box(3, 3, 3));
         pbc.reset(new PbcHolder(*box));
     }
@@ -155,54 +129,53 @@ protected:
 
     std::shared_ptr<Box>       box;
     std::shared_ptr<PbcHolder> pbc;
+};
 
-    // reference values
-    std::valarray<gmx::BasicVector<float>>  refBondForcesFloat, refAngleForcesFloat;
-    std::valarray<gmx::BasicVector<double>> refBondForcesDouble, refAngleForcesDouble;
+TEST_F(ListedExampleData, ComputeHarmonicBondForces)
+{
+    auto indices = pickType<HarmonicBondType>(interactions).indices;
+    auto bonds   = pickType<HarmonicBondType>(interactions).parameters;
+    computeForces(indices, bonds, x, &forces, *pbc);
 
-    float  refBondEnergyFloat, refAngleEnergyFloat;
-    double refBondEnergyDouble, refAngleEnergyDouble;
-};
+    Vector3DTest vector3DTest(1e-3);
+    vector3DTest.testVectors(forces, "Bond forces");
+}
 
-TEST_F(ListedExampleData, DISABLED_ComputeHarmonicBondForces)
+TEST_F(ListedExampleData, ComputeHarmonicBondEnergies)
 {
     auto indices = pickType<HarmonicBondType>(interactions).indices;
     auto bonds   = pickType<HarmonicBondType>(interactions).parameters;
     real energy  = computeForces(indices, bonds, x, &forces, *pbc);
 
-    EXPECT_FLOAT_DOUBLE_EQ_TOL(energy,
-                               refBondEnergyFloat,
-                               refBondEnergyDouble,
-                               gmx::test::relativeToleranceAsFloatingPoint(refBondEnergyDouble, 1e-5));
-
-    compareVectors(forces, refBondForcesFloat, refBondForcesDouble);
+    Vector3DTest vector3DTest(1e-4);
+    vector3DTest.testReal(energy, "Bond energy");
 }
 
 TEST_F(ListedExampleData, ComputeHarmonicAngleForces)
 {
-    auto indices = pickType<DefaultAngle>(interactions).indices;
-    auto angles  = pickType<DefaultAngle>(interactions).parameters;
-    real energy  = computeForces(indices, angles, x, &forces, *pbc);
+    auto indices = pickType<HarmonicAngleType>(interactions).indices;
+    auto angles  = pickType<HarmonicAngleType>(interactions).parameters;
+    computeForces(indices, angles, x, &forces, *pbc);
+
+    Vector3DTest vector3DTest(1e-4);
+    vector3DTest.testVectors(forces, "Angle forces");
+}
 
-    EXPECT_FLOAT_DOUBLE_EQ_TOL(energy,
-                               refAngleEnergyFloat,
-                               refAngleEnergyDouble,
-                               gmx::test::relativeToleranceAsFloatingPoint(refAngleEnergyDouble, 1e-5));
+TEST_F(ListedExampleData, CanReduceForces)
+{
+    reduceListedForces(interactions, x, &forces, *pbc);
 
-    compareVectors(forces, refAngleForcesFloat, refAngleForcesDouble);
+    Vector3DTest vector3DTest(1e-2);
+    vector3DTest.testVectors(forces, "Reduced forces");
 }
 
-TEST_F(ListedExampleData, DISABLED_CanReduceForces)
+TEST_F(ListedExampleData, CanReduceEnergies)
 {
     auto energies    = reduceListedForces(interactions, x, &forces, *pbc);
     real totalEnergy = std::accumulate(begin(energies), end(energies), 0.0);
 
-    EXPECT_FLOAT_DOUBLE_EQ_TOL(totalEnergy,
-                               refBondEnergyFloat + refAngleEnergyFloat,
-                               refBondEnergyDouble + refAngleEnergyDouble,
-                               gmx::test::relativeToleranceAsFloatingPoint(refBondEnergyDouble, 1e-5));
-
-    compareVectors(forces, refBondForcesFloat + refAngleForcesFloat, refBondForcesDouble + refAngleForcesDouble);
+    Vector3DTest vector3DTest(1e-4);
+    vector3DTest.testReal(totalEnergy, "Reduced energy");
 }
 
 
index 71f8e3d07750dff6c502147cd81d358b3f28bcef..b7356059af86925a7b6a8f47bfc55c252f348e93 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -65,16 +65,16 @@ ListedInteractionData someBondsAndAngles()
     std::vector<HarmonicBondType> bonds{ bond1, bond2 };
     pickType<HarmonicBondType>(interactions).parameters = bonds;
 
-    DefaultAngle              angle1(Degrees(100), 100);
-    DefaultAngle              angle2(Degrees(101), 200);
-    std::vector<DefaultAngle> angles{ angle1, angle2 };
-    pickType<DefaultAngle>(interactions).parameters = angles;
+    HarmonicAngleType              angle1(Degrees(100), 100);
+    HarmonicAngleType              angle2(Degrees(101), 200);
+    std::vector<HarmonicAngleType> angles{ angle1, angle2 };
+    pickType<HarmonicAngleType>(interactions).parameters = angles;
 
     std::vector<InteractionIndex<HarmonicBondType>> bondIndices{ { 0, 1, 0 }, { 1, 2, 0 }, { 2, 3, 1 } };
     pickType<HarmonicBondType>(interactions).indices = std::move(bondIndices);
 
-    std::vector<InteractionIndex<DefaultAngle>> angleIndices{ { 0, 1, 2, 0 }, { 1, 2, 3, 1 } };
-    pickType<DefaultAngle>(interactions).indices = std::move(angleIndices);
+    std::vector<InteractionIndex<HarmonicAngleType>> angleIndices{ { 0, 1, 2, 0 }, { 1, 2, 3, 1 } };
+    pickType<HarmonicAngleType>(interactions).indices = std::move(angleIndices);
 
     return interactions;
 }
@@ -89,7 +89,7 @@ TEST(ListedShims, ParameterConversion)
     EXPECT_EQ(gmx_params->iparams[0].harmonic.rA,
               pickType<HarmonicBondType>(interactions).parameters[0].equilDistance());
     EXPECT_REAL_EQ_TOL(gmx_params->iparams[2].harmonic.rA,
-                       pickType<DefaultAngle>(interactions).parameters[0].equilDistance() / DEG2RAD,
+                       pickType<HarmonicAngleType>(interactions).parameters[0].equilDistance() / DEG2RAD,
                        gmx::test::defaultRealTolerance());
 
     EXPECT_EQ(idef->il[F_BONDS].iatoms.size(), 9);
index 47236951d838adb1feed0172f6d45b9e48f28ecd..87f16ff9f04e1848067021646d36dc8263e53e42 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -62,8 +62,8 @@ TEST(NBlibTest, CanSplitListedWork)
 {
     ListedInteractionData interactions;
 
-    DefaultAngle     angle(Degrees(1), 1);
-    HarmonicBondType bond(1, 1);
+    HarmonicAngleType angle(Degrees(1), 1);
+    HarmonicBondType  bond(1, 1);
 
     int largestIndex = 20;
     int nSplits      = 3; // split ranges: [0,5], [6,11], [12, 19]
@@ -71,30 +71,30 @@ TEST(NBlibTest, CanSplitListedWork)
     std::vector<InteractionIndex<HarmonicBondType>> bondIndices{
         { 0, 1, 0 }, { 0, 6, 0 }, { 11, 12, 0 }, { 18, 19, 0 }
     };
-    std::vector<InteractionIndex<DefaultAngle>> angleIndices{
+    std::vector<InteractionIndex<HarmonicAngleType>> angleIndices{
         { 0, 1, 2, 0 }, { 0, 6, 7, 0 }, { 11, 12, 13, 0 }, { 17, 19, 18, 0 }
     };
 
-    pickType<HarmonicBondType>(interactions).indices = bondIndices;
-    pickType<DefaultAngle>(interactions).indices     = angleIndices;
+    pickType<HarmonicBondType>(interactions).indices  = bondIndices;
+    pickType<HarmonicAngleType>(interactions).indices = angleIndices;
 
     std::vector<ListedInteractionData> splitInteractions =
             splitListedWork(interactions, largestIndex, nSplits);
 
     std::vector<InteractionIndex<HarmonicBondType>> refBondIndices0{ { 0, 1, 0 }, { 0, 6, 0 } };
-    std::vector<InteractionIndex<DefaultAngle>> refAngleIndices0{ { 0, 1, 2, 0 }, { 0, 6, 7, 0 } };
-    std::vector<InteractionIndex<HarmonicBondType>> refBondIndices1{ { 11, 12, 0 } };
-    std::vector<InteractionIndex<DefaultAngle>>     refAngleIndices1{ { 11, 12, 13, 0 } };
-    std::vector<InteractionIndex<HarmonicBondType>> refBondIndices2{ { 18, 19, 0 } };
-    std::vector<InteractionIndex<DefaultAngle>>     refAngleIndices2{ { 17, 19, 18, 0 } };
+    std::vector<InteractionIndex<HarmonicAngleType>> refAngleIndices0{ { 0, 1, 2, 0 }, { 0, 6, 7, 0 } };
+    std::vector<InteractionIndex<HarmonicBondType>>  refBondIndices1{ { 11, 12, 0 } };
+    std::vector<InteractionIndex<HarmonicAngleType>> refAngleIndices1{ { 11, 12, 13, 0 } };
+    std::vector<InteractionIndex<HarmonicBondType>>  refBondIndices2{ { 18, 19, 0 } };
+    std::vector<InteractionIndex<HarmonicAngleType>> refAngleIndices2{ { 17, 19, 18, 0 } };
 
     EXPECT_EQ(refBondIndices0, pickType<HarmonicBondType>(splitInteractions[0]).indices);
     EXPECT_EQ(refBondIndices1, pickType<HarmonicBondType>(splitInteractions[1]).indices);
     EXPECT_EQ(refBondIndices2, pickType<HarmonicBondType>(splitInteractions[2]).indices);
 
-    EXPECT_EQ(refAngleIndices0, pickType<DefaultAngle>(splitInteractions[0]).indices);
-    EXPECT_EQ(refAngleIndices1, pickType<DefaultAngle>(splitInteractions[1]).indices);
-    EXPECT_EQ(refAngleIndices2, pickType<DefaultAngle>(splitInteractions[2]).indices);
+    EXPECT_EQ(refAngleIndices0, pickType<HarmonicAngleType>(splitInteractions[0]).indices);
+    EXPECT_EQ(refAngleIndices1, pickType<HarmonicAngleType>(splitInteractions[1]).indices);
+    EXPECT_EQ(refAngleIndices2, pickType<HarmonicAngleType>(splitInteractions[2]).indices);
 }
 
 
index 211d4edd23fa5020b3cfc9d595b96f506c744907..e00aaeb18977a3f350442a79caf3ba183639fd90 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -63,9 +63,9 @@ public:
         std::vector<HarmonicBondType> bonds{ bond1, bond2 };
         pickType<HarmonicBondType>(interactions).parameters = bonds;
 
-        DefaultAngle              angle(Degrees(179.9), 397.5);
-        std::vector<DefaultAngle> angles{ angle };
-        pickType<DefaultAngle>(interactions).parameters = angles;
+        HarmonicAngleType              angle(Degrees(179.9), 397.5);
+        std::vector<HarmonicAngleType> angles{ angle };
+        pickType<HarmonicAngleType>(interactions).parameters = angles;
 
         std::vector<InteractionIndex<HarmonicBondType>> bondIndices;
         for (int i = 0; i < nParticles - 1; ++i)
@@ -75,12 +75,12 @@ public:
         }
         pickType<HarmonicBondType>(interactions).indices = bondIndices;
 
-        std::vector<InteractionIndex<DefaultAngle>> angleIndices;
+        std::vector<InteractionIndex<HarmonicAngleType>> angleIndices;
         for (int i = 0; i < nParticles - 2; ++i)
         {
-            angleIndices.push_back(InteractionIndex<DefaultAngle>{ i, i + 1, i + 2, 0 });
+            angleIndices.push_back(InteractionIndex<HarmonicAngleType>{ i, i + 1, i + 2, 0 });
         }
-        pickType<DefaultAngle>(interactions).indices = angleIndices;
+        pickType<HarmonicAngleType>(interactions).indices = angleIndices;
 
         // initialize coordinates
         x.resize(nParticles);
diff --git a/api/nblib/listed_forces/tests/refdata/ListedExampleData_CanReduceEnergies.xml b/api/nblib/listed_forces/tests/refdata/ListedExampleData_CanReduceEnergies.xml
new file mode 100644 (file)
index 0000000..0880b95
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Reduced energy">0.32409546497033953</Real>
+</ReferenceData>
diff --git a/api/nblib/listed_forces/tests/refdata/ListedExampleData_CanReduceForces.xml b/api/nblib/listed_forces/tests/refdata/ListedExampleData_CanReduceForces.xml
new file mode 100644 (file)
index 0000000..747d136
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Sequence Name="Reduced forces">
+    <Int Name="Length">3</Int>
+    <Vector>
+      <Real Name="X">31.828558406756891</Real>
+      <Real Name="Y">88.63146272239166</Real>
+      <Real Name="Z">381.18017687461088</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-125.05600608588114</Real>
+      <Real Name="Y">-1.8291068916549733</Real>
+      <Real Name="Z">-350.44262819871295</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">93.227447679124239</Real>
+      <Real Name="Y">-86.802355830736701</Real>
+      <Real Name="Z">-30.737548675897969</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicAngleEnergies.xml b/api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicAngleEnergies.xml
new file mode 100644 (file)
index 0000000..00d7f10
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Angle energy">0.11276812148357591</Real>
+</ReferenceData>
diff --git a/api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicAngleForces.xml b/api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicAngleForces.xml
new file mode 100644 (file)
index 0000000..242982b
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Sequence Name="Angle forces">
+    <Int Name="Length">3</Int>
+    <Vector>
+      <Real Name="X">54.726206806506241</Real>
+      <Real Name="Y">-40.167809526198106</Real>
+      <Real Name="Z">17.680008528590246</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-81.80978166674862</Real>
+      <Real Name="Y">86.196545126117257</Real>
+      <Real Name="Z">60.17372352514144</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">27.083574860242376</Real>
+      <Real Name="Y">-46.028735599919159</Real>
+      <Real Name="Z">-77.85373205373169</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicBondEnergies.xml b/api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicBondEnergies.xml
new file mode 100644 (file)
index 0000000..286b797
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Bond energy">0.2113273434867636</Real>
+</ReferenceData>
diff --git a/api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicBondForces.xml b/api/nblib/listed_forces/tests/refdata/ListedExampleData_ComputeHarmonicBondForces.xml
new file mode 100644 (file)
index 0000000..f4397ed
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Sequence Name="Bond forces">
+    <Int Name="Length">3</Int>
+    <Vector>
+      <Real Name="X">-22.89764839974935</Real>
+      <Real Name="Y">128.79927224858977</Real>
+      <Real Name="Z">363.50016834602064</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-43.24622441913251</Real>
+      <Real Name="Y">-88.025652017772231</Real>
+      <Real Name="Z">-410.61635172385439</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">66.14387281888186</Real>
+      <Real Name="Y">-40.773620230817542</Real>
+      <Real Name="Z">47.116183377833721</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/api/nblib/listed_forces/tests/refdata/ThreeCenter_HarmonicAngleTest_CheckListed_0.xml b/api/nblib/listed_forces/tests/refdata/ThreeCenter_HarmonicAngleTest_CheckListed_0.xml
new file mode 100644 (file)
index 0000000..481f108
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot">81.030065901054726</Real>
+  <Sequence Name="forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">-423.84271406807136</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-454.72140088886073</Real>
+      <Real Name="Y">300.68270098347142</Real>
+      <Real Name="Z">-43.928205747849688</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">902.57551052358986</Real>
+      <Real Name="Y">-450.30370960820733</Real>
+      <Real Name="Z">-107.1334866108858</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-24.011395566657725</Real>
+      <Real Name="Y">149.62100862473594</Real>
+      <Real Name="Z">151.06169235873548</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/api/nblib/listed_forces/tests/refdata/ThreeCenter_HarmonicAngleTest_CheckListed_1.xml b/api/nblib/listed_forces/tests/refdata/ThreeCenter_HarmonicAngleTest_CheckListed_1.xml
new file mode 100644 (file)
index 0000000..cfb0bd3
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot">18.6578169619359</Real>
+  <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>
diff --git a/api/nblib/listed_forces/tests/refdata/ThreeCenter_HarmonicAngleTest_CheckListed_2.xml b/api/nblib/listed_forces/tests/refdata/ThreeCenter_HarmonicAngleTest_CheckListed_2.xml
new file mode 100644 (file)
index 0000000..d8c004a
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot">47.631231917431272</Real>
+  <Sequence Name="forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">76.147849407575848</Real>
+      <Real Name="Y">-121.56004451516645</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-231.09578724977212</Real>
+      <Real Name="Y">-199.44223930127094</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-81.648145884981531</Real>
+      <Real Name="Y">121.42857015903797</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>
diff --git a/api/nblib/listed_forces/tests/refdata/TwoCenter_HarmonicBondTest_CheckListed_0.xml b/api/nblib/listed_forces/tests/refdata/TwoCenter_HarmonicBondTest_CheckListed_0.xml
new file mode 100644 (file)
index 0000000..ea5f886
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot">1.2647374845299071</Real>
+  <Sequence Name="forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">25.000000000000007</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-1.2453212707919168</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-0.093574584161668639</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">1.4244418639838603</Real>
+      <Real Name="Y">-2.9853432198657242</Real>
+      <Real Name="Z">-21.921082195972616</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-0.17912059319194343</Real>
+      <Real Name="Y">2.9853432198657242</Real>
+      <Real Name="Z">-2.9853432198657242</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/api/nblib/listed_forces/tests/refdata/TwoCenter_HarmonicBondTest_CheckListed_1.xml b/api/nblib/listed_forces/tests/refdata/TwoCenter_HarmonicBondTest_CheckListed_1.xml
new file mode 100644 (file)
index 0000000..a789259
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot">1.0503787975412509</Real>
+  <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">-18.033008588991056</Real>
+      <Real Name="Z">-18.033008588991056</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-1.9669914110089479</Real>
+      <Real Name="Z">18.033008588991056</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">20.000000000000004</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/api/nblib/listed_forces/tests/refdata/TwoCenter_HarmonicBondTest_CheckListed_2.xml b/api/nblib/listed_forces/tests/refdata/TwoCenter_HarmonicBondTest_CheckListed_2.xml
new file mode 100644 (file)
index 0000000..c693110
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot">1.1669629125344443</Real>
+  <Sequence Name="forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">-6.4092274795074138</Real>
+      <Real Name="Y">-4.0148791560168924</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-1.8836841799828106</Real>
+      <Real Name="Y">8.0178711131716671</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-12.349444340306063</Real>
+      <Real Name="Y">20.46867066289358</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">20.642355999796287</Real>
+      <Real Name="Y">-24.471662620048356</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
index 1e02da05f2502f1dc9c575b3e307cbb0bff4ea19..31aa3455873673325d0a94a78024c765e820e0a3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -65,8 +65,8 @@ ListedInteractionData unsortedInteractions()
     std::vector<InteractionIndex<HarmonicBondType>> bondIndices{ { 0, 2, 0 }, { 0, 1, 0 } };
     pickType<HarmonicBondType>(interactions).indices = std::move(bondIndices);
 
-    std::vector<InteractionIndex<DefaultAngle>> angleIndices{ { 0, 1, 2, 0 }, { 1, 0, 2, 0 } };
-    pickType<DefaultAngle>(interactions).indices = std::move(angleIndices);
+    std::vector<InteractionIndex<HarmonicAngleType>> angleIndices{ { 0, 1, 2, 0 }, { 1, 0, 2, 0 } };
+    pickType<HarmonicAngleType>(interactions).indices = std::move(angleIndices);
 
     std::vector<InteractionIndex<ProperDihedral>> dihedralIndices{ { 0, 2, 1, 3, 0 }, { 0, 1, 2, 3, 0 } };
     pickType<ProperDihedral>(interactions).indices = std::move(dihedralIndices);
@@ -80,12 +80,12 @@ TEST(ListedTransformations, SortInteractionIndices)
     sortInteractions(interactions);
 
     std::vector<InteractionIndex<HarmonicBondType>> refBondIndices{ { 0, 1, 0 }, { 0, 2, 0 } };
-    std::vector<InteractionIndex<DefaultAngle>>   refAngleIndices{ { 1, 0, 2, 0 }, { 0, 1, 2, 0 } };
-    std::vector<InteractionIndex<ProperDihedral>> refDihedralIndices{ { 0, 1, 2, 3, 0 },
+    std::vector<InteractionIndex<HarmonicAngleType>> refAngleIndices{ { 1, 0, 2, 0 }, { 0, 1, 2, 0 } };
+    std::vector<InteractionIndex<ProperDihedral>>    refDihedralIndices{ { 0, 1, 2, 3, 0 },
                                                                       { 0, 2, 1, 3, 0 } };
 
     EXPECT_EQ(pickType<HarmonicBondType>(interactions).indices, refBondIndices);
-    EXPECT_EQ(pickType<DefaultAngle>(interactions).indices, refAngleIndices);
+    EXPECT_EQ(pickType<HarmonicAngleType>(interactions).indices, refAngleIndices);
     EXPECT_EQ(pickType<ProperDihedral>(interactions).indices, refDihedralIndices);
 }
 
index 75a094b94832145b3b510980387b4b4db8effadb..cbca8eb3ed66c0ca54d0236013d3f5e79572adc0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -58,6 +58,14 @@ std::vector<std::vector<gmx::RVec>> c_coordinatesForTests = {
     { { 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 } }
 };
+// Parameters for harmonic bonds
+std::vector<InteractionIndex<HarmonicBondType>> c_HarmonicBondIndices{ { 0, 1, 0 }, { 1, 2, 0 }, { 2, 3, 0 } };
+std::vector<std::vector<HarmonicBondType>> c_InputHarmonicBond = { { HarmonicBondType(500, 0.15) } };
+
+// Parameters for harmonic angles
+std::vector<InteractionIndex<HarmonicAngleType>> c_HarmonicAngleIndices{ { 0, 1, 2, 0 }, { 1, 2, 3, 0 } };
+std::vector<std::vector<HarmonicAngleType>> c_InputHarmonicAngle = { { HarmonicAngleType(Degrees(100),
+                                                                                         50.0) } };
 
 //! Function types for testing dihedrals. Add new terms at the end.
 std::vector<std::vector<ProperDihedral>> c_InputDihs = { { { ProperDihedral(Degrees(-105.0), 15.0, 2) } } /*, { ImproperDihedral(100.0, 50.0) }*/ };
@@ -92,32 +100,94 @@ public:
 
     void checkForcesAndEnergies()
     {
+        // We need quite specific tolerances here since angle functions
+        // etc. are not very precise and reproducible.
+        auto tolerances = gmx::test::FloatingPointTolerance(
+                singleAbsoluteTolerance_, 1.0e-12, singleRelativeTolerance_, 1.0e-12, 1000, 100, false);
+        checker_.setDefaultTolerance(tolerances);
         checker_.checkReal(energy_, "Epot");
         checker_.checkSequence(std::begin(forces_), std::end(forces_), "forces");
     }
+
+    void setSingleTolerance(float relative, float absolute)
+    {
+        singleRelativeTolerance_ = relative;
+        singleAbsoluteTolerance_ = absolute;
+    }
+
+private:
+    float singleRelativeTolerance_ = 1.0e-12;
+    float singleAbsoluteTolerance_ = 1.0e-12;
 };
 
-class ListedForcesProperDihedralTest :
+class ProperDihedralTest :
     public ListedForcesBase<ProperDihedral>,
     public testing::TestWithParam<std::tuple<std::vector<ProperDihedral>, std::vector<gmx::RVec>>>
 {
     using Base = ListedForcesBase<ProperDihedral>;
 
 public:
-    ListedForcesProperDihedralTest() :
+    ProperDihedralTest() :
         Base(std::get<0>(GetParam()), std::get<1>(GetParam()), { { 0, 1, 2, 3, 0 } })
     {
     }
 };
 
-TEST_P(ListedForcesProperDihedralTest, CheckListed)
+TEST_P(ProperDihedralTest, CheckListed)
 {
     checkForcesAndEnergies();
 }
 
 INSTANTIATE_TEST_CASE_P(FourCenter,
-                        ListedForcesProperDihedralTest,
+                        ProperDihedralTest,
                         ::testing::Combine(::testing::ValuesIn(c_InputDihs),
                                            ::testing::ValuesIn(c_coordinatesForTests)));
 
+class HarmonicBondTest :
+    public ListedForcesBase<HarmonicBondType>,
+    public testing::TestWithParam<std::tuple<std::vector<HarmonicBondType>, std::vector<gmx::RVec>>>
+{
+    using Base = ListedForcesBase<HarmonicBondType>;
+
+public:
+    HarmonicBondTest() :
+        Base(std::get<0>(GetParam()), std::get<1>(GetParam()), c_HarmonicBondIndices)
+    {
+    }
+};
+
+TEST_P(HarmonicBondTest, CheckListed)
+{
+    checkForcesAndEnergies();
+}
+
+INSTANTIATE_TEST_CASE_P(TwoCenter,
+                        HarmonicBondTest,
+                        ::testing::Combine(::testing::ValuesIn(c_InputHarmonicBond),
+                                           ::testing::ValuesIn(c_coordinatesForTests)));
+
+class HarmonicAngleTest :
+    public ListedForcesBase<HarmonicAngleType>,
+    public testing::TestWithParam<std::tuple<std::vector<HarmonicAngleType>, std::vector<gmx::RVec>>>
+{
+    using Base = ListedForcesBase<HarmonicAngleType>;
+
+public:
+    HarmonicAngleTest() :
+        Base(std::get<0>(GetParam()), std::get<1>(GetParam()), c_HarmonicAngleIndices)
+    {
+    }
+};
+
+TEST_P(HarmonicAngleTest, CheckListed)
+{
+    setSingleTolerance(1e-12, 2e-3);
+    checkForcesAndEnergies();
+}
+
+INSTANTIATE_TEST_CASE_P(ThreeCenter,
+                        HarmonicAngleTest,
+                        ::testing::Combine(::testing::ValuesIn(c_InputHarmonicAngle),
+                                           ::testing::ValuesIn(c_coordinatesForTests)));
+
 } // namespace nblib
index 82cfd4a2bbcf912775983e680a99417ad8b4f9dc..b0f4632f8d5103d438c8a29f3fc6133532a4050b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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 <numeric>
 
-#include "nblib/util/internal.h"
 #include "bondtypes.h"
 #include "definitions.h"
 
 namespace nblib
 {
 
-namespace detail
-{
-
-template<class InteractionType, class = void>
-struct CoordinateIndex_
-{
-};
-
-template<class InteractionType>
-struct CoordinateIndex_<InteractionType, std::enable_if_t<Contains<InteractionType, SupportedTwoCenterTypes>{}>>
-{
-    typedef std::array<int, 2> type;
-};
-
-template<class InteractionType>
-struct CoordinateIndex_<InteractionType, std::enable_if_t<Contains<InteractionType, SupportedThreeCenterTypes>{}>>
-{
-    typedef std::array<int, 3> type;
-};
-
-template<class InteractionType>
-struct CoordinateIndex_<InteractionType, std::enable_if_t<Contains<InteractionType, SupportedFourCenterTypes>{}>>
-{
-    typedef std::array<int, 4> type;
-};
-
-template<class InteractionType>
-struct CoordinateIndex_<InteractionType, std::enable_if_t<Contains<InteractionType, SupportedFiveCenterTypes>{}>>
-{
-    typedef std::array<int, 5> type;
-};
-
-} // namespace detail
-
-/*! \brief traits class to determine the coordinate index type for InteractionType
- *  \internal
- *
- * \tparam InteractionCategory
- */
-template<class InteractionType>
-using CoordinateIndex = typename detail::CoordinateIndex_<InteractionType>::type;
-
-
-namespace detail
-{
-
-template<class InteractionType, class = void>
-struct InteractionIndex_
-{
-};
-
-template<class InteractionType>
-struct InteractionIndex_<InteractionType, std::enable_if_t<Contains<InteractionType, SupportedTwoCenterTypes>{}>>
-{
-    typedef TwoCenterInteractionIndex type;
-};
-
-template<class InteractionType>
-struct InteractionIndex_<InteractionType, std::enable_if_t<Contains<InteractionType, SupportedThreeCenterTypes>{}>>
-{
-    typedef ThreeCenterInteractionIndex type;
-};
-
-template<class InteractionType>
-struct InteractionIndex_<InteractionType, std::enable_if_t<Contains<InteractionType, SupportedFourCenterTypes>{}>>
-{
-    typedef FourCenterInteractionIndex type;
-};
-
-template<class InteractionType>
-struct InteractionIndex_<InteractionType, std::enable_if_t<Contains<InteractionType, SupportedFiveCenterTypes>{}>>
-{
-    typedef FiveCenterInteractionIndex type;
-};
-
-} // namespace detail
-
-/*! \brief traits class to determine the InteractionIndex type for InteractionType
- *  \internal
- *
- * \tparam InteractionType
- */
-template<class InteractionType>
-using InteractionIndex = typename detail::InteractionIndex_<InteractionType>::type;
-
-
 template<class I, class = void>
 struct HasTwoCenterAggregate : std::false_type
 {
index fc039575937f7c186ed2ac34cde3157e1ea3f67c..f6e92ac86864b7fb1b149e01c0601d24c2cda6ca 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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 "nblib/listed_forces/transformations.h"
 
-#include "nblib/util/internal.h"
+#include "nblib/util/util.hpp"
 
 namespace nblib
 {
 
 void sortInteractions(ListedInteractionData& interactions)
 {
-    auto sortKeyObj = [](const auto& lhs, const auto& rhs) { return interactionSortKey(lhs, rhs); };
-    auto sortOneElement = [comparison = sortKeyObj](auto& interactionElement) {
-        std::sort(begin(interactionElement.indices), end(interactionElement.indices), comparison);
+    auto sortOneElement = [](auto& interactionElement) {
+        using InteractionContainerType = std::decay_t<decltype(interactionElement)>;
+        using InteractionType          = typename InteractionContainerType::type;
+
+        std::sort(begin(interactionElement.indices),
+                  end(interactionElement.indices),
+                  interactionSortKey<InteractionType>);
     };
 
     for_each_tuple(sortOneElement, interactions);
index ac1471d59cfd94765f7b97b458bd2e7ec58a58f4..dcc5ed86c36d9cd3003e9aa5293c9c70a560b077 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -112,13 +112,17 @@ inline std::array<int, 5> nblibOrdering(const std::array<int, 5>& t)
 } // namespace detail
 
 //! \brief sort key function object to sort 2-center interactions
-inline bool interactionSortKey(const TwoCenterInteractionIndex& lhs, const TwoCenterInteractionIndex& rhs)
+template<class Interaction>
+std::enable_if_t<Contains<Interaction, SupportedTwoCenterTypes>{}, bool>
+interactionSortKey(const InteractionIndex<Interaction>& lhs, const InteractionIndex<Interaction>& rhs)
 {
     return lhs < rhs;
 }
 
 //! \brief sort key function object to sort 3-center interactions
-inline bool interactionSortKey(const ThreeCenterInteractionIndex& lhs, const ThreeCenterInteractionIndex& rhs)
+template<class Interaction>
+std::enable_if_t<Contains<Interaction, SupportedThreeCenterTypes>{}, bool>
+interactionSortKey(const InteractionIndex<Interaction>& lhs, const InteractionIndex<Interaction>& rhs)
 {
     // position [1] is the center atom of the angle and is the only sort key
     // to allow use of std::equal_range to obtain a range of all angles with a given central atom
@@ -126,7 +130,9 @@ inline bool interactionSortKey(const ThreeCenterInteractionIndex& lhs, const Thr
 }
 
 //! \brief sort key function object to sort 4-center interactions
-inline bool interactionSortKey(const FourCenterInteractionIndex& lhs, const FourCenterInteractionIndex& rhs)
+template<class Interaction>
+std::enable_if_t<Contains<Interaction, SupportedFourCenterTypes>{}, bool>
+interactionSortKey(const InteractionIndex<Interaction>& lhs, const InteractionIndex<Interaction>& rhs)
 {
     // we only take the first center-axis-particle into account
     // this allows use of std::equal_range to find all four-center interactions with a given j-index
@@ -136,7 +142,10 @@ inline bool interactionSortKey(const FourCenterInteractionIndex& lhs, const Four
 }
 
 //! \brief sort key function object to sort 5-center interactions
-inline bool interactionSortKey(const FiveCenterInteractionIndex& lhs, const FiveCenterInteractionIndex& rhs)
+//! \brief sort key function object to sort 4-center interactions
+template<class Interaction>
+std::enable_if_t<Contains<Interaction, SupportedFiveCenterTypes>{}, bool>
+interactionSortKey(const InteractionIndex<Interaction>& lhs, const InteractionIndex<Interaction>& rhs)
 {
     return lhs < rhs;
 }
index 679d888cd160ac2a7026297bddada1db3522b07c..9b243bf6cdae5430f6a29b5b01a85e19a50ffbe5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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 "nblib/exception.h"
 #include "nblib/molecules.h"
 #include "nblib/particletype.h"
-#include "nblib/util/internal.h"
 
 namespace nblib
 {
 
-
 Molecule::Molecule(MoleculeName moleculeName) : name_(std::move(moleculeName)) {}
 
 MoleculeName Molecule::name() const
@@ -115,139 +113,135 @@ Molecule& Molecule::addParticle(const ParticleName& particleName, const Particle
     return *this;
 }
 
-//! Two-particle interactions such as bonds and LJ1-4
-template<class Interaction>
-void Molecule::addInteraction(const ParticleName& particleNameI,
-                              const ResidueName&  residueNameI,
-                              const ParticleName& particleNameJ,
-                              const ResidueName&  residueNameJ,
-                              const Interaction&  interaction)
+ResidueName Molecule::residueName(const ParticleIdentifier& particleIdentifier)
+{
+    return (particleIdentifier.residueName() == ResidueName{}) ? ResidueName(name_)
+                                                               : particleIdentifier.residueName();
+}
+
+template<class ListedVariant, class... ParticleIdentifiers>
+void Molecule::addInteractionImpl(const ListedVariant& interaction, const ParticleIdentifiers&... particles)
+{
+    auto storeInteraction = [&](const auto& interaction_) {
+        using Interaction = std::decay_t<decltype(interaction_)>;
+
+        auto& interactionContainer = pickType<Interaction>(interactionData_);
+        interactionContainer.interactions_.emplace_back(particles...);
+        interactionContainer.interactionTypes_.push_back(interaction_);
+    };
+
+    // add the interaction to the correct location in interactionData_
+    std::visit(storeInteraction, interaction);
+}
+
+void Molecule::addInteraction(const ParticleIdentifier&   particleI,
+                              const ParticleIdentifier&   particleJ,
+                              const TwoCenterInteraction& interaction)
 {
-    if (particleNameI == particleNameJ and residueNameI == residueNameJ)
+    if (particleI == particleJ)
     {
         throw InputException(std::string("Cannot add interaction of particle ")
-                             + particleNameI.value() + " with itself in molecule " + name_.value());
+                             + particleI.particleName().value() + " with itself in molecule "
+                             + name_.value());
     }
 
-    auto& interactionContainer = pickType<Interaction>(interactionData_);
-    interactionContainer.interactions_.emplace_back(particleNameI, residueNameI, particleNameJ, residueNameJ);
-    interactionContainer.interactionTypes_.push_back(interaction);
+    addInteractionImpl(interaction,
+                       particleI.particleName(),
+                       residueName(particleI),
+                       particleJ.particleName(),
+                       residueName(particleJ));
 }
 
-//! \cond DO_NOT_DOCUMENT
-#define ADD_INTERACTION_INSTANTIATE_TEMPLATE(x)                               \
-    template void Molecule::addInteraction(const ParticleName& particleNameI, \
-                                           const ResidueName&  residueNameI,  \
-                                           const ParticleName& particleNameJ, \
-                                           const ResidueName&  residueNameJ,  \
-                                           const x&            interaction);
-MAP(ADD_INTERACTION_INSTANTIATE_TEMPLATE, SUPPORTED_TWO_CENTER_TYPES)
-#undef ADD_INTERACTION_INSTANTIATE_TEMPLATE
-//! \endcond
-
-// add interactions with default residue name
-template<class Interaction>
-void Molecule::addInteraction(const ParticleName& particleNameI,
-                              const ParticleName& particleNameJ,
-                              const Interaction&  interaction)
+void Molecule::addInteraction(const ParticleIdentifier&     particleI,
+                              const ParticleIdentifier&     particleJ,
+                              const ParticleIdentifier&     particleK,
+                              const ThreeCenterInteraction& interaction)
 {
-    addInteraction(particleNameI, ResidueName(name_), particleNameJ, ResidueName(name_), interaction);
+    if (particleI == particleJ and particleJ == particleK)
+    {
+        throw InputException(std::string("Cannot add interaction of particle ")
+                             + particleI.particleName().value() + " with itself in molecule "
+                             + name_.value());
+    }
+
+    addInteractionImpl(interaction,
+                       particleI.particleName(),
+                       residueName(particleI),
+                       particleJ.particleName(),
+                       residueName(particleJ),
+                       particleK.particleName(),
+                       residueName(particleK));
 }
 
-//! \cond DO_NOT_DOCUMENT
-#define ADD_INTERACTION_INSTANTIATE_TEMPLATE(x) \
-    template void Molecule::addInteraction(     \
-            const ParticleName& particleNameI, const ParticleName& particleNameJ, const x& interaction);
-MAP(ADD_INTERACTION_INSTANTIATE_TEMPLATE, SUPPORTED_TWO_CENTER_TYPES)
-#undef ADD_INTERACTION_INSTANTIATE_TEMPLATE
-
-//! 3-particle interactions such as angles
-template<class Interaction>
-void Molecule::addInteraction(const ParticleName& particleNameI,
-                              const ResidueName&  residueNameI,
-                              const ParticleName& particleNameJ,
-                              const ResidueName&  residueNameJ,
-                              const ParticleName& particleNameK,
-                              const ResidueName&  residueNameK,
-                              const Interaction&  interaction)
+void Molecule::addInteraction(const ParticleIdentifier&    particleI,
+                              const ParticleIdentifier&    particleJ,
+                              const ParticleIdentifier&    particleK,
+                              const ParticleIdentifier&    particleL,
+                              const FourCenterInteraction& interaction)
 {
-    if (particleNameI == particleNameJ and particleNameJ == particleNameK)
+    if (particleI == particleJ and particleJ == particleK and particleK == particleL)
     {
         throw InputException(std::string("Cannot add interaction of particle ")
-                             + particleNameI.value() + " with itself in molecule " + name_.value());
+                             + particleI.particleName().value() + " with itself in molecule "
+                             + name_.value());
     }
 
-    auto& interactionContainer = pickType<Interaction>(interactionData_);
-    interactionContainer.interactions_.emplace_back(
-            particleNameI, residueNameI, particleNameJ, residueNameJ, particleNameK, residueNameK);
-    interactionContainer.interactionTypes_.push_back(interaction);
+    addInteractionImpl(interaction,
+                       particleI.particleName(),
+                       residueName(particleI),
+                       particleJ.particleName(),
+                       residueName(particleJ),
+                       particleK.particleName(),
+                       residueName(particleK),
+                       particleL.particleName(),
+                       residueName(particleL));
 }
 
-#define ADD_INTERACTION_INSTANTIATE_TEMPLATE(x)                               \
-    template void Molecule::addInteraction(const ParticleName& particleNameI, \
-                                           const ResidueName&  residueNameI,  \
-                                           const ParticleName& particleNameJ, \
-                                           const ResidueName&  residueNameJ,  \
-                                           const ParticleName& particleNameK, \
-                                           const ResidueName&  residueNameK,  \
-                                           const x&            interaction);
-MAP(ADD_INTERACTION_INSTANTIATE_TEMPLATE, SUPPORTED_THREE_CENTER_TYPES)
-#undef ADD_INTERACTION_INSTANTIATE_TEMPLATE
-
-template<class Interaction>
-void Molecule::addInteraction(const ParticleName& particleNameI,
-                              const ParticleName& particleNameJ,
-                              const ParticleName& particleNameK,
-                              const Interaction&  interaction)
+void Molecule::addInteraction(const ParticleIdentifier&    particleI,
+                              const ParticleIdentifier&    particleJ,
+                              const ParticleIdentifier&    particleK,
+                              const ParticleIdentifier&    particleL,
+                              const ParticleIdentifier&    particleM,
+                              const FiveCenterInteraction& interaction)
 {
-    addInteraction(particleNameI,
-                   ResidueName(name_),
-                   particleNameJ,
-                   ResidueName(name_),
-                   particleNameK,
-                   ResidueName(name_),
-                   interaction);
+    if (particleI == particleJ and particleJ == particleK and particleK == particleL and particleL == particleM)
+    {
+        throw InputException(std::string("Cannot add interaction of particle ")
+                             + particleI.particleName().value() + " with itself in molecule "
+                             + name_.value());
+    }
+
+    addInteractionImpl(interaction,
+                       particleI.particleName(),
+                       residueName(particleI),
+                       particleJ.particleName(),
+                       residueName(particleJ),
+                       particleK.particleName(),
+                       residueName(particleK),
+                       particleL.particleName(),
+                       residueName(particleL),
+                       particleM.particleName(),
+                       residueName(particleM));
 }
 
-#define ADD_INTERACTION_INSTANTIATE_TEMPLATE(x)                               \
-    template void Molecule::addInteraction(const ParticleName& particleNameI, \
-                                           const ParticleName& particleNameJ, \
-                                           const ParticleName& particleNameK, \
-                                           const x&            interaction);
-MAP(ADD_INTERACTION_INSTANTIATE_TEMPLATE, SUPPORTED_THREE_CENTER_TYPES)
-#undef ADD_INTERACTION_INSTANTIATE_TEMPLATE
-//! \endcond
 
 int Molecule::numParticlesInMolecule() const
 {
     return particles_.size();
 }
 
-void Molecule::addExclusion(const int particleIndex, const int particleIndexToExclude)
+void Molecule::addExclusion(const ParticleIdentifier& particle, const ParticleIdentifier& particleToExclude)
 {
-    // We do not need to add exclusion in case the particle indexes are the same
-    // because self exclusion are added by addParticle
-    if (particleIndex != particleIndexToExclude)
+    if (particle == particleToExclude)
     {
-        exclusions_.emplace_back(particleIndex, particleIndexToExclude);
-        exclusions_.emplace_back(particleIndexToExclude, particleIndex);
+        return;
     }
-}
 
-void Molecule::addExclusion(std::tuple<ParticleName, ResidueName> particle,
-                            std::tuple<ParticleName, ResidueName> particleToExclude)
-{
     // duplication for the swapped pair happens in getExclusions()
-    exclusionsByName_.emplace_back(std::make_tuple(std::get<0>(particle),
-                                                   std::get<1>(particle),
-                                                   std::get<0>(particleToExclude),
-                                                   std::get<1>(particleToExclude)));
-}
-
-void Molecule::addExclusion(const ParticleName& particleName, const ParticleName& particleNameToExclude)
-{
-    addExclusion(std::make_tuple(particleName, ResidueName(name_)),
-                 std::make_tuple(particleNameToExclude, ResidueName(name_)));
+    exclusionsByName_.emplace_back(std::make_tuple(particle.particleName(),
+                                                   residueName(particle),
+                                                   particleToExclude.particleName(),
+                                                   residueName(particleToExclude)));
 }
 
 const Molecule::InteractionTuple& Molecule::interactionData() const
index d9a4cdab9d597e6d54acb44d46d838cc2895bfa4..c8ae094cc16be3c8afef8b9d8dc3a7e83f0feb28 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -80,60 +80,60 @@ struct ParticleData
     real        charge_;
 };
 
-class Molecule final
+//! \brief uniquely identifies a particle within a Molecule
+class ParticleIdentifier final
 {
-    //! \brief string based listed interaction data type used during construction
-    template<class TwoCenterType>
-    struct TwoCenterData
+public:
+    //! \brief construct form a ParticleName, allow implicit conversion
+    ParticleIdentifier(ParticleName particleName) :
+        particleName_(std::move(particleName)),
+        residueName_()
     {
-        using type = TwoCenterType;
-
-        std::vector<TwoCenterType> interactionTypes_;
-        std::vector<std::tuple<ParticleName, ResidueName, ParticleName, ResidueName>> interactions_;
-    };
+    }
 
-    template<class ThreeCenterType>
-    struct ThreeCenterData
+    //! \brief construct with a non-default ResidueName
+    ParticleIdentifier(ParticleName particleName, ResidueName residueName) :
+        particleName_(std::move(particleName)),
+        residueName_(std::move(residueName))
     {
-        using type = ThreeCenterType;
+    }
 
-        std::vector<ThreeCenterType> interactionTypes_;
-        std::vector<std::tuple<ParticleName, ResidueName, ParticleName, ResidueName, ParticleName, ResidueName>> interactions_;
-    };
+    [[nodiscard]] const ParticleName& particleName() const { return particleName_; }
+    [[nodiscard]] const ResidueName&  residueName() const { return residueName_; }
 
-    template<class FourCenter>
-    struct FourCenterDataHolder
-    {
-        using type = FourCenter;
+private:
+    ParticleName particleName_;
+    ResidueName  residueName_;
 
-        std::vector<FourCenter> interactionTypes_;
-        std::vector<std::tuple<ParticleName, ResidueName, ParticleName, ResidueName, ParticleName, ResidueName, ParticleName, ResidueName>> interactions_;
-    };
+    friend inline bool operator==(const ParticleIdentifier& lhs, const ParticleIdentifier& rhs)
+    {
+        return lhs.particleName_ == rhs.particleName_ && lhs.residueName_ == rhs.residueName_;
+    }
+};
 
-    template<class FiveCenter>
-    struct FiveCenterDataHolder
+//! \brief Molecule class that holds particles and their bonded interactions
+class Molecule final
+{
+    //! \brief per-InteractionType storage container for listed interaction with string-based particle IDs
+    template<class InteractionType>
+    struct InteractionTypeData
     {
-        using type = FiveCenter;
+        using type           = InteractionType;
+        using IdentifierType = Repeat<TypeList<ParticleName, ResidueName>, NCenter<InteractionType>{}>;
 
-        std::vector<FiveCenter> interactionTypes_;
-        std::vector<std::tuple<ParticleName, ResidueName, ParticleName, ResidueName, ParticleName, ResidueName, ParticleName, ResidueName, ParticleName, ResidueName>>
-                interactions_;
+        std::vector<InteractionType>                    interactionTypes_;
+        std::vector<Reduce<std::tuple, IdentifierType>> interactions_;
     };
 
-    // BondContainerTypes is TypeList<TwoCenterData<HarmonicBondType>, ...>
-    using TwoCenterContainerTypes = Map<TwoCenterData, SupportedTwoCenterTypes>;
+    //! this creates a tuple containing an instance of InteractionType data for each supported listed type
+    using InteractionTuple = Reduce<std::tuple, Map<InteractionTypeData, SupportedListedTypes>>;
 
-    using ThreeCenterContainerTypes = Map<ThreeCenterData, SupportedThreeCenterTypes>;
+    //! \brief returns the default residue name if necessary
+    ResidueName residueName(const ParticleIdentifier& particleIdentifier);
 
-    using FourCenterContainerTypes = Map<FourCenterDataHolder, SupportedFourCenterTypes>;
-
-    using FiveCenterContainerTypes = Map<FiveCenterDataHolder, SupportedFiveCenterTypes>;
-
-    // InteractionTuple is std::tuple<TwoCenterData<HarmonicBondType>, ...>
-    using InteractionTuple = decltype(std::tuple_cat(Reduce<std::tuple, TwoCenterContainerTypes>{},
-                                                     Reduce<std::tuple, ThreeCenterContainerTypes>{},
-                                                     Reduce<std::tuple, FourCenterContainerTypes>{},
-                                                     Reduce<std::tuple, FiveCenterContainerTypes>{}));
+    //! \brief adds an interaction to the InteractionTuple
+    template<class ListedVariant, class... ParticleIdentifiers>
+    void addInteractionImpl(const ListedVariant& interaction, const ParticleIdentifiers&... particles);
 
 public:
     explicit Molecule(MoleculeName moleculeName);
@@ -149,82 +149,79 @@ public:
                           const ResidueName&  residueName,
                           ParticleType const& particleType);
 
-    //! Add a particle to the molecule with residueName set using particleName
+    //! \brief Add a particle to the molecule with residueName set using particleName
     Molecule& addParticle(const ParticleName& particleName, const Charge& charge, ParticleType const& particleType);
 
-    //! Add a particle to the molecule with residueName set using particleName with implicit charge of 0
-    Molecule& addParticle(const ParticleName& particleName, ParticleType const& particleType);
-
-    // TODO: add exclusions based on the unique ID given to the particle of the molecule
-    void addExclusion(int particleIndex, int particleIndexToExclude);
-
-    //! Specify an exclusion with particle and residue names that have been added to molecule
-    void addExclusion(std::tuple<ParticleName, ResidueName> particle,
-                      std::tuple<ParticleName, ResidueName> particleToExclude);
-
-    //! Specify an exclusion with particle names that have been added to molecule
-    void addExclusion(const ParticleName& particleName, const ParticleName& particleNameToExclude);
-
-    // Add various types of interactions to the molecule
-    // Note: adding an interaction type not listed in SUPPORTED_TWO_CENTER_TYPES results in a compilation error
-
-    //! For 2-particle interactions such as harmonic bonds
-    template<class Interaction>
-    void addInteraction(const ParticleName& particleNameI,
-                        const ResidueName&  residueNameI,
-                        const ParticleName& particleNameJ,
-                        const ResidueName&  residueNameJ,
-                        const Interaction&  interaction);
-
-    //! Add 2-particle interactions with the default residue name
-    template<class Interaction>
-    void addInteraction(const ParticleName& particleNameI,
-                        const ParticleName& particleNameJ,
-                        const Interaction&  interaction);
-
-    //! For 3-particle interactions such as angles
-    template<class Interaction>
-    void addInteraction(const ParticleName& particleNameI,
-                        const ResidueName&  residueNameI,
-                        const ParticleName& particleNameJ,
-                        const ResidueName&  residueNameJ,
-                        const ParticleName& particleNameK,
-                        const ResidueName&  residueNameK,
-                        const Interaction&  interaction);
-
-    //! Add 3-particle interactions with the default residue name
-    template<class Interaction>
-    void addInteraction(const ParticleName& particleNameI,
-                        const ParticleName& particleNameJ,
-                        const ParticleName& particleNameK,
-                        const Interaction&  interaction);
-
-    //! The number of molecules
+    //! \brief Add a particle to the molecule with residueName set using particleName with implicit charge of 0
+    Molecule& addParticle(const ParticleName& particleName, const ParticleType& particleType);
+
+    /*! \brief Specify an exclusion between two particles that have been added to the molecule
+     *
+     * Exclusion of a particle with itself is detected and handled correctly.
+     * Note that adding an exclusion between particles not present in the Molecule will \throw an
+     * exception.
+     */
+    void addExclusion(const ParticleIdentifier& particle, const ParticleIdentifier& particleToExclude);
+
+    /*! \brief Add 2-particle interactions such as harmonic bonds
+     *
+     * Note that adding an interaction between particles not present in the Molecule will \throw an
+     * exception.
+     */
+    void addInteraction(const ParticleIdentifier&   particleI,
+                        const ParticleIdentifier&   particleJ,
+                        const TwoCenterInteraction& interaction);
+
+    //! \brief Add 3-particle interactions such as angles
+    void addInteraction(const ParticleIdentifier&     particleI,
+                        const ParticleIdentifier&     particleJ,
+                        const ParticleIdentifier&     particleK,
+                        const ThreeCenterInteraction& interaction);
+
+    //! \brief Add 4-particle interactions such as (im)proper-dihedrals
+    void addInteraction(const ParticleIdentifier&    particleI,
+                        const ParticleIdentifier&    particleJ,
+                        const ParticleIdentifier&    particleK,
+                        const ParticleIdentifier&    particleL,
+                        const FourCenterInteraction& interaction);
+
+    //! \brief Add 5-particle interactions such as CMAP
+    void addInteraction(const ParticleIdentifier&    particleI,
+                        const ParticleIdentifier&    particleJ,
+                        const ParticleIdentifier&    particleK,
+                        const ParticleIdentifier&    particleL,
+                        const ParticleIdentifier&    particleM,
+                        const FiveCenterInteraction& interaction);
+
+    //! \brief The number of molecules
     int numParticlesInMolecule() const;
 
-    //! Return the ParticleType data for a specific particle name that has been added to the molecule
+    //! \brief Return the ParticleType data for a specific particle name that has been added to the molecule
     const ParticleType& at(const std::string& particlesTypeName) const;
 
-    //! Convert exclusions given by name to indices and unify with exclusions given by indices
-    //! returns a sorted vector containing no duplicates of particles to exclude by indices
+    /*! \brief access integer-based exclusions
+     *
+     * Convert exclusions given by name to indices and unify with exclusions given by indices
+     * returns a sorted vector containing no duplicates of particles to exclude by indices
+     */
     std::vector<std::tuple<int, int>> getExclusions() const;
 
-    //! Return all interactions stored in Molecule
+    //! \brief Return all interactions stored in Molecule
     const InteractionTuple& interactionData() const;
 
-    //! Return name of ith particle
+    //! \brief Return name of i-th particle
     ParticleName particleName(int i) const;
 
-    //! Return name of ith residue
+    //! \brief Return name of i-th residue
     ResidueName residueName(int i) const;
 
-    //! Return array of data structs on particle types
+    //! \brief Return array of data structs on particle types
     std::vector<ParticleData> particleData() const;
 
-    //! Return map of particle types and their names
+    //! \brief Return map of particle types and their names
     std::unordered_map<std::string, ParticleType> particleTypesMap() const;
 
-    //! The molecule name
+    //! \brief The molecule name
     MoleculeName name() const;
 
 private:
@@ -248,41 +245,5 @@ private:
     InteractionTuple interactionData_;
 };
 
-//! \cond DO_NOT_DOCUMENT
-#define ADD_INTERACTION_EXTERN_TEMPLATE(x)                                           \
-    extern template void Molecule::addInteraction(const ParticleName& particleNameI, \
-                                                  const ResidueName&  residueNameI,  \
-                                                  const ParticleName& particleNameJ, \
-                                                  const ResidueName&  residueNameJ,  \
-                                                  const x&            interaction);
-MAP(ADD_INTERACTION_EXTERN_TEMPLATE, SUPPORTED_TWO_CENTER_TYPES)
-#undef ADD_INTERACTION_EXTERN_TEMPLATE
-
-#define ADD_INTERACTION_EXTERN_TEMPLATE(x)         \
-    extern template void Molecule::addInteraction( \
-            const ParticleName& particleNameI, const ParticleName& particleNameJ, const x& interaction);
-MAP(ADD_INTERACTION_EXTERN_TEMPLATE, SUPPORTED_TWO_CENTER_TYPES)
-#undef ADD_INTERACTION_EXTERN_TEMPLATE
-
-#define ADD_INTERACTION_EXTERN_TEMPLATE(x)                                           \
-    extern template void Molecule::addInteraction(const ParticleName& particleNameI, \
-                                                  const ResidueName&  residueNameI,  \
-                                                  const ParticleName& particleNameJ, \
-                                                  const ResidueName&  residueNameJ,  \
-                                                  const ParticleName& particleNameK, \
-                                                  const ResidueName&  residueNameK,  \
-                                                  const x&            interaction);
-MAP(ADD_INTERACTION_EXTERN_TEMPLATE, SUPPORTED_THREE_CENTER_TYPES)
-#undef ADD_INTERACTION_EXTERN_TEMPLATE
-
-#define ADD_INTERACTION_EXTERN_TEMPLATE(x)                                           \
-    extern template void Molecule::addInteraction(const ParticleName& particleNameI, \
-                                                  const ParticleName& particleNameJ, \
-                                                  const ParticleName& particleNameK, \
-                                                  const x&            interaction);
-MAP(ADD_INTERACTION_EXTERN_TEMPLATE, SUPPORTED_THREE_CENTER_TYPES)
-#undef ADD_INTERACTION_EXTERN_TEMPLATE
-//! \endcond
-
 } // namespace nblib
 #endif // NBLIB_MOLECULES_H
index cb732eafedb6ff5073376a06065e8155633238fe..fb81f60ed71b9cf970289578cc9624db36892587 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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 "nblib/interactions.h"
 #include "nblib/kerneloptions.h"
 #include "nblib/listed_forces/bondtypes.h"
-#include "nblib/listed_forces/calculator.h"
 #include "nblib/listed_forces/definitions.h"
+#include "nblib/listed_forces/calculator.h"
 #include "nblib/molecules.h"
+#include "nblib/particlesequencer.h"
 #include "nblib/particletype.h"
-#include "nblib/ppmap.h"
 #include "nblib/simulationstate.h"
 #include "nblib/topology.h"
-#include "nblib/topologyhelpers.h"
-#include "nblib/util/user.h"
+#include "nblib/util/setup.h"
 
 #endif // NBLIB_HEADERS_H
diff --git a/api/nblib/particlesequencer.cpp b/api/nblib/particlesequencer.cpp
new file mode 100644 (file)
index 0000000..7bb98be
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and 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 ParticleSequencer class
+ *
+ * \author Victor Holanda <victor.holanda@cscs.ch>
+ * \author Joe Jordan <ejjordan@kth.se>
+ * \author Prashanth Kanduri <kanduri@cscs.ch>
+ * \author Sebastian Keller <keller@cscs.ch>
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ */
+
+#include <algorithm>
+
+#include "nblib/exception.h"
+#include "nblib/particlesequencer.h"
+
+namespace nblib
+{
+
+int ParticleSequencer::operator()(const MoleculeName& moleculeName,
+                                  int                 moleculeNr,
+                                  const ResidueName&  residueName,
+                                  const ParticleName& particleName) const
+{
+    try
+    {
+        return data_.at(moleculeName).at(moleculeNr).at(residueName).at(particleName);
+    }
+    catch (const std::out_of_range& outOfRange)
+    {
+        // TODO: use string format function once we have it
+        if (moleculeName.value() == residueName.value())
+        {
+            printf("No particle %s in residue %s in molecule %s found\n",
+                   particleName.value().c_str(),
+                   residueName.value().c_str(),
+                   moleculeName.value().c_str());
+        }
+        else
+        {
+            printf("No particle %s in molecule %s found\n",
+                   particleName.value().c_str(),
+                   moleculeName.value().c_str());
+        }
+
+        throw InputException(outOfRange.what());
+    }
+}
+
+void ParticleSequencer::build(const std::vector<std::tuple<Molecule, int>>& moleculesList)
+{
+    int currentID = 0;
+    for (const auto& molNumberTuple : moleculesList)
+    {
+        const Molecule& molecule = std::get<0>(molNumberTuple);
+        const size_t    numMols  = std::get<1>(molNumberTuple);
+
+        auto& moleculeMap = data_[molecule.name()];
+
+        for (size_t i = 0; i < numMols; ++i)
+        {
+            auto& moleculeNrMap = moleculeMap[i];
+            for (int j = 0; j < molecule.numParticlesInMolecule(); ++j)
+            {
+                moleculeNrMap[molecule.residueName(j)][molecule.particleName(j)] = currentID++;
+            }
+        }
+    }
+}
+
+} // namespace nblib
diff --git a/api/nblib/particlesequencer.h b/api/nblib/particlesequencer.h
new file mode 100644 (file)
index 0000000..23b1c77
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and 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.
+ */
+/*! \inpublicapi \file
+ * \brief
+ * Implements ParticleSequencer class
+ *
+ * \author Victor Holanda <victor.holanda@cscs.ch>
+ * \author Joe Jordan <ejjordan@kth.se>
+ * \author Prashanth Kanduri <kanduri@cscs.ch>
+ * \author Sebastian Keller <keller@cscs.ch>
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ */
+#ifndef NBLIB_PARTICLESEQUENCER_H
+#define NBLIB_PARTICLESEQUENCER_H
+
+#include <tuple>
+#include <unordered_map>
+#include <vector>
+
+#include "nblib/molecules.h"
+
+namespace nblib
+{
+
+//! Helper class for Topology to keep track of particle IDs
+class ParticleSequencer
+{
+    //! Alias for storing by (molecule name, molecule nr, residue name, particle name)
+    using DataType = std::unordered_map<
+            std::string,
+            std::unordered_map<int, std::unordered_map<std::string, std::unordered_map<std::string, int>>>>;
+
+public:
+    //! Build sequence from a list of molecules
+    void build(const std::vector<std::tuple<Molecule, int>>& moleculesList);
+
+    //! Access ID by (molecule name, molecule nr, residue name, particle name)
+    int operator()(const MoleculeName&, int, const ResidueName&, const ParticleName&) const;
+
+private:
+    DataType data_;
+};
+
+} // namespace nblib
+
+#endif // NBLIB_PARTICLESEQUENCER_H
index 432bdb4ee3de28254205d49e1ef96a7c22df2cf5..2fd4127a51415669dfe03ce1d6fc8ef0ef4496a9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -50,7 +50,8 @@
 
 #include <string>
 
-#include "nblib/util/user.h"
+#include "nblib/util/util.hpp"
+#include "nblib/basicdefinitions.h"
 
 namespace nblib
 {
index 95c0c43db3d746f32be1e5daccac80efe852dbfb..b52ab9eea3f0f08dce631eb387fe3effda2d3487 100644 (file)
@@ -50,8 +50,6 @@
 #include "gromacs/math/vec.h"
 #include "gromacs/pbcutil/pbc_aiuc.h"
 
-struct PbcAiuc;
-
 namespace nblib
 {
 
diff --git a/api/nblib/ppmap.h b/api/nblib/ppmap.h
deleted file mode 100644 (file)
index a138945..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 2020, by the GROMACS development team, led by
- * Mark Abraham, David van der Spoel, Berk Hess, and 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.
- */
-/*
- * Copyright (C) 2012 William Swanson
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the names of the authors or
- * their institutions shall not be used in advertising or otherwise to
- * promote the sale, use or other dealings in this Software without
- * prior written authorization from the authors.
- */
-
-/*! \inpublicapi \file
- *  \brief
- *  Provides MAP and MAP_LIST to apply a macro to a variadic argument list
- *
- *  The MAP and MAP_LIST macros implement calling a supplied macro with
- *  all of the subsequent arguments. For example:
- *  MAP(macro, x, y, z) expands to macro(x) macro(y) macro(z)  while
- *  MAP_LIST(macro, x, y, z) expands to macro(x), macro(y), macro(z)
- *
- *  Due to the limitations of the preprocessor, it is unfortunately not
- *  possible to implement this functionality in a more straight-forward way.
- *  Since this use-case is not too uncommon, Boost for example implements
- *  BOOST_PP_SEQ_FOR_EACH which provides equivalent functionality implemented
- *  with the same technique, but is more comprehensive in scope,
- *  beyond what's required here.
- *
- *  A discussion of how and why this macro works can be found here:
- *  https://stackoverflow.com/questions/27765387/distributing-an-argument-in-a-variadic-macro
- *  and the original repository of this implementation is this one:
- *  https://github.com/swansontec/map-macro
- *  It also contains some useful explanations of how it works.
- */
-
-#ifndef NBLIB_PPMAP_H
-#define NBLIB_PPMAP_H
-
-#define EVAL0(...) __VA_ARGS__
-#define EVAL1(...) EVAL0(EVAL0(EVAL0(__VA_ARGS__)))
-#define EVAL2(...) EVAL1(EVAL1(EVAL1(__VA_ARGS__)))
-#define EVAL3(...) EVAL2(EVAL2(EVAL2(__VA_ARGS__)))
-#define EVAL4(...) EVAL3(EVAL3(EVAL3(__VA_ARGS__)))
-#define EVAL(...) EVAL4(EVAL4(EVAL4(__VA_ARGS__)))
-
-#define MAP_END(...)
-#define MAP_OUT
-#define MAP_COMMA ,
-
-#define MAP_GET_END2() 0, MAP_END
-#define MAP_GET_END1(...) MAP_GET_END2
-#define MAP_GET_END(...) MAP_GET_END1
-#define MAP_NEXT0(test, next, ...) next MAP_OUT
-#define MAP_NEXT1(test, next) MAP_NEXT0(test, next, 0)
-#define MAP_NEXT(test, next) MAP_NEXT1(MAP_GET_END test, next)
-
-#define MAP0(f, x, peek, ...) f(x) MAP_NEXT(peek, MAP1)(f, peek, __VA_ARGS__)
-#define MAP1(f, x, peek, ...) f(x) MAP_NEXT(peek, MAP0)(f, peek, __VA_ARGS__)
-
-#define MAP_LIST_NEXT1(test, next) MAP_NEXT0(test, MAP_COMMA next, 0)
-#define MAP_LIST_NEXT(test, next) MAP_LIST_NEXT1(MAP_GET_END test, next)
-
-#define MAP_LIST0(f, x, peek, ...) f(x) MAP_LIST_NEXT(peek, MAP_LIST1)(f, peek, __VA_ARGS__)
-#define MAP_LIST1(f, x, peek, ...) f(x) MAP_LIST_NEXT(peek, MAP_LIST0)(f, peek, __VA_ARGS__)
-
-/**
- * Applies the function macro `f` to each of the remaining parameters.
- */
-#define MAP(f, ...) EVAL(MAP1(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
-
-/**
- * Applies the function macro `f` to each of the remaining parameters and
- * inserts commas between the results.
- */
-#define MAP_LIST(f, ...) EVAL(MAP_LIST1(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
-
-
-/** The PP_NARG macro returns the number of arguments that have been
- *  passed to it.
- */
-#define PP_NARG(...) PP_NARG_(__VA_ARGS__, PP_RSEQ_N())
-#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__)
-#define PP_ARG_N(_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, \
-                 N,   \
-                 ...) \
-    N
-#define PP_RSEQ_N()                                                                             \
-    63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, \
-            40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
-            19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
-
-/** MAP_ENUMERATE macro:
- * MAP_ENUMERATE(action, args...)
- * like MAP, calls action with each argument, but also forwards the index of the argument to action
- */
-#define FE_0(WHAT)
-#define FE_1(WHAT, N, X) WHAT(X, N - 1) // NOLINT bugprone-macro-parentheses
-#define FE_2(WHAT, N, X, ...) WHAT(X, N - 2) FE_1(WHAT, N, __VA_ARGS__)
-#define FE_3(WHAT, N, X, ...) WHAT(X, N - 3) FE_2(WHAT, N, __VA_ARGS__)
-#define FE_4(WHAT, N, X, ...) WHAT(X, N - 4) FE_3(WHAT, N, __VA_ARGS__)
-#define FE_5(WHAT, N, X, ...) WHAT(X, N - 5) FE_4(WHAT, N, __VA_ARGS__)
-
-#define GET_MACRO(_0, _1, _2, _3, _4, _5, NAME, ...) NAME
-#define MAP_ENUMERATE(action, ...)                                   \
-    GET_MACRO(_0, __VA_ARGS__, FE_5, FE_4, FE_3, FE_2, FE_1, FE_0, ) \
-    (action, PP_NARG(__VA_ARGS__), __VA_ARGS__)
-
-#endif // NBLIB_PPMAP_H
index 28f834908ca35586f6d08269b304d68b5e2777a6..e3672230769a547666e38386c192fa807203ea7d 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2020, by the GROMACS development team, led by
+# Copyright (c) 2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
 # \author Sebastian Keller <keller@cscs.ch>
 #
 
-add_executable(argon-forces-integration "")
+set(argon "argon-forces-integration")
+add_executable(${argon} "")
 
-target_sources(argon-forces-integration
+target_sources(${argon}
         PRIVATE
         argon-forces-integration.cpp
         )
 
-target_link_libraries(argon-forces-integration PRIVATE nblib)
-install(
-        TARGETS
-        argon-forces-integration
-        DESTINATION
-        ${CMAKE_INSTALL_BINDIR}
-)
+target_link_libraries(${argon} PRIVATE nblib)
+
+set(methane "methane-water-integration")
+add_executable(${methane} "")
+
+target_sources(${methane}
+        PRIVATE
+        methane-water-integration.cpp
+        )
+
+target_link_libraries(${methane} PRIVATE nblib)
 
 if(BUILD_TESTING)
-    add_subdirectory(tests)
+    add_test(NAME NbLibSamplesTestArgon COMMAND ${argon})
+    add_test(NAME NbLibSamplesTestMethaneWater COMMAND ${methane})
+    add_dependencies(check-nblib ${argon})
+    add_dependencies(check-nblib ${methane})
 endif()
index 45e2d922f91370f77a3d3660fdce0476b7006146..75416ea5df2a53a71950168cace5b1952346077d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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/utility/arrayref.h"
+
 // The entire nblib public API can be included with a single header or individual components
 // can be included via their respective headers.
 #include "nblib/nblib.h"
 
-// User defined coordinates.
-std::vector<nblib::Vec3> coordinates = {
-    { 0.794, 1.439, 0.610 }, { 1.397, 0.673, 1.916 }, { 0.659, 1.080, 0.573 },
-    { 1.105, 0.090, 3.431 }, { 1.741, 1.291, 3.432 }, { 1.936, 1.441, 5.873 },
-    { 0.960, 2.246, 1.659 }, { 0.382, 3.023, 2.793 }, { 0.053, 4.857, 4.242 },
-    { 2.655, 5.057, 2.211 }, { 4.114, 0.737, 0.614 }, { 5.977, 5.104, 5.217 },
-};
-
-// User defined velocities.
-std::vector<nblib::Vec3> velocities = {
-    { 0.0055, -0.1400, 0.2127 },   { 0.0930, -0.0160, -0.0086 }, { 0.1678, 0.2476, -0.0660 },
-    { 0.1591, -0.0934, -0.0835 },  { -0.0317, 0.0573, 0.1453 },  { 0.0597, 0.0013, -0.0462 },
-    { 0.0484, -0.0357, 0.0168 },   { 0.0530, 0.0295, -0.2694 },  { -0.0550, -0.0896, 0.0494 },
-    { -0.0799, -0.2534, -0.0079 }, { 0.0436, -0.1557, 0.1849 },  { -0.0214, 0.0446, 0.0758 },
-};
-
-// Force buffer initialization for each particle.
-std::vector<nblib::Vec3> forces = {
-    { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 },
-    { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 },
-    { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 },
-    { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 },
-};
-
 // Main function to write the MD program.
 int main(); // Keep the compiler happy
 
@@ -84,8 +62,8 @@ int main()
     // Add the argon particle to a molecule. The names are for bookkeeping and need not match.
     argonMolecule.addParticle(nblib::ParticleName("Argon"), argonAtom);
     // Define Lennard-Jones params for argon (parameters from gromos43A1).
-    const nblib::C6  ArC6{ 0.0062647225 };  // C6 parameter
-    const nblib::C12 ArC12{ 9.847044e-06 }; // C12 parameter
+    nblib::C6  ArC6{ 0.0062647225 };  // C6 parameter
+    nblib::C12 ArC12{ 9.847044e-06 }; // C12 parameter
     // Holder for non-bonded interactions.
     nblib::ParticleTypesInteractions interactions;
     // Add non-bonded interactions for argon.
@@ -93,7 +71,7 @@ int main()
     // The TopologyBuilder builds the Topology!
     nblib::TopologyBuilder topologyBuilder;
     // Number of Argon particles (molecules) in the system.
-    const int numParticles = 12;
+    int numParticles = 12;
     // Add the requested number of argon molecules to a topology.
     topologyBuilder.addMolecule(argonMolecule, numParticles);
     // Add the argon interactions to the topology.
@@ -102,6 +80,27 @@ int main()
     nblib::Topology topology = topologyBuilder.buildTopology();
     // The system needs a bounding box. Only cubic and rectangular boxes are supported.
     nblib::Box box(6.05449);
+    // User defined coordinates.
+    std::vector<nblib::Vec3> coordinates = {
+        { 0.794, 1.439, 0.610 }, { 1.397, 0.673, 1.916 }, { 0.659, 1.080, 0.573 },
+        { 1.105, 0.090, 3.431 }, { 1.741, 1.291, 3.432 }, { 1.936, 1.441, 5.873 },
+        { 0.960, 2.246, 1.659 }, { 0.382, 3.023, 2.793 }, { 0.053, 4.857, 4.242 },
+        { 2.655, 5.057, 2.211 }, { 4.114, 0.737, 0.614 }, { 5.977, 5.104, 5.217 },
+    };
+    // User defined velocities.
+    std::vector<nblib::Vec3> velocities = {
+        { 0.0055, -0.1400, 0.2127 },   { 0.0930, -0.0160, -0.0086 }, { 0.1678, 0.2476, -0.0660 },
+        { 0.1591, -0.0934, -0.0835 },  { -0.0317, 0.0573, 0.1453 },  { 0.0597, 0.0013, -0.0462 },
+        { 0.0484, -0.0357, 0.0168 },   { 0.0530, 0.0295, -0.2694 },  { -0.0550, -0.0896, 0.0494 },
+        { -0.0799, -0.2534, -0.0079 }, { 0.0436, -0.1557, 0.1849 },  { -0.0214, 0.0446, 0.0758 },
+    };
+    // Force buffer initialization for each particle.
+    std::vector<nblib::Vec3> forces = {
+        { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 },
+        { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 },
+        { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 },
+        { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 }, { 0.0000, 0.0000, 0.0000 },
+    };
     // A simulation state contains all the molecular information about the system.
     nblib::SimulationState simState(coordinates, velocities, forces, box, topology);
     // Kernel options are flags needed for force calculation.
diff --git a/api/nblib/samples/methane-water-integration.cpp b/api/nblib/samples/methane-water-integration.cpp
new file mode 100644 (file)
index 0000000..e574fea
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2021, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and 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
+ * This tests that sample code can run
+ *
+ * \author Victor Holanda <victor.holanda@cscs.ch>
+ * \author Joe Jordan <ejjordan@kth.se>
+ * \author Prashanth Kanduri <kanduri@cscs.ch>
+ * \author Sebastian Keller <keller@cscs.ch>
+ */
+
+#include <cstdio>
+
+#include "gromacs/utility/arrayref.h"
+
+// The entire nblib public API can be included with a single header or individual components
+// can be included via their respective headers.
+#include "nblib/nblib.h"
+
+using namespace nblib;
+
+// Main function to write the MD program.
+int main(); // Keep the compiler happy
+
+int main()
+{
+    // Create the particles
+    ParticleType Ow(ParticleTypeName("Ow"), Mass(15.999));
+    ParticleType Hw(ParticleTypeName("Hw"), Mass(1.00784));
+    ParticleType Cm(ParticleTypeName("Cm"), Mass(12.0107));
+    ParticleType Hc(ParticleTypeName("Hc"), Mass(1.00784));
+
+    ParticleTypesInteractions interactions(CombinationRule::Geometric);
+
+    // Parameters from a GROMOS compatible force-field 2016H66
+    // add non-bonded interactions for the particle types
+    interactions.add(Ow.name(), C6(0.0026173456), C12(2.634129e-06));
+    interactions.add(Hw.name(), C6(0.0), C12(0.0));
+    interactions.add(Cm.name(), C6(0.01317904), C12(34.363044e-06));
+    interactions.add(Hc.name(), C6(8.464e-05), C12(15.129e-09));
+
+    Molecule water(MoleculeName("Water"));
+    Molecule methane(MoleculeName("Methane"));
+
+    water.addParticle(ParticleName("O"), Ow);
+    water.addParticle(ParticleName("H1"), Hw);
+    water.addParticle(ParticleName("H2"), Hw);
+
+    water.addExclusion(ParticleName("H1"), ParticleName("O"));
+    water.addExclusion(ParticleName("H2"), ParticleName("O"));
+
+    methane.addParticle(ParticleName("C"), Cm);
+    methane.addParticle(ParticleName("H1"), Hc);
+    methane.addParticle(ParticleName("H2"), Hc);
+    methane.addParticle(ParticleName("H3"), Hc);
+    methane.addParticle(ParticleName("H4"), Hc);
+
+    methane.addExclusion(ParticleName("H1"), ParticleName("C"));
+    methane.addExclusion(ParticleName("H2"), ParticleName("C"));
+    methane.addExclusion(ParticleName("H3"), ParticleName("C"));
+    methane.addExclusion(ParticleName("H4"), ParticleName("C"));
+
+    HarmonicBondType ohHarmonicBond(1, 1);
+    HarmonicBondType hcHarmonicBond(2, 1);
+
+    HarmonicAngleType hohAngle(Degrees(120), 1);
+    HarmonicAngleType hchAngle(Degrees(109.5), 1);
+
+    // add harmonic bonds for water
+    water.addInteraction(ParticleName("O"), ParticleName("H1"), ohHarmonicBond);
+    water.addInteraction(ParticleName("O"), ParticleName("H2"), ohHarmonicBond);
+
+    // add the angle for water
+    water.addInteraction(ParticleName("H1"), ParticleName("O"), ParticleName("H2"), hohAngle);
+
+    // add harmonic bonds for methane
+    methane.addInteraction(ParticleName("H1"), ParticleName("C"), hcHarmonicBond);
+    methane.addInteraction(ParticleName("H2"), ParticleName("C"), hcHarmonicBond);
+    methane.addInteraction(ParticleName("H3"), ParticleName("C"), hcHarmonicBond);
+    methane.addInteraction(ParticleName("H4"), ParticleName("C"), hcHarmonicBond);
+
+    // add the angles for methane
+    methane.addInteraction(ParticleName("H1"), ParticleName("C"), ParticleName("H2"), hchAngle);
+    methane.addInteraction(ParticleName("H1"), ParticleName("C"), ParticleName("H3"), hchAngle);
+    methane.addInteraction(ParticleName("H1"), ParticleName("C"), ParticleName("H4"), hchAngle);
+    methane.addInteraction(ParticleName("H2"), ParticleName("C"), ParticleName("H3"), hchAngle);
+    methane.addInteraction(ParticleName("H2"), ParticleName("C"), ParticleName("H4"), hchAngle);
+    methane.addInteraction(ParticleName("H3"), ParticleName("C"), ParticleName("H4"), hchAngle);
+
+    // Define a box for the simulation
+    Box box(6.05449);
+
+    // Define options for the non-bonded kernels
+    NBKernelOptions options;
+    // Use a simple cutoff rule for Coulomb
+    options.coulombType = nblib::CoulombType::Cutoff;
+    // Disable SIMD for this example
+    options.nbnxmSimd = SimdKernels::SimdNo;
+
+    TopologyBuilder topologyBuilder;
+
+    // add molecules
+    topologyBuilder.addMolecule(water, 2);
+    topologyBuilder.addMolecule(methane, 1);
+
+    // add non-bonded interaction map
+    topologyBuilder.addParticleTypesInteractions(interactions);
+
+    Topology topology = topologyBuilder.buildTopology();
+
+    // User defined coordinates.
+    std::vector<Vec3> coordinates = {
+        { 0.005, 0.600, 0.244 },    // Oxygen from water_1
+        { -0.017, 0.690, 0.270 },   // Hydrogen_1 from water_1
+        { 0.051, 0.610, 0.161 },    // Hydrogen_2 from water_1
+        { 0.155, 0.341, 0.735 },    // Oxygen from water_2
+        { 0.140, 0.284, 0.660 },    // Hydrogen_1 from water_2
+        { 0.081, 0.402, 0.734 },    // Hydrogen_2 from water_2
+        { -0.024, -0.222, -0.640 }, // Carbon from methane_1
+        { -0.083, -0.303, -0.646 }, // Hydrogen_1 from methane_1
+        { -0.080, -0.140, -0.642 }, // Hydrogen_2 from methane_1
+        { 0.040, -0.221, -0.716 },  // Hydrogen_3 from methane_1
+        { 0.027, -0.225, -0.553 }   // Hydrogen_4 from methane_1
+    };
+
+    // User defined velocities.
+    std::vector<Vec3> velocities = {
+        { 0.1823, -0.4158, 0.487 },   // Oxygen from water_1
+        { -1.7457, -0.5883, -0.460 }, // Hydrogen_1 from water_1
+        { 2.5085, -0.1501, 1.762 },   // Hydrogen_2 from water_1
+        { 0.6282, 0.4390, 0.001 },    // Oxygen from water_2
+        { -0.3206, 0.0700, 0.4630 },  // Hydrogen_1 from water_2
+        { -0.1556, -0.4529, 1.440 },  // Hydrogen_2 from water_2
+        { 0.0, 0.0, 0.0 },            // Carbon from methane_1
+        { 0.0, 0.0, 0.0 },            // Hydrogen_1 from methane_1
+        { 0.0, 0.0, 0.0 },            // Hydrogen_2 from methane_1
+        { 0.0, 0.0, 0.0 },            // Hydrogen_3 from methane_1
+        { 0.0, 0.0, 0.0 },            // Hydrogen_4 from methane_1
+    };
+
+    // Force buffer initialization for each particle.
+    std::vector<Vec3> forces(topology.numParticles(), Vec3{ 0, 0, 0 });
+
+    SimulationState simulationState(coordinates, velocities, forces, box, topology);
+
+    // The non-bonded force calculator contains all the data needed to compute forces
+    ForceCalculator forceCalculator(simulationState, options);
+
+    // The listed force calculator is also initialized with the required arguments
+    ListedForceCalculator listedForceCalculator(
+            topology.getInteractionData(), topology.numParticles(), 4, box);
+
+    // Integrator is initialized with an array of inverse masses (constructed from topology) and
+    // the bounding box
+    LeapFrog integrator(topology, box);
+
+    // Print some diagnostic info
+    printf("initial position of particle 0: x %4f y %4f z %4f\n",
+           simulationState.coordinates()[0][0],
+           simulationState.coordinates()[0][1],
+           simulationState.coordinates()[0][2]);
+
+    // MD Loop
+    int numSteps = 2;
+
+    for (auto i = 0; i < numSteps; i++)
+    {
+        zeroCartesianArray(simulationState.forces());
+
+        forceCalculator.compute(simulationState.coordinates(), simulationState.forces());
+
+        listedForceCalculator.compute(simulationState.coordinates(), simulationState.forces());
+
+        // Integrate with a time step of 1 fs, positions, velocities and forces
+        integrator.integrate(
+                1.0, simulationState.coordinates(), simulationState.velocities(), simulationState.forces());
+    }
+
+    printf("  final position of particle 9: x %4f y %4f z %4f\n",
+           simulationState.coordinates()[9][0],
+           simulationState.coordinates()[9][1],
+           simulationState.coordinates()[9][2]);
+
+    return 0;
+} // main
diff --git a/api/nblib/samples/tests/CMakeLists.txt b/api/nblib/samples/tests/CMakeLists.txt
deleted file mode 100644 (file)
index c51b090..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# This file is part of the GROMACS molecular simulation package.
-#
-# Copyright (c) 2020, by the GROMACS development team, led by
-# Mark Abraham, David van der Spoel, Berk Hess, and 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.
-#
-# \author Victor Holanda <victor.holanda@cscs.ch>
-# \author Joe Jordan <ejjordan@kth.se>
-# \author Prashanth Kanduri <kanduri@cscs.ch>
-# \author Sebastian Keller <keller@cscs.ch>
-#
-
-
-set(testname "NbLibSamplesTests")
-set(exename "nblib-samples-test")
-
-gmx_add_gtest_executable(
-    ${exename}
-    CPP_SOURCE_FILES
-    # files with code for tests
-        samples.cpp
-    )
-#The following line is a not so nice hack to prevent compiler warnings that are not relevant for the sample scripts
-set_source_files_properties(samples.cpp PROPERTIES COMPILE_FLAGS "-Wno-header-hygiene")
-target_link_libraries(nblib-samples-test PRIVATE nblib)
-gmx_register_gtest_test(${testname} ${exename})
-add_dependencies(check-nblib ${exename})
diff --git a/api/nblib/sequencing.hpp b/api/nblib/sequencing.hpp
new file mode 100644 (file)
index 0000000..82878bd
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2020, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and 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 helper functions needed for the nblib topology that
+ * are part of the translation of string-based particle identifiers
+ * used in Molecule to the sequence of integer IDs that the topology
+ * stores. This file is included only in the topology.cpp translation unit.
+ *
+ * \author Victor Holanda <victor.holanda@cscs.ch>
+ * \author Joe Jordan <ejjordan@kth.se>
+ * \author Prashanth Kanduri <kanduri@cscs.ch>
+ * \author Sebastian Keller <keller@cscs.ch>
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ */
+#ifndef NBLIB_SEQUENCING_H
+#define NBLIB_SEQUENCING_H
+
+#include <numeric>
+#include <tuple>
+#include <unordered_map>
+#include <vector>
+
+#include "gromacs/utility/listoflists.h"
+#include "nblib/molecules.h"
+
+#include "nblib/listed_forces/transformations.h"
+#include "nblib/particlesequencer.h"
+
+namespace nblib
+{
+
+namespace detail
+{
+
+/*! \brief Extract all interactions of type I from a vector of molecules.
+ *
+ * The second argument tuple element specifies multiples of the molecule given as first tuple element.
+ * Let (S, I) denote the return value tuple.
+ * Then J[i] = I[S[i]] for all i in 0...S.size() is the full sequence of BondType
+ * instances as they occur in the input tuple
+ */
+template<class I>
+std::tuple<std::vector<size_t>, std::vector<I>>
+collectInteractions(const std::vector<std::tuple<Molecule, int>>& molecules)
+{
+    std::vector<I>      collectedBonds;
+    std::vector<size_t> expansionArray;
+    for (const auto& molNumberTuple : molecules)
+    {
+        const Molecule& molecule = std::get<0>(molNumberTuple);
+        size_t          numMols  = std::get<1>(molNumberTuple);
+
+        auto& interactions = pickType<I>(molecule.interactionData()).interactionTypes_;
+
+        std::vector<size_t> moleculeExpansion(interactions.size());
+        // assign indices to the bonds in the current molecule, continue counting from
+        // the number of bonds seen so far (=collectedBonds.size())
+        std::iota(begin(moleculeExpansion), end(moleculeExpansion), collectedBonds.size());
+
+        std::copy(begin(interactions), end(interactions), std::back_inserter(collectedBonds));
+
+        for (size_t i = 0; i < numMols; ++i)
+        {
+            std::copy(begin(moleculeExpansion), end(moleculeExpansion), std::back_inserter(expansionArray));
+        }
+    }
+    return std::make_tuple(expansionArray, collectedBonds);
+}
+
+/*! \brief Return a list of unique BondType instances
+ *
+ * U is the unique list of bonds and S is an index list of size aggregatedBonds.size(),
+ * such that the BondType instance at aggregatedBonds[i] is equal to U[S[i]]
+ * returns std::tuple(S, U)
+ */
+ template<class I>
+std::tuple<std::vector<size_t>, std::vector<I>> eliminateDuplicateInteractions(const std::vector<I>& aggregatedInteractions)
+{
+    std::vector<size_t> uniqueIndices(aggregatedInteractions.size());
+    std::vector<I>      uniquInteractionsInstances;
+    // if there are no interactions of type B we're done now
+    if (aggregatedInteractions.empty())
+    {
+        return std::make_tuple(uniqueIndices, uniquInteractionsInstances);
+    }
+
+    // create 0,1,2,... sequence
+    std::iota(begin(uniqueIndices), end(uniqueIndices), 0);
+
+    std::vector<std::tuple<I, size_t>> enumeratedBonds(aggregatedInteractions.size());
+    // append each interaction with its index
+    std::transform(begin(aggregatedInteractions), end(aggregatedInteractions), begin(uniqueIndices),
+                   begin(enumeratedBonds), [](I b, size_t i) { return std::make_tuple(b, i); });
+
+    auto sortKey = [](const auto& t1, const auto& t2) { return std::get<0>(t1) < std::get<0>(t2); };
+    // sort w.r.t bonds. the result will contain contiguous segments of identical bond instances
+    // the associated int indicates the original index of each BondType instance in the input vector
+    std::sort(begin(enumeratedBonds), end(enumeratedBonds), sortKey);
+
+    // initialize it1 and it2 to delimit first range of equal BondType instances
+    auto range = std::equal_range(begin(enumeratedBonds), end(enumeratedBonds), enumeratedBonds[0], sortKey);
+    auto it1 = range.first;
+    auto it2 = range.second;
+
+    // number of unique instances of BondType B = number of contiguous segments in enumeratedBonds =
+    //         number of iterations in the outer while loop below
+    while (it1 != end(enumeratedBonds))
+    {
+        uniquInteractionsInstances.push_back(std::get<0>(*it1));
+
+        // loop over all identical BondType instances;
+        for (; it1 != it2; ++it1)
+        {
+            // we note down that the BondType instance at index <interactionIndex>
+            // can be found in the uniqueBondInstances container at index <uniqueBondInstances.size()>
+            int interactionIndex            = std::get<1>(*it1);
+            uniqueIndices[interactionIndex] = uniquInteractionsInstances.size() - 1;
+        }
+
+        // Note it1 has been incremented and is now equal to it2
+        if (it1 != end(enumeratedBonds))
+        {
+            it2 = std::upper_bound(it1, end(enumeratedBonds), *it1, sortKey);
+        }
+    }
+
+    return make_tuple(uniqueIndices, uniquInteractionsInstances);
+}
+
+
+namespace sequence_detail
+{
+
+//! \brief Helper function to convert a tuple of strings into a particle index sequence
+template<class Tuple, class F, class... Args, size_t... Is>
+auto stringsToIndices_impl(const Tuple& tuple, [[maybe_unused]] std::index_sequence<Is...> is, F&& f, Args... args)
+{
+    return std::array<int, sizeof...(Is)>{ f(args..., std::get<2 * Is + 1>(tuple),
+                                             std::get<2 * Is>(tuple))... };
+}
+
+/*! \brief
+ *  This takes a tuple<(string, string) * nCenter> from molecule
+ *  where nCenter = 2 for bonds, 3 for angles and 4 for dihedrals
+ *  each (ResidueName, ParticleName)-pair is converted to a particle sequence index
+ *  by calling the supplied function object f, containing the particleSequencer at the call site
+ *  Therefore, the return type is tuple<int * nCenter>
+ *
+ */
+template<class Tuple, class F, class... Args>
+auto stringsToIndices(const Tuple& tuple, F&& f, Args... args)
+{
+    auto is = std::make_index_sequence<std::tuple_size<Tuple>::value / 2>{};
+    return stringsToIndices_impl(tuple, is, std::forward<F>(f), args...);
+}
+
+} // namespace sequence_detail
+
+/*! \brief Convert string-based interactions to integer-index based ones
+ *
+ * For each interaction, translate particle identifiers (moleculeName, nr, residueName,
+ * particleName) to particle coordinate indices
+ */
+template<class B>
+std::vector<CoordinateIndex<B>> sequenceIDs(const std::vector<std::tuple<Molecule, int>>& molecules,
+                                            const ParticleSequencer& particleSequencer)
+{
+    std::vector<CoordinateIndex<B>> coordinateIndices;
+
+    auto callSequencer = [&particleSequencer](const MoleculeName& moleculeName, int i,
+                                              const ResidueName&  residueName,
+                                              const ParticleName& particleName) {
+        return particleSequencer(moleculeName, i, residueName, particleName);
+    };
+
+    // loop over all molecules
+    for (const auto& molNumberTuple : molecules)
+    {
+        const Molecule& molecule = std::get<0>(molNumberTuple);
+        size_t          numMols  = std::get<1>(molNumberTuple);
+
+        for (size_t i = 0; i < numMols; ++i)
+        {
+            auto& interactions = pickType<B>(molecule.interactionData()).interactions_;
+            for (const auto& interactionString : interactions)
+            {
+                CoordinateIndex<B> index = sequence_detail::stringsToIndices(
+                        interactionString, callSequencer, molecule.name(), i);
+                coordinateIndices.push_back(nblibOrdering(index));
+            }
+        }
+    }
+    return coordinateIndices;
+}
+
+} // namespace detail
+
+} // namespace nblib
+
+#endif // NBLIB_TOPOLOGY_HELPERS_H
index c326b828239cc4ed368808326730960ccbc03eee..e474d015089c0d57c62b1002a07c70210fc20da4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -49,6 +49,7 @@
 #include "nblib/exception.h"
 #include "nblib/simulationstate.h"
 #include "nblib/simulationstateimpl.h"
+#include "nblib/util/setup.h"
 
 namespace nblib
 {
index db93eb5b60f3a00f7634673edb82353d9ec02f2d..1beb3b17d316a158ef299fdf30821c91e8411f03 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -49,8 +49,9 @@
 #include <memory>
 #include <vector>
 
-#include "nblib/box.h"
-#include "nblib/topology.h"
+#include "box.h"
+#include "topology.h"
+#include "vector.h"
 
 namespace nblib
 {
index c50b2c83d890f853a9f9e510e1d65b7da3cd6205..164e5e784e1a4bada92458df61991a42c8ec15ac 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -47,6 +47,7 @@
 #include "nblib/kerneloptions.h"
 #include "nblib/simulationstate.h"
 #include "nblib/tests/testsystems.h"
+#include "gromacs/utility/arrayref.h"
 
 namespace nblib
 {
index 6d26988a1b4c6deaea03a07c69b05ce4c8045ad6..75e5584548ddbd1f6a74c721bc6c5bac5cd8bdda 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -48,7 +48,6 @@
 #include "nblib/particletype.h"
 #include "nblib/simulationstate.h"
 #include "nblib/topology.h"
-#include "nblib/util/internal.h"
 
 #include "testutils/testasserts.h"
 
@@ -77,10 +76,8 @@ TEST(NBlibTest, IntegratorWorks)
     topologyBuilder.addParticleTypesInteractions(interactions);
     Topology topology = topologyBuilder.buildTopology();
 
-    // Some random starting conditions
-    std::vector<Vec3> x(numAtoms, { -9.0, 8.0, -7.0 });
-    std::vector<Vec3> v(numAtoms, { 0.6, -0.5, 0.4 });
-    // Constant force acting on the atom
+    std::vector<Vec3> x(numAtoms, { 0.0, 0.0, 0.0 });
+    std::vector<Vec3> v(numAtoms, { 0.0, 0.0, 0.0 });
     std::vector<Vec3> f(numAtoms, { 1.0, 2.0, 0.0 });
 
     Box box(100);
@@ -128,9 +125,11 @@ TEST(NBlibTest, IntegratorWorks)
                                    i,
                                    step);
             }
+            integrator.integrate(dt,
+                                 simulationState.coordinates(),
+                                 simulationState.velocities(),
+                                 simulationState.forces());
         }
-        integrator.integrate(
-                dt, simulationState.coordinates(), simulationState.velocities(), simulationState.forces());
     }
 }
 
index 009f18f246637e58e690bcb6046aa4b4e0bf48f2..a63cadcd16a532e612d10f16d7783310acf07cbe 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -114,28 +114,6 @@ TEST(NBlibTest, CanConstructExclusionListFromNames)
     }
 }
 
-TEST(NBlibTest, CanConstructExclusionListFromIndices)
-{
-    WaterMoleculeBuilder waterMolecule;
-    Molecule             water = waterMolecule.waterMoleculeWithoutExclusions();
-
-    //! Add the exclusions
-    water.addExclusion(1, 0);
-    water.addExclusion(2, 0);
-    water.addExclusion(1, 2);
-
-    std::vector<std::tuple<int, int>> exclusions = water.getExclusions();
-
-    std::vector<std::tuple<int, int>> reference{ { 0, 0 }, { 0, 1 }, { 0, 2 }, { 1, 0 }, { 1, 1 },
-                                                 { 1, 2 }, { 2, 0 }, { 2, 1 }, { 2, 2 } };
-
-    ASSERT_EQ(exclusions.size(), 9);
-    for (std::size_t i = 0; i < exclusions.size(); ++i)
-    {
-        EXPECT_EQ(exclusions[i], reference[i]);
-    }
-}
-
 TEST(NBlibTest, CanConstructExclusionListFromNamesAndIndicesMixed)
 {
     WaterMoleculeBuilder waterMolecule;
@@ -144,7 +122,7 @@ TEST(NBlibTest, CanConstructExclusionListFromNamesAndIndicesMixed)
     //! Add the exclusions
     water.addExclusion(ParticleName("H1"), ParticleName("Oxygen"));
     water.addExclusion(ParticleName("H2"), ParticleName("Oxygen"));
-    water.addExclusion(1, 2);
+    water.addExclusion(ParticleName("H1"), ParticleName("H2"));
 
     std::vector<std::tuple<int, int>> exclusions = water.getExclusions();
 
@@ -215,9 +193,9 @@ TEST(NBlibTest, CanAddInteractions)
     molecule.addParticle(ParticleName("H1"), H);
     molecule.addParticle(ParticleName("H2"), H);
 
-    HarmonicBondType hb(1, 2);
-    CubicBondType    cub(1, 2, 3);
-    DefaultAngle     ang(Degrees(1), 1);
+    HarmonicBondType  hb(1, 2);
+    CubicBondType     cub(1, 2, 3);
+    HarmonicAngleType ang(Degrees(1), 1);
 
     molecule.addInteraction(ParticleName("O"), ParticleName("H1"), hb);
     molecule.addInteraction(ParticleName("O"), ParticleName("H2"), hb);
@@ -231,7 +209,7 @@ TEST(NBlibTest, CanAddInteractions)
     //! cubic bonds
     EXPECT_EQ(pickType<CubicBondType>(interactionData).interactions_.size(), 1);
     //! angular interactions
-    EXPECT_EQ(pickType<DefaultAngle>(interactionData).interactions_.size(), 1);
+    EXPECT_EQ(pickType<HarmonicAngleType>(interactionData).interactions_.size(), 1);
 }
 
 } // namespace
index 3e15e93878247aca106f675c21f666faff336f6d..ca1524675ec330d8454a8a95ac6fcea4b2a8d345 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -51,6 +51,7 @@
 #include "nblib/tests/testhelpers.h"
 #include "nblib/tests/testsystems.h"
 #include "nblib/topology.h"
+#include "nblib/util/setup.h"
 
 namespace nblib
 {
@@ -80,12 +81,7 @@ TEST(NBlibTest, SpcMethanolForcesAreCorrect)
     gmx::ArrayRef<Vec3> forces(simState.forces());
     ASSERT_NO_THROW(forceCalculator.compute(simState.coordinates(), forces));
 
-    /* Use higher-than-usual tolerance for forces. Some of the particles in the test systems are
-     * very close to each other, and, for example, the distance between the first two particles
-     * is approx. 0.13 and already has relative uncertainty around 1e-6. */
-    gmx::test::FloatingPointTolerance forceTolerance(1.0e-5, 1.0e-9, 1e-4, 1.0e-9, 1000, 1000, true);
-
-    Vector3DTest forcesOutputTest(forceTolerance);
+    Vector3DTest forcesOutputTest(5e-5);
     forcesOutputTest.testVectors(forces, "SPC-methanol forces");
 }
 
index 3dab09dc83a2dcf80f8ed8d1c22bcdf5a18cfb75..6c323571c51692e46ebd23adb5f9875beff90931 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -41,8 +41,8 @@
  * \author Prashanth Kanduri <kanduri@cscs.ch>
  * \author Sebastian Keller <keller@cscs.ch>
  */
-#ifndef NBLIB_TESTS_TESTHELPERS_H
-#define NBLIB_TESTS_TESTHELPERS_H
+#ifndef NBLIB_TESTHELPERS_H
+#define NBLIB_TESTHELPERS_H
 
 #include "gromacs/math/vectypes.h"
 #include "gromacs/utility/arrayref.h"
@@ -76,16 +76,22 @@ public:
         checker_.setDefaultTolerance(tolerance);
     }
 
-    explicit Vector3DTest(const gmx::test::FloatingPointTolerance& tolerance) :
-        checker_(refData_.rootChecker())
+    Vector3DTest(real relativeFloatingPointTolerance) : checker_(refData_.rootChecker())
     {
+        gmx::test::FloatingPointTolerance tolerance(gmx::test::FloatingPointTolerance(
+                1e-8, 1.0e-12, relativeFloatingPointTolerance, 1.0e-12, 200, 100, true));
         checker_.setDefaultTolerance(tolerance);
     }
 
     //! Compare a given input vector of cartesians with the reference data
-    void testVectors(gmx::ArrayRef<Vec3> forces, const std::string& testString)
+    void testVectors(gmx::ArrayRef<Vec3> forces, const std::string& testName)
     {
-        checker_.checkSequence(forces.begin(), forces.end(), testString.c_str());
+        checker_.checkSequence(forces.begin(), forces.end(), testName.c_str());
+    }
+
+    void testReal(real value, const std::string& testName)
+    {
+        checker_.checkReal(value, testName.c_str());
     }
 
 private:
@@ -110,4 +116,4 @@ private:
 
 } // namespace test
 } // namespace nblib
-#endif // NBLIB_TESTS_TESTHELPERS_H
+#endif // NBLIB_TESTHELPERS_H
index 43e6f45522025ad80a0a4a035cbf5a83d17fb777..2bedef8887ecc158f0d914c1d4c023be3c06be21 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -162,7 +162,7 @@ MethanolMoleculeBuilder::MethanolMoleculeBuilder() : methanol_(MoleculeName("MeO
     HarmonicBondType ometBond(1.1, 1.2);
     methanol_.addInteraction(ParticleName("O2"), ParticleName("Me1"), ometBond);
 
-    DefaultAngle ochAngle(Degrees(108.52), 397.5);
+    HarmonicAngleType ochAngle(Degrees(108.52), 397.5);
     methanol_.addInteraction(ParticleName("O2"), ParticleName("Me1"), ParticleName("H3"), ochAngle);
 }
 
index 5d625d2fee8a9eaf02876bdb132e1b34aeebbd7b..ff4d0336d929edc9eaa0e3c2af468a7d70628dfa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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 "gromacs/topology/exclusionblocks.h"
+#include "gromacs/utility/listoflists.h"
 #include "nblib/exception.h"
 #include "nblib/particletype.h"
+#include "nblib/sequencing.hpp"
 #include "nblib/tests/testsystems.h"
 #include "nblib/topology.h"
+#include "nblib/topologyhelpers.h"
+#include "nblib/particlesequencer.h"
 
 namespace nblib
 {
@@ -167,9 +171,11 @@ TEST(NBlibTest, TopologyThrowsIdenticalParticleType)
 
 TEST(NBlibTest, TopologyHasExclusions)
 {
-    WaterTopologyBuilder         waters;
-    Topology                     watersTopology = waters.buildTopology(2);
-    const gmx::ListOfLists<int>& testExclusions = watersTopology.getGmxExclusions();
+    WaterTopologyBuilder        waters;
+    Topology                    watersTopology = waters.buildTopology(2);
+    ExclusionLists<int>         exclusionLists = watersTopology.exclusionLists();
+    const gmx::ListOfLists<int> testExclusions(std::move(exclusionLists.ListRanges),
+                                               std::move(exclusionLists.ListElements));
 
     const std::vector<std::vector<int>>& refExclusions = { { 0, 1, 2 }, { 0, 1, 2 }, { 0, 1, 2 },
                                                            { 3, 4, 5 }, { 3, 4, 5 }, { 3, 4, 5 } };
@@ -228,7 +234,7 @@ TEST(NBlibTest, TopologyCanSequencePairIDs)
 
     std::vector<std::tuple<Molecule, int>> molecules{ std::make_tuple(water, 2),
                                                       std::make_tuple(methanol, 1) };
-    detail::ParticleSequencer              particleSequencer;
+    ParticleSequencer                      particleSequencer;
     particleSequencer.build(molecules);
     auto pairs = detail::sequenceIDs<HarmonicBondType>(molecules, particleSequencer);
 
@@ -263,7 +269,7 @@ TEST(NBlibTest, TopologySequenceIdThrows)
 
     std::vector<std::tuple<Molecule, int>> molecules{ std::make_tuple(water, 2),
                                                       std::make_tuple(methanol, 1) };
-    detail::ParticleSequencer              particleSequencer;
+    ParticleSequencer                      particleSequencer;
     particleSequencer.build(molecules);
     auto pairs = detail::sequenceIDs<HarmonicBondType>(molecules, particleSequencer);
 
@@ -360,8 +366,8 @@ TEST(NBlibTest, TopologyListedInteractionsMultipleTypes)
     Molecule water    = WaterMoleculeBuilder{}.waterMolecule();
     Molecule methanol = MethanolMoleculeBuilder{}.methanolMolecule();
 
-    CubicBondType testBond(1., 1., 1.);
-    DefaultAngle  testAngle(Degrees(1), 1);
+    CubicBondType     testBond(1., 1., 1.);
+    HarmonicAngleType testAngle(Degrees(1), 1);
 
     water.addInteraction(ParticleName("H1"), ParticleName("H2"), testBond);
     water.addInteraction(ParticleName("H1"), ParticleName("Oxygen"), ParticleName("H2"), testAngle);
@@ -383,7 +389,7 @@ TEST(NBlibTest, TopologyListedInteractionsMultipleTypes)
     auto  interactionData   = topology.getInteractionData();
     auto& harmonicBonds     = pickType<HarmonicBondType>(interactionData);
     auto& cubicBonds        = pickType<CubicBondType>(interactionData);
-    auto& angleInteractions = pickType<DefaultAngle>(interactionData);
+    auto& angleInteractions = pickType<HarmonicAngleType>(interactionData);
 
     HarmonicBondType              ohBond(1., 1.);
     HarmonicBondType              ohBondMethanol(1.01, 1.02);
@@ -407,9 +413,9 @@ TEST(NBlibTest, TopologyListedInteractionsMultipleTypes)
     EXPECT_EQ(cubicBondsReference, cubicBonds.parameters);
     EXPECT_EQ(cubicIndicesReference, cubicBonds.indices);
 
-    DefaultAngle                                methanolAngle(Degrees(108.52), 397.5);
-    std::vector<DefaultAngle>                   angleReference{ testAngle, methanolAngle };
-    std::vector<InteractionIndex<DefaultAngle>> angleIndicesReference{
+    HarmonicAngleType                                methanolAngle(Degrees(108.52), 397.5);
+    std::vector<HarmonicAngleType>                   angleReference{ testAngle, methanolAngle };
+    std::vector<InteractionIndex<HarmonicAngleType>> angleIndicesReference{
         { std::min(H1, H2), Ow, std::max(H1, H2), 0 }, { std::min(MeH1, MeO1), Me1, std::max(MeO1, MeH1), 1 }
     };
     EXPECT_EQ(angleReference, angleInteractions.parameters);
@@ -458,7 +464,7 @@ TEST(NBlibTest, toGmxExclusionBlockWorks)
     reference.push_back(localBlock);
     reference.push_back(localBlock);
 
-    std::vector<gmx::ExclusionBlock> probe = detail::toGmxExclusionBlock(testInput);
+    std::vector<gmx::ExclusionBlock> probe = toGmxExclusionBlock(testInput);
 
     ASSERT_EQ(reference.size(), probe.size());
     for (size_t i = 0; i < reference.size(); ++i)
index ca5b3df8c223e96f6473be3f1a1a26b5d1d020ab..acaea4999f2a25cce5fc775f78aa112c10122f55 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -42,6 +42,7 @@
  * \author Sebastian Keller <keller@cscs.ch>
  * \author Artem Zhmurov <zhmurov@gmail.com>
  */
+#include <algorithm>
 #include <numeric>
 
 #include "gromacs/topology/exclusionblocks.h"
 #include "gromacs/utility/smalloc.h"
 #include "nblib/exception.h"
 #include "nblib/particletype.h"
+#include "nblib/sequencing.hpp"
 #include "nblib/topology.h"
-#include "nblib/util/internal.h"
+#include "nblib/util/util.hpp"
+#include "nblib/topologyhelpers.h"
 
 namespace nblib
 {
 
 TopologyBuilder::TopologyBuilder() : numParticles_(0) {}
 
-gmx::ListOfLists<int> TopologyBuilder::createExclusionsListOfLists() const
+ExclusionLists<int> TopologyBuilder::createExclusionsLists() const
 {
     const auto& moleculesList = molecules_;
 
@@ -76,14 +79,12 @@ gmx::ListOfLists<int> TopologyBuilder::createExclusionsListOfLists() const
                 "No exclusions found in the " + molecule.name().value() + " molecule.";
         assert((!exclusions.empty() && message.c_str()));
 
-        std::vector<gmx::ExclusionBlock> exclusionBlockPerMolecule =
-                detail::toGmxExclusionBlock(exclusions);
+        std::vector<gmx::ExclusionBlock> exclusionBlockPerMolecule = toGmxExclusionBlock(exclusions);
 
         // duplicate the exclusionBlockPerMolecule for the number of Molecules of (numMols)
         for (size_t i = 0; i < numMols; ++i)
         {
-            auto offsetExclusions =
-                    detail::offsetGmxBlock(exclusionBlockPerMolecule, particleNumberOffset);
+            auto offsetExclusions = offsetGmxBlock(exclusionBlockPerMolecule, particleNumberOffset);
 
             std::copy(std::begin(offsetExclusions),
                       std::end(offsetExclusions),
@@ -99,10 +100,18 @@ gmx::ListOfLists<int> TopologyBuilder::createExclusionsListOfLists() const
         exclusionsListOfListsGlobal.pushBack(block.atomNumber);
     }
 
-    return exclusionsListOfListsGlobal;
+    std::vector<int>    listRanges(exclusionsListOfListsGlobal.listRangesView().begin(),
+                                exclusionsListOfListsGlobal.listRangesView().end());
+    std::vector<int>    listElements(exclusionsListOfListsGlobal.elementsView().begin(),
+                                  exclusionsListOfListsGlobal.elementsView().end());
+    ExclusionLists<int> exclusionListsGlobal;
+    exclusionListsGlobal.ListRanges   = std::move(listRanges);
+    exclusionListsGlobal.ListElements = std::move(listElements);
+
+    return exclusionListsGlobal;
 }
 
-ListedInteractionData TopologyBuilder::createInteractionData(const detail::ParticleSequencer& particleSequencer)
+ListedInteractionData TopologyBuilder::createInteractionData(const ParticleSequencer& particleSequencer)
 {
     ListedInteractionData interactionData;
 
@@ -194,11 +203,9 @@ Topology TopologyBuilder::buildTopology()
     }
     topology_.numParticles_ = numParticles_;
 
-    topology_.exclusions_ = createExclusionsListOfLists();
-    topology_.charges_    = extractParticleTypeQuantity<real>([](const auto& data, auto& map) {
-        ignore_unused(map);
-        return data.charge_;
-    });
+    topology_.exclusionLists_ = createExclusionsLists();
+    topology_.charges_        = extractParticleTypeQuantity<real>(
+            [](const auto& data, [[maybe_unused]] auto& map) { return data.charge_; });
 
     // map unique ParticleTypes to IDs
     std::unordered_map<std::string, int> nameToId;
@@ -209,12 +216,11 @@ Topology TopologyBuilder::buildTopology()
     }
 
     topology_.particleTypeIdOfAllParticles_ =
-            extractParticleTypeQuantity<int>([&nameToId](const auto& data, auto& map) {
-                ignore_unused(map);
+            extractParticleTypeQuantity<int>([&nameToId](const auto& data, [[maybe_unused]] auto& map) {
                 return nameToId[data.particleTypeName_];
             });
 
-    detail::ParticleSequencer particleSequencer;
+    ParticleSequencer particleSequencer;
     particleSequencer.build(molecules_);
     topology_.particleSequencer_ = std::move(particleSequencer);
 
@@ -322,9 +328,9 @@ CombinationRule Topology::getCombinationRule() const
     return combinationRule_;
 }
 
-gmx::ListOfLists<int> Topology::getGmxExclusions() const
+ExclusionLists<int> Topology::exclusionLists() const
 {
-    return exclusions_;
+    return exclusionLists_;
 }
 
 } // namespace nblib
index 93fb9faf3ea7b8162ce99597e99ebc23bea2f54f..1f7a1d883d9b18f427eb5f9ac267ec956df84d5f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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 "nblib/interactions.h"
 #include "nblib/listed_forces/definitions.h"
 #include "nblib/molecules.h"
-#include "nblib/topologyhelpers.h"
+#include "nblib/particlesequencer.h"
 
-namespace gmx
+namespace nblib
 {
-template<typename>
-class ListOfLists;
-} // namespace gmx
 
-namespace nblib
+/*! \brief A list of exclusion lists, optimized for performance
+ *
+ * This struct is to hold data that comes from, and will be copied into,
+ * gmx::ListOfLists. Since the ListElements and ListRanges are sufficient
+ * to create a gmx::ListOfLists, they are stored in the topoology instead
+ * of a gmx::ListOfLists to avoid dependencies.
+ */
+template<typename T>
+struct ExclusionLists
 {
+    //! Ranges of the concatenated lists
+    std::vector<int> ListRanges;
+    //! Elements of the concatenated lists
+    std::vector<T> ListElements;
+};
 
 /*! \inpublicapi
  * \ingroup nblib
@@ -86,8 +96,8 @@ public:
     //! Returns a vector of particles partial charges
     std::vector<real> getCharges() const;
 
-    //! Returns exclusions in proper, performant, GROMACS layout
-    gmx::ListOfLists<int> getGmxExclusions() const;
+    //! Returns exclusions in a format that can be used to create gmx::ListOfLists
+    ExclusionLists<int> exclusionLists() const;
 
     //! Returns the unique ID of a specific particle belonging to a molecule in the global space
     int sequenceID(MoleculeName moleculeName, int moleculeNr, ResidueName residueName, ParticleName particleName) const;
@@ -115,9 +125,9 @@ private:
     //! Storage for particles partial charges
     std::vector<real> charges_;
     //! Information about exclusions.
-    gmx::ListOfLists<int> exclusions_;
+    ExclusionLists<int> exclusionLists_;
     //! Associate molecule, residue and particle names with sequence numbers
-    detail::ParticleSequencer particleSequencer_;
+    ParticleSequencer particleSequencer_;
     //! Map that should hold all nonbonded interactions for all particle types
     NonBondedInteractionMap nonBondedInteractionMap_;
     //! data about bonds for all supported types
@@ -167,11 +177,11 @@ private:
     //! List of molecule types and number of molecules
     std::vector<std::tuple<Molecule, int>> molecules_;
 
-    //! Builds a GROMACS-compliant performant exclusions list aggregating exclusions from all molecules
-    gmx::ListOfLists<int> createExclusionsListOfLists() const;
+    //! Builds an exclusions list aggregating exclusions from all molecules
+    ExclusionLists<int> createExclusionsLists() const;
 
     //! Gather interaction data from molecules
-    ListedInteractionData createInteractionData(const detail::ParticleSequencer&);
+    ListedInteractionData createInteractionData(const ParticleSequencer&);
 
     //! Helper function to extract quantities like mass, charge, etc from the system
     template<typename T, class Extractor>
index 3a57ca375b4f96ed7e44b0f2359bcaded0a628de..0bb283b171ef1f0f9564d9bdaed892efcf0e968d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
  * \author Sebastian Keller <keller@cscs.ch>
  * \author Artem Zhmurov <zhmurov@gmail.com>
  */
-#include <numeric>
+
+#include <algorithm>
 
 #include "gromacs/topology/exclusionblocks.h"
-#include "gromacs/utility/smalloc.h"
-#include "nblib/exception.h"
-#include "nblib/listed_forces/transformations.h"
 #include "nblib/topologyhelpers.h"
-#include "nblib/util/internal.h"
 
 namespace nblib
 {
 
-namespace detail
-{
-
 std::vector<gmx::ExclusionBlock> toGmxExclusionBlock(const std::vector<std::tuple<int, int>>& tupleList)
 {
     std::vector<gmx::ExclusionBlock> ret;
@@ -111,266 +105,4 @@ std::vector<gmx::ExclusionBlock> offsetGmxBlock(std::vector<gmx::ExclusionBlock>
     return inBlock;
 }
 
-int ParticleSequencer::operator()(const MoleculeName& moleculeName,
-                                  int                 moleculeNr,
-                                  const ResidueName&  residueName,
-                                  const ParticleName& particleName) const
-{
-    try
-    {
-        return data_.at(moleculeName).at(moleculeNr).at(residueName).at(particleName);
-    }
-    catch (const std::out_of_range& outOfRange)
-    {
-        // TODO: use string format function once we have it
-        if (moleculeName.value() == residueName.value())
-        {
-            printf("No particle %s in residue %s in molecule %s found\n",
-                   particleName.value().c_str(),
-                   residueName.value().c_str(),
-                   moleculeName.value().c_str());
-        }
-        else
-        {
-            printf("No particle %s in molecule %s found\n",
-                   particleName.value().c_str(),
-                   moleculeName.value().c_str());
-        }
-
-        throw InputException(outOfRange.what());
-    };
-}
-
-void ParticleSequencer::build(const std::vector<std::tuple<Molecule, int>>& moleculesList)
-{
-    int currentID = 0;
-    for (auto& molNumberTuple : moleculesList)
-    {
-        const Molecule& molecule = std::get<0>(molNumberTuple);
-        const size_t    numMols  = std::get<1>(molNumberTuple);
-
-        auto& moleculeMap = data_[molecule.name()];
-
-        for (size_t i = 0; i < numMols; ++i)
-        {
-            auto& moleculeNrMap = moleculeMap[i];
-            for (int j = 0; j < molecule.numParticlesInMolecule(); ++j)
-            {
-                moleculeNrMap[molecule.residueName(j)][molecule.particleName(j)] = currentID++;
-            }
-        }
-    }
-}
-
-template<class I>
-std::tuple<std::vector<size_t>, std::vector<I>>
-collectInteractions(const std::vector<std::tuple<Molecule, int>>& molecules)
-{
-    std::vector<I>      collectedBonds;
-    std::vector<size_t> expansionArray;
-    for (auto& molNumberTuple : molecules)
-    {
-        const Molecule& molecule = std::get<0>(molNumberTuple);
-        size_t          numMols  = std::get<1>(molNumberTuple);
-
-        auto& interactions = pickType<I>(molecule.interactionData()).interactionTypes_;
-
-        std::vector<size_t> moleculeExpansion(interactions.size());
-        // assign indices to the bonds in the current molecule, continue counting from
-        // the number of bonds seen so far (=collectedBonds.size())
-        std::iota(begin(moleculeExpansion), end(moleculeExpansion), collectedBonds.size());
-
-        std::copy(begin(interactions), end(interactions), std::back_inserter(collectedBonds));
-
-        for (size_t i = 0; i < numMols; ++i)
-        {
-            std::copy(begin(moleculeExpansion), end(moleculeExpansion), std::back_inserter(expansionArray));
-        }
-    }
-    return std::make_tuple(expansionArray, collectedBonds);
-}
-
-/// \cond DO_NOT_DOCUMENT
-#define COLLECT_BONDS_INSTANTIATE_TEMPLATE(x)                                     \
-    template std::tuple<std::vector<size_t>, std::vector<x>> collectInteractions( \
-            const std::vector<std::tuple<Molecule, int>>&);
-MAP(COLLECT_BONDS_INSTANTIATE_TEMPLATE, SUPPORTED_LISTED_TYPES)
-/// \endcond
-
-namespace sequence_detail
-{
-
-//! Helper function to convert a tuple of strings into a particle index sequence
-template<class Tuple, class F, class... Args, size_t... Is>
-auto stringsToIndices_impl(const Tuple& tuple, std::index_sequence<Is...> is, F&& f, Args... args)
-{
-    // return std::make_tuple(f(args..., std::get<2 * Is + 1>(tuple), std::get<2 * Is>(tuple))...);
-    ignore_unused(is);
-    return std::array<int, sizeof...(Is)>{ f(
-            args..., std::get<2 * Is + 1>(tuple), std::get<2 * Is>(tuple))... };
-}
-
-/*! \brief
- *  This takes a tuple<(string, string) * nCenter> from molecule
- *  where nCenter = 2 for bonds, 3 for angles and 4 for dihedrals
- *  each (ResidueName, ParticleName)-pair is converted to a particle sequence index
- *  by calling the supplied function object f, containing the particleSequencer at the call site
- *  Therefore, the return type is tuple<int * nCenter>
- *
- */
-template<class Tuple, class F, class... Args>
-auto stringsToIndices(const Tuple& tuple, F&& f, Args... args)
-{
-    auto is = std::make_index_sequence<std::tuple_size<Tuple>::value / 2>{};
-    return stringsToIndices_impl(tuple, is, std::forward<F>(f), args...);
-}
-
-//! Tuple ordering for two center interactions
-[[maybe_unused]] static std::array<int, 2> nblibOrdering(const std::array<int, 2>& t)
-{
-    // for bonds (two coordinate indices),
-    // we choose to store the lower sequence ID first. this allows for better unit tests
-    // that are agnostic to how the input was set up
-    int id1 = std::min(std::get<0>(t), std::get<1>(t));
-    int id2 = std::max(std::get<0>(t), std::get<1>(t));
-
-    return std::array<int, 2>{ id1, id2 };
-}
-
-//! Tuple ordering for three center interactions
-[[maybe_unused]] static std::array<int, 3> nblibOrdering(const std::array<int, 3>& t)
-{
-    // for angles (three coordinate indices),
-    // we choose to store the two non-center coordinate indices sorted.
-    // such that ret[0] < ret[2] always (ret = returned tuple)
-    int id1 = std::min(std::get<0>(t), std::get<2>(t));
-    int id3 = std::max(std::get<0>(t), std::get<2>(t));
-
-    return std::array<int, 3>{ id1, std::get<1>(t), id3 };
-}
-
-//! Tuple ordering for four center interactions
-[[maybe_unused]] static std::array<int, 4> nblibOrdering(const std::array<int, 4>& t)
-{
-    return t;
-}
-
-//! Tuple ordering for five center interactions
-[[maybe_unused]] static std::array<int, 5> nblibOrdering(const std::array<int, 5>& t)
-{
-    return t;
-}
-
-} // namespace sequence_detail
-
-//! For each interaction, translate particle identifiers (moleculeName, nr, residueName,
-//! particleName) to particle coordinate indices
-template<class B>
-std::vector<CoordinateIndex<B>> sequenceIDs(const std::vector<std::tuple<Molecule, int>>& molecules,
-                                            const detail::ParticleSequencer& particleSequencer)
-{
-    std::vector<CoordinateIndex<B>> coordinateIndices;
-
-    auto callSequencer = [&particleSequencer](const MoleculeName& moleculeName,
-                                              int                 i,
-                                              const ResidueName&  residueName,
-                                              const ParticleName& particleName) {
-        return particleSequencer(moleculeName, i, residueName, particleName);
-    };
-
-    // loop over all molecules
-    for (const auto& molNumberTuple : molecules)
-    {
-        const Molecule& molecule = std::get<0>(molNumberTuple);
-        size_t          numMols  = std::get<1>(molNumberTuple);
-
-        for (size_t i = 0; i < numMols; ++i)
-        {
-            auto& interactions = pickType<B>(molecule.interactionData()).interactions_;
-            for (const auto& interactionString : interactions)
-            {
-                CoordinateIndex<B> index = sequence_detail::stringsToIndices(
-                        interactionString, callSequencer, molecule.name(), i);
-                coordinateIndices.push_back(nblibOrdering(index));
-            }
-        }
-    }
-    return coordinateIndices;
-}
-
-/// \cond DO_NOT_DOCUMENT
-#define SEQUENCE_PAIR_ID_INSTANTIATE_TEMPLATE(x)             \
-    template std::vector<CoordinateIndex<x>> sequenceIDs<x>( \
-            const std::vector<std::tuple<Molecule, int>>&, const detail::ParticleSequencer&);
-MAP(SEQUENCE_PAIR_ID_INSTANTIATE_TEMPLATE, SUPPORTED_LISTED_TYPES)
-#undef SEQUENCE_PAIR_ID_INSTANTIATE_TEMPLATE
-/// \endcond
-
-template<class I>
-std::tuple<std::vector<size_t>, std::vector<I>> eliminateDuplicateInteractions(const std::vector<I>& aggregatedInteractions)
-{
-    std::vector<size_t> uniqueIndices(aggregatedInteractions.size());
-    std::vector<I>      uniquInteractionsInstances;
-    // if there are no interactions of type B we're done now
-    if (aggregatedInteractions.empty())
-    {
-        return std::make_tuple(uniqueIndices, uniquInteractionsInstances);
-    }
-
-    // create 0,1,2,... sequence
-    std::iota(begin(uniqueIndices), end(uniqueIndices), 0);
-
-    std::vector<std::tuple<I, size_t>> enumeratedBonds(aggregatedInteractions.size());
-    // append each interaction with its index
-    std::transform(begin(aggregatedInteractions),
-                   end(aggregatedInteractions),
-                   begin(uniqueIndices),
-                   begin(enumeratedBonds),
-                   [](I b, size_t i) { return std::make_tuple(b, i); });
-
-    auto sortKey = [](const auto& t1, const auto& t2) { return std::get<0>(t1) < std::get<0>(t2); };
-    // sort w.r.t bonds. the result will contain contiguous segments of identical bond instances
-    // the associated int indicates the original index of each BondType instance in the input vector
-    std::sort(begin(enumeratedBonds), end(enumeratedBonds), sortKey);
-
-    // initialize it1 and it2 to delimit first range of equal BondType instances
-    auto range = std::equal_range(begin(enumeratedBonds), end(enumeratedBonds), enumeratedBonds[0], sortKey);
-    auto it1 = range.first;
-    auto it2 = range.second;
-
-    // number of unique instances of BondType B = number of contiguous segments in enumeratedBonds =
-    //         number of iterations in the outer while loop below
-    while (it1 != end(enumeratedBonds))
-    {
-        uniquInteractionsInstances.push_back(std::get<0>(*it1));
-
-        // loop over all identical BondType instances;
-        for (; it1 != it2; ++it1)
-        {
-            // we note down that the BondType instance at index <interactionIndex>
-            // can be found in the uniqueBondInstances container at index <uniqueBondInstances.size()>
-            int interactionIndex            = std::get<1>(*it1);
-            uniqueIndices[interactionIndex] = uniquInteractionsInstances.size() - 1;
-        }
-
-        // Note it1 has been incremented and is now equal to it2
-        if (it1 != end(enumeratedBonds))
-        {
-            it2 = std::upper_bound(it1, end(enumeratedBonds), *it1, sortKey);
-        }
-    }
-
-    return make_tuple(uniqueIndices, uniquInteractionsInstances);
-}
-
-/// \cond DO_NOT_DOCUMENT
-#define ELIMINATE_DUPLICATE_BONDS_INSTANTIATE_TEMPLATE(x)                                    \
-    template std::tuple<std::vector<size_t>, std::vector<x>> eliminateDuplicateInteractions( \
-            const std::vector<x>& aggregatedBonds);
-MAP(ELIMINATE_DUPLICATE_BONDS_INSTANTIATE_TEMPLATE, SUPPORTED_LISTED_TYPES)
-#undef ELIMINATE_DUPLICATE_BONDS_INSTANTIATE_TEMPLATE
-/// \endcond
-
-} // namespace detail
-
 } // namespace nblib
index 7e69b5fd673943238df77a16bc96ce10061a9220..e29a56b48c8de205b864912a32db435955715881 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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 NBLIB_TOPOLOGY_HELPERS_H
 
 #include <tuple>
-#include <unordered_map>
 #include <vector>
 
-#include "gromacs/utility/listoflists.h"
-#include "nblib/listed_forces/traits.h"
-#include "nblib/molecules.h"
 
 namespace gmx
 {
 struct ExclusionBlock;
-}
+} // namespace gmx
 
 namespace nblib
 {
 
-namespace detail
-{
-
 //! Converts tuples of particle indices to exclude to the gmx::ExclusionBlock format
 std::vector<gmx::ExclusionBlock> toGmxExclusionBlock(const std::vector<std::tuple<int, int>>& tupleList);
 
 //! Add offset to all indices in inBlock
 std::vector<gmx::ExclusionBlock> offsetGmxBlock(std::vector<gmx::ExclusionBlock> inBlock, int offset);
 
-/*!
- * \brief
- * Extract all interactions of type I from a vector of molecules. The second argument tuple element
- * specifies multiples of the molecule given as first tuple element. Let (S, I) denote the return
- * value tuple. Then J[i] = I[S[i]] for all i in 0...S.size() is the full sequence of BondType
- * instances as they occur in the input tuple
- *
- */
-template<class I>
-std::tuple<std::vector<size_t>, std::vector<I>>
-collectInteractions(const std::vector<std::tuple<Molecule, int>>&);
-
-#define COLLECT_BONDS_EXTERN_TEMPLATE(x)                                                 \
-    extern template std::tuple<std::vector<size_t>, std::vector<x>> collectInteractions( \
-            const std::vector<std::tuple<Molecule, int>>&);
-MAP(COLLECT_BONDS_EXTERN_TEMPLATE, SUPPORTED_TWO_CENTER_TYPES)
-#undef COLLECT_BONDS_EXTERN_TEMPLATE
-
-/*!
- * \brief
- * Return a list of unique BondType instances U and an index list S of size aggregatedBonds.size()
- * such that the BondType instance at aggregatedBonds[i] is equal to U[S[i]]
- * returns std::tuple(S, U)
- *
- */
-template<class I>
-std::tuple<std::vector<size_t>, std::vector<I>> eliminateDuplicateInteractions(const std::vector<I>& collectedBonds);
-
-/// \cond DO_NOT_DOCUMENT
-#define ELIMINATE_DUPLICATE_EXTERN_TEMPLATE(x)                                                      \
-    extern template std::tuple<std::vector<size_t>, std::vector<x>> eliminateDuplicateInteractions( \
-            const std::vector<x>& collectedBonds);
-MAP(ELIMINATE_DUPLICATE_EXTERN_TEMPLATE, SUPPORTED_LISTED_TYPES)
-#undef ELIMINATE_DUPLICATE_EXTERN_TEMPLATE
-/// \endcond
-
-//! Helper class for Topology to keep track of particle IDs
-class ParticleSequencer
-{
-    //! Alias for storing by (molecule name, molecule nr, residue name, particle name)
-    using DataType = std::unordered_map<
-            std::string,
-            std::unordered_map<int, std::unordered_map<std::string, std::unordered_map<std::string, int>>>>;
-
-public:
-    //! Build sequence from a list of molecules
-    void build(const std::vector<std::tuple<Molecule, int>>& moleculesList);
-
-    //! Access ID by (molecule name, molecule nr, residue name, particle name)
-    int operator()(const MoleculeName&, int, const ResidueName&, const ParticleName&) const;
-
-private:
-    DataType data_;
-};
-
-//!
-template<class B>
-std::vector<CoordinateIndex<B>> sequenceIDs(const std::vector<std::tuple<Molecule, int>>&,
-                                            const detail::ParticleSequencer&);
-
-/// \cond DO_NOT_DOCUMENT
-#define SEQUENCE_PAIR_ID_EXTERN_TEMPLATE(x)                         \
-    extern template std::vector<CoordinateIndex<x>> sequenceIDs<x>( \
-            const std::vector<std::tuple<Molecule, int>>&, const detail::ParticleSequencer&);
-MAP(SEQUENCE_PAIR_ID_EXTERN_TEMPLATE, SUPPORTED_LISTED_TYPES)
-#undef SEQUENCE_PAIR_ID_EXTERN_TEMPLATE
-/// \endcond
-
-} // namespace detail
-
 } // namespace nblib
 
 #endif // NBLIB_TOPOLOGY_HELPERS_H
index a695013688502ced21cd7d938f28226f99620979..933dc5a31739aa0f6c74e0a08d1578759cf6ddd0 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2020, by the GROMACS development team, led by
+# Copyright (c) 2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -31,7 +31,7 @@
 #
 # To help us fund GROMACS development, we humbly ask that you cite
 # the research papers on the package. Check out http://www.gromacs.org.
-#
+
 # \author Victor Holanda <victor.holanda@cscs.ch>
 # \author Joe Jordan <ejjordan@kth.se>
 # \author Prashanth Kanduri <kanduri@cscs.ch>
 
 target_sources(nblib
         PRIVATE
-        user.cpp
+        setup.cpp
         )
 
 if(GMX_INSTALL_NBLIB_API)
     install(FILES
-            user.h
+            setup.h
             DESTINATION include/nblib/util)
 endif()
 
similarity index 91%
rename from api/nblib/util/user.cpp
rename to api/nblib/util/setup.cpp
index 3c087f8f976a2f03b3b4076aabd7bc609344b357..a6521e9cccec601832120ff2d5691ad8aa0808f8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -43,8 +43,7 @@
  * \author Artem Zhmurov <zhmurov@gmail.com>
  */
 
-#include "nblib/util/internal.h"
-#include "nblib/util/user.h"
+#include "nblib/util/setup.h"
 #include "gromacs/random/tabulatednormaldistribution.h"
 #include "gromacs/random/threefry.h"
 #include "gromacs/utility/arrayref.h"
 namespace nblib
 {
 
-namespace detail
-{
-
-std::string next_token(std::string& s, const std::string& delimiter)
-{
-    std::string token = s.substr(0, s.find(delimiter));
-
-    std::size_t next = s.find(delimiter);
-    if (next == std::string::npos)
-        s.clear();
-    else
-        s.erase(0, next + delimiter.length());
-
-    return token;
-}
-
-} // namespace detail
-
 //! Generates an array of particle velocities based on the Maxwell-Boltzmann distribution
 //! using temperature, masses and a random number generator
 static std::vector<Vec3> low_mspeed(real tempi, std::vector<real> const& masses, gmx::ThreeFry2x64<>* rng)
diff --git a/api/nblib/util/setup.h b/api/nblib/util/setup.h
new file mode 100644 (file)
index 0000000..b7d2600
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and 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.
+ */
+/*! \inpublicapi \file
+ * \brief
+ * Implements nblib utilities for system setup
+ *
+ * \author Victor Holanda <victor.holanda@cscs.ch>
+ * \author Joe Jordan <ejjordan@kth.se>
+ * \author Prashanth Kanduri <kanduri@cscs.ch>
+ * \author Sebastian Keller <keller@cscs.ch>
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ */
+
+#ifndef NBLIB_UTIL_SETUP_H
+#define NBLIB_UTIL_SETUP_H
+
+#include <functional>
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <tuple>
+#include <type_traits>
+#include <vector>
+
+#include "nblib/basicdefinitions.h"
+#include "nblib/vector.h"
+
+namespace gmx
+{
+template<typename T>
+class ArrayRef;
+} // namespace gmx
+
+namespace nblib
+{
+
+/*! \brief Generate velocities from a Maxwell Boltzmann distribution
+ *
+ * masses should be the same as the ones specified for the Topology object
+ */
+std::vector<Vec3> generateVelocity(real Temperature, unsigned int seed, std::vector<real> const& masses);
+
+//! \brief Check within the container of gmx::RVecs for a NaN or inf
+bool isRealValued(gmx::ArrayRef<const Vec3> values);
+
+//! \brief Zero a cartesian buffer
+void zeroCartesianArray(gmx::ArrayRef<Vec3> cartesianArray);
+
+} // namespace nblib
+
+#endif // NBLIB_UTIL_SETUP_H
index 2cc78abdb9a0352529a57e0e092ab5c1c86bb339..9780a39b916ca9618b24bb3a5f1b5a85f7b3ce8a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2020, by the GROMACS development team, led by
+# Copyright (c) 2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -31,7 +31,7 @@
 #
 # To help us fund GROMACS development, we humbly ask that you cite
 # the research papers on the package. Check out http://www.gromacs.org.
-#
+
 # \author Victor Holanda <victor.holanda@cscs.ch>
 # \author Joe Jordan <ejjordan@kth.se>
 # \author Prashanth Kanduri <kanduri@cscs.ch>
@@ -44,8 +44,8 @@ set(exename "nblib-util-test")
 gmx_add_gtest_executable(
         ${exename}
         CPP_SOURCE_FILES
-        internal.cpp
-        user.cpp
+        setup.cpp
+        traits.cpp
 )
 target_link_libraries(${exename} PRIVATE nblib_test_infrastructure nblib)
 gmx_register_gtest_test(${testname} ${exename})
similarity index 97%
rename from api/nblib/util/tests/user.cpp
rename to api/nblib/util/tests/setup.cpp
index b44f76f08da087c847b211c7eda84a13d80b7d89..fb59d06e4d4517175971a29084ecdf5a97d70478 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -44,7 +44,7 @@
 #include <vector>
 
 #include "nblib/tests/testhelpers.h"
-#include "nblib/util/user.h"
+#include "nblib/util/setup.h"
 
 #include "testutils/testasserts.h"
 
similarity index 74%
rename from api/nblib/util/tests/internal.cpp
rename to api/nblib/util/tests/traits.cpp
index c8257ed065e0a99fac6a161d7a915e849dba1de7..acc3055423edf00ad841ad902dfd22f81d99904f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -34,7 +34,7 @@
  */
 /*! \internal \file
  * \brief
- * This implements basic nblib utility tests
+ * This implements test for nblib general purpose traits
  *
  * \author Victor Holanda <victor.holanda@cscs.ch>
  * \author Joe Jordan <ejjordan@kth.se>
  */
 
 #include "nblib/tests/testhelpers.h"
-#include "nblib/util/internal.h"
-#include "nblib/util/user.h"
+#include "nblib/util/traits.hpp"
 
 namespace nblib
 {
 
-TEST(NblibInternalUtils, FindIndexTuple1)
+TEST(NblibTraitsUtils, FuseTwo)
+{
+    using TL1 = TypeList<float, int>;
+    using TL2 = TypeList<double, unsigned>;
+
+    using TL_fused = FuseTwo<TL1, TL2>;
+    using TL_ref   = TypeList<float, int, double, unsigned>;
+
+    constexpr bool match = std::is_same_v<TL_fused, TL_ref>;
+    EXPECT_TRUE(match);
+}
+
+TEST(NblibTraitsUtils, Fuse)
+{
+    using TL1 = TypeList<float, int>;
+    using TL2 = TypeList<double, unsigned>;
+    using TL3 = TypeList<char, short>;
+
+    using TL_fused = Fuse<TL1, TL2, TL3>;
+    using TL_ref   = TypeList<float, int, double, unsigned, char, short>;
+
+    constexpr bool match = std::is_same_v<TL_fused, TL_ref>;
+    EXPECT_TRUE(match);
+}
+
+TEST(NblibTraitsUtils, Repeat)
+{
+    using TL1 = TypeList<float, int>;
+
+    using TL_repeated = Repeat<TL1, 3>;
+    using TL_ref      = TypeList<float, int, float, int, float, int>;
+
+    constexpr bool match = std::is_same_v<TL_repeated, TL_ref>;
+    EXPECT_TRUE(match);
+}
+
+TEST(NblibTraitsUtils, FindIndexTuple1)
 {
     using TupleType = std::tuple<float>;
 
@@ -61,7 +96,7 @@ TEST(NblibInternalUtils, FindIndexTuple1)
     EXPECT_EQ(1, outOfRange);
 }
 
-TEST(NblibInternalUtils, FindIndexTuple2)
+TEST(NblibTraitsUtils, FindIndexTuple2)
 {
     using TupleType = std::tuple<float, int>;
 
@@ -75,7 +110,7 @@ TEST(NblibInternalUtils, FindIndexTuple2)
     EXPECT_EQ(2, outOfRange);
 }
 
-TEST(NblibInternalUtils, FindIndexTypeList1)
+TEST(NblibTraitsUtils, FindIndexTypeList1)
 {
     using ListType = TypeList<float>;
 
@@ -87,7 +122,7 @@ TEST(NblibInternalUtils, FindIndexTypeList1)
     EXPECT_EQ(1, outOfRange);
 }
 
-TEST(NblibInternalUtils, FindIndexTypeList2)
+TEST(NblibTraitsUtils, FindIndexTypeList2)
 {
     using ListType = TypeList<float, int>;
 
@@ -102,7 +137,7 @@ TEST(NblibInternalUtils, FindIndexTypeList2)
 }
 
 
-TEST(NblibInternalUtils, Contains)
+TEST(NblibTraitsUtils, Contains)
 {
     using ListType = TypeList<float, int>;
 
@@ -115,7 +150,7 @@ TEST(NblibInternalUtils, Contains)
     EXPECT_FALSE(hasUint);
 }
 
-TEST(NblibInternalUtils, FindIndexTupleRepeated)
+TEST(NblibTraitsUtils, FindIndexTupleRepeated)
 {
     using TupleType = std::tuple<float, float, int>;
 
@@ -130,7 +165,7 @@ TEST(NblibInternalUtils, FindIndexTupleRepeated)
     EXPECT_EQ(3, outOfRange);
 }
 
-TEST(NblibInternalUtils, FindIndexTypeListRepeated)
+TEST(NblibTraitsUtils, FindIndexTypeListRepeated)
 {
     using TupleType = TypeList<float, float, int>;
 
similarity index 54%
rename from api/nblib/util/internal.h
rename to api/nblib/util/traits.hpp
index 32b041a3e0ba1d6cc59bdb04bddb514b8a48b22c..d77c219f0c24dc0e76178e4566ab2b823e4109d6 100644 (file)
@@ -34,7 +34,7 @@
  */
 /*! \inpublicapi \file
  * \brief
- * Implements nblib utilities
+ * Implements general purpose STL-like type traits
  *
  * \author Victor Holanda <victor.holanda@cscs.ch>
  * \author Joe Jordan <ejjordan@kth.se>
@@ -43,8 +43,8 @@
  * \author Artem Zhmurov <zhmurov@gmail.com>
  */
 
-#ifndef NBLIB_UTIL_INTERNAL_H
-#define NBLIB_UTIL_INTERNAL_H
+#ifndef NBLIB_UTIL_TRAITS_HPP
+#define NBLIB_UTIL_TRAITS_HPP
 
 #include <cassert>
 
 namespace nblib
 {
 
+//! \brief Base template for a holder of entries of different data types
+template<class... Ts>
+struct TypeList
+{
+};
+
 namespace detail
 {
-//! Format strings for use in error messages
-std::string next_token(std::string& s, const std::string& delimiter);
+//! \brief unimplemented base template
+template<template<class...> class P, class L>
+struct [[maybe_unused]] Map_;
+
+/*! \brief Implementation of Map_
+ *
+ * This is a specialization of the Map_ base template
+ * for the case that the L template parameter itself has template parameters
+ * in this case, the template parameters of L are caught in Ts...
+ *
+ */
+template<template<class...> class P, template<class...> class L, class... Ts>
+struct Map_<P, L<Ts...>>
+{
+    // resulting type is a TypeList of the P-template instantiated
+    // with all template parameters of L
+    typedef TypeList<P<Ts>...> type;
+};
+
+//! \brief unimplemented base template
+template<template<class...> class P, class L>
+struct [[maybe_unused]] Reduce_;
+
+//! \brief Implementation of Reduce_
+template<template<class...> class P, template<class...> class L, class... Ts>
+struct Reduce_<P, L<Ts...>>
+{
+    typedef P<Ts...> type;
+};
+
+//! \brief unimplemented base template
+template<class L1, class L2>
+struct [[maybe_unused]] FuseTwo_;
+
+//! \brief implementation of FuseTwo_
+template<template<class...> class L1, template<class...> class L2, class... Ts1, class... Ts2>
+struct FuseTwo_<L1<Ts1...>, L2<Ts2...>>
+{
+    typedef TypeList<Ts1..., Ts2...> type;
+};
+
+//! \brief unimplemented base template
+template<class... Ls>
+struct [[maybe_unused]] Fuse_;
+
+//! \brief recursion endpoint
+template<class L>
+struct Fuse_<L>
+{
+    typedef L type;
+};
+
+//! \brief recurse until only one type is left
+template<class L1, class L2, class... Ls>
+struct Fuse_<L1, L2, Ls...>
+{
+    typedef typename Fuse_<typename FuseTwo_<L1, L2>::type, Ls...>::type type;
+};
+
+
+//! \brief keep adding the template parameter pack to the type list
+template<class L, int N, class... Ts>
+struct RepeatHelper_
+{
+    typedef typename RepeatHelper_<typename FuseTwo_<L, TypeList<Ts...>>::type, N - 1, Ts...>::type type;
+};
+
+//! \brief stop recurision
+template<class L, class... Ts>
+struct RepeatHelper_<L, 1, Ts...>
+{
+    typedef L type;
+};
+
+//! \brief base case
+template<class L, int N, class = void>
+struct Repeat_
+{
+};
+
+//! \brief capture original template parameter pack, protect against N < 1
+template<template<class...> class L, int N, class... Ts>
+struct Repeat_<L<Ts...>, N, std::enable_if_t<N >= 1>>
+{
+    typedef typename RepeatHelper_<L<Ts...>, N, Ts...>::type type;
+};
+
 
 // Like std::void_t but for values
 template<auto...>
 using void_value_t = void;
 
-template<class... Tuples>
-using tuple_cat_t = decltype(std::tuple_cat(Tuples{}...));
-
 template<class T, class = void>
 struct HasValueMember : std::false_type
 {
@@ -102,8 +190,8 @@ using AccessTypeMemberIfPresent_t = typename AccessTypeMemberIfPresent<T>::type;
  */
 template<int N, typename T, typename Tuple>
 struct MatchTypeOrTypeMember :
-    std::disjunction<std::is_same<T, std::tuple_element_t<N, Tuple>>,
-                     std::is_same<T, AccessTypeMemberIfPresent_t<std::tuple_element_t<N, Tuple>>>>
+        std::disjunction<std::is_same<T, std::tuple_element_t<N, Tuple>>,
+                std::is_same<T, AccessTypeMemberIfPresent_t<std::tuple_element_t<N, Tuple>>>>
 {
 };
 
@@ -116,12 +204,47 @@ struct MatchField_ : std::integral_constant<size_t, MatchField_<N + 1, T, Tuple,
 //! \brief recursion stop when Comparison<N, T, Tuple>::value is true
 template<int N, class T, class Tuple, template<int, class, class> class Comparison>
 struct MatchField_<N, T, Tuple, Comparison, std::enable_if_t<Comparison<N, T, Tuple>{}>> :
-    std::integral_constant<size_t, N>
+        std::integral_constant<size_t, N>
 {
 };
 
 } // namespace detail
 
+/*! \brief Create a TypeList of P instantiated with each template parameter of L
+ *
+ * returns TypeList<P<Ts>...>, with Ts... = template parameters of L
+ * does not compile if L has no template parameters
+ */
+template<template<class...> class P, class L>
+using Map = typename detail::Map_<P, L>::type;
+
+/*! \brief Base template for expressing a datatype P templated with all the entries in type list L
+ *
+ * The result is P instantiated with all the template parameters of L
+ */
+template<template<class...> class P, class L>
+using Reduce = typename detail::Reduce_<P, L>::type;
+
+//! \brief Concatenates template parameters of two variadic templates into a TypeList
+template<class... Ls>
+using FuseTwo = typename detail::FuseTwo_<Ls...>::type;
+
+/*! \brief This traits concatenates an arbitrary number of variadic templates into a single TypeList
+ *
+ * For clarity reasons, the fuse operation to fuse two lists into one has been decoupled
+ * into a separate trait from the handling of the recursion over the variadic arguments.
+ */
+template<class... Ls>
+using Fuse = typename detail::Fuse_<Ls...>::type;
+
+/*! \brief Repeat the template parameters of L N times
+ *
+ * L must have template parameters
+ * N must be bigger than 0
+ * Repeated types are put in a TypeList
+ */
+template<class L, int N>
+using Repeat = typename detail::Repeat_<L, N>::type;
 
 /*! \brief Meta function to return the first index in Tuple whose type matches T
  *
@@ -167,51 +290,20 @@ struct Contains
 {
 };
 
-//! this formatting must be a bug in clang-format... should be:
-// struct Contains<T, TL<Ts...>> : std::bool_constant<FindIndex<T, TL<Ts...>>{} < sizeof...(Ts)>
+/*! \brief implementation of the Contains trait to look for T in TL
+ *
+ * @tparam T   type to look for in TL
+ * @tparam TL  a variadic type, such as std::tuple or TypeList
+ * @tparam Ts  the template parameters of TL
+ *
+ * Note that this clang-format enforced formatting is unfortunate, it should be:
+ * struct Contains<T, TL<Ts...>> : std::bool_constant<FindIndex<T, TL<Ts...>>{} < sizeof...(Ts)>
+ */
 template<class T, template<class...> class TL, class... Ts>
         struct Contains<T, TL<Ts...>> : std::bool_constant < FindIndex<T, TL<Ts...>>{}<sizeof...(Ts)>
 {
 };
 
-
-//! Utility to call function with each element in tuple_
-template<class F, class... Ts>
-void for_each_tuple(F&& func, std::tuple<Ts...>& tuple_)
-{
-    std::apply(
-            [f = func](auto&... args) {
-                [[maybe_unused]] auto list = std::initializer_list<int>{ (f(args), 0)... };
-            },
-            tuple_);
-}
-
-//! Utility to call function with each element in tuple_ with const guarantee
-template<class F, class... Ts>
-void for_each_tuple(F&& func, const std::tuple<Ts...>& tuple_)
-{
-    std::apply(
-            [f = func](auto&... args) {
-                [[maybe_unused]] auto list = std::initializer_list<int>{ (f(args), 0)... };
-            },
-            tuple_);
-}
-
-//! Format strings for use in error messages
-template<class... Args>
-std::string formatString(std::string fmt, Args... args)
-{
-    std::ostringstream os;
-    std::string        delimiter = "{}";
-
-    std::initializer_list<int> unused{ 0, (os << detail::next_token(fmt, delimiter) << args, 0)... };
-    static_cast<void>(unused); // unused is not actually used
-
-    os << detail::next_token(fmt, delimiter);
-
-    return os.str();
-}
-
 } // namespace nblib
 
-#endif // NBLIB_UTIL_INTERNAL_H
+#endif // NBLIB_UTIL_TRAITS_HPP
similarity index 60%
rename from api/nblib/util/user.h
rename to api/nblib/util/util.hpp
index 148e114051cfaac64cf0619530c4548ececb1837..2cb01dec0a9b6c379d5c0e91ffa631db619d7e03 100644 (file)
  * \author Artem Zhmurov <zhmurov@gmail.com>
  */
 
-#ifndef NBLIB_UTIL_USER_H
-#define NBLIB_UTIL_USER_H
+#ifndef NBLIB_UTIL_UTIL_HPP
+#define NBLIB_UTIL_UTIL_HPP
+
+#include <cassert>
 
-#include <functional>
-#include <iostream>
 #include <sstream>
 #include <string>
 #include <tuple>
 #include <type_traits>
 #include <vector>
 
-#include "nblib/basicdefinitions.h"
-#include "nblib/ppmap.h"
-#include "nblib/vector.h"
-
-namespace gmx
-{
-template<typename T>
-class ArrayRef;
-} // namespace gmx
-
 namespace nblib
 {
 
-//! Generate velocities from a Maxwell Boltzmann distribution, masses should be the
-//! same as the ones specified for the Topology object
-std::vector<Vec3> generateVelocity(real Temperature, unsigned int seed, std::vector<real> const& masses);
-
-//! Check within the container of gmx::RVecs for a NaN or inf
-bool isRealValued(gmx::ArrayRef<const Vec3> values);
-
-//! Zero a cartesian buffer
-void zeroCartesianArray(gmx::ArrayRef<Vec3> cartesianArray);
-
-//! Used to ignore unused arguments of a lambda functions
-inline void ignore_unused() {}
-
-//! Variadic argument version of the ignore_unused function
-template<class T, class... Ts>
-inline void ignore_unused(T& x, Ts&... xs)
-{
-    static_cast<void>(x);
-    ignore_unused(xs...);
-}
-
 /*! \brief A template to create structs as a type-safe alternative to using declarations
  *
  * \inpublicapi
@@ -135,8 +104,12 @@ private:
     T value_;
 };
 
-//! Equality comparison. For the case where a comparison between StrongTypes with matching T, but differing Phantom
-//! parameters is desired, the underlying value attribute should be compared instead
+/*! \brief StrongType equality comparison
+ *
+ * Requires that both T and Phantom template parameters match.
+ * For the case where a comparison between StrongTypes with matching T, but differing Phantom
+ * parameters is desired, the underlying value attribute should be compared instead
+ */
 template<class T, class Phantom>
 [[maybe_unused]] inline bool operator==(const StrongType<T, Phantom>& lhs, const StrongType<T, Phantom>& rhs)
 {
@@ -157,53 +130,56 @@ inline bool operator>(const StrongType<T, Phantom>& lhs, const StrongType<T, Pha
     return lhs.value() > rhs.value();
 }
 
-
-//! Base template for a holder of entries of different data types
-template<class... Ts>
-struct TypeList
+//! \brief Utility to call function with each element in tuple_
+template<class F, class... Ts>
+void for_each_tuple(F&& func, std::tuple<Ts...>& tuple_)
 {
-};
+    std::apply(
+            [f = func](auto&... args) {
+                [[maybe_unused]] auto list = std::initializer_list<int>{ (f(args), 0)... };
+            },
+            tuple_);
+}
 
-//! Base template for mapping between a datatype P templated separately with instances of type list L
-template<template<class...> class P, class L>
-struct Map_
+//! \brief Utility to call function with each element in tuple_ with const guarantee
+template<class F, class... Ts>
+void for_each_tuple(F&& func, const std::tuple<Ts...>& tuple_)
 {
-};
+    std::apply(
+            [f = func](auto&... args) {
+                [[maybe_unused]] auto list = std::initializer_list<int>{ (f(args), 0)... };
+            },
+            tuple_);
+}
 
-//! this is a specialization of the Map_ base template
-//! for the case that the L template parameter itself has template parameters
-//! in this case, the template parameters of L are caught in Ts...
-template<template<class...> class P, template<class...> class L, class... Ts>
-struct Map_<P, L<Ts...>>
+//! \brief Format strings for use in error messages
+template<class... Args>
+std::string formatString(std::string fmt, Args... args)
 {
-    //! resulting type is a TypeList of the P-template instantiated
-    //! with all template parameters of L
-    typedef TypeList<P<Ts>...> type;
-};
+    std::ostringstream os;
+    std::string        delimiter = "{}";
 
-//! Maps a datatype P to create instances where each is templated with entries of type list L
-template<template<class...> class P, class L>
-using Map = typename Map_<P, L>::type;
+    auto next_token = [](std::string& s, const std::string& delimiter_)
+    {
+        std::string token = s.substr(0, s.find(delimiter_));
 
-//! Base template for expressing a datatype P templated with all the entries in type list L
-template<template<class...> class P, class L>
-struct Reduce_
-{
-};
+        std::size_t next = s.find(delimiter_);
+        if (next == std::string::npos)
+            s.clear();
+        else
+            s.erase(0, next + delimiter_.length());
 
-//! Specialization of the Reduce_ base template
-template<template<class...> class P, template<class...> class L, class... Ts>
-struct Reduce_<P, L<Ts...>>
-{
-    //! resulting type is P instantiated
-    //! with all template parameters of L
-    typedef P<Ts...> type;
-};
+        return token;
+    };
 
-//! Expresses a data type P instantiated with all the entries in list L as template arguments
-template<template<class...> class P, class L>
-using Reduce = typename Reduce_<P, L>::type;
+    [[maybe_unused]]
+    std::initializer_list<int> unused{ 0, (os << next_token(fmt, delimiter) << args, 0)... };
+
+    os << next_token(fmt, delimiter);
+
+    return os.str();
+}
 
 } // namespace nblib
 
-#endif // NBLIB_UTIL_USER_H
+#endif // NBLIB_UTIL_UTIL_HPP
index 4adec4c4a47a8b36426794399cab5fc4cb8894a0..eb32f4c075ea6c582297ad527739397a824253ee 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
index 68b9c6fafaae35f73a191551200a539e7ab526e3..72b85bcc66842d020e6e3982d7d75b4c30a3d5fa 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2020, by the GROMACS development team, led by
+# Copyright (c) 2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
 # GEN_VERSION_INFO_INTERNAL has to be set ON.
 #
 # The following variables have to be previously defined:
-# PROJECT_VERSION         - hard-coded version string (generated info is appended)
-# PROJECT_SOURCE_DIR      - top level source directory
-# DIRECTORIES_TO_CHECKSUM - List of directories to hash
-# VERSION_CMAKEIN         - path to an input template file
-# VERSION_OUT             - path to the output file
+# PROJECT_VERSION               - hard-coded version string (generated info is appended)
+# PROJECT_SOURCE_DIR            - top level source directory
+# SOURCE_IS_SOURCE_DISTRIBUTION - Whether we are building from source or tarball
+# DIRECTORIES_TO_CHECKSUM       - List of directories to hash
+# VERSION_CMAKEIN               - path to an input template file
+# VERSION_OUT                   - path to the output file
 #
 # The following a possible additional definitions
-# PYTHON_EXECUTABLE       - Needed to run checking stage of current tree
-# VERSION_STRING_OF_FORK  - Possibly defined custom version string to override
-#                          process of checking source file hashes.
+# PYTHON_EXECUTABLE             - Needed to run checking stage of current tree
+# VERSION_STRING_OF_FORK        - Possibly defined custom version string to override
+#                                 process of checking source file hashes.
 # Output:
 # VERSION_OUT is configured from the input VERSION_CMAKEIN
 # using the variables listed below.
@@ -81,6 +82,9 @@ endif()
 if ("${VERSION_OUT}" STREQUAL "")
     message(FATAL_ERROR "Missing input parameter VERSION_OUT!")
 endif()
+if ("${SOURCE_IS_SOURCE_DISTRIBUTION}" STREQUAL "")
+    message(FATAL_ERROR "SOURCE_IS_SOURCE_DISTRIBUTION undefined!")
+endif()
 
 # Prepare version string to populate
 set(GMX_VERSION_STRING_FULL          ${PROJECT_VERSION})
index 99ed210e4b2efd43f67c77b4158b4711306fab92..bc6372c9658ed1b1fb41df9960070bcc8e2ed802 100644 (file)
@@ -2,7 +2,7 @@
 # This file is part of the GROMACS molecular simulation package.
 #
 # Copyright (c) 2014,2015,2016,2017,2018 by the GROMACS development team.
-# Copyright (c) 2019,2020, by the GROMACS development team, led by
+# Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -263,7 +263,7 @@ set(REGRESSIONTEST_BRANCH "master")
 # 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 "ca12c40c20575df76b1b8b1a351cb7b0" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
+set(REGRESSIONTEST_MD5SUM "c9b6b2f0754b113efc44c738897a26f7" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
 
 math(EXPR GMX_VERSION_NUMERIC
      "${GMX_VERSION_MAJOR}*10000 + ${GMX_VERSION_PATCH}")
@@ -412,6 +412,7 @@ else()
             -D VERSION_CMAKEIN=${VERSION_INFO_CMAKEIN_FILE_PARTIAL}
             -D VERSION_OUT=${VERSION_INFO_CMAKE_FILE}
             -D VERSION_STRING_OF_FORK=${GMX_VERSION_STRING_OF_FORK}
+            -D SOURCE_IS_SOURCE_DISTRIBUTION=${SOURCE_IS_SOURCE_DISTRIBUTION}
             -P ${CMAKE_CURRENT_LIST_DIR}/gmxGenerateVersionInfoWithoutGit.cmake
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
         COMMENT "Generating release version information")
@@ -435,7 +436,7 @@ set(CHECKSUM_FILE "${PROJECT_SOURCE_DIR}/src/reference_checksum")
 # not been tampered with.
 # Note: The RUN_ALWAYS here is to regenerate the hash file only, it does not
 # mean that the target is run in all builds
-if (PYTHONINTERP_FOUND)
+if (Python3_Interpreter_FOUND)
     # We need the full path to the directories after passing it through
     set(FULL_PATH_DIRECTORIES "")
     foreach(DIR ${SET_OF_DIRECTORIES_TO_CHECKSUM})
@@ -452,7 +453,7 @@ if (PYTHONINTERP_FOUND)
 else()
     add_custom_target(reference_checksum
         COMMAND ${CMAKE_COMMAND} -E echo
-        "Can not checksum files without python being available"
+        "Can not checksum files without python3 being available"
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
         COMMENT "Generating reference checksum of source files")
 endif()
index 662026c08983bd3ed8aef138d49f956b30eb6d1a..be5483dbd4bcb1e47605e91c193195359a77a962 100644 (file)
@@ -2,7 +2,7 @@
 # This file is part of the GROMACS molecular simulation package.
 #
 # Copyright (c) 2014,2015,2016,2017,2018 by the GROMACS development team.
-# Copyright (c) 2019,2020, by the GROMACS development team, led by
+# Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -173,7 +173,7 @@ if (SPHINX_FOUND)
         reference-manual/references.rst
         # PNG formated plot files that don't need to be converted into PNG
         # for the web page.
-        reference-manual/plots/peregrine.png
+       reference-manual/plots/GMX_logos/gmx_falcon_blue.png
         reference-manual/plots/adress.png
         reference-manual/plots/plotje.png
         reference-manual/plots/xvgr.png
@@ -305,6 +305,7 @@ if (SPHINX_FOUND)
         reference-manual/special/plots/equipotential.pdf
         reference-manual/special/plots/field.pdf
         reference-manual/special/plots/gaussians.pdf
+        reference-manual/special/plots/lambda-values.pdf
         reference-manual/special/plots/pulldirrel.pdf
         reference-manual/special/plots/pull.pdf
         reference-manual/special/plots/pullref.pdf
@@ -372,6 +373,7 @@ if (SPHINX_FOUND)
         release-notes/2022/major/deprecated-functionality.rst
         release-notes/2022/major/portability.rst
         release-notes/2022/major/miscellaneous.rst
+        release-notes/2021/2021.1.rst
         release-notes/2021/major/highlights.rst
         release-notes/2021/major/features.rst
         release-notes/2021/major/performance.rst
@@ -386,6 +388,7 @@ if (SPHINX_FOUND)
         release-notes/2020/2020.3.rst
         release-notes/2020/2020.4.rst
         release-notes/2020/2020.5.rst
+        release-notes/2020/2020.6.rst
         release-notes/2020/major/highlights.rst
         release-notes/2020/major/features.rst
         release-notes/2020/major/performance.rst
index c5993c6a09e4f8f864fd7c47c93499f2c61fd25c..43e52fef29b7a08db18baf3aa968c41a01926001 100644 (file)
@@ -2,7 +2,7 @@
 # This file is part of the GROMACS molecular simulation package.
 #
 # Copyright (c) 2015,2016,2017,2018,2019 by the GROMACS development team.
-# Copyright (c) 2020, by the GROMACS development team, led by
+# Copyright (c) 2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -203,10 +203,10 @@ rst_epilog += """
 .. |Gromacs| replace:: GROMACS
 .. _gmx-manual: manual-{gmx_version_string}.pdf
 .. _gmx-manual-parent-dir: ../manual-{gmx_version_string}.pdf
-.. |gmx-source-package-ftp| replace:: As ftp ftp://ftp.gromacs.org/pub/gromacs/gromacs-{gmx_version_string}.tar.gz
-.. |gmx-source-package-http| replace:: As http http://ftp.gromacs.org/pub/gromacs/gromacs-{gmx_version_string}.tar.gz
-.. |gmx-regressiontests-package| replace:: http://ftp.gromacs.org/pub/regressiontests/regressiontests-{regressiontest_version}.tar.gz
-.. _up-to-date installation instructions: http://manual.gromacs.org/documentation/current/install-guide/index.html
+.. |gmx-source-package-ftp| replace:: As ftp ftp://ftp.gromacs.org/gromacs/gromacs-{gmx_version_string}.tar.gz
+.. |gmx-source-package-http| replace:: As https https://ftp.gromacs.org/gromacs/gromacs-{gmx_version_string}.tar.gz
+.. |gmx-regressiontests-package| replace:: https://ftp.gromacs.org/regressiontests/regressiontests-{regressiontest_version}.tar.gz
+.. _up-to-date installation instructions: https://manual.gromacs.org/documentation/current/install-guide/index.html
 .. _CUDA: http://www.nvidia.com/object/cuda_home_new.html
 .. _OpenCL: https://www.khronos.org/opencl/
 .. _OpenMPI: http://www.open-mpi.org
@@ -224,8 +224,8 @@ rst_epilog += """
 .. _VMD: http://www.ks.uiuc.edu/Research/vmd/
 .. _PyMOL: http://www.pymol.org
 .. _webpage: http://www.gromacs.org
-.. _ftp site: ftp://ftp.gromacs.org/pub/gromacs/
-.. _tutorials: http://www.gromacs.org/Documentation/Tutorials
+.. _ftp site: ftp://ftp.gromacs.org/gromacs/
+.. _tutorials: http://www.mdtutorials.com/gmx/
 .. _issue tracker: https://gitlab.com/gromacs/gromacs/-/issues/
 .. _gitlab: https://gitlab.com/gromacs/gromacs/
 .. _download: ../download.html
@@ -361,7 +361,7 @@ latex_documents = [
 
 # The name of an image file (relative to this directory) to place at the top of
 # the title page.
-latex_logo = 'reference-manual/plots/peregrine.png'
+latex_logo = 'reference-manual/plots/GMX_logos/gmx_falcon_blue.png'
 
 # For "manual" documents, if this is true, then toplevel headings are parts,
 # not chapters.
index 44c68ce0ec0bc609d76cef6a3c375a3f32f69187..bdbcabe93bf6b2a5ec2ae87cc1b48d950afcd72f 100644 (file)
@@ -69,7 +69,7 @@ using the following `CMake options`_ with the
 appropriate value instead of ``xxx`` :
 
 * ``-DCMAKE_C_COMPILER=xxx`` equal to the name of the C99 `Compiler`_ you wish to use (or the environment variable ``CC``)
-* ``-DCMAKE_CXX_COMPILER=xxx`` equal to the name of the C++98 `compiler`_ you wish to use (or the environment variable ``CXX``)
+* ``-DCMAKE_CXX_COMPILER=xxx`` equal to the name of the C++17 `compiler`_ you wish to use (or the environment variable ``CXX``)
 * ``-DGMX_MPI=on`` to build using `MPI support`_
 * ``-DGMX_GPU=CUDA`` to build with NVIDIA CUDA support enabled.
 * ``-DGMX_GPU=OpenCL`` to build with OpenCL_ support enabled.
@@ -142,7 +142,7 @@ particular libstdc++ library, provide the path to g++ with
 ``-DGMX_GPLUSPLUS_PATH=/path/to/g++``.
 
 On Windows with the Intel compiler, the MSVC standard library is used,
-and at least MSVC 2017 15.7 is required. Load the enviroment variables with
+and at least MSVC 2017 15.7 is required. Load the environment variables with
 vcvarsall.bat.
 
 To build with clang and llvm's libcxx standard library, use
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_black.eps b/docs/reference-manual/plots/GMX_logos/gmx_falcon_black.eps
new file mode 100644 (file)
index 0000000..8257b41
--- /dev/null
@@ -0,0 +1,169 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.15.10 (http://cairographics.org)
+%%CreationDate: Tue Dec 22 10:25:07 2020
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 47 64 1201 1199
+%%EndComments
+%%BeginProlog
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_data_source {
+  CairoDataIndex CairoData length lt
+    { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
+    { () } ifelse
+} def
+/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
+/cairo_image { image cairo_flush_ascii85_file } def
+/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 47 64 1201 1199
+%%EndPageSetup
+q 47 64 1154 1135 rectclip
+1 0 0 -1 0 1276 cm q
+0 g
+136.812 77.434 m 122.449 77.758 106.316 77.656 97.523 81.691 c 88.5 86.652
+ 89.527 93.742 91.25 95.617 c 92.434 97.109 96.152 99.688 96.242 102.73 
+c 95.234 108.34 72.031 103.137 58.605 105.641 c 53.016 106.82 48.434 110.133
+ 47.738 113.938 c 47.418 119.797 50.934 121.238 54.582 123.777 c 63.512 
+129.828 73.031 134.34 80.289 140.43 c 83.844 143.035 87.238 145.922 92.426
+ 149.379 c 116.953 165.516 147.242 180.359 155.668 185.961 c 254.914 252.242
+ 358.039 319.004 455.254 373.645 c 504.504 440.727 563.059 506.973 605.035
+ 571.824 c 580.902 609.664 559.07 638.555 531.32 675.203 c 510.141 702.379
+ 495.254 719.984 479.543 738.836 c 451.391 773.16 421.789 797.652 397.039
+ 832.957 c 391.223 840.352 387.957 848.008 386.734 855.93 c 385.371 875.879
+ 421.797 906.16 425.27 907.547 c 436.594 911.719 448.691 905.492 459.195
+ 899.293 c 488.75 875.246 515.934 841.602 552.969 813.973 c 572.625 799.551
+ 590.441 785.629 615.32 768.082 c 645.344 746.09 667.078 727.398 692.207
+ 706.191 c 707.734 694.844 717.348 697.121 718.816 696.992 c 776.023 722.504
+ 820.738 754.855 852.34 791.512 c 934.031 897.027 989.254 998.75 1064.824
+ 1093.984 c 1076.758 1109.699 1087.891 1119.629 1097.332 1131.965 c 1110.418
+ 1153.863 l 1112.848 1157.684 1120.699 1167.129 1124.062 1160.836 c 1137.406
+ 1172.602 1142.082 1184.473 1149.34 1195.324 c 1156.371 1206.266 1159.52
+ 1210.988 1164.152 1211.164 c 1168.758 1210.66 1171.656 1201.789 1171.973
+ 1195.91 c 1171.789 1177.66 1170.488 1172.105 1171.836 1171.059 c 1173.914
+ 1170.445 1178.363 1187.023 1198.309 1184.453 c 1203.141 1181.418 1198.629
+ 1157.941 1195.168 1101.457 c 1178.086 933.641 1146.523 763.516 1089.805
+ 611.191 c 1084.137 595.129 1077.09 581.48 1067.562 572.184 c 1046.789 547.156
+ 1024.012 528.801 1001.363 510.031 c 989.566 499.383 976.543 489.105 966.18
+ 478.027 c 956.355 466.758 957.996 448.891 964.23 434.633 c 968.797 422.961
+ 977.547 406.664 979.488 401.492 c 985.199 382.5 984.105 380.152 986.004
+ 363.09 c 986.469 356.27 985.977 352.652 988.793 347.652 c 992.34 344.762
+ 996.953 344.41 1001.699 346.52 c 1007.945 350.684 1011.227 350.449 1012.133
+ 348.75 c 1009.059 327.266 976.367 308.07 957.617 310.387 c 945.859 306.785
+ 930.488 306.676 919.223 308.172 c 898.082 311.871 882.219 316.207 865.07
+ 322.734 c 850.176 329.895 837.754 336.852 818.574 332.609 c 803.309 328.984
+ 795.805 322.965 789.297 314.582 c 752.211 271.688 730.129 218.109 690.734
+ 184.59 c 501.375 113.621 326.504 81.953 136.812 77.434 c h
+328.203 143.566 m 449.066 143.32 571.941 155.934 675.547 203.484 c 703.422
+ 242.258 720.086 282.078 742.121 323.77 c 751.336 347.227 757.141 362.793
+ 745.195 383.062 c 707.031 429.117 664.742 484.961 627.828 538.145 c 626.473
+ 563.586 516.262 380.852 481.965 354.867 c 377.371 277.129 365.852 289.16
+ 209.266 167.121 c 200.277 158.922 192.363 146.398 245.109 145.52 c 272.527
+ 144.367 300.312 143.625 328.203 143.566 c h
+963.453 318.547 m 968.043 318.586 975.812 319.973 984.551 327.719 c 980.254
+ 331.422 980.973 336.133 981.539 340.934 c 971.641 335.18 959.535 344.082
+ 943.176 344.887 c 957.703 341.59 964.785 333.652 960.008 318.773 c 960.75
+ 318.672 961.926 318.535 963.453 318.547 c h
+931.559 324.992 m 936.672 326.102 934.895 325.629 938.242 328.184 c 932.383
+ 336.523 926.926 340.699 918.32 339.039 c 911.141 337.633 909.074 333.812
+ 904.812 327.867 c 911.41 327.082 l 916.156 341.754 931.09 337.258 932.301
+ 329.965 c 932.227 326.137 931.559 324.992 931.559 324.992 c h
+869.617 346.715 m 881.41 346.566 894.383 366.523 889.238 379.129 c 909.723
+ 395.227 922.215 377.875 935.555 369.203 c 962.754 354.188 969.785 356.102
+ 978.707 357.473 c 978 377.777 973.379 398.656 957.926 426.973 c 932.07 
+505.867 893.809 535.328 854.266 567.863 c 773.895 635.305 691.504 697.004
+ 600.34 750.48 c 581.098 760.629 566.422 766.246 550.883 758.367 c 552.508
+ 733.074 562.293 711.105 575.012 685.809 c 599.723 643.137 624.457 603.18
+ 646.707 557.734 c 701.762 461.715 744.281 424.805 788.02 387.641 c 810.488
+ 372.332 817.66 366.059 824.414 366.141 c 831.258 376.402 856.727 383.457
+ 859.547 379.984 c 854.406 377.676 854.074 375.219 854.289 370.789 c 856.758
+ 353.203 863 346.797 869.617 346.715 c h
+967.812 538.496 m 987.859 547.559 1024.75 578.168 1063.395 599.801 c 1135.418
+ 758.137 1138.727 956.129 1130.129 1060.852 c 1125.969 1093.961 1122.641
+ 1088.188 1112.367 1081.16 c 1001.41 986.957 946.695 851.547 865.684 754.898
+ c 813.285 714.82 753.328 695.617 739.617 677.297 c 841.207 609.602 919.535
+ 552.836 967.812 538.496 c h
+578.949 649.465 m 582.625 649.613 576.047 661.262 573.328 665.98 c 557.789
+ 691.105 548.273 720.832 536.887 747.91 c 529.672 763.188 520.93 768.02 
+513.164 766.078 c 504.371 763.195 491.543 749.426 499.637 737.18 c 522.387
+ 710.484 542.207 678.039 571.336 653.832 c 575.363 650.645 577.727 649.414
+ 578.949 649.465 c h
+593.453 765.883 m 602.512 765.863 551.773 800.906 539.789 804.66 c 526.652
+ 789.449 561.559 777.637 573.242 773.828 c 584.953 768.168 591.145 765.887
+ 593.453 765.883 c h
+468.012 769.668 m 471.094 783.312 482.242 789.922 489.297 795.098 c 484.004
+ 800.496 480.375 804.027 474.762 807.812 c 466.156 801.684 458.281 797.438
+ 454.012 786.043 c 458.996 778.883 462.414 774.988 468.012 769.668 c h
+437.176 805.754 m 441.148 813.277 448.23 822.336 455.449 826.727 c 452.07
+ 830.68 448.418 834.965 443.676 838.008 c 435.465 833.68 427.602 824.152
+ 424.637 818.383 c 428.773 812.449 433.953 807.379 437.176 805.754 c h
+506.078 811.891 m 510.27 823.156 516.348 825.828 520.125 828.805 c 517.43
+ 831.699 515.309 835.055 507.691 839.086 c 504.027 837.867 496.203 829.574
+ 494.266 822.691 c 499.383 816.711 501.359 815.805 506.078 811.891 c h
+472.105 843.156 m 474.82 850.625 478.875 856.422 485.676 859.809 c 482.109
+ 865.332 479.617 867 475.023 869.395 c 472.617 867.449 466.75 863.355 461.203
+ 853.621 c 465.832 848.426 467.949 846.832 472.105 843.156 c h
+399.703 852.07 m 407.094 869.613 423.262 880.941 437.027 895.938 c 434.898
+ 897.16 434.121 901.664 430.547 901.73 c 417.07 892.629 402.621 879.5 393.652
+ 859.934 c 396.188 856.246 396.457 855.16 399.703 852.07 c h
+399.703 852.07 m f
+969.785 324.793 m 969.953 323.883 970.711 321.355 972.207 321.996 c 973.75
+ 323.355 974.613 325.277 974.73 328.242 c 974.719 329.715 974.586 330.922
+ 972.676 329.031 c 971.703 327.895 971.332 327.652 969.785 324.793 c h
+969.785 324.793 m f
+Q Q
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_black.png b/docs/reference-manual/plots/GMX_logos/gmx_falcon_black.png
new file mode 100644 (file)
index 0000000..208c733
Binary files /dev/null and b/docs/reference-manual/plots/GMX_logos/gmx_falcon_black.png differ
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_black.svg b/docs/reference-manual/plots/GMX_logos/gmx_falcon_black.svg
new file mode 100644 (file)
index 0000000..497fa3c
--- /dev/null
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg1149"
+   version="1.1"
+   viewBox="0 0 450 450"
+   height="450mm"
+   width="450mm"
+   sodipodi:docname="gmx_falcon.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1853"
+     inkscape:window-height="1145"
+     id="namedview971"
+     showgrid="false"
+     inkscape:zoom="0.54798148"
+     inkscape:cx="820.2007"
+     inkscape:cy="1032.1545"
+     inkscape:window-x="67"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1149" />
+  <defs
+     id="defs1143">
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect1061"
+       is_visible="true" />
+    <clipPath
+       id="_clip1">
+      <rect
+         id="rect892"
+         height="550.58301"
+         width="291.98801"
+         y="0"
+         x="0" />
+    </clipPath>
+  </defs>
+  <metadata
+     id="metadata1146">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,153)"
+     id="layer1"
+     style="fill:none;fill-opacity:1;stroke:none">
+    <g
+       style="clip-rule:evenodd;fill:none;fill-opacity:1;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;stroke:none"
+       id="g903"
+       transform="matrix(0.82454635,-0.51053871,0.49150293,0.84357369,250.14362,56.767957)">
+      <g
+         style="fill:none;fill-opacity:1;stroke:none"
+         id="g901"
+         transform="translate(-145.994,-275.291)">
+        <clipPath
+           id="clipPath1706">
+          <rect
+             id="rect1704"
+             height="550.58301"
+             width="291.98801"
+             y="0"
+             x="0" />
+        </clipPath>
+        <g
+           style="fill:none;fill-opacity:1;stroke:none"
+           id="g899"
+           clip-path="url(#_clip1)">
+          <g
+             style="fill:none;fill-opacity:1;stroke:none"
+             id="g897"
+             transform="matrix(1,0,0,-1,0,555.789)" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     id="g842"
+     transform="translate(7.10689,-9.54507)"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-opacity:1">
+    <path
+       id="rect1188"
+       d="m 41.158027,36.862134 c -5.067605,0.114086 -10.758954,0.07765 -13.860135,1.501201 -3.184436,1.750423 -2.821989,4.252571 -2.213302,4.913911 0.417703,0.525436 1.728276,1.435139 1.760616,2.509409 -0.355687,1.978739 -8.540643,0.142271 -13.277743,1.026295 -1.971417,0.415488 -3.5883814,1.583925 -3.8328413,2.926953 -0.1140291,2.067041 1.1265423,2.575017 2.4143233,3.470587 3.14977,2.135627 6.507488,3.727368 9.068697,5.87561 1.253729,0.919245 2.45072,1.936756 4.280876,3.156397 8.653728,5.692823 19.338307,10.928703 22.311301,12.905675 35.010808,23.382274 71.391691,46.934698 105.687091,66.210948 17.3743,23.66443 38.03145,47.03499 52.83967,69.91304 -8.51464,13.34908 -16.2153,23.54024 -26.00513,36.47013 -7.47265,9.58647 -12.7242,15.79733 -18.26555,22.44824 -9.9316,12.1082 -20.3747,20.74878 -29.10572,33.20264 -2.05193,2.60951 -3.20382,5.31056 -3.63544,8.1044 -0.48145,7.03834 12.36918,17.7201 13.594,18.20974 3.99488,1.47164 8.26211,-0.72435 11.96775,-2.91196 10.42715,-8.48248 20.01679,-20.35241 33.08119,-30.09894 6.93475,-5.08797 13.21941,-9.99855 21.9971,-16.1897 10.591,-7.75753 18.25921,-14.35134 27.12393,-21.8333 5.47698,-4.00318 8.86884,-3.19925 9.38702,-3.24528 20.18147,9.0007 35.95519,20.41379 47.10463,33.34422 28.81865,37.22362 48.30006,73.10919 74.95976,106.70614 4.2086,5.54379 8.13629,9.04706 11.46699,13.39866 l 4.6173,7.72512 c 0.85704,1.34845 3.62606,4.67968 4.81314,2.45928 4.7075,4.1507 6.35611,8.33985 8.91728,12.16773 2.47981,3.85953 3.59053,5.52575 5.22502,5.58779 1.62536,-0.17732 2.64702,-3.30811 2.75952,-5.3816 -0.0649,-6.43839 -0.52445,-8.39745 -0.0481,-8.76742 0.73313,-0.21656 2.30214,5.63288 9.33794,4.72581 1.70479,-1.07048 0.11292,-9.35281 -1.10744,-29.27882 -6.02679,-59.20256 -17.16104,-119.21909 -37.17034,-172.95587 -1.99855,-5.66626 -4.48439,-10.48003 -7.84603,-13.76092 -7.32869,-8.82859 -15.36353,-15.30351 -23.35414,-21.92579 -4.16065,-3.75625 -8.75593,-7.38237 -12.41112,-11.29027 -3.46615,-3.97565 -2.8878,-10.27856 -0.68832,-15.30862 1.61087,-4.11755 4.69831,-9.86645 5.38314,-11.69128 2.01419,-6.69993 1.62933,-7.52786 2.29907,-13.54749 0.16343,-2.40569 -0.0101,-3.68211 0.98393,-5.44566 1.2501,-1.02021 2.87774,-1.14414 4.55268,-0.39946 2.20314,1.46902 3.36098,1.38574 3.67988,0.78651 -1.08394,-7.57897 -12.61708,-14.35085 -19.2319,-13.53302 -4.14726,-1.2716 -9.57011,-1.31016 -13.54386,-0.78187 -7.45892,1.30469 -13.0538,2.83398 -19.10377,5.13664 -5.25428,2.52614 -9.63744,4.98053 -16.40363,3.48402 -5.38494,-1.27814 -8.0322,-3.40208 -10.32754,-6.35878 C 258.25672,105.39086 250.4662,86.489695 236.56833,74.663963 169.76711,49.628714 108.07696,38.456479 41.158027,36.862134 Z m 67.517843,23.330361 c 42.63832,-0.08655 85.98601,4.362077 122.53465,21.137211 9.83453,13.678189 15.71355,27.725614 23.48642,42.434624 3.25084,8.27418 5.29883,13.76672 1.08417,20.91707 -13.46351,16.24687 -28.38131,35.94725 -41.40471,54.70932 -0.47716,8.97476 -39.3571,-55.48985 -51.45733,-64.65652 C 126.0207,107.30976 121.95681,111.55429 66.71719,68.501031 63.546233,65.6094 60.754649,61.19063 79.362933,60.88134 89.034697,60.474089 98.836261,60.212466 108.67587,60.192495 Z m 224.10261,61.728535 c 1.61918,0.0134 4.3592,0.50304 7.44191,3.23546 -1.51503,1.30658 -1.26156,2.96907 -1.06246,4.66276 -3.49184,-2.02972 -7.76258,1.11022 -13.53354,1.39423 5.12553,-1.16335 7.62283,-3.9631 5.93762,-9.21235 0.26196,-0.036 0.67675,-0.0846 1.21647,-0.0801 z m -11.25204,2.27376 c 1.80433,0.39115 1.17613,0.22457 2.358,1.12603 -2.06709,2.94178 -3.99193,4.41507 -7.0285,3.83026 -2.53238,-0.49634 -3.26144,-1.84438 -4.76457,-3.9424 l 2.32749,-0.27595 c 1.67447,5.17616 6.94156,3.58906 7.3696,1.01647 -0.0265,-1.3497 -0.26202,-1.75441 -0.26202,-1.75441 z m -21.85188,7.6631 c 4.1606,-0.0519 8.73718,6.98868 6.92152,11.43496 7.22731,5.68 11.6341,-0.44184 16.33959,-3.50108 9.59575,-5.29682 12.07622,-4.62248 15.22388,-4.13825 -0.25011,7.1632 -1.87973,14.52802 -7.33186,24.5184 -9.12154,27.83239 -22.61876,38.22475 -36.56884,49.7024 -28.35264,23.79178 -57.41908,45.55891 -89.57953,64.42294 -6.78781,3.58045 -11.96577,5.56231 -17.44752,2.78278 0.57338,-8.92321 4.02562,-16.67319 8.51214,-25.59638 8.71795,-15.05432 17.44359,-29.15045 25.29252,-45.18173 19.42292,-33.87435 34.42263,-46.89517 49.85225,-60.00616 7.9271,-5.40016 10.4566,-7.61296 12.84005,-7.58507 2.4135,3.6206 11.39782,6.10895 12.39303,4.88498 -1.81309,-0.81494 -1.93051,-1.68173 -1.85465,-3.24425 0.87042,-6.20347 3.07342,-8.46441 5.40742,-8.49354 z m 34.64129,67.65685 c 7.07207,3.19673 20.0865,13.99569 33.71887,21.62659 25.40844,55.85701 26.57612,125.70521 23.54276,162.64848 -1.4672,11.68019 -2.6419,9.64332 -6.26526,7.16391 -39.14394,-33.23217 -58.44535,-81.0015 -87.02466,-115.09738 -18.48485,-14.1386 -39.63727,-20.91346 -44.47429,-27.37559 35.83951,-23.88175 63.47121,-43.90715 80.50258,-48.96601 z m -137.18181,39.14697 c 1.29577,0.0524 -1.0241,4.16146 -1.98282,5.82652 -5.48264,8.86367 -8.83948,19.35023 -12.85658,28.90315 -2.54565,5.38871 -5.62861,7.09422 -8.369,6.40889 -3.10141,-1.01735 -7.62708,-5.87401 -4.77181,-10.19471 8.0252,-9.41762 15.0174,-20.8627 25.29459,-29.40338 1.41974,-1.12484 2.2537,-1.55794 2.68562,-1.54047 z m 5.11648,41.06932 c 3.19519,-0.006 -14.70408,12.35567 -18.93166,13.67978 -4.6342,-5.3662 7.67952,-9.53249 11.80083,-10.87683 4.13148,-1.99644 6.31637,-2.80139 7.13083,-2.80295 z m -44.25259,1.33583 c 1.08655,4.8133 5.01897,7.14513 7.50806,8.97155 -1.86677,1.90431 -3.14682,3.14936 -5.12733,4.485 -3.03651,-2.16204 -5.81415,-3.6595 -7.32048,-7.67964 1.75826,-2.5264 2.9648,-3.90054 4.93975,-5.77691 z m -10.87944,12.73051 c 1.40176,2.65409 3.89991,5.84956 6.44715,7.39851 -1.19154,1.39436 -2.48,2.90688 -4.15324,3.98011 -2.89708,-1.52739 -5.67073,-4.88868 -6.71742,-6.92359 1.45994,-2.09373 3.28699,-3.88195 4.42351,-4.45503 z m 24.30808,2.16524 c 1.47874,3.97341 3.62242,4.91559 4.95577,5.96604 -0.95165,1.02195 -1.70013,2.20549 -4.38734,3.62767 -1.2916,-0.42986 -4.05293,-3.35549 -4.73614,-5.78463 1.80532,-2.10955 2.50335,-2.4292 4.16771,-3.80908 z m -11.98532,11.02879 c 0.9577,2.63578 2.38866,4.68077 4.7873,5.8756 -1.2586,1.94784 -2.1378,2.53624 -3.75791,3.38172 -0.84803,-0.68678 -2.91918,-2.1313 -4.87515,-5.56453 1.63216,-1.83277 2.38036,-2.39599 3.84576,-3.69279 z m -25.54211,3.14449 c 2.60746,6.18932 8.31192,10.18577 13.16819,15.47556 -0.75146,0.43161 -1.02531,2.02009 -2.28669,2.0438 -4.75409,-3.20992 -9.85201,-7.84206 -13.01522,-14.74536 0.89392,-1.30024 0.9894,-1.68278 2.13372,-2.774 z"
+       style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.06500001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path1103-2"
+       d="m 335.01217,124.12428 c 0.0593,-0.32031 0.32622,-1.21261 0.85352,-0.98617 0.54536,0.47927 0.84953,1.15744 0.89021,2.20293 -0.003,0.51987 -0.0501,0.94543 -0.72424,0.27913 -0.34283,-0.40095 -0.47359,-0.48681 -1.01949,-1.49589 z"
+       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.079375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+  </g>
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.08387499;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 402.8553,420.48816 c -0.38761,-0.38762 -1.86566,-2.50013 -3.28451,-4.69445 -4.94853,-7.65307 -6.21808,-9.4611 -7.5588,-10.76486 -1.15396,-1.12213 -1.45116,-1.25836 -2.04812,-0.93888 -0.94107,0.50364 -0.89794,0.51671 -2.26819,-0.68638 -0.66405,-0.58309 -2.46647,-3.15648 -4.00537,-5.7187 -2.23824,-3.72663 -3.49488,-5.37578 -6.28152,-8.24344 -1.91596,-1.97168 -4.9261,-5.50532 -6.68917,-7.85255 -1.76311,-2.34719 -5.32935,-7.03069 -7.92504,-10.40775 -11.58515,-15.0726 -21.12143,-29.13325 -31.26365,-46.09629 -1.57181,-2.62888 -4.1875,-6.62342 -5.81265,-8.87677 -1.62513,-2.25333 -6.54148,-9.39742 -10.92521,-15.87575 -10.67951,-15.78234 -12.26216,-17.99661 -15.7277,-22.00436 -4.51625,-5.2229 -8.81423,-9.19438 -14.85046,-13.72237 -3.01593,-2.26237 -7.70186,-5.8788 -10.41312,-8.03652 -2.71127,-2.15773 -6.47782,-5.07261 -8.3701,-6.47753 -3.75774,-2.78991 -13.25898,-8.7634 -15.16656,-9.5353 -0.67677,-0.27386 -2.32078,-0.4797 -3.79117,-0.47469 -4.04953,0.0138 -6.04567,1.18506 -15.52531,9.10962 -9.39565,7.85435 -14.35264,11.73053 -23.70171,18.53386 -12.01407,8.74267 -21.72736,16.12272 -25.45087,19.33733 -1.96961,1.70042 -7.31232,6.73245 -11.87268,11.1823 -11.1677,10.89705 -13.72264,13.08923 -17.23884,14.79116 -2.21591,1.07257 -3.40036,1.42893 -5.17005,1.55556 -2.97729,0.21302 -3.86016,-0.21521 -7.60972,-3.6912 -3.71422,-3.44321 -6.70209,-7.14335 -8.16061,-10.10603 -2.69567,-5.47568 -0.89779,-9.56294 8.52001,-19.36916 10.29864,-10.72343 33.96164,-39.14176 46.37262,-55.69169 8.15693,-10.87718 10.549,-14.21115 15.89171,-22.14922 l 5.02661,-7.46841 -0.99605,-1.97318 c -0.54784,-1.08524 -2.21426,-3.7931 -3.70316,-6.01745 -2.58815,-3.86656 -4.87839,-6.69603 -16.17215,-19.97983 -7.30831,-8.59608 -10.14456,-12.35331 -17.04021,-22.57338 -10.71825,-15.88557 -13.04121,-18.54878 -18.95912,-21.73605 -6.26352,-3.37342 -12.87002,-7.30618 -26.40115,-15.71629 C 117.42939,103.85956 107.98075,98.091115 103.2863,95.300735 88.011271,86.221245 74.928651,77.792543 59.585281,67.145596 46.883905,58.33196 48.567343,59.411563 41.490328,55.541151 33.351457,51.090012 27.687733,47.642012 23.907495,44.836955 c -1.783889,-1.323702 -5.240708,-3.666381 -7.68182,-5.205949 -2.441112,-1.539571 -4.663767,-3.188878 -4.939233,-3.665131 -0.787229,-1.361032 -0.16351,-2.629931 1.762459,-3.585567 1.503804,-0.746162 1.975287,-0.79366 7.617391,-0.767368 3.558696,0.01659 6.284621,-0.11661 6.676271,-0.326213 0.947552,-0.507115 0.818012,-1.418561 -0.362339,-2.549409 -1.30937,-1.254455 -1.369541,-2.780681 -0.166019,-4.210987 2.404007,-2.857 8.24174,-3.189022 36.697342,-2.087167 28.825447,1.116176 52.505933,3.652003 71.536013,7.66044 32.36722,6.817732 67.48613,16.732011 96.09781,27.12899 l 6.65702,2.419043 3.02153,2.981209 c 4.58445,4.523277 6.75886,7.38432 14.68593,19.3234 4.00635,6.034021 8.80547,12.910064 10.66471,15.280093 1.85926,2.370026 4.37912,5.668071 5.59967,7.328981 3.54658,4.82614 7.829,7.16694 13.82729,7.5581 3.22984,0.21063 5.81604,-0.35701 9.90099,-2.17315 6.5417,-2.90839 11.84215,-4.58559 19.25151,-6.09168 4.70787,-0.95696 11.12007,-1.16691 14.41654,-0.47202 1.01148,0.21322 2.22313,0.34409 2.69256,0.29084 3.10353,-0.35207 4.34538,-0.10865 7.65199,1.49992 2.58381,1.25695 3.91525,2.18331 5.9981,4.17327 2.81646,2.69082 4.94903,5.5049 5.30672,7.00254 0.33026,1.38281 -0.61171,1.47723 -3.01932,0.30264 -4.72532,-2.30534 -5.50494,-1.38862 -6.40781,7.5346 -0.79708,7.8779 -1.50532,10.47081 -4.73525,17.33631 -3.96872,8.43587 -4.26527,9.39876 -4.27453,13.8793 -0.007,3.40931 0.0754,3.91294 0.89406,5.46263 1.35374,2.56256 5.75728,6.66147 20.77797,19.34064 7.87304,6.64573 15.52987,14.45793 19.23333,19.62355 3.75033,5.23105 9.44827,21.353 15.95866,45.1542 3.73631,13.65938 16.56665,65.3685 17.87697,72.04809 3.17815,16.20097 6.8082,46.88859 9.07029,76.67802 1.04793,13.80025 1.14326,15.63661 0.88344,17.02152 -0.23326,1.24328 -0.23463,1.24415 -2.01036,1.23664 -2.41567,-0.0103 -4.27887,-0.93755 -6.07573,-3.02408 -0.82791,-0.96131 -1.6433,-1.74795 -1.812,-1.74805 -0.17521,-1.1e-4 -0.22953,2.01258 -0.12674,4.69429 0.19257,5.02126 -0.15697,7.38682 -1.27381,8.62092 -0.79634,0.87995 -2.03099,0.87058 -2.9238,-0.0222 z m -12.0019,-36.69813 c 2.69505,-1.12583 4.60867,-3.93081 6.04481,-8.86061 1.46388,-5.02494 1.7119,-12.11908 1.2479,-35.69121 l -0.39354,-19.99255 -2.03382,-16.71172 c -3.77262,-30.99959 -5.44812,-40.99627 -8.7235,-52.04809 -0.80693,-2.72278 -2.49635,-8.63778 -3.75431,-13.14444 -4.92437,-17.64228 -7.25934,-24.48089 -11.1402,-32.62707 l -2.12852,-4.46795 -3.60556,-2.13708 c -8.07926,-4.78872 -16.56611,-8.86281 -24.99767,-12.00003 -5.72437,-2.12993 -6.03806,-2.15367 -9.69113,-0.73358 -7.89456,3.06892 -16.81144,7.956 -30.54202,16.73916 -4.25453,2.72154 -46.25097,30.72217 -46.73434,31.15956 -0.36102,0.32669 0.8966,2.3527 2.09955,3.38239 1.73467,1.48481 4.76562,3.04555 13.90751,7.16148 11.6618,5.25045 17.8113,8.66166 23.8007,13.2026 2.66763,2.02249 3.62378,3.04213 6.29795,6.71615 7.93695,10.9045 22.11523,32.62735 33.24453,50.93469 5.06357,8.3294 25.22384,35.55614 35.51889,47.96869 3.89358,4.69445 8.70749,10.60945 10.69755,13.14445 4.2151,5.3693 6.80532,8.07511 7.93549,8.28961 1.44272,0.27382 1.66441,0.25244 2.94973,-0.28445 z m -243.49494,-72.37035 0.918,-1.20356 -5.42437,-5.53937 c -3.63408,-3.71113 -5.81875,-6.24028 -6.61931,-7.66305 -0.65723,-1.16803 -1.30236,-2.12825 -1.43364,-2.13384 -0.13128,-0.006 -0.65916,0.54113 -1.17308,1.21489 -0.83695,1.09731 -0.89319,1.33424 -0.53931,2.27177 0.65948,1.74717 2.52673,4.63277 4.58268,7.08199 1.94412,2.31598 7.58536,7.15092 8.36163,7.16651 0.22517,0.005 0.8225,-0.53338 1.3274,-1.19534 z m 15.48279,-11.07334 c 0.86587,-0.55562 2.0037,-1.45841 2.52851,-2.0062 l 0.9542,-0.99597 -1.18532,-0.73255 c -1.45247,-0.89768 -3.55708,-3.18326 -3.99722,-4.34092 -0.37232,-0.97927 -0.38075,-0.97613 -3.14349,1.17277 -1.07972,0.83984 -1.96164,1.77316 -1.95981,2.07407 0.006,0.91122 4.22951,5.74807 5.08801,5.8262 0.0774,0.007 0.84925,-0.44177 1.71512,-0.9974 z m 12.72586,-10.70747 c 0.50887,-0.37479 1.38448,-1.25291 1.94579,-1.95139 l 1.02056,-1.26994 -1.70559,-1.15118 c -1.46729,-0.99036 -3.40534,-3.2729 -3.81019,-4.48741 -0.14172,-0.42519 -5.31197,3.28734 -5.59109,4.01473 -0.29899,0.77915 1.79191,3.45745 3.8494,4.93078 2.06818,1.481 2.16672,1.47902 4.29112,-0.0856 z m -22.77145,-1.62732 2.16438,-2.07833 -2.3417,-2.20906 c -1.28793,-1.21497 -2.82895,-2.96834 -3.42447,-3.89639 -0.59553,-0.92805 -1.15278,-1.68735 -1.23833,-1.68735 -0.29316,0 -3.92864,3.56814 -4.25301,4.17425 -0.38863,0.72615 -0.0131,1.52482 1.71616,3.65024 1.28787,1.5829 4.29051,4.12499 4.87228,4.12499 0.18717,0 1.31428,-0.93525 2.50469,-2.07835 z m 11.62163,-10.88801 c 1.39852,-1.19057 2.54277,-2.28076 2.54277,-2.4226 0,-0.14187 -0.74015,-0.80126 -1.64478,-1.46532 -2.4315,-1.78488 -4.61818,-4.26993 -5.37158,-6.10454 -0.36601,-0.89124 -0.7603,-1.62102 -0.87623,-1.62172 -0.35699,-0.002 -5.42257,5.4309 -5.42257,5.81597 0,0.58381 1.0365,2.44396 2.15384,3.86543 1.46167,1.85952 5.08165,4.65384 5.63082,4.3465 0.24473,-0.13695 1.58921,-1.22312 2.98773,-2.41372 z m 22.81468,-0.0436 c 6.14846,-3.11883 17.09792,-11.51553 16.42863,-12.59846 -0.3913,-0.63314 -2.0395,-0.33396 -4.77831,0.86737 -1.50222,0.65892 -3.72571,1.43094 -4.94107,1.71559 -4.41097,1.03312 -9.20572,3.9431 -10.44468,6.33895 -0.95879,1.85412 -0.28397,4.73708 1.10883,4.73708 0.29473,0 1.4767,-0.47726 2.6266,-1.06053 z m -8.45803,-12.95445 c 1.86934,-0.90494 3.93597,-3.16472 5.18814,-5.67305 0.54686,-1.09549 2.35307,-5.52542 4.01379,-9.84431 1.89462,-4.92716 4.45679,-10.70025 6.8776,-15.49663 3.61083,-7.15414 4.36561,-9.24337 3.52672,-9.76183 -1.49623,-0.92472 -9.02214,6.59835 -25.38294,25.37337 -4.56869,5.24286 -4.72844,5.49024 -4.72844,7.32257 0,2.06196 0.75457,3.68001 2.67223,5.73014 2.83634,3.03228 5.05073,3.69656 7.8329,2.34974 z m 18.73012,-0.16196 c 4.50404,-0.93034 6.69742,-1.9812 15.88833,-7.61217 19.20397,-11.76565 41.64615,-28.23089 67.0879,-49.22062 28.37725,-23.41158 30.33422,-25.12854 35.56368,-31.20247 6.10711,-7.09331 10.78273,-15.02789 14.61027,-24.7939 1.06711,-2.72278 2.79008,-6.79415 3.82881,-9.04748 3.19773,-6.93698 4.9023,-12.96657 5.42427,-19.18736 l 0.23493,-2.79947 -0.93348,-0.23429 c -1.41441,-0.355 -5.22856,0.0777 -7.42267,0.84206 -3.23305,1.12629 -8.06638,3.7271 -10.81768,5.82099 -3.66686,2.79066 -5.27502,3.5454 -7.5616,3.54883 -1.42764,0.002 -2.32458,-0.22947 -3.62075,-0.93494 l -1.72302,-0.93777 v -2.27726 c 0.003,-5.05082 -3.55624,-10.39198 -7.25231,-10.88773 -1.2519,-0.16791 -1.49293,-0.0656 -2.7083,1.14978 -1.48971,1.48971 -2.2307,3.49482 -2.80805,7.5985 -0.33374,2.37229 -0.309,2.59067 0.40225,3.5527 l 0.75785,1.02503 -1.56888,-0.21504 c -1.92738,-0.26418 -6.83641,-2.21301 -9.13114,-3.62498 -0.93517,-0.5754 -2.10902,-1.04618 -2.60858,-1.04618 -0.49956,0 -1.9952,0.54023 -3.32364,1.2005 -9.07378,4.50992 -24.99189,18.77302 -36.76319,32.94092 -8.12603,9.78047 -19.15773,26.78398 -25.13205,38.73684 -3.74299,7.48864 -7.97012,15.22562 -15.39645,28.18035 -3.28314,5.72723 -6.77132,12.02632 -7.7515,13.99799 -3.82968,7.70347 -6.76588,16.66573 -7.21998,22.03779 l -0.2078,2.45828 1.66819,0.53633 c 3.18194,1.02301 5.02663,1.10883 8.4839,0.39472 z m 17.38415,-76.3832 c 0.70059,-0.98583 2.6563,-3.9278 4.34603,-6.5377 4.67986,-7.22836 8.24217,-11.76644 18.97133,-24.16782 13.60989,-15.7311 13.03993,-15.05063 16.85959,-20.12835 5.61801,-7.46838 7.38863,-11.99801 7.05429,-18.04645 -0.29299,-5.30055 -1.37317,-8.61741 -5.55928,-17.07071 -8.23851,-16.636566 -13.70864,-26.626084 -18.7961,-34.325235 l -2.49026,-3.768667 -5.90485,-2.955795 c -3.24766,-1.62569 -8.0352,-3.819999 -10.63896,-4.87625 -4.21145,-1.708428 -5.70034,-2.107822 -13.48586,-3.617568 -19.99049,-3.876504 -45.71177,-8.279028 -75.35352,-12.897716 -18.17493,-2.831962 -22.96819,-3.204403 -41.114423,-3.194624 -12.747286,0.0069 -23.631554,0.630793 -28.361585,1.625785 -5.582044,1.174218 -8.852564,3.600905 -8.852564,6.568496 0,0.535789 0.408437,1.793787 0.907635,2.79555 0.79353,1.592406 1.512469,2.27144 5.718688,5.401265 13.284428,9.884874 24.655127,16.80808 50.731269,30.888438 12.86714,6.947882 19.12688,10.901578 38.10143,24.065131 17.87883,12.4034 20.07347,14.35421 27.95337,24.84776 5.04929,6.72406 14.87759,20.89689 18.16007,26.18761 1.43259,2.30904 5.68341,8.96099 9.44629,14.7821 3.76287,5.82111 7.51695,11.85134 8.34239,13.40051 1.00009,1.87692 1.6994,2.81667 2.09602,2.81667 0.32866,0 1.16563,-0.80268 1.869,-1.79243 z m 120.04841,-69.42429 c 3.03673,-0.90182 7.51036,-5.75765 7.51036,-8.15204 0,-0.82722 -2.42721,-3.11575 -3.52769,-3.32612 -0.4758,-0.0909 -1.57435,0.0802 -2.4412,0.3804 -1.29718,0.44918 -1.68529,0.7898 -2.193,1.92464 -0.99322,2.21999 -5.37073,5.77375 -8.85793,7.19106 -1.68455,0.68465 -1.78242,0.78185 -1.13581,1.1279 2.52823,1.35308 7.59598,1.7597 10.64527,0.85416 z m -16.63274,-2.35996 c 2.01176,-0.68278 3.60053,-1.92295 4.32419,-3.37541 0.56312,-1.13024 0.60019,-1.48044 0.2481,-2.34334 -0.38446,-0.9422 -2.70552,-2.67339 -3.08096,-2.29796 -0.0916,0.0917 -0.0277,0.9102 0.14208,1.819 0.49517,2.65053 -0.25014,3.62531 -2.77836,3.63379 -3.45308,0.0116 -6.8049,-1.84859 -6.8049,-3.77653 0,-0.93323 -0.43794,-0.81418 -1.30144,0.35379 -1.77154,2.39613 -0.13763,5.343 3.61077,6.51228 1.10395,0.34436 3.824,0.0909 5.64052,-0.52562 z"
+     id="path831-6"
+     inkscape:connector-curvature="0" />
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.20005751;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="M 14.06821,224.61657 V 13.281165 H 229.50059 444.93297 V 224.61657 435.95197 H 229.50059 14.06821 Z m 404.12274,193.92328 c 0.5435,-1.62671 0.7697,-4.1896 0.5593,-6.33717 l -0.35327,-3.60588 2.02141,1.70093 c 2.0872,1.75623 6.12111,2.91418 7.39955,2.12405 1.60986,-0.99494 0.17246,-22.58171 -4.09392,-61.48194 -2.4121,-21.99331 -5.16745,-36.13264 -13.63898,-69.98992 -11.76766,-47.03046 -17.6915,-66.87399 -23.29045,-78.018 -3.05414,-6.07884 -10.94711,-14.35468 -26.24072,-27.51359 -7.70318,-6.62795 -14.53054,-12.85172 -15.17192,-13.83061 -0.82087,-1.25278 -1.16618,-3.20403 -1.16618,-6.58963 0,-4.35473 0.33187,-5.52352 3.50761,-12.35284 3.55949,-7.65455 4.61097,-11.45131 5.38062,-19.42871 0.23553,-2.44111 0.5901,-5.00653 0.78798,-5.70093 0.37098,-1.30199 0.33621,-1.30199 6.54095,-5.3e-4 1.54467,0.32399 1.8778,0.156 1.8778,-0.94685 0,-3.12282 -5.89139,-9.23258 -11.77985,-12.21649 -3.14418,-1.59327 -4.14446,-1.72579 -13.72995,-1.81898 -9.30704,-0.0905 -10.99375,0.0821 -16.90309,1.72985 -3.61043,1.00672 -9.14133,2.97297 -12.2909,4.36947 -4.71006,2.08838 -6.51436,2.5377 -10.16492,2.53131 -5.43171,-0.01 -10.0982,-2.02949 -12.9921,-5.62394 -5.28934,-6.569715 -9.48063,-12.381459 -17.34876,-24.056284 -4.71236,-6.992276 -10.5708,-14.876508 -13.01876,-17.520534 -4.07293,-4.399143 -4.95761,-4.993093 -10.41936,-6.995271 -25.71854,-9.427965 -62.78731,-20.104596 -91.32207,-26.302797 -24.99826,-5.430018 -46.11902,-7.7814 -82.62224,-9.198365 -25.281038,-0.981346 -31.391329,-0.296052 -33.223994,3.72621 -0.657606,1.443286 -0.588283,1.965651 0.406778,3.06518 2.027119,2.239942 0.706721,3.002338 -4.4509,2.569941 -5.257843,-0.440798 -8.754616,0.294018 -10.481939,2.20269 -1.675594,1.851509 -0.526919,3.6497 4.263174,6.673774 2.135556,1.348216 5.880103,3.907541 8.321215,5.687385 2.441112,1.779847 9.201114,5.936015 15.022225,9.23593 5.821114,3.299918 15.039298,9.112314 20.484854,12.916437 17.237706,12.04181 35.396697,23.43117 78.525277,49.251214 7.69889,4.60914 14.9076,8.93819 16.01936,9.62011 2.73356,1.67669 7.33706,7.47958 15.41699,19.43373 7.52724,11.13648 11.36327,16.09208 22.12073,28.57691 6.5659,7.62022 15.40859,19.72547 15.40859,21.09369 0,0.98837 -10.48111,16.19991 -19.17373,27.8274 -12.73728,17.03771 -37.03022,46.31957 -49.4739,59.63409 -6.03066,6.45268 -7.82916,9.51545 -7.82916,13.33267 0,3.91626 1.8597,7.03435 7.83963,13.14445 5.2848,5.3998 5.63993,5.63306 8.56716,5.62666 5.52045,-0.0122 8.99274,-2.34167 21.83161,-14.64715 14.18025,-13.59112 16.84365,-15.7983 36.87274,-30.55676 8.45,-6.22638 19.48536,-14.76417 24.52303,-18.97285 11.09409,-9.26847 13.29309,-10.52481 17.68342,-10.10296 4.09603,0.39358 12.51358,5.75634 28.97035,18.4568 19.38356,14.95924 21.33819,17.09146 37.40819,40.80736 5.72577,8.45 11.23762,16.43909 12.24857,17.75354 1.01095,1.31445 3.0185,4.38717 4.46122,6.82829 12.48767,21.1296 36.74097,55.2092 47.13671,66.23436 1.94765,2.06555 4.68128,5.6728 6.07473,8.01611 2.55003,4.28829 4.88508,6.58284 5.99863,5.8946 1.06125,-0.65587 2.72003,1.28212 7.85556,9.17782 4.56163,7.01328 5.19526,7.70519 6.87851,7.51109 1.48198,-0.17086 2.03718,-0.76189 2.76659,-2.94507 z"
+     id="path835-1"
+     inkscape:connector-curvature="0" />
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.20005751;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="M 14.06821,224.61657 V 13.281165 H 229.50059 444.93297 V 224.61657 435.95197 H 229.50059 14.06821 Z m 404.12274,193.92328 c 0.5435,-1.62671 0.7697,-4.1896 0.5593,-6.33717 l -0.35327,-3.60588 2.02141,1.70093 c 2.0872,1.75623 6.12111,2.91418 7.39955,2.12405 1.60986,-0.99494 0.17246,-22.58171 -4.09392,-61.48194 -2.4121,-21.99331 -5.16745,-36.13264 -13.63898,-69.98992 -11.76766,-47.03046 -17.6915,-66.87399 -23.29045,-78.018 -3.05414,-6.07884 -10.94711,-14.35468 -26.24072,-27.51359 -7.70318,-6.62795 -14.53054,-12.85172 -15.17192,-13.83061 -0.82087,-1.25278 -1.16618,-3.20403 -1.16618,-6.58963 0,-4.35473 0.33187,-5.52352 3.50761,-12.35284 3.55949,-7.65455 4.61097,-11.45131 5.38062,-19.42871 0.23553,-2.44111 0.5901,-5.00653 0.78798,-5.70093 0.37098,-1.30199 0.33621,-1.30199 6.54095,-5.3e-4 1.54467,0.32399 1.8778,0.156 1.8778,-0.94685 0,-3.12282 -5.89139,-9.23258 -11.77985,-12.21649 -3.14418,-1.59327 -4.14446,-1.72579 -13.72995,-1.81898 -9.30704,-0.0905 -10.99375,0.0821 -16.90309,1.72985 -3.61043,1.00672 -9.14133,2.97297 -12.2909,4.36947 -4.71006,2.08838 -6.51436,2.5377 -10.16492,2.53131 -5.43171,-0.01 -10.0982,-2.02949 -12.9921,-5.62394 -5.28934,-6.569715 -9.48063,-12.381459 -17.34876,-24.056284 -4.71236,-6.992276 -10.5708,-14.876508 -13.01876,-17.520534 -4.07293,-4.399143 -4.95761,-4.993093 -10.41936,-6.995271 -25.71854,-9.427965 -62.78731,-20.104596 -91.32207,-26.302797 -24.99826,-5.430018 -46.11902,-7.7814 -82.62224,-9.198365 -25.281038,-0.981346 -31.391329,-0.296052 -33.223994,3.72621 -0.657606,1.443286 -0.588283,1.965651 0.406778,3.06518 2.027119,2.239942 0.706721,3.002338 -4.4509,2.569941 -5.257843,-0.440798 -8.754616,0.294018 -10.481939,2.20269 -1.675594,1.851509 -0.526919,3.6497 4.263174,6.673774 2.135556,1.348216 5.880103,3.907541 8.321215,5.687385 2.441112,1.779847 9.201114,5.936015 15.022225,9.23593 5.821114,3.299918 15.039298,9.112314 20.484854,12.916437 17.237706,12.04181 35.396697,23.43117 78.525277,49.251214 7.69889,4.60914 14.9076,8.93819 16.01936,9.62011 2.73356,1.67669 7.33706,7.47958 15.41699,19.43373 7.52724,11.13648 11.36327,16.09208 22.12073,28.57691 6.5659,7.62022 15.40859,19.72547 15.40859,21.09369 0,0.98837 -10.48111,16.19991 -19.17373,27.8274 -12.73728,17.03771 -37.03022,46.31957 -49.4739,59.63409 -6.03066,6.45268 -7.82916,9.51545 -7.82916,13.33267 0,3.91626 1.8597,7.03435 7.83963,13.14445 5.2848,5.3998 5.63993,5.63306 8.56716,5.62666 5.52045,-0.0122 8.99274,-2.34167 21.83161,-14.64715 14.18025,-13.59112 16.84365,-15.7983 36.87274,-30.55676 8.45,-6.22638 19.48536,-14.76417 24.52303,-18.97285 11.09409,-9.26847 13.29309,-10.52481 17.68342,-10.10296 4.09603,0.39358 12.51358,5.75634 28.97035,18.4568 19.38356,14.95924 21.33819,17.09146 37.40819,40.80736 5.72577,8.45 11.23762,16.43909 12.24857,17.75354 1.01095,1.31445 3.0185,4.38717 4.46122,6.82829 12.48767,21.1296 36.74097,55.2092 47.13671,66.23436 1.94765,2.06555 4.68128,5.6728 6.07473,8.01611 2.55003,4.28829 4.88508,6.58284 5.99863,5.8946 1.06125,-0.65587 2.72003,1.28212 7.85556,9.17782 4.56163,7.01328 5.19526,7.70519 6.87851,7.51109 1.48198,-0.17086 2.03718,-0.76189 2.76659,-2.94507 z"
+     id="path837-8"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.eps b/docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.eps
new file mode 100644 (file)
index 0000000..ec2632f
--- /dev/null
@@ -0,0 +1,169 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.15.10 (http://cairographics.org)
+%%CreationDate: Tue Dec 22 10:13:49 2020
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 47 64 1201 1199
+%%EndComments
+%%BeginProlog
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_data_source {
+  CairoDataIndex CairoData length lt
+    { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
+    { () } ifelse
+} def
+/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
+/cairo_image { image cairo_flush_ascii85_file } def
+/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 47 64 1201 1199
+%%EndPageSetup
+q 47 64 1154 1135 rectclip
+1 0 0 -1 0 1276 cm q
+0.305882 0.435294 0.596078 rg
+136.812 77.434 m 122.449 77.758 106.316 77.656 97.523 81.691 c 88.5 86.652
+ 89.527 93.742 91.25 95.617 c 92.434 97.109 96.152 99.688 96.242 102.73 
+c 95.234 108.34 72.031 103.137 58.605 105.641 c 53.016 106.82 48.434 110.133
+ 47.738 113.938 c 47.418 119.797 50.934 121.238 54.582 123.777 c 63.512 
+129.828 73.031 134.34 80.289 140.43 c 83.844 143.035 87.238 145.922 92.426
+ 149.379 c 116.953 165.516 147.242 180.359 155.668 185.961 c 254.914 252.242
+ 358.039 319.004 455.254 373.645 c 504.504 440.727 563.059 506.973 605.035
+ 571.824 c 580.902 609.664 559.07 638.555 531.32 675.203 c 510.141 702.379
+ 495.254 719.984 479.543 738.836 c 451.391 773.16 421.789 797.652 397.039
+ 832.957 c 391.223 840.352 387.957 848.008 386.734 855.93 c 385.371 875.879
+ 421.797 906.16 425.27 907.547 c 436.594 911.719 448.691 905.492 459.195
+ 899.293 c 488.75 875.246 515.934 841.602 552.969 813.973 c 572.625 799.551
+ 590.441 785.629 615.32 768.082 c 645.344 746.09 667.078 727.398 692.207
+ 706.191 c 707.734 694.844 717.348 697.121 718.816 696.992 c 776.023 722.504
+ 820.738 754.855 852.34 791.512 c 934.031 897.027 989.254 998.75 1064.824
+ 1093.984 c 1076.758 1109.699 1087.891 1119.629 1097.332 1131.965 c 1110.418
+ 1153.863 l 1112.848 1157.684 1120.699 1167.129 1124.062 1160.836 c 1137.406
+ 1172.602 1142.082 1184.473 1149.34 1195.324 c 1156.371 1206.266 1159.52
+ 1210.988 1164.152 1211.164 c 1168.758 1210.66 1171.656 1201.789 1171.973
+ 1195.91 c 1171.789 1177.66 1170.488 1172.105 1171.836 1171.059 c 1173.914
+ 1170.445 1178.363 1187.023 1198.309 1184.453 c 1203.141 1181.418 1198.629
+ 1157.941 1195.168 1101.457 c 1178.086 933.641 1146.523 763.516 1089.805
+ 611.191 c 1084.137 595.129 1077.09 581.48 1067.562 572.184 c 1046.789 547.156
+ 1024.012 528.801 1001.363 510.031 c 989.566 499.383 976.543 489.105 966.18
+ 478.027 c 956.355 466.758 957.996 448.891 964.23 434.633 c 968.797 422.961
+ 977.547 406.664 979.488 401.492 c 985.199 382.5 984.105 380.152 986.004
+ 363.09 c 986.469 356.27 985.977 352.652 988.793 347.652 c 992.34 344.762
+ 996.953 344.41 1001.699 346.52 c 1007.945 350.684 1011.227 350.449 1012.133
+ 348.75 c 1009.059 327.266 976.367 308.07 957.617 310.387 c 945.859 306.785
+ 930.488 306.676 919.223 308.172 c 898.082 311.871 882.219 316.207 865.07
+ 322.734 c 850.176 329.895 837.754 336.852 818.574 332.609 c 803.309 328.984
+ 795.805 322.965 789.297 314.582 c 752.211 271.688 730.129 218.109 690.734
+ 184.59 c 501.375 113.621 326.504 81.953 136.812 77.434 c h
+328.203 143.566 m 449.066 143.32 571.941 155.934 675.547 203.484 c 703.422
+ 242.258 720.086 282.078 742.121 323.77 c 751.336 347.227 757.141 362.793
+ 745.195 383.062 c 707.031 429.117 664.742 484.961 627.828 538.145 c 626.473
+ 563.586 516.262 380.852 481.965 354.867 c 377.371 277.129 365.852 289.16
+ 209.266 167.121 c 200.277 158.922 192.363 146.398 245.109 145.52 c 272.527
+ 144.367 300.312 143.625 328.203 143.566 c h
+963.453 318.547 m 968.043 318.586 975.812 319.973 984.551 327.719 c 980.254
+ 331.422 980.973 336.133 981.539 340.934 c 971.641 335.18 959.535 344.082
+ 943.176 344.887 c 957.703 341.59 964.785 333.652 960.008 318.773 c 960.75
+ 318.672 961.926 318.535 963.453 318.547 c h
+931.559 324.992 m 936.672 326.102 934.895 325.629 938.242 328.184 c 932.383
+ 336.523 926.926 340.699 918.32 339.039 c 911.141 337.633 909.074 333.812
+ 904.812 327.867 c 911.41 327.082 l 916.156 341.754 931.09 337.258 932.301
+ 329.965 c 932.227 326.137 931.559 324.992 931.559 324.992 c h
+869.617 346.715 m 881.41 346.566 894.383 366.523 889.238 379.129 c 909.723
+ 395.227 922.215 377.875 935.555 369.203 c 962.754 354.188 969.785 356.102
+ 978.707 357.473 c 978 377.777 973.379 398.656 957.926 426.973 c 932.07 
+505.867 893.809 535.328 854.266 567.863 c 773.895 635.305 691.504 697.004
+ 600.34 750.48 c 581.098 760.629 566.422 766.246 550.883 758.367 c 552.508
+ 733.074 562.293 711.105 575.012 685.809 c 599.723 643.137 624.457 603.18
+ 646.707 557.734 c 701.762 461.715 744.281 424.805 788.02 387.641 c 810.488
+ 372.332 817.66 366.059 824.414 366.141 c 831.258 376.402 856.727 383.457
+ 859.547 379.984 c 854.406 377.676 854.074 375.219 854.289 370.789 c 856.758
+ 353.203 863 346.797 869.617 346.715 c h
+967.812 538.496 m 987.859 547.559 1024.75 578.168 1063.395 599.801 c 1135.418
+ 758.137 1138.727 956.129 1130.129 1060.852 c 1125.969 1093.961 1122.641
+ 1088.188 1112.367 1081.16 c 1001.41 986.957 946.695 851.547 865.684 754.898
+ c 813.285 714.82 753.328 695.617 739.617 677.297 c 841.207 609.602 919.535
+ 552.836 967.812 538.496 c h
+578.949 649.465 m 582.625 649.613 576.047 661.262 573.328 665.98 c 557.789
+ 691.105 548.273 720.832 536.887 747.91 c 529.672 763.188 520.93 768.02 
+513.164 766.078 c 504.371 763.195 491.543 749.426 499.637 737.18 c 522.387
+ 710.484 542.207 678.039 571.336 653.832 c 575.363 650.645 577.727 649.414
+ 578.949 649.465 c h
+593.453 765.883 m 602.512 765.863 551.773 800.906 539.789 804.66 c 526.652
+ 789.449 561.559 777.637 573.242 773.828 c 584.953 768.168 591.145 765.887
+ 593.453 765.883 c h
+468.012 769.668 m 471.094 783.312 482.242 789.922 489.297 795.098 c 484.004
+ 800.496 480.375 804.027 474.762 807.812 c 466.156 801.684 458.281 797.438
+ 454.012 786.043 c 458.996 778.883 462.414 774.988 468.012 769.668 c h
+437.176 805.754 m 441.148 813.277 448.23 822.336 455.449 826.727 c 452.07
+ 830.68 448.418 834.965 443.676 838.008 c 435.465 833.68 427.602 824.152
+ 424.637 818.383 c 428.773 812.449 433.953 807.379 437.176 805.754 c h
+506.078 811.891 m 510.27 823.156 516.348 825.828 520.125 828.805 c 517.43
+ 831.699 515.309 835.055 507.691 839.086 c 504.027 837.867 496.203 829.574
+ 494.266 822.691 c 499.383 816.711 501.359 815.805 506.078 811.891 c h
+472.105 843.156 m 474.82 850.625 478.875 856.422 485.676 859.809 c 482.109
+ 865.332 479.617 867 475.023 869.395 c 472.617 867.449 466.75 863.355 461.203
+ 853.621 c 465.832 848.426 467.949 846.832 472.105 843.156 c h
+399.703 852.07 m 407.094 869.613 423.262 880.941 437.027 895.938 c 434.898
+ 897.16 434.121 901.664 430.547 901.73 c 417.07 892.629 402.621 879.5 393.652
+ 859.934 c 396.188 856.246 396.457 855.16 399.703 852.07 c h
+399.703 852.07 m f
+969.785 324.793 m 969.953 323.883 970.711 321.355 972.207 321.996 c 973.75
+ 323.355 974.613 325.277 974.73 328.242 c 974.719 329.715 974.586 330.922
+ 972.676 329.031 c 971.703 327.895 971.332 327.652 969.785 324.793 c h
+969.785 324.793 m f
+Q Q
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.png b/docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.png
new file mode 100644 (file)
index 0000000..814e98e
Binary files /dev/null and b/docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.png differ
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.svg b/docs/reference-manual/plots/GMX_logos/gmx_falcon_blue.svg
new file mode 100644 (file)
index 0000000..a902d69
--- /dev/null
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg1149"
+   version="1.1"
+   viewBox="0 0 450 450"
+   height="450mm"
+   width="450mm"
+   sodipodi:docname="gmx_falcon_blue.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1853"
+     inkscape:window-height="1145"
+     id="namedview971"
+     showgrid="false"
+     inkscape:zoom="0.54798148"
+     inkscape:cx="811.72913"
+     inkscape:cy="863.04061"
+     inkscape:window-x="67"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1149" />
+  <defs
+     id="defs1143">
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect1061"
+       is_visible="true" />
+    <clipPath
+       id="_clip1">
+      <rect
+         id="rect892"
+         height="550.58301"
+         width="291.98801"
+         y="0"
+         x="0" />
+    </clipPath>
+  </defs>
+  <metadata
+     id="metadata1146">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,153)"
+     id="layer1"
+     style="fill:none;fill-opacity:1;stroke:none">
+    <g
+       style="clip-rule:evenodd;fill:none;fill-opacity:1;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;stroke:none"
+       id="g903"
+       transform="matrix(0.82454635,-0.51053871,0.49150293,0.84357369,250.14362,56.767957)">
+      <g
+         style="fill:none;fill-opacity:1;stroke:none"
+         id="g901"
+         transform="translate(-145.994,-275.291)">
+        <clipPath
+           id="clipPath1706">
+          <rect
+             id="rect1704"
+             height="550.58301"
+             width="291.98801"
+             y="0"
+             x="0" />
+        </clipPath>
+        <g
+           style="fill:none;fill-opacity:1;stroke:none"
+           id="g899"
+           clip-path="url(#_clip1)">
+          <g
+             style="fill:none;fill-opacity:1;stroke:none"
+             id="g897"
+             transform="matrix(1,0,0,-1,0,555.789)" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     id="g842"
+     transform="translate(7.10689,-9.54507)"
+     style="fill:#4e6f98;fill-opacity:1;stroke:none;stroke-opacity:1"
+     inkscape:export-xdpi="300"
+     inkscape:export-ydpi="300">
+    <path
+       id="rect1188"
+       d="m 41.158027,36.862134 c -5.067605,0.114086 -10.758954,0.07765 -13.860135,1.501201 -3.184436,1.750423 -2.821989,4.252571 -2.213302,4.913911 0.417703,0.525436 1.728276,1.435139 1.760616,2.509409 -0.355687,1.978739 -8.540643,0.142271 -13.277743,1.026295 -1.971417,0.415488 -3.5883814,1.583925 -3.8328413,2.926953 -0.1140291,2.067041 1.1265423,2.575017 2.4143233,3.470587 3.14977,2.135627 6.507488,3.727368 9.068697,5.87561 1.253729,0.919245 2.45072,1.936756 4.280876,3.156397 8.653728,5.692823 19.338307,10.928703 22.311301,12.905675 35.010808,23.382274 71.391691,46.934698 105.687091,66.210948 17.3743,23.66443 38.03145,47.03499 52.83967,69.91304 -8.51464,13.34908 -16.2153,23.54024 -26.00513,36.47013 -7.47265,9.58647 -12.7242,15.79733 -18.26555,22.44824 -9.9316,12.1082 -20.3747,20.74878 -29.10572,33.20264 -2.05193,2.60951 -3.20382,5.31056 -3.63544,8.1044 -0.48145,7.03834 12.36918,17.7201 13.594,18.20974 3.99488,1.47164 8.26211,-0.72435 11.96775,-2.91196 10.42715,-8.48248 20.01679,-20.35241 33.08119,-30.09894 6.93475,-5.08797 13.21941,-9.99855 21.9971,-16.1897 10.591,-7.75753 18.25921,-14.35134 27.12393,-21.8333 5.47698,-4.00318 8.86884,-3.19925 9.38702,-3.24528 20.18147,9.0007 35.95519,20.41379 47.10463,33.34422 28.81865,37.22362 48.30006,73.10919 74.95976,106.70614 4.2086,5.54379 8.13629,9.04706 11.46699,13.39866 l 4.6173,7.72512 c 0.85704,1.34845 3.62606,4.67968 4.81314,2.45928 4.7075,4.1507 6.35611,8.33985 8.91728,12.16773 2.47981,3.85953 3.59053,5.52575 5.22502,5.58779 1.62536,-0.17732 2.64702,-3.30811 2.75952,-5.3816 -0.0649,-6.43839 -0.52445,-8.39745 -0.0481,-8.76742 0.73313,-0.21656 2.30214,5.63288 9.33794,4.72581 1.70479,-1.07048 0.11292,-9.35281 -1.10744,-29.27882 -6.02679,-59.20256 -17.16104,-119.21909 -37.17034,-172.95587 -1.99855,-5.66626 -4.48439,-10.48003 -7.84603,-13.76092 -7.32869,-8.82859 -15.36353,-15.30351 -23.35414,-21.92579 -4.16065,-3.75625 -8.75593,-7.38237 -12.41112,-11.29027 -3.46615,-3.97565 -2.8878,-10.27856 -0.68832,-15.30862 1.61087,-4.11755 4.69831,-9.86645 5.38314,-11.69128 2.01419,-6.69993 1.62933,-7.52786 2.29907,-13.54749 0.16343,-2.40569 -0.0101,-3.68211 0.98393,-5.44566 1.2501,-1.02021 2.87774,-1.14414 4.55268,-0.39946 2.20314,1.46902 3.36098,1.38574 3.67988,0.78651 -1.08394,-7.57897 -12.61708,-14.35085 -19.2319,-13.53302 -4.14726,-1.2716 -9.57011,-1.31016 -13.54386,-0.78187 -7.45892,1.30469 -13.0538,2.83398 -19.10377,5.13664 -5.25428,2.52614 -9.63744,4.98053 -16.40363,3.48402 -5.38494,-1.27814 -8.0322,-3.40208 -10.32754,-6.35878 C 258.25672,105.39086 250.4662,86.489695 236.56833,74.663963 169.76711,49.628714 108.07696,38.456479 41.158027,36.862134 Z m 67.517843,23.330361 c 42.63832,-0.08655 85.98601,4.362077 122.53465,21.137211 9.83453,13.678189 15.71355,27.725614 23.48642,42.434624 3.25084,8.27418 5.29883,13.76672 1.08417,20.91707 -13.46351,16.24687 -28.38131,35.94725 -41.40471,54.70932 -0.47716,8.97476 -39.3571,-55.48985 -51.45733,-64.65652 C 126.0207,107.30976 121.95681,111.55429 66.71719,68.501031 63.546233,65.6094 60.754649,61.19063 79.362933,60.88134 89.034697,60.474089 98.836261,60.212466 108.67587,60.192495 Z m 224.10261,61.728535 c 1.61918,0.0134 4.3592,0.50304 7.44191,3.23546 -1.51503,1.30658 -1.26156,2.96907 -1.06246,4.66276 -3.49184,-2.02972 -7.76258,1.11022 -13.53354,1.39423 5.12553,-1.16335 7.62283,-3.9631 5.93762,-9.21235 0.26196,-0.036 0.67675,-0.0846 1.21647,-0.0801 z m -11.25204,2.27376 c 1.80433,0.39115 1.17613,0.22457 2.358,1.12603 -2.06709,2.94178 -3.99193,4.41507 -7.0285,3.83026 -2.53238,-0.49634 -3.26144,-1.84438 -4.76457,-3.9424 l 2.32749,-0.27595 c 1.67447,5.17616 6.94156,3.58906 7.3696,1.01647 -0.0265,-1.3497 -0.26202,-1.75441 -0.26202,-1.75441 z m -21.85188,7.6631 c 4.1606,-0.0519 8.73718,6.98868 6.92152,11.43496 7.22731,5.68 11.6341,-0.44184 16.33959,-3.50108 9.59575,-5.29682 12.07622,-4.62248 15.22388,-4.13825 -0.25011,7.1632 -1.87973,14.52802 -7.33186,24.5184 -9.12154,27.83239 -22.61876,38.22475 -36.56884,49.7024 -28.35264,23.79178 -57.41908,45.55891 -89.57953,64.42294 -6.78781,3.58045 -11.96577,5.56231 -17.44752,2.78278 0.57338,-8.92321 4.02562,-16.67319 8.51214,-25.59638 8.71795,-15.05432 17.44359,-29.15045 25.29252,-45.18173 19.42292,-33.87435 34.42263,-46.89517 49.85225,-60.00616 7.9271,-5.40016 10.4566,-7.61296 12.84005,-7.58507 2.4135,3.6206 11.39782,6.10895 12.39303,4.88498 -1.81309,-0.81494 -1.93051,-1.68173 -1.85465,-3.24425 0.87042,-6.20347 3.07342,-8.46441 5.40742,-8.49354 z m 34.64129,67.65685 c 7.07207,3.19673 20.0865,13.99569 33.71887,21.62659 25.40844,55.85701 26.57612,125.70521 23.54276,162.64848 -1.4672,11.68019 -2.6419,9.64332 -6.26526,7.16391 -39.14394,-33.23217 -58.44535,-81.0015 -87.02466,-115.09738 -18.48485,-14.1386 -39.63727,-20.91346 -44.47429,-27.37559 35.83951,-23.88175 63.47121,-43.90715 80.50258,-48.96601 z m -137.18181,39.14697 c 1.29577,0.0524 -1.0241,4.16146 -1.98282,5.82652 -5.48264,8.86367 -8.83948,19.35023 -12.85658,28.90315 -2.54565,5.38871 -5.62861,7.09422 -8.369,6.40889 -3.10141,-1.01735 -7.62708,-5.87401 -4.77181,-10.19471 8.0252,-9.41762 15.0174,-20.8627 25.29459,-29.40338 1.41974,-1.12484 2.2537,-1.55794 2.68562,-1.54047 z m 5.11648,41.06932 c 3.19519,-0.006 -14.70408,12.35567 -18.93166,13.67978 -4.6342,-5.3662 7.67952,-9.53249 11.80083,-10.87683 4.13148,-1.99644 6.31637,-2.80139 7.13083,-2.80295 z m -44.25259,1.33583 c 1.08655,4.8133 5.01897,7.14513 7.50806,8.97155 -1.86677,1.90431 -3.14682,3.14936 -5.12733,4.485 -3.03651,-2.16204 -5.81415,-3.6595 -7.32048,-7.67964 1.75826,-2.5264 2.9648,-3.90054 4.93975,-5.77691 z m -10.87944,12.73051 c 1.40176,2.65409 3.89991,5.84956 6.44715,7.39851 -1.19154,1.39436 -2.48,2.90688 -4.15324,3.98011 -2.89708,-1.52739 -5.67073,-4.88868 -6.71742,-6.92359 1.45994,-2.09373 3.28699,-3.88195 4.42351,-4.45503 z m 24.30808,2.16524 c 1.47874,3.97341 3.62242,4.91559 4.95577,5.96604 -0.95165,1.02195 -1.70013,2.20549 -4.38734,3.62767 -1.2916,-0.42986 -4.05293,-3.35549 -4.73614,-5.78463 1.80532,-2.10955 2.50335,-2.4292 4.16771,-3.80908 z m -11.98532,11.02879 c 0.9577,2.63578 2.38866,4.68077 4.7873,5.8756 -1.2586,1.94784 -2.1378,2.53624 -3.75791,3.38172 -0.84803,-0.68678 -2.91918,-2.1313 -4.87515,-5.56453 1.63216,-1.83277 2.38036,-2.39599 3.84576,-3.69279 z m -25.54211,3.14449 c 2.60746,6.18932 8.31192,10.18577 13.16819,15.47556 -0.75146,0.43161 -1.02531,2.02009 -2.28669,2.0438 -4.75409,-3.20992 -9.85201,-7.84206 -13.01522,-14.74536 0.89392,-1.30024 0.9894,-1.68278 2.13372,-2.774 z"
+       style="opacity:1;fill:#4e6f98;fill-opacity:1;stroke:none;stroke-width:0.06500001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path1103-2"
+       d="m 335.01217,124.12428 c 0.0593,-0.32031 0.32622,-1.21261 0.85352,-0.98617 0.54536,0.47927 0.84953,1.15744 0.89021,2.20293 -0.003,0.51987 -0.0501,0.94543 -0.72424,0.27913 -0.34283,-0.40095 -0.47359,-0.48681 -1.01949,-1.49589 z"
+       style="fill:#4e6f98;fill-opacity:1;stroke:none;stroke-width:0.079375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+  </g>
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.08387499;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 402.8553,420.48816 c -0.38761,-0.38762 -1.86566,-2.50013 -3.28451,-4.69445 -4.94853,-7.65307 -6.21808,-9.4611 -7.5588,-10.76486 -1.15396,-1.12213 -1.45116,-1.25836 -2.04812,-0.93888 -0.94107,0.50364 -0.89794,0.51671 -2.26819,-0.68638 -0.66405,-0.58309 -2.46647,-3.15648 -4.00537,-5.7187 -2.23824,-3.72663 -3.49488,-5.37578 -6.28152,-8.24344 -1.91596,-1.97168 -4.9261,-5.50532 -6.68917,-7.85255 -1.76311,-2.34719 -5.32935,-7.03069 -7.92504,-10.40775 -11.58515,-15.0726 -21.12143,-29.13325 -31.26365,-46.09629 -1.57181,-2.62888 -4.1875,-6.62342 -5.81265,-8.87677 -1.62513,-2.25333 -6.54148,-9.39742 -10.92521,-15.87575 -10.67951,-15.78234 -12.26216,-17.99661 -15.7277,-22.00436 -4.51625,-5.2229 -8.81423,-9.19438 -14.85046,-13.72237 -3.01593,-2.26237 -7.70186,-5.8788 -10.41312,-8.03652 -2.71127,-2.15773 -6.47782,-5.07261 -8.3701,-6.47753 -3.75774,-2.78991 -13.25898,-8.7634 -15.16656,-9.5353 -0.67677,-0.27386 -2.32078,-0.4797 -3.79117,-0.47469 -4.04953,0.0138 -6.04567,1.18506 -15.52531,9.10962 -9.39565,7.85435 -14.35264,11.73053 -23.70171,18.53386 -12.01407,8.74267 -21.72736,16.12272 -25.45087,19.33733 -1.96961,1.70042 -7.31232,6.73245 -11.87268,11.1823 -11.1677,10.89705 -13.72264,13.08923 -17.23884,14.79116 -2.21591,1.07257 -3.40036,1.42893 -5.17005,1.55556 -2.97729,0.21302 -3.86016,-0.21521 -7.60972,-3.6912 -3.71422,-3.44321 -6.70209,-7.14335 -8.16061,-10.10603 -2.69567,-5.47568 -0.89779,-9.56294 8.52001,-19.36916 10.29864,-10.72343 33.96164,-39.14176 46.37262,-55.69169 8.15693,-10.87718 10.549,-14.21115 15.89171,-22.14922 l 5.02661,-7.46841 -0.99605,-1.97318 c -0.54784,-1.08524 -2.21426,-3.7931 -3.70316,-6.01745 -2.58815,-3.86656 -4.87839,-6.69603 -16.17215,-19.97983 -7.30831,-8.59608 -10.14456,-12.35331 -17.04021,-22.57338 -10.71825,-15.88557 -13.04121,-18.54878 -18.95912,-21.73605 -6.26352,-3.37342 -12.87002,-7.30618 -26.40115,-15.71629 C 117.42939,103.85956 107.98075,98.091115 103.2863,95.300735 88.011271,86.221245 74.928651,77.792543 59.585281,67.145596 46.883905,58.33196 48.567343,59.411563 41.490328,55.541151 33.351457,51.090012 27.687733,47.642012 23.907495,44.836955 c -1.783889,-1.323702 -5.240708,-3.666381 -7.68182,-5.205949 -2.441112,-1.539571 -4.663767,-3.188878 -4.939233,-3.665131 -0.787229,-1.361032 -0.16351,-2.629931 1.762459,-3.585567 1.503804,-0.746162 1.975287,-0.79366 7.617391,-0.767368 3.558696,0.01659 6.284621,-0.11661 6.676271,-0.326213 0.947552,-0.507115 0.818012,-1.418561 -0.362339,-2.549409 -1.30937,-1.254455 -1.369541,-2.780681 -0.166019,-4.210987 2.404007,-2.857 8.24174,-3.189022 36.697342,-2.087167 28.825447,1.116176 52.505933,3.652003 71.536013,7.66044 32.36722,6.817732 67.48613,16.732011 96.09781,27.12899 l 6.65702,2.419043 3.02153,2.981209 c 4.58445,4.523277 6.75886,7.38432 14.68593,19.3234 4.00635,6.034021 8.80547,12.910064 10.66471,15.280093 1.85926,2.370026 4.37912,5.668071 5.59967,7.328981 3.54658,4.82614 7.829,7.16694 13.82729,7.5581 3.22984,0.21063 5.81604,-0.35701 9.90099,-2.17315 6.5417,-2.90839 11.84215,-4.58559 19.25151,-6.09168 4.70787,-0.95696 11.12007,-1.16691 14.41654,-0.47202 1.01148,0.21322 2.22313,0.34409 2.69256,0.29084 3.10353,-0.35207 4.34538,-0.10865 7.65199,1.49992 2.58381,1.25695 3.91525,2.18331 5.9981,4.17327 2.81646,2.69082 4.94903,5.5049 5.30672,7.00254 0.33026,1.38281 -0.61171,1.47723 -3.01932,0.30264 -4.72532,-2.30534 -5.50494,-1.38862 -6.40781,7.5346 -0.79708,7.8779 -1.50532,10.47081 -4.73525,17.33631 -3.96872,8.43587 -4.26527,9.39876 -4.27453,13.8793 -0.007,3.40931 0.0754,3.91294 0.89406,5.46263 1.35374,2.56256 5.75728,6.66147 20.77797,19.34064 7.87304,6.64573 15.52987,14.45793 19.23333,19.62355 3.75033,5.23105 9.44827,21.353 15.95866,45.1542 3.73631,13.65938 16.56665,65.3685 17.87697,72.04809 3.17815,16.20097 6.8082,46.88859 9.07029,76.67802 1.04793,13.80025 1.14326,15.63661 0.88344,17.02152 -0.23326,1.24328 -0.23463,1.24415 -2.01036,1.23664 -2.41567,-0.0103 -4.27887,-0.93755 -6.07573,-3.02408 -0.82791,-0.96131 -1.6433,-1.74795 -1.812,-1.74805 -0.17521,-1.1e-4 -0.22953,2.01258 -0.12674,4.69429 0.19257,5.02126 -0.15697,7.38682 -1.27381,8.62092 -0.79634,0.87995 -2.03099,0.87058 -2.9238,-0.0222 z m -12.0019,-36.69813 c 2.69505,-1.12583 4.60867,-3.93081 6.04481,-8.86061 1.46388,-5.02494 1.7119,-12.11908 1.2479,-35.69121 l -0.39354,-19.99255 -2.03382,-16.71172 c -3.77262,-30.99959 -5.44812,-40.99627 -8.7235,-52.04809 -0.80693,-2.72278 -2.49635,-8.63778 -3.75431,-13.14444 -4.92437,-17.64228 -7.25934,-24.48089 -11.1402,-32.62707 l -2.12852,-4.46795 -3.60556,-2.13708 c -8.07926,-4.78872 -16.56611,-8.86281 -24.99767,-12.00003 -5.72437,-2.12993 -6.03806,-2.15367 -9.69113,-0.73358 -7.89456,3.06892 -16.81144,7.956 -30.54202,16.73916 -4.25453,2.72154 -46.25097,30.72217 -46.73434,31.15956 -0.36102,0.32669 0.8966,2.3527 2.09955,3.38239 1.73467,1.48481 4.76562,3.04555 13.90751,7.16148 11.6618,5.25045 17.8113,8.66166 23.8007,13.2026 2.66763,2.02249 3.62378,3.04213 6.29795,6.71615 7.93695,10.9045 22.11523,32.62735 33.24453,50.93469 5.06357,8.3294 25.22384,35.55614 35.51889,47.96869 3.89358,4.69445 8.70749,10.60945 10.69755,13.14445 4.2151,5.3693 6.80532,8.07511 7.93549,8.28961 1.44272,0.27382 1.66441,0.25244 2.94973,-0.28445 z m -243.49494,-72.37035 0.918,-1.20356 -5.42437,-5.53937 c -3.63408,-3.71113 -5.81875,-6.24028 -6.61931,-7.66305 -0.65723,-1.16803 -1.30236,-2.12825 -1.43364,-2.13384 -0.13128,-0.006 -0.65916,0.54113 -1.17308,1.21489 -0.83695,1.09731 -0.89319,1.33424 -0.53931,2.27177 0.65948,1.74717 2.52673,4.63277 4.58268,7.08199 1.94412,2.31598 7.58536,7.15092 8.36163,7.16651 0.22517,0.005 0.8225,-0.53338 1.3274,-1.19534 z m 15.48279,-11.07334 c 0.86587,-0.55562 2.0037,-1.45841 2.52851,-2.0062 l 0.9542,-0.99597 -1.18532,-0.73255 c -1.45247,-0.89768 -3.55708,-3.18326 -3.99722,-4.34092 -0.37232,-0.97927 -0.38075,-0.97613 -3.14349,1.17277 -1.07972,0.83984 -1.96164,1.77316 -1.95981,2.07407 0.006,0.91122 4.22951,5.74807 5.08801,5.8262 0.0774,0.007 0.84925,-0.44177 1.71512,-0.9974 z m 12.72586,-10.70747 c 0.50887,-0.37479 1.38448,-1.25291 1.94579,-1.95139 l 1.02056,-1.26994 -1.70559,-1.15118 c -1.46729,-0.99036 -3.40534,-3.2729 -3.81019,-4.48741 -0.14172,-0.42519 -5.31197,3.28734 -5.59109,4.01473 -0.29899,0.77915 1.79191,3.45745 3.8494,4.93078 2.06818,1.481 2.16672,1.47902 4.29112,-0.0856 z m -22.77145,-1.62732 2.16438,-2.07833 -2.3417,-2.20906 c -1.28793,-1.21497 -2.82895,-2.96834 -3.42447,-3.89639 -0.59553,-0.92805 -1.15278,-1.68735 -1.23833,-1.68735 -0.29316,0 -3.92864,3.56814 -4.25301,4.17425 -0.38863,0.72615 -0.0131,1.52482 1.71616,3.65024 1.28787,1.5829 4.29051,4.12499 4.87228,4.12499 0.18717,0 1.31428,-0.93525 2.50469,-2.07835 z m 11.62163,-10.88801 c 1.39852,-1.19057 2.54277,-2.28076 2.54277,-2.4226 0,-0.14187 -0.74015,-0.80126 -1.64478,-1.46532 -2.4315,-1.78488 -4.61818,-4.26993 -5.37158,-6.10454 -0.36601,-0.89124 -0.7603,-1.62102 -0.87623,-1.62172 -0.35699,-0.002 -5.42257,5.4309 -5.42257,5.81597 0,0.58381 1.0365,2.44396 2.15384,3.86543 1.46167,1.85952 5.08165,4.65384 5.63082,4.3465 0.24473,-0.13695 1.58921,-1.22312 2.98773,-2.41372 z m 22.81468,-0.0436 c 6.14846,-3.11883 17.09792,-11.51553 16.42863,-12.59846 -0.3913,-0.63314 -2.0395,-0.33396 -4.77831,0.86737 -1.50222,0.65892 -3.72571,1.43094 -4.94107,1.71559 -4.41097,1.03312 -9.20572,3.9431 -10.44468,6.33895 -0.95879,1.85412 -0.28397,4.73708 1.10883,4.73708 0.29473,0 1.4767,-0.47726 2.6266,-1.06053 z m -8.45803,-12.95445 c 1.86934,-0.90494 3.93597,-3.16472 5.18814,-5.67305 0.54686,-1.09549 2.35307,-5.52542 4.01379,-9.84431 1.89462,-4.92716 4.45679,-10.70025 6.8776,-15.49663 3.61083,-7.15414 4.36561,-9.24337 3.52672,-9.76183 -1.49623,-0.92472 -9.02214,6.59835 -25.38294,25.37337 -4.56869,5.24286 -4.72844,5.49024 -4.72844,7.32257 0,2.06196 0.75457,3.68001 2.67223,5.73014 2.83634,3.03228 5.05073,3.69656 7.8329,2.34974 z m 18.73012,-0.16196 c 4.50404,-0.93034 6.69742,-1.9812 15.88833,-7.61217 19.20397,-11.76565 41.64615,-28.23089 67.0879,-49.22062 28.37725,-23.41158 30.33422,-25.12854 35.56368,-31.20247 6.10711,-7.09331 10.78273,-15.02789 14.61027,-24.7939 1.06711,-2.72278 2.79008,-6.79415 3.82881,-9.04748 3.19773,-6.93698 4.9023,-12.96657 5.42427,-19.18736 l 0.23493,-2.79947 -0.93348,-0.23429 c -1.41441,-0.355 -5.22856,0.0777 -7.42267,0.84206 -3.23305,1.12629 -8.06638,3.7271 -10.81768,5.82099 -3.66686,2.79066 -5.27502,3.5454 -7.5616,3.54883 -1.42764,0.002 -2.32458,-0.22947 -3.62075,-0.93494 l -1.72302,-0.93777 v -2.27726 c 0.003,-5.05082 -3.55624,-10.39198 -7.25231,-10.88773 -1.2519,-0.16791 -1.49293,-0.0656 -2.7083,1.14978 -1.48971,1.48971 -2.2307,3.49482 -2.80805,7.5985 -0.33374,2.37229 -0.309,2.59067 0.40225,3.5527 l 0.75785,1.02503 -1.56888,-0.21504 c -1.92738,-0.26418 -6.83641,-2.21301 -9.13114,-3.62498 -0.93517,-0.5754 -2.10902,-1.04618 -2.60858,-1.04618 -0.49956,0 -1.9952,0.54023 -3.32364,1.2005 -9.07378,4.50992 -24.99189,18.77302 -36.76319,32.94092 -8.12603,9.78047 -19.15773,26.78398 -25.13205,38.73684 -3.74299,7.48864 -7.97012,15.22562 -15.39645,28.18035 -3.28314,5.72723 -6.77132,12.02632 -7.7515,13.99799 -3.82968,7.70347 -6.76588,16.66573 -7.21998,22.03779 l -0.2078,2.45828 1.66819,0.53633 c 3.18194,1.02301 5.02663,1.10883 8.4839,0.39472 z m 17.38415,-76.3832 c 0.70059,-0.98583 2.6563,-3.9278 4.34603,-6.5377 4.67986,-7.22836 8.24217,-11.76644 18.97133,-24.16782 13.60989,-15.7311 13.03993,-15.05063 16.85959,-20.12835 5.61801,-7.46838 7.38863,-11.99801 7.05429,-18.04645 -0.29299,-5.30055 -1.37317,-8.61741 -5.55928,-17.07071 -8.23851,-16.636566 -13.70864,-26.626084 -18.7961,-34.325235 l -2.49026,-3.768667 -5.90485,-2.955795 c -3.24766,-1.62569 -8.0352,-3.819999 -10.63896,-4.87625 -4.21145,-1.708428 -5.70034,-2.107822 -13.48586,-3.617568 -19.99049,-3.876504 -45.71177,-8.279028 -75.35352,-12.897716 -18.17493,-2.831962 -22.96819,-3.204403 -41.114423,-3.194624 -12.747286,0.0069 -23.631554,0.630793 -28.361585,1.625785 -5.582044,1.174218 -8.852564,3.600905 -8.852564,6.568496 0,0.535789 0.408437,1.793787 0.907635,2.79555 0.79353,1.592406 1.512469,2.27144 5.718688,5.401265 13.284428,9.884874 24.655127,16.80808 50.731269,30.888438 12.86714,6.947882 19.12688,10.901578 38.10143,24.065131 17.87883,12.4034 20.07347,14.35421 27.95337,24.84776 5.04929,6.72406 14.87759,20.89689 18.16007,26.18761 1.43259,2.30904 5.68341,8.96099 9.44629,14.7821 3.76287,5.82111 7.51695,11.85134 8.34239,13.40051 1.00009,1.87692 1.6994,2.81667 2.09602,2.81667 0.32866,0 1.16563,-0.80268 1.869,-1.79243 z m 120.04841,-69.42429 c 3.03673,-0.90182 7.51036,-5.75765 7.51036,-8.15204 0,-0.82722 -2.42721,-3.11575 -3.52769,-3.32612 -0.4758,-0.0909 -1.57435,0.0802 -2.4412,0.3804 -1.29718,0.44918 -1.68529,0.7898 -2.193,1.92464 -0.99322,2.21999 -5.37073,5.77375 -8.85793,7.19106 -1.68455,0.68465 -1.78242,0.78185 -1.13581,1.1279 2.52823,1.35308 7.59598,1.7597 10.64527,0.85416 z m -16.63274,-2.35996 c 2.01176,-0.68278 3.60053,-1.92295 4.32419,-3.37541 0.56312,-1.13024 0.60019,-1.48044 0.2481,-2.34334 -0.38446,-0.9422 -2.70552,-2.67339 -3.08096,-2.29796 -0.0916,0.0917 -0.0277,0.9102 0.14208,1.819 0.49517,2.65053 -0.25014,3.62531 -2.77836,3.63379 -3.45308,0.0116 -6.8049,-1.84859 -6.8049,-3.77653 0,-0.93323 -0.43794,-0.81418 -1.30144,0.35379 -1.77154,2.39613 -0.13763,5.343 3.61077,6.51228 1.10395,0.34436 3.824,0.0909 5.64052,-0.52562 z"
+     id="path831-6"
+     inkscape:connector-curvature="0" />
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.20005751;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="M 14.06821,224.61657 V 13.281165 H 229.50059 444.93297 V 224.61657 435.95197 H 229.50059 14.06821 Z m 404.12274,193.92328 c 0.5435,-1.62671 0.7697,-4.1896 0.5593,-6.33717 l -0.35327,-3.60588 2.02141,1.70093 c 2.0872,1.75623 6.12111,2.91418 7.39955,2.12405 1.60986,-0.99494 0.17246,-22.58171 -4.09392,-61.48194 -2.4121,-21.99331 -5.16745,-36.13264 -13.63898,-69.98992 -11.76766,-47.03046 -17.6915,-66.87399 -23.29045,-78.018 -3.05414,-6.07884 -10.94711,-14.35468 -26.24072,-27.51359 -7.70318,-6.62795 -14.53054,-12.85172 -15.17192,-13.83061 -0.82087,-1.25278 -1.16618,-3.20403 -1.16618,-6.58963 0,-4.35473 0.33187,-5.52352 3.50761,-12.35284 3.55949,-7.65455 4.61097,-11.45131 5.38062,-19.42871 0.23553,-2.44111 0.5901,-5.00653 0.78798,-5.70093 0.37098,-1.30199 0.33621,-1.30199 6.54095,-5.3e-4 1.54467,0.32399 1.8778,0.156 1.8778,-0.94685 0,-3.12282 -5.89139,-9.23258 -11.77985,-12.21649 -3.14418,-1.59327 -4.14446,-1.72579 -13.72995,-1.81898 -9.30704,-0.0905 -10.99375,0.0821 -16.90309,1.72985 -3.61043,1.00672 -9.14133,2.97297 -12.2909,4.36947 -4.71006,2.08838 -6.51436,2.5377 -10.16492,2.53131 -5.43171,-0.01 -10.0982,-2.02949 -12.9921,-5.62394 -5.28934,-6.569715 -9.48063,-12.381459 -17.34876,-24.056284 -4.71236,-6.992276 -10.5708,-14.876508 -13.01876,-17.520534 -4.07293,-4.399143 -4.95761,-4.993093 -10.41936,-6.995271 -25.71854,-9.427965 -62.78731,-20.104596 -91.32207,-26.302797 -24.99826,-5.430018 -46.11902,-7.7814 -82.62224,-9.198365 -25.281038,-0.981346 -31.391329,-0.296052 -33.223994,3.72621 -0.657606,1.443286 -0.588283,1.965651 0.406778,3.06518 2.027119,2.239942 0.706721,3.002338 -4.4509,2.569941 -5.257843,-0.440798 -8.754616,0.294018 -10.481939,2.20269 -1.675594,1.851509 -0.526919,3.6497 4.263174,6.673774 2.135556,1.348216 5.880103,3.907541 8.321215,5.687385 2.441112,1.779847 9.201114,5.936015 15.022225,9.23593 5.821114,3.299918 15.039298,9.112314 20.484854,12.916437 17.237706,12.04181 35.396697,23.43117 78.525277,49.251214 7.69889,4.60914 14.9076,8.93819 16.01936,9.62011 2.73356,1.67669 7.33706,7.47958 15.41699,19.43373 7.52724,11.13648 11.36327,16.09208 22.12073,28.57691 6.5659,7.62022 15.40859,19.72547 15.40859,21.09369 0,0.98837 -10.48111,16.19991 -19.17373,27.8274 -12.73728,17.03771 -37.03022,46.31957 -49.4739,59.63409 -6.03066,6.45268 -7.82916,9.51545 -7.82916,13.33267 0,3.91626 1.8597,7.03435 7.83963,13.14445 5.2848,5.3998 5.63993,5.63306 8.56716,5.62666 5.52045,-0.0122 8.99274,-2.34167 21.83161,-14.64715 14.18025,-13.59112 16.84365,-15.7983 36.87274,-30.55676 8.45,-6.22638 19.48536,-14.76417 24.52303,-18.97285 11.09409,-9.26847 13.29309,-10.52481 17.68342,-10.10296 4.09603,0.39358 12.51358,5.75634 28.97035,18.4568 19.38356,14.95924 21.33819,17.09146 37.40819,40.80736 5.72577,8.45 11.23762,16.43909 12.24857,17.75354 1.01095,1.31445 3.0185,4.38717 4.46122,6.82829 12.48767,21.1296 36.74097,55.2092 47.13671,66.23436 1.94765,2.06555 4.68128,5.6728 6.07473,8.01611 2.55003,4.28829 4.88508,6.58284 5.99863,5.8946 1.06125,-0.65587 2.72003,1.28212 7.85556,9.17782 4.56163,7.01328 5.19526,7.70519 6.87851,7.51109 1.48198,-0.17086 2.03718,-0.76189 2.76659,-2.94507 z"
+     id="path835-1"
+     inkscape:connector-curvature="0" />
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.20005751;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="M 14.06821,224.61657 V 13.281165 H 229.50059 444.93297 V 224.61657 435.95197 H 229.50059 14.06821 Z m 404.12274,193.92328 c 0.5435,-1.62671 0.7697,-4.1896 0.5593,-6.33717 l -0.35327,-3.60588 2.02141,1.70093 c 2.0872,1.75623 6.12111,2.91418 7.39955,2.12405 1.60986,-0.99494 0.17246,-22.58171 -4.09392,-61.48194 -2.4121,-21.99331 -5.16745,-36.13264 -13.63898,-69.98992 -11.76766,-47.03046 -17.6915,-66.87399 -23.29045,-78.018 -3.05414,-6.07884 -10.94711,-14.35468 -26.24072,-27.51359 -7.70318,-6.62795 -14.53054,-12.85172 -15.17192,-13.83061 -0.82087,-1.25278 -1.16618,-3.20403 -1.16618,-6.58963 0,-4.35473 0.33187,-5.52352 3.50761,-12.35284 3.55949,-7.65455 4.61097,-11.45131 5.38062,-19.42871 0.23553,-2.44111 0.5901,-5.00653 0.78798,-5.70093 0.37098,-1.30199 0.33621,-1.30199 6.54095,-5.3e-4 1.54467,0.32399 1.8778,0.156 1.8778,-0.94685 0,-3.12282 -5.89139,-9.23258 -11.77985,-12.21649 -3.14418,-1.59327 -4.14446,-1.72579 -13.72995,-1.81898 -9.30704,-0.0905 -10.99375,0.0821 -16.90309,1.72985 -3.61043,1.00672 -9.14133,2.97297 -12.2909,4.36947 -4.71006,2.08838 -6.51436,2.5377 -10.16492,2.53131 -5.43171,-0.01 -10.0982,-2.02949 -12.9921,-5.62394 -5.28934,-6.569715 -9.48063,-12.381459 -17.34876,-24.056284 -4.71236,-6.992276 -10.5708,-14.876508 -13.01876,-17.520534 -4.07293,-4.399143 -4.95761,-4.993093 -10.41936,-6.995271 -25.71854,-9.427965 -62.78731,-20.104596 -91.32207,-26.302797 -24.99826,-5.430018 -46.11902,-7.7814 -82.62224,-9.198365 -25.281038,-0.981346 -31.391329,-0.296052 -33.223994,3.72621 -0.657606,1.443286 -0.588283,1.965651 0.406778,3.06518 2.027119,2.239942 0.706721,3.002338 -4.4509,2.569941 -5.257843,-0.440798 -8.754616,0.294018 -10.481939,2.20269 -1.675594,1.851509 -0.526919,3.6497 4.263174,6.673774 2.135556,1.348216 5.880103,3.907541 8.321215,5.687385 2.441112,1.779847 9.201114,5.936015 15.022225,9.23593 5.821114,3.299918 15.039298,9.112314 20.484854,12.916437 17.237706,12.04181 35.396697,23.43117 78.525277,49.251214 7.69889,4.60914 14.9076,8.93819 16.01936,9.62011 2.73356,1.67669 7.33706,7.47958 15.41699,19.43373 7.52724,11.13648 11.36327,16.09208 22.12073,28.57691 6.5659,7.62022 15.40859,19.72547 15.40859,21.09369 0,0.98837 -10.48111,16.19991 -19.17373,27.8274 -12.73728,17.03771 -37.03022,46.31957 -49.4739,59.63409 -6.03066,6.45268 -7.82916,9.51545 -7.82916,13.33267 0,3.91626 1.8597,7.03435 7.83963,13.14445 5.2848,5.3998 5.63993,5.63306 8.56716,5.62666 5.52045,-0.0122 8.99274,-2.34167 21.83161,-14.64715 14.18025,-13.59112 16.84365,-15.7983 36.87274,-30.55676 8.45,-6.22638 19.48536,-14.76417 24.52303,-18.97285 11.09409,-9.26847 13.29309,-10.52481 17.68342,-10.10296 4.09603,0.39358 12.51358,5.75634 28.97035,18.4568 19.38356,14.95924 21.33819,17.09146 37.40819,40.80736 5.72577,8.45 11.23762,16.43909 12.24857,17.75354 1.01095,1.31445 3.0185,4.38717 4.46122,6.82829 12.48767,21.1296 36.74097,55.2092 47.13671,66.23436 1.94765,2.06555 4.68128,5.6728 6.07473,8.01611 2.55003,4.28829 4.88508,6.58284 5.99863,5.8946 1.06125,-0.65587 2.72003,1.28212 7.85556,9.17782 4.56163,7.01328 5.19526,7.70519 6.87851,7.51109 1.48198,-0.17086 2.03718,-0.76189 2.76659,-2.94507 z"
+     id="path837-8"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.eps b/docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.eps
new file mode 100644 (file)
index 0000000..d3bd454
--- /dev/null
@@ -0,0 +1,169 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.15.10 (http://cairographics.org)
+%%CreationDate: Tue Dec 22 10:30:01 2020
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 47 64 1201 1199
+%%EndComments
+%%BeginProlog
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_data_source {
+  CairoDataIndex CairoData length lt
+    { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
+    { () } ifelse
+} def
+/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
+/cairo_image { image cairo_flush_ascii85_file } def
+/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 47 64 1201 1199
+%%EndPageSetup
+q 47 64 1154 1135 rectclip
+1 0 0 -1 0 1276 cm q
+0.92549 g
+136.812 77.434 m 122.449 77.758 106.316 77.656 97.523 81.691 c 88.5 86.652
+ 89.527 93.742 91.25 95.617 c 92.434 97.109 96.152 99.688 96.242 102.73 
+c 95.234 108.34 72.031 103.137 58.605 105.641 c 53.016 106.82 48.434 110.133
+ 47.738 113.938 c 47.418 119.797 50.934 121.238 54.582 123.777 c 63.512 
+129.828 73.031 134.34 80.289 140.43 c 83.844 143.035 87.238 145.922 92.426
+ 149.379 c 116.953 165.516 147.242 180.359 155.668 185.961 c 254.914 252.242
+ 358.039 319.004 455.254 373.645 c 504.504 440.727 563.059 506.973 605.035
+ 571.824 c 580.902 609.664 559.07 638.555 531.32 675.203 c 510.141 702.379
+ 495.254 719.984 479.543 738.836 c 451.391 773.16 421.789 797.652 397.039
+ 832.957 c 391.223 840.352 387.957 848.008 386.734 855.93 c 385.371 875.879
+ 421.797 906.16 425.27 907.547 c 436.594 911.719 448.691 905.492 459.195
+ 899.293 c 488.75 875.246 515.934 841.602 552.969 813.973 c 572.625 799.551
+ 590.441 785.629 615.32 768.082 c 645.344 746.09 667.078 727.398 692.207
+ 706.191 c 707.734 694.844 717.348 697.121 718.816 696.992 c 776.023 722.504
+ 820.738 754.855 852.34 791.512 c 934.031 897.027 989.254 998.75 1064.824
+ 1093.984 c 1076.758 1109.699 1087.891 1119.629 1097.332 1131.965 c 1110.418
+ 1153.863 l 1112.848 1157.684 1120.699 1167.129 1124.062 1160.836 c 1137.406
+ 1172.602 1142.082 1184.473 1149.34 1195.324 c 1156.371 1206.266 1159.52
+ 1210.988 1164.152 1211.164 c 1168.758 1210.66 1171.656 1201.789 1171.973
+ 1195.91 c 1171.789 1177.66 1170.488 1172.105 1171.836 1171.059 c 1173.914
+ 1170.445 1178.363 1187.023 1198.309 1184.453 c 1203.141 1181.418 1198.629
+ 1157.941 1195.168 1101.457 c 1178.086 933.641 1146.523 763.516 1089.805
+ 611.191 c 1084.137 595.129 1077.09 581.48 1067.562 572.184 c 1046.789 547.156
+ 1024.012 528.801 1001.363 510.031 c 989.566 499.383 976.543 489.105 966.18
+ 478.027 c 956.355 466.758 957.996 448.891 964.23 434.633 c 968.797 422.961
+ 977.547 406.664 979.488 401.492 c 985.199 382.5 984.105 380.152 986.004
+ 363.09 c 986.469 356.27 985.977 352.652 988.793 347.652 c 992.34 344.762
+ 996.953 344.41 1001.699 346.52 c 1007.945 350.684 1011.227 350.449 1012.133
+ 348.75 c 1009.059 327.266 976.367 308.07 957.617 310.387 c 945.859 306.785
+ 930.488 306.676 919.223 308.172 c 898.082 311.871 882.219 316.207 865.07
+ 322.734 c 850.176 329.895 837.754 336.852 818.574 332.609 c 803.309 328.984
+ 795.805 322.965 789.297 314.582 c 752.211 271.688 730.129 218.109 690.734
+ 184.59 c 501.375 113.621 326.504 81.953 136.812 77.434 c h
+328.203 143.566 m 449.066 143.32 571.941 155.934 675.547 203.484 c 703.422
+ 242.258 720.086 282.078 742.121 323.77 c 751.336 347.227 757.141 362.793
+ 745.195 383.062 c 707.031 429.117 664.742 484.961 627.828 538.145 c 626.473
+ 563.586 516.262 380.852 481.965 354.867 c 377.371 277.129 365.852 289.16
+ 209.266 167.121 c 200.277 158.922 192.363 146.398 245.109 145.52 c 272.527
+ 144.367 300.312 143.625 328.203 143.566 c h
+963.453 318.547 m 968.043 318.586 975.812 319.973 984.551 327.719 c 980.254
+ 331.422 980.973 336.133 981.539 340.934 c 971.641 335.18 959.535 344.082
+ 943.176 344.887 c 957.703 341.59 964.785 333.652 960.008 318.773 c 960.75
+ 318.672 961.926 318.535 963.453 318.547 c h
+931.559 324.992 m 936.672 326.102 934.895 325.629 938.242 328.184 c 932.383
+ 336.523 926.926 340.699 918.32 339.039 c 911.141 337.633 909.074 333.812
+ 904.812 327.867 c 911.41 327.082 l 916.156 341.754 931.09 337.258 932.301
+ 329.965 c 932.227 326.137 931.559 324.992 931.559 324.992 c h
+869.617 346.715 m 881.41 346.566 894.383 366.523 889.238 379.129 c 909.723
+ 395.227 922.215 377.875 935.555 369.203 c 962.754 354.188 969.785 356.102
+ 978.707 357.473 c 978 377.777 973.379 398.656 957.926 426.973 c 932.07 
+505.867 893.809 535.328 854.266 567.863 c 773.895 635.305 691.504 697.004
+ 600.34 750.48 c 581.098 760.629 566.422 766.246 550.883 758.367 c 552.508
+ 733.074 562.293 711.105 575.012 685.809 c 599.723 643.137 624.457 603.18
+ 646.707 557.734 c 701.762 461.715 744.281 424.805 788.02 387.641 c 810.488
+ 372.332 817.66 366.059 824.414 366.141 c 831.258 376.402 856.727 383.457
+ 859.547 379.984 c 854.406 377.676 854.074 375.219 854.289 370.789 c 856.758
+ 353.203 863 346.797 869.617 346.715 c h
+967.812 538.496 m 987.859 547.559 1024.75 578.168 1063.395 599.801 c 1135.418
+ 758.137 1138.727 956.129 1130.129 1060.852 c 1125.969 1093.961 1122.641
+ 1088.188 1112.367 1081.16 c 1001.41 986.957 946.695 851.547 865.684 754.898
+ c 813.285 714.82 753.328 695.617 739.617 677.297 c 841.207 609.602 919.535
+ 552.836 967.812 538.496 c h
+578.949 649.465 m 582.625 649.613 576.047 661.262 573.328 665.98 c 557.789
+ 691.105 548.273 720.832 536.887 747.91 c 529.672 763.188 520.93 768.02 
+513.164 766.078 c 504.371 763.195 491.543 749.426 499.637 737.18 c 522.387
+ 710.484 542.207 678.039 571.336 653.832 c 575.363 650.645 577.727 649.414
+ 578.949 649.465 c h
+593.453 765.883 m 602.512 765.863 551.773 800.906 539.789 804.66 c 526.652
+ 789.449 561.559 777.637 573.242 773.828 c 584.953 768.168 591.145 765.887
+ 593.453 765.883 c h
+468.012 769.668 m 471.094 783.312 482.242 789.922 489.297 795.098 c 484.004
+ 800.496 480.375 804.027 474.762 807.812 c 466.156 801.684 458.281 797.438
+ 454.012 786.043 c 458.996 778.883 462.414 774.988 468.012 769.668 c h
+437.176 805.754 m 441.148 813.277 448.23 822.336 455.449 826.727 c 452.07
+ 830.68 448.418 834.965 443.676 838.008 c 435.465 833.68 427.602 824.152
+ 424.637 818.383 c 428.773 812.449 433.953 807.379 437.176 805.754 c h
+506.078 811.891 m 510.27 823.156 516.348 825.828 520.125 828.805 c 517.43
+ 831.699 515.309 835.055 507.691 839.086 c 504.027 837.867 496.203 829.574
+ 494.266 822.691 c 499.383 816.711 501.359 815.805 506.078 811.891 c h
+472.105 843.156 m 474.82 850.625 478.875 856.422 485.676 859.809 c 482.109
+ 865.332 479.617 867 475.023 869.395 c 472.617 867.449 466.75 863.355 461.203
+ 853.621 c 465.832 848.426 467.949 846.832 472.105 843.156 c h
+399.703 852.07 m 407.094 869.613 423.262 880.941 437.027 895.938 c 434.898
+ 897.16 434.121 901.664 430.547 901.73 c 417.07 892.629 402.621 879.5 393.652
+ 859.934 c 396.188 856.246 396.457 855.16 399.703 852.07 c h
+399.703 852.07 m f
+969.785 324.793 m 969.953 323.883 970.711 321.355 972.207 321.996 c 973.75
+ 323.355 974.613 325.277 974.73 328.242 c 974.719 329.715 974.586 330.922
+ 972.676 329.031 c 971.703 327.895 971.332 327.652 969.785 324.793 c h
+969.785 324.793 m f
+Q Q
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.png b/docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.png
new file mode 100644 (file)
index 0000000..b305a9c
Binary files /dev/null and b/docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.png differ
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.svg b/docs/reference-manual/plots/GMX_logos/gmx_falcon_waterstamp.svg
new file mode 100644 (file)
index 0000000..d2d534c
--- /dev/null
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg1149"
+   version="1.1"
+   viewBox="0 0 450 450"
+   height="450mm"
+   width="450mm"
+   sodipodi:docname="gmx_falcon.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1853"
+     inkscape:window-height="1145"
+     id="namedview971"
+     showgrid="false"
+     inkscape:zoom="0.54798148"
+     inkscape:cx="820.2007"
+     inkscape:cy="886.1642"
+     inkscape:window-x="67"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1149" />
+  <defs
+     id="defs1143">
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect1061"
+       is_visible="true" />
+    <clipPath
+       id="_clip1">
+      <rect
+         id="rect892"
+         height="550.58301"
+         width="291.98801"
+         y="0"
+         x="0" />
+    </clipPath>
+  </defs>
+  <metadata
+     id="metadata1146">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,153)"
+     id="layer1"
+     style="fill:none;fill-opacity:1;stroke:none">
+    <g
+       style="clip-rule:evenodd;fill:none;fill-opacity:1;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;stroke:none"
+       id="g903"
+       transform="matrix(0.82454635,-0.51053871,0.49150293,0.84357369,250.14362,56.767957)">
+      <g
+         style="fill:none;fill-opacity:1;stroke:none"
+         id="g901"
+         transform="translate(-145.994,-275.291)">
+        <clipPath
+           id="clipPath1706">
+          <rect
+             id="rect1704"
+             height="550.58301"
+             width="291.98801"
+             y="0"
+             x="0" />
+        </clipPath>
+        <g
+           style="fill:none;fill-opacity:1;stroke:none"
+           id="g899"
+           clip-path="url(#_clip1)">
+          <g
+             style="fill:none;fill-opacity:1;stroke:none"
+             id="g897"
+             transform="matrix(1,0,0,-1,0,555.789)" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     id="g842"
+     transform="translate(7.10689,-9.54507)"
+     style="fill:#ececec;fill-opacity:1;stroke:none;stroke-opacity:1"
+     inkscape:export-filename="/home/cathrine/Pictures/svg_files/GROMACS_logo/GMX_logos/gmx_falcon_white.png"
+     inkscape:export-xdpi="300"
+     inkscape:export-ydpi="300">
+    <path
+       id="rect1188"
+       d="m 41.158027,36.862134 c -5.067605,0.114086 -10.758954,0.07765 -13.860135,1.501201 -3.184436,1.750423 -2.821989,4.252571 -2.213302,4.913911 0.417703,0.525436 1.728276,1.435139 1.760616,2.509409 -0.355687,1.978739 -8.540643,0.142271 -13.277743,1.026295 -1.971417,0.415488 -3.5883814,1.583925 -3.8328413,2.926953 -0.1140291,2.067041 1.1265423,2.575017 2.4143233,3.470587 3.14977,2.135627 6.507488,3.727368 9.068697,5.87561 1.253729,0.919245 2.45072,1.936756 4.280876,3.156397 8.653728,5.692823 19.338307,10.928703 22.311301,12.905675 35.010808,23.382274 71.391691,46.934698 105.687091,66.210948 17.3743,23.66443 38.03145,47.03499 52.83967,69.91304 -8.51464,13.34908 -16.2153,23.54024 -26.00513,36.47013 -7.47265,9.58647 -12.7242,15.79733 -18.26555,22.44824 -9.9316,12.1082 -20.3747,20.74878 -29.10572,33.20264 -2.05193,2.60951 -3.20382,5.31056 -3.63544,8.1044 -0.48145,7.03834 12.36918,17.7201 13.594,18.20974 3.99488,1.47164 8.26211,-0.72435 11.96775,-2.91196 10.42715,-8.48248 20.01679,-20.35241 33.08119,-30.09894 6.93475,-5.08797 13.21941,-9.99855 21.9971,-16.1897 10.591,-7.75753 18.25921,-14.35134 27.12393,-21.8333 5.47698,-4.00318 8.86884,-3.19925 9.38702,-3.24528 20.18147,9.0007 35.95519,20.41379 47.10463,33.34422 28.81865,37.22362 48.30006,73.10919 74.95976,106.70614 4.2086,5.54379 8.13629,9.04706 11.46699,13.39866 l 4.6173,7.72512 c 0.85704,1.34845 3.62606,4.67968 4.81314,2.45928 4.7075,4.1507 6.35611,8.33985 8.91728,12.16773 2.47981,3.85953 3.59053,5.52575 5.22502,5.58779 1.62536,-0.17732 2.64702,-3.30811 2.75952,-5.3816 -0.0649,-6.43839 -0.52445,-8.39745 -0.0481,-8.76742 0.73313,-0.21656 2.30214,5.63288 9.33794,4.72581 1.70479,-1.07048 0.11292,-9.35281 -1.10744,-29.27882 -6.02679,-59.20256 -17.16104,-119.21909 -37.17034,-172.95587 -1.99855,-5.66626 -4.48439,-10.48003 -7.84603,-13.76092 -7.32869,-8.82859 -15.36353,-15.30351 -23.35414,-21.92579 -4.16065,-3.75625 -8.75593,-7.38237 -12.41112,-11.29027 -3.46615,-3.97565 -2.8878,-10.27856 -0.68832,-15.30862 1.61087,-4.11755 4.69831,-9.86645 5.38314,-11.69128 2.01419,-6.69993 1.62933,-7.52786 2.29907,-13.54749 0.16343,-2.40569 -0.0101,-3.68211 0.98393,-5.44566 1.2501,-1.02021 2.87774,-1.14414 4.55268,-0.39946 2.20314,1.46902 3.36098,1.38574 3.67988,0.78651 -1.08394,-7.57897 -12.61708,-14.35085 -19.2319,-13.53302 -4.14726,-1.2716 -9.57011,-1.31016 -13.54386,-0.78187 -7.45892,1.30469 -13.0538,2.83398 -19.10377,5.13664 -5.25428,2.52614 -9.63744,4.98053 -16.40363,3.48402 -5.38494,-1.27814 -8.0322,-3.40208 -10.32754,-6.35878 C 258.25672,105.39086 250.4662,86.489695 236.56833,74.663963 169.76711,49.628714 108.07696,38.456479 41.158027,36.862134 Z m 67.517843,23.330361 c 42.63832,-0.08655 85.98601,4.362077 122.53465,21.137211 9.83453,13.678189 15.71355,27.725614 23.48642,42.434624 3.25084,8.27418 5.29883,13.76672 1.08417,20.91707 -13.46351,16.24687 -28.38131,35.94725 -41.40471,54.70932 -0.47716,8.97476 -39.3571,-55.48985 -51.45733,-64.65652 C 126.0207,107.30976 121.95681,111.55429 66.71719,68.501031 63.546233,65.6094 60.754649,61.19063 79.362933,60.88134 89.034697,60.474089 98.836261,60.212466 108.67587,60.192495 Z m 224.10261,61.728535 c 1.61918,0.0134 4.3592,0.50304 7.44191,3.23546 -1.51503,1.30658 -1.26156,2.96907 -1.06246,4.66276 -3.49184,-2.02972 -7.76258,1.11022 -13.53354,1.39423 5.12553,-1.16335 7.62283,-3.9631 5.93762,-9.21235 0.26196,-0.036 0.67675,-0.0846 1.21647,-0.0801 z m -11.25204,2.27376 c 1.80433,0.39115 1.17613,0.22457 2.358,1.12603 -2.06709,2.94178 -3.99193,4.41507 -7.0285,3.83026 -2.53238,-0.49634 -3.26144,-1.84438 -4.76457,-3.9424 l 2.32749,-0.27595 c 1.67447,5.17616 6.94156,3.58906 7.3696,1.01647 -0.0265,-1.3497 -0.26202,-1.75441 -0.26202,-1.75441 z m -21.85188,7.6631 c 4.1606,-0.0519 8.73718,6.98868 6.92152,11.43496 7.22731,5.68 11.6341,-0.44184 16.33959,-3.50108 9.59575,-5.29682 12.07622,-4.62248 15.22388,-4.13825 -0.25011,7.1632 -1.87973,14.52802 -7.33186,24.5184 -9.12154,27.83239 -22.61876,38.22475 -36.56884,49.7024 -28.35264,23.79178 -57.41908,45.55891 -89.57953,64.42294 -6.78781,3.58045 -11.96577,5.56231 -17.44752,2.78278 0.57338,-8.92321 4.02562,-16.67319 8.51214,-25.59638 8.71795,-15.05432 17.44359,-29.15045 25.29252,-45.18173 19.42292,-33.87435 34.42263,-46.89517 49.85225,-60.00616 7.9271,-5.40016 10.4566,-7.61296 12.84005,-7.58507 2.4135,3.6206 11.39782,6.10895 12.39303,4.88498 -1.81309,-0.81494 -1.93051,-1.68173 -1.85465,-3.24425 0.87042,-6.20347 3.07342,-8.46441 5.40742,-8.49354 z m 34.64129,67.65685 c 7.07207,3.19673 20.0865,13.99569 33.71887,21.62659 25.40844,55.85701 26.57612,125.70521 23.54276,162.64848 -1.4672,11.68019 -2.6419,9.64332 -6.26526,7.16391 -39.14394,-33.23217 -58.44535,-81.0015 -87.02466,-115.09738 -18.48485,-14.1386 -39.63727,-20.91346 -44.47429,-27.37559 35.83951,-23.88175 63.47121,-43.90715 80.50258,-48.96601 z m -137.18181,39.14697 c 1.29577,0.0524 -1.0241,4.16146 -1.98282,5.82652 -5.48264,8.86367 -8.83948,19.35023 -12.85658,28.90315 -2.54565,5.38871 -5.62861,7.09422 -8.369,6.40889 -3.10141,-1.01735 -7.62708,-5.87401 -4.77181,-10.19471 8.0252,-9.41762 15.0174,-20.8627 25.29459,-29.40338 1.41974,-1.12484 2.2537,-1.55794 2.68562,-1.54047 z m 5.11648,41.06932 c 3.19519,-0.006 -14.70408,12.35567 -18.93166,13.67978 -4.6342,-5.3662 7.67952,-9.53249 11.80083,-10.87683 4.13148,-1.99644 6.31637,-2.80139 7.13083,-2.80295 z m -44.25259,1.33583 c 1.08655,4.8133 5.01897,7.14513 7.50806,8.97155 -1.86677,1.90431 -3.14682,3.14936 -5.12733,4.485 -3.03651,-2.16204 -5.81415,-3.6595 -7.32048,-7.67964 1.75826,-2.5264 2.9648,-3.90054 4.93975,-5.77691 z m -10.87944,12.73051 c 1.40176,2.65409 3.89991,5.84956 6.44715,7.39851 -1.19154,1.39436 -2.48,2.90688 -4.15324,3.98011 -2.89708,-1.52739 -5.67073,-4.88868 -6.71742,-6.92359 1.45994,-2.09373 3.28699,-3.88195 4.42351,-4.45503 z m 24.30808,2.16524 c 1.47874,3.97341 3.62242,4.91559 4.95577,5.96604 -0.95165,1.02195 -1.70013,2.20549 -4.38734,3.62767 -1.2916,-0.42986 -4.05293,-3.35549 -4.73614,-5.78463 1.80532,-2.10955 2.50335,-2.4292 4.16771,-3.80908 z m -11.98532,11.02879 c 0.9577,2.63578 2.38866,4.68077 4.7873,5.8756 -1.2586,1.94784 -2.1378,2.53624 -3.75791,3.38172 -0.84803,-0.68678 -2.91918,-2.1313 -4.87515,-5.56453 1.63216,-1.83277 2.38036,-2.39599 3.84576,-3.69279 z m -25.54211,3.14449 c 2.60746,6.18932 8.31192,10.18577 13.16819,15.47556 -0.75146,0.43161 -1.02531,2.02009 -2.28669,2.0438 -4.75409,-3.20992 -9.85201,-7.84206 -13.01522,-14.74536 0.89392,-1.30024 0.9894,-1.68278 2.13372,-2.774 z"
+       style="opacity:1;fill:#ececec;fill-opacity:1;stroke:none;stroke-width:0.06500001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path1103-2"
+       d="m 335.01217,124.12428 c 0.0593,-0.32031 0.32622,-1.21261 0.85352,-0.98617 0.54536,0.47927 0.84953,1.15744 0.89021,2.20293 -0.003,0.51987 -0.0501,0.94543 -0.72424,0.27913 -0.34283,-0.40095 -0.47359,-0.48681 -1.01949,-1.49589 z"
+       style="fill:#ececec;fill-opacity:1;stroke:none;stroke-width:0.079375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+  </g>
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.08387499;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 402.8553,420.48816 c -0.38761,-0.38762 -1.86566,-2.50013 -3.28451,-4.69445 -4.94853,-7.65307 -6.21808,-9.4611 -7.5588,-10.76486 -1.15396,-1.12213 -1.45116,-1.25836 -2.04812,-0.93888 -0.94107,0.50364 -0.89794,0.51671 -2.26819,-0.68638 -0.66405,-0.58309 -2.46647,-3.15648 -4.00537,-5.7187 -2.23824,-3.72663 -3.49488,-5.37578 -6.28152,-8.24344 -1.91596,-1.97168 -4.9261,-5.50532 -6.68917,-7.85255 -1.76311,-2.34719 -5.32935,-7.03069 -7.92504,-10.40775 -11.58515,-15.0726 -21.12143,-29.13325 -31.26365,-46.09629 -1.57181,-2.62888 -4.1875,-6.62342 -5.81265,-8.87677 -1.62513,-2.25333 -6.54148,-9.39742 -10.92521,-15.87575 -10.67951,-15.78234 -12.26216,-17.99661 -15.7277,-22.00436 -4.51625,-5.2229 -8.81423,-9.19438 -14.85046,-13.72237 -3.01593,-2.26237 -7.70186,-5.8788 -10.41312,-8.03652 -2.71127,-2.15773 -6.47782,-5.07261 -8.3701,-6.47753 -3.75774,-2.78991 -13.25898,-8.7634 -15.16656,-9.5353 -0.67677,-0.27386 -2.32078,-0.4797 -3.79117,-0.47469 -4.04953,0.0138 -6.04567,1.18506 -15.52531,9.10962 -9.39565,7.85435 -14.35264,11.73053 -23.70171,18.53386 -12.01407,8.74267 -21.72736,16.12272 -25.45087,19.33733 -1.96961,1.70042 -7.31232,6.73245 -11.87268,11.1823 -11.1677,10.89705 -13.72264,13.08923 -17.23884,14.79116 -2.21591,1.07257 -3.40036,1.42893 -5.17005,1.55556 -2.97729,0.21302 -3.86016,-0.21521 -7.60972,-3.6912 -3.71422,-3.44321 -6.70209,-7.14335 -8.16061,-10.10603 -2.69567,-5.47568 -0.89779,-9.56294 8.52001,-19.36916 10.29864,-10.72343 33.96164,-39.14176 46.37262,-55.69169 8.15693,-10.87718 10.549,-14.21115 15.89171,-22.14922 l 5.02661,-7.46841 -0.99605,-1.97318 c -0.54784,-1.08524 -2.21426,-3.7931 -3.70316,-6.01745 -2.58815,-3.86656 -4.87839,-6.69603 -16.17215,-19.97983 -7.30831,-8.59608 -10.14456,-12.35331 -17.04021,-22.57338 -10.71825,-15.88557 -13.04121,-18.54878 -18.95912,-21.73605 -6.26352,-3.37342 -12.87002,-7.30618 -26.40115,-15.71629 C 117.42939,103.85956 107.98075,98.091115 103.2863,95.300735 88.011271,86.221245 74.928651,77.792543 59.585281,67.145596 46.883905,58.33196 48.567343,59.411563 41.490328,55.541151 33.351457,51.090012 27.687733,47.642012 23.907495,44.836955 c -1.783889,-1.323702 -5.240708,-3.666381 -7.68182,-5.205949 -2.441112,-1.539571 -4.663767,-3.188878 -4.939233,-3.665131 -0.787229,-1.361032 -0.16351,-2.629931 1.762459,-3.585567 1.503804,-0.746162 1.975287,-0.79366 7.617391,-0.767368 3.558696,0.01659 6.284621,-0.11661 6.676271,-0.326213 0.947552,-0.507115 0.818012,-1.418561 -0.362339,-2.549409 -1.30937,-1.254455 -1.369541,-2.780681 -0.166019,-4.210987 2.404007,-2.857 8.24174,-3.189022 36.697342,-2.087167 28.825447,1.116176 52.505933,3.652003 71.536013,7.66044 32.36722,6.817732 67.48613,16.732011 96.09781,27.12899 l 6.65702,2.419043 3.02153,2.981209 c 4.58445,4.523277 6.75886,7.38432 14.68593,19.3234 4.00635,6.034021 8.80547,12.910064 10.66471,15.280093 1.85926,2.370026 4.37912,5.668071 5.59967,7.328981 3.54658,4.82614 7.829,7.16694 13.82729,7.5581 3.22984,0.21063 5.81604,-0.35701 9.90099,-2.17315 6.5417,-2.90839 11.84215,-4.58559 19.25151,-6.09168 4.70787,-0.95696 11.12007,-1.16691 14.41654,-0.47202 1.01148,0.21322 2.22313,0.34409 2.69256,0.29084 3.10353,-0.35207 4.34538,-0.10865 7.65199,1.49992 2.58381,1.25695 3.91525,2.18331 5.9981,4.17327 2.81646,2.69082 4.94903,5.5049 5.30672,7.00254 0.33026,1.38281 -0.61171,1.47723 -3.01932,0.30264 -4.72532,-2.30534 -5.50494,-1.38862 -6.40781,7.5346 -0.79708,7.8779 -1.50532,10.47081 -4.73525,17.33631 -3.96872,8.43587 -4.26527,9.39876 -4.27453,13.8793 -0.007,3.40931 0.0754,3.91294 0.89406,5.46263 1.35374,2.56256 5.75728,6.66147 20.77797,19.34064 7.87304,6.64573 15.52987,14.45793 19.23333,19.62355 3.75033,5.23105 9.44827,21.353 15.95866,45.1542 3.73631,13.65938 16.56665,65.3685 17.87697,72.04809 3.17815,16.20097 6.8082,46.88859 9.07029,76.67802 1.04793,13.80025 1.14326,15.63661 0.88344,17.02152 -0.23326,1.24328 -0.23463,1.24415 -2.01036,1.23664 -2.41567,-0.0103 -4.27887,-0.93755 -6.07573,-3.02408 -0.82791,-0.96131 -1.6433,-1.74795 -1.812,-1.74805 -0.17521,-1.1e-4 -0.22953,2.01258 -0.12674,4.69429 0.19257,5.02126 -0.15697,7.38682 -1.27381,8.62092 -0.79634,0.87995 -2.03099,0.87058 -2.9238,-0.0222 z m -12.0019,-36.69813 c 2.69505,-1.12583 4.60867,-3.93081 6.04481,-8.86061 1.46388,-5.02494 1.7119,-12.11908 1.2479,-35.69121 l -0.39354,-19.99255 -2.03382,-16.71172 c -3.77262,-30.99959 -5.44812,-40.99627 -8.7235,-52.04809 -0.80693,-2.72278 -2.49635,-8.63778 -3.75431,-13.14444 -4.92437,-17.64228 -7.25934,-24.48089 -11.1402,-32.62707 l -2.12852,-4.46795 -3.60556,-2.13708 c -8.07926,-4.78872 -16.56611,-8.86281 -24.99767,-12.00003 -5.72437,-2.12993 -6.03806,-2.15367 -9.69113,-0.73358 -7.89456,3.06892 -16.81144,7.956 -30.54202,16.73916 -4.25453,2.72154 -46.25097,30.72217 -46.73434,31.15956 -0.36102,0.32669 0.8966,2.3527 2.09955,3.38239 1.73467,1.48481 4.76562,3.04555 13.90751,7.16148 11.6618,5.25045 17.8113,8.66166 23.8007,13.2026 2.66763,2.02249 3.62378,3.04213 6.29795,6.71615 7.93695,10.9045 22.11523,32.62735 33.24453,50.93469 5.06357,8.3294 25.22384,35.55614 35.51889,47.96869 3.89358,4.69445 8.70749,10.60945 10.69755,13.14445 4.2151,5.3693 6.80532,8.07511 7.93549,8.28961 1.44272,0.27382 1.66441,0.25244 2.94973,-0.28445 z m -243.49494,-72.37035 0.918,-1.20356 -5.42437,-5.53937 c -3.63408,-3.71113 -5.81875,-6.24028 -6.61931,-7.66305 -0.65723,-1.16803 -1.30236,-2.12825 -1.43364,-2.13384 -0.13128,-0.006 -0.65916,0.54113 -1.17308,1.21489 -0.83695,1.09731 -0.89319,1.33424 -0.53931,2.27177 0.65948,1.74717 2.52673,4.63277 4.58268,7.08199 1.94412,2.31598 7.58536,7.15092 8.36163,7.16651 0.22517,0.005 0.8225,-0.53338 1.3274,-1.19534 z m 15.48279,-11.07334 c 0.86587,-0.55562 2.0037,-1.45841 2.52851,-2.0062 l 0.9542,-0.99597 -1.18532,-0.73255 c -1.45247,-0.89768 -3.55708,-3.18326 -3.99722,-4.34092 -0.37232,-0.97927 -0.38075,-0.97613 -3.14349,1.17277 -1.07972,0.83984 -1.96164,1.77316 -1.95981,2.07407 0.006,0.91122 4.22951,5.74807 5.08801,5.8262 0.0774,0.007 0.84925,-0.44177 1.71512,-0.9974 z m 12.72586,-10.70747 c 0.50887,-0.37479 1.38448,-1.25291 1.94579,-1.95139 l 1.02056,-1.26994 -1.70559,-1.15118 c -1.46729,-0.99036 -3.40534,-3.2729 -3.81019,-4.48741 -0.14172,-0.42519 -5.31197,3.28734 -5.59109,4.01473 -0.29899,0.77915 1.79191,3.45745 3.8494,4.93078 2.06818,1.481 2.16672,1.47902 4.29112,-0.0856 z m -22.77145,-1.62732 2.16438,-2.07833 -2.3417,-2.20906 c -1.28793,-1.21497 -2.82895,-2.96834 -3.42447,-3.89639 -0.59553,-0.92805 -1.15278,-1.68735 -1.23833,-1.68735 -0.29316,0 -3.92864,3.56814 -4.25301,4.17425 -0.38863,0.72615 -0.0131,1.52482 1.71616,3.65024 1.28787,1.5829 4.29051,4.12499 4.87228,4.12499 0.18717,0 1.31428,-0.93525 2.50469,-2.07835 z m 11.62163,-10.88801 c 1.39852,-1.19057 2.54277,-2.28076 2.54277,-2.4226 0,-0.14187 -0.74015,-0.80126 -1.64478,-1.46532 -2.4315,-1.78488 -4.61818,-4.26993 -5.37158,-6.10454 -0.36601,-0.89124 -0.7603,-1.62102 -0.87623,-1.62172 -0.35699,-0.002 -5.42257,5.4309 -5.42257,5.81597 0,0.58381 1.0365,2.44396 2.15384,3.86543 1.46167,1.85952 5.08165,4.65384 5.63082,4.3465 0.24473,-0.13695 1.58921,-1.22312 2.98773,-2.41372 z m 22.81468,-0.0436 c 6.14846,-3.11883 17.09792,-11.51553 16.42863,-12.59846 -0.3913,-0.63314 -2.0395,-0.33396 -4.77831,0.86737 -1.50222,0.65892 -3.72571,1.43094 -4.94107,1.71559 -4.41097,1.03312 -9.20572,3.9431 -10.44468,6.33895 -0.95879,1.85412 -0.28397,4.73708 1.10883,4.73708 0.29473,0 1.4767,-0.47726 2.6266,-1.06053 z m -8.45803,-12.95445 c 1.86934,-0.90494 3.93597,-3.16472 5.18814,-5.67305 0.54686,-1.09549 2.35307,-5.52542 4.01379,-9.84431 1.89462,-4.92716 4.45679,-10.70025 6.8776,-15.49663 3.61083,-7.15414 4.36561,-9.24337 3.52672,-9.76183 -1.49623,-0.92472 -9.02214,6.59835 -25.38294,25.37337 -4.56869,5.24286 -4.72844,5.49024 -4.72844,7.32257 0,2.06196 0.75457,3.68001 2.67223,5.73014 2.83634,3.03228 5.05073,3.69656 7.8329,2.34974 z m 18.73012,-0.16196 c 4.50404,-0.93034 6.69742,-1.9812 15.88833,-7.61217 19.20397,-11.76565 41.64615,-28.23089 67.0879,-49.22062 28.37725,-23.41158 30.33422,-25.12854 35.56368,-31.20247 6.10711,-7.09331 10.78273,-15.02789 14.61027,-24.7939 1.06711,-2.72278 2.79008,-6.79415 3.82881,-9.04748 3.19773,-6.93698 4.9023,-12.96657 5.42427,-19.18736 l 0.23493,-2.79947 -0.93348,-0.23429 c -1.41441,-0.355 -5.22856,0.0777 -7.42267,0.84206 -3.23305,1.12629 -8.06638,3.7271 -10.81768,5.82099 -3.66686,2.79066 -5.27502,3.5454 -7.5616,3.54883 -1.42764,0.002 -2.32458,-0.22947 -3.62075,-0.93494 l -1.72302,-0.93777 v -2.27726 c 0.003,-5.05082 -3.55624,-10.39198 -7.25231,-10.88773 -1.2519,-0.16791 -1.49293,-0.0656 -2.7083,1.14978 -1.48971,1.48971 -2.2307,3.49482 -2.80805,7.5985 -0.33374,2.37229 -0.309,2.59067 0.40225,3.5527 l 0.75785,1.02503 -1.56888,-0.21504 c -1.92738,-0.26418 -6.83641,-2.21301 -9.13114,-3.62498 -0.93517,-0.5754 -2.10902,-1.04618 -2.60858,-1.04618 -0.49956,0 -1.9952,0.54023 -3.32364,1.2005 -9.07378,4.50992 -24.99189,18.77302 -36.76319,32.94092 -8.12603,9.78047 -19.15773,26.78398 -25.13205,38.73684 -3.74299,7.48864 -7.97012,15.22562 -15.39645,28.18035 -3.28314,5.72723 -6.77132,12.02632 -7.7515,13.99799 -3.82968,7.70347 -6.76588,16.66573 -7.21998,22.03779 l -0.2078,2.45828 1.66819,0.53633 c 3.18194,1.02301 5.02663,1.10883 8.4839,0.39472 z m 17.38415,-76.3832 c 0.70059,-0.98583 2.6563,-3.9278 4.34603,-6.5377 4.67986,-7.22836 8.24217,-11.76644 18.97133,-24.16782 13.60989,-15.7311 13.03993,-15.05063 16.85959,-20.12835 5.61801,-7.46838 7.38863,-11.99801 7.05429,-18.04645 -0.29299,-5.30055 -1.37317,-8.61741 -5.55928,-17.07071 -8.23851,-16.636566 -13.70864,-26.626084 -18.7961,-34.325235 l -2.49026,-3.768667 -5.90485,-2.955795 c -3.24766,-1.62569 -8.0352,-3.819999 -10.63896,-4.87625 -4.21145,-1.708428 -5.70034,-2.107822 -13.48586,-3.617568 -19.99049,-3.876504 -45.71177,-8.279028 -75.35352,-12.897716 -18.17493,-2.831962 -22.96819,-3.204403 -41.114423,-3.194624 -12.747286,0.0069 -23.631554,0.630793 -28.361585,1.625785 -5.582044,1.174218 -8.852564,3.600905 -8.852564,6.568496 0,0.535789 0.408437,1.793787 0.907635,2.79555 0.79353,1.592406 1.512469,2.27144 5.718688,5.401265 13.284428,9.884874 24.655127,16.80808 50.731269,30.888438 12.86714,6.947882 19.12688,10.901578 38.10143,24.065131 17.87883,12.4034 20.07347,14.35421 27.95337,24.84776 5.04929,6.72406 14.87759,20.89689 18.16007,26.18761 1.43259,2.30904 5.68341,8.96099 9.44629,14.7821 3.76287,5.82111 7.51695,11.85134 8.34239,13.40051 1.00009,1.87692 1.6994,2.81667 2.09602,2.81667 0.32866,0 1.16563,-0.80268 1.869,-1.79243 z m 120.04841,-69.42429 c 3.03673,-0.90182 7.51036,-5.75765 7.51036,-8.15204 0,-0.82722 -2.42721,-3.11575 -3.52769,-3.32612 -0.4758,-0.0909 -1.57435,0.0802 -2.4412,0.3804 -1.29718,0.44918 -1.68529,0.7898 -2.193,1.92464 -0.99322,2.21999 -5.37073,5.77375 -8.85793,7.19106 -1.68455,0.68465 -1.78242,0.78185 -1.13581,1.1279 2.52823,1.35308 7.59598,1.7597 10.64527,0.85416 z m -16.63274,-2.35996 c 2.01176,-0.68278 3.60053,-1.92295 4.32419,-3.37541 0.56312,-1.13024 0.60019,-1.48044 0.2481,-2.34334 -0.38446,-0.9422 -2.70552,-2.67339 -3.08096,-2.29796 -0.0916,0.0917 -0.0277,0.9102 0.14208,1.819 0.49517,2.65053 -0.25014,3.62531 -2.77836,3.63379 -3.45308,0.0116 -6.8049,-1.84859 -6.8049,-3.77653 0,-0.93323 -0.43794,-0.81418 -1.30144,0.35379 -1.77154,2.39613 -0.13763,5.343 3.61077,6.51228 1.10395,0.34436 3.824,0.0909 5.64052,-0.52562 z"
+     id="path831-6"
+     inkscape:connector-curvature="0" />
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.20005751;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="M 14.06821,224.61657 V 13.281165 H 229.50059 444.93297 V 224.61657 435.95197 H 229.50059 14.06821 Z m 404.12274,193.92328 c 0.5435,-1.62671 0.7697,-4.1896 0.5593,-6.33717 l -0.35327,-3.60588 2.02141,1.70093 c 2.0872,1.75623 6.12111,2.91418 7.39955,2.12405 1.60986,-0.99494 0.17246,-22.58171 -4.09392,-61.48194 -2.4121,-21.99331 -5.16745,-36.13264 -13.63898,-69.98992 -11.76766,-47.03046 -17.6915,-66.87399 -23.29045,-78.018 -3.05414,-6.07884 -10.94711,-14.35468 -26.24072,-27.51359 -7.70318,-6.62795 -14.53054,-12.85172 -15.17192,-13.83061 -0.82087,-1.25278 -1.16618,-3.20403 -1.16618,-6.58963 0,-4.35473 0.33187,-5.52352 3.50761,-12.35284 3.55949,-7.65455 4.61097,-11.45131 5.38062,-19.42871 0.23553,-2.44111 0.5901,-5.00653 0.78798,-5.70093 0.37098,-1.30199 0.33621,-1.30199 6.54095,-5.3e-4 1.54467,0.32399 1.8778,0.156 1.8778,-0.94685 0,-3.12282 -5.89139,-9.23258 -11.77985,-12.21649 -3.14418,-1.59327 -4.14446,-1.72579 -13.72995,-1.81898 -9.30704,-0.0905 -10.99375,0.0821 -16.90309,1.72985 -3.61043,1.00672 -9.14133,2.97297 -12.2909,4.36947 -4.71006,2.08838 -6.51436,2.5377 -10.16492,2.53131 -5.43171,-0.01 -10.0982,-2.02949 -12.9921,-5.62394 -5.28934,-6.569715 -9.48063,-12.381459 -17.34876,-24.056284 -4.71236,-6.992276 -10.5708,-14.876508 -13.01876,-17.520534 -4.07293,-4.399143 -4.95761,-4.993093 -10.41936,-6.995271 -25.71854,-9.427965 -62.78731,-20.104596 -91.32207,-26.302797 -24.99826,-5.430018 -46.11902,-7.7814 -82.62224,-9.198365 -25.281038,-0.981346 -31.391329,-0.296052 -33.223994,3.72621 -0.657606,1.443286 -0.588283,1.965651 0.406778,3.06518 2.027119,2.239942 0.706721,3.002338 -4.4509,2.569941 -5.257843,-0.440798 -8.754616,0.294018 -10.481939,2.20269 -1.675594,1.851509 -0.526919,3.6497 4.263174,6.673774 2.135556,1.348216 5.880103,3.907541 8.321215,5.687385 2.441112,1.779847 9.201114,5.936015 15.022225,9.23593 5.821114,3.299918 15.039298,9.112314 20.484854,12.916437 17.237706,12.04181 35.396697,23.43117 78.525277,49.251214 7.69889,4.60914 14.9076,8.93819 16.01936,9.62011 2.73356,1.67669 7.33706,7.47958 15.41699,19.43373 7.52724,11.13648 11.36327,16.09208 22.12073,28.57691 6.5659,7.62022 15.40859,19.72547 15.40859,21.09369 0,0.98837 -10.48111,16.19991 -19.17373,27.8274 -12.73728,17.03771 -37.03022,46.31957 -49.4739,59.63409 -6.03066,6.45268 -7.82916,9.51545 -7.82916,13.33267 0,3.91626 1.8597,7.03435 7.83963,13.14445 5.2848,5.3998 5.63993,5.63306 8.56716,5.62666 5.52045,-0.0122 8.99274,-2.34167 21.83161,-14.64715 14.18025,-13.59112 16.84365,-15.7983 36.87274,-30.55676 8.45,-6.22638 19.48536,-14.76417 24.52303,-18.97285 11.09409,-9.26847 13.29309,-10.52481 17.68342,-10.10296 4.09603,0.39358 12.51358,5.75634 28.97035,18.4568 19.38356,14.95924 21.33819,17.09146 37.40819,40.80736 5.72577,8.45 11.23762,16.43909 12.24857,17.75354 1.01095,1.31445 3.0185,4.38717 4.46122,6.82829 12.48767,21.1296 36.74097,55.2092 47.13671,66.23436 1.94765,2.06555 4.68128,5.6728 6.07473,8.01611 2.55003,4.28829 4.88508,6.58284 5.99863,5.8946 1.06125,-0.65587 2.72003,1.28212 7.85556,9.17782 4.56163,7.01328 5.19526,7.70519 6.87851,7.51109 1.48198,-0.17086 2.03718,-0.76189 2.76659,-2.94507 z"
+     id="path835-1"
+     inkscape:connector-curvature="0" />
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.20005751;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="M 14.06821,224.61657 V 13.281165 H 229.50059 444.93297 V 224.61657 435.95197 H 229.50059 14.06821 Z m 404.12274,193.92328 c 0.5435,-1.62671 0.7697,-4.1896 0.5593,-6.33717 l -0.35327,-3.60588 2.02141,1.70093 c 2.0872,1.75623 6.12111,2.91418 7.39955,2.12405 1.60986,-0.99494 0.17246,-22.58171 -4.09392,-61.48194 -2.4121,-21.99331 -5.16745,-36.13264 -13.63898,-69.98992 -11.76766,-47.03046 -17.6915,-66.87399 -23.29045,-78.018 -3.05414,-6.07884 -10.94711,-14.35468 -26.24072,-27.51359 -7.70318,-6.62795 -14.53054,-12.85172 -15.17192,-13.83061 -0.82087,-1.25278 -1.16618,-3.20403 -1.16618,-6.58963 0,-4.35473 0.33187,-5.52352 3.50761,-12.35284 3.55949,-7.65455 4.61097,-11.45131 5.38062,-19.42871 0.23553,-2.44111 0.5901,-5.00653 0.78798,-5.70093 0.37098,-1.30199 0.33621,-1.30199 6.54095,-5.3e-4 1.54467,0.32399 1.8778,0.156 1.8778,-0.94685 0,-3.12282 -5.89139,-9.23258 -11.77985,-12.21649 -3.14418,-1.59327 -4.14446,-1.72579 -13.72995,-1.81898 -9.30704,-0.0905 -10.99375,0.0821 -16.90309,1.72985 -3.61043,1.00672 -9.14133,2.97297 -12.2909,4.36947 -4.71006,2.08838 -6.51436,2.5377 -10.16492,2.53131 -5.43171,-0.01 -10.0982,-2.02949 -12.9921,-5.62394 -5.28934,-6.569715 -9.48063,-12.381459 -17.34876,-24.056284 -4.71236,-6.992276 -10.5708,-14.876508 -13.01876,-17.520534 -4.07293,-4.399143 -4.95761,-4.993093 -10.41936,-6.995271 -25.71854,-9.427965 -62.78731,-20.104596 -91.32207,-26.302797 -24.99826,-5.430018 -46.11902,-7.7814 -82.62224,-9.198365 -25.281038,-0.981346 -31.391329,-0.296052 -33.223994,3.72621 -0.657606,1.443286 -0.588283,1.965651 0.406778,3.06518 2.027119,2.239942 0.706721,3.002338 -4.4509,2.569941 -5.257843,-0.440798 -8.754616,0.294018 -10.481939,2.20269 -1.675594,1.851509 -0.526919,3.6497 4.263174,6.673774 2.135556,1.348216 5.880103,3.907541 8.321215,5.687385 2.441112,1.779847 9.201114,5.936015 15.022225,9.23593 5.821114,3.299918 15.039298,9.112314 20.484854,12.916437 17.237706,12.04181 35.396697,23.43117 78.525277,49.251214 7.69889,4.60914 14.9076,8.93819 16.01936,9.62011 2.73356,1.67669 7.33706,7.47958 15.41699,19.43373 7.52724,11.13648 11.36327,16.09208 22.12073,28.57691 6.5659,7.62022 15.40859,19.72547 15.40859,21.09369 0,0.98837 -10.48111,16.19991 -19.17373,27.8274 -12.73728,17.03771 -37.03022,46.31957 -49.4739,59.63409 -6.03066,6.45268 -7.82916,9.51545 -7.82916,13.33267 0,3.91626 1.8597,7.03435 7.83963,13.14445 5.2848,5.3998 5.63993,5.63306 8.56716,5.62666 5.52045,-0.0122 8.99274,-2.34167 21.83161,-14.64715 14.18025,-13.59112 16.84365,-15.7983 36.87274,-30.55676 8.45,-6.22638 19.48536,-14.76417 24.52303,-18.97285 11.09409,-9.26847 13.29309,-10.52481 17.68342,-10.10296 4.09603,0.39358 12.51358,5.75634 28.97035,18.4568 19.38356,14.95924 21.33819,17.09146 37.40819,40.80736 5.72577,8.45 11.23762,16.43909 12.24857,17.75354 1.01095,1.31445 3.0185,4.38717 4.46122,6.82829 12.48767,21.1296 36.74097,55.2092 47.13671,66.23436 1.94765,2.06555 4.68128,5.6728 6.07473,8.01611 2.55003,4.28829 4.88508,6.58284 5.99863,5.8946 1.06125,-0.65587 2.72003,1.28212 7.85556,9.17782 4.56163,7.01328 5.19526,7.70519 6.87851,7.51109 1.48198,-0.17086 2.03718,-0.76189 2.76659,-2.94507 z"
+     id="path837-8"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_white.png b/docs/reference-manual/plots/GMX_logos/gmx_falcon_white.png
new file mode 100644 (file)
index 0000000..ca7ef61
Binary files /dev/null and b/docs/reference-manual/plots/GMX_logos/gmx_falcon_white.png differ
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_falcon_white.svg b/docs/reference-manual/plots/GMX_logos/gmx_falcon_white.svg
new file mode 100644 (file)
index 0000000..13fee12
--- /dev/null
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg1149"
+   version="1.1"
+   viewBox="0 0 450 450"
+   height="450mm"
+   width="450mm"
+   sodipodi:docname="gmx_falcon.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1853"
+     inkscape:window-height="1145"
+     id="namedview971"
+     showgrid="false"
+     inkscape:zoom="0.54798148"
+     inkscape:cx="820.2007"
+     inkscape:cy="1032.1545"
+     inkscape:window-x="67"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1149" />
+  <defs
+     id="defs1143">
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect1061"
+       is_visible="true" />
+    <clipPath
+       id="_clip1">
+      <rect
+         id="rect892"
+         height="550.58301"
+         width="291.98801"
+         y="0"
+         x="0" />
+    </clipPath>
+  </defs>
+  <metadata
+     id="metadata1146">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,153)"
+     id="layer1"
+     style="fill:none;fill-opacity:1;stroke:none">
+    <g
+       style="clip-rule:evenodd;fill:none;fill-opacity:1;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;stroke:none"
+       id="g903"
+       transform="matrix(0.82454635,-0.51053871,0.49150293,0.84357369,250.14362,56.767957)">
+      <g
+         style="fill:none;fill-opacity:1;stroke:none"
+         id="g901"
+         transform="translate(-145.994,-275.291)">
+        <clipPath
+           id="clipPath1706">
+          <rect
+             id="rect1704"
+             height="550.58301"
+             width="291.98801"
+             y="0"
+             x="0" />
+        </clipPath>
+        <g
+           style="fill:none;fill-opacity:1;stroke:none"
+           id="g899"
+           clip-path="url(#_clip1)">
+          <g
+             style="fill:none;fill-opacity:1;stroke:none"
+             id="g897"
+             transform="matrix(1,0,0,-1,0,555.789)" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     id="g842"
+     transform="translate(7.10689,-9.54507)"
+     style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
+     inkscape:export-filename="/home/cathrine/Pictures/svg_files/GROMACS_logo/GMX_logos/gmx_falcon_black.png"
+     inkscape:export-xdpi="300"
+     inkscape:export-ydpi="300">
+    <path
+       id="rect1188"
+       d="m 41.158027,36.862134 c -5.067605,0.114086 -10.758954,0.07765 -13.860135,1.501201 -3.184436,1.750423 -2.821989,4.252571 -2.213302,4.913911 0.417703,0.525436 1.728276,1.435139 1.760616,2.509409 -0.355687,1.978739 -8.540643,0.142271 -13.277743,1.026295 -1.971417,0.415488 -3.5883814,1.583925 -3.8328413,2.926953 -0.1140291,2.067041 1.1265423,2.575017 2.4143233,3.470587 3.14977,2.135627 6.507488,3.727368 9.068697,5.87561 1.253729,0.919245 2.45072,1.936756 4.280876,3.156397 8.653728,5.692823 19.338307,10.928703 22.311301,12.905675 35.010808,23.382274 71.391691,46.934698 105.687091,66.210948 17.3743,23.66443 38.03145,47.03499 52.83967,69.91304 -8.51464,13.34908 -16.2153,23.54024 -26.00513,36.47013 -7.47265,9.58647 -12.7242,15.79733 -18.26555,22.44824 -9.9316,12.1082 -20.3747,20.74878 -29.10572,33.20264 -2.05193,2.60951 -3.20382,5.31056 -3.63544,8.1044 -0.48145,7.03834 12.36918,17.7201 13.594,18.20974 3.99488,1.47164 8.26211,-0.72435 11.96775,-2.91196 10.42715,-8.48248 20.01679,-20.35241 33.08119,-30.09894 6.93475,-5.08797 13.21941,-9.99855 21.9971,-16.1897 10.591,-7.75753 18.25921,-14.35134 27.12393,-21.8333 5.47698,-4.00318 8.86884,-3.19925 9.38702,-3.24528 20.18147,9.0007 35.95519,20.41379 47.10463,33.34422 28.81865,37.22362 48.30006,73.10919 74.95976,106.70614 4.2086,5.54379 8.13629,9.04706 11.46699,13.39866 l 4.6173,7.72512 c 0.85704,1.34845 3.62606,4.67968 4.81314,2.45928 4.7075,4.1507 6.35611,8.33985 8.91728,12.16773 2.47981,3.85953 3.59053,5.52575 5.22502,5.58779 1.62536,-0.17732 2.64702,-3.30811 2.75952,-5.3816 -0.0649,-6.43839 -0.52445,-8.39745 -0.0481,-8.76742 0.73313,-0.21656 2.30214,5.63288 9.33794,4.72581 1.70479,-1.07048 0.11292,-9.35281 -1.10744,-29.27882 -6.02679,-59.20256 -17.16104,-119.21909 -37.17034,-172.95587 -1.99855,-5.66626 -4.48439,-10.48003 -7.84603,-13.76092 -7.32869,-8.82859 -15.36353,-15.30351 -23.35414,-21.92579 -4.16065,-3.75625 -8.75593,-7.38237 -12.41112,-11.29027 -3.46615,-3.97565 -2.8878,-10.27856 -0.68832,-15.30862 1.61087,-4.11755 4.69831,-9.86645 5.38314,-11.69128 2.01419,-6.69993 1.62933,-7.52786 2.29907,-13.54749 0.16343,-2.40569 -0.0101,-3.68211 0.98393,-5.44566 1.2501,-1.02021 2.87774,-1.14414 4.55268,-0.39946 2.20314,1.46902 3.36098,1.38574 3.67988,0.78651 -1.08394,-7.57897 -12.61708,-14.35085 -19.2319,-13.53302 -4.14726,-1.2716 -9.57011,-1.31016 -13.54386,-0.78187 -7.45892,1.30469 -13.0538,2.83398 -19.10377,5.13664 -5.25428,2.52614 -9.63744,4.98053 -16.40363,3.48402 -5.38494,-1.27814 -8.0322,-3.40208 -10.32754,-6.35878 C 258.25672,105.39086 250.4662,86.489695 236.56833,74.663963 169.76711,49.628714 108.07696,38.456479 41.158027,36.862134 Z m 67.517843,23.330361 c 42.63832,-0.08655 85.98601,4.362077 122.53465,21.137211 9.83453,13.678189 15.71355,27.725614 23.48642,42.434624 3.25084,8.27418 5.29883,13.76672 1.08417,20.91707 -13.46351,16.24687 -28.38131,35.94725 -41.40471,54.70932 -0.47716,8.97476 -39.3571,-55.48985 -51.45733,-64.65652 C 126.0207,107.30976 121.95681,111.55429 66.71719,68.501031 63.546233,65.6094 60.754649,61.19063 79.362933,60.88134 89.034697,60.474089 98.836261,60.212466 108.67587,60.192495 Z m 224.10261,61.728535 c 1.61918,0.0134 4.3592,0.50304 7.44191,3.23546 -1.51503,1.30658 -1.26156,2.96907 -1.06246,4.66276 -3.49184,-2.02972 -7.76258,1.11022 -13.53354,1.39423 5.12553,-1.16335 7.62283,-3.9631 5.93762,-9.21235 0.26196,-0.036 0.67675,-0.0846 1.21647,-0.0801 z m -11.25204,2.27376 c 1.80433,0.39115 1.17613,0.22457 2.358,1.12603 -2.06709,2.94178 -3.99193,4.41507 -7.0285,3.83026 -2.53238,-0.49634 -3.26144,-1.84438 -4.76457,-3.9424 l 2.32749,-0.27595 c 1.67447,5.17616 6.94156,3.58906 7.3696,1.01647 -0.0265,-1.3497 -0.26202,-1.75441 -0.26202,-1.75441 z m -21.85188,7.6631 c 4.1606,-0.0519 8.73718,6.98868 6.92152,11.43496 7.22731,5.68 11.6341,-0.44184 16.33959,-3.50108 9.59575,-5.29682 12.07622,-4.62248 15.22388,-4.13825 -0.25011,7.1632 -1.87973,14.52802 -7.33186,24.5184 -9.12154,27.83239 -22.61876,38.22475 -36.56884,49.7024 -28.35264,23.79178 -57.41908,45.55891 -89.57953,64.42294 -6.78781,3.58045 -11.96577,5.56231 -17.44752,2.78278 0.57338,-8.92321 4.02562,-16.67319 8.51214,-25.59638 8.71795,-15.05432 17.44359,-29.15045 25.29252,-45.18173 19.42292,-33.87435 34.42263,-46.89517 49.85225,-60.00616 7.9271,-5.40016 10.4566,-7.61296 12.84005,-7.58507 2.4135,3.6206 11.39782,6.10895 12.39303,4.88498 -1.81309,-0.81494 -1.93051,-1.68173 -1.85465,-3.24425 0.87042,-6.20347 3.07342,-8.46441 5.40742,-8.49354 z m 34.64129,67.65685 c 7.07207,3.19673 20.0865,13.99569 33.71887,21.62659 25.40844,55.85701 26.57612,125.70521 23.54276,162.64848 -1.4672,11.68019 -2.6419,9.64332 -6.26526,7.16391 -39.14394,-33.23217 -58.44535,-81.0015 -87.02466,-115.09738 -18.48485,-14.1386 -39.63727,-20.91346 -44.47429,-27.37559 35.83951,-23.88175 63.47121,-43.90715 80.50258,-48.96601 z m -137.18181,39.14697 c 1.29577,0.0524 -1.0241,4.16146 -1.98282,5.82652 -5.48264,8.86367 -8.83948,19.35023 -12.85658,28.90315 -2.54565,5.38871 -5.62861,7.09422 -8.369,6.40889 -3.10141,-1.01735 -7.62708,-5.87401 -4.77181,-10.19471 8.0252,-9.41762 15.0174,-20.8627 25.29459,-29.40338 1.41974,-1.12484 2.2537,-1.55794 2.68562,-1.54047 z m 5.11648,41.06932 c 3.19519,-0.006 -14.70408,12.35567 -18.93166,13.67978 -4.6342,-5.3662 7.67952,-9.53249 11.80083,-10.87683 4.13148,-1.99644 6.31637,-2.80139 7.13083,-2.80295 z m -44.25259,1.33583 c 1.08655,4.8133 5.01897,7.14513 7.50806,8.97155 -1.86677,1.90431 -3.14682,3.14936 -5.12733,4.485 -3.03651,-2.16204 -5.81415,-3.6595 -7.32048,-7.67964 1.75826,-2.5264 2.9648,-3.90054 4.93975,-5.77691 z m -10.87944,12.73051 c 1.40176,2.65409 3.89991,5.84956 6.44715,7.39851 -1.19154,1.39436 -2.48,2.90688 -4.15324,3.98011 -2.89708,-1.52739 -5.67073,-4.88868 -6.71742,-6.92359 1.45994,-2.09373 3.28699,-3.88195 4.42351,-4.45503 z m 24.30808,2.16524 c 1.47874,3.97341 3.62242,4.91559 4.95577,5.96604 -0.95165,1.02195 -1.70013,2.20549 -4.38734,3.62767 -1.2916,-0.42986 -4.05293,-3.35549 -4.73614,-5.78463 1.80532,-2.10955 2.50335,-2.4292 4.16771,-3.80908 z m -11.98532,11.02879 c 0.9577,2.63578 2.38866,4.68077 4.7873,5.8756 -1.2586,1.94784 -2.1378,2.53624 -3.75791,3.38172 -0.84803,-0.68678 -2.91918,-2.1313 -4.87515,-5.56453 1.63216,-1.83277 2.38036,-2.39599 3.84576,-3.69279 z m -25.54211,3.14449 c 2.60746,6.18932 8.31192,10.18577 13.16819,15.47556 -0.75146,0.43161 -1.02531,2.02009 -2.28669,2.0438 -4.75409,-3.20992 -9.85201,-7.84206 -13.01522,-14.74536 0.89392,-1.30024 0.9894,-1.68278 2.13372,-2.774 z"
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.06500001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path1103-2"
+       d="m 335.01217,124.12428 c 0.0593,-0.32031 0.32622,-1.21261 0.85352,-0.98617 0.54536,0.47927 0.84953,1.15744 0.89021,2.20293 -0.003,0.51987 -0.0501,0.94543 -0.72424,0.27913 -0.34283,-0.40095 -0.47359,-0.48681 -1.01949,-1.49589 z"
+       style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.079375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+  </g>
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.08387499;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 402.8553,420.48816 c -0.38761,-0.38762 -1.86566,-2.50013 -3.28451,-4.69445 -4.94853,-7.65307 -6.21808,-9.4611 -7.5588,-10.76486 -1.15396,-1.12213 -1.45116,-1.25836 -2.04812,-0.93888 -0.94107,0.50364 -0.89794,0.51671 -2.26819,-0.68638 -0.66405,-0.58309 -2.46647,-3.15648 -4.00537,-5.7187 -2.23824,-3.72663 -3.49488,-5.37578 -6.28152,-8.24344 -1.91596,-1.97168 -4.9261,-5.50532 -6.68917,-7.85255 -1.76311,-2.34719 -5.32935,-7.03069 -7.92504,-10.40775 -11.58515,-15.0726 -21.12143,-29.13325 -31.26365,-46.09629 -1.57181,-2.62888 -4.1875,-6.62342 -5.81265,-8.87677 -1.62513,-2.25333 -6.54148,-9.39742 -10.92521,-15.87575 -10.67951,-15.78234 -12.26216,-17.99661 -15.7277,-22.00436 -4.51625,-5.2229 -8.81423,-9.19438 -14.85046,-13.72237 -3.01593,-2.26237 -7.70186,-5.8788 -10.41312,-8.03652 -2.71127,-2.15773 -6.47782,-5.07261 -8.3701,-6.47753 -3.75774,-2.78991 -13.25898,-8.7634 -15.16656,-9.5353 -0.67677,-0.27386 -2.32078,-0.4797 -3.79117,-0.47469 -4.04953,0.0138 -6.04567,1.18506 -15.52531,9.10962 -9.39565,7.85435 -14.35264,11.73053 -23.70171,18.53386 -12.01407,8.74267 -21.72736,16.12272 -25.45087,19.33733 -1.96961,1.70042 -7.31232,6.73245 -11.87268,11.1823 -11.1677,10.89705 -13.72264,13.08923 -17.23884,14.79116 -2.21591,1.07257 -3.40036,1.42893 -5.17005,1.55556 -2.97729,0.21302 -3.86016,-0.21521 -7.60972,-3.6912 -3.71422,-3.44321 -6.70209,-7.14335 -8.16061,-10.10603 -2.69567,-5.47568 -0.89779,-9.56294 8.52001,-19.36916 10.29864,-10.72343 33.96164,-39.14176 46.37262,-55.69169 8.15693,-10.87718 10.549,-14.21115 15.89171,-22.14922 l 5.02661,-7.46841 -0.99605,-1.97318 c -0.54784,-1.08524 -2.21426,-3.7931 -3.70316,-6.01745 -2.58815,-3.86656 -4.87839,-6.69603 -16.17215,-19.97983 -7.30831,-8.59608 -10.14456,-12.35331 -17.04021,-22.57338 -10.71825,-15.88557 -13.04121,-18.54878 -18.95912,-21.73605 -6.26352,-3.37342 -12.87002,-7.30618 -26.40115,-15.71629 C 117.42939,103.85956 107.98075,98.091115 103.2863,95.300735 88.011271,86.221245 74.928651,77.792543 59.585281,67.145596 46.883905,58.33196 48.567343,59.411563 41.490328,55.541151 33.351457,51.090012 27.687733,47.642012 23.907495,44.836955 c -1.783889,-1.323702 -5.240708,-3.666381 -7.68182,-5.205949 -2.441112,-1.539571 -4.663767,-3.188878 -4.939233,-3.665131 -0.787229,-1.361032 -0.16351,-2.629931 1.762459,-3.585567 1.503804,-0.746162 1.975287,-0.79366 7.617391,-0.767368 3.558696,0.01659 6.284621,-0.11661 6.676271,-0.326213 0.947552,-0.507115 0.818012,-1.418561 -0.362339,-2.549409 -1.30937,-1.254455 -1.369541,-2.780681 -0.166019,-4.210987 2.404007,-2.857 8.24174,-3.189022 36.697342,-2.087167 28.825447,1.116176 52.505933,3.652003 71.536013,7.66044 32.36722,6.817732 67.48613,16.732011 96.09781,27.12899 l 6.65702,2.419043 3.02153,2.981209 c 4.58445,4.523277 6.75886,7.38432 14.68593,19.3234 4.00635,6.034021 8.80547,12.910064 10.66471,15.280093 1.85926,2.370026 4.37912,5.668071 5.59967,7.328981 3.54658,4.82614 7.829,7.16694 13.82729,7.5581 3.22984,0.21063 5.81604,-0.35701 9.90099,-2.17315 6.5417,-2.90839 11.84215,-4.58559 19.25151,-6.09168 4.70787,-0.95696 11.12007,-1.16691 14.41654,-0.47202 1.01148,0.21322 2.22313,0.34409 2.69256,0.29084 3.10353,-0.35207 4.34538,-0.10865 7.65199,1.49992 2.58381,1.25695 3.91525,2.18331 5.9981,4.17327 2.81646,2.69082 4.94903,5.5049 5.30672,7.00254 0.33026,1.38281 -0.61171,1.47723 -3.01932,0.30264 -4.72532,-2.30534 -5.50494,-1.38862 -6.40781,7.5346 -0.79708,7.8779 -1.50532,10.47081 -4.73525,17.33631 -3.96872,8.43587 -4.26527,9.39876 -4.27453,13.8793 -0.007,3.40931 0.0754,3.91294 0.89406,5.46263 1.35374,2.56256 5.75728,6.66147 20.77797,19.34064 7.87304,6.64573 15.52987,14.45793 19.23333,19.62355 3.75033,5.23105 9.44827,21.353 15.95866,45.1542 3.73631,13.65938 16.56665,65.3685 17.87697,72.04809 3.17815,16.20097 6.8082,46.88859 9.07029,76.67802 1.04793,13.80025 1.14326,15.63661 0.88344,17.02152 -0.23326,1.24328 -0.23463,1.24415 -2.01036,1.23664 -2.41567,-0.0103 -4.27887,-0.93755 -6.07573,-3.02408 -0.82791,-0.96131 -1.6433,-1.74795 -1.812,-1.74805 -0.17521,-1.1e-4 -0.22953,2.01258 -0.12674,4.69429 0.19257,5.02126 -0.15697,7.38682 -1.27381,8.62092 -0.79634,0.87995 -2.03099,0.87058 -2.9238,-0.0222 z m -12.0019,-36.69813 c 2.69505,-1.12583 4.60867,-3.93081 6.04481,-8.86061 1.46388,-5.02494 1.7119,-12.11908 1.2479,-35.69121 l -0.39354,-19.99255 -2.03382,-16.71172 c -3.77262,-30.99959 -5.44812,-40.99627 -8.7235,-52.04809 -0.80693,-2.72278 -2.49635,-8.63778 -3.75431,-13.14444 -4.92437,-17.64228 -7.25934,-24.48089 -11.1402,-32.62707 l -2.12852,-4.46795 -3.60556,-2.13708 c -8.07926,-4.78872 -16.56611,-8.86281 -24.99767,-12.00003 -5.72437,-2.12993 -6.03806,-2.15367 -9.69113,-0.73358 -7.89456,3.06892 -16.81144,7.956 -30.54202,16.73916 -4.25453,2.72154 -46.25097,30.72217 -46.73434,31.15956 -0.36102,0.32669 0.8966,2.3527 2.09955,3.38239 1.73467,1.48481 4.76562,3.04555 13.90751,7.16148 11.6618,5.25045 17.8113,8.66166 23.8007,13.2026 2.66763,2.02249 3.62378,3.04213 6.29795,6.71615 7.93695,10.9045 22.11523,32.62735 33.24453,50.93469 5.06357,8.3294 25.22384,35.55614 35.51889,47.96869 3.89358,4.69445 8.70749,10.60945 10.69755,13.14445 4.2151,5.3693 6.80532,8.07511 7.93549,8.28961 1.44272,0.27382 1.66441,0.25244 2.94973,-0.28445 z m -243.49494,-72.37035 0.918,-1.20356 -5.42437,-5.53937 c -3.63408,-3.71113 -5.81875,-6.24028 -6.61931,-7.66305 -0.65723,-1.16803 -1.30236,-2.12825 -1.43364,-2.13384 -0.13128,-0.006 -0.65916,0.54113 -1.17308,1.21489 -0.83695,1.09731 -0.89319,1.33424 -0.53931,2.27177 0.65948,1.74717 2.52673,4.63277 4.58268,7.08199 1.94412,2.31598 7.58536,7.15092 8.36163,7.16651 0.22517,0.005 0.8225,-0.53338 1.3274,-1.19534 z m 15.48279,-11.07334 c 0.86587,-0.55562 2.0037,-1.45841 2.52851,-2.0062 l 0.9542,-0.99597 -1.18532,-0.73255 c -1.45247,-0.89768 -3.55708,-3.18326 -3.99722,-4.34092 -0.37232,-0.97927 -0.38075,-0.97613 -3.14349,1.17277 -1.07972,0.83984 -1.96164,1.77316 -1.95981,2.07407 0.006,0.91122 4.22951,5.74807 5.08801,5.8262 0.0774,0.007 0.84925,-0.44177 1.71512,-0.9974 z m 12.72586,-10.70747 c 0.50887,-0.37479 1.38448,-1.25291 1.94579,-1.95139 l 1.02056,-1.26994 -1.70559,-1.15118 c -1.46729,-0.99036 -3.40534,-3.2729 -3.81019,-4.48741 -0.14172,-0.42519 -5.31197,3.28734 -5.59109,4.01473 -0.29899,0.77915 1.79191,3.45745 3.8494,4.93078 2.06818,1.481 2.16672,1.47902 4.29112,-0.0856 z m -22.77145,-1.62732 2.16438,-2.07833 -2.3417,-2.20906 c -1.28793,-1.21497 -2.82895,-2.96834 -3.42447,-3.89639 -0.59553,-0.92805 -1.15278,-1.68735 -1.23833,-1.68735 -0.29316,0 -3.92864,3.56814 -4.25301,4.17425 -0.38863,0.72615 -0.0131,1.52482 1.71616,3.65024 1.28787,1.5829 4.29051,4.12499 4.87228,4.12499 0.18717,0 1.31428,-0.93525 2.50469,-2.07835 z m 11.62163,-10.88801 c 1.39852,-1.19057 2.54277,-2.28076 2.54277,-2.4226 0,-0.14187 -0.74015,-0.80126 -1.64478,-1.46532 -2.4315,-1.78488 -4.61818,-4.26993 -5.37158,-6.10454 -0.36601,-0.89124 -0.7603,-1.62102 -0.87623,-1.62172 -0.35699,-0.002 -5.42257,5.4309 -5.42257,5.81597 0,0.58381 1.0365,2.44396 2.15384,3.86543 1.46167,1.85952 5.08165,4.65384 5.63082,4.3465 0.24473,-0.13695 1.58921,-1.22312 2.98773,-2.41372 z m 22.81468,-0.0436 c 6.14846,-3.11883 17.09792,-11.51553 16.42863,-12.59846 -0.3913,-0.63314 -2.0395,-0.33396 -4.77831,0.86737 -1.50222,0.65892 -3.72571,1.43094 -4.94107,1.71559 -4.41097,1.03312 -9.20572,3.9431 -10.44468,6.33895 -0.95879,1.85412 -0.28397,4.73708 1.10883,4.73708 0.29473,0 1.4767,-0.47726 2.6266,-1.06053 z m -8.45803,-12.95445 c 1.86934,-0.90494 3.93597,-3.16472 5.18814,-5.67305 0.54686,-1.09549 2.35307,-5.52542 4.01379,-9.84431 1.89462,-4.92716 4.45679,-10.70025 6.8776,-15.49663 3.61083,-7.15414 4.36561,-9.24337 3.52672,-9.76183 -1.49623,-0.92472 -9.02214,6.59835 -25.38294,25.37337 -4.56869,5.24286 -4.72844,5.49024 -4.72844,7.32257 0,2.06196 0.75457,3.68001 2.67223,5.73014 2.83634,3.03228 5.05073,3.69656 7.8329,2.34974 z m 18.73012,-0.16196 c 4.50404,-0.93034 6.69742,-1.9812 15.88833,-7.61217 19.20397,-11.76565 41.64615,-28.23089 67.0879,-49.22062 28.37725,-23.41158 30.33422,-25.12854 35.56368,-31.20247 6.10711,-7.09331 10.78273,-15.02789 14.61027,-24.7939 1.06711,-2.72278 2.79008,-6.79415 3.82881,-9.04748 3.19773,-6.93698 4.9023,-12.96657 5.42427,-19.18736 l 0.23493,-2.79947 -0.93348,-0.23429 c -1.41441,-0.355 -5.22856,0.0777 -7.42267,0.84206 -3.23305,1.12629 -8.06638,3.7271 -10.81768,5.82099 -3.66686,2.79066 -5.27502,3.5454 -7.5616,3.54883 -1.42764,0.002 -2.32458,-0.22947 -3.62075,-0.93494 l -1.72302,-0.93777 v -2.27726 c 0.003,-5.05082 -3.55624,-10.39198 -7.25231,-10.88773 -1.2519,-0.16791 -1.49293,-0.0656 -2.7083,1.14978 -1.48971,1.48971 -2.2307,3.49482 -2.80805,7.5985 -0.33374,2.37229 -0.309,2.59067 0.40225,3.5527 l 0.75785,1.02503 -1.56888,-0.21504 c -1.92738,-0.26418 -6.83641,-2.21301 -9.13114,-3.62498 -0.93517,-0.5754 -2.10902,-1.04618 -2.60858,-1.04618 -0.49956,0 -1.9952,0.54023 -3.32364,1.2005 -9.07378,4.50992 -24.99189,18.77302 -36.76319,32.94092 -8.12603,9.78047 -19.15773,26.78398 -25.13205,38.73684 -3.74299,7.48864 -7.97012,15.22562 -15.39645,28.18035 -3.28314,5.72723 -6.77132,12.02632 -7.7515,13.99799 -3.82968,7.70347 -6.76588,16.66573 -7.21998,22.03779 l -0.2078,2.45828 1.66819,0.53633 c 3.18194,1.02301 5.02663,1.10883 8.4839,0.39472 z m 17.38415,-76.3832 c 0.70059,-0.98583 2.6563,-3.9278 4.34603,-6.5377 4.67986,-7.22836 8.24217,-11.76644 18.97133,-24.16782 13.60989,-15.7311 13.03993,-15.05063 16.85959,-20.12835 5.61801,-7.46838 7.38863,-11.99801 7.05429,-18.04645 -0.29299,-5.30055 -1.37317,-8.61741 -5.55928,-17.07071 -8.23851,-16.636566 -13.70864,-26.626084 -18.7961,-34.325235 l -2.49026,-3.768667 -5.90485,-2.955795 c -3.24766,-1.62569 -8.0352,-3.819999 -10.63896,-4.87625 -4.21145,-1.708428 -5.70034,-2.107822 -13.48586,-3.617568 -19.99049,-3.876504 -45.71177,-8.279028 -75.35352,-12.897716 -18.17493,-2.831962 -22.96819,-3.204403 -41.114423,-3.194624 -12.747286,0.0069 -23.631554,0.630793 -28.361585,1.625785 -5.582044,1.174218 -8.852564,3.600905 -8.852564,6.568496 0,0.535789 0.408437,1.793787 0.907635,2.79555 0.79353,1.592406 1.512469,2.27144 5.718688,5.401265 13.284428,9.884874 24.655127,16.80808 50.731269,30.888438 12.86714,6.947882 19.12688,10.901578 38.10143,24.065131 17.87883,12.4034 20.07347,14.35421 27.95337,24.84776 5.04929,6.72406 14.87759,20.89689 18.16007,26.18761 1.43259,2.30904 5.68341,8.96099 9.44629,14.7821 3.76287,5.82111 7.51695,11.85134 8.34239,13.40051 1.00009,1.87692 1.6994,2.81667 2.09602,2.81667 0.32866,0 1.16563,-0.80268 1.869,-1.79243 z m 120.04841,-69.42429 c 3.03673,-0.90182 7.51036,-5.75765 7.51036,-8.15204 0,-0.82722 -2.42721,-3.11575 -3.52769,-3.32612 -0.4758,-0.0909 -1.57435,0.0802 -2.4412,0.3804 -1.29718,0.44918 -1.68529,0.7898 -2.193,1.92464 -0.99322,2.21999 -5.37073,5.77375 -8.85793,7.19106 -1.68455,0.68465 -1.78242,0.78185 -1.13581,1.1279 2.52823,1.35308 7.59598,1.7597 10.64527,0.85416 z m -16.63274,-2.35996 c 2.01176,-0.68278 3.60053,-1.92295 4.32419,-3.37541 0.56312,-1.13024 0.60019,-1.48044 0.2481,-2.34334 -0.38446,-0.9422 -2.70552,-2.67339 -3.08096,-2.29796 -0.0916,0.0917 -0.0277,0.9102 0.14208,1.819 0.49517,2.65053 -0.25014,3.62531 -2.77836,3.63379 -3.45308,0.0116 -6.8049,-1.84859 -6.8049,-3.77653 0,-0.93323 -0.43794,-0.81418 -1.30144,0.35379 -1.77154,2.39613 -0.13763,5.343 3.61077,6.51228 1.10395,0.34436 3.824,0.0909 5.64052,-0.52562 z"
+     id="path831-6"
+     inkscape:connector-curvature="0" />
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.20005751;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="M 14.06821,224.61657 V 13.281165 H 229.50059 444.93297 V 224.61657 435.95197 H 229.50059 14.06821 Z m 404.12274,193.92328 c 0.5435,-1.62671 0.7697,-4.1896 0.5593,-6.33717 l -0.35327,-3.60588 2.02141,1.70093 c 2.0872,1.75623 6.12111,2.91418 7.39955,2.12405 1.60986,-0.99494 0.17246,-22.58171 -4.09392,-61.48194 -2.4121,-21.99331 -5.16745,-36.13264 -13.63898,-69.98992 -11.76766,-47.03046 -17.6915,-66.87399 -23.29045,-78.018 -3.05414,-6.07884 -10.94711,-14.35468 -26.24072,-27.51359 -7.70318,-6.62795 -14.53054,-12.85172 -15.17192,-13.83061 -0.82087,-1.25278 -1.16618,-3.20403 -1.16618,-6.58963 0,-4.35473 0.33187,-5.52352 3.50761,-12.35284 3.55949,-7.65455 4.61097,-11.45131 5.38062,-19.42871 0.23553,-2.44111 0.5901,-5.00653 0.78798,-5.70093 0.37098,-1.30199 0.33621,-1.30199 6.54095,-5.3e-4 1.54467,0.32399 1.8778,0.156 1.8778,-0.94685 0,-3.12282 -5.89139,-9.23258 -11.77985,-12.21649 -3.14418,-1.59327 -4.14446,-1.72579 -13.72995,-1.81898 -9.30704,-0.0905 -10.99375,0.0821 -16.90309,1.72985 -3.61043,1.00672 -9.14133,2.97297 -12.2909,4.36947 -4.71006,2.08838 -6.51436,2.5377 -10.16492,2.53131 -5.43171,-0.01 -10.0982,-2.02949 -12.9921,-5.62394 -5.28934,-6.569715 -9.48063,-12.381459 -17.34876,-24.056284 -4.71236,-6.992276 -10.5708,-14.876508 -13.01876,-17.520534 -4.07293,-4.399143 -4.95761,-4.993093 -10.41936,-6.995271 -25.71854,-9.427965 -62.78731,-20.104596 -91.32207,-26.302797 -24.99826,-5.430018 -46.11902,-7.7814 -82.62224,-9.198365 -25.281038,-0.981346 -31.391329,-0.296052 -33.223994,3.72621 -0.657606,1.443286 -0.588283,1.965651 0.406778,3.06518 2.027119,2.239942 0.706721,3.002338 -4.4509,2.569941 -5.257843,-0.440798 -8.754616,0.294018 -10.481939,2.20269 -1.675594,1.851509 -0.526919,3.6497 4.263174,6.673774 2.135556,1.348216 5.880103,3.907541 8.321215,5.687385 2.441112,1.779847 9.201114,5.936015 15.022225,9.23593 5.821114,3.299918 15.039298,9.112314 20.484854,12.916437 17.237706,12.04181 35.396697,23.43117 78.525277,49.251214 7.69889,4.60914 14.9076,8.93819 16.01936,9.62011 2.73356,1.67669 7.33706,7.47958 15.41699,19.43373 7.52724,11.13648 11.36327,16.09208 22.12073,28.57691 6.5659,7.62022 15.40859,19.72547 15.40859,21.09369 0,0.98837 -10.48111,16.19991 -19.17373,27.8274 -12.73728,17.03771 -37.03022,46.31957 -49.4739,59.63409 -6.03066,6.45268 -7.82916,9.51545 -7.82916,13.33267 0,3.91626 1.8597,7.03435 7.83963,13.14445 5.2848,5.3998 5.63993,5.63306 8.56716,5.62666 5.52045,-0.0122 8.99274,-2.34167 21.83161,-14.64715 14.18025,-13.59112 16.84365,-15.7983 36.87274,-30.55676 8.45,-6.22638 19.48536,-14.76417 24.52303,-18.97285 11.09409,-9.26847 13.29309,-10.52481 17.68342,-10.10296 4.09603,0.39358 12.51358,5.75634 28.97035,18.4568 19.38356,14.95924 21.33819,17.09146 37.40819,40.80736 5.72577,8.45 11.23762,16.43909 12.24857,17.75354 1.01095,1.31445 3.0185,4.38717 4.46122,6.82829 12.48767,21.1296 36.74097,55.2092 47.13671,66.23436 1.94765,2.06555 4.68128,5.6728 6.07473,8.01611 2.55003,4.28829 4.88508,6.58284 5.99863,5.8946 1.06125,-0.65587 2.72003,1.28212 7.85556,9.17782 4.56163,7.01328 5.19526,7.70519 6.87851,7.51109 1.48198,-0.17086 2.03718,-0.76189 2.76659,-2.94507 z"
+     id="path835-1"
+     inkscape:connector-curvature="0" />
+  <path
+     style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.20005751;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="M 14.06821,224.61657 V 13.281165 H 229.50059 444.93297 V 224.61657 435.95197 H 229.50059 14.06821 Z m 404.12274,193.92328 c 0.5435,-1.62671 0.7697,-4.1896 0.5593,-6.33717 l -0.35327,-3.60588 2.02141,1.70093 c 2.0872,1.75623 6.12111,2.91418 7.39955,2.12405 1.60986,-0.99494 0.17246,-22.58171 -4.09392,-61.48194 -2.4121,-21.99331 -5.16745,-36.13264 -13.63898,-69.98992 -11.76766,-47.03046 -17.6915,-66.87399 -23.29045,-78.018 -3.05414,-6.07884 -10.94711,-14.35468 -26.24072,-27.51359 -7.70318,-6.62795 -14.53054,-12.85172 -15.17192,-13.83061 -0.82087,-1.25278 -1.16618,-3.20403 -1.16618,-6.58963 0,-4.35473 0.33187,-5.52352 3.50761,-12.35284 3.55949,-7.65455 4.61097,-11.45131 5.38062,-19.42871 0.23553,-2.44111 0.5901,-5.00653 0.78798,-5.70093 0.37098,-1.30199 0.33621,-1.30199 6.54095,-5.3e-4 1.54467,0.32399 1.8778,0.156 1.8778,-0.94685 0,-3.12282 -5.89139,-9.23258 -11.77985,-12.21649 -3.14418,-1.59327 -4.14446,-1.72579 -13.72995,-1.81898 -9.30704,-0.0905 -10.99375,0.0821 -16.90309,1.72985 -3.61043,1.00672 -9.14133,2.97297 -12.2909,4.36947 -4.71006,2.08838 -6.51436,2.5377 -10.16492,2.53131 -5.43171,-0.01 -10.0982,-2.02949 -12.9921,-5.62394 -5.28934,-6.569715 -9.48063,-12.381459 -17.34876,-24.056284 -4.71236,-6.992276 -10.5708,-14.876508 -13.01876,-17.520534 -4.07293,-4.399143 -4.95761,-4.993093 -10.41936,-6.995271 -25.71854,-9.427965 -62.78731,-20.104596 -91.32207,-26.302797 -24.99826,-5.430018 -46.11902,-7.7814 -82.62224,-9.198365 -25.281038,-0.981346 -31.391329,-0.296052 -33.223994,3.72621 -0.657606,1.443286 -0.588283,1.965651 0.406778,3.06518 2.027119,2.239942 0.706721,3.002338 -4.4509,2.569941 -5.257843,-0.440798 -8.754616,0.294018 -10.481939,2.20269 -1.675594,1.851509 -0.526919,3.6497 4.263174,6.673774 2.135556,1.348216 5.880103,3.907541 8.321215,5.687385 2.441112,1.779847 9.201114,5.936015 15.022225,9.23593 5.821114,3.299918 15.039298,9.112314 20.484854,12.916437 17.237706,12.04181 35.396697,23.43117 78.525277,49.251214 7.69889,4.60914 14.9076,8.93819 16.01936,9.62011 2.73356,1.67669 7.33706,7.47958 15.41699,19.43373 7.52724,11.13648 11.36327,16.09208 22.12073,28.57691 6.5659,7.62022 15.40859,19.72547 15.40859,21.09369 0,0.98837 -10.48111,16.19991 -19.17373,27.8274 -12.73728,17.03771 -37.03022,46.31957 -49.4739,59.63409 -6.03066,6.45268 -7.82916,9.51545 -7.82916,13.33267 0,3.91626 1.8597,7.03435 7.83963,13.14445 5.2848,5.3998 5.63993,5.63306 8.56716,5.62666 5.52045,-0.0122 8.99274,-2.34167 21.83161,-14.64715 14.18025,-13.59112 16.84365,-15.7983 36.87274,-30.55676 8.45,-6.22638 19.48536,-14.76417 24.52303,-18.97285 11.09409,-9.26847 13.29309,-10.52481 17.68342,-10.10296 4.09603,0.39358 12.51358,5.75634 28.97035,18.4568 19.38356,14.95924 21.33819,17.09146 37.40819,40.80736 5.72577,8.45 11.23762,16.43909 12.24857,17.75354 1.01095,1.31445 3.0185,4.38717 4.46122,6.82829 12.48767,21.1296 36.74097,55.2092 47.13671,66.23436 1.94765,2.06555 4.68128,5.6728 6.07473,8.01611 2.55003,4.28829 4.88508,6.58284 5.99863,5.8946 1.06125,-0.65587 2.72003,1.28212 7.85556,9.17782 4.56163,7.01328 5.19526,7.70519 6.87851,7.51109 1.48198,-0.17086 2.03718,-0.76189 2.76659,-2.94507 z"
+     id="path837-8"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_black.eps b/docs/reference-manual/plots/GMX_logos/gmx_logo_black.eps
new file mode 100644 (file)
index 0000000..c9432ae
--- /dev/null
@@ -0,0 +1,575 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.15.10 (http://cairographics.org)
+%%CreationDate: Tue Dec 22 10:51:32 2020
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 0 0 4762 1203
+%%EndComments
+%%BeginProlog
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_data_source {
+  CairoDataIndex CairoData length lt
+    { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
+    { () } ifelse
+} def
+/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
+/cairo_image { image cairo_flush_ascii85_file } def
+/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
+%%EndProlog
+%%BeginSetup
+%%BeginResource: font LiberationSans-Bold
+11 dict begin
+/FontType 42 def
+/FontName /LiberationSans-Bold def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 65 /A put
+Encoding 67 /C put
+Encoding 71 /G put
+Encoding 77 /M put
+Encoding 79 /O put
+Encoding 82 /R put
+Encoding 83 /S put
+/CharStrings 8 dict dup begin
+/.notdef 0 def
+/G 1 def
+/R 2 def
+/O 3 def
+/M 4 def
+/A 5 def
+/C 6 def
+/S 7 def
+end readonly def
+/sfnts [
+<000100000009008000030010637674206d5f6ba1000008a0000002886670676d7e61b6110000
+0b28000007b4676c7966bf4bbc950000009c0000080468656164ff8cb2c4000012dc00000036
+686865610e18037b0000131400000024686d74782fc7034900001338000000206c6f63610000
+1f1c00001358000000246d617870042005340000137c00000020707265708aa104b90000139c
+00000490000200cd00000532058100030007001f400d06020503020309080503040003003fcd
+2fcd11120139391133113331301321112113112111cd0465fb9b4c03cd0581fa7f0535fb1704
+e900000000010054ffec05ba0596001c004a40291a0e141304070e130507041e1d06055f5906
+060b1111175f59141411040b005f590b13301e01201e015d5d003f2b00183f332f2b11120039
+182f2b111201173911331133113331302532363735213521110604232000111000212013052e
+01232206151412032673d83bfea8026670fe99c5fea8fe8e0174015d01f087fef02cbc7fd0d8
+dfd34334c3dafdfa7382017d015e015c0173fe91526b6efcebeffefb000200890000059d0581
+000d0015005d4033010c0c1209120303040e09000d0d09040317160c120202125f5902020005
+05115f590503040012701701a017013017012017015d5d5d71003f323f2b11120039182f2b11
+1200391112011739113311331133113311123911333130210121112111213204151406070901
+342901112132360451feb9fea6fed902c0fc0112a88f017dfe91fefcfe8601827c800217fde9
+0581d9cb94d722fdb003d1cbfe607000000000020054ffec05e30596000c00180048402c1307
+0d000700191a0a105f590a0404165f590413a01a01801a01701a01601a01401a01301a01f01a
+01201a015d5d717171717171003f2b00183f2b11120139391133113331300114020423200011
+100021200001340223220215141233321205e3aefebcd8feb4fe870178014f014f0179fed3d8
+c3c6d8ddbfc6d702c7dcfeb2b1018701540153017cfe80feb1e40103feffe6e8fef501040000
+000100890000062105810017016d40ff150017100d0e170e1918040a07131713271303080a18
+0a280a03090a13150f030e0800128b19016b19014b19013b19011b1901fb1901ef1901c41901
+ab19019f19018b19017419015b19014f19013419010b190167ff1901e41901cb1901bb1901af
+19019419017b19016f19014419012b19011f19010b1901f41901db1901cf1901bb19018b1901
+6b19014b19013b19011b1901fb1901cb1901ab19018b19017b19015b19013b19012f19010419
+0137eb1901cb1901b419019b19017419014b19012419010b1901fb1901d41901bb1901af1901
+8419016b19015f1901024019013f19011f1901f01901e01901cf1901a019017f19014f19013f
+1901201901b3001901075e5d5d5d5d5d5d5d5d5d7171715f7171717171717172727272727272
+725e5d5d5d5d5d5d5d5d5d7171717171717171717272727272727272727272725e5d5d5d5d5d
+5d5d5d5d5d5d7171717171003f32323f3339395e5d5d11331112013939113333113333313021
+11343637020703230b01161511211121131f0137012111051b01094722fed2fe6b0cfefa018b
+fc16303f0103018903561d3adcfef36afcee03120177e84bfcaa0581fcec4cbde2033bfa7f00
+000200330000059105810007000f020740ff0d01000c02080300070304060508040807031011
+070c025f590d08050c0c06050304001286110174110164110153110143110134110125110116
+1101021101f31101e41101d41101c51101b61101a31101931101841101751101661101541101
+45110134110124110115110104110168f51101e51101d41101c51101b3110100a01101921101
+841101741101621101501101421101321101241101161101021101f01101e21101d41101c411
+01b21101a41101901101821101741101621101521101441101361101241101101101021101f4
+1101e41101d61101c41101b21101a21101941101861101761101641101521101441101341101
+26110114110106406f110138f21101e41101d61101c21101b41101a611018411017611016411
+0154110146110126110112110101001101f41101c41101b01101a01101941101741101641101
+501101441101341101141101e41101c41101b411019411018411017011016411014411011011
+0102001101085e5d5f5d5d5d5d5d5d5d5d5d7171717171717171717171725f72727272727272
+7272727272725e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d717171717171717171717171717171
+7172727272727272727272725f72727272725e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d717171
+717171717171003f323f33392f1239332b00182f111201173911333311331133111239391139
+393130210321032101210901070e0103210327046d7dfde77dfed90202015c0200fd52060a1c
+9e01958b2b0168fe980581fa7f04a816245cfe3401958800000000010054ffec058f05960018
+005240321609100f0203090f03031a190c135f5910100c040002100202000240028002c002d0
+02050b0302020606005f590613301a015d003f2b110033182f5f5e5d713f332f2b1112011739
+113311331133313025201305060423200011100021320417052e01232206151412031b010b68
+010153febfe0feacfe8d01660154f801383ffefc21c183c8cfd5d4010c61ccc70181015a015b
+0174c7c1476a7df8eff3ff000001003bffec05060596002a0052402f0c001d1c221607060616
+1c00042c2b0c22031919205f591d1d1904030a5f591007200730070330074007020707031300
+3f332f5d712b00183f332f2b1112003939111201173911331133113311333130011404212024
+27251e01332035342e01272e0435342421200417052e01232015141e01171e030506fecdfed7
+fef1fecc2c011d1da89501354781b79e7c644627011f01120106010726fee216877efef43970
+abcbaf66360196cfdbc0c32f7065bc3c4e3425252d3d56744bbfcba4bd275b5ca8374631252b
+4961870005cc05cc007d058100150079058100150000000000000000000000000000043a0014
+00770000ffec00000000ffec00000000ffec0000fe57fff70000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000800000000000119012500f500eb
+0000000000000000000000c100d300ba00b000cf000000000000000000000000012701290106
+0000011200e400f400c60000000000000000000000000000000000000000000000000119011f
+014c0000000000df00d100c500b5000000000000000000000000000000000000000000000102
+00a901fd00d80119008000b701fd00000000013f00db015d012500aa00800075008d01fc0179
+012100a001100000000001310119010e0104000000000000000000000000000000000000013d
+01ff00e00106009400e00094014400e005730319000000d802c5009c038102cd00cb00f4004e
+028d000000ff00d700cc01300145007300b400a60000000000730080008d0000000000000000
+00000000030000a200980083008d000000000000000005aefebc0581fd300011fff600b600bc
+00c60000007f008a0060000000000000000000f001ee01900000021901080115000000000000
+00be00000000000000000748036a02b60202fd930000009100670091006101d90000028d0341
+000000000000000000000000000000aafe6ffe6801050093009800e20151008f00be00aefeb9
+fea4005e00af02d5005500f200a604150601000003e1001002fa000ffed401eafff300b80000
+00000363000bfd0ffff500000000000006810477001504d90000ffecffc5fe7f007500cd00f2
+010200d5011940475b5a59585554535251504f4e4d4c4b4a494847464544434241403f3e3d3c
+3b3a393837363531302f2e2d2c28272625242322211f181411100f0e0d0b0a09080706050403
+0201002c20b0016045b003252011466123452361482d2c20451868442d2c45234660b0206120
+b04660b004262348482d2c4523462361b0206020b02661b02061b004262348482d2c45234660
+b0406120b06660b004262348482d2c4523462361b0406020b02661b04061b004262348482d2c
+0110203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0ed51582320b04d
+44235920b0042651582320b00d44235921212d2c20204518684420b001602045b04676688a45
+60442d2c01b10b0a432343650a2d2c00b10a0b4323430b2d2c00b0282370b101283e01b02823
+70b10228453ab10200080d2d2c2045b00325456164b050515845441b2121592d2c49b00e2344
+2d2c2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb810
+0062602b0c642364615c58b00361592d2c8a03458a8a87b0112bb0292344b0297ae4182d2c45
+65b02c234445b02b23442d2c4b525845441b2121592d2c4b515845441b2121592d2c01b00525
+1023208af500b0016023edec2d2c01b005251023208af500b0016123edec2d2c01b0062510f5
+00edec2d2cb00243b001525821212121211b462346608a8a462320468a608a61b8ff80622320
+10238ab10c0c8a70456020b0005058b00161b8ffba8b1bb0468c59b0106068013a592d2c2045
+b0032546524bb013515b58b0022546206861b00325b003253f2321381b2111592d2c2045b003
+25465058b0022546206861b00325b003253f2321381b2111592d2c00b00743b006430b2d2c21
+210c6423648bb84000622d2c21b08051580c6423648bb82000621bb200402f2b59b002602d2c
+21b0c051580c6423648bb81555621bb200802f2b59b002602d2c0c6423648bb8400062602321
+2d2c4b53588ab004254964234569b0408b61b08062b020616ab00e23442310b00ef61b21238a
+121120392f592d2c4b535820b0032549646920b00526b0062549642361b08062b020616ab00e
+2344b0042610b00ef68a10b00e2344b00ef6b00e2344b00eed1b8ab00426111220392320392f
+2f592d2c4523456023456023456023766818b08062202d2cb0482b2d2c2045b0005458b04044
+2045b04061441b2121592d2c45b1302f4523456160b0016069442d2c4b5158b02f2370b01423
+421b2121592d2c4b515820b0032545695358441b2121591b2121592d2c45b01443b0006063b0
+016069442d2cb02f45442d2c452320458a60442d2c45234560442d2c4b235158b90033ffe0b1
+34201bb3330034005944442d2cb0164358b00326458a586466b01f601b64b020606620581b21
+b04059b001615923586559b02923442310b029e01b2121212121592d2cb0024354584b53234b
+515a58381b2121591b21212121592d2cb0164358b004254564b020606620581b21b04059b001
+6123581b6559b0292344b00525b00825082058021b0359b0042510b005252046b0042523423c
+b00425b0072508b0072510b006252046b00425b0016023423c2058011b0059b0042510b00525
+b029e0b02920456544b0072510b00625b029e0b00525b00825082058021b0359b00525b00325
+4348b00425b0072508b00625b00325b0016043481b2159212121212121212d2c02b004252020
+46b004252342b0052508b003254548212121212d2c02b0032520b0042508b002254348212121
+2d2c452320451820b00050205823652359236820b040505821b04059235865598a60442d2c4b
+53234b515a5820458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b515a58
+381b2121592d2cb000214b5458381b2121592d2cb002435458b0462b1b21212121592d2cb002
+435458b0472b1b212121592d2cb002435458b0482b1b21212121592d2cb002435458b0492b1b
+212121592d2c208a08234b538a4b515a5823381b2121592d2c00b0022549b000535820b04038
+111b21592d2c014623466023466123201020468a61b8ff80628ab140408a704560683a2d2c20
+8a2349648a2353583c1b21592d2c4b52587d1b7a592d2cb012004b014b54422d2cb1020042b1
+23018851b1400188535a58b910000020885458b202010243604259b12401885158b920000040
+885458b2020202436042b12401885458b2022002436042004b014b5258b2020802436042591b
+b940000080885458b202040243604259b94000008063b80100885458b202080243604259b940
+00010063b80200885458b202100243604259b12601885158b94000020063b80400885458b202
+400243604259b94000040063b80800885458b2028002436042595959595959b1000243545840
+0a0540084009400c020d021bb10102435458b2054008ba010000090100b30c010d011bb18002
+435258b2054008b80180b109401bb2054008ba01800009014059b9400000808855b940000200
+63b8040088555a58b30c000d011bb30c000d0159595942424242422d2c451868234b51582320
+452064b04050587c59688a6059442d2cb00016b00225b0022501b001233e00b002233eb10102
+060cb00a236542b00b234201b001233f00b002233fb10102060cb006236542b0072342b00116
+012d2cb080b0024350b001b00243545b58212310b0201ac91b8a10ed592d2cb0592b2d2c8a10
+e52d00010000000200000e5dbc7f5f0f3cf5021f080000000000c849682600000000cf7c005f
+fc25fcfd0a6f084400010008000000010000000000010000073efe4e00430aaafc25fa7a0a6f
+000100000000000000000000000000000008060000cd0639005405c700890639005406aa0089
+05c7003305c700540556003b000000000000004c000000fc000001b00000025c000004240000
+0678000007280000080400010000000801520054005c000600020010002f005c0000034d0354
+000400014155013f000101390055013e000101390055014201400014001f01410140001f001f
+013b0033013a0055013800330139005500a4013900f4013900020132003d0131005501310001
+012f00550130003d012f0055012c012900ff001f01290001012a00550128003d012700550127
+0001012a00550126003d0125005501250001012a00550123012200ff001f01220001012a0055
+012b003d012a0055005001070001002f0107000100af0104405001d0fd01bffd0110fd016ffb
+0140fb0180f590f5a0f503f1f0351f2ff09ff0025fef012fef5fef6fef9fefdfef05e6e4201f
+e5e43d1fe2e0271fe1e03d1fdf3ddd55de3d035500dd30dd02dd0103552f410b011e00010010
+011e0020011e0040011e0003ffc0011e4028191c46dc03ff1f00db01da043c1fd4d21c1fd3d2
+261f60d190d1c0d10360d190d1b0d1c0d1e0d105b8ffc0b3d1191d46b8ffc0b4d10a0d460fb8
+0116400f01bfbe261f40bb29414640bb222746b801214026b63d1f00b8016fb801b8b70a1f00
+b70100b720b740b760b770b70540b760b790b7d0b7f0b705b80120400d483d1f00b560b502a0
+b5d0b502b8ffc0400eb50b0e460fb25fb202b1033c1f2f410b0119003f0119004f0119000300
+8f011900010040011940282629461faf2faf3faf9faf040faf0140af0e164600ad70ad80ad03
+e0adf0ad02abaa351faa50261fb9011b011ab23c1f00b8011ab6010fa9010fa801bc01170113
+003c001f0115407e503c1f9e9b271f9d9b271f9c9b271f809b019846281f9f97af9702964635
+1f0f941f94029390261f9291261f0f8f1f8f6f8f7f8f8f8f058e8c261f4f8d010f8c01408c0b
+0f460f891f890286850f1f5f850136824682027650261f7550261f7450261f7350261f297001
+1b7001037001f47001d670e67002687001597001b8fff0407d700a0d466f6e481f6e46321f1a
+01185519331855073303550603ff1f6150261f605f321f5f50261f5e5a481f5c46271f5b5a78
+1f5a46311f1332125505010355043203556f03010f033f034f036f037f03055f53014053282c
+4640531e224640531318466b527b528b5203514f1c1f504f1c1f194f294f02594f694f02b801
+12402d46251f4946191f4846211f4746351ff846019846011c481b551632155511010f551032
+0f55020100550100ff1fb80111b21b091fb80110402d1b091f1f0f3f0f5f0f7f0f040f0f2f0f
+4f0f6f0f8f0fdf0fff0f073f0f7f0fef0f036f00014f00018016010501b80190b154532b2b4b
+b807ff524bb007505bb00188b02553b00188b040515ab00688b000555a5b58b101018e59858d
+8d00421d4bb0325358b0601d594bb0645358b0401d594bb0805358b0101db116004259737473
+74752b2b2b2b2b2b2b2b0173742b2b2b2b0073742b2b732b2b2b7373752b2b2b012b2b2b002b
+2b2b2b2b2b2b2b012b2b2b73737373747474002b2b2b2b0173732b73002b73732b732b2b7301
+2b732b00732b2b2b2b2b7373732b012b2b0073742b73742b73742b73012b73742b007374752b
+73742b2b2b012b00732b2b7374012b2b002b732b2b73752b732b2b012b2b002b2b737401732b
+0073737373737301737373002b2b2b2b2b2b2b2b2b2b2b2b732b2b2b2b2b2b1800>
+] def
+/f-0-0 currentdict end definefont pop
+%%EndResource
+%%BeginResource: font LiberationSans
+11 dict begin
+/FontType 42 def
+/FontName /LiberationSans def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 32 /space put
+Encoding 46 /period put
+Encoding 65 /A put
+Encoding 66 /B put
+Encoding 69 /E put
+Encoding 70 /F put
+Encoding 73 /I put
+Encoding 76 /L put
+Encoding 82 /R put
+Encoding 83 /S put
+Encoding 84 /T put
+Encoding 88 /X put
+/CharStrings 13 dict dup begin
+/.notdef 0 def
+/F 1 def
+/A 2 def
+/S 3 def
+/T 4 def
+/period 5 def
+/space 6 def
+/L 7 def
+/E 8 def
+/X 9 def
+/I 10 def
+/B 11 def
+/R 12 def
+end readonly def
+/sfnts [
+<000100000009008000030010637674204ada4bfa000008c4000002886670676d7e61b6110000
+0b4c000007b4676c79663c4a269c0000009c0000082868656164feff42d70000130000000036
+686865610d94038a0000133800000024686d74783b59064a0000135c000000346c6f63610000
+35b000001390000000386d617870037c03e4000013c80000002070726570fdae4749000013e8
+00000343000200cd00000532058100030007001f400d02060503060309080503040003003fcd
+2fcd11120139391133113331301321112113112111cd0465fb9b4c03cd0581fa7f0535fb1704
+e9000000000100a800000491058100090036401d01050506080206030a0b01045f5901010507
+07005f5907030512200b015d003f3f2b11120039182f2b111201173911331133313001112115
+21112311211501670312fceebf03e904e5fdf49efdc505819c00000000020004000005520581
+00070010005b40360d01000c02030605080003040408070312110c025f590c0c080503040012
+b01201501201f01201c012019012016012013012012f12015d5d5d5d5d5d7171003f323f3339
+2f2b111201173911333211333312393912393931302103210323013309010706070321032627
+048fa1fd7ea2c6023fd90236fd5b091931b4020fb51c1c019cfe640581fa7f04f11c5382fe31
+01d1455700000001005dffec04f80596002d008e401f0c001d1c2316060505161c00042f2e0c
+10131648490c590c690c030f0c0123b8fff04039131648462356236623030d23010c040c2303
+1919205f596f1d01591d014b1d0103001d0109051d190403095f596006015206014406010603
+13003f335d5d5d2b00183f335f5e5d5f5d5d5d2b11120039395f5e5d5d2b5d5d2b1112011739
+11331133113311333130011404212003371e0133323635342e02272e0335342421321617072e
+0123220615141e01171e0504f8fecffeebfdfd52b920d0b3b9c93f729e60a7ad643501150102
+f0fe33bc1fae9aa9b24582c2418176674c2b0185c3d60166257f777f7b4556382616254a5b7a
+4fb5c493b1217065706f41553b2b0f1f2b3a54720001002e000004b405810007013040d90102
+040207030908000405045f59050301127b09014b09013b0901240901fb0901cb0901bb09019b
+09018b09017f0901025f09014f09013009010f090167df0901cf0901b009018f09015f09014f
+09010f0901f00901df0901cf0901af09019f09017009015f09014009011f0901ef0901df0901
+9f09016f09015f09013f09011f090100090137ef0901d009019009018009016f09015009012f
+0901000901d00901af09019009017f09016f0901500901400901200901100901ff0901e00901
+bf0901a009019009016009014009013f09012009010f0901075e5d5d5d5d5d5d5d5d5d5d7171
+7171717171717172727272727272725e5d5d5d5d5d5d5d5d7171717171717171717272727272
+72725e5d5d5d5d5f5d5d5d5d5d5d71717171003f3f2b11003311120117391133313001112311
+2135211502d0befe1c048604e5fb1b04e59c9c000000000100bb0000017e00db00030017400a
+030000040500019b5b00002f2b111201391133313033353315bbc3dbdb000000000100a80000
+042f05810005001f400e030000040607010300035f590012003f2b00183f1112013939113331
+30331133112115a8bf02c80581fb1b9c000100a8000004fe0581000b00544032050909000a03
+0700040c0d05085f598f0501ba050179058905020f050108030505000101045f59010300095f
+590012200d015d003f2b00183f2b11120039182f5f5e5d5d5d712b1112011739113311333130
+331121152111211521112115a8042dfc920332fcce039705819cfe3c9afe159c00000001002e
+0000052b0581000b010840c5080906050203000b0305040a090b060d0c1b0d4b0d028b0dbb0d
+eb0d03040d140d340d440d046a540d640d840d940db40dc40de40df40d083b0d01240d010b0d
+01f40d01db0d01c40d01ab0d01940d017b0d01640d01300d01240d01000d01f40d01d00d01c4
+0d01a00d01940d01700d01640d01400d01340d01100d01040d0139e00d01d40d01b00d01a40d
+01800d01140d440d740d03240d540d840db40de40d05540d640d940df40d04400d0102000d30
+0d0277070178010101040a0704080503030012003f323f3317395d5d015d5f5d5d7172727272
+72725e5d5d5d5d5d5d5d5d5d5d5d71717171717171717171727272725e5d5d71111217391133
+11331133113331302109012309013309013309010458fe59fe50d30218fe11d30188017dd3fe
+1e020b0268fd9802dc02a5fdd70229fd62fd1d00000100bd0000017c05810003008c40610300
+0004050103001240050130050120050110050100050139f00501b00501a00501700501600501
+500501400501000501f00501c00501b00501a00501500501400501100501000501f00501af05
+019005017005016005015005014005012005015d5d5d5d5d5d5d5d7171717171717171727272
+72727272725e5d5d5d5d5d003f3f111201391133313033113311bdbf0581fa7f000300a80000
+04ea0581000d0016001e0068403a0b1308131b1b040e081700000804031f200b131a131a5f59
+132413024d0f1301033e1301040f130110051313040505125f590503041b5f590412003f2b00
+183f2b11120039182f5f5e5d5f5d5f712b2b1112003911120117391133113311331133111239
+31300114042321112120111406071e01013426232111213236133429011121323604eafeeef4
+fdc4020001f08c80a8b6feee9c94febf0141999751fea2fe9c0173afa0018dbcd10581feaa7d
+aa1d14b901fa7262fe4273fdfff9fe0482000000000200a8000005680581000d00160057402f
+010c0c1309130303040e09000d0d09040317180c0213025f591313000505125f590503040012
+8018017018012018015d5d5d003f323f2b11120039182f2b1100331112011739113311331133
+1133111239113331302101211123112132041514060701033426232111213236048cfe92fe49
+bf0297ee0103b7a10190f8a79dfe3b01cd97a50249fdb70581d5be9dd61cfda103ec7b81fdf8
+8d0005cc05cc007d058100150079058100150000000000000000000000000000043a00140077
+0000ffec00000000ffec00000000ffec0000fe57000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000008000000000000b400bd00af00a00000
+000000000000000000000088007e000000ac00000000000000000000000000bf00c300ab0000
+0000009b008d000000000000000000000000000000000000000000000000000000b900aa0000
+00000000009400990087000000000000000000000000000000000000000000000000006a0083
+008d00a400b4000000000000000000000060006a0079009800ac00b800a700000122013300c3
+006b00000000000000db00c90000000000000000000000000000000000000000000001e101c9
+009200a8006b009200b7006b009b0000027b02f200920252006e02d703810082008900a0009f
+0169008f0000016000a4015b005e0082000000000000005e0065006f00000000000000000000
+00000000008a009000a5007a0080000000000000000000000581fff3000dfcb300830089008f
+00960069007105cc000ffc1efff2003404e6000dfed400bf031f00a700ae00b5000000000081
+00000000000000000748036a02b60202fd930000009100670091006101d90000028d03410000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000006810468001404cb0000ffecffd3fe7f008300db00aa00ba
+00a000cf40475b5a59585554535251504f4e4d4c4b4a494847464544434241403f3e3d3c3b3a
+393837363531302f2e2d2c28272625242322211f181411100f0e0d0b0a090807060504030201
+002c20b0016045b003252011466123452361482d2c20451868442d2c45234660b0206120b046
+60b004262348482d2c4523462361b0206020b02661b02061b004262348482d2c45234660b040
+6120b06660b004262348482d2c4523462361b0406020b02661b04061b004262348482d2c0110
+203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0ed51582320b04d4423
+5920b0042651582320b00d44235921212d2c20204518684420b001602045b04676688a456044
+2d2c01b10b0a432343650a2d2c00b10a0b4323430b2d2c00b0282370b101283e01b0282370b1
+0228453ab10200080d2d2c2045b00325456164b050515845441b2121592d2c49b00e23442d2c
+2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
+602b0c642364615c58b00361592d2c8a03458a8a87b0112bb0292344b0297ae4182d2c4565b0
+2c234445b02b23442d2c4b525845441b2121592d2c4b515845441b2121592d2c01b005251023
+208af500b0016023edec2d2c01b005251023208af500b0016123edec2d2c01b0062510f500ed
+ec2d2cb00243b001525821212121211b462346608a8a462320468a608a61b8ff806223201023
+8ab10c0c8a70456020b0005058b00161b8ffba8b1bb0468c59b0106068013a592d2c2045b003
+2546524bb013515b58b0022546206861b00325b003253f2321381b2111592d2c2045b0032546
+5058b0022546206861b00325b003253f2321381b2111592d2c00b00743b006430b2d2c21210c
+6423648bb84000622d2c21b08051580c6423648bb82000621bb200402f2b59b002602d2c21b0
+c051580c6423648bb81555621bb200802f2b59b002602d2c0c6423648bb84000626023212d2c
+4b53588ab004254964234569b0408b61b08062b020616ab00e23442310b00ef61b21238a1211
+20392f592d2c4b535820b0032549646920b00526b0062549642361b08062b020616ab00e2344
+b0042610b00ef68a10b00e2344b00ef6b00e2344b00eed1b8ab00426111220392320392f2f59
+2d2c4523456023456023456023766818b08062202d2cb0482b2d2c2045b0005458b040442045
+b04061441b2121592d2c45b1302f4523456160b0016069442d2c4b5158b02f2370b01423421b
+2121592d2c4b515820b0032545695358441b2121591b2121592d2c45b01443b0006063b00160
+69442d2cb02f45442d2c452320458a60442d2c45234560442d2c4b235158b90033ffe0b13420
+1bb3330034005944442d2cb0164358b00326458a586466b01f601b64b020606620581b21b040
+59b001615923586559b02923442310b029e01b2121212121592d2cb0024354584b53234b515a
+58381b2121591b21212121592d2cb0164358b004254564b020606620581b21b04059b0016123
+581b6559b0292344b00525b00825082058021b0359b0042510b005252046b0042523423cb004
+25b0072508b0072510b006252046b00425b0016023423c2058011b0059b0042510b00525b029
+e0b02920456544b0072510b00625b029e0b00525b00825082058021b0359b00525b003254348
+b00425b0072508b00625b00325b0016043481b2159212121212121212d2c02b00425202046b0
+04252342b0052508b003254548212121212d2c02b0032520b0042508b0022543482121212d2c
+452320451820b00050205823652359236820b040505821b04059235865598a60442d2c4b5323
+4b515a5820458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b515a58381b
+2121592d2cb000214b5458381b2121592d2cb002435458b0462b1b21212121592d2cb0024354
+58b0472b1b212121592d2cb002435458b0482b1b21212121592d2cb002435458b0492b1b2121
+21592d2c208a08234b538a4b515a5823381b2121592d2c00b0022549b000535820b04038111b
+21592d2c014623466023466123201020468a61b8ff80628ab140408a704560683a2d2c208a23
+49648a2353583c1b21592d2c4b52587d1b7a592d2cb012004b014b54422d2cb1020042b12301
+8851b1400188535a58b910000020885458b202010243604259b12401885158b9200000408854
+58b2020202436042b12401885458b2022002436042004b014b5258b2020802436042591bb940
+000080885458b202040243604259b94000008063b80100885458b202080243604259b9400001
+0063b80200885458b202100243604259b12601885158b94000020063b80400885458b2024002
+43604259b94000040063b80800885458b2028002436042595959595959b10002435458400a05
+40084009400c020d021bb10102435458b2054008ba010000090100b30c010d011bb180024352
+58b2054008b80180b109401bb2054008ba01800009014059b9400000808855b94000020063b8
+040088555a58b30c000d011bb30c000d0159595942424242422d2c451868234b515823204520
+64b04050587c59688a6059442d2cb00016b00225b0022501b001233e00b002233eb10102060c
+b00a236542b00b234201b001233f00b002233fb10102060cb006236542b0072342b00116012d
+2cb080b0024350b001b00243545b58212310b0201ac91b8a10ed592d2cb0592b2d2c8a10e52d
+00010000000200005f97514e5f0f3cf5021f080000000000c840f99a00000000cf7bfed5fba6
+fd930a6a07d700000008000000010000000000010000073efe4e00430ab4fba6fa7a0a6a0001
+0000000000000000000000000000000d060000cd04e300a8055600040556005d04e3002e0239
+00bb02390000047300a8055600a80556002e023900bd055600a805c700a8000000000000004c
+000000b00000015800000270000003c8000003f8000003f800000434000004b8000006000000
+06a40000077c0000082800010000000d01520054005c000600020010002f005c000002a40204
+0004000141210009013f000101390055013e000101390055014201400014001f01410140001f
+001f013b0033013a00550138003301390055004001070001001f01070001009f010440aa01c0
+fd01affd0100fd010a4ffb0120fb01f550281ff246281ff1462a1ff0462b1f5fef7fef020fef
+4fef5fef8fefafef050be5e41e1fe3e2461f0fe20140e246161fe1e0461fcfe0dfe0efe00340
+e0333646e046181feeedff1fed01e855ec48eb55ea320055e9e8e855e7480055e600ff1fdd3d
+df55df010355de3d0355dc03ff1f0fd51fd5020fd51fd50240ca181b46cfc201bdc03c1fc150
+261fbcbe281fffb90150b870b880b803b8ffc040ffb81232461fb73fb74fb76fb77fb79fb7af
+b70718b60170b2a0b2b0b2030fb20190b501b0b5010fb501080fb33fb3efb30380b090b002b0
+b0c0b0d0b0032faf3faf02a0adb0ad02c0add0ad022fac3fac029fab01c0aad0aa024fa98fa9
+022fa96fa9bfa9ffa9049c9b241f509b016f9601bf960196461d1f9594171f0f941f947f948f
+94ff94053091409102809101708f808f02908f01c08fd08f024f8c5f8c6f8c038646ff1f9f85
+018483311f74733f1f7350261f6f6e3c1f6e46351f1a01185519331855073303550603ff1f60
+50261f5f50261f5c46311f5b5a481f5a46311f1332125505010355043203556c03010c033c03
+4c036c037c0305ef51ff4064510240513538464051252846cf50014946201f4846351f474635
+1faf4601df46ef46028046011632155511010f5510320f55020100550100011f1f0f3f0f5f0f
+7f0f040f0f2f0f4f0f6f0f8f0fdf0fff0f073f0f7f0fef0f036f00014f00018016010501b801
+90b154532b2b4bb807ff524bb007505bb00188b02553b00188b040515ab00688b000555a5b58
+b101018e59858d8d00421d4bb0325358b0601d594bb0645358b0401d594bb0805358b0101db1
+1600425973747374752b2b2b2b2b017374752b2b2b00742b2b7373752b2b2b012b2b2b002b2b
+2b2b2b2b012b2b002b2b012b732b00747374757374732b012b747500732b7374017373740073
+7474737473015e73737473730073732b7373012b002b012b00732b74752b2b2b2b2b2b2b2b2b
+2b2b012b2b742b2b5e732b002b5e7374012b2b2b002b73735e73737301737373002b2b2b2b2b
+2b185e0000>
+] def
+/f-1-0 currentdict end definefont pop
+%%EndResource
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 0 4762 1203
+%%EndPageSetup
+q 0 0 4762 1203 rectclip
+1 0 0 -1 0 1203 cm q
+0 g
+3343.73 10.711 m 3326.793 13.18 3307.699 15.402 3297.887 21.449 c 3287.934
+ 28.629 3290.18 36.867 3292.492 38.832 c 3294.109 40.422 3298.875 42.934
+ 3299.426 46.52 c 3299.051 53.301 3270.855 50.512 3255.34 55.426 c 3248.902
+ 57.629 3243.965 62.211 3243.699 66.816 c 3244.168 73.789 3248.535 74.984
+ 3253.219 77.453 c 3264.656 83.316 3276.566 87.27 3286.039 93.418 c 3290.617
+ 95.984 3295.051 98.902 3301.688 102.234 c 3333.039 117.758 3371.008 130.91
+ 3381.789 136.312 c 3508.773 200.281 3640.422 264.254 3763.32 314.754 c 
+3831.301 386.93 3910.168 456.766 3969.223 527.359 c 3946.176 575.613 3924.559
+ 612.945 3897.066 660.316 c 3875.961 695.527 3860.914 718.512 3845.078 743.086
+ c 3816.77 787.762 3785.32 821.027 3761.18 866.367 c 3755.375 875.957 3752.625
+ 885.488 3752.328 895.031 c 3753.613 918.82 3801.086 949.34 3805.395 950.477
+ c 3819.391 953.766 3832.789 944.645 3844.312 935.789 c 3875.773 903.062
+ 3903.031 859.324 3942.812 821.273 c 3963.965 801.363 3983.012 782.316 4009.887
+ 757.949 c 4042.195 727.586 4065.188 702.324 4091.82 673.598 c 4108.535 
+657.922 4120.234 659.223 4121.953 658.855 c 4193.309 680.719 4250.883 712.484
+ 4293.578 751.238 c 4405.504 864.152 4485.582 976.426 4588.777 1078.074 
+c 4605.168 1094.926 4619.773 1105.051 4632.73 1118.266 c 4651.391 1142.262
+ l 4654.816 1146.43 4665.469 1156.457 4668.535 1148.523 c 4686.023 1160.5
+ 4693.273 1173.863 4703.438 1185.641 c 4713.336 1197.559 4717.746 1202.688
+ 4723.25 1202.223 c 4728.625 1200.957 4730.762 1190.043 4730.285 1183.047
+ c 4727.418 1161.488 4725.07 1155.113 4726.516 1153.676 c 4728.883 1152.648
+ 4736.551 1171.609 4759.762 1165.672 c 4765.039 1161.383 4756.293 1134.273
+ 4744 1067.984 c 4699.426 872.008 4637.398 675.41 4548.203 503.516 c 4539.172
+ 485.344 4528.855 470.23 4516.238 460.617 c 4488.039 434.039 4458.438 415.641
+ 4428.926 396.73 c 4413.434 385.852 4396.535 375.59 4382.676 363.996 c 4369.422
+ 352.094 4368.766 330.727 4374.066 312.961 c 4377.77 298.496 4385.754 277.953
+ 4387.297 271.555 c 4391.293 248.266 4389.66 245.648 4389.43 225.195 c 4388.988
+ 217.062 4387.879 212.855 4390.484 206.535 c 4394.258 202.602 4399.66 201.516
+ 4405.582 203.324 c 4413.57 207.34 4417.418 206.586 4418.242 204.445 c 4411.488
+ 179.484 4370.039 161.531 4348.203 166.996 c 4333.777 164.441 4315.582 166.543
+ 4302.48 169.953 c 4278.016 177.395 4259.891 184.824 4240.559 195.035 c 
+4223.984 205.664 4210.301 215.695 4187.004 213.465 c 4168.426 211.398 4158.68
+ 205.367 4149.766 196.402 c 4099.684 151.062 4065.785 90.91 4014.332 56.988
+ c 3780.102 0.566 3568.707 -11.492 3343.73 10.711 c h
+3579.664 61.125 m 3722.555 43.281 3869.695 40.352 3999.113 81.539 c 4037.711
+ 123.34 4063.203 168.012 4095.312 214.117 c 4109.617 240.516 4118.742 258.082
+ 4107.559 283.785 c 4069.113 343.789 4027.219 415.969 3991.285 484.223 c
+ 3993.379 514.504 3836.512 314.414 3792.176 288.668 c 3657.199 211.926 3645.324
+ 227.828 3442.434 106.246 c 3430.613 97.859 3419.438 84.195 3481.688 75.5
+ c 3513.941 70.152 3546.688 65.242 3579.664 61.125 c h
+4356.293 175.797 m 4361.727 175.176 4371.113 175.688 4382.57 183.578 c 
+4378.031 188.582 4379.562 194.051 4380.93 199.645 c 4368.387 194.281 4355.363
+ 206.562 4336.137 209.891 c 4352.84 203.883 4360.059 193.469 4352.246 176.566
+ c 4353.109 176.336 4354.48 176.004 4356.293 175.797 c h
+4319.512 188.051 m 4325.719 188.617 4323.547 188.32 4327.879 190.855 c 
+4322.16 201.566 4316.312 207.297 4305.895 206.586 c 4297.199 205.965 4294.203
+ 201.746 4288.301 195.332 c 4295.988 193.449 l 4303.73 210.109 4320.734 
+202.621 4321.109 193.824 c 4320.465 189.309 4319.512 188.051 4319.512 188.051
+ c h
+4249.414 222.734 m 4263.34 220.848 4281.578 242.562 4277.324 258.215 c 
+4303.887 274.281 4316.141 251.945 4330.656 239.754 c 4360.641 218.047 4369.234
+ 219.285 4379.984 219.613 c 4382.094 243.73 4379.664 269.086 4365.5 304.82
+ c 4346.379 401.875 4305.414 442.266 4263.375 486.484 c 4178.129 577.906
+ 4089.652 662.836 3989.613 739.312 c 3968.332 754.105 3951.793 762.883 3932.273
+ 755.82 c 3930.52 725.672 3938.902 698.273 3950.27 666.516 c 3973.297 612.461
+ 3996.742 561.617 4016.453 504.648 c 4067.617 383.102 4112.539 333.281 4158.863
+ 282.98 c 4183.215 261.613 4190.781 253.156 4198.781 252.27 c 4208.363 263.41
+ 4239.504 268.055 4242.336 263.543 c 4235.922 261.555 4235.172 258.699 4234.785
+ 253.43 c 4235.148 232.277 4241.602 223.793 4249.414 222.734 c h
+4393.387 435.266 m 4418.41 443.07 4466.48 473.914 4515.32 493.883 c 4623.484
+ 670.66 4656.152 904.32 4661.191 1029.406 c 4661.078 1069.164 4656.305 1062.82
+ 4643.137 1056 c 4498.242 960.715 4413.879 808.531 4304.039 706.004 c 4236.258
+ 666.219 4162.562 652.215 4143.688 632.547 c 4253.996 537.738 4338.379 459.234
+ 4393.387 435.266 c h
+3949.652 622.961 m 3954.016 622.605 3947.93 637.332 3945.402 643.309 c 
+3930.672 675.277 3923.738 711.812 3914.203 745.488 c 3907.891 764.602 3898.258
+ 771.586 3888.789 770.418 c 3877.973 768.285 3860.805 753.867 3868.598 738.207
+ c 3891.621 703.336 3910.348 662.09 3941.281 629.23 c 3945.578 624.875 3948.195
+ 623.082 3949.652 622.961 c h
+3983.707 758.523 m 3994.418 757.191 3939.504 805.996 3925.879 812.176 c
+ 3908.133 796.094 3947.695 777.059 3960.957 770.855 c 3973.984 762.465 3980.98
+ 758.867 3983.707 758.523 c h
+3835.918 781.219 m 3841.543 796.906 3855.684 803.105 3864.777 808.203 c
+ 3859.305 815.355 3855.527 820.055 3849.438 825.348 c 3838.367 819.352 3828.441
+ 815.473 3821.738 802.617 c 3826.59 793.426 3830.07 788.32 3835.918 781.219
+ c h
+3804.688 828.371 m 3810.48 836.691 3820.172 846.375 3829.348 850.52 c 3825.926
+ 855.684 3822.23 861.285 3817.062 865.57 c 3806.723 861.645 3796.043 851.516
+ 3791.695 845.125 c 3795.727 837.508 3801.113 830.762 3804.688 828.371 c
+ h
+3887.062 825.625 m 3893.656 838.336 3901.23 840.609 3906.133 843.582 c 
+3903.363 847.398 3901.34 851.676 3892.918 857.551 c 3888.41 856.641 3877.953
+ 847.969 3874.66 840.109 c 3879.844 832.293 3882.055 830.934 3887.062 825.625
+ c h
+3851.426 867.527 m 3855.723 875.969 3861.363 882.234 3869.895 885.254 c
+ 3866.477 892.301 3863.773 894.633 3858.688 898.137 c 3855.562 896.184 3848.027
+ 892.191 3840.055 881.488 c 3844.773 874.672 3847.051 872.477 3851.426 867.527
+ c h
+3767.102 888.582 m 3778.391 908.258 3799.156 919.305 3817.613 935.039 c
+ 3815.273 936.793 3815.008 942.23 3810.789 942.828 c 3793.531 934.027 3774.535
+ 920.598 3761.09 898.758 c 3763.551 894.031 3763.715 892.711 3767.102 888.582
+ c h
+3767.102 888.582 m f*
+4364.688 182.262 m 4364.754 181.164 4365.281 178.062 4367.141 178.605 c
+ 4369.168 179.988 4370.465 182.137 4371.031 185.625 c 4371.238 187.367 4371.254
+ 188.812 4368.719 186.855 c 4367.406 185.656 4366.934 185.422 4364.688 182.262
+ c h
+4364.688 182.262 m f*
+BT
+703.125 0 0 -703.125 -28.839109 1012.363769 Tm
+/f-0-0 1 Tf
+[(GR)7(O)3(M)-4(A)22(CS)]TJ
+281.25 0 0 -281.25 22.97874 379.641906 Tm
+/f-1-0 1 Tf
+[(F)54(AST)109(.  FLEXIBLE)-3(.  FREE.)]TJ
+ET
+Q Q
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_black.png b/docs/reference-manual/plots/GMX_logos/gmx_logo_black.png
new file mode 100644 (file)
index 0000000..3cfea6c
Binary files /dev/null and b/docs/reference-manual/plots/GMX_logos/gmx_logo_black.png differ
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_black.svg b/docs/reference-manual/plots/GMX_logos/gmx_logo_black.svg
new file mode 100644 (file)
index 0000000..703166e
--- /dev/null
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100%"
+   height="100%"
+   viewBox="0 0 6349 1603"
+   version="1.1"
+   xml:space="preserve"
+   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
+   id="svg923"
+   sodipodi:docname="Gromacs Logo [Blue].svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   inkscape:export-filename="/home/cathrine/Pictures/svg_files/gromacs_logo1.png"
+   inkscape:export-xdpi="300"
+   inkscape:export-ydpi="300"><metadata
+   id="metadata929"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+   id="defs927">
+        
+    
+            
+            
+            
+        
+                
+            
+                
+
+
+            
+
+
+
+
+
+<inkscape:path-effect
+   is_visible="true"
+   id="path-effect1061"
+   effect="spiro" /><clipPath
+   id="_clip1-3"><rect
+     x="0"
+     y="0"
+     width="291.98801"
+     height="550.58301"
+     id="rect892-6" /></clipPath></defs><sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="1853"
+   inkscape:window-height="1145"
+   id="namedview925"
+   showgrid="false"
+   units="mm"
+   inkscape:zoom="0.1767767"
+   inkscape:cx="3203.3303"
+   inkscape:cy="513.69543"
+   inkscape:window-x="67"
+   inkscape:window-y="27"
+   inkscape:window-maximized="1"
+   inkscape:current-layer="g1133"
+   viewbox-width="6349" />
+    
+
+<g
+   id="g1835"
+   inkscape:export-filename="/home/cathrine/Pictures/svg_files/gromacs_logo3.png"
+   inkscape:export-xdpi="300"
+   inkscape:export-ydpi="300"
+   transform="translate(107.48023,33.941125)"><g
+     transform="matrix(3.7513483,-0.46066696,0.46066696,3.7513483,4198.3338,3197.8407)"
+     id="layer1"
+     style="fill:none;fill-opacity:1;stroke:none"><g
+       style="clip-rule:evenodd;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-linejoin:round;stroke-miterlimit:2"
+       id="g903-7"
+       transform="matrix(0.82454635,-0.51053871,0.49150293,0.84357369,250.14362,56.767957)"><g
+         style="fill:none;fill-opacity:1;stroke:none"
+         id="g901-5"
+         transform="translate(-145.994,-275.291)"><clipPath
+           id="clipPath1706"><rect
+             id="rect1704"
+             height="550.58301"
+             width="291.98801"
+             y="0"
+             x="0" /></clipPath><g
+           style="fill:none;fill-opacity:1;stroke:none"
+           id="g899-3"
+           clip-path="url(#_clip1-3)"><g
+             style="fill:none;fill-opacity:1;stroke:none"
+             id="g897-5"
+             transform="matrix(1,0,0,-1,0,555.789)" /></g></g></g></g><g
+     id="g1146"
+     transform="translate(-208,-112)"><g
+       transform="translate(-24.46945,-27.842525)"
+       id="g1133"><g
+         id="g862"
+         transform="translate(414.87524,-2396.4028)"
+         inkscape:export-filename="/home/cathrine/Pictures/svg_files/GROMACS_logo/GMX_logos/gmx_logo_waterstamp.png"
+         inkscape:export-xdpi="300"
+         inkscape:export-ydpi="300"
+         style="fill:#000000;fill-opacity:1"><g
+           transform="matrix(1.1914369,0,0,1.1914369,-1160.5458,-865.93629)"
+           id="g1066"
+           style="fill:#000000;fill-opacity:1"><path
+             inkscape:connector-curvature="0"
+             style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.24566934;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+             d="m 4472.724,2839.028 c -18.9578,2.7624 -40.3248,5.2475 -51.3026,12.0164 -11.1396,8.0334 -8.6273,17.2529 -6.0392,19.4534 1.809,1.7786 7.1445,4.5875 7.7607,8.6026 -0.4228,7.5868 -31.9734,4.4681 -49.3367,9.9666 -7.2041,2.4668 -12.7316,7.5949 -13.03,12.7457 0.5245,7.8067 5.4123,9.1408 10.6558,11.9072 12.7997,6.5604 26.1289,10.9848 36.7265,17.8638 5.1267,2.8708 10.0857,6.1364 17.5131,9.8687 35.0857,17.3692 77.5793,32.0888 89.6427,38.1355 142.1092,71.5868 289.4364,143.1806 426.9703,199.6938 76.0785,80.7698 164.3367,158.9248 230.4266,237.9267 -25.7919,53.9994 -49.985,95.7775 -80.7537,148.7919 -23.6163,39.4046 -40.4556,65.1229 -58.1793,92.6255 -31.679,49.9972 -66.8743,87.2218 -93.8903,137.9627 -6.4954,10.7344 -9.5722,21.3976 -9.9044,32.0771 1.4363,26.6251 54.5642,60.7762 59.3845,62.0488 15.6641,3.6803 30.6604,-6.5234 43.5538,-16.4369 35.2082,-36.6242 65.7142,-85.5701 110.2334,-128.1511 23.6708,-22.2813 44.9846,-43.5978 75.0608,-70.8665 36.1568,-33.9801 61.8854,-62.2483 91.6934,-94.3994 18.7019,-17.5404 31.7963,-16.0871 33.719,-16.4985 79.854,24.4679 144.2844,60.0159 192.0664,103.3863 125.2565,126.3629 214.8693,252.0078 330.3562,365.7604 18.3417,18.8579 34.6897,30.1905 49.189,44.9806 l 20.8798,26.8525 c 3.8362,4.6637 15.7584,15.8848 19.1887,7.0084 19.5715,13.4021 27.6858,28.3576 39.057,41.5375 11.0806,13.3361 16.0149,19.075 22.175,18.5548 6.0156,-1.414 8.406,-13.6293 7.8728,-21.4595 -3.2094,-24.1228 -5.8358,-31.2602 -4.2192,-32.8675 2.6505,-1.1501 11.231,20.0703 37.2069,13.4264 5.9021,-4.801 -3.8849,-35.1376 -17.6422,-109.3249 -49.8812,-219.313 -119.2973,-439.3267 -219.1139,-631.6945 -10.1075,-20.3354 -21.6503,-37.2484 -35.7724,-48.0076 -31.5595,-29.743 -64.6838,-50.3313 -97.71,-71.4928 -17.3384,-12.1743 -36.2474,-23.6602 -51.7595,-36.6363 -14.8342,-13.3173 -15.5681,-37.2282 -9.6343,-57.1109 4.1461,-16.1885 13.0799,-39.1769 14.8082,-46.3379 4.4695,-26.0616 2.6444,-28.9902 2.3838,-51.8805 -0.4952,-9.0998 -1.734,-13.8082 1.1824,-20.8818 4.2196,-4.4031 10.2684,-5.6178 16.8947,-3.5958 8.9415,4.4959 13.2466,3.6501 14.1668,1.2553 -7.5576,-27.932 -53.942,-48.0228 -78.3797,-41.9076 -16.1437,-2.8597 -36.5044,-0.5062 -51.168,3.3062 -27.38,8.3304 -47.6638,16.6447 -69.2986,28.0698 -18.5469,11.8969 -33.859,23.1233 -59.9307,20.6264 -20.7896,-2.3142 -31.6988,-9.0623 -41.6715,-19.0965 -56.0504,-50.7396 -93.9825,-118.0556 -151.5659,-156.0158 -262.1276,-63.1428 -498.6955,-76.6351 -750.4662,-51.7887 z m 264.0305,56.417 c 159.9113,-19.9667 324.5729,-23.2472 469.4073,22.8454 43.1939,46.7812 71.7193,96.7697 107.654,148.3676 16.0067,29.5418 26.2196,49.2028 13.7029,77.9678 -43.0219,67.1498 -89.9084,147.925 -130.1207,224.3075 2.3444,33.8873 -173.2045,-190.0312 -222.8195,-218.8444 -151.0521,-85.8808 -164.3419,-68.086 -391.3982,-204.1467 -13.2274,-9.3868 -25.7352,-24.6771 43.9285,-34.4096 36.0945,-5.9832 72.7431,-11.4799 109.6457,-16.0876 z m 869.1232,128.3286 c 6.0803,-0.6956 16.5846,-0.1211 29.4077,8.7091 -5.0815,5.5993 -3.3648,11.7192 -1.8377,17.9811 -14.0341,-6.0056 -28.6087,7.7408 -50.1267,11.4647 18.6917,-6.7253 26.7702,-18.3786 18.0302,-37.2941 0.9662,-0.2556 2.4998,-0.629 4.5265,-0.8608 z m -41.1628,13.7131 c 6.9488,0.6361 4.5155,0.3006 9.3643,3.1379 -6.3991,11.9879 -12.9412,18.4014 -24.6018,17.6064 -9.7285,-0.6954 -13.0845,-5.4165 -19.6897,-12.5944 l 8.6041,-2.1074 c 8.666,18.6462 27.6935,10.266 28.1142,0.4182 -0.721,-5.051 -1.7911,-6.4607 -1.7911,-6.4607 z m -78.4439,38.8134 c 15.5839,-2.1115 35.9956,22.192 31.2327,39.708 29.7288,17.9783 43.4401,-7.0169 59.6827,-20.6609 33.5569,-24.2906 43.1726,-22.9036 55.2037,-22.5371 2.3616,26.9868 -0.3589,55.3656 -16.2096,95.3546 -21.3966,108.611 -67.2419,153.814 -114.2861,203.297 -95.4006,102.3124 -194.4115,197.3584 -306.3666,282.9392 -23.814,16.5585 -42.3253,26.3784 -64.1697,18.4767 -1.9597,-33.7382 7.4207,-64.4014 20.1406,-99.9422 25.769,-60.4901 52.0083,-117.3891 74.0673,-181.1438 57.2573,-136.022 107.5282,-191.7775 159.3703,-248.0693 27.2496,-23.9096 35.7193,-33.3759 44.6733,-34.3692 10.7218,12.4703 45.5714,17.6662 48.7409,12.6162 -7.1769,-2.2219 -8.0167,-5.4195 -8.452,-11.316 0.4076,-23.6723 7.6303,-33.1687 16.3725,-34.3532 z m 161.1188,237.8463 c 28.0024,8.7342 81.7988,43.2495 136.4539,65.5957 121.0474,197.8343 157.6045,459.3213 163.2438,599.3057 -0.1232,44.4924 -5.4683,37.3925 -20.2029,29.7605 -162.1516,-106.6331 -256.5636,-276.941 -379.4814,-391.6809 -75.8563,-44.5235 -158.3274,-60.1941 -179.4496,-82.2076 123.4449,-106.0988 217.8761,-193.9501 279.4362,-220.7734 z m -496.583,210.049 c 4.885,-0.4003 -1.9247,16.0829 -4.7542,22.7708 -16.4841,35.7763 -24.246,76.6615 -34.9148,114.3483 -7.0672,21.3877 -17.8468,29.2058 -28.4427,27.8974 -12.1031,-2.3877 -31.3177,-18.522 -22.597,-36.0457 25.7669,-39.0258 46.7247,-85.1813 81.3436,-121.9547 4.8078,-4.8737 7.7367,-6.8826 9.3651,-7.0161 z m 38.113,151.7084 c 11.9834,-1.4948 -49.4683,53.1241 -64.7175,60.0388 -19.8565,-17.9957 24.4173,-39.2974 39.2585,-46.2391 14.5789,-9.3925 22.4044,-13.4187 25.459,-13.7997 z m -165.3916,25.3968 c 6.2934,17.5559 22.1194,24.4918 32.2983,30.1967 -6.1257,8.0037 -10.354,13.264 -17.1683,19.1868 -12.387,-6.7117 -23.4968,-11.0497 -30.9995,-25.4367 5.4321,-10.2873 9.3252,-15.998 15.8695,-23.9468 z m -34.948,52.7684 c 6.4811,9.3107 17.3246,20.1472 27.5938,24.7844 -3.8276,5.7796 -7.9643,12.0472 -13.7468,16.844 -11.5716,-4.3951 -23.5249,-15.7268 -28.3888,-22.8783 4.5122,-8.5268 10.5423,-16.0767 14.5418,-18.7501 z m 92.1855,-3.0753 c 7.3777,14.2244 15.8534,16.7713 21.3392,20.0977 -3.0992,4.2721 -5.3618,9.0567 -14.7873,15.6298 -5.0433,-1.0176 -16.7497,-10.7206 -20.4317,-19.5184 5.8006,-8.7454 8.2719,-10.266 13.8798,-16.2091 z m -39.8805,46.894 c 4.8069,9.4466 11.117,16.4588 20.6656,19.8361 -3.8242,7.8868 -6.8513,10.4991 -12.5394,14.4171 -3.4977,-2.1856 -11.9327,-6.6504 -20.8518,-18.6286 5.2785,-7.6273 7.8258,-10.0848 12.7256,-15.6246 z m -94.3688,23.5625 c 12.6327,22.0171 35.8732,34.3814 56.5276,51.9881 -2.6202,1.9653 -2.9157,8.0504 -7.6367,8.7204 -19.313,-9.8515 -40.5709,-24.8798 -55.6173,-49.3193 2.7544,-5.2895 2.9364,-6.7685 6.7264,-11.3892 z"
+             id="rect1188" /><path
+             inkscape:connector-curvature="0"
+             style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.29999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 5615.2719,3031.0101 c 0.075,-1.2289 0.6651,-4.6992 2.7475,-4.0926 2.2666,1.5467 3.7201,3.9506 4.3543,7.8539 0.2282,1.9516 0.2476,3.5697 -2.5883,1.3807 -1.4708,-1.3462 -2.0008,-1.608 -4.5135,-5.142 z"
+             id="path1103-2" /></g><g
+           id="g1073"
+           style="fill:#000000;fill-opacity:1"><text
+   x="-328.33817"
+   y="3852.1226"
+   style="font-weight:700;font-size:937.5px;font-family:KannadaMN-Bold, 'Kannada MN';fill:#000000;fill-opacity:1;stroke-width:1.5625"
+   id="text907"><tspan
+     style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';fill:#000000;fill-opacity:1"
+     id="tspan962"
+     dx="0 0.34 -6.75 -2.0699999 2.4099996 -21.060011">GROMACS</tspan></text>
+
+
+<text
+   x="-255.0177"
+   y="3008.4934"
+   style="font-size:375px;font-family:KannadaMN, 'Kannada MN';fill:#000000;fill-opacity:1;stroke-width:1.5625"
+   id="text915"><tspan
+     id="tspan840"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';word-spacing:-0.01px;fill:#000000;fill-opacity:1"
+     dx="-4.2299995">FAST.  FLEXIBLE.  FREE.</tspan><tspan
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';word-spacing:-0.01px;fill:#000000;fill-opacity:1;stroke-width:1.5625"
+     x="-81.250793"
+     y="3008.4934"
+     id="tspan911" /></text>
+
+
+</g></g></g></g><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.03704604;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 4039.5085,-1228.8879 c 14.7955,-26.0805 30.1415,-54.98 41.768,-78.6574 6.3295,-12.8899 7.2866,-14.928 7.1144,-15.1498 -0.4357,-0.5613 -6.5497,-7.7703 -8.9122,-10.5083 -19.9386,-23.1076 -43.0918,-47.9255 -72.0024,-77.1792 l -5.1867,-5.2482 0.4811,-0.039 c 0.59,-0.048 -0.4107,-1.009 9.6881,9.3014 34.1045,34.8188 56.8517,58.9577 68.2493,72.4245 3.7434,4.423 9.4939,11.9094 9.3811,12.2129 -0.078,0.2092 -14.7241,28.4968 -19.731,38.108 -8.7207,16.7399 -16.8182,31.786 -26.3009,48.8699 l -3.9583,7.1313 h -0.6543 -0.6542 z"
+     id="path1020"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d=""
+     id="path1022"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d=""
+     id="path1024"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 4089.8968,-1322.132 c -0.1106,-0.1908 -0.1903,-0.3578 -0.1771,-0.371 0.034,-0.034 0.471,0.5714 0.471,0.6538 0,0.1471 -0.1009,0.05 -0.2939,-0.2828 z"
+     id="path1028"
+     inkscape:connector-curvature="0" /></g>
+<flowRoot
+   xml:space="preserve"
+   id="flowRoot27"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;line-height:1.25;font-family:KannadaMN-Bold, 'Kannada MN';-inkscape-font-specification:'KannadaMN-Bold, Kannada MN';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
+     id="flowRegion29"><rect
+       id="rect31"
+       width="2827.7173"
+       height="480.60019"
+       x="435.89319"
+       y="-1055.199" /></flowRegion><flowPara
+     id="flowPara33" /></flowRoot><flowRoot
+   xml:space="preserve"
+   id="flowRoot1713"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:KannadaMN-Bold, 'Kannada MN';-inkscape-font-specification:'KannadaMN-Bold, Kannada MN';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
+     id="flowRegion1715"><rect
+       id="rect1717"
+       width="829.83124"
+       height="284.51358"
+       x="1311.9237"
+       y="1882.0675" /></flowRegion><flowPara
+     id="flowPara1719" /></flowRoot></svg>
\ No newline at end of file
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_blue.eps b/docs/reference-manual/plots/GMX_logos/gmx_logo_blue.eps
new file mode 100644 (file)
index 0000000..afa1df4
--- /dev/null
@@ -0,0 +1,575 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.15.10 (http://cairographics.org)
+%%CreationDate: Tue Dec 22 10:47:32 2020
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 0 0 4762 1203
+%%EndComments
+%%BeginProlog
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_data_source {
+  CairoDataIndex CairoData length lt
+    { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
+    { () } ifelse
+} def
+/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
+/cairo_image { image cairo_flush_ascii85_file } def
+/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
+%%EndProlog
+%%BeginSetup
+%%BeginResource: font LiberationSans-Bold
+11 dict begin
+/FontType 42 def
+/FontName /LiberationSans-Bold def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 65 /A put
+Encoding 67 /C put
+Encoding 71 /G put
+Encoding 77 /M put
+Encoding 79 /O put
+Encoding 82 /R put
+Encoding 83 /S put
+/CharStrings 8 dict dup begin
+/.notdef 0 def
+/G 1 def
+/R 2 def
+/O 3 def
+/M 4 def
+/A 5 def
+/C 6 def
+/S 7 def
+end readonly def
+/sfnts [
+<000100000009008000030010637674206d5f6ba1000008a0000002886670676d7e61b6110000
+0b28000007b4676c7966bf4bbc950000009c0000080468656164ff8cb2c4000012dc00000036
+686865610e18037b0000131400000024686d74782fc7034900001338000000206c6f63610000
+1f1c00001358000000246d617870042005340000137c00000020707265708aa104b90000139c
+00000490000200cd00000532058100030007001f400d06020503020309080503040003003fcd
+2fcd11120139391133113331301321112113112111cd0465fb9b4c03cd0581fa7f0535fb1704
+e900000000010054ffec05ba0596001c004a40291a0e141304070e130507041e1d06055f5906
+060b1111175f59141411040b005f590b13301e01201e015d5d003f2b00183f332f2b11120039
+182f2b111201173911331133113331302532363735213521110604232000111000212013052e
+01232206151412032673d83bfea8026670fe99c5fea8fe8e0174015d01f087fef02cbc7fd0d8
+dfd34334c3dafdfa7382017d015e015c0173fe91526b6efcebeffefb000200890000059d0581
+000d0015005d4033010c0c1209120303040e09000d0d09040317160c120202125f5902020005
+05115f590503040012701701a017013017012017015d5d5d71003f323f2b11120039182f2b11
+1200391112011739113311331133113311123911333130210121112111213204151406070901
+342901112132360451feb9fea6fed902c0fc0112a88f017dfe91fefcfe8601827c800217fde9
+0581d9cb94d722fdb003d1cbfe607000000000020054ffec05e30596000c00180048402c1307
+0d000700191a0a105f590a0404165f590413a01a01801a01701a01601a01401a01301a01f01a
+01201a015d5d717171717171003f2b00183f2b11120139391133113331300114020423200011
+100021200001340223220215141233321205e3aefebcd8feb4fe870178014f014f0179fed3d8
+c3c6d8ddbfc6d702c7dcfeb2b1018701540153017cfe80feb1e40103feffe6e8fef501040000
+000100890000062105810017016d40ff150017100d0e170e1918040a07131713271303080a18
+0a280a03090a13150f030e0800128b19016b19014b19013b19011b1901fb1901ef1901c41901
+ab19019f19018b19017419015b19014f19013419010b190167ff1901e41901cb1901bb1901af
+19019419017b19016f19014419012b19011f19010b1901f41901db1901cf1901bb19018b1901
+6b19014b19013b19011b1901fb1901cb1901ab19018b19017b19015b19013b19012f19010419
+0137eb1901cb1901b419019b19017419014b19012419010b1901fb1901d41901bb1901af1901
+8419016b19015f1901024019013f19011f1901f01901e01901cf1901a019017f19014f19013f
+1901201901b3001901075e5d5d5d5d5d5d5d5d5d7171715f7171717171717172727272727272
+725e5d5d5d5d5d5d5d5d5d7171717171717171717272727272727272727272725e5d5d5d5d5d
+5d5d5d5d5d5d7171717171003f32323f3339395e5d5d11331112013939113333113333313021
+11343637020703230b01161511211121131f0137012111051b01094722fed2fe6b0cfefa018b
+fc16303f0103018903561d3adcfef36afcee03120177e84bfcaa0581fcec4cbde2033bfa7f00
+000200330000059105810007000f020740ff0d01000c02080300070304060508040807031011
+070c025f590d08050c0c06050304001286110174110164110153110143110134110125110116
+1101021101f31101e41101d41101c51101b61101a31101931101841101751101661101541101
+45110134110124110115110104110168f51101e51101d41101c51101b3110100a01101921101
+841101741101621101501101421101321101241101161101021101f01101e21101d41101c411
+01b21101a41101901101821101741101621101521101441101361101241101101101021101f4
+1101e41101d61101c41101b21101a21101941101861101761101641101521101441101341101
+26110114110106406f110138f21101e41101d61101c21101b41101a611018411017611016411
+0154110146110126110112110101001101f41101c41101b01101a01101941101741101641101
+501101441101341101141101e41101c41101b411019411018411017011016411014411011011
+0102001101085e5d5f5d5d5d5d5d5d5d5d5d7171717171717171717171725f72727272727272
+7272727272725e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d717171717171717171717171717171
+7172727272727272727272725f72727272725e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d717171
+717171717171003f323f33392f1239332b00182f111201173911333311331133111239391139
+393130210321032101210901070e0103210327046d7dfde77dfed90202015c0200fd52060a1c
+9e01958b2b0168fe980581fa7f04a816245cfe3401958800000000010054ffec058f05960018
+005240321609100f0203090f03031a190c135f5910100c040002100202000240028002c002d0
+02050b0302020606005f590613301a015d003f2b110033182f5f5e5d713f332f2b1112011739
+113311331133313025201305060423200011100021320417052e01232206151412031b010b68
+010153febfe0feacfe8d01660154f801383ffefc21c183c8cfd5d4010c61ccc70181015a015b
+0174c7c1476a7df8eff3ff000001003bffec05060596002a0052402f0c001d1c221607060616
+1c00042c2b0c22031919205f591d1d1904030a5f591007200730070330074007020707031300
+3f332f5d712b00183f332f2b1112003939111201173911331133113311333130011404212024
+27251e01332035342e01272e0435342421200417052e01232015141e01171e030506fecdfed7
+fef1fecc2c011d1da89501354781b79e7c644627011f01120106010726fee216877efef43970
+abcbaf66360196cfdbc0c32f7065bc3c4e3425252d3d56744bbfcba4bd275b5ca8374631252b
+4961870005cc05cc007d058100150079058100150000000000000000000000000000043a0014
+00770000ffec00000000ffec00000000ffec0000fe57fff70000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000800000000000119012500f500eb
+0000000000000000000000c100d300ba00b000cf000000000000000000000000012701290106
+0000011200e400f400c60000000000000000000000000000000000000000000000000119011f
+014c0000000000df00d100c500b5000000000000000000000000000000000000000000000102
+00a901fd00d80119008000b701fd00000000013f00db015d012500aa00800075008d01fc0179
+012100a001100000000001310119010e0104000000000000000000000000000000000000013d
+01ff00e00106009400e00094014400e005730319000000d802c5009c038102cd00cb00f4004e
+028d000000ff00d700cc01300145007300b400a60000000000730080008d0000000000000000
+00000000030000a200980083008d000000000000000005aefebc0581fd300011fff600b600bc
+00c60000007f008a0060000000000000000000f001ee01900000021901080115000000000000
+00be00000000000000000748036a02b60202fd930000009100670091006101d90000028d0341
+000000000000000000000000000000aafe6ffe6801050093009800e20151008f00be00aefeb9
+fea4005e00af02d5005500f200a604150601000003e1001002fa000ffed401eafff300b80000
+00000363000bfd0ffff500000000000006810477001504d90000ffecffc5fe7f007500cd00f2
+010200d5011940475b5a59585554535251504f4e4d4c4b4a494847464544434241403f3e3d3c
+3b3a393837363531302f2e2d2c28272625242322211f181411100f0e0d0b0a09080706050403
+0201002c20b0016045b003252011466123452361482d2c20451868442d2c45234660b0206120
+b04660b004262348482d2c4523462361b0206020b02661b02061b004262348482d2c45234660
+b0406120b06660b004262348482d2c4523462361b0406020b02661b04061b004262348482d2c
+0110203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0ed51582320b04d
+44235920b0042651582320b00d44235921212d2c20204518684420b001602045b04676688a45
+60442d2c01b10b0a432343650a2d2c00b10a0b4323430b2d2c00b0282370b101283e01b02823
+70b10228453ab10200080d2d2c2045b00325456164b050515845441b2121592d2c49b00e2344
+2d2c2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb810
+0062602b0c642364615c58b00361592d2c8a03458a8a87b0112bb0292344b0297ae4182d2c45
+65b02c234445b02b23442d2c4b525845441b2121592d2c4b515845441b2121592d2c01b00525
+1023208af500b0016023edec2d2c01b005251023208af500b0016123edec2d2c01b0062510f5
+00edec2d2cb00243b001525821212121211b462346608a8a462320468a608a61b8ff80622320
+10238ab10c0c8a70456020b0005058b00161b8ffba8b1bb0468c59b0106068013a592d2c2045
+b0032546524bb013515b58b0022546206861b00325b003253f2321381b2111592d2c2045b003
+25465058b0022546206861b00325b003253f2321381b2111592d2c00b00743b006430b2d2c21
+210c6423648bb84000622d2c21b08051580c6423648bb82000621bb200402f2b59b002602d2c
+21b0c051580c6423648bb81555621bb200802f2b59b002602d2c0c6423648bb8400062602321
+2d2c4b53588ab004254964234569b0408b61b08062b020616ab00e23442310b00ef61b21238a
+121120392f592d2c4b535820b0032549646920b00526b0062549642361b08062b020616ab00e
+2344b0042610b00ef68a10b00e2344b00ef6b00e2344b00eed1b8ab00426111220392320392f
+2f592d2c4523456023456023456023766818b08062202d2cb0482b2d2c2045b0005458b04044
+2045b04061441b2121592d2c45b1302f4523456160b0016069442d2c4b5158b02f2370b01423
+421b2121592d2c4b515820b0032545695358441b2121591b2121592d2c45b01443b0006063b0
+016069442d2cb02f45442d2c452320458a60442d2c45234560442d2c4b235158b90033ffe0b1
+34201bb3330034005944442d2cb0164358b00326458a586466b01f601b64b020606620581b21
+b04059b001615923586559b02923442310b029e01b2121212121592d2cb0024354584b53234b
+515a58381b2121591b21212121592d2cb0164358b004254564b020606620581b21b04059b001
+6123581b6559b0292344b00525b00825082058021b0359b0042510b005252046b0042523423c
+b00425b0072508b0072510b006252046b00425b0016023423c2058011b0059b0042510b00525
+b029e0b02920456544b0072510b00625b029e0b00525b00825082058021b0359b00525b00325
+4348b00425b0072508b00625b00325b0016043481b2159212121212121212d2c02b004252020
+46b004252342b0052508b003254548212121212d2c02b0032520b0042508b002254348212121
+2d2c452320451820b00050205823652359236820b040505821b04059235865598a60442d2c4b
+53234b515a5820458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b515a58
+381b2121592d2cb000214b5458381b2121592d2cb002435458b0462b1b21212121592d2cb002
+435458b0472b1b212121592d2cb002435458b0482b1b21212121592d2cb002435458b0492b1b
+212121592d2c208a08234b538a4b515a5823381b2121592d2c00b0022549b000535820b04038
+111b21592d2c014623466023466123201020468a61b8ff80628ab140408a704560683a2d2c20
+8a2349648a2353583c1b21592d2c4b52587d1b7a592d2cb012004b014b54422d2cb1020042b1
+23018851b1400188535a58b910000020885458b202010243604259b12401885158b920000040
+885458b2020202436042b12401885458b2022002436042004b014b5258b2020802436042591b
+b940000080885458b202040243604259b94000008063b80100885458b202080243604259b940
+00010063b80200885458b202100243604259b12601885158b94000020063b80400885458b202
+400243604259b94000040063b80800885458b2028002436042595959595959b1000243545840
+0a0540084009400c020d021bb10102435458b2054008ba010000090100b30c010d011bb18002
+435258b2054008b80180b109401bb2054008ba01800009014059b9400000808855b940000200
+63b8040088555a58b30c000d011bb30c000d0159595942424242422d2c451868234b51582320
+452064b04050587c59688a6059442d2cb00016b00225b0022501b001233e00b002233eb10102
+060cb00a236542b00b234201b001233f00b002233fb10102060cb006236542b0072342b00116
+012d2cb080b0024350b001b00243545b58212310b0201ac91b8a10ed592d2cb0592b2d2c8a10
+e52d00010000000200000e5dbc7f5f0f3cf5021f080000000000c849682600000000cf7c005f
+fc25fcfd0a6f084400010008000000010000000000010000073efe4e00430aaafc25fa7a0a6f
+000100000000000000000000000000000008060000cd0639005405c700890639005406aa0089
+05c7003305c700540556003b000000000000004c000000fc000001b00000025c000004240000
+0678000007280000080400010000000801520054005c000600020010002f005c0000034d0354
+000400014155013f000101390055013e000101390055014201400014001f01410140001f001f
+013b0033013a0055013800330139005500a4013900f4013900020132003d0131005501310001
+012f00550130003d012f0055012c012900ff001f01290001012a00550128003d012700550127
+0001012a00550126003d0125005501250001012a00550123012200ff001f01220001012a0055
+012b003d012a0055005001070001002f0107000100af0104405001d0fd01bffd0110fd016ffb
+0140fb0180f590f5a0f503f1f0351f2ff09ff0025fef012fef5fef6fef9fefdfef05e6e4201f
+e5e43d1fe2e0271fe1e03d1fdf3ddd55de3d035500dd30dd02dd0103552f410b011e00010010
+011e0020011e0040011e0003ffc0011e4028191c46dc03ff1f00db01da043c1fd4d21c1fd3d2
+261f60d190d1c0d10360d190d1b0d1c0d1e0d105b8ffc0b3d1191d46b8ffc0b4d10a0d460fb8
+0116400f01bfbe261f40bb29414640bb222746b801214026b63d1f00b8016fb801b8b70a1f00
+b70100b720b740b760b770b70540b760b790b7d0b7f0b705b80120400d483d1f00b560b502a0
+b5d0b502b8ffc0400eb50b0e460fb25fb202b1033c1f2f410b0119003f0119004f0119000300
+8f011900010040011940282629461faf2faf3faf9faf040faf0140af0e164600ad70ad80ad03
+e0adf0ad02abaa351faa50261fb9011b011ab23c1f00b8011ab6010fa9010fa801bc01170113
+003c001f0115407e503c1f9e9b271f9d9b271f9c9b271f809b019846281f9f97af9702964635
+1f0f941f94029390261f9291261f0f8f1f8f6f8f7f8f8f8f058e8c261f4f8d010f8c01408c0b
+0f460f891f890286850f1f5f850136824682027650261f7550261f7450261f7350261f297001
+1b7001037001f47001d670e67002687001597001b8fff0407d700a0d466f6e481f6e46321f1a
+01185519331855073303550603ff1f6150261f605f321f5f50261f5e5a481f5c46271f5b5a78
+1f5a46311f1332125505010355043203556f03010f033f034f036f037f03055f53014053282c
+4640531e224640531318466b527b528b5203514f1c1f504f1c1f194f294f02594f694f02b801
+12402d46251f4946191f4846211f4746351ff846019846011c481b551632155511010f551032
+0f55020100550100ff1fb80111b21b091fb80110402d1b091f1f0f3f0f5f0f7f0f040f0f2f0f
+4f0f6f0f8f0fdf0fff0f073f0f7f0fef0f036f00014f00018016010501b80190b154532b2b4b
+b807ff524bb007505bb00188b02553b00188b040515ab00688b000555a5b58b101018e59858d
+8d00421d4bb0325358b0601d594bb0645358b0401d594bb0805358b0101db116004259737473
+74752b2b2b2b2b2b2b2b0173742b2b2b2b0073742b2b732b2b2b7373752b2b2b012b2b2b002b
+2b2b2b2b2b2b2b012b2b2b73737373747474002b2b2b2b0173732b73002b73732b732b2b7301
+2b732b00732b2b2b2b2b7373732b012b2b0073742b73742b73742b73012b73742b007374752b
+73742b2b2b012b00732b2b7374012b2b002b732b2b73752b732b2b012b2b002b2b737401732b
+0073737373737301737373002b2b2b2b2b2b2b2b2b2b2b2b732b2b2b2b2b2b1800>
+] def
+/f-0-0 currentdict end definefont pop
+%%EndResource
+%%BeginResource: font LiberationSans
+11 dict begin
+/FontType 42 def
+/FontName /LiberationSans def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 32 /space put
+Encoding 46 /period put
+Encoding 65 /A put
+Encoding 66 /B put
+Encoding 69 /E put
+Encoding 70 /F put
+Encoding 73 /I put
+Encoding 76 /L put
+Encoding 82 /R put
+Encoding 83 /S put
+Encoding 84 /T put
+Encoding 88 /X put
+/CharStrings 13 dict dup begin
+/.notdef 0 def
+/F 1 def
+/A 2 def
+/S 3 def
+/T 4 def
+/period 5 def
+/space 6 def
+/L 7 def
+/E 8 def
+/X 9 def
+/I 10 def
+/B 11 def
+/R 12 def
+end readonly def
+/sfnts [
+<000100000009008000030010637674204ada4bfa000008c4000002886670676d7e61b6110000
+0b4c000007b4676c79663c4a269c0000009c0000082868656164feff42d70000130000000036
+686865610d94038a0000133800000024686d74783b59064a0000135c000000346c6f63610000
+35b000001390000000386d617870037c03e4000013c80000002070726570fdae4749000013e8
+00000343000200cd00000532058100030007001f400d02060503060309080503040003003fcd
+2fcd11120139391133113331301321112113112111cd0465fb9b4c03cd0581fa7f0535fb1704
+e9000000000100a800000491058100090036401d01050506080206030a0b01045f5901010507
+07005f5907030512200b015d003f3f2b11120039182f2b111201173911331133313001112115
+21112311211501670312fceebf03e904e5fdf49efdc505819c00000000020004000005520581
+00070010005b40360d01000c02030605080003040408070312110c025f590c0c080503040012
+b01201501201f01201c012019012016012013012012f12015d5d5d5d5d5d7171003f323f3339
+2f2b111201173911333211333312393912393931302103210323013309010706070321032627
+048fa1fd7ea2c6023fd90236fd5b091931b4020fb51c1c019cfe640581fa7f04f11c5382fe31
+01d1455700000001005dffec04f80596002d008e401f0c001d1c2316060505161c00042f2e0c
+10131648490c590c690c030f0c0123b8fff04039131648462356236623030d23010c040c2303
+1919205f596f1d01591d014b1d0103001d0109051d190403095f596006015206014406010603
+13003f335d5d5d2b00183f335f5e5d5f5d5d5d2b11120039395f5e5d5d2b5d5d2b1112011739
+11331133113311333130011404212003371e0133323635342e02272e0335342421321617072e
+0123220615141e01171e0504f8fecffeebfdfd52b920d0b3b9c93f729e60a7ad643501150102
+f0fe33bc1fae9aa9b24582c2418176674c2b0185c3d60166257f777f7b4556382616254a5b7a
+4fb5c493b1217065706f41553b2b0f1f2b3a54720001002e000004b405810007013040d90102
+040207030908000405045f59050301127b09014b09013b0901240901fb0901cb0901bb09019b
+09018b09017f0901025f09014f09013009010f090167df0901cf0901b009018f09015f09014f
+09010f0901f00901df0901cf0901af09019f09017009015f09014009011f0901ef0901df0901
+9f09016f09015f09013f09011f090100090137ef0901d009019009018009016f09015009012f
+0901000901d00901af09019009017f09016f0901500901400901200901100901ff0901e00901
+bf0901a009019009016009014009013f09012009010f0901075e5d5d5d5d5d5d5d5d5d5d7171
+7171717171717172727272727272725e5d5d5d5d5d5d5d5d7171717171717171717272727272
+72725e5d5d5d5d5f5d5d5d5d5d5d71717171003f3f2b11003311120117391133313001112311
+2135211502d0befe1c048604e5fb1b04e59c9c000000000100bb0000017e00db00030017400a
+030000040500019b5b00002f2b111201391133313033353315bbc3dbdb000000000100a80000
+042f05810005001f400e030000040607010300035f590012003f2b00183f1112013939113331
+30331133112115a8bf02c80581fb1b9c000100a8000004fe0581000b00544032050909000a03
+0700040c0d05085f598f0501ba050179058905020f050108030505000101045f59010300095f
+590012200d015d003f2b00183f2b11120039182f5f5e5d5d5d712b1112011739113311333130
+331121152111211521112115a8042dfc920332fcce039705819cfe3c9afe159c00000001002e
+0000052b0581000b010840c5080906050203000b0305040a090b060d0c1b0d4b0d028b0dbb0d
+eb0d03040d140d340d440d046a540d640d840d940db40dc40de40df40d083b0d01240d010b0d
+01f40d01db0d01c40d01ab0d01940d017b0d01640d01300d01240d01000d01f40d01d00d01c4
+0d01a00d01940d01700d01640d01400d01340d01100d01040d0139e00d01d40d01b00d01a40d
+01800d01140d440d740d03240d540d840db40de40d05540d640d940df40d04400d0102000d30
+0d0277070178010101040a0704080503030012003f323f3317395d5d015d5f5d5d7172727272
+72725e5d5d5d5d5d5d5d5d5d5d5d71717171717171717171727272725e5d5d71111217391133
+11331133113331302109012309013309013309010458fe59fe50d30218fe11d30188017dd3fe
+1e020b0268fd9802dc02a5fdd70229fd62fd1d00000100bd0000017c05810003008c40610300
+0004050103001240050130050120050110050100050139f00501b00501a00501700501600501
+500501400501000501f00501c00501b00501a00501500501400501100501000501f00501af05
+019005017005016005015005014005012005015d5d5d5d5d5d5d5d7171717171717171727272
+72727272725e5d5d5d5d5d003f3f111201391133313033113311bdbf0581fa7f000300a80000
+04ea0581000d0016001e0068403a0b1308131b1b040e081700000804031f200b131a131a5f59
+132413024d0f1301033e1301040f130110051313040505125f590503041b5f590412003f2b00
+183f2b11120039182f5f5e5d5f5d5f712b2b1112003911120117391133113311331133111239
+31300114042321112120111406071e01013426232111213236133429011121323604eafeeef4
+fdc4020001f08c80a8b6feee9c94febf0141999751fea2fe9c0173afa0018dbcd10581feaa7d
+aa1d14b901fa7262fe4273fdfff9fe0482000000000200a8000005680581000d00160057402f
+010c0c1309130303040e09000d0d09040317180c0213025f591313000505125f590503040012
+8018017018012018015d5d5d003f323f2b11120039182f2b1100331112011739113311331133
+1133111239113331302101211123112132041514060701033426232111213236048cfe92fe49
+bf0297ee0103b7a10190f8a79dfe3b01cd97a50249fdb70581d5be9dd61cfda103ec7b81fdf8
+8d0005cc05cc007d058100150079058100150000000000000000000000000000043a00140077
+0000ffec00000000ffec00000000ffec0000fe57000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000008000000000000b400bd00af00a00000
+000000000000000000000088007e000000ac00000000000000000000000000bf00c300ab0000
+0000009b008d000000000000000000000000000000000000000000000000000000b900aa0000
+00000000009400990087000000000000000000000000000000000000000000000000006a0083
+008d00a400b4000000000000000000000060006a0079009800ac00b800a700000122013300c3
+006b00000000000000db00c90000000000000000000000000000000000000000000001e101c9
+009200a8006b009200b7006b009b0000027b02f200920252006e02d703810082008900a0009f
+0169008f0000016000a4015b005e0082000000000000005e0065006f00000000000000000000
+00000000008a009000a5007a0080000000000000000000000581fff3000dfcb300830089008f
+00960069007105cc000ffc1efff2003404e6000dfed400bf031f00a700ae00b5000000000081
+00000000000000000748036a02b60202fd930000009100670091006101d90000028d03410000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000006810468001404cb0000ffecffd3fe7f008300db00aa00ba
+00a000cf40475b5a59585554535251504f4e4d4c4b4a494847464544434241403f3e3d3c3b3a
+393837363531302f2e2d2c28272625242322211f181411100f0e0d0b0a090807060504030201
+002c20b0016045b003252011466123452361482d2c20451868442d2c45234660b0206120b046
+60b004262348482d2c4523462361b0206020b02661b02061b004262348482d2c45234660b040
+6120b06660b004262348482d2c4523462361b0406020b02661b04061b004262348482d2c0110
+203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0ed51582320b04d4423
+5920b0042651582320b00d44235921212d2c20204518684420b001602045b04676688a456044
+2d2c01b10b0a432343650a2d2c00b10a0b4323430b2d2c00b0282370b101283e01b0282370b1
+0228453ab10200080d2d2c2045b00325456164b050515845441b2121592d2c49b00e23442d2c
+2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
+602b0c642364615c58b00361592d2c8a03458a8a87b0112bb0292344b0297ae4182d2c4565b0
+2c234445b02b23442d2c4b525845441b2121592d2c4b515845441b2121592d2c01b005251023
+208af500b0016023edec2d2c01b005251023208af500b0016123edec2d2c01b0062510f500ed
+ec2d2cb00243b001525821212121211b462346608a8a462320468a608a61b8ff806223201023
+8ab10c0c8a70456020b0005058b00161b8ffba8b1bb0468c59b0106068013a592d2c2045b003
+2546524bb013515b58b0022546206861b00325b003253f2321381b2111592d2c2045b0032546
+5058b0022546206861b00325b003253f2321381b2111592d2c00b00743b006430b2d2c21210c
+6423648bb84000622d2c21b08051580c6423648bb82000621bb200402f2b59b002602d2c21b0
+c051580c6423648bb81555621bb200802f2b59b002602d2c0c6423648bb84000626023212d2c
+4b53588ab004254964234569b0408b61b08062b020616ab00e23442310b00ef61b21238a1211
+20392f592d2c4b535820b0032549646920b00526b0062549642361b08062b020616ab00e2344
+b0042610b00ef68a10b00e2344b00ef6b00e2344b00eed1b8ab00426111220392320392f2f59
+2d2c4523456023456023456023766818b08062202d2cb0482b2d2c2045b0005458b040442045
+b04061441b2121592d2c45b1302f4523456160b0016069442d2c4b5158b02f2370b01423421b
+2121592d2c4b515820b0032545695358441b2121591b2121592d2c45b01443b0006063b00160
+69442d2cb02f45442d2c452320458a60442d2c45234560442d2c4b235158b90033ffe0b13420
+1bb3330034005944442d2cb0164358b00326458a586466b01f601b64b020606620581b21b040
+59b001615923586559b02923442310b029e01b2121212121592d2cb0024354584b53234b515a
+58381b2121591b21212121592d2cb0164358b004254564b020606620581b21b04059b0016123
+581b6559b0292344b00525b00825082058021b0359b0042510b005252046b0042523423cb004
+25b0072508b0072510b006252046b00425b0016023423c2058011b0059b0042510b00525b029
+e0b02920456544b0072510b00625b029e0b00525b00825082058021b0359b00525b003254348
+b00425b0072508b00625b00325b0016043481b2159212121212121212d2c02b00425202046b0
+04252342b0052508b003254548212121212d2c02b0032520b0042508b0022543482121212d2c
+452320451820b00050205823652359236820b040505821b04059235865598a60442d2c4b5323
+4b515a5820458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b515a58381b
+2121592d2cb000214b5458381b2121592d2cb002435458b0462b1b21212121592d2cb0024354
+58b0472b1b212121592d2cb002435458b0482b1b21212121592d2cb002435458b0492b1b2121
+21592d2c208a08234b538a4b515a5823381b2121592d2c00b0022549b000535820b04038111b
+21592d2c014623466023466123201020468a61b8ff80628ab140408a704560683a2d2c208a23
+49648a2353583c1b21592d2c4b52587d1b7a592d2cb012004b014b54422d2cb1020042b12301
+8851b1400188535a58b910000020885458b202010243604259b12401885158b9200000408854
+58b2020202436042b12401885458b2022002436042004b014b5258b2020802436042591bb940
+000080885458b202040243604259b94000008063b80100885458b202080243604259b9400001
+0063b80200885458b202100243604259b12601885158b94000020063b80400885458b2024002
+43604259b94000040063b80800885458b2028002436042595959595959b10002435458400a05
+40084009400c020d021bb10102435458b2054008ba010000090100b30c010d011bb180024352
+58b2054008b80180b109401bb2054008ba01800009014059b9400000808855b94000020063b8
+040088555a58b30c000d011bb30c000d0159595942424242422d2c451868234b515823204520
+64b04050587c59688a6059442d2cb00016b00225b0022501b001233e00b002233eb10102060c
+b00a236542b00b234201b001233f00b002233fb10102060cb006236542b0072342b00116012d
+2cb080b0024350b001b00243545b58212310b0201ac91b8a10ed592d2cb0592b2d2c8a10e52d
+00010000000200005f97514e5f0f3cf5021f080000000000c840f99a00000000cf7bfed5fba6
+fd930a6a07d700000008000000010000000000010000073efe4e00430ab4fba6fa7a0a6a0001
+0000000000000000000000000000000d060000cd04e300a8055600040556005d04e3002e0239
+00bb02390000047300a8055600a80556002e023900bd055600a805c700a8000000000000004c
+000000b00000015800000270000003c8000003f8000003f800000434000004b8000006000000
+06a40000077c0000082800010000000d01520054005c000600020010002f005c000002a40204
+0004000141210009013f000101390055013e000101390055014201400014001f01410140001f
+001f013b0033013a00550138003301390055004001070001001f01070001009f010440aa01c0
+fd01affd0100fd010a4ffb0120fb01f550281ff246281ff1462a1ff0462b1f5fef7fef020fef
+4fef5fef8fefafef050be5e41e1fe3e2461f0fe20140e246161fe1e0461fcfe0dfe0efe00340
+e0333646e046181feeedff1fed01e855ec48eb55ea320055e9e8e855e7480055e600ff1fdd3d
+df55df010355de3d0355dc03ff1f0fd51fd5020fd51fd50240ca181b46cfc201bdc03c1fc150
+261fbcbe281fffb90150b870b880b803b8ffc040ffb81232461fb73fb74fb76fb77fb79fb7af
+b70718b60170b2a0b2b0b2030fb20190b501b0b5010fb501080fb33fb3efb30380b090b002b0
+b0c0b0d0b0032faf3faf02a0adb0ad02c0add0ad022fac3fac029fab01c0aad0aa024fa98fa9
+022fa96fa9bfa9ffa9049c9b241f509b016f9601bf960196461d1f9594171f0f941f947f948f
+94ff94053091409102809101708f808f02908f01c08fd08f024f8c5f8c6f8c038646ff1f9f85
+018483311f74733f1f7350261f6f6e3c1f6e46351f1a01185519331855073303550603ff1f60
+50261f5f50261f5c46311f5b5a481f5a46311f1332125505010355043203556c03010c033c03
+4c036c037c0305ef51ff4064510240513538464051252846cf50014946201f4846351f474635
+1faf4601df46ef46028046011632155511010f5510320f55020100550100011f1f0f3f0f5f0f
+7f0f040f0f2f0f4f0f6f0f8f0fdf0fff0f073f0f7f0fef0f036f00014f00018016010501b801
+90b154532b2b4bb807ff524bb007505bb00188b02553b00188b040515ab00688b000555a5b58
+b101018e59858d8d00421d4bb0325358b0601d594bb0645358b0401d594bb0805358b0101db1
+1600425973747374752b2b2b2b2b017374752b2b2b00742b2b7373752b2b2b012b2b2b002b2b
+2b2b2b2b012b2b002b2b012b732b00747374757374732b012b747500732b7374017373740073
+7474737473015e73737473730073732b7373012b002b012b00732b74752b2b2b2b2b2b2b2b2b
+2b2b012b2b742b2b5e732b002b5e7374012b2b2b002b73735e73737301737373002b2b2b2b2b
+2b185e0000>
+] def
+/f-1-0 currentdict end definefont pop
+%%EndResource
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 0 4762 1203
+%%EndPageSetup
+q 0 0 4762 1203 rectclip
+1 0 0 -1 0 1203 cm q
+0.305882 0.435294 0.596078 rg
+3343.73 10.711 m 3326.793 13.18 3307.699 15.402 3297.887 21.449 c 3287.934
+ 28.629 3290.18 36.867 3292.492 38.832 c 3294.109 40.422 3298.875 42.934
+ 3299.426 46.52 c 3299.051 53.301 3270.855 50.512 3255.34 55.426 c 3248.902
+ 57.629 3243.965 62.211 3243.699 66.816 c 3244.168 73.789 3248.535 74.984
+ 3253.219 77.453 c 3264.656 83.316 3276.566 87.27 3286.039 93.418 c 3290.617
+ 95.984 3295.051 98.902 3301.688 102.234 c 3333.039 117.758 3371.008 130.91
+ 3381.789 136.312 c 3508.773 200.281 3640.422 264.254 3763.32 314.754 c 
+3831.301 386.93 3910.168 456.766 3969.223 527.359 c 3946.176 575.613 3924.559
+ 612.945 3897.066 660.316 c 3875.961 695.527 3860.914 718.512 3845.078 743.086
+ c 3816.77 787.762 3785.32 821.027 3761.18 866.367 c 3755.375 875.957 3752.625
+ 885.488 3752.328 895.031 c 3753.613 918.82 3801.086 949.34 3805.395 950.477
+ c 3819.391 953.766 3832.789 944.645 3844.312 935.789 c 3875.773 903.062
+ 3903.031 859.324 3942.812 821.273 c 3963.965 801.363 3983.012 782.316 4009.887
+ 757.949 c 4042.195 727.586 4065.188 702.324 4091.82 673.598 c 4108.535 
+657.922 4120.234 659.223 4121.953 658.855 c 4193.309 680.719 4250.883 712.484
+ 4293.578 751.238 c 4405.504 864.152 4485.582 976.426 4588.777 1078.074 
+c 4605.168 1094.926 4619.773 1105.051 4632.73 1118.266 c 4651.391 1142.262
+ l 4654.816 1146.43 4665.469 1156.457 4668.535 1148.523 c 4686.023 1160.5
+ 4693.273 1173.863 4703.438 1185.641 c 4713.336 1197.559 4717.746 1202.688
+ 4723.25 1202.223 c 4728.625 1200.957 4730.762 1190.043 4730.285 1183.047
+ c 4727.418 1161.488 4725.07 1155.113 4726.516 1153.676 c 4728.883 1152.648
+ 4736.551 1171.609 4759.762 1165.672 c 4765.039 1161.383 4756.293 1134.273
+ 4744 1067.984 c 4699.426 872.008 4637.398 675.41 4548.203 503.516 c 4539.172
+ 485.344 4528.855 470.23 4516.238 460.617 c 4488.039 434.039 4458.438 415.641
+ 4428.926 396.73 c 4413.434 385.852 4396.535 375.59 4382.676 363.996 c 4369.422
+ 352.094 4368.766 330.727 4374.066 312.961 c 4377.77 298.496 4385.754 277.953
+ 4387.297 271.555 c 4391.293 248.266 4389.66 245.648 4389.43 225.195 c 4388.988
+ 217.062 4387.879 212.855 4390.484 206.535 c 4394.258 202.602 4399.66 201.516
+ 4405.582 203.324 c 4413.57 207.34 4417.418 206.586 4418.242 204.445 c 4411.488
+ 179.484 4370.039 161.531 4348.203 166.996 c 4333.777 164.441 4315.582 166.543
+ 4302.48 169.953 c 4278.016 177.395 4259.891 184.824 4240.559 195.035 c 
+4223.984 205.664 4210.301 215.695 4187.004 213.465 c 4168.426 211.398 4158.68
+ 205.367 4149.766 196.402 c 4099.684 151.062 4065.785 90.91 4014.332 56.988
+ c 3780.102 0.566 3568.707 -11.492 3343.73 10.711 c h
+3579.664 61.125 m 3722.555 43.281 3869.695 40.352 3999.113 81.539 c 4037.711
+ 123.34 4063.203 168.012 4095.312 214.117 c 4109.617 240.516 4118.742 258.082
+ 4107.559 283.785 c 4069.113 343.789 4027.219 415.969 3991.285 484.223 c
+ 3993.379 514.504 3836.512 314.414 3792.176 288.668 c 3657.199 211.926 3645.324
+ 227.828 3442.434 106.246 c 3430.613 97.859 3419.438 84.195 3481.688 75.5
+ c 3513.941 70.152 3546.688 65.242 3579.664 61.125 c h
+4356.293 175.797 m 4361.727 175.176 4371.113 175.688 4382.57 183.578 c 
+4378.031 188.582 4379.562 194.051 4380.93 199.645 c 4368.387 194.281 4355.363
+ 206.562 4336.137 209.891 c 4352.84 203.883 4360.059 193.469 4352.246 176.566
+ c 4353.109 176.336 4354.48 176.004 4356.293 175.797 c h
+4319.512 188.051 m 4325.719 188.617 4323.547 188.32 4327.879 190.855 c 
+4322.16 201.566 4316.312 207.297 4305.895 206.586 c 4297.199 205.965 4294.203
+ 201.746 4288.301 195.332 c 4295.988 193.449 l 4303.73 210.109 4320.734 
+202.621 4321.109 193.824 c 4320.465 189.309 4319.512 188.051 4319.512 188.051
+ c h
+4249.414 222.734 m 4263.34 220.848 4281.578 242.562 4277.324 258.215 c 
+4303.887 274.281 4316.141 251.945 4330.656 239.754 c 4360.641 218.047 4369.234
+ 219.285 4379.984 219.613 c 4382.094 243.73 4379.664 269.086 4365.5 304.82
+ c 4346.379 401.875 4305.414 442.266 4263.375 486.484 c 4178.129 577.906
+ 4089.652 662.836 3989.613 739.312 c 3968.332 754.105 3951.793 762.883 3932.273
+ 755.82 c 3930.52 725.672 3938.902 698.273 3950.27 666.516 c 3973.297 612.461
+ 3996.742 561.617 4016.453 504.648 c 4067.617 383.102 4112.539 333.281 4158.863
+ 282.98 c 4183.215 261.613 4190.781 253.156 4198.781 252.27 c 4208.363 263.41
+ 4239.504 268.055 4242.336 263.543 c 4235.922 261.555 4235.172 258.699 4234.785
+ 253.43 c 4235.148 232.277 4241.602 223.793 4249.414 222.734 c h
+4393.387 435.266 m 4418.41 443.07 4466.48 473.914 4515.32 493.883 c 4623.484
+ 670.66 4656.152 904.32 4661.191 1029.406 c 4661.078 1069.164 4656.305 1062.82
+ 4643.137 1056 c 4498.242 960.715 4413.879 808.531 4304.039 706.004 c 4236.258
+ 666.219 4162.562 652.215 4143.688 632.547 c 4253.996 537.738 4338.379 459.234
+ 4393.387 435.266 c h
+3949.652 622.961 m 3954.016 622.605 3947.93 637.332 3945.402 643.309 c 
+3930.672 675.277 3923.738 711.812 3914.203 745.488 c 3907.891 764.602 3898.258
+ 771.586 3888.789 770.418 c 3877.973 768.285 3860.805 753.867 3868.598 738.207
+ c 3891.621 703.336 3910.348 662.09 3941.281 629.23 c 3945.578 624.875 3948.195
+ 623.082 3949.652 622.961 c h
+3983.707 758.523 m 3994.418 757.191 3939.504 805.996 3925.879 812.176 c
+ 3908.133 796.094 3947.695 777.059 3960.957 770.855 c 3973.984 762.465 3980.98
+ 758.867 3983.707 758.523 c h
+3835.918 781.219 m 3841.543 796.906 3855.684 803.105 3864.777 808.203 c
+ 3859.305 815.355 3855.527 820.055 3849.438 825.348 c 3838.367 819.352 3828.441
+ 815.473 3821.738 802.617 c 3826.59 793.426 3830.07 788.32 3835.918 781.219
+ c h
+3804.688 828.371 m 3810.48 836.691 3820.172 846.375 3829.348 850.52 c 3825.926
+ 855.684 3822.23 861.285 3817.062 865.57 c 3806.723 861.645 3796.043 851.516
+ 3791.695 845.125 c 3795.727 837.508 3801.113 830.762 3804.688 828.371 c
+ h
+3887.062 825.625 m 3893.656 838.336 3901.23 840.609 3906.133 843.582 c 
+3903.363 847.398 3901.34 851.676 3892.918 857.551 c 3888.41 856.641 3877.953
+ 847.969 3874.66 840.109 c 3879.844 832.293 3882.055 830.934 3887.062 825.625
+ c h
+3851.426 867.527 m 3855.723 875.969 3861.363 882.234 3869.895 885.254 c
+ 3866.477 892.301 3863.773 894.633 3858.688 898.137 c 3855.562 896.184 3848.027
+ 892.191 3840.055 881.488 c 3844.773 874.672 3847.051 872.477 3851.426 867.527
+ c h
+3767.102 888.582 m 3778.391 908.258 3799.156 919.305 3817.613 935.039 c
+ 3815.273 936.793 3815.008 942.23 3810.789 942.828 c 3793.531 934.027 3774.535
+ 920.598 3761.09 898.758 c 3763.551 894.031 3763.715 892.711 3767.102 888.582
+ c h
+3767.102 888.582 m f*
+4364.688 182.262 m 4364.754 181.164 4365.281 178.062 4367.141 178.605 c
+ 4369.168 179.988 4370.465 182.137 4371.031 185.625 c 4371.238 187.367 4371.254
+ 188.812 4368.719 186.855 c 4367.406 185.656 4366.934 185.422 4364.688 182.262
+ c h
+4364.688 182.262 m f*
+BT
+703.125 0 0 -703.125 -28.839109 1012.363769 Tm
+/f-0-0 1 Tf
+[(GR)7(O)3(M)-4(A)22(CS)]TJ
+281.25 0 0 -281.25 22.97874 379.641906 Tm
+/f-1-0 1 Tf
+[(F)54(AST)109(.  FLEXIBLE)-3(.  FREE.)]TJ
+ET
+Q Q
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_blue.png b/docs/reference-manual/plots/GMX_logos/gmx_logo_blue.png
new file mode 100644 (file)
index 0000000..27333e7
Binary files /dev/null and b/docs/reference-manual/plots/GMX_logos/gmx_logo_blue.png differ
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_blue.svg b/docs/reference-manual/plots/GMX_logos/gmx_logo_blue.svg
new file mode 100644 (file)
index 0000000..cb70bdc
--- /dev/null
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100%"
+   height="100%"
+   viewBox="0 0 6349 1603"
+   version="1.1"
+   xml:space="preserve"
+   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
+   id="svg923"
+   sodipodi:docname="Gromacs Logo [Blue].svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   inkscape:export-filename="/home/cathrine/Pictures/svg_files/gromacs_logo1.png"
+   inkscape:export-xdpi="300"
+   inkscape:export-ydpi="300"><metadata
+   id="metadata929"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+   id="defs927">
+        
+    
+            
+            
+            
+        
+                
+            
+                
+
+
+            
+
+
+
+
+
+<inkscape:path-effect
+   is_visible="true"
+   id="path-effect1061"
+   effect="spiro" /><clipPath
+   id="_clip1-3"><rect
+     x="0"
+     y="0"
+     width="291.98801"
+     height="550.58301"
+     id="rect892-6" /></clipPath></defs><sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="1853"
+   inkscape:window-height="1145"
+   id="namedview925"
+   showgrid="false"
+   units="mm"
+   inkscape:zoom="0.1767767"
+   inkscape:cx="3347.127"
+   inkscape:cy="1248.502"
+   inkscape:window-x="67"
+   inkscape:window-y="27"
+   inkscape:window-maximized="1"
+   inkscape:current-layer="g1133"
+   viewbox-width="6349" />
+    
+
+<g
+   id="g1835"
+   inkscape:export-filename="/home/cathrine/Pictures/svg_files/gromacs_logo3.png"
+   inkscape:export-xdpi="300"
+   inkscape:export-ydpi="300"
+   transform="translate(107.48023,33.941125)"><g
+     transform="matrix(3.7513483,-0.46066696,0.46066696,3.7513483,4198.3338,3197.8407)"
+     id="layer1"
+     style="fill:none;fill-opacity:1;stroke:none"><g
+       style="clip-rule:evenodd;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-linejoin:round;stroke-miterlimit:2"
+       id="g903-7"
+       transform="matrix(0.82454635,-0.51053871,0.49150293,0.84357369,250.14362,56.767957)"><g
+         style="fill:none;fill-opacity:1;stroke:none"
+         id="g901-5"
+         transform="translate(-145.994,-275.291)"><clipPath
+           id="clipPath1706"><rect
+             id="rect1704"
+             height="550.58301"
+             width="291.98801"
+             y="0"
+             x="0" /></clipPath><g
+           style="fill:none;fill-opacity:1;stroke:none"
+           id="g899-3"
+           clip-path="url(#_clip1-3)"><g
+             style="fill:none;fill-opacity:1;stroke:none"
+             id="g897-5"
+             transform="matrix(1,0,0,-1,0,555.789)" /></g></g></g></g><g
+     id="g1146"
+     transform="translate(-208,-112)"><g
+       transform="translate(-24.46945,-27.842525)"
+       id="g1133"><g
+         id="g862"
+         transform="translate(414.87524,-2396.4028)"><g
+           transform="matrix(1.1914369,0,0,1.1914369,-1160.5458,-865.93629)"
+           id="g1066"><path
+             inkscape:connector-curvature="0"
+             style="opacity:1;fill:#4e6f98;fill-opacity:1;stroke:none;stroke-width:0.24566934;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+             d="m 4472.724,2839.028 c -18.9578,2.7624 -40.3248,5.2475 -51.3026,12.0164 -11.1396,8.0334 -8.6273,17.2529 -6.0392,19.4534 1.809,1.7786 7.1445,4.5875 7.7607,8.6026 -0.4228,7.5868 -31.9734,4.4681 -49.3367,9.9666 -7.2041,2.4668 -12.7316,7.5949 -13.03,12.7457 0.5245,7.8067 5.4123,9.1408 10.6558,11.9072 12.7997,6.5604 26.1289,10.9848 36.7265,17.8638 5.1267,2.8708 10.0857,6.1364 17.5131,9.8687 35.0857,17.3692 77.5793,32.0888 89.6427,38.1355 142.1092,71.5868 289.4364,143.1806 426.9703,199.6938 76.0785,80.7698 164.3367,158.9248 230.4266,237.9267 -25.7919,53.9994 -49.985,95.7775 -80.7537,148.7919 -23.6163,39.4046 -40.4556,65.1229 -58.1793,92.6255 -31.679,49.9972 -66.8743,87.2218 -93.8903,137.9627 -6.4954,10.7344 -9.5722,21.3976 -9.9044,32.0771 1.4363,26.6251 54.5642,60.7762 59.3845,62.0488 15.6641,3.6803 30.6604,-6.5234 43.5538,-16.4369 35.2082,-36.6242 65.7142,-85.5701 110.2334,-128.1511 23.6708,-22.2813 44.9846,-43.5978 75.0608,-70.8665 36.1568,-33.9801 61.8854,-62.2483 91.6934,-94.3994 18.7019,-17.5404 31.7963,-16.0871 33.719,-16.4985 79.854,24.4679 144.2844,60.0159 192.0664,103.3863 125.2565,126.3629 214.8693,252.0078 330.3562,365.7604 18.3417,18.8579 34.6897,30.1905 49.189,44.9806 l 20.8798,26.8525 c 3.8362,4.6637 15.7584,15.8848 19.1887,7.0084 19.5715,13.4021 27.6858,28.3576 39.057,41.5375 11.0806,13.3361 16.0149,19.075 22.175,18.5548 6.0156,-1.414 8.406,-13.6293 7.8728,-21.4595 -3.2094,-24.1228 -5.8358,-31.2602 -4.2192,-32.8675 2.6505,-1.1501 11.231,20.0703 37.2069,13.4264 5.9021,-4.801 -3.8849,-35.1376 -17.6422,-109.3249 -49.8812,-219.313 -119.2973,-439.3267 -219.1139,-631.6945 -10.1075,-20.3354 -21.6503,-37.2484 -35.7724,-48.0076 -31.5595,-29.743 -64.6838,-50.3313 -97.71,-71.4928 -17.3384,-12.1743 -36.2474,-23.6602 -51.7595,-36.6363 -14.8342,-13.3173 -15.5681,-37.2282 -9.6343,-57.1109 4.1461,-16.1885 13.0799,-39.1769 14.8082,-46.3379 4.4695,-26.0616 2.6444,-28.9902 2.3838,-51.8805 -0.4952,-9.0998 -1.734,-13.8082 1.1824,-20.8818 4.2196,-4.4031 10.2684,-5.6178 16.8947,-3.5958 8.9415,4.4959 13.2466,3.6501 14.1668,1.2553 -7.5576,-27.932 -53.942,-48.0228 -78.3797,-41.9076 -16.1437,-2.8597 -36.5044,-0.5062 -51.168,3.3062 -27.38,8.3304 -47.6638,16.6447 -69.2986,28.0698 -18.5469,11.8969 -33.859,23.1233 -59.9307,20.6264 -20.7896,-2.3142 -31.6988,-9.0623 -41.6715,-19.0965 -56.0504,-50.7396 -93.9825,-118.0556 -151.5659,-156.0158 -262.1276,-63.1428 -498.6955,-76.6351 -750.4662,-51.7887 z m 264.0305,56.417 c 159.9113,-19.9667 324.5729,-23.2472 469.4073,22.8454 43.1939,46.7812 71.7193,96.7697 107.654,148.3676 16.0067,29.5418 26.2196,49.2028 13.7029,77.9678 -43.0219,67.1498 -89.9084,147.925 -130.1207,224.3075 2.3444,33.8873 -173.2045,-190.0312 -222.8195,-218.8444 -151.0521,-85.8808 -164.3419,-68.086 -391.3982,-204.1467 -13.2274,-9.3868 -25.7352,-24.6771 43.9285,-34.4096 36.0945,-5.9832 72.7431,-11.4799 109.6457,-16.0876 z m 869.1232,128.3286 c 6.0803,-0.6956 16.5846,-0.1211 29.4077,8.7091 -5.0815,5.5993 -3.3648,11.7192 -1.8377,17.9811 -14.0341,-6.0056 -28.6087,7.7408 -50.1267,11.4647 18.6917,-6.7253 26.7702,-18.3786 18.0302,-37.2941 0.9662,-0.2556 2.4998,-0.629 4.5265,-0.8608 z m -41.1628,13.7131 c 6.9488,0.6361 4.5155,0.3006 9.3643,3.1379 -6.3991,11.9879 -12.9412,18.4014 -24.6018,17.6064 -9.7285,-0.6954 -13.0845,-5.4165 -19.6897,-12.5944 l 8.6041,-2.1074 c 8.666,18.6462 27.6935,10.266 28.1142,0.4182 -0.721,-5.051 -1.7911,-6.4607 -1.7911,-6.4607 z m -78.4439,38.8134 c 15.5839,-2.1115 35.9956,22.192 31.2327,39.708 29.7288,17.9783 43.4401,-7.0169 59.6827,-20.6609 33.5569,-24.2906 43.1726,-22.9036 55.2037,-22.5371 2.3616,26.9868 -0.3589,55.3656 -16.2096,95.3546 -21.3966,108.611 -67.2419,153.814 -114.2861,203.297 -95.4006,102.3124 -194.4115,197.3584 -306.3666,282.9392 -23.814,16.5585 -42.3253,26.3784 -64.1697,18.4767 -1.9597,-33.7382 7.4207,-64.4014 20.1406,-99.9422 25.769,-60.4901 52.0083,-117.3891 74.0673,-181.1438 57.2573,-136.022 107.5282,-191.7775 159.3703,-248.0693 27.2496,-23.9096 35.7193,-33.3759 44.6733,-34.3692 10.7218,12.4703 45.5714,17.6662 48.7409,12.6162 -7.1769,-2.2219 -8.0167,-5.4195 -8.452,-11.316 0.4076,-23.6723 7.6303,-33.1687 16.3725,-34.3532 z m 161.1188,237.8463 c 28.0024,8.7342 81.7988,43.2495 136.4539,65.5957 121.0474,197.8343 157.6045,459.3213 163.2438,599.3057 -0.1232,44.4924 -5.4683,37.3925 -20.2029,29.7605 -162.1516,-106.6331 -256.5636,-276.941 -379.4814,-391.6809 -75.8563,-44.5235 -158.3274,-60.1941 -179.4496,-82.2076 123.4449,-106.0988 217.8761,-193.9501 279.4362,-220.7734 z m -496.583,210.049 c 4.885,-0.4003 -1.9247,16.0829 -4.7542,22.7708 -16.4841,35.7763 -24.246,76.6615 -34.9148,114.3483 -7.0672,21.3877 -17.8468,29.2058 -28.4427,27.8974 -12.1031,-2.3877 -31.3177,-18.522 -22.597,-36.0457 25.7669,-39.0258 46.7247,-85.1813 81.3436,-121.9547 4.8078,-4.8737 7.7367,-6.8826 9.3651,-7.0161 z m 38.113,151.7084 c 11.9834,-1.4948 -49.4683,53.1241 -64.7175,60.0388 -19.8565,-17.9957 24.4173,-39.2974 39.2585,-46.2391 14.5789,-9.3925 22.4044,-13.4187 25.459,-13.7997 z m -165.3916,25.3968 c 6.2934,17.5559 22.1194,24.4918 32.2983,30.1967 -6.1257,8.0037 -10.354,13.264 -17.1683,19.1868 -12.387,-6.7117 -23.4968,-11.0497 -30.9995,-25.4367 5.4321,-10.2873 9.3252,-15.998 15.8695,-23.9468 z m -34.948,52.7684 c 6.4811,9.3107 17.3246,20.1472 27.5938,24.7844 -3.8276,5.7796 -7.9643,12.0472 -13.7468,16.844 -11.5716,-4.3951 -23.5249,-15.7268 -28.3888,-22.8783 4.5122,-8.5268 10.5423,-16.0767 14.5418,-18.7501 z m 92.1855,-3.0753 c 7.3777,14.2244 15.8534,16.7713 21.3392,20.0977 -3.0992,4.2721 -5.3618,9.0567 -14.7873,15.6298 -5.0433,-1.0176 -16.7497,-10.7206 -20.4317,-19.5184 5.8006,-8.7454 8.2719,-10.266 13.8798,-16.2091 z m -39.8805,46.894 c 4.8069,9.4466 11.117,16.4588 20.6656,19.8361 -3.8242,7.8868 -6.8513,10.4991 -12.5394,14.4171 -3.4977,-2.1856 -11.9327,-6.6504 -20.8518,-18.6286 5.2785,-7.6273 7.8258,-10.0848 12.7256,-15.6246 z m -94.3688,23.5625 c 12.6327,22.0171 35.8732,34.3814 56.5276,51.9881 -2.6202,1.9653 -2.9157,8.0504 -7.6367,8.7204 -19.313,-9.8515 -40.5709,-24.8798 -55.6173,-49.3193 2.7544,-5.2895 2.9364,-6.7685 6.7264,-11.3892 z"
+             id="rect1188" /><path
+             inkscape:connector-curvature="0"
+             style="fill:#4e6f98;fill-opacity:1;stroke:none;stroke-width:0.29999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 5615.2719,3031.0101 c 0.075,-1.2289 0.6651,-4.6992 2.7475,-4.0926 2.2666,1.5467 3.7201,3.9506 4.3543,7.8539 0.2282,1.9516 0.2476,3.5697 -2.5883,1.3807 -1.4708,-1.3462 -2.0008,-1.608 -4.5135,-5.142 z"
+             id="path1103-2" /></g><g
+           id="g1073"><text
+   x="-328.33817"
+   y="3852.1226"
+   style="font-weight:700;font-size:937.5px;font-family:KannadaMN-Bold, 'Kannada MN';fill:#4e6f98;fill-opacity:1;stroke-width:1.5625"
+   id="text907"><tspan
+     style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold'"
+     id="tspan962"
+     dx="0 0.34 -6.75 -2.0699999 2.4099996 -21.060011">GROMACS</tspan></text>
+
+
+<text
+   x="-255.0177"
+   y="3008.4934"
+   style="font-size:375px;font-family:KannadaMN, 'Kannada MN';fill:#4e6f98;fill-opacity:1;stroke-width:1.5625"
+   id="text915"><tspan
+     id="tspan840"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';word-spacing:-0.01px;fill:#4e6f98;fill-opacity:1"
+     dx="-4.2299995">FAST.  FLEXIBLE.  FREE.</tspan><tspan
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';word-spacing:-0.01px;fill:#4e6f98;fill-opacity:1;stroke-width:1.5625"
+     x="-81.250793"
+     y="3008.4934"
+     id="tspan911" /></text>
+
+
+</g></g></g></g><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.03704604;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 4039.5085,-1228.8879 c 14.7955,-26.0805 30.1415,-54.98 41.768,-78.6574 6.3295,-12.8899 7.2866,-14.928 7.1144,-15.1498 -0.4357,-0.5613 -6.5497,-7.7703 -8.9122,-10.5083 -19.9386,-23.1076 -43.0918,-47.9255 -72.0024,-77.1792 l -5.1867,-5.2482 0.4811,-0.039 c 0.59,-0.048 -0.4107,-1.009 9.6881,9.3014 34.1045,34.8188 56.8517,58.9577 68.2493,72.4245 3.7434,4.423 9.4939,11.9094 9.3811,12.2129 -0.078,0.2092 -14.7241,28.4968 -19.731,38.108 -8.7207,16.7399 -16.8182,31.786 -26.3009,48.8699 l -3.9583,7.1313 h -0.6543 -0.6542 z"
+     id="path1020"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d=""
+     id="path1022"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d=""
+     id="path1024"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 4089.8968,-1322.132 c -0.1106,-0.1908 -0.1903,-0.3578 -0.1771,-0.371 0.034,-0.034 0.471,0.5714 0.471,0.6538 0,0.1471 -0.1009,0.05 -0.2939,-0.2828 z"
+     id="path1028"
+     inkscape:connector-curvature="0" /></g>
+<flowRoot
+   xml:space="preserve"
+   id="flowRoot27"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;line-height:1.25;font-family:KannadaMN-Bold, 'Kannada MN';-inkscape-font-specification:'KannadaMN-Bold, Kannada MN';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
+     id="flowRegion29"><rect
+       id="rect31"
+       width="2827.7173"
+       height="480.60019"
+       x="435.89319"
+       y="-1055.199" /></flowRegion><flowPara
+     id="flowPara33" /></flowRoot><flowRoot
+   xml:space="preserve"
+   id="flowRoot1713"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:KannadaMN-Bold, 'Kannada MN';-inkscape-font-specification:'KannadaMN-Bold, Kannada MN';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
+     id="flowRegion1715"><rect
+       id="rect1717"
+       width="829.83124"
+       height="284.51358"
+       x="1311.9237"
+       y="1882.0675" /></flowRegion><flowPara
+     id="flowPara1719" /></flowRoot></svg>
\ No newline at end of file
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.eps b/docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.eps
new file mode 100644 (file)
index 0000000..d5adaa2
--- /dev/null
@@ -0,0 +1,575 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.15.10 (http://cairographics.org)
+%%CreationDate: Tue Dec 22 10:49:33 2020
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 0 0 4762 1203
+%%EndComments
+%%BeginProlog
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_data_source {
+  CairoDataIndex CairoData length lt
+    { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
+    { () } ifelse
+} def
+/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
+/cairo_image { image cairo_flush_ascii85_file } def
+/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
+%%EndProlog
+%%BeginSetup
+%%BeginResource: font LiberationSans-Bold
+11 dict begin
+/FontType 42 def
+/FontName /LiberationSans-Bold def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 65 /A put
+Encoding 67 /C put
+Encoding 71 /G put
+Encoding 77 /M put
+Encoding 79 /O put
+Encoding 82 /R put
+Encoding 83 /S put
+/CharStrings 8 dict dup begin
+/.notdef 0 def
+/G 1 def
+/R 2 def
+/O 3 def
+/M 4 def
+/A 5 def
+/C 6 def
+/S 7 def
+end readonly def
+/sfnts [
+<000100000009008000030010637674206d5f6ba1000008a0000002886670676d7e61b6110000
+0b28000007b4676c7966bf4bbc950000009c0000080468656164ff8cb2c4000012dc00000036
+686865610e18037b0000131400000024686d74782fc7034900001338000000206c6f63610000
+1f1c00001358000000246d617870042005340000137c00000020707265708aa104b90000139c
+00000490000200cd00000532058100030007001f400d06020503020309080503040003003fcd
+2fcd11120139391133113331301321112113112111cd0465fb9b4c03cd0581fa7f0535fb1704
+e900000000010054ffec05ba0596001c004a40291a0e141304070e130507041e1d06055f5906
+060b1111175f59141411040b005f590b13301e01201e015d5d003f2b00183f332f2b11120039
+182f2b111201173911331133113331302532363735213521110604232000111000212013052e
+01232206151412032673d83bfea8026670fe99c5fea8fe8e0174015d01f087fef02cbc7fd0d8
+dfd34334c3dafdfa7382017d015e015c0173fe91526b6efcebeffefb000200890000059d0581
+000d0015005d4033010c0c1209120303040e09000d0d09040317160c120202125f5902020005
+05115f590503040012701701a017013017012017015d5d5d71003f323f2b11120039182f2b11
+1200391112011739113311331133113311123911333130210121112111213204151406070901
+342901112132360451feb9fea6fed902c0fc0112a88f017dfe91fefcfe8601827c800217fde9
+0581d9cb94d722fdb003d1cbfe607000000000020054ffec05e30596000c00180048402c1307
+0d000700191a0a105f590a0404165f590413a01a01801a01701a01601a01401a01301a01f01a
+01201a015d5d717171717171003f2b00183f2b11120139391133113331300114020423200011
+100021200001340223220215141233321205e3aefebcd8feb4fe870178014f014f0179fed3d8
+c3c6d8ddbfc6d702c7dcfeb2b1018701540153017cfe80feb1e40103feffe6e8fef501040000
+000100890000062105810017016d40ff150017100d0e170e1918040a07131713271303080a18
+0a280a03090a13150f030e0800128b19016b19014b19013b19011b1901fb1901ef1901c41901
+ab19019f19018b19017419015b19014f19013419010b190167ff1901e41901cb1901bb1901af
+19019419017b19016f19014419012b19011f19010b1901f41901db1901cf1901bb19018b1901
+6b19014b19013b19011b1901fb1901cb1901ab19018b19017b19015b19013b19012f19010419
+0137eb1901cb1901b419019b19017419014b19012419010b1901fb1901d41901bb1901af1901
+8419016b19015f1901024019013f19011f1901f01901e01901cf1901a019017f19014f19013f
+1901201901b3001901075e5d5d5d5d5d5d5d5d5d7171715f7171717171717172727272727272
+725e5d5d5d5d5d5d5d5d5d7171717171717171717272727272727272727272725e5d5d5d5d5d
+5d5d5d5d5d5d7171717171003f32323f3339395e5d5d11331112013939113333113333313021
+11343637020703230b01161511211121131f0137012111051b01094722fed2fe6b0cfefa018b
+fc16303f0103018903561d3adcfef36afcee03120177e84bfcaa0581fcec4cbde2033bfa7f00
+000200330000059105810007000f020740ff0d01000c02080300070304060508040807031011
+070c025f590d08050c0c06050304001286110174110164110153110143110134110125110116
+1101021101f31101e41101d41101c51101b61101a31101931101841101751101661101541101
+45110134110124110115110104110168f51101e51101d41101c51101b3110100a01101921101
+841101741101621101501101421101321101241101161101021101f01101e21101d41101c411
+01b21101a41101901101821101741101621101521101441101361101241101101101021101f4
+1101e41101d61101c41101b21101a21101941101861101761101641101521101441101341101
+26110114110106406f110138f21101e41101d61101c21101b41101a611018411017611016411
+0154110146110126110112110101001101f41101c41101b01101a01101941101741101641101
+501101441101341101141101e41101c41101b411019411018411017011016411014411011011
+0102001101085e5d5f5d5d5d5d5d5d5d5d5d7171717171717171717171725f72727272727272
+7272727272725e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d717171717171717171717171717171
+7172727272727272727272725f72727272725e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d717171
+717171717171003f323f33392f1239332b00182f111201173911333311331133111239391139
+393130210321032101210901070e0103210327046d7dfde77dfed90202015c0200fd52060a1c
+9e01958b2b0168fe980581fa7f04a816245cfe3401958800000000010054ffec058f05960018
+005240321609100f0203090f03031a190c135f5910100c040002100202000240028002c002d0
+02050b0302020606005f590613301a015d003f2b110033182f5f5e5d713f332f2b1112011739
+113311331133313025201305060423200011100021320417052e01232206151412031b010b68
+010153febfe0feacfe8d01660154f801383ffefc21c183c8cfd5d4010c61ccc70181015a015b
+0174c7c1476a7df8eff3ff000001003bffec05060596002a0052402f0c001d1c221607060616
+1c00042c2b0c22031919205f591d1d1904030a5f591007200730070330074007020707031300
+3f332f5d712b00183f332f2b1112003939111201173911331133113311333130011404212024
+27251e01332035342e01272e0435342421200417052e01232015141e01171e030506fecdfed7
+fef1fecc2c011d1da89501354781b79e7c644627011f01120106010726fee216877efef43970
+abcbaf66360196cfdbc0c32f7065bc3c4e3425252d3d56744bbfcba4bd275b5ca8374631252b
+4961870005cc05cc007d058100150079058100150000000000000000000000000000043a0014
+00770000ffec00000000ffec00000000ffec0000fe57fff70000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000800000000000119012500f500eb
+0000000000000000000000c100d300ba00b000cf000000000000000000000000012701290106
+0000011200e400f400c60000000000000000000000000000000000000000000000000119011f
+014c0000000000df00d100c500b5000000000000000000000000000000000000000000000102
+00a901fd00d80119008000b701fd00000000013f00db015d012500aa00800075008d01fc0179
+012100a001100000000001310119010e0104000000000000000000000000000000000000013d
+01ff00e00106009400e00094014400e005730319000000d802c5009c038102cd00cb00f4004e
+028d000000ff00d700cc01300145007300b400a60000000000730080008d0000000000000000
+00000000030000a200980083008d000000000000000005aefebc0581fd300011fff600b600bc
+00c60000007f008a0060000000000000000000f001ee01900000021901080115000000000000
+00be00000000000000000748036a02b60202fd930000009100670091006101d90000028d0341
+000000000000000000000000000000aafe6ffe6801050093009800e20151008f00be00aefeb9
+fea4005e00af02d5005500f200a604150601000003e1001002fa000ffed401eafff300b80000
+00000363000bfd0ffff500000000000006810477001504d90000ffecffc5fe7f007500cd00f2
+010200d5011940475b5a59585554535251504f4e4d4c4b4a494847464544434241403f3e3d3c
+3b3a393837363531302f2e2d2c28272625242322211f181411100f0e0d0b0a09080706050403
+0201002c20b0016045b003252011466123452361482d2c20451868442d2c45234660b0206120
+b04660b004262348482d2c4523462361b0206020b02661b02061b004262348482d2c45234660
+b0406120b06660b004262348482d2c4523462361b0406020b02661b04061b004262348482d2c
+0110203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0ed51582320b04d
+44235920b0042651582320b00d44235921212d2c20204518684420b001602045b04676688a45
+60442d2c01b10b0a432343650a2d2c00b10a0b4323430b2d2c00b0282370b101283e01b02823
+70b10228453ab10200080d2d2c2045b00325456164b050515845441b2121592d2c49b00e2344
+2d2c2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb810
+0062602b0c642364615c58b00361592d2c8a03458a8a87b0112bb0292344b0297ae4182d2c45
+65b02c234445b02b23442d2c4b525845441b2121592d2c4b515845441b2121592d2c01b00525
+1023208af500b0016023edec2d2c01b005251023208af500b0016123edec2d2c01b0062510f5
+00edec2d2cb00243b001525821212121211b462346608a8a462320468a608a61b8ff80622320
+10238ab10c0c8a70456020b0005058b00161b8ffba8b1bb0468c59b0106068013a592d2c2045
+b0032546524bb013515b58b0022546206861b00325b003253f2321381b2111592d2c2045b003
+25465058b0022546206861b00325b003253f2321381b2111592d2c00b00743b006430b2d2c21
+210c6423648bb84000622d2c21b08051580c6423648bb82000621bb200402f2b59b002602d2c
+21b0c051580c6423648bb81555621bb200802f2b59b002602d2c0c6423648bb8400062602321
+2d2c4b53588ab004254964234569b0408b61b08062b020616ab00e23442310b00ef61b21238a
+121120392f592d2c4b535820b0032549646920b00526b0062549642361b08062b020616ab00e
+2344b0042610b00ef68a10b00e2344b00ef6b00e2344b00eed1b8ab00426111220392320392f
+2f592d2c4523456023456023456023766818b08062202d2cb0482b2d2c2045b0005458b04044
+2045b04061441b2121592d2c45b1302f4523456160b0016069442d2c4b5158b02f2370b01423
+421b2121592d2c4b515820b0032545695358441b2121591b2121592d2c45b01443b0006063b0
+016069442d2cb02f45442d2c452320458a60442d2c45234560442d2c4b235158b90033ffe0b1
+34201bb3330034005944442d2cb0164358b00326458a586466b01f601b64b020606620581b21
+b04059b001615923586559b02923442310b029e01b2121212121592d2cb0024354584b53234b
+515a58381b2121591b21212121592d2cb0164358b004254564b020606620581b21b04059b001
+6123581b6559b0292344b00525b00825082058021b0359b0042510b005252046b0042523423c
+b00425b0072508b0072510b006252046b00425b0016023423c2058011b0059b0042510b00525
+b029e0b02920456544b0072510b00625b029e0b00525b00825082058021b0359b00525b00325
+4348b00425b0072508b00625b00325b0016043481b2159212121212121212d2c02b004252020
+46b004252342b0052508b003254548212121212d2c02b0032520b0042508b002254348212121
+2d2c452320451820b00050205823652359236820b040505821b04059235865598a60442d2c4b
+53234b515a5820458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b515a58
+381b2121592d2cb000214b5458381b2121592d2cb002435458b0462b1b21212121592d2cb002
+435458b0472b1b212121592d2cb002435458b0482b1b21212121592d2cb002435458b0492b1b
+212121592d2c208a08234b538a4b515a5823381b2121592d2c00b0022549b000535820b04038
+111b21592d2c014623466023466123201020468a61b8ff80628ab140408a704560683a2d2c20
+8a2349648a2353583c1b21592d2c4b52587d1b7a592d2cb012004b014b54422d2cb1020042b1
+23018851b1400188535a58b910000020885458b202010243604259b12401885158b920000040
+885458b2020202436042b12401885458b2022002436042004b014b5258b2020802436042591b
+b940000080885458b202040243604259b94000008063b80100885458b202080243604259b940
+00010063b80200885458b202100243604259b12601885158b94000020063b80400885458b202
+400243604259b94000040063b80800885458b2028002436042595959595959b1000243545840
+0a0540084009400c020d021bb10102435458b2054008ba010000090100b30c010d011bb18002
+435258b2054008b80180b109401bb2054008ba01800009014059b9400000808855b940000200
+63b8040088555a58b30c000d011bb30c000d0159595942424242422d2c451868234b51582320
+452064b04050587c59688a6059442d2cb00016b00225b0022501b001233e00b002233eb10102
+060cb00a236542b00b234201b001233f00b002233fb10102060cb006236542b0072342b00116
+012d2cb080b0024350b001b00243545b58212310b0201ac91b8a10ed592d2cb0592b2d2c8a10
+e52d00010000000200000e5dbc7f5f0f3cf5021f080000000000c849682600000000cf7c005f
+fc25fcfd0a6f084400010008000000010000000000010000073efe4e00430aaafc25fa7a0a6f
+000100000000000000000000000000000008060000cd0639005405c700890639005406aa0089
+05c7003305c700540556003b000000000000004c000000fc000001b00000025c000004240000
+0678000007280000080400010000000801520054005c000600020010002f005c0000034d0354
+000400014155013f000101390055013e000101390055014201400014001f01410140001f001f
+013b0033013a0055013800330139005500a4013900f4013900020132003d0131005501310001
+012f00550130003d012f0055012c012900ff001f01290001012a00550128003d012700550127
+0001012a00550126003d0125005501250001012a00550123012200ff001f01220001012a0055
+012b003d012a0055005001070001002f0107000100af0104405001d0fd01bffd0110fd016ffb
+0140fb0180f590f5a0f503f1f0351f2ff09ff0025fef012fef5fef6fef9fefdfef05e6e4201f
+e5e43d1fe2e0271fe1e03d1fdf3ddd55de3d035500dd30dd02dd0103552f410b011e00010010
+011e0020011e0040011e0003ffc0011e4028191c46dc03ff1f00db01da043c1fd4d21c1fd3d2
+261f60d190d1c0d10360d190d1b0d1c0d1e0d105b8ffc0b3d1191d46b8ffc0b4d10a0d460fb8
+0116400f01bfbe261f40bb29414640bb222746b801214026b63d1f00b8016fb801b8b70a1f00
+b70100b720b740b760b770b70540b760b790b7d0b7f0b705b80120400d483d1f00b560b502a0
+b5d0b502b8ffc0400eb50b0e460fb25fb202b1033c1f2f410b0119003f0119004f0119000300
+8f011900010040011940282629461faf2faf3faf9faf040faf0140af0e164600ad70ad80ad03
+e0adf0ad02abaa351faa50261fb9011b011ab23c1f00b8011ab6010fa9010fa801bc01170113
+003c001f0115407e503c1f9e9b271f9d9b271f9c9b271f809b019846281f9f97af9702964635
+1f0f941f94029390261f9291261f0f8f1f8f6f8f7f8f8f8f058e8c261f4f8d010f8c01408c0b
+0f460f891f890286850f1f5f850136824682027650261f7550261f7450261f7350261f297001
+1b7001037001f47001d670e67002687001597001b8fff0407d700a0d466f6e481f6e46321f1a
+01185519331855073303550603ff1f6150261f605f321f5f50261f5e5a481f5c46271f5b5a78
+1f5a46311f1332125505010355043203556f03010f033f034f036f037f03055f53014053282c
+4640531e224640531318466b527b528b5203514f1c1f504f1c1f194f294f02594f694f02b801
+12402d46251f4946191f4846211f4746351ff846019846011c481b551632155511010f551032
+0f55020100550100ff1fb80111b21b091fb80110402d1b091f1f0f3f0f5f0f7f0f040f0f2f0f
+4f0f6f0f8f0fdf0fff0f073f0f7f0fef0f036f00014f00018016010501b80190b154532b2b4b
+b807ff524bb007505bb00188b02553b00188b040515ab00688b000555a5b58b101018e59858d
+8d00421d4bb0325358b0601d594bb0645358b0401d594bb0805358b0101db116004259737473
+74752b2b2b2b2b2b2b2b0173742b2b2b2b0073742b2b732b2b2b7373752b2b2b012b2b2b002b
+2b2b2b2b2b2b2b012b2b2b73737373747474002b2b2b2b0173732b73002b73732b732b2b7301
+2b732b00732b2b2b2b2b7373732b012b2b0073742b73742b73742b73012b73742b007374752b
+73742b2b2b012b00732b2b7374012b2b002b732b2b73752b732b2b012b2b002b2b737401732b
+0073737373737301737373002b2b2b2b2b2b2b2b2b2b2b2b732b2b2b2b2b2b1800>
+] def
+/f-0-0 currentdict end definefont pop
+%%EndResource
+%%BeginResource: font LiberationSans
+11 dict begin
+/FontType 42 def
+/FontName /LiberationSans def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 32 /space put
+Encoding 46 /period put
+Encoding 65 /A put
+Encoding 66 /B put
+Encoding 69 /E put
+Encoding 70 /F put
+Encoding 73 /I put
+Encoding 76 /L put
+Encoding 82 /R put
+Encoding 83 /S put
+Encoding 84 /T put
+Encoding 88 /X put
+/CharStrings 13 dict dup begin
+/.notdef 0 def
+/F 1 def
+/A 2 def
+/S 3 def
+/T 4 def
+/period 5 def
+/space 6 def
+/L 7 def
+/E 8 def
+/X 9 def
+/I 10 def
+/B 11 def
+/R 12 def
+end readonly def
+/sfnts [
+<000100000009008000030010637674204ada4bfa000008c4000002886670676d7e61b6110000
+0b4c000007b4676c79663c4a269c0000009c0000082868656164feff42d70000130000000036
+686865610d94038a0000133800000024686d74783b59064a0000135c000000346c6f63610000
+35b000001390000000386d617870037c03e4000013c80000002070726570fdae4749000013e8
+00000343000200cd00000532058100030007001f400d02060503060309080503040003003fcd
+2fcd11120139391133113331301321112113112111cd0465fb9b4c03cd0581fa7f0535fb1704
+e9000000000100a800000491058100090036401d01050506080206030a0b01045f5901010507
+07005f5907030512200b015d003f3f2b11120039182f2b111201173911331133313001112115
+21112311211501670312fceebf03e904e5fdf49efdc505819c00000000020004000005520581
+00070010005b40360d01000c02030605080003040408070312110c025f590c0c080503040012
+b01201501201f01201c012019012016012013012012f12015d5d5d5d5d5d7171003f323f3339
+2f2b111201173911333211333312393912393931302103210323013309010706070321032627
+048fa1fd7ea2c6023fd90236fd5b091931b4020fb51c1c019cfe640581fa7f04f11c5382fe31
+01d1455700000001005dffec04f80596002d008e401f0c001d1c2316060505161c00042f2e0c
+10131648490c590c690c030f0c0123b8fff04039131648462356236623030d23010c040c2303
+1919205f596f1d01591d014b1d0103001d0109051d190403095f596006015206014406010603
+13003f335d5d5d2b00183f335f5e5d5f5d5d5d2b11120039395f5e5d5d2b5d5d2b1112011739
+11331133113311333130011404212003371e0133323635342e02272e0335342421321617072e
+0123220615141e01171e0504f8fecffeebfdfd52b920d0b3b9c93f729e60a7ad643501150102
+f0fe33bc1fae9aa9b24582c2418176674c2b0185c3d60166257f777f7b4556382616254a5b7a
+4fb5c493b1217065706f41553b2b0f1f2b3a54720001002e000004b405810007013040d90102
+040207030908000405045f59050301127b09014b09013b0901240901fb0901cb0901bb09019b
+09018b09017f0901025f09014f09013009010f090167df0901cf0901b009018f09015f09014f
+09010f0901f00901df0901cf0901af09019f09017009015f09014009011f0901ef0901df0901
+9f09016f09015f09013f09011f090100090137ef0901d009019009018009016f09015009012f
+0901000901d00901af09019009017f09016f0901500901400901200901100901ff0901e00901
+bf0901a009019009016009014009013f09012009010f0901075e5d5d5d5d5d5d5d5d5d5d7171
+7171717171717172727272727272725e5d5d5d5d5d5d5d5d7171717171717171717272727272
+72725e5d5d5d5d5f5d5d5d5d5d5d71717171003f3f2b11003311120117391133313001112311
+2135211502d0befe1c048604e5fb1b04e59c9c000000000100bb0000017e00db00030017400a
+030000040500019b5b00002f2b111201391133313033353315bbc3dbdb000000000100a80000
+042f05810005001f400e030000040607010300035f590012003f2b00183f1112013939113331
+30331133112115a8bf02c80581fb1b9c000100a8000004fe0581000b00544032050909000a03
+0700040c0d05085f598f0501ba050179058905020f050108030505000101045f59010300095f
+590012200d015d003f2b00183f2b11120039182f5f5e5d5d5d712b1112011739113311333130
+331121152111211521112115a8042dfc920332fcce039705819cfe3c9afe159c00000001002e
+0000052b0581000b010840c5080906050203000b0305040a090b060d0c1b0d4b0d028b0dbb0d
+eb0d03040d140d340d440d046a540d640d840d940db40dc40de40df40d083b0d01240d010b0d
+01f40d01db0d01c40d01ab0d01940d017b0d01640d01300d01240d01000d01f40d01d00d01c4
+0d01a00d01940d01700d01640d01400d01340d01100d01040d0139e00d01d40d01b00d01a40d
+01800d01140d440d740d03240d540d840db40de40d05540d640d940df40d04400d0102000d30
+0d0277070178010101040a0704080503030012003f323f3317395d5d015d5f5d5d7172727272
+72725e5d5d5d5d5d5d5d5d5d5d5d71717171717171717171727272725e5d5d71111217391133
+11331133113331302109012309013309013309010458fe59fe50d30218fe11d30188017dd3fe
+1e020b0268fd9802dc02a5fdd70229fd62fd1d00000100bd0000017c05810003008c40610300
+0004050103001240050130050120050110050100050139f00501b00501a00501700501600501
+500501400501000501f00501c00501b00501a00501500501400501100501000501f00501af05
+019005017005016005015005014005012005015d5d5d5d5d5d5d5d7171717171717171727272
+72727272725e5d5d5d5d5d003f3f111201391133313033113311bdbf0581fa7f000300a80000
+04ea0581000d0016001e0068403a0b1308131b1b040e081700000804031f200b131a131a5f59
+132413024d0f1301033e1301040f130110051313040505125f590503041b5f590412003f2b00
+183f2b11120039182f5f5e5d5f5d5f712b2b1112003911120117391133113311331133111239
+31300114042321112120111406071e01013426232111213236133429011121323604eafeeef4
+fdc4020001f08c80a8b6feee9c94febf0141999751fea2fe9c0173afa0018dbcd10581feaa7d
+aa1d14b901fa7262fe4273fdfff9fe0482000000000200a8000005680581000d00160057402f
+010c0c1309130303040e09000d0d09040317180c0213025f591313000505125f590503040012
+8018017018012018015d5d5d003f323f2b11120039182f2b1100331112011739113311331133
+1133111239113331302101211123112132041514060701033426232111213236048cfe92fe49
+bf0297ee0103b7a10190f8a79dfe3b01cd97a50249fdb70581d5be9dd61cfda103ec7b81fdf8
+8d0005cc05cc007d058100150079058100150000000000000000000000000000043a00140077
+0000ffec00000000ffec00000000ffec0000fe57000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000008000000000000b400bd00af00a00000
+000000000000000000000088007e000000ac00000000000000000000000000bf00c300ab0000
+0000009b008d000000000000000000000000000000000000000000000000000000b900aa0000
+00000000009400990087000000000000000000000000000000000000000000000000006a0083
+008d00a400b4000000000000000000000060006a0079009800ac00b800a700000122013300c3
+006b00000000000000db00c90000000000000000000000000000000000000000000001e101c9
+009200a8006b009200b7006b009b0000027b02f200920252006e02d703810082008900a0009f
+0169008f0000016000a4015b005e0082000000000000005e0065006f00000000000000000000
+00000000008a009000a5007a0080000000000000000000000581fff3000dfcb300830089008f
+00960069007105cc000ffc1efff2003404e6000dfed400bf031f00a700ae00b5000000000081
+00000000000000000748036a02b60202fd930000009100670091006101d90000028d03410000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000006810468001404cb0000ffecffd3fe7f008300db00aa00ba
+00a000cf40475b5a59585554535251504f4e4d4c4b4a494847464544434241403f3e3d3c3b3a
+393837363531302f2e2d2c28272625242322211f181411100f0e0d0b0a090807060504030201
+002c20b0016045b003252011466123452361482d2c20451868442d2c45234660b0206120b046
+60b004262348482d2c4523462361b0206020b02661b02061b004262348482d2c45234660b040
+6120b06660b004262348482d2c4523462361b0406020b02661b04061b004262348482d2c0110
+203c003c2d2c20452320b0cd442320b8015a51582320b08d44235920b0ed51582320b04d4423
+5920b0042651582320b00d44235921212d2c20204518684420b001602045b04676688a456044
+2d2c01b10b0a432343650a2d2c00b10a0b4323430b2d2c00b0282370b101283e01b0282370b1
+0228453ab10200080d2d2c2045b00325456164b050515845441b2121592d2c49b00e23442d2c
+2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb8100062
+602b0c642364615c58b00361592d2c8a03458a8a87b0112bb0292344b0297ae4182d2c4565b0
+2c234445b02b23442d2c4b525845441b2121592d2c4b515845441b2121592d2c01b005251023
+208af500b0016023edec2d2c01b005251023208af500b0016123edec2d2c01b0062510f500ed
+ec2d2cb00243b001525821212121211b462346608a8a462320468a608a61b8ff806223201023
+8ab10c0c8a70456020b0005058b00161b8ffba8b1bb0468c59b0106068013a592d2c2045b003
+2546524bb013515b58b0022546206861b00325b003253f2321381b2111592d2c2045b0032546
+5058b0022546206861b00325b003253f2321381b2111592d2c00b00743b006430b2d2c21210c
+6423648bb84000622d2c21b08051580c6423648bb82000621bb200402f2b59b002602d2c21b0
+c051580c6423648bb81555621bb200802f2b59b002602d2c0c6423648bb84000626023212d2c
+4b53588ab004254964234569b0408b61b08062b020616ab00e23442310b00ef61b21238a1211
+20392f592d2c4b535820b0032549646920b00526b0062549642361b08062b020616ab00e2344
+b0042610b00ef68a10b00e2344b00ef6b00e2344b00eed1b8ab00426111220392320392f2f59
+2d2c4523456023456023456023766818b08062202d2cb0482b2d2c2045b0005458b040442045
+b04061441b2121592d2c45b1302f4523456160b0016069442d2c4b5158b02f2370b01423421b
+2121592d2c4b515820b0032545695358441b2121591b2121592d2c45b01443b0006063b00160
+69442d2cb02f45442d2c452320458a60442d2c45234560442d2c4b235158b90033ffe0b13420
+1bb3330034005944442d2cb0164358b00326458a586466b01f601b64b020606620581b21b040
+59b001615923586559b02923442310b029e01b2121212121592d2cb0024354584b53234b515a
+58381b2121591b21212121592d2cb0164358b004254564b020606620581b21b04059b0016123
+581b6559b0292344b00525b00825082058021b0359b0042510b005252046b0042523423cb004
+25b0072508b0072510b006252046b00425b0016023423c2058011b0059b0042510b00525b029
+e0b02920456544b0072510b00625b029e0b00525b00825082058021b0359b00525b003254348
+b00425b0072508b00625b00325b0016043481b2159212121212121212d2c02b00425202046b0
+04252342b0052508b003254548212121212d2c02b0032520b0042508b0022543482121212d2c
+452320451820b00050205823652359236820b040505821b04059235865598a60442d2c4b5323
+4b515a5820458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b515a58381b
+2121592d2cb000214b5458381b2121592d2cb002435458b0462b1b21212121592d2cb0024354
+58b0472b1b212121592d2cb002435458b0482b1b21212121592d2cb002435458b0492b1b2121
+21592d2c208a08234b538a4b515a5823381b2121592d2c00b0022549b000535820b04038111b
+21592d2c014623466023466123201020468a61b8ff80628ab140408a704560683a2d2c208a23
+49648a2353583c1b21592d2c4b52587d1b7a592d2cb012004b014b54422d2cb1020042b12301
+8851b1400188535a58b910000020885458b202010243604259b12401885158b9200000408854
+58b2020202436042b12401885458b2022002436042004b014b5258b2020802436042591bb940
+000080885458b202040243604259b94000008063b80100885458b202080243604259b9400001
+0063b80200885458b202100243604259b12601885158b94000020063b80400885458b2024002
+43604259b94000040063b80800885458b2028002436042595959595959b10002435458400a05
+40084009400c020d021bb10102435458b2054008ba010000090100b30c010d011bb180024352
+58b2054008b80180b109401bb2054008ba01800009014059b9400000808855b94000020063b8
+040088555a58b30c000d011bb30c000d0159595942424242422d2c451868234b515823204520
+64b04050587c59688a6059442d2cb00016b00225b0022501b001233e00b002233eb10102060c
+b00a236542b00b234201b001233f00b002233fb10102060cb006236542b0072342b00116012d
+2cb080b0024350b001b00243545b58212310b0201ac91b8a10ed592d2cb0592b2d2c8a10e52d
+00010000000200005f97514e5f0f3cf5021f080000000000c840f99a00000000cf7bfed5fba6
+fd930a6a07d700000008000000010000000000010000073efe4e00430ab4fba6fa7a0a6a0001
+0000000000000000000000000000000d060000cd04e300a8055600040556005d04e3002e0239
+00bb02390000047300a8055600a80556002e023900bd055600a805c700a8000000000000004c
+000000b00000015800000270000003c8000003f8000003f800000434000004b8000006000000
+06a40000077c0000082800010000000d01520054005c000600020010002f005c000002a40204
+0004000141210009013f000101390055013e000101390055014201400014001f01410140001f
+001f013b0033013a00550138003301390055004001070001001f01070001009f010440aa01c0
+fd01affd0100fd010a4ffb0120fb01f550281ff246281ff1462a1ff0462b1f5fef7fef020fef
+4fef5fef8fefafef050be5e41e1fe3e2461f0fe20140e246161fe1e0461fcfe0dfe0efe00340
+e0333646e046181feeedff1fed01e855ec48eb55ea320055e9e8e855e7480055e600ff1fdd3d
+df55df010355de3d0355dc03ff1f0fd51fd5020fd51fd50240ca181b46cfc201bdc03c1fc150
+261fbcbe281fffb90150b870b880b803b8ffc040ffb81232461fb73fb74fb76fb77fb79fb7af
+b70718b60170b2a0b2b0b2030fb20190b501b0b5010fb501080fb33fb3efb30380b090b002b0
+b0c0b0d0b0032faf3faf02a0adb0ad02c0add0ad022fac3fac029fab01c0aad0aa024fa98fa9
+022fa96fa9bfa9ffa9049c9b241f509b016f9601bf960196461d1f9594171f0f941f947f948f
+94ff94053091409102809101708f808f02908f01c08fd08f024f8c5f8c6f8c038646ff1f9f85
+018483311f74733f1f7350261f6f6e3c1f6e46351f1a01185519331855073303550603ff1f60
+50261f5f50261f5c46311f5b5a481f5a46311f1332125505010355043203556c03010c033c03
+4c036c037c0305ef51ff4064510240513538464051252846cf50014946201f4846351f474635
+1faf4601df46ef46028046011632155511010f5510320f55020100550100011f1f0f3f0f5f0f
+7f0f040f0f2f0f4f0f6f0f8f0fdf0fff0f073f0f7f0fef0f036f00014f00018016010501b801
+90b154532b2b4bb807ff524bb007505bb00188b02553b00188b040515ab00688b000555a5b58
+b101018e59858d8d00421d4bb0325358b0601d594bb0645358b0401d594bb0805358b0101db1
+1600425973747374752b2b2b2b2b017374752b2b2b00742b2b7373752b2b2b012b2b2b002b2b
+2b2b2b2b012b2b002b2b012b732b00747374757374732b012b747500732b7374017373740073
+7474737473015e73737473730073732b7373012b002b012b00732b74752b2b2b2b2b2b2b2b2b
+2b2b012b2b742b2b5e732b002b5e7374012b2b2b002b73735e73737301737373002b2b2b2b2b
+2b185e0000>
+] def
+/f-1-0 currentdict end definefont pop
+%%EndResource
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 0 4762 1203
+%%EndPageSetup
+q 0 0 4762 1203 rectclip
+1 0 0 -1 0 1203 cm q
+0.92549 g
+3343.73 10.711 m 3326.793 13.18 3307.699 15.402 3297.887 21.449 c 3287.934
+ 28.629 3290.18 36.867 3292.492 38.832 c 3294.109 40.422 3298.875 42.934
+ 3299.426 46.52 c 3299.051 53.301 3270.855 50.512 3255.34 55.426 c 3248.902
+ 57.629 3243.965 62.211 3243.699 66.816 c 3244.168 73.789 3248.535 74.984
+ 3253.219 77.453 c 3264.656 83.316 3276.566 87.27 3286.039 93.418 c 3290.617
+ 95.984 3295.051 98.902 3301.688 102.234 c 3333.039 117.758 3371.008 130.91
+ 3381.789 136.312 c 3508.773 200.281 3640.422 264.254 3763.32 314.754 c 
+3831.301 386.93 3910.168 456.766 3969.223 527.359 c 3946.176 575.613 3924.559
+ 612.945 3897.066 660.316 c 3875.961 695.527 3860.914 718.512 3845.078 743.086
+ c 3816.77 787.762 3785.32 821.027 3761.18 866.367 c 3755.375 875.957 3752.625
+ 885.488 3752.328 895.031 c 3753.613 918.82 3801.086 949.34 3805.395 950.477
+ c 3819.391 953.766 3832.789 944.645 3844.312 935.789 c 3875.773 903.062
+ 3903.031 859.324 3942.812 821.273 c 3963.965 801.363 3983.012 782.316 4009.887
+ 757.949 c 4042.195 727.586 4065.188 702.324 4091.82 673.598 c 4108.535 
+657.922 4120.234 659.223 4121.953 658.855 c 4193.309 680.719 4250.883 712.484
+ 4293.578 751.238 c 4405.504 864.152 4485.582 976.426 4588.777 1078.074 
+c 4605.168 1094.926 4619.773 1105.051 4632.73 1118.266 c 4651.391 1142.262
+ l 4654.816 1146.43 4665.469 1156.457 4668.535 1148.523 c 4686.023 1160.5
+ 4693.273 1173.863 4703.438 1185.641 c 4713.336 1197.559 4717.746 1202.688
+ 4723.25 1202.223 c 4728.625 1200.957 4730.762 1190.043 4730.285 1183.047
+ c 4727.418 1161.488 4725.07 1155.113 4726.516 1153.676 c 4728.883 1152.648
+ 4736.551 1171.609 4759.762 1165.672 c 4765.039 1161.383 4756.293 1134.273
+ 4744 1067.984 c 4699.426 872.008 4637.398 675.41 4548.203 503.516 c 4539.172
+ 485.344 4528.855 470.23 4516.238 460.617 c 4488.039 434.039 4458.438 415.641
+ 4428.926 396.73 c 4413.434 385.852 4396.535 375.59 4382.676 363.996 c 4369.422
+ 352.094 4368.766 330.727 4374.066 312.961 c 4377.77 298.496 4385.754 277.953
+ 4387.297 271.555 c 4391.293 248.266 4389.66 245.648 4389.43 225.195 c 4388.988
+ 217.062 4387.879 212.855 4390.484 206.535 c 4394.258 202.602 4399.66 201.516
+ 4405.582 203.324 c 4413.57 207.34 4417.418 206.586 4418.242 204.445 c 4411.488
+ 179.484 4370.039 161.531 4348.203 166.996 c 4333.777 164.441 4315.582 166.543
+ 4302.48 169.953 c 4278.016 177.395 4259.891 184.824 4240.559 195.035 c 
+4223.984 205.664 4210.301 215.695 4187.004 213.465 c 4168.426 211.398 4158.68
+ 205.367 4149.766 196.402 c 4099.684 151.062 4065.785 90.91 4014.332 56.988
+ c 3780.102 0.566 3568.707 -11.492 3343.73 10.711 c h
+3579.664 61.125 m 3722.555 43.281 3869.695 40.352 3999.113 81.539 c 4037.711
+ 123.34 4063.203 168.012 4095.312 214.117 c 4109.617 240.516 4118.742 258.082
+ 4107.559 283.785 c 4069.113 343.789 4027.219 415.969 3991.285 484.223 c
+ 3993.379 514.504 3836.512 314.414 3792.176 288.668 c 3657.199 211.926 3645.324
+ 227.828 3442.434 106.246 c 3430.613 97.859 3419.438 84.195 3481.688 75.5
+ c 3513.941 70.152 3546.688 65.242 3579.664 61.125 c h
+4356.293 175.797 m 4361.727 175.176 4371.113 175.688 4382.57 183.578 c 
+4378.031 188.582 4379.562 194.051 4380.93 199.645 c 4368.387 194.281 4355.363
+ 206.562 4336.137 209.891 c 4352.84 203.883 4360.059 193.469 4352.246 176.566
+ c 4353.109 176.336 4354.48 176.004 4356.293 175.797 c h
+4319.512 188.051 m 4325.719 188.617 4323.547 188.32 4327.879 190.855 c 
+4322.16 201.566 4316.312 207.297 4305.895 206.586 c 4297.199 205.965 4294.203
+ 201.746 4288.301 195.332 c 4295.988 193.449 l 4303.73 210.109 4320.734 
+202.621 4321.109 193.824 c 4320.465 189.309 4319.512 188.051 4319.512 188.051
+ c h
+4249.414 222.734 m 4263.34 220.848 4281.578 242.562 4277.324 258.215 c 
+4303.887 274.281 4316.141 251.945 4330.656 239.754 c 4360.641 218.047 4369.234
+ 219.285 4379.984 219.613 c 4382.094 243.73 4379.664 269.086 4365.5 304.82
+ c 4346.379 401.875 4305.414 442.266 4263.375 486.484 c 4178.129 577.906
+ 4089.652 662.836 3989.613 739.312 c 3968.332 754.105 3951.793 762.883 3932.273
+ 755.82 c 3930.52 725.672 3938.902 698.273 3950.27 666.516 c 3973.297 612.461
+ 3996.742 561.617 4016.453 504.648 c 4067.617 383.102 4112.539 333.281 4158.863
+ 282.98 c 4183.215 261.613 4190.781 253.156 4198.781 252.27 c 4208.363 263.41
+ 4239.504 268.055 4242.336 263.543 c 4235.922 261.555 4235.172 258.699 4234.785
+ 253.43 c 4235.148 232.277 4241.602 223.793 4249.414 222.734 c h
+4393.387 435.266 m 4418.41 443.07 4466.48 473.914 4515.32 493.883 c 4623.484
+ 670.66 4656.152 904.32 4661.191 1029.406 c 4661.078 1069.164 4656.305 1062.82
+ 4643.137 1056 c 4498.242 960.715 4413.879 808.531 4304.039 706.004 c 4236.258
+ 666.219 4162.562 652.215 4143.688 632.547 c 4253.996 537.738 4338.379 459.234
+ 4393.387 435.266 c h
+3949.652 622.961 m 3954.016 622.605 3947.93 637.332 3945.402 643.309 c 
+3930.672 675.277 3923.738 711.812 3914.203 745.488 c 3907.891 764.602 3898.258
+ 771.586 3888.789 770.418 c 3877.973 768.285 3860.805 753.867 3868.598 738.207
+ c 3891.621 703.336 3910.348 662.09 3941.281 629.23 c 3945.578 624.875 3948.195
+ 623.082 3949.652 622.961 c h
+3983.707 758.523 m 3994.418 757.191 3939.504 805.996 3925.879 812.176 c
+ 3908.133 796.094 3947.695 777.059 3960.957 770.855 c 3973.984 762.465 3980.98
+ 758.867 3983.707 758.523 c h
+3835.918 781.219 m 3841.543 796.906 3855.684 803.105 3864.777 808.203 c
+ 3859.305 815.355 3855.527 820.055 3849.438 825.348 c 3838.367 819.352 3828.441
+ 815.473 3821.738 802.617 c 3826.59 793.426 3830.07 788.32 3835.918 781.219
+ c h
+3804.688 828.371 m 3810.48 836.691 3820.172 846.375 3829.348 850.52 c 3825.926
+ 855.684 3822.23 861.285 3817.062 865.57 c 3806.723 861.645 3796.043 851.516
+ 3791.695 845.125 c 3795.727 837.508 3801.113 830.762 3804.688 828.371 c
+ h
+3887.062 825.625 m 3893.656 838.336 3901.23 840.609 3906.133 843.582 c 
+3903.363 847.398 3901.34 851.676 3892.918 857.551 c 3888.41 856.641 3877.953
+ 847.969 3874.66 840.109 c 3879.844 832.293 3882.055 830.934 3887.062 825.625
+ c h
+3851.426 867.527 m 3855.723 875.969 3861.363 882.234 3869.895 885.254 c
+ 3866.477 892.301 3863.773 894.633 3858.688 898.137 c 3855.562 896.184 3848.027
+ 892.191 3840.055 881.488 c 3844.773 874.672 3847.051 872.477 3851.426 867.527
+ c h
+3767.102 888.582 m 3778.391 908.258 3799.156 919.305 3817.613 935.039 c
+ 3815.273 936.793 3815.008 942.23 3810.789 942.828 c 3793.531 934.027 3774.535
+ 920.598 3761.09 898.758 c 3763.551 894.031 3763.715 892.711 3767.102 888.582
+ c h
+3767.102 888.582 m f*
+4364.688 182.262 m 4364.754 181.164 4365.281 178.062 4367.141 178.605 c
+ 4369.168 179.988 4370.465 182.137 4371.031 185.625 c 4371.238 187.367 4371.254
+ 188.812 4368.719 186.855 c 4367.406 185.656 4366.934 185.422 4364.688 182.262
+ c h
+4364.688 182.262 m f*
+BT
+703.125 0 0 -703.125 -28.839109 1012.363769 Tm
+/f-0-0 1 Tf
+[(GR)7(O)3(M)-4(A)22(CS)]TJ
+281.25 0 0 -281.25 22.97874 379.641906 Tm
+/f-1-0 1 Tf
+[(F)54(AST)109(.  FLEXIBLE)-3(.  FREE.)]TJ
+ET
+Q Q
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.png b/docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.png
new file mode 100644 (file)
index 0000000..1306633
Binary files /dev/null and b/docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.png differ
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.svg b/docs/reference-manual/plots/GMX_logos/gmx_logo_waterstamp.svg
new file mode 100644 (file)
index 0000000..88bfff6
--- /dev/null
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100%"
+   height="100%"
+   viewBox="0 0 6349 1603"
+   version="1.1"
+   xml:space="preserve"
+   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
+   id="svg923"
+   sodipodi:docname="Gromacs Logo [Blue].svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   inkscape:export-filename="/home/cathrine/Pictures/svg_files/gromacs_logo1.png"
+   inkscape:export-xdpi="300"
+   inkscape:export-ydpi="300"><metadata
+   id="metadata929"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+   id="defs927">
+        
+    
+            
+            
+            
+        
+                
+            
+                
+
+
+            
+
+
+
+
+
+<inkscape:path-effect
+   is_visible="true"
+   id="path-effect1061"
+   effect="spiro" /><clipPath
+   id="_clip1-3"><rect
+     x="0"
+     y="0"
+     width="291.98801"
+     height="550.58301"
+     id="rect892-6" /></clipPath></defs><sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="1853"
+   inkscape:window-height="1145"
+   id="namedview925"
+   showgrid="false"
+   units="mm"
+   inkscape:zoom="0.1767767"
+   inkscape:cx="3203.3303"
+   inkscape:cy="513.69543"
+   inkscape:window-x="67"
+   inkscape:window-y="27"
+   inkscape:window-maximized="1"
+   inkscape:current-layer="g1133"
+   viewbox-width="6349" />
+    
+
+<g
+   id="g1835"
+   inkscape:export-filename="/home/cathrine/Pictures/svg_files/gromacs_logo3.png"
+   inkscape:export-xdpi="300"
+   inkscape:export-ydpi="300"
+   transform="translate(107.48023,33.941125)"><g
+     transform="matrix(3.7513483,-0.46066696,0.46066696,3.7513483,4198.3338,3197.8407)"
+     id="layer1"
+     style="fill:none;fill-opacity:1;stroke:none"><g
+       style="clip-rule:evenodd;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-linejoin:round;stroke-miterlimit:2"
+       id="g903-7"
+       transform="matrix(0.82454635,-0.51053871,0.49150293,0.84357369,250.14362,56.767957)"><g
+         style="fill:none;fill-opacity:1;stroke:none"
+         id="g901-5"
+         transform="translate(-145.994,-275.291)"><clipPath
+           id="clipPath1706"><rect
+             id="rect1704"
+             height="550.58301"
+             width="291.98801"
+             y="0"
+             x="0" /></clipPath><g
+           style="fill:none;fill-opacity:1;stroke:none"
+           id="g899-3"
+           clip-path="url(#_clip1-3)"><g
+             style="fill:none;fill-opacity:1;stroke:none"
+             id="g897-5"
+             transform="matrix(1,0,0,-1,0,555.789)" /></g></g></g></g><g
+     id="g1146"
+     transform="translate(-208,-112)"><g
+       transform="translate(-24.46945,-27.842525)"
+       id="g1133"><g
+         id="g862"
+         transform="translate(414.87524,-2396.4028)"
+         inkscape:export-filename="/home/cathrine/Pictures/svg_files/GROMACS_logo/GMX_logos/gmx_logo_blue.png"
+         inkscape:export-xdpi="300"
+         inkscape:export-ydpi="300"
+         style="fill:#ececec;fill-opacity:1"><g
+           transform="matrix(1.1914369,0,0,1.1914369,-1160.5458,-865.93629)"
+           id="g1066"
+           style="fill:#ececec;fill-opacity:1"><path
+             inkscape:connector-curvature="0"
+             style="opacity:1;fill:#ececec;fill-opacity:1;stroke:none;stroke-width:0.24566934;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+             d="m 4472.724,2839.028 c -18.9578,2.7624 -40.3248,5.2475 -51.3026,12.0164 -11.1396,8.0334 -8.6273,17.2529 -6.0392,19.4534 1.809,1.7786 7.1445,4.5875 7.7607,8.6026 -0.4228,7.5868 -31.9734,4.4681 -49.3367,9.9666 -7.2041,2.4668 -12.7316,7.5949 -13.03,12.7457 0.5245,7.8067 5.4123,9.1408 10.6558,11.9072 12.7997,6.5604 26.1289,10.9848 36.7265,17.8638 5.1267,2.8708 10.0857,6.1364 17.5131,9.8687 35.0857,17.3692 77.5793,32.0888 89.6427,38.1355 142.1092,71.5868 289.4364,143.1806 426.9703,199.6938 76.0785,80.7698 164.3367,158.9248 230.4266,237.9267 -25.7919,53.9994 -49.985,95.7775 -80.7537,148.7919 -23.6163,39.4046 -40.4556,65.1229 -58.1793,92.6255 -31.679,49.9972 -66.8743,87.2218 -93.8903,137.9627 -6.4954,10.7344 -9.5722,21.3976 -9.9044,32.0771 1.4363,26.6251 54.5642,60.7762 59.3845,62.0488 15.6641,3.6803 30.6604,-6.5234 43.5538,-16.4369 35.2082,-36.6242 65.7142,-85.5701 110.2334,-128.1511 23.6708,-22.2813 44.9846,-43.5978 75.0608,-70.8665 36.1568,-33.9801 61.8854,-62.2483 91.6934,-94.3994 18.7019,-17.5404 31.7963,-16.0871 33.719,-16.4985 79.854,24.4679 144.2844,60.0159 192.0664,103.3863 125.2565,126.3629 214.8693,252.0078 330.3562,365.7604 18.3417,18.8579 34.6897,30.1905 49.189,44.9806 l 20.8798,26.8525 c 3.8362,4.6637 15.7584,15.8848 19.1887,7.0084 19.5715,13.4021 27.6858,28.3576 39.057,41.5375 11.0806,13.3361 16.0149,19.075 22.175,18.5548 6.0156,-1.414 8.406,-13.6293 7.8728,-21.4595 -3.2094,-24.1228 -5.8358,-31.2602 -4.2192,-32.8675 2.6505,-1.1501 11.231,20.0703 37.2069,13.4264 5.9021,-4.801 -3.8849,-35.1376 -17.6422,-109.3249 -49.8812,-219.313 -119.2973,-439.3267 -219.1139,-631.6945 -10.1075,-20.3354 -21.6503,-37.2484 -35.7724,-48.0076 -31.5595,-29.743 -64.6838,-50.3313 -97.71,-71.4928 -17.3384,-12.1743 -36.2474,-23.6602 -51.7595,-36.6363 -14.8342,-13.3173 -15.5681,-37.2282 -9.6343,-57.1109 4.1461,-16.1885 13.0799,-39.1769 14.8082,-46.3379 4.4695,-26.0616 2.6444,-28.9902 2.3838,-51.8805 -0.4952,-9.0998 -1.734,-13.8082 1.1824,-20.8818 4.2196,-4.4031 10.2684,-5.6178 16.8947,-3.5958 8.9415,4.4959 13.2466,3.6501 14.1668,1.2553 -7.5576,-27.932 -53.942,-48.0228 -78.3797,-41.9076 -16.1437,-2.8597 -36.5044,-0.5062 -51.168,3.3062 -27.38,8.3304 -47.6638,16.6447 -69.2986,28.0698 -18.5469,11.8969 -33.859,23.1233 -59.9307,20.6264 -20.7896,-2.3142 -31.6988,-9.0623 -41.6715,-19.0965 -56.0504,-50.7396 -93.9825,-118.0556 -151.5659,-156.0158 -262.1276,-63.1428 -498.6955,-76.6351 -750.4662,-51.7887 z m 264.0305,56.417 c 159.9113,-19.9667 324.5729,-23.2472 469.4073,22.8454 43.1939,46.7812 71.7193,96.7697 107.654,148.3676 16.0067,29.5418 26.2196,49.2028 13.7029,77.9678 -43.0219,67.1498 -89.9084,147.925 -130.1207,224.3075 2.3444,33.8873 -173.2045,-190.0312 -222.8195,-218.8444 -151.0521,-85.8808 -164.3419,-68.086 -391.3982,-204.1467 -13.2274,-9.3868 -25.7352,-24.6771 43.9285,-34.4096 36.0945,-5.9832 72.7431,-11.4799 109.6457,-16.0876 z m 869.1232,128.3286 c 6.0803,-0.6956 16.5846,-0.1211 29.4077,8.7091 -5.0815,5.5993 -3.3648,11.7192 -1.8377,17.9811 -14.0341,-6.0056 -28.6087,7.7408 -50.1267,11.4647 18.6917,-6.7253 26.7702,-18.3786 18.0302,-37.2941 0.9662,-0.2556 2.4998,-0.629 4.5265,-0.8608 z m -41.1628,13.7131 c 6.9488,0.6361 4.5155,0.3006 9.3643,3.1379 -6.3991,11.9879 -12.9412,18.4014 -24.6018,17.6064 -9.7285,-0.6954 -13.0845,-5.4165 -19.6897,-12.5944 l 8.6041,-2.1074 c 8.666,18.6462 27.6935,10.266 28.1142,0.4182 -0.721,-5.051 -1.7911,-6.4607 -1.7911,-6.4607 z m -78.4439,38.8134 c 15.5839,-2.1115 35.9956,22.192 31.2327,39.708 29.7288,17.9783 43.4401,-7.0169 59.6827,-20.6609 33.5569,-24.2906 43.1726,-22.9036 55.2037,-22.5371 2.3616,26.9868 -0.3589,55.3656 -16.2096,95.3546 -21.3966,108.611 -67.2419,153.814 -114.2861,203.297 -95.4006,102.3124 -194.4115,197.3584 -306.3666,282.9392 -23.814,16.5585 -42.3253,26.3784 -64.1697,18.4767 -1.9597,-33.7382 7.4207,-64.4014 20.1406,-99.9422 25.769,-60.4901 52.0083,-117.3891 74.0673,-181.1438 57.2573,-136.022 107.5282,-191.7775 159.3703,-248.0693 27.2496,-23.9096 35.7193,-33.3759 44.6733,-34.3692 10.7218,12.4703 45.5714,17.6662 48.7409,12.6162 -7.1769,-2.2219 -8.0167,-5.4195 -8.452,-11.316 0.4076,-23.6723 7.6303,-33.1687 16.3725,-34.3532 z m 161.1188,237.8463 c 28.0024,8.7342 81.7988,43.2495 136.4539,65.5957 121.0474,197.8343 157.6045,459.3213 163.2438,599.3057 -0.1232,44.4924 -5.4683,37.3925 -20.2029,29.7605 -162.1516,-106.6331 -256.5636,-276.941 -379.4814,-391.6809 -75.8563,-44.5235 -158.3274,-60.1941 -179.4496,-82.2076 123.4449,-106.0988 217.8761,-193.9501 279.4362,-220.7734 z m -496.583,210.049 c 4.885,-0.4003 -1.9247,16.0829 -4.7542,22.7708 -16.4841,35.7763 -24.246,76.6615 -34.9148,114.3483 -7.0672,21.3877 -17.8468,29.2058 -28.4427,27.8974 -12.1031,-2.3877 -31.3177,-18.522 -22.597,-36.0457 25.7669,-39.0258 46.7247,-85.1813 81.3436,-121.9547 4.8078,-4.8737 7.7367,-6.8826 9.3651,-7.0161 z m 38.113,151.7084 c 11.9834,-1.4948 -49.4683,53.1241 -64.7175,60.0388 -19.8565,-17.9957 24.4173,-39.2974 39.2585,-46.2391 14.5789,-9.3925 22.4044,-13.4187 25.459,-13.7997 z m -165.3916,25.3968 c 6.2934,17.5559 22.1194,24.4918 32.2983,30.1967 -6.1257,8.0037 -10.354,13.264 -17.1683,19.1868 -12.387,-6.7117 -23.4968,-11.0497 -30.9995,-25.4367 5.4321,-10.2873 9.3252,-15.998 15.8695,-23.9468 z m -34.948,52.7684 c 6.4811,9.3107 17.3246,20.1472 27.5938,24.7844 -3.8276,5.7796 -7.9643,12.0472 -13.7468,16.844 -11.5716,-4.3951 -23.5249,-15.7268 -28.3888,-22.8783 4.5122,-8.5268 10.5423,-16.0767 14.5418,-18.7501 z m 92.1855,-3.0753 c 7.3777,14.2244 15.8534,16.7713 21.3392,20.0977 -3.0992,4.2721 -5.3618,9.0567 -14.7873,15.6298 -5.0433,-1.0176 -16.7497,-10.7206 -20.4317,-19.5184 5.8006,-8.7454 8.2719,-10.266 13.8798,-16.2091 z m -39.8805,46.894 c 4.8069,9.4466 11.117,16.4588 20.6656,19.8361 -3.8242,7.8868 -6.8513,10.4991 -12.5394,14.4171 -3.4977,-2.1856 -11.9327,-6.6504 -20.8518,-18.6286 5.2785,-7.6273 7.8258,-10.0848 12.7256,-15.6246 z m -94.3688,23.5625 c 12.6327,22.0171 35.8732,34.3814 56.5276,51.9881 -2.6202,1.9653 -2.9157,8.0504 -7.6367,8.7204 -19.313,-9.8515 -40.5709,-24.8798 -55.6173,-49.3193 2.7544,-5.2895 2.9364,-6.7685 6.7264,-11.3892 z"
+             id="rect1188" /><path
+             inkscape:connector-curvature="0"
+             style="fill:#ececec;fill-opacity:1;stroke:none;stroke-width:0.29999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 5615.2719,3031.0101 c 0.075,-1.2289 0.6651,-4.6992 2.7475,-4.0926 2.2666,1.5467 3.7201,3.9506 4.3543,7.8539 0.2282,1.9516 0.2476,3.5697 -2.5883,1.3807 -1.4708,-1.3462 -2.0008,-1.608 -4.5135,-5.142 z"
+             id="path1103-2" /></g><g
+           id="g1073"
+           style="fill:#ececec;fill-opacity:1"><text
+   x="-328.33817"
+   y="3852.1226"
+   style="font-weight:700;font-size:937.5px;font-family:KannadaMN-Bold, 'Kannada MN';fill:#ececec;fill-opacity:1;stroke-width:1.5625"
+   id="text907"><tspan
+     style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';fill:#ececec;fill-opacity:1"
+     id="tspan962"
+     dx="0 0.34 -6.75 -2.0699999 2.4099996 -21.060011">GROMACS</tspan></text>
+
+
+<text
+   x="-255.0177"
+   y="3008.4934"
+   style="font-size:375px;font-family:KannadaMN, 'Kannada MN';fill:#ececec;fill-opacity:1;stroke-width:1.5625"
+   id="text915"><tspan
+     id="tspan840"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';word-spacing:-0.01px;fill:#ececec;fill-opacity:1"
+     dx="-4.2299995">FAST.  FLEXIBLE.  FREE.</tspan><tspan
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';word-spacing:-0.01px;fill:#ececec;fill-opacity:1;stroke-width:1.5625"
+     x="-81.250793"
+     y="3008.4934"
+     id="tspan911" /></text>
+
+
+</g></g></g></g><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.03704604;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 4039.5085,-1228.8879 c 14.7955,-26.0805 30.1415,-54.98 41.768,-78.6574 6.3295,-12.8899 7.2866,-14.928 7.1144,-15.1498 -0.4357,-0.5613 -6.5497,-7.7703 -8.9122,-10.5083 -19.9386,-23.1076 -43.0918,-47.9255 -72.0024,-77.1792 l -5.1867,-5.2482 0.4811,-0.039 c 0.59,-0.048 -0.4107,-1.009 9.6881,9.3014 34.1045,34.8188 56.8517,58.9577 68.2493,72.4245 3.7434,4.423 9.4939,11.9094 9.3811,12.2129 -0.078,0.2092 -14.7241,28.4968 -19.731,38.108 -8.7207,16.7399 -16.8182,31.786 -26.3009,48.8699 l -3.9583,7.1313 h -0.6543 -0.6542 z"
+     id="path1020"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d=""
+     id="path1022"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d=""
+     id="path1024"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 4089.8968,-1322.132 c -0.1106,-0.1908 -0.1903,-0.3578 -0.1771,-0.371 0.034,-0.034 0.471,0.5714 0.471,0.6538 0,0.1471 -0.1009,0.05 -0.2939,-0.2828 z"
+     id="path1028"
+     inkscape:connector-curvature="0" /></g>
+<flowRoot
+   xml:space="preserve"
+   id="flowRoot27"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;line-height:1.25;font-family:KannadaMN-Bold, 'Kannada MN';-inkscape-font-specification:'KannadaMN-Bold, Kannada MN';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
+     id="flowRegion29"><rect
+       id="rect31"
+       width="2827.7173"
+       height="480.60019"
+       x="435.89319"
+       y="-1055.199" /></flowRegion><flowPara
+     id="flowPara33" /></flowRoot><flowRoot
+   xml:space="preserve"
+   id="flowRoot1713"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:KannadaMN-Bold, 'Kannada MN';-inkscape-font-specification:'KannadaMN-Bold, Kannada MN';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
+     id="flowRegion1715"><rect
+       id="rect1717"
+       width="829.83124"
+       height="284.51358"
+       x="1311.9237"
+       y="1882.0675" /></flowRegion><flowPara
+     id="flowPara1719" /></flowRoot></svg>
\ No newline at end of file
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_white.png b/docs/reference-manual/plots/GMX_logos/gmx_logo_white.png
new file mode 100644 (file)
index 0000000..97a7448
Binary files /dev/null and b/docs/reference-manual/plots/GMX_logos/gmx_logo_white.png differ
diff --git a/docs/reference-manual/plots/GMX_logos/gmx_logo_white.svg b/docs/reference-manual/plots/GMX_logos/gmx_logo_white.svg
new file mode 100644 (file)
index 0000000..91e9c06
--- /dev/null
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100%"
+   height="100%"
+   viewBox="0 0 6349 1603"
+   version="1.1"
+   xml:space="preserve"
+   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
+   id="svg923"
+   sodipodi:docname="Gromacs Logo [Blue].svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   inkscape:export-filename="/home/cathrine/Pictures/svg_files/gromacs_logo1.png"
+   inkscape:export-xdpi="300"
+   inkscape:export-ydpi="300"><metadata
+   id="metadata929"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+   id="defs927">
+        
+    
+            
+            
+            
+        
+                
+            
+                
+
+
+            
+
+
+
+
+
+<inkscape:path-effect
+   is_visible="true"
+   id="path-effect1061"
+   effect="spiro" /><clipPath
+   id="_clip1-3"><rect
+     x="0"
+     y="0"
+     width="291.98801"
+     height="550.58301"
+     id="rect892-6" /></clipPath></defs><sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="1853"
+   inkscape:window-height="1145"
+   id="namedview925"
+   showgrid="false"
+   units="mm"
+   inkscape:zoom="0.1767767"
+   inkscape:cx="3203.3303"
+   inkscape:cy="513.69543"
+   inkscape:window-x="67"
+   inkscape:window-y="27"
+   inkscape:window-maximized="1"
+   inkscape:current-layer="g1133"
+   viewbox-width="6349" />
+    
+
+<g
+   id="g1835"
+   inkscape:export-filename="/home/cathrine/Pictures/svg_files/gromacs_logo3.png"
+   inkscape:export-xdpi="300"
+   inkscape:export-ydpi="300"
+   transform="translate(107.48023,33.941125)"><g
+     transform="matrix(3.7513483,-0.46066696,0.46066696,3.7513483,4198.3338,3197.8407)"
+     id="layer1"
+     style="fill:none;fill-opacity:1;stroke:none"><g
+       style="clip-rule:evenodd;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-linejoin:round;stroke-miterlimit:2"
+       id="g903-7"
+       transform="matrix(0.82454635,-0.51053871,0.49150293,0.84357369,250.14362,56.767957)"><g
+         style="fill:none;fill-opacity:1;stroke:none"
+         id="g901-5"
+         transform="translate(-145.994,-275.291)"><clipPath
+           id="clipPath1706"><rect
+             id="rect1704"
+             height="550.58301"
+             width="291.98801"
+             y="0"
+             x="0" /></clipPath><g
+           style="fill:none;fill-opacity:1;stroke:none"
+           id="g899-3"
+           clip-path="url(#_clip1-3)"><g
+             style="fill:none;fill-opacity:1;stroke:none"
+             id="g897-5"
+             transform="matrix(1,0,0,-1,0,555.789)" /></g></g></g></g><g
+     id="g1146"
+     transform="translate(-208,-112)"><g
+       transform="translate(-24.46945,-27.842525)"
+       id="g1133"><g
+         id="g862"
+         transform="translate(414.87524,-2396.4028)"
+         inkscape:export-filename="/home/cathrine/Pictures/svg_files/GROMACS_logo/GMX_logos/gmx_logo_black.png"
+         inkscape:export-xdpi="300"
+         inkscape:export-ydpi="300"
+         style="fill:#ffffff;fill-opacity:1"><g
+           transform="matrix(1.1914369,0,0,1.1914369,-1160.5458,-865.93629)"
+           id="g1066"
+           style="fill:#ffffff;fill-opacity:1"><path
+             inkscape:connector-curvature="0"
+             style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.24566934;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+             d="m 4472.724,2839.028 c -18.9578,2.7624 -40.3248,5.2475 -51.3026,12.0164 -11.1396,8.0334 -8.6273,17.2529 -6.0392,19.4534 1.809,1.7786 7.1445,4.5875 7.7607,8.6026 -0.4228,7.5868 -31.9734,4.4681 -49.3367,9.9666 -7.2041,2.4668 -12.7316,7.5949 -13.03,12.7457 0.5245,7.8067 5.4123,9.1408 10.6558,11.9072 12.7997,6.5604 26.1289,10.9848 36.7265,17.8638 5.1267,2.8708 10.0857,6.1364 17.5131,9.8687 35.0857,17.3692 77.5793,32.0888 89.6427,38.1355 142.1092,71.5868 289.4364,143.1806 426.9703,199.6938 76.0785,80.7698 164.3367,158.9248 230.4266,237.9267 -25.7919,53.9994 -49.985,95.7775 -80.7537,148.7919 -23.6163,39.4046 -40.4556,65.1229 -58.1793,92.6255 -31.679,49.9972 -66.8743,87.2218 -93.8903,137.9627 -6.4954,10.7344 -9.5722,21.3976 -9.9044,32.0771 1.4363,26.6251 54.5642,60.7762 59.3845,62.0488 15.6641,3.6803 30.6604,-6.5234 43.5538,-16.4369 35.2082,-36.6242 65.7142,-85.5701 110.2334,-128.1511 23.6708,-22.2813 44.9846,-43.5978 75.0608,-70.8665 36.1568,-33.9801 61.8854,-62.2483 91.6934,-94.3994 18.7019,-17.5404 31.7963,-16.0871 33.719,-16.4985 79.854,24.4679 144.2844,60.0159 192.0664,103.3863 125.2565,126.3629 214.8693,252.0078 330.3562,365.7604 18.3417,18.8579 34.6897,30.1905 49.189,44.9806 l 20.8798,26.8525 c 3.8362,4.6637 15.7584,15.8848 19.1887,7.0084 19.5715,13.4021 27.6858,28.3576 39.057,41.5375 11.0806,13.3361 16.0149,19.075 22.175,18.5548 6.0156,-1.414 8.406,-13.6293 7.8728,-21.4595 -3.2094,-24.1228 -5.8358,-31.2602 -4.2192,-32.8675 2.6505,-1.1501 11.231,20.0703 37.2069,13.4264 5.9021,-4.801 -3.8849,-35.1376 -17.6422,-109.3249 -49.8812,-219.313 -119.2973,-439.3267 -219.1139,-631.6945 -10.1075,-20.3354 -21.6503,-37.2484 -35.7724,-48.0076 -31.5595,-29.743 -64.6838,-50.3313 -97.71,-71.4928 -17.3384,-12.1743 -36.2474,-23.6602 -51.7595,-36.6363 -14.8342,-13.3173 -15.5681,-37.2282 -9.6343,-57.1109 4.1461,-16.1885 13.0799,-39.1769 14.8082,-46.3379 4.4695,-26.0616 2.6444,-28.9902 2.3838,-51.8805 -0.4952,-9.0998 -1.734,-13.8082 1.1824,-20.8818 4.2196,-4.4031 10.2684,-5.6178 16.8947,-3.5958 8.9415,4.4959 13.2466,3.6501 14.1668,1.2553 -7.5576,-27.932 -53.942,-48.0228 -78.3797,-41.9076 -16.1437,-2.8597 -36.5044,-0.5062 -51.168,3.3062 -27.38,8.3304 -47.6638,16.6447 -69.2986,28.0698 -18.5469,11.8969 -33.859,23.1233 -59.9307,20.6264 -20.7896,-2.3142 -31.6988,-9.0623 -41.6715,-19.0965 -56.0504,-50.7396 -93.9825,-118.0556 -151.5659,-156.0158 -262.1276,-63.1428 -498.6955,-76.6351 -750.4662,-51.7887 z m 264.0305,56.417 c 159.9113,-19.9667 324.5729,-23.2472 469.4073,22.8454 43.1939,46.7812 71.7193,96.7697 107.654,148.3676 16.0067,29.5418 26.2196,49.2028 13.7029,77.9678 -43.0219,67.1498 -89.9084,147.925 -130.1207,224.3075 2.3444,33.8873 -173.2045,-190.0312 -222.8195,-218.8444 -151.0521,-85.8808 -164.3419,-68.086 -391.3982,-204.1467 -13.2274,-9.3868 -25.7352,-24.6771 43.9285,-34.4096 36.0945,-5.9832 72.7431,-11.4799 109.6457,-16.0876 z m 869.1232,128.3286 c 6.0803,-0.6956 16.5846,-0.1211 29.4077,8.7091 -5.0815,5.5993 -3.3648,11.7192 -1.8377,17.9811 -14.0341,-6.0056 -28.6087,7.7408 -50.1267,11.4647 18.6917,-6.7253 26.7702,-18.3786 18.0302,-37.2941 0.9662,-0.2556 2.4998,-0.629 4.5265,-0.8608 z m -41.1628,13.7131 c 6.9488,0.6361 4.5155,0.3006 9.3643,3.1379 -6.3991,11.9879 -12.9412,18.4014 -24.6018,17.6064 -9.7285,-0.6954 -13.0845,-5.4165 -19.6897,-12.5944 l 8.6041,-2.1074 c 8.666,18.6462 27.6935,10.266 28.1142,0.4182 -0.721,-5.051 -1.7911,-6.4607 -1.7911,-6.4607 z m -78.4439,38.8134 c 15.5839,-2.1115 35.9956,22.192 31.2327,39.708 29.7288,17.9783 43.4401,-7.0169 59.6827,-20.6609 33.5569,-24.2906 43.1726,-22.9036 55.2037,-22.5371 2.3616,26.9868 -0.3589,55.3656 -16.2096,95.3546 -21.3966,108.611 -67.2419,153.814 -114.2861,203.297 -95.4006,102.3124 -194.4115,197.3584 -306.3666,282.9392 -23.814,16.5585 -42.3253,26.3784 -64.1697,18.4767 -1.9597,-33.7382 7.4207,-64.4014 20.1406,-99.9422 25.769,-60.4901 52.0083,-117.3891 74.0673,-181.1438 57.2573,-136.022 107.5282,-191.7775 159.3703,-248.0693 27.2496,-23.9096 35.7193,-33.3759 44.6733,-34.3692 10.7218,12.4703 45.5714,17.6662 48.7409,12.6162 -7.1769,-2.2219 -8.0167,-5.4195 -8.452,-11.316 0.4076,-23.6723 7.6303,-33.1687 16.3725,-34.3532 z m 161.1188,237.8463 c 28.0024,8.7342 81.7988,43.2495 136.4539,65.5957 121.0474,197.8343 157.6045,459.3213 163.2438,599.3057 -0.1232,44.4924 -5.4683,37.3925 -20.2029,29.7605 -162.1516,-106.6331 -256.5636,-276.941 -379.4814,-391.6809 -75.8563,-44.5235 -158.3274,-60.1941 -179.4496,-82.2076 123.4449,-106.0988 217.8761,-193.9501 279.4362,-220.7734 z m -496.583,210.049 c 4.885,-0.4003 -1.9247,16.0829 -4.7542,22.7708 -16.4841,35.7763 -24.246,76.6615 -34.9148,114.3483 -7.0672,21.3877 -17.8468,29.2058 -28.4427,27.8974 -12.1031,-2.3877 -31.3177,-18.522 -22.597,-36.0457 25.7669,-39.0258 46.7247,-85.1813 81.3436,-121.9547 4.8078,-4.8737 7.7367,-6.8826 9.3651,-7.0161 z m 38.113,151.7084 c 11.9834,-1.4948 -49.4683,53.1241 -64.7175,60.0388 -19.8565,-17.9957 24.4173,-39.2974 39.2585,-46.2391 14.5789,-9.3925 22.4044,-13.4187 25.459,-13.7997 z m -165.3916,25.3968 c 6.2934,17.5559 22.1194,24.4918 32.2983,30.1967 -6.1257,8.0037 -10.354,13.264 -17.1683,19.1868 -12.387,-6.7117 -23.4968,-11.0497 -30.9995,-25.4367 5.4321,-10.2873 9.3252,-15.998 15.8695,-23.9468 z m -34.948,52.7684 c 6.4811,9.3107 17.3246,20.1472 27.5938,24.7844 -3.8276,5.7796 -7.9643,12.0472 -13.7468,16.844 -11.5716,-4.3951 -23.5249,-15.7268 -28.3888,-22.8783 4.5122,-8.5268 10.5423,-16.0767 14.5418,-18.7501 z m 92.1855,-3.0753 c 7.3777,14.2244 15.8534,16.7713 21.3392,20.0977 -3.0992,4.2721 -5.3618,9.0567 -14.7873,15.6298 -5.0433,-1.0176 -16.7497,-10.7206 -20.4317,-19.5184 5.8006,-8.7454 8.2719,-10.266 13.8798,-16.2091 z m -39.8805,46.894 c 4.8069,9.4466 11.117,16.4588 20.6656,19.8361 -3.8242,7.8868 -6.8513,10.4991 -12.5394,14.4171 -3.4977,-2.1856 -11.9327,-6.6504 -20.8518,-18.6286 5.2785,-7.6273 7.8258,-10.0848 12.7256,-15.6246 z m -94.3688,23.5625 c 12.6327,22.0171 35.8732,34.3814 56.5276,51.9881 -2.6202,1.9653 -2.9157,8.0504 -7.6367,8.7204 -19.313,-9.8515 -40.5709,-24.8798 -55.6173,-49.3193 2.7544,-5.2895 2.9364,-6.7685 6.7264,-11.3892 z"
+             id="rect1188" /><path
+             inkscape:connector-curvature="0"
+             style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.29999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             d="m 5615.2719,3031.0101 c 0.075,-1.2289 0.6651,-4.6992 2.7475,-4.0926 2.2666,1.5467 3.7201,3.9506 4.3543,7.8539 0.2282,1.9516 0.2476,3.5697 -2.5883,1.3807 -1.4708,-1.3462 -2.0008,-1.608 -4.5135,-5.142 z"
+             id="path1103-2" /></g><g
+           id="g1073"
+           style="fill:#ffffff;fill-opacity:1"><text
+   x="-328.33817"
+   y="3852.1226"
+   style="font-weight:700;font-size:937.5px;font-family:KannadaMN-Bold, 'Kannada MN';fill:#ffffff;fill-opacity:1;stroke-width:1.5625"
+   id="text907"><tspan
+     style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';fill:#ffffff;fill-opacity:1"
+     id="tspan962"
+     dx="0 0.34 -6.75 -2.0699999 2.4099996 -21.060011">GROMACS</tspan></text>
+
+
+<text
+   x="-255.0177"
+   y="3008.4934"
+   style="font-size:375px;font-family:KannadaMN, 'Kannada MN';fill:#ffffff;fill-opacity:1;stroke-width:1.5625"
+   id="text915"><tspan
+     id="tspan840"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';word-spacing:-0.01px;fill:#ffffff;fill-opacity:1"
+     dx="-4.2299995">FAST.  FLEXIBLE.  FREE.</tspan><tspan
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';word-spacing:-0.01px;fill:#ffffff;fill-opacity:1;stroke-width:1.5625"
+     x="-81.250793"
+     y="3008.4934"
+     id="tspan911" /></text>
+
+
+</g></g></g></g><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.03704604;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 4039.5085,-1228.8879 c 14.7955,-26.0805 30.1415,-54.98 41.768,-78.6574 6.3295,-12.8899 7.2866,-14.928 7.1144,-15.1498 -0.4357,-0.5613 -6.5497,-7.7703 -8.9122,-10.5083 -19.9386,-23.1076 -43.0918,-47.9255 -72.0024,-77.1792 l -5.1867,-5.2482 0.4811,-0.039 c 0.59,-0.048 -0.4107,-1.009 9.6881,9.3014 34.1045,34.8188 56.8517,58.9577 68.2493,72.4245 3.7434,4.423 9.4939,11.9094 9.3811,12.2129 -0.078,0.2092 -14.7241,28.4968 -19.731,38.108 -8.7207,16.7399 -16.8182,31.786 -26.3009,48.8699 l -3.9583,7.1313 h -0.6543 -0.6542 z"
+     id="path1020"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d=""
+     id="path1022"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d=""
+     id="path1024"
+     inkscape:connector-curvature="0" /><path
+     style="opacity:1;fill:#00ffff;fill-opacity:1;stroke:#000000;stroke-width:0.01852302;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     d="m 4089.8968,-1322.132 c -0.1106,-0.1908 -0.1903,-0.3578 -0.1771,-0.371 0.034,-0.034 0.471,0.5714 0.471,0.6538 0,0.1471 -0.1009,0.05 -0.2939,-0.2828 z"
+     id="path1028"
+     inkscape:connector-curvature="0" /></g>
+<flowRoot
+   xml:space="preserve"
+   id="flowRoot27"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;line-height:1.25;font-family:KannadaMN-Bold, 'Kannada MN';-inkscape-font-specification:'KannadaMN-Bold, Kannada MN';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
+     id="flowRegion29"><rect
+       id="rect31"
+       width="2827.7173"
+       height="480.60019"
+       x="435.89319"
+       y="-1055.199" /></flowRegion><flowPara
+     id="flowPara33" /></flowRoot><flowRoot
+   xml:space="preserve"
+   id="flowRoot1713"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:KannadaMN-Bold, 'Kannada MN';-inkscape-font-specification:'KannadaMN-Bold, Kannada MN';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
+     id="flowRegion1715"><rect
+       id="rect1717"
+       width="829.83124"
+       height="284.51358"
+       x="1311.9237"
+       y="1882.0675" /></flowRegion><flowPara
+     id="flowPara1719" /></flowRoot></svg>
\ No newline at end of file
index 9dcd4d4b62f94bd51a6741f1c9f48a66763ea810..3233975edd29961ddf89df0d8aa7279844df6733 100644 (file)
@@ -47,11 +47,20 @@ where the pathway is controlled by a single :math:`\lambda` variable,
 can be preserved by using only ``fep-lambdas`` to define the
 pathway.
 
-For example, if you wanted to first to change the Coulombic terms, then
+
+.. _figlambdaval:
+
+.. figure:: plots/lambda-values.*
+   :width: 12.00000cm
+
+   Separate :math:`\lambda` values for Coulomb, van-der-Waals and restraint interactions.
+
+:numref:`Fig. %s <figlambdaval>` shows an example of different lambda arrays.
+There, first the Coulombic terms are reduced, then
 the van der Waals terms, changing bonded at the same time rate as the
 van der Waals, but changing the restraints throughout the first
-two-thirds of the simulation, then you could use this :math:`\lambda`
-vector:
+two-thirds of the simulation. The corresponding :math:`\lambda`
+vector is given here:
 
 ::
 
diff --git a/docs/reference-manual/special/plots/lambda-values.pdf b/docs/reference-manual/special/plots/lambda-values.pdf
new file mode 100644 (file)
index 0000000..c36c635
Binary files /dev/null and b/docs/reference-manual/special/plots/lambda-values.pdf differ
diff --git a/docs/reference-manual/special/plots/lambda-values.svg b/docs/reference-manual/special/plots/lambda-values.svg
new file mode 100644 (file)
index 0000000..90bdcd1
--- /dev/null
@@ -0,0 +1,6057 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="1074.324pt"
+   version="1.1"
+   viewBox="0 0 1291.1736 1074.3239"
+   width="1291.1736pt"
+   id="svg482"
+   sodipodi:docname="lambda-manual.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata486">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1053"
+     id="namedview484"
+     showgrid="false"
+     inkscape:zoom="0.51097605"
+     inkscape:cx="721.32427"
+     inkscape:cy="561.92548"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="axes_1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <defs
+     id="defs4"
+     style="stroke-linecap:butt;stroke-linejoin:round">
+    <linearGradient
+       id="linearGradient18649"
+       inkscape:collect="always">
+      <stop
+         id="stop18645"
+         offset="0"
+         style="stop-color:#3c4ec2;stop-opacity:1" />
+      <stop
+         style="stop-color:#8fb1fe;stop-opacity:1"
+         offset="0.25890335"
+         id="stop18657" />
+      <stop
+         style="stop-color:#dedcdb;stop-opacity:1"
+         offset="0.51153308"
+         id="stop18655" />
+      <stop
+         id="stop18659"
+         offset="0.75208056"
+         style="stop-color:#f39577;stop-opacity:1" />
+      <stop
+         id="stop18647"
+         offset="1"
+         style="stop-color:#b40426;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient18618-0">
+      <stop
+         style="stop-color:#3c4ec2;stop-opacity:1"
+         offset="0"
+         id="stop18614" />
+      <stop
+         style="stop-color:#b40426;stop-opacity:1"
+         offset="1"
+         id="stop18616" />
+    </linearGradient>
+    <style
+       type="text/css"
+       id="style2">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+  </style>
+    <clipPath
+       id="pd0b2b36a21"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect8776"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10776"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10774"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10780"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10778"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10784"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10782"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10788"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10786"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10792"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10790"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10796"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10794"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10800"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10798"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10804"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10802"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10808"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10806"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath10812"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect10810"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <path
+       inkscape:connector-curvature="0"
+       d="M 0,0 V 12"
+       id="mb151bf601d"
+       style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 4.15625,35.296875 q 0,12.703125 2.609375,20.4375 2.609375,7.75 7.75,11.9375 5.15625,4.203125 12.96875,4.203125 5.765625,0 10.109375,-2.328125 4.34375,-2.3125 7.171875,-6.6875 Q 47.609375,58.5 49.21875,52.21875 q 1.609375,-6.265625 1.609375,-16.921875 0,-12.59375 -2.59375,-20.328125 Q 45.65625,7.234375 40.5,3 35.359375,-1.21875 27.484375,-1.21875 q -10.34375,0 -16.25,7.421875 -7.078125,8.9375 -7.078125,29.09375 z m 9.03125,0 q 0,-17.625 4.125,-23.46875 Q 21.4375,6 27.484375,6 q 6.0625,0 10.1875,5.859375 4.125,5.859375 4.125,23.4375 0,17.6875 -4.125,23.484375 -4.125,5.8125 -10.28125,5.8125 -6.046875,0 -9.671875,-5.125 Q 13.1875,52.9375 13.1875,35.296875 Z"
+       id="ArialMT-48-9"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 9.078125,0 V 10.015625 H 19.09375 V 0 Z"
+       id="ArialMT-46-1"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 50.34375,8.453125 V 0 H 3.03125 Q 2.9375,3.171875 4.046875,6.109375 5.859375,10.9375 9.828125,15.625 13.8125,20.3125 21.34375,26.46875 q 11.671875,9.5625 15.765625,15.15625 4.109375,5.59375 4.109375,10.578125 0,5.21875 -3.75,8.796875 -3.734375,3.59375 -9.734375,3.59375 -6.34375,0 -10.15625,-3.8125 Q 13.765625,56.984375 13.71875,50.25 L 4.6875,51.171875 q 0.921875,10.109375 6.96875,15.40625 6.0625,5.296875 16.28125,5.296875 10.296875,0 16.296875,-5.71875 Q 50.25,60.453125 50.25,52 50.25,47.703125 48.484375,43.546875 46.734375,39.40625 42.65625,34.8125 38.578125,30.21875 29.109375,22.21875 21.1875,15.578125 18.9375,13.203125 q -2.234375,-2.359375 -3.703125,-4.75 z"
+       id="ArialMT-50-9"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 32.328125,0 v 17.140625 h -31.0625 v 8.0625 l 32.671875,46.375 h 7.171875 v -46.375 h 9.671875 v -8.0625 H 41.109375 V 0 Z m 0,25.203125 V 57.46875 L 9.90625,25.203125 Z"
+       id="ArialMT-52-6"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 49.75,54.046875 41.015625,53.375 q -1.171875,5.171875 -3.3125,7.515625 -3.578125,3.765625 -8.796875,3.765625 -4.203125,0 -7.375,-2.34375 Q 17.390625,59.28125 14.984375,53.46875 12.59375,47.65625 12.5,36.921875 15.671875,41.75 20.265625,44.09375 q 4.59375,2.34375 9.625,2.34375 8.78125,0 14.953125,-6.46875 Q 51.03125,33.5 51.03125,23.25 51.03125,16.5 48.125,10.71875 45.21875,4.9375 40.140625,1.859375 35.0625,-1.21875 28.609375,-1.21875 17.625,-1.21875 10.6875,6.859375 3.765625,14.9375 3.765625,33.5 q 0,20.75 7.65625,30.171875 6.6875,8.203125 18.015625,8.203125 8.453125,0 13.84375,-4.734375 Q 48.6875,62.40625 49.75,54.046875 Z M 13.875,23.1875 q 0,-4.53125 1.921875,-8.6875 Q 17.71875,10.359375 21.1875,8.171875 24.65625,6 28.46875,6 q 5.5625,0 9.5625,4.484375 4.015625,4.5 4.015625,12.21875 0,7.421875 -3.96875,11.6875 -3.953125,4.28125 -9.953125,4.28125 -5.953125,0 -10.109375,-4.28125 Q 13.875,30.125 13.875,23.1875 Z"
+       id="ArialMT-54-8"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 17.671875,38.8125 q -5.46875,2.015625 -8.109375,5.71875 -2.625,3.71875 -2.625,8.890625 0,7.8125 5.609375,13.125 5.625,5.328125 14.9375,5.328125 9.375,0 15.09375,-5.453125 5.71875,-5.4375 5.71875,-13.25 0,-4.984375 -2.625,-8.671875 Q 43.0625,40.828125 37.75,38.8125 q 6.59375,-2.140625 10.03125,-6.9375 3.4375,-4.78125 3.4375,-11.421875 0,-9.171875 -6.5,-15.421875 -6.484375,-6.25 -17.078125,-6.25 -10.59375,0 -17.09375,6.265625 -6.5,6.28125 -6.5,15.65625 0,6.984375 3.546875,11.6875 3.546875,4.71875 10.078125,6.421875 z m -1.75,14.90625 q 0,-5.078125 3.265625,-8.3125 3.28125,-3.21875 8.5,-3.21875 5.078125,0 8.328125,3.1875 3.25,3.203125 3.25,7.84375 0,4.84375 -3.359375,8.140625 -3.34375,3.296875 -8.3125,3.296875 -5.03125,0 -8.359375,-3.234375 -3.3125,-3.21875 -3.3125,-7.703125 z M 13.09375,20.65625 q 0,-3.765625 1.78125,-7.28125 Q 16.65625,9.859375 20.171875,7.921875 23.6875,6 27.734375,6 34.03125,6 38.125,10.046875 q 4.109375,4.0625 4.109375,10.3125 0,6.34375 -4.21875,10.5 -4.21875,4.15625 -10.578125,4.15625 -6.203125,0 -10.28125,-4.109375 -4.0625,-4.09375 -4.0625,-10.25 z"
+       id="ArialMT-56-0"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 37.25,0 h -8.78125 v 56 q -3.171875,-3.015625 -8.328125,-6.046875 -5.15625,-3.03125 -9.25,-4.546875 v 8.5 q 7.375,3.46875 12.890625,8.390625 5.515625,4.9375 7.8125,9.578125 H 37.25 Z"
+       id="ArialMT-49-5"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 40.4375,19 8.640625,-1.125 Q 47.65625,8.9375 41.8125,3.875 35.984375,-1.171875 27.484375,-1.171875 16.84375,-1.171875 10.375,5.78125 3.90625,12.75 3.90625,25.734375 q 0,8.390625 2.78125,14.6875 2.78125,6.3125 8.46875,9.453125 5.6875,3.15625 12.390625,3.15625 8.4375,0 13.8125,-4.28125 5.375,-4.265625 6.890625,-12.125 l -8.546875,-1.328125 q -1.21875,5.234375 -4.328125,7.859375 -3.09375,2.640625 -7.5,2.640625 -6.640625,0 -10.796875,-4.765625 -4.140625,-4.75 -4.140625,-15.046875 0,-10.453125 4,-15.1875 Q 20.953125,6.0625 27.390625,6.0625 32.5625,6.0625 36.03125,9.234375 39.5,12.40625 40.4375,19 Z"
+       id="ArialMT-99-2"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 3.328125,25.921875 q 0,14.40625 8,21.34375 6.6875,5.765625 16.3125,5.765625 10.6875,0 17.46875,-7.015625 6.796875,-7 6.796875,-19.359375 0,-10 -3,-15.75 -3,-5.734375 -8.75,-8.90625 Q 34.421875,-1.171875 27.640625,-1.171875 16.75,-1.171875 10.03125,5.8125 3.328125,12.796875 3.328125,25.921875 Z m 9.03125,0 q 0,-9.953125 4.34375,-14.90625 4.34375,-4.953125 10.9375,-4.953125 6.546875,0 10.890625,4.96875 4.34375,4.984375 4.34375,15.1875 0,9.625 -4.375,14.578125 Q 34.125,45.75 27.640625,45.75 q -6.59375,0 -10.9375,-4.9375 -4.34375,-4.921875 -4.34375,-14.890625 z"
+       id="ArialMT-111-2"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 40.578125,0 v 7.625 q -6.0625,-8.796875 -16.453125,-8.796875 -4.59375,0 -8.578125,1.75 Q 11.578125,2.34375 9.640625,5 7.71875,7.671875 6.9375,11.53125 6.390625,14.109375 6.390625,19.734375 v 32.125 H 15.1875 V 23.09375 q 0,-6.875 0.53125,-9.28125 0.828125,-3.453125 3.515625,-5.4375 2.6875,-1.984375 6.640625,-1.984375 3.953125,0 7.421875,2.03125 3.46875,2.03125 4.90625,5.515625 1.453125,3.5 1.453125,10.140625 v 27.78125 H 48.4375 V 0 Z"
+       id="ArialMT-117-8"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 6.390625,0 V 71.578125 H 15.1875 V 0 Z"
+       id="ArialMT-108-9"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 6.59375,0 v 51.859375 h 7.859375 v -7.28125 q 2.4375,3.8125 6.484375,6.125 4.0625,2.328125 9.234375,2.328125 5.765625,0 9.453125,-2.390625 3.6875,-2.390625 5.203125,-6.6875 6.15625,9.078125 16.015625,9.078125 7.71875,0 11.859375,-4.28125 4.15625,-4.265625 4.15625,-13.15625 V 0 h -8.75 v 32.671875 q 0,5.265625 -0.859375,7.578125 -0.84375,2.328125 -3.09375,3.734375 -2.234375,1.421875 -5.265625,1.421875 -5.46875,0 -9.09375,-3.640625 Q 46.1875,38.140625 46.1875,30.125 V 0 h -8.78125 v 33.6875 q 0,5.859375 -2.15625,8.78125 -2.140625,2.9375 -7.03125,2.9375 -3.703125,0 -6.859375,-1.953125 Q 18.21875,41.5 16.796875,37.734375 15.375,33.984375 15.375,26.90625 V 0 Z"
+       id="ArialMT-109-7"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 14.703125,0 h -8.15625 v 71.578125 h 8.78125 v -25.53125 q 5.578125,6.984375 14.21875,6.984375 4.78125,0 9.046875,-1.9375 Q 42.875,49.171875 45.625,45.671875 48.390625,42.1875 49.953125,37.25 q 1.5625,-4.921875 1.5625,-10.546875 0,-13.328125 -6.59375,-20.609375 -6.59375,-7.265625 -15.8125,-7.265625 -9.1875,0 -14.40625,7.671875 z M 14.59375,26.3125 Q 14.59375,17 17.140625,12.84375 21.296875,6.0625 28.375,6.0625 q 5.75,0 9.953125,5 4.203125,5 4.203125,14.921875 0,10.15625 -4.03125,14.984375 -4.03125,4.828125 -9.734375,4.828125 -5.765625,0 -9.96875,-5 -4.203125,-5 -4.203125,-14.484375 z"
+       id="ArialMT-98-3"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 0,0 H -12"
+       id="m6aa5d295c1"
+       style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 6.5,0 v 51.859375 h 7.90625 V 44 Q 17.4375,49.515625 20,51.265625 q 2.5625,1.765625 5.640625,1.765625 4.4375,0 9.03125,-2.828125 l -3.03125,-8.15625 q -3.21875,1.90625 -6.4375,1.90625 -2.890625,0 -5.1875,-1.734375 -2.296875,-1.734375 -3.265625,-4.8125 -1.46875,-4.6875 -1.46875,-10.25 V 0 Z"
+       id="ArialMT-114-0"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 42.09375,16.703125 9.078125,-1.125 Q 49.03125,7.625 43.21875,3.21875 37.40625,-1.171875 28.375,-1.171875 q -11.375,0 -18.046875,7 -6.671875,7.015625 -6.671875,19.65625 0,13.09375 6.734375,20.3125 6.75,7.234375 17.484375,7.234375 10.40625,0 17,-7.078125 6.59375,-7.078125 6.59375,-19.921875 0,-0.78125 -0.04687,-2.34375 H 12.75 q 0.484375,-8.546875 4.828125,-13.09375 4.34375,-4.53125 10.84375,-4.53125 4.828125,0 8.25,2.53125 3.421875,2.546875 5.421875,8.109375 z M 13.234375,30.90625 H 42.1875 q -0.578125,6.546875 -3.3125,9.8125 -4.203125,5.078125 -10.890625,5.078125 -6.0625,0 -10.1875,-4.046875 -4.125,-4.046875 -4.5625,-10.84375 z"
+       id="ArialMT-101-6"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 3.078125,15.484375 8.6875,1.359375 Q 12.5,11.625 15.84375,8.84375 19.1875,6.0625 25.203125,6.0625 q 6.046875,0 8.96875,2.453125 2.9375,2.46875 2.9375,5.796875 0,2.96875 -2.59375,4.6875 Q 32.71875,20.171875 25.53125,21.96875 15.875,24.421875 12.140625,26.203125 8.40625,27.984375 6.46875,31.125 q -1.921875,3.15625 -1.921875,6.96875 0,3.453125 1.578125,6.40625 1.59375,2.96875 4.328125,4.921875 2.046875,1.5 5.578125,2.546875 3.546875,1.0625 7.609375,1.0625 6.09375,0 10.703125,-1.765625 4.625,-1.75 6.8125,-4.765625 2.203125,-3 3.03125,-8.015625 L 35.59375,37.3125 q -0.578125,4 -3.390625,6.234375 -2.8125,2.25 -7.9375,2.25 -6.046875,0 -8.640625,-2 -2.59375,-2 -2.59375,-4.6875 0,-1.703125 1.078125,-3.078125 1.078125,-1.40625 3.375,-2.34375 1.3125,-0.484375 7.765625,-2.234375 9.328125,-2.5 13,-4.09375 3.6875,-1.578125 5.78125,-4.609375 2.109375,-3.015625 2.109375,-7.515625 0,-4.390625 -2.5625,-8.28125 -2.5625,-3.875 -7.40625,-6 -4.828125,-2.125 -10.921875,-2.125 -10.109375,0 -15.40625,4.203125 -5.296875,4.203125 -6.765625,12.453125 z"
+       id="ArialMT-115-1"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 25.78125,7.859375 27.046875,0.09375 Q 23.34375,-0.6875 20.40625,-0.6875 15.625,-0.6875 12.984375,0.828125 10.359375,2.34375 9.28125,4.8125 8.203125,7.28125 8.203125,15.1875 v 29.828125 h -6.4375 v 6.84375 h 6.4375 v 12.84375 L 16.9375,69.96875 V 51.859375 h 8.84375 v -6.84375 H 16.9375 v -30.3125 q 0,-3.765625 0.46875,-4.84375 0.46875,-1.0625 1.515625,-1.703125 1.046875,-0.640625 3,-0.640625 1.46875,0 3.859375,0.34375 z"
+       id="ArialMT-116-5"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 40.4375,6.390625 Q 35.546875,2.25 31.03125,0.53125 q -4.515625,-1.703125 -9.6875,-1.703125 -8.546875,0 -13.140625,4.171875 -4.59375,4.171875 -4.59375,10.671875 0,3.8125 1.734375,6.953125 1.734375,3.15625 4.546875,5.0625 2.8125,1.90625 6.328125,2.875 2.578125,0.6875 7.8125,1.328125 10.640625,1.265625 15.671875,3.015625 0.04687,1.8125 0.04687,2.296875 0,5.375 -2.5,7.578125 -3.359375,2.96875 -10,2.96875 -6.203125,0 -9.15625,-2.171875 -2.953125,-2.171875 -4.375,-7.6875 L 5.125,37.0625 q 1.171875,5.515625 3.859375,8.90625 2.6875,3.390625 7.765625,5.21875 5.078125,1.84375 11.765625,1.84375 6.640625,0 10.78125,-1.5625 4.15625,-1.5625 6.109375,-3.9375 1.953125,-2.359375 2.734375,-5.984375 0.4375,-2.234375 0.4375,-8.09375 v -11.71875 q 0,-12.265625 0.5625,-15.515625 Q 49.703125,2.984375 51.375,0 h -9.1875 q -1.359375,2.734375 -1.75,6.390625 z M 39.703125,26.03125 Q 34.90625,24.078125 25.34375,22.703125 19.921875,21.921875 17.671875,20.9375 15.4375,19.96875 14.203125,18.09375 q -1.21875,-1.875 -1.21875,-4.171875 0,-3.515625 2.65625,-5.859375 2.671875,-2.34375 7.796875,-2.34375 5.078125,0 9.03125,2.21875 3.953125,2.21875 5.8125,6.078125 1.421875,2.984375 1.421875,8.78125 z"
+       id="ArialMT-97-5"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 6.640625,61.46875 V 71.578125 H 15.4375 V 61.46875 Z M 6.640625,0 V 51.859375 H 15.4375 V 0 Z"
+       id="ArialMT-105-4"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 6.59375,0 V 51.859375 H 14.5 v -7.375 q 5.71875,8.546875 16.5,8.546875 4.6875,0 8.625,-1.6875 3.9375,-1.6875 5.890625,-4.421875 Q 47.46875,44.1875 48.25,40.4375 48.734375,37.984375 48.734375,31.890625 V 0 H 39.9375 v 31.546875 q 0,5.375 -1.03125,8.03125 -1.015625,2.65625 -3.625,4.234375 -2.609375,1.59375 -6.125,1.59375 -5.625,0 -9.703125,-3.5625 Q 15.375,38.28125 15.375,28.328125 V 0 Z"
+       id="ArialMT-110-7"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 0,11.18034 c 2.965061,0 5.80908,-1.178031 7.905694,-3.274646 C 10.002309,5.80908 11.18034,2.965061 11.18034,0 c 0,-2.965061 -1.178031,-5.80908 -3.274646,-7.905694 C 5.80908,-10.002309 2.965061,-11.18034 0,-11.18034 c -2.965061,0 -5.80908,1.178031 -7.905694,3.274646 C -10.002309,-5.80908 -11.18034,-2.965061 -11.18034,0 c 0,2.965061 1.178031,5.80908 3.274646,7.905694 C -5.80908,10.002309 -2.965061,11.18034 0,11.18034 Z"
+       id="C0_0_77f4bb5082"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <clipPath
+       id="p926a99d168"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect9124"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11511"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11509"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11515"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11513"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11519"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11517"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11523"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11521"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11527"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11525"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11531"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11529"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11535"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11533"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11539"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11537"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11543"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11541"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath11547"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="543.59998"
+         x="97.199997"
+         y="86.400002"
+         id="rect11545"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <path
+       inkscape:connector-curvature="0"
+       d="M 0,0 V 12"
+       id="md5c0e90bf0"
+       style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 4.15625,35.296875 q 0,12.703125 2.609375,20.4375 2.609375,7.75 7.75,11.9375 5.15625,4.203125 12.96875,4.203125 5.765625,0 10.109375,-2.328125 4.34375,-2.3125 7.171875,-6.6875 Q 47.609375,58.5 49.21875,52.21875 q 1.609375,-6.265625 1.609375,-16.921875 0,-12.59375 -2.59375,-20.328125 Q 45.65625,7.234375 40.5,3 35.359375,-1.21875 27.484375,-1.21875 q -10.34375,0 -16.25,7.421875 -7.078125,8.9375 -7.078125,29.09375 z m 9.03125,0 q 0,-17.625 4.125,-23.46875 Q 21.4375,6 27.484375,6 q 6.0625,0 10.1875,5.859375 4.125,5.859375 4.125,23.4375 0,17.6875 -4.125,23.484375 -4.125,5.8125 -10.28125,5.8125 -6.046875,0 -9.671875,-5.125 Q 13.1875,52.9375 13.1875,35.296875 Z"
+       id="ArialMT-48-4"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 9.078125,0 V 10.015625 H 19.09375 V 0 Z"
+       id="ArialMT-46-3"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 50.34375,8.453125 V 0 H 3.03125 Q 2.9375,3.171875 4.046875,6.109375 5.859375,10.9375 9.828125,15.625 13.8125,20.3125 21.34375,26.46875 q 11.671875,9.5625 15.765625,15.15625 4.109375,5.59375 4.109375,10.578125 0,5.21875 -3.75,8.796875 -3.734375,3.59375 -9.734375,3.59375 -6.34375,0 -10.15625,-3.8125 Q 13.765625,56.984375 13.71875,50.25 L 4.6875,51.171875 q 0.921875,10.109375 6.96875,15.40625 6.0625,5.296875 16.28125,5.296875 10.296875,0 16.296875,-5.71875 Q 50.25,60.453125 50.25,52 50.25,47.703125 48.484375,43.546875 46.734375,39.40625 42.65625,34.8125 38.578125,30.21875 29.109375,22.21875 21.1875,15.578125 18.9375,13.203125 q -2.234375,-2.359375 -3.703125,-4.75 z"
+       id="ArialMT-50-8"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 32.328125,0 v 17.140625 h -31.0625 v 8.0625 l 32.671875,46.375 h 7.171875 v -46.375 h 9.671875 v -8.0625 H 41.109375 V 0 Z m 0,25.203125 V 57.46875 L 9.90625,25.203125 Z"
+       id="ArialMT-52-1"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 49.75,54.046875 41.015625,53.375 q -1.171875,5.171875 -3.3125,7.515625 -3.578125,3.765625 -8.796875,3.765625 -4.203125,0 -7.375,-2.34375 Q 17.390625,59.28125 14.984375,53.46875 12.59375,47.65625 12.5,36.921875 15.671875,41.75 20.265625,44.09375 q 4.59375,2.34375 9.625,2.34375 8.78125,0 14.953125,-6.46875 Q 51.03125,33.5 51.03125,23.25 51.03125,16.5 48.125,10.71875 45.21875,4.9375 40.140625,1.859375 35.0625,-1.21875 28.609375,-1.21875 17.625,-1.21875 10.6875,6.859375 3.765625,14.9375 3.765625,33.5 q 0,20.75 7.65625,30.171875 6.6875,8.203125 18.015625,8.203125 8.453125,0 13.84375,-4.734375 Q 48.6875,62.40625 49.75,54.046875 Z M 13.875,23.1875 q 0,-4.53125 1.921875,-8.6875 Q 17.71875,10.359375 21.1875,8.171875 24.65625,6 28.46875,6 q 5.5625,0 9.5625,4.484375 4.015625,4.5 4.015625,12.21875 0,7.421875 -3.96875,11.6875 -3.953125,4.28125 -9.953125,4.28125 -5.953125,0 -10.109375,-4.28125 Q 13.875,30.125 13.875,23.1875 Z"
+       id="ArialMT-54-0"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 17.671875,38.8125 q -5.46875,2.015625 -8.109375,5.71875 -2.625,3.71875 -2.625,8.890625 0,7.8125 5.609375,13.125 5.625,5.328125 14.9375,5.328125 9.375,0 15.09375,-5.453125 5.71875,-5.4375 5.71875,-13.25 0,-4.984375 -2.625,-8.671875 Q 43.0625,40.828125 37.75,38.8125 q 6.59375,-2.140625 10.03125,-6.9375 3.4375,-4.78125 3.4375,-11.421875 0,-9.171875 -6.5,-15.421875 -6.484375,-6.25 -17.078125,-6.25 -10.59375,0 -17.09375,6.265625 -6.5,6.28125 -6.5,15.65625 0,6.984375 3.546875,11.6875 3.546875,4.71875 10.078125,6.421875 z m -1.75,14.90625 q 0,-5.078125 3.265625,-8.3125 3.28125,-3.21875 8.5,-3.21875 5.078125,0 8.328125,3.1875 3.25,3.203125 3.25,7.84375 0,4.84375 -3.359375,8.140625 -3.34375,3.296875 -8.3125,3.296875 -5.03125,0 -8.359375,-3.234375 -3.3125,-3.21875 -3.3125,-7.703125 z M 13.09375,20.65625 q 0,-3.765625 1.78125,-7.28125 Q 16.65625,9.859375 20.171875,7.921875 23.6875,6 27.734375,6 34.03125,6 38.125,10.046875 q 4.109375,4.0625 4.109375,10.3125 0,6.34375 -4.21875,10.5 -4.21875,4.15625 -10.578125,4.15625 -6.203125,0 -10.28125,-4.109375 -4.0625,-4.09375 -4.0625,-10.25 z"
+       id="ArialMT-56-2"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 37.25,0 h -8.78125 v 56 q -3.171875,-3.015625 -8.328125,-6.046875 -5.15625,-3.03125 -9.25,-4.546875 v 8.5 q 7.375,3.46875 12.890625,8.390625 5.515625,4.9375 7.8125,9.578125 H 37.25 Z"
+       id="ArialMT-49-9"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 40.4375,19 8.640625,-1.125 Q 47.65625,8.9375 41.8125,3.875 35.984375,-1.171875 27.484375,-1.171875 16.84375,-1.171875 10.375,5.78125 3.90625,12.75 3.90625,25.734375 q 0,8.390625 2.78125,14.6875 2.78125,6.3125 8.46875,9.453125 5.6875,3.15625 12.390625,3.15625 8.4375,0 13.8125,-4.28125 5.375,-4.265625 6.890625,-12.125 l -8.546875,-1.328125 q -1.21875,5.234375 -4.328125,7.859375 -3.09375,2.640625 -7.5,2.640625 -6.640625,0 -10.796875,-4.765625 -4.140625,-4.75 -4.140625,-15.046875 0,-10.453125 4,-15.1875 Q 20.953125,6.0625 27.390625,6.0625 32.5625,6.0625 36.03125,9.234375 39.5,12.40625 40.4375,19 Z"
+       id="ArialMT-99-0"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 3.328125,25.921875 q 0,14.40625 8,21.34375 6.6875,5.765625 16.3125,5.765625 10.6875,0 17.46875,-7.015625 6.796875,-7 6.796875,-19.359375 0,-10 -3,-15.75 -3,-5.734375 -8.75,-8.90625 Q 34.421875,-1.171875 27.640625,-1.171875 16.75,-1.171875 10.03125,5.8125 3.328125,12.796875 3.328125,25.921875 Z m 9.03125,0 q 0,-9.953125 4.34375,-14.90625 4.34375,-4.953125 10.9375,-4.953125 6.546875,0 10.890625,4.96875 4.34375,4.984375 4.34375,15.1875 0,9.625 -4.375,14.578125 Q 34.125,45.75 27.640625,45.75 q -6.59375,0 -10.9375,-4.9375 -4.34375,-4.921875 -4.34375,-14.890625 z"
+       id="ArialMT-111-4"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 40.578125,0 v 7.625 q -6.0625,-8.796875 -16.453125,-8.796875 -4.59375,0 -8.578125,1.75 Q 11.578125,2.34375 9.640625,5 7.71875,7.671875 6.9375,11.53125 6.390625,14.109375 6.390625,19.734375 v 32.125 H 15.1875 V 23.09375 q 0,-6.875 0.53125,-9.28125 0.828125,-3.453125 3.515625,-5.4375 2.6875,-1.984375 6.640625,-1.984375 3.953125,0 7.421875,2.03125 3.46875,2.03125 4.90625,5.515625 1.453125,3.5 1.453125,10.140625 v 27.78125 H 48.4375 V 0 Z"
+       id="ArialMT-117-87"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 6.390625,0 V 71.578125 H 15.1875 V 0 Z"
+       id="ArialMT-108-1"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 6.59375,0 v 51.859375 h 7.859375 v -7.28125 q 2.4375,3.8125 6.484375,6.125 4.0625,2.328125 9.234375,2.328125 5.765625,0 9.453125,-2.390625 3.6875,-2.390625 5.203125,-6.6875 6.15625,9.078125 16.015625,9.078125 7.71875,0 11.859375,-4.28125 4.15625,-4.265625 4.15625,-13.15625 V 0 h -8.75 v 32.671875 q 0,5.265625 -0.859375,7.578125 -0.84375,2.328125 -3.09375,3.734375 -2.234375,1.421875 -5.265625,1.421875 -5.46875,0 -9.09375,-3.640625 Q 46.1875,38.140625 46.1875,30.125 V 0 h -8.78125 v 33.6875 q 0,5.859375 -2.15625,8.78125 -2.140625,2.9375 -7.03125,2.9375 -3.703125,0 -6.859375,-1.953125 Q 18.21875,41.5 16.796875,37.734375 15.375,33.984375 15.375,26.90625 V 0 Z"
+       id="ArialMT-109-72"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 14.703125,0 h -8.15625 v 71.578125 h 8.78125 v -25.53125 q 5.578125,6.984375 14.21875,6.984375 4.78125,0 9.046875,-1.9375 Q 42.875,49.171875 45.625,45.671875 48.390625,42.1875 49.953125,37.25 q 1.5625,-4.921875 1.5625,-10.546875 0,-13.328125 -6.59375,-20.609375 -6.59375,-7.265625 -15.8125,-7.265625 -9.1875,0 -14.40625,7.671875 z M 14.59375,26.3125 Q 14.59375,17 17.140625,12.84375 21.296875,6.0625 28.375,6.0625 q 5.75,0 9.953125,5 4.203125,5 4.203125,14.921875 0,10.15625 -4.03125,14.984375 -4.03125,4.828125 -9.734375,4.828125 -5.765625,0 -9.96875,-5 -4.203125,-5 -4.203125,-14.484375 z"
+       id="ArialMT-98-7"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 0,0 H -12"
+       id="md12e1c0dc4"
+       style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 21,0 1.265625,51.859375 h 9.28125 L 21.6875,20.796875 q 1.796875,-5.03125 3.3125,-10.4375 1.171875,4.09375 3.265625,9.859375 l 11.53125,31.640625 h 9.03125 L 29.203125,0 Z"
+       id="ArialMT-118-7"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 40.4375,6.390625 Q 35.546875,2.25 31.03125,0.53125 q -4.515625,-1.703125 -9.6875,-1.703125 -8.546875,0 -13.140625,4.171875 -4.59375,4.171875 -4.59375,10.671875 0,3.8125 1.734375,6.953125 1.734375,3.15625 4.546875,5.0625 2.8125,1.90625 6.328125,2.875 2.578125,0.6875 7.8125,1.328125 10.640625,1.265625 15.671875,3.015625 0.04687,1.8125 0.04687,2.296875 0,5.375 -2.5,7.578125 -3.359375,2.96875 -10,2.96875 -6.203125,0 -9.15625,-2.171875 -2.953125,-2.171875 -4.375,-7.6875 L 5.125,37.0625 q 1.171875,5.515625 3.859375,8.90625 2.6875,3.390625 7.765625,5.21875 5.078125,1.84375 11.765625,1.84375 6.640625,0 10.78125,-1.5625 4.15625,-1.5625 6.109375,-3.9375 1.953125,-2.359375 2.734375,-5.984375 0.4375,-2.234375 0.4375,-8.09375 v -11.71875 q 0,-12.265625 0.5625,-15.515625 Q 49.703125,2.984375 51.375,0 h -9.1875 q -1.359375,2.734375 -1.75,6.390625 z M 39.703125,26.03125 Q 34.90625,24.078125 25.34375,22.703125 19.921875,21.921875 17.671875,20.9375 15.4375,19.96875 14.203125,18.09375 q -1.21875,-1.875 -1.21875,-4.171875 0,-3.515625 2.65625,-5.859375 2.671875,-2.34375 7.796875,-2.34375 5.078125,0 9.03125,2.21875 3.953125,2.21875 5.8125,6.078125 1.421875,2.984375 1.421875,8.78125 z"
+       id="ArialMT-97-7"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 6.59375,0 V 51.859375 H 14.5 v -7.375 q 5.71875,8.546875 16.5,8.546875 4.6875,0 8.625,-1.6875 3.9375,-1.6875 5.890625,-4.421875 Q 47.46875,44.1875 48.25,40.4375 48.734375,37.984375 48.734375,31.890625 V 0 H 39.9375 v 31.546875 q 0,5.375 -1.03125,8.03125 -1.015625,2.65625 -3.625,4.234375 -2.609375,1.59375 -6.125,1.59375 -5.625,0 -9.703125,-3.5625 Q 15.375,38.28125 15.375,28.328125 V 0 Z"
+       id="ArialMT-110-6"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 3.171875,21.484375 v 8.84375 h 27 v -8.84375 z"
+       id="ArialMT-45-7"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 40.234375,0 v 6.546875 q -4.9375,-7.71875 -14.5,-7.71875 -6.203125,0 -11.40625,3.421875 -5.203125,3.421875 -8.0625,9.546875 -2.84375,6.125 -2.84375,14.078125 0,7.765625 2.578125,14.09375 2.59375,6.328125 7.765625,9.6875 5.1875,3.375 11.578125,3.375 4.6875,0 8.34375,-1.984375 3.671875,-1.96875 5.96875,-5.140625 v 25.671875 h 8.734375 V 0 Z m -27.78125,25.875 q 0,-9.953125 4.1875,-14.890625 Q 20.84375,6.0625 26.5625,6.0625 q 5.765625,0 9.78125,4.703125 4.03125,4.71875 4.03125,14.375 0,10.65625 -4.109375,15.625 Q 32.171875,45.75 26.171875,45.75 20.3125,45.75 16.375,40.96875 12.453125,36.1875 12.453125,25.875 Z"
+       id="ArialMT-100-3"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 42.09375,16.703125 9.078125,-1.125 Q 49.03125,7.625 43.21875,3.21875 37.40625,-1.171875 28.375,-1.171875 q -11.375,0 -18.046875,7 -6.671875,7.015625 -6.671875,19.65625 0,13.09375 6.734375,20.3125 6.75,7.234375 17.484375,7.234375 10.40625,0 17,-7.078125 6.59375,-7.078125 6.59375,-19.921875 0,-0.78125 -0.04687,-2.34375 H 12.75 q 0.484375,-8.546875 4.828125,-13.09375 4.34375,-4.53125 10.84375,-4.53125 4.828125,0 8.25,2.53125 3.421875,2.546875 5.421875,8.109375 z M 13.234375,30.90625 H 42.1875 q -0.578125,6.546875 -3.3125,9.8125 -4.203125,5.078125 -10.890625,5.078125 -6.0625,0 -10.1875,-4.046875 -4.125,-4.046875 -4.5625,-10.84375 z"
+       id="ArialMT-101-65"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 6.5,0 v 51.859375 h 7.90625 V 44 Q 17.4375,49.515625 20,51.265625 q 2.5625,1.765625 5.640625,1.765625 4.4375,0 9.03125,-2.828125 l -3.03125,-8.15625 q -3.21875,1.90625 -6.4375,1.90625 -2.890625,0 -5.1875,-1.734375 -2.296875,-1.734375 -3.265625,-4.8125 -1.46875,-4.6875 -1.46875,-10.25 V 0 Z"
+       id="ArialMT-114-6"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 20.21875,0 -19,71.578125 H 10.9375 L 21.828125,24.65625 q 1.75,-7.375 3.03125,-14.640625 2.734375,11.46875 3.21875,13.234375 l 13.625,48.328125 H 53.125 l 10.25,-36.21875 q 3.859375,-13.484375 5.578125,-25.34375 1.359375,6.78125 3.5625,15.578125 l 11.21875,45.984375 h 9.53125 L 73.640625,0 H 64.5 L 49.421875,54.546875 q -1.90625,6.828125 -2.25,8.390625 -1.125,-4.921875 -2.109375,-8.390625 L 29.890625,0 Z"
+       id="ArialMT-87-3"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 3.078125,15.484375 8.6875,1.359375 Q 12.5,11.625 15.84375,8.84375 19.1875,6.0625 25.203125,6.0625 q 6.046875,0 8.96875,2.453125 2.9375,2.46875 2.9375,5.796875 0,2.96875 -2.59375,4.6875 Q 32.71875,20.171875 25.53125,21.96875 15.875,24.421875 12.140625,26.203125 8.40625,27.984375 6.46875,31.125 q -1.921875,3.15625 -1.921875,6.96875 0,3.453125 1.578125,6.40625 1.59375,2.96875 4.328125,4.921875 2.046875,1.5 5.578125,2.546875 3.546875,1.0625 7.609375,1.0625 6.09375,0 10.703125,-1.765625 4.625,-1.75 6.8125,-4.765625 2.203125,-3 3.03125,-8.015625 L 35.59375,37.3125 q -0.578125,4 -3.390625,6.234375 -2.8125,2.25 -7.9375,2.25 -6.046875,0 -8.640625,-2 -2.59375,-2 -2.59375,-4.6875 0,-1.703125 1.078125,-3.078125 1.078125,-1.40625 3.375,-2.34375 1.3125,-0.484375 7.765625,-2.234375 9.328125,-2.5 13,-4.09375 3.6875,-1.578125 5.78125,-4.609375 2.109375,-3.015625 2.109375,-7.515625 0,-4.390625 -2.5625,-8.28125 -2.5625,-3.875 -7.40625,-6 -4.828125,-2.125 -10.921875,-2.125 -10.109375,0 -15.40625,4.203125 -5.296875,4.203125 -6.765625,12.453125 z"
+       id="ArialMT-115-9"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 0,11.18034 c 2.965061,0 5.80908,-1.178031 7.905694,-3.274646 C 10.002309,5.80908 11.18034,2.965061 11.18034,0 c 0,-2.965061 -1.178031,-5.80908 -3.274646,-7.905694 C 5.80908,-10.002309 2.965061,-11.18034 0,-11.18034 c -2.965061,0 -5.80908,1.178031 -7.905694,3.274646 C -10.002309,-5.80908 -11.18034,-2.965061 -11.18034,0 c 0,2.965061 1.178031,5.80908 3.274646,7.905694 C -5.80908,10.002309 -2.965061,11.18034 0,11.18034 Z"
+       id="C0_0_81ac4683e5"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <clipPath
+       id="p32e771b459"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect8438"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12268"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12266"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12272"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12270"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12276"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12274"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12280"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12278"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12284"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12282"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12288"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12286"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12292"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12290"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12296"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12294"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12300"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12298"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <clipPath
+       id="clipPath12304"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="558"
+         x="90"
+         y="86.400002"
+         id="rect12302"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+    <path
+       inkscape:connector-curvature="0"
+       d="M 0,0 V 12"
+       id="m1d07b8e1b7"
+       style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 4.15625,35.296875 q 0,12.703125 2.609375,20.4375 2.609375,7.75 7.75,11.9375 5.15625,4.203125 12.96875,4.203125 5.765625,0 10.109375,-2.328125 4.34375,-2.3125 7.171875,-6.6875 Q 47.609375,58.5 49.21875,52.21875 q 1.609375,-6.265625 1.609375,-16.921875 0,-12.59375 -2.59375,-20.328125 Q 45.65625,7.234375 40.5,3 35.359375,-1.21875 27.484375,-1.21875 q -10.34375,0 -16.25,7.421875 -7.078125,8.9375 -7.078125,29.09375 z m 9.03125,0 q 0,-17.625 4.125,-23.46875 Q 21.4375,6 27.484375,6 q 6.0625,0 10.1875,5.859375 4.125,5.859375 4.125,23.4375 0,17.6875 -4.125,23.484375 -4.125,5.8125 -10.28125,5.8125 -6.046875,0 -9.671875,-5.125 Q 13.1875,52.9375 13.1875,35.296875 Z"
+       id="ArialMT-48-3"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 9.078125,0 V 10.015625 H 19.09375 V 0 Z"
+       id="ArialMT-46-8"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 50.34375,8.453125 V 0 H 3.03125 Q 2.9375,3.171875 4.046875,6.109375 5.859375,10.9375 9.828125,15.625 13.8125,20.3125 21.34375,26.46875 q 11.671875,9.5625 15.765625,15.15625 4.109375,5.59375 4.109375,10.578125 0,5.21875 -3.75,8.796875 -3.734375,3.59375 -9.734375,3.59375 -6.34375,0 -10.15625,-3.8125 Q 13.765625,56.984375 13.71875,50.25 L 4.6875,51.171875 q 0.921875,10.109375 6.96875,15.40625 6.0625,5.296875 16.28125,5.296875 10.296875,0 16.296875,-5.71875 Q 50.25,60.453125 50.25,52 50.25,47.703125 48.484375,43.546875 46.734375,39.40625 42.65625,34.8125 38.578125,30.21875 29.109375,22.21875 21.1875,15.578125 18.9375,13.203125 q -2.234375,-2.359375 -3.703125,-4.75 z"
+       id="ArialMT-50-1"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 32.328125,0 v 17.140625 h -31.0625 v 8.0625 l 32.671875,46.375 h 7.171875 v -46.375 h 9.671875 v -8.0625 H 41.109375 V 0 Z m 0,25.203125 V 57.46875 L 9.90625,25.203125 Z"
+       id="ArialMT-52-4"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 49.75,54.046875 41.015625,53.375 q -1.171875,5.171875 -3.3125,7.515625 -3.578125,3.765625 -8.796875,3.765625 -4.203125,0 -7.375,-2.34375 Q 17.390625,59.28125 14.984375,53.46875 12.59375,47.65625 12.5,36.921875 15.671875,41.75 20.265625,44.09375 q 4.59375,2.34375 9.625,2.34375 8.78125,0 14.953125,-6.46875 Q 51.03125,33.5 51.03125,23.25 51.03125,16.5 48.125,10.71875 45.21875,4.9375 40.140625,1.859375 35.0625,-1.21875 28.609375,-1.21875 17.625,-1.21875 10.6875,6.859375 3.765625,14.9375 3.765625,33.5 q 0,20.75 7.65625,30.171875 6.6875,8.203125 18.015625,8.203125 8.453125,0 13.84375,-4.734375 Q 48.6875,62.40625 49.75,54.046875 Z M 13.875,23.1875 q 0,-4.53125 1.921875,-8.6875 Q 17.71875,10.359375 21.1875,8.171875 24.65625,6 28.46875,6 q 5.5625,0 9.5625,4.484375 4.015625,4.5 4.015625,12.21875 0,7.421875 -3.96875,11.6875 -3.953125,4.28125 -9.953125,4.28125 -5.953125,0 -10.109375,-4.28125 Q 13.875,30.125 13.875,23.1875 Z"
+       id="ArialMT-54-3"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 17.671875,38.8125 q -5.46875,2.015625 -8.109375,5.71875 -2.625,3.71875 -2.625,8.890625 0,7.8125 5.609375,13.125 5.625,5.328125 14.9375,5.328125 9.375,0 15.09375,-5.453125 5.71875,-5.4375 5.71875,-13.25 0,-4.984375 -2.625,-8.671875 Q 43.0625,40.828125 37.75,38.8125 q 6.59375,-2.140625 10.03125,-6.9375 3.4375,-4.78125 3.4375,-11.421875 0,-9.171875 -6.5,-15.421875 -6.484375,-6.25 -17.078125,-6.25 -10.59375,0 -17.09375,6.265625 -6.5,6.28125 -6.5,15.65625 0,6.984375 3.546875,11.6875 3.546875,4.71875 10.078125,6.421875 z m -1.75,14.90625 q 0,-5.078125 3.265625,-8.3125 3.28125,-3.21875 8.5,-3.21875 5.078125,0 8.328125,3.1875 3.25,3.203125 3.25,7.84375 0,4.84375 -3.359375,8.140625 -3.34375,3.296875 -8.3125,3.296875 -5.03125,0 -8.359375,-3.234375 -3.3125,-3.21875 -3.3125,-7.703125 z M 13.09375,20.65625 q 0,-3.765625 1.78125,-7.28125 Q 16.65625,9.859375 20.171875,7.921875 23.6875,6 27.734375,6 34.03125,6 38.125,10.046875 q 4.109375,4.0625 4.109375,10.3125 0,6.34375 -4.21875,10.5 -4.21875,4.15625 -10.578125,4.15625 -6.203125,0 -10.28125,-4.109375 -4.0625,-4.09375 -4.0625,-10.25 z"
+       id="ArialMT-56-4"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 37.25,0 h -8.78125 v 56 q -3.171875,-3.015625 -8.328125,-6.046875 -5.15625,-3.03125 -9.25,-4.546875 v 8.5 q 7.375,3.46875 12.890625,8.390625 5.515625,4.9375 7.8125,9.578125 H 37.25 Z"
+       id="ArialMT-49-3"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 21,0 1.265625,51.859375 h 9.28125 L 21.6875,20.796875 q 1.796875,-5.03125 3.3125,-10.4375 1.171875,4.09375 3.265625,9.859375 l 11.53125,31.640625 h 9.03125 L 29.203125,0 Z"
+       id="ArialMT-118-75"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 40.4375,6.390625 Q 35.546875,2.25 31.03125,0.53125 q -4.515625,-1.703125 -9.6875,-1.703125 -8.546875,0 -13.140625,4.171875 -4.59375,4.171875 -4.59375,10.671875 0,3.8125 1.734375,6.953125 1.734375,3.15625 4.546875,5.0625 2.8125,1.90625 6.328125,2.875 2.578125,0.6875 7.8125,1.328125 10.640625,1.265625 15.671875,3.015625 0.04687,1.8125 0.04687,2.296875 0,5.375 -2.5,7.578125 -3.359375,2.96875 -10,2.96875 -6.203125,0 -9.15625,-2.171875 -2.953125,-2.171875 -4.375,-7.6875 L 5.125,37.0625 q 1.171875,5.515625 3.859375,8.90625 2.6875,3.390625 7.765625,5.21875 5.078125,1.84375 11.765625,1.84375 6.640625,0 10.78125,-1.5625 4.15625,-1.5625 6.109375,-3.9375 1.953125,-2.359375 2.734375,-5.984375 0.4375,-2.234375 0.4375,-8.09375 v -11.71875 q 0,-12.265625 0.5625,-15.515625 Q 49.703125,2.984375 51.375,0 h -9.1875 q -1.359375,2.734375 -1.75,6.390625 z M 39.703125,26.03125 Q 34.90625,24.078125 25.34375,22.703125 19.921875,21.921875 17.671875,20.9375 15.4375,19.96875 14.203125,18.09375 q -1.21875,-1.875 -1.21875,-4.171875 0,-3.515625 2.65625,-5.859375 2.671875,-2.34375 7.796875,-2.34375 5.078125,0 9.03125,2.21875 3.953125,2.21875 5.8125,6.078125 1.421875,2.984375 1.421875,8.78125 z"
+       id="ArialMT-97-9"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 6.59375,0 V 51.859375 H 14.5 v -7.375 q 5.71875,8.546875 16.5,8.546875 4.6875,0 8.625,-1.6875 3.9375,-1.6875 5.890625,-4.421875 Q 47.46875,44.1875 48.25,40.4375 48.734375,37.984375 48.734375,31.890625 V 0 H 39.9375 v 31.546875 q 0,5.375 -1.03125,8.03125 -1.015625,2.65625 -3.625,4.234375 -2.609375,1.59375 -6.125,1.59375 -5.625,0 -9.703125,-3.5625 Q 15.375,38.28125 15.375,28.328125 V 0 Z"
+       id="ArialMT-110-62"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 3.171875,21.484375 v 8.84375 h 27 v -8.84375 z"
+       id="ArialMT-45-1"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 40.234375,0 v 6.546875 q -4.9375,-7.71875 -14.5,-7.71875 -6.203125,0 -11.40625,3.421875 -5.203125,3.421875 -8.0625,9.546875 -2.84375,6.125 -2.84375,14.078125 0,7.765625 2.578125,14.09375 2.59375,6.328125 7.765625,9.6875 5.1875,3.375 11.578125,3.375 4.6875,0 8.34375,-1.984375 3.671875,-1.96875 5.96875,-5.140625 v 25.671875 h 8.734375 V 0 Z m -27.78125,25.875 q 0,-9.953125 4.1875,-14.890625 Q 20.84375,6.0625 26.5625,6.0625 q 5.765625,0 9.78125,4.703125 4.03125,4.71875 4.03125,14.375 0,10.65625 -4.109375,15.625 Q 32.171875,45.75 26.171875,45.75 20.3125,45.75 16.375,40.96875 12.453125,36.1875 12.453125,25.875 Z"
+       id="ArialMT-100-7"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 42.09375,16.703125 9.078125,-1.125 Q 49.03125,7.625 43.21875,3.21875 37.40625,-1.171875 28.375,-1.171875 q -11.375,0 -18.046875,7 -6.671875,7.015625 -6.671875,19.65625 0,13.09375 6.734375,20.3125 6.75,7.234375 17.484375,7.234375 10.40625,0 17,-7.078125 6.59375,-7.078125 6.59375,-19.921875 0,-0.78125 -0.04687,-2.34375 H 12.75 q 0.484375,-8.546875 4.828125,-13.09375 4.34375,-4.53125 10.84375,-4.53125 4.828125,0 8.25,2.53125 3.421875,2.546875 5.421875,8.109375 z M 13.234375,30.90625 H 42.1875 q -0.578125,6.546875 -3.3125,9.8125 -4.203125,5.078125 -10.890625,5.078125 -6.0625,0 -10.1875,-4.046875 -4.125,-4.046875 -4.5625,-10.84375 z"
+       id="ArialMT-101-8"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 6.5,0 v 51.859375 h 7.90625 V 44 Q 17.4375,49.515625 20,51.265625 q 2.5625,1.765625 5.640625,1.765625 4.4375,0 9.03125,-2.828125 l -3.03125,-8.15625 q -3.21875,1.90625 -6.4375,1.90625 -2.890625,0 -5.1875,-1.734375 -2.296875,-1.734375 -3.265625,-4.8125 -1.46875,-4.6875 -1.46875,-10.25 V 0 Z"
+       id="ArialMT-114-5"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 20.21875,0 -19,71.578125 H 10.9375 L 21.828125,24.65625 q 1.75,-7.375 3.03125,-14.640625 2.734375,11.46875 3.21875,13.234375 l 13.625,48.328125 H 53.125 l 10.25,-36.21875 q 3.859375,-13.484375 5.578125,-25.34375 1.359375,6.78125 3.5625,15.578125 l 11.21875,45.984375 h 9.53125 L 73.640625,0 H 64.5 L 49.421875,54.546875 q -1.90625,6.828125 -2.25,8.390625 -1.125,-4.921875 -2.109375,-8.390625 L 29.890625,0 Z"
+       id="ArialMT-87-7"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 6.390625,0 V 71.578125 H 15.1875 V 0 Z"
+       id="ArialMT-108-4"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 3.078125,15.484375 8.6875,1.359375 Q 12.5,11.625 15.84375,8.84375 19.1875,6.0625 25.203125,6.0625 q 6.046875,0 8.96875,2.453125 2.9375,2.46875 2.9375,5.796875 0,2.96875 -2.59375,4.6875 Q 32.71875,20.171875 25.53125,21.96875 15.875,24.421875 12.140625,26.203125 8.40625,27.984375 6.46875,31.125 q -1.921875,3.15625 -1.921875,6.96875 0,3.453125 1.578125,6.40625 1.59375,2.96875 4.328125,4.921875 2.046875,1.5 5.578125,2.546875 3.546875,1.0625 7.609375,1.0625 6.09375,0 10.703125,-1.765625 4.625,-1.75 6.8125,-4.765625 2.203125,-3 3.03125,-8.015625 L 35.59375,37.3125 q -0.578125,4 -3.390625,6.234375 -2.8125,2.25 -7.9375,2.25 -6.046875,0 -8.640625,-2 -2.59375,-2 -2.59375,-4.6875 0,-1.703125 1.078125,-3.078125 1.078125,-1.40625 3.375,-2.34375 1.3125,-0.484375 7.765625,-2.234375 9.328125,-2.5 13,-4.09375 3.6875,-1.578125 5.78125,-4.609375 2.109375,-3.015625 2.109375,-7.515625 0,-4.390625 -2.5625,-8.28125 -2.5625,-3.875 -7.40625,-6 -4.828125,-2.125 -10.921875,-2.125 -10.109375,0 -15.40625,4.203125 -5.296875,4.203125 -6.765625,12.453125 z"
+       id="ArialMT-115-18"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 0,0 H -12"
+       id="m44cfcce60e"
+       style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 25.78125,7.859375 27.046875,0.09375 Q 23.34375,-0.6875 20.40625,-0.6875 15.625,-0.6875 12.984375,0.828125 10.359375,2.34375 9.28125,4.8125 8.203125,7.28125 8.203125,15.1875 v 29.828125 h -6.4375 v 6.84375 h 6.4375 v 12.84375 L 16.9375,69.96875 V 51.859375 h 8.84375 v -6.84375 H 16.9375 v -30.3125 q 0,-3.765625 0.46875,-4.84375 0.46875,-1.0625 1.515625,-1.703125 1.046875,-0.640625 3,-0.640625 1.46875,0 3.859375,0.34375 z"
+       id="ArialMT-116-9"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="M 6.640625,61.46875 V 71.578125 H 15.4375 V 61.46875 Z M 6.640625,0 V 51.859375 H 15.4375 V 0 Z"
+       id="ArialMT-105-7"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 0,11.18034 c 2.965061,0 5.80908,-1.178031 7.905694,-3.274646 C 10.002309,5.80908 11.18034,2.965061 11.18034,0 c 0,-2.965061 -1.178031,-5.80908 -3.274646,-7.905694 C 5.80908,-10.002309 2.965061,-11.18034 0,-11.18034 c -2.965061,0 -5.80908,1.178031 -7.905694,3.274646 C -10.002309,-5.80908 -11.18034,-2.965061 -11.18034,0 c 0,2.965061 1.178031,5.80908 3.274646,7.905694 C -5.80908,10.002309 -2.965061,11.18034 0,11.18034 Z"
+       id="C0_0_667cb6c0eb"
+       style="stroke-linecap:butt;stroke-linejoin:round" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient18618-0"
+       id="linearGradient18620"
+       x1="543.43768"
+       y1="841.82831"
+       x2="1091.168"
+       y2="841.82831"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient18649"
+       id="linearGradient18643"
+       x1="544.03937"
+       y1="866.79559"
+       x2="1091.7697"
+       y2="866.79559"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="pad"
+       gradientTransform="matrix(1.99889,0,0,0.72872679,-951.64296,-9.329631)" />
+  </defs>
+  <rect
+     style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:url(#linearGradient18643);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.84235477;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="rect18635"
+     width="1083.5205"
+     height="38.58075"
+     x="141.49805"
+     y="603.03717" />
+  <g
+     id="figure_1"
+     style="stroke-linecap:butt;stroke-linejoin:round"
+     transform="translate(-54.754377,-85.15)">
+    <g
+       id="axes_1"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <g
+         id="patch_2"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           d="M 180,630 H 1296 V 86.4 H 180 Z"
+           style="fill:#ffffff;stroke-linecap:butt;stroke-linejoin:round"
+           id="path9"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="matplotlib.axis_1"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <g
+           id="xtick_1"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_1"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <defs
+               id="defs13">
+              <path
+                 d="M 0,0 V 12"
+                 id="m76b8f8c0ae"
+                 style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 inkscape:connector-curvature="0" />
+            </defs>
+            <g
+               id="g17"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="196.25243"
+                 xlink:href="#m76b8f8c0ae"
+                 y="650"
+                 id="use15"
+                 width="100%"
+                 height="100%"
+                 transform="matrix(1,0,0,6.4056072,0,-3513.6447)" />
+            </g>
+          </g>
+          <g
+             id="text_1"
+             style="stroke-linecap:butt;stroke-linejoin:round"
+             transform="translate(18)">
+            <!-- 0.0 -->
+            <defs
+               id="defs22">
+              <path
+                 d="m 4.15625,35.296875 q 0,12.703125 2.609375,20.4375 2.609375,7.75 7.75,11.9375 5.15625,4.203125 12.96875,4.203125 5.765625,0 10.109375,-2.328125 4.34375,-2.3125 7.171875,-6.6875 Q 47.609375,58.5 49.21875,52.21875 q 1.609375,-6.265625 1.609375,-16.921875 0,-12.59375 -2.59375,-20.328125 Q 45.65625,7.234375 40.5,3 35.359375,-1.21875 27.484375,-1.21875 q -10.34375,0 -16.25,7.421875 -7.078125,8.9375 -7.078125,29.09375 z m 9.03125,0 q 0,-17.625 4.125,-23.46875 Q 21.4375,6 27.484375,6 q 6.0625,0 10.1875,5.859375 4.125,5.859375 4.125,23.4375 0,17.6875 -4.125,23.484375 -4.125,5.8125 -10.28125,5.8125 -6.046875,0 -9.671875,-5.125 Q 13.1875,52.9375 13.1875,35.296875 Z"
+                 id="ArialMT-48"
+                 inkscape:connector-curvature="0"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <path
+                 d="M 9.078125,0 V 10.015625 H 19.09375 V 0 Z"
+                 id="ArialMT-46"
+                 inkscape:connector-curvature="0"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,180.96243,681.24719)"
+               id="g30">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use24"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use26"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-48"
+                 id="use28"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_2"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_2"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g36"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="412.95145"
+                 xlink:href="#m76b8f8c0ae"
+                 y="650"
+                 id="use34"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_2"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.2 -->
+            <defs
+               id="defs40">
+              <path
+                 d="M 50.34375,8.453125 V 0 H 3.03125 Q 2.9375,3.171875 4.046875,6.109375 5.859375,10.9375 9.828125,15.625 13.8125,20.3125 21.34375,26.46875 q 11.671875,9.5625 15.765625,15.15625 4.109375,5.59375 4.109375,10.578125 0,5.21875 -3.75,8.796875 -3.734375,3.59375 -9.734375,3.59375 -6.34375,0 -10.15625,-3.8125 Q 13.765625,56.984375 13.71875,50.25 L 4.6875,51.171875 q 0.921875,10.109375 6.96875,15.40625 6.0625,5.296875 16.28125,5.296875 10.296875,0 16.296875,-5.71875 Q 50.25,60.453125 50.25,52 50.25,47.703125 48.484375,43.546875 46.734375,39.40625 42.65625,34.8125 38.578125,30.21875 29.109375,22.21875 21.1875,15.578125 18.9375,13.203125 q -2.234375,-2.359375 -3.703125,-4.75 z"
+                 id="ArialMT-50"
+                 inkscape:connector-curvature="0"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,397.66146,681.24719)"
+               id="g48">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use42"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use44"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-50"
+                 id="use46"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_3"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_3"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g54"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="629.65051"
+                 xlink:href="#m76b8f8c0ae"
+                 y="650"
+                 id="use52"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_3"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.4 -->
+            <defs
+               id="defs58">
+              <path
+                 d="m 32.328125,0 v 17.140625 h -31.0625 v 8.0625 l 32.671875,46.375 h 7.171875 v -46.375 h 9.671875 v -8.0625 H 41.109375 V 0 Z m 0,25.203125 V 57.46875 L 9.90625,25.203125 Z"
+                 id="ArialMT-52"
+                 inkscape:connector-curvature="0"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,614.36049,681.24719)"
+               id="g66">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use60"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use62"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-52"
+                 id="use64"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_4"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_4"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g72"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="846.34949"
+                 xlink:href="#m76b8f8c0ae"
+                 y="650"
+                 id="use70"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_4"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.6 -->
+            <defs
+               id="defs76">
+              <path
+                 d="M 49.75,54.046875 41.015625,53.375 q -1.171875,5.171875 -3.3125,7.515625 -3.578125,3.765625 -8.796875,3.765625 -4.203125,0 -7.375,-2.34375 Q 17.390625,59.28125 14.984375,53.46875 12.59375,47.65625 12.5,36.921875 15.671875,41.75 20.265625,44.09375 q 4.59375,2.34375 9.625,2.34375 8.78125,0 14.953125,-6.46875 Q 51.03125,33.5 51.03125,23.25 51.03125,16.5 48.125,10.71875 45.21875,4.9375 40.140625,1.859375 35.0625,-1.21875 28.609375,-1.21875 17.625,-1.21875 10.6875,6.859375 3.765625,14.9375 3.765625,33.5 q 0,20.75 7.65625,30.171875 6.6875,8.203125 18.015625,8.203125 8.453125,0 13.84375,-4.734375 Q 48.6875,62.40625 49.75,54.046875 Z M 13.875,23.1875 q 0,-4.53125 1.921875,-8.6875 Q 17.71875,10.359375 21.1875,8.171875 24.65625,6 28.46875,6 q 5.5625,0 9.5625,4.484375 4.015625,4.5 4.015625,12.21875 0,7.421875 -3.96875,11.6875 -3.953125,4.28125 -9.953125,4.28125 -5.953125,0 -10.109375,-4.28125 Q 13.875,30.125 13.875,23.1875 Z"
+                 id="ArialMT-54"
+                 inkscape:connector-curvature="0"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,831.05952,681.24719)"
+               id="g84">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use78"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use80"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-54"
+                 id="use82"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_5"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_5"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g90"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="1063.0486"
+                 xlink:href="#m76b8f8c0ae"
+                 y="650"
+                 id="use88"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_5"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.8 -->
+            <defs
+               id="defs94">
+              <path
+                 d="m 17.671875,38.8125 q -5.46875,2.015625 -8.109375,5.71875 -2.625,3.71875 -2.625,8.890625 0,7.8125 5.609375,13.125 5.625,5.328125 14.9375,5.328125 9.375,0 15.09375,-5.453125 5.71875,-5.4375 5.71875,-13.25 0,-4.984375 -2.625,-8.671875 Q 43.0625,40.828125 37.75,38.8125 q 6.59375,-2.140625 10.03125,-6.9375 3.4375,-4.78125 3.4375,-11.421875 0,-9.171875 -6.5,-15.421875 -6.484375,-6.25 -17.078125,-6.25 -10.59375,0 -17.09375,6.265625 -6.5,6.28125 -6.5,15.65625 0,6.984375 3.546875,11.6875 3.546875,4.71875 10.078125,6.421875 z m -1.75,14.90625 q 0,-5.078125 3.265625,-8.3125 3.28125,-3.21875 8.5,-3.21875 5.078125,0 8.328125,3.1875 3.25,3.203125 3.25,7.84375 0,4.84375 -3.359375,8.140625 -3.34375,3.296875 -8.3125,3.296875 -5.03125,0 -8.359375,-3.234375 -3.3125,-3.21875 -3.3125,-7.703125 z M 13.09375,20.65625 q 0,-3.765625 1.78125,-7.28125 Q 16.65625,9.859375 20.171875,7.921875 23.6875,6 27.734375,6 34.03125,6 38.125,10.046875 q 4.109375,4.0625 4.109375,10.3125 0,6.34375 -4.21875,10.5 -4.21875,4.15625 -10.578125,4.15625 -6.203125,0 -10.28125,-4.109375 -4.0625,-4.09375 -4.0625,-10.25 z"
+                 id="ArialMT-56"
+                 inkscape:connector-curvature="0"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,1047.7585,681.24719)"
+               id="g102">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use96"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use98"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-56"
+                 id="use100"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_6"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_6"
+             style="stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(1,0,0,6.4272296,0,-3527.6993)">
+            <g
+               id="g108"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="1279.7476"
+                 xlink:href="#m76b8f8c0ae"
+                 y="650"
+                 id="use106"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_6"
+             style="stroke-linecap:butt;stroke-linejoin:round"
+             transform="translate(-19.5)">
+            <!-- 1.0 -->
+            <defs
+               id="defs112">
+              <path
+                 d="m 37.25,0 h -8.78125 v 56 q -3.171875,-3.015625 -8.328125,-6.046875 -5.15625,-3.03125 -9.25,-4.546875 v 8.5 q 7.375,3.46875 12.890625,8.390625 5.515625,4.9375 7.8125,9.578125 H 37.25 Z"
+                 id="ArialMT-49"
+                 inkscape:connector-curvature="0"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,1264.4576,681.24719)"
+               id="g120">
+              <use
+                 xlink:href="#ArialMT-49"
+                 id="use114"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use116"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-48"
+                 id="use118"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="text_7"
+           style="stroke-linecap:butt;stroke-linejoin:round"
+           transform="translate(0,7.5)">
+          <!-- global lambda -->
+          <defs
+             id="defs132">
+            <path
+               d="M 4.984375,-4.296875 13.53125,-5.5625 q 0.53125,-3.953125 2.96875,-5.765625 3.28125,-2.4375 8.9375,-2.4375 6.109375,0 9.421875,2.4375 3.328125,2.4375 4.5,6.828125 0.6875,2.6875 0.625,11.28125 Q 34.234375,0 25.640625,0 14.9375,0 9.078125,7.71875 q -5.859375,7.71875 -5.859375,18.5 0,7.421875 2.6875,13.6875 2.6875,6.28125 7.78125,9.703125 5.109375,3.421875 12,3.421875 9.171875,0 15.140625,-7.421875 v 6.25 h 8.09375 V 7.03125 q 0,-12.109375 -2.46875,-17.15625 -2.453125,-5.0625 -7.8125,-7.984375 -5.34375,-2.9375 -13.15625,-2.9375 -9.265625,0 -14.984375,4.171875 -5.71875,4.171875 -5.515625,12.578125 z M 12.25,26.859375 q 0,-10.203125 4.046875,-14.890625 4.0625,-4.6875 10.171875,-4.6875 6.046875,0 10.140625,4.65625 4.109375,4.671875 4.109375,14.625 0,9.515625 -4.21875,14.34375 Q 32.28125,45.75 26.3125,45.75 q -5.859375,0 -9.96875,-4.765625 -4.09375,-4.75 -4.09375,-14.125 z"
+               id="ArialMT-103"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="M 6.390625,0 V 71.578125 H 15.1875 V 0 Z"
+               id="ArialMT-108"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 3.328125,25.921875 q 0,14.40625 8,21.34375 6.6875,5.765625 16.3125,5.765625 10.6875,0 17.46875,-7.015625 6.796875,-7 6.796875,-19.359375 0,-10 -3,-15.75 -3,-5.734375 -8.75,-8.90625 Q 34.421875,-1.171875 27.640625,-1.171875 16.75,-1.171875 10.03125,5.8125 3.328125,12.796875 3.328125,25.921875 Z m 9.03125,0 q 0,-9.953125 4.34375,-14.90625 4.34375,-4.953125 10.9375,-4.953125 6.546875,0 10.890625,4.96875 4.34375,4.984375 4.34375,15.1875 0,9.625 -4.375,14.578125 Q 34.125,45.75 27.640625,45.75 q -6.59375,0 -10.9375,-4.9375 -4.34375,-4.921875 -4.34375,-14.890625 z"
+               id="ArialMT-111"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 14.703125,0 h -8.15625 v 71.578125 h 8.78125 v -25.53125 q 5.578125,6.984375 14.21875,6.984375 4.78125,0 9.046875,-1.9375 Q 42.875,49.171875 45.625,45.671875 48.390625,42.1875 49.953125,37.25 q 1.5625,-4.921875 1.5625,-10.546875 0,-13.328125 -6.59375,-20.609375 -6.59375,-7.265625 -15.8125,-7.265625 -9.1875,0 -14.40625,7.671875 z M 14.59375,26.3125 Q 14.59375,17 17.140625,12.84375 21.296875,6.0625 28.375,6.0625 q 5.75,0 9.953125,5 4.203125,5 4.203125,14.921875 0,10.15625 -4.03125,14.984375 -4.03125,4.828125 -9.734375,4.828125 -5.765625,0 -9.96875,-5 -4.203125,-5 -4.203125,-14.484375 z"
+               id="ArialMT-98"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="M 40.4375,6.390625 Q 35.546875,2.25 31.03125,0.53125 q -4.515625,-1.703125 -9.6875,-1.703125 -8.546875,0 -13.140625,4.171875 -4.59375,4.171875 -4.59375,10.671875 0,3.8125 1.734375,6.953125 1.734375,3.15625 4.546875,5.0625 2.8125,1.90625 6.328125,2.875 2.578125,0.6875 7.8125,1.328125 10.640625,1.265625 15.671875,3.015625 0.04687,1.8125 0.04687,2.296875 0,5.375 -2.5,7.578125 -3.359375,2.96875 -10,2.96875 -6.203125,0 -9.15625,-2.171875 -2.953125,-2.171875 -4.375,-7.6875 L 5.125,37.0625 q 1.171875,5.515625 3.859375,8.90625 2.6875,3.390625 7.765625,5.21875 5.078125,1.84375 11.765625,1.84375 6.640625,0 10.78125,-1.5625 4.15625,-1.5625 6.109375,-3.9375 1.953125,-2.359375 2.734375,-5.984375 0.4375,-2.234375 0.4375,-8.09375 v -11.71875 q 0,-12.265625 0.5625,-15.515625 Q 49.703125,2.984375 51.375,0 h -9.1875 q -1.359375,2.734375 -1.75,6.390625 z M 39.703125,26.03125 Q 34.90625,24.078125 25.34375,22.703125 19.921875,21.921875 17.671875,20.9375 15.4375,19.96875 14.203125,18.09375 q -1.21875,-1.875 -1.21875,-4.171875 0,-3.515625 2.65625,-5.859375 2.671875,-2.34375 7.796875,-2.34375 5.078125,0 9.03125,2.21875 3.953125,2.21875 5.8125,6.078125 1.421875,2.984375 1.421875,8.78125 z"
+               id="ArialMT-97"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="ArialMT-32"
+               d=""
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 6.59375,0 v 51.859375 h 7.859375 v -7.28125 q 2.4375,3.8125 6.484375,6.125 4.0625,2.328125 9.234375,2.328125 5.765625,0 9.453125,-2.390625 3.6875,-2.390625 5.203125,-6.6875 6.15625,9.078125 16.015625,9.078125 7.71875,0 11.859375,-4.28125 4.15625,-4.265625 4.15625,-13.15625 V 0 h -8.75 v 32.671875 q 0,5.265625 -0.859375,7.578125 -0.84375,2.328125 -3.09375,3.734375 -2.234375,1.421875 -5.265625,1.421875 -5.46875,0 -9.09375,-3.640625 Q 46.1875,38.140625 46.1875,30.125 V 0 h -8.78125 v 33.6875 q 0,5.859375 -2.15625,8.78125 -2.140625,2.9375 -7.03125,2.9375 -3.703125,0 -6.859375,-1.953125 Q 18.21875,41.5 16.796875,37.734375 15.375,33.984375 15.375,26.90625 V 0 Z"
+               id="ArialMT-109"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 40.234375,0 v 6.546875 q -4.9375,-7.71875 -14.5,-7.71875 -6.203125,0 -11.40625,3.421875 -5.203125,3.421875 -8.0625,9.546875 -2.84375,6.125 -2.84375,14.078125 0,7.765625 2.578125,14.09375 2.59375,6.328125 7.765625,9.6875 5.1875,3.375 11.578125,3.375 4.6875,0 8.34375,-1.984375 3.671875,-1.96875 5.96875,-5.140625 v 25.671875 h 8.734375 V 0 Z m -27.78125,25.875 q 0,-9.953125 4.1875,-14.890625 Q 20.84375,6.0625 26.5625,6.0625 q 5.765625,0 9.78125,4.703125 4.03125,4.71875 4.03125,14.375 0,10.65625 -4.109375,15.625 Q 32.171875,45.75 26.171875,45.75 20.3125,45.75 16.375,40.96875 12.453125,36.1875 12.453125,25.875 Z"
+               id="ArialMT-100"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0.24,0,0,-0.24,663.28687,706.79844)"
+             id="g160">
+            <use
+               xlink:href="#ArialMT-103"
+               id="use134"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               x="0"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="55.615234"
+               xlink:href="#ArialMT-108"
+               id="use136"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="77.832031"
+               xlink:href="#ArialMT-111"
+               id="use138"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="133.44727"
+               xlink:href="#ArialMT-98"
+               id="use140"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="189.0625"
+               xlink:href="#ArialMT-97"
+               id="use142"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="244.67773"
+               xlink:href="#ArialMT-108"
+               id="use144"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="266.89453"
+               xlink:href="#ArialMT-32"
+               id="use146"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="294.67773"
+               xlink:href="#ArialMT-108"
+               id="use148"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="316.89453"
+               xlink:href="#ArialMT-97"
+               id="use150"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="372.50977"
+               xlink:href="#ArialMT-109"
+               id="use152"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="455.81055"
+               xlink:href="#ArialMT-98"
+               id="use154"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="511.42578"
+               xlink:href="#ArialMT-100"
+               id="use156"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="567.04102"
+               xlink:href="#ArialMT-97"
+               id="use158"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+          </g>
+        </g>
+        <path
+           style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 198.25404,682.95374 v 51.89382"
+           id="path18707"
+           inkscape:connector-curvature="0" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path18709"
+           d="m 1277.746,682.95374 v 51.89382"
+           style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      </g>
+      <g
+         id="matplotlib.axis_2"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <g
+           id="ytick_1"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_7"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <defs
+               id="defs165">
+              <path
+                 d="M 0,0 H -12"
+                 id="m945c15d621"
+                 style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 inkscape:connector-curvature="0" />
+            </defs>
+            <g
+               id="g169"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="160"
+                 xlink:href="#m945c15d621"
+                 y="617.05713"
+                 id="use167"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.0 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,113.92,624.93074)"
+               id="g178">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use172"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use174"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-48"
+                 id="use176"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_2"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g184"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="160"
+                 xlink:href="#m945c15d621"
+                 y="513.51428"
+                 id="use182"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.2 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,113.92,521.38788)"
+               id="g193">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use187"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use189"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-50"
+                 id="use191"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_3"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g199"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="160"
+                 xlink:href="#m945c15d621"
+                 y="409.97144"
+                 id="use197"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_10"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.4 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,113.92,417.84502)"
+               id="g208">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use202"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use204"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-52"
+                 id="use206"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_4"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_10"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g214"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="160"
+                 xlink:href="#m945c15d621"
+                 y="306.42856"
+                 id="use212"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_11"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.6 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,113.92,314.30216)"
+               id="g223">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use217"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use219"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-54"
+                 id="use221"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_5"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_11"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g229"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="160"
+                 xlink:href="#m945c15d621"
+                 y="202.88571"
+                 id="use227"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_12"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.8 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,113.92,210.75931)"
+               id="g238">
+              <use
+                 xlink:href="#ArialMT-48"
+                 id="use232"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use234"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-56"
+                 id="use236"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_6"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_12"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g244"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="160"
+                 xlink:href="#m945c15d621"
+                 y="99.342857"
+                 id="use242"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+          <g
+             id="text_13"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 1.0 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,113.92,107.21645)"
+               id="g253">
+              <use
+                 xlink:href="#ArialMT-49"
+                 id="use247"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 x="0"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="55.615234"
+                 xlink:href="#ArialMT-46"
+                 id="use249"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+              <use
+                 x="83.398438"
+                 xlink:href="#ArialMT-48"
+                 id="use251"
+                 style="stroke-linecap:butt;stroke-linejoin:round"
+                 y="0"
+                 width="100%"
+                 height="100%" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="text_14"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <!-- lambda -->
+          <g
+             style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0,-0.24,-0.24,0,105.15,397.55437)"
+             id="g269">
+            <use
+               xlink:href="#ArialMT-108"
+               id="use257"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               x="0"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="22.216797"
+               xlink:href="#ArialMT-97"
+               id="use259"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="77.832031"
+               xlink:href="#ArialMT-109"
+               id="use261"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="161.13281"
+               xlink:href="#ArialMT-98"
+               id="use263"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="216.74805"
+               xlink:href="#ArialMT-100"
+               id="use265"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="272.36328"
+               xlink:href="#ArialMT-97"
+               id="use267"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+          </g>
+        </g>
+      </g>
+      <g
+         id="line2d_13"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           clip-path="url(#p4c7292cf7d)"
+           d="M 196.25243,617.05714 316.64078,513.51429 437.02913,358.2 557.41748,99.342857 h 120.38835 120.38834 120.38835 120.38838 120.3883 120.3884"
+           style="fill:none;stroke:#1f77b4;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
+           id="path273"
+           inkscape:connector-curvature="0" />
+        <defs
+           id="defs276">
+          <path
+             d="M 0,12.5 C 3.315039,12.5 6.494748,11.182921 8.838835,8.838835 11.182921,6.494748 12.5,3.315039 12.5,0 12.5,-3.315039 11.182921,-6.494748 8.838835,-8.838835 6.494748,-11.182921 3.315039,-12.5 0,-12.5 c -3.315039,0 -6.494748,1.317079 -8.838835,3.661165 C -11.182921,-6.494748 -12.5,-3.315039 -12.5,0 c 0,3.315039 1.317079,6.494748 3.661165,8.838835 C -6.494748,11.182921 -3.315039,12.5 0,12.5 Z"
+             id="me556822e54"
+             style="stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <g
+           clip-path="url(#p4c7292cf7d)"
+           id="g298"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="196.25243"
+             xlink:href="#me556822e54"
+             y="617.05713"
+             id="use278"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="316.64078"
+             xlink:href="#me556822e54"
+             y="513.51428"
+             id="use280"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="437.02911"
+             xlink:href="#me556822e54"
+             y="358.20001"
+             id="use282"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="557.41748"
+             xlink:href="#me556822e54"
+             y="99.342857"
+             id="use284"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="677.80585"
+             xlink:href="#me556822e54"
+             y="99.342857"
+             id="use286"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="798.19415"
+             xlink:href="#me556822e54"
+             y="99.342857"
+             id="use288"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="918.58252"
+             xlink:href="#me556822e54"
+             y="99.342857"
+             id="use290"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="1038.9708"
+             xlink:href="#me556822e54"
+             y="99.342857"
+             id="use292"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="1159.3593"
+             xlink:href="#me556822e54"
+             y="99.342857"
+             id="use294"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+             x="1279.7476"
+             xlink:href="#me556822e54"
+             y="99.342857"
+             id="use296"
+             width="100%"
+             height="100%" />
+        </g>
+      </g>
+      <g
+         id="line2d_14"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           clip-path="url(#p4c7292cf7d)"
+           d="M 196.25243,617.05714 H 316.64078 437.02913 557.41748 L 677.80583,409.97143 798.19417,358.2 918.58252,306.42857 1038.9709,254.65714 1159.3592,202.88571 1279.7476,99.342857"
+           style="fill:none;stroke:#ff7f0e;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
+           id="path301"
+           inkscape:connector-curvature="0" />
+        <defs
+           id="defs304">
+          <path
+             d="M 0,12.5 C 3.315039,12.5 6.494748,11.182921 8.838835,8.838835 11.182921,6.494748 12.5,3.315039 12.5,0 12.5,-3.315039 11.182921,-6.494748 8.838835,-8.838835 6.494748,-11.182921 3.315039,-12.5 0,-12.5 c -3.315039,0 -6.494748,1.317079 -8.838835,3.661165 C -11.182921,-6.494748 -12.5,-3.315039 -12.5,0 c 0,3.315039 1.317079,6.494748 3.661165,8.838835 C -6.494748,11.182921 -3.315039,12.5 0,12.5 Z"
+             id="m08a1dea9da"
+             style="stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <g
+           clip-path="url(#p4c7292cf7d)"
+           id="g326"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="196.25243"
+             xlink:href="#m08a1dea9da"
+             y="617.05713"
+             id="use306"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="316.64078"
+             xlink:href="#m08a1dea9da"
+             y="617.05713"
+             id="use308"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="437.02911"
+             xlink:href="#m08a1dea9da"
+             y="617.05713"
+             id="use310"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="557.41748"
+             xlink:href="#m08a1dea9da"
+             y="617.05713"
+             id="use312"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="677.80585"
+             xlink:href="#m08a1dea9da"
+             y="409.97144"
+             id="use314"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="798.19415"
+             xlink:href="#m08a1dea9da"
+             y="358.20001"
+             id="use316"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="918.58252"
+             xlink:href="#m08a1dea9da"
+             y="306.42856"
+             id="use318"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="1038.9708"
+             xlink:href="#m08a1dea9da"
+             y="254.65715"
+             id="use320"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="1159.3593"
+             xlink:href="#m08a1dea9da"
+             y="202.88571"
+             id="use322"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+             x="1279.7476"
+             xlink:href="#m08a1dea9da"
+             y="99.342857"
+             id="use324"
+             width="100%"
+             height="100%" />
+        </g>
+      </g>
+      <g
+         id="line2d_15"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           clip-path="url(#p4c7292cf7d)"
+           d="M 196.25243,617.05714 H 316.64078 L 437.02913,565.28571 557.41748,513.51429 677.80583,461.74286 798.19417,358.2 918.58252,254.65714 1038.9709,99.342857 h 120.3883 120.3884"
+           style="fill:none;stroke:#2ca02c;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
+           id="path329"
+           inkscape:connector-curvature="0" />
+        <defs
+           id="defs332">
+          <path
+             d="M 0,12.5 C 3.315039,12.5 6.494748,11.182921 8.838835,8.838835 11.182921,6.494748 12.5,3.315039 12.5,0 12.5,-3.315039 11.182921,-6.494748 8.838835,-8.838835 6.494748,-11.182921 3.315039,-12.5 0,-12.5 c -3.315039,0 -6.494748,1.317079 -8.838835,3.661165 C -11.182921,-6.494748 -12.5,-3.315039 -12.5,0 c 0,3.315039 1.317079,6.494748 3.661165,8.838835 C -6.494748,11.182921 -3.315039,12.5 0,12.5 Z"
+             id="m133ce8f78c"
+             style="stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <g
+           clip-path="url(#p4c7292cf7d)"
+           id="g354"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="196.25243"
+             xlink:href="#m133ce8f78c"
+             y="617.05713"
+             id="use334"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="316.64078"
+             xlink:href="#m133ce8f78c"
+             y="617.05713"
+             id="use336"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="437.02911"
+             xlink:href="#m133ce8f78c"
+             y="565.28571"
+             id="use338"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="557.41748"
+             xlink:href="#m133ce8f78c"
+             y="513.51428"
+             id="use340"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="677.80585"
+             xlink:href="#m133ce8f78c"
+             y="461.74286"
+             id="use342"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="798.19415"
+             xlink:href="#m133ce8f78c"
+             y="358.20001"
+             id="use344"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="918.58252"
+             xlink:href="#m133ce8f78c"
+             y="254.65715"
+             id="use346"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="1038.9708"
+             xlink:href="#m133ce8f78c"
+             y="99.342857"
+             id="use348"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="1159.3593"
+             xlink:href="#m133ce8f78c"
+             y="99.342857"
+             id="use350"
+             width="100%"
+             height="100%" />
+          <use
+             style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+             x="1279.7476"
+             xlink:href="#m133ce8f78c"
+             y="99.342857"
+             id="use352"
+             width="100%"
+             height="100%" />
+        </g>
+      </g>
+      <g
+         id="patch_3"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           d="M 160,630 V 86.4"
+           style="fill:none;stroke:#262626;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter"
+           id="path357"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="patch_4"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           d="M 180,650 H 1296"
+           style="fill:none;stroke:#262626;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter"
+           id="path360"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="legend_1"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <g
+           id="patch_5"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <path
+             d="m 195.4,197.35906 h 212.60937 q 4.4,0 4.4,-4.4 V 101.8 q 0,-4.4 -4.4,-4.4 H 195.4 q -4.4,0 -4.4,4.4 v 91.15906 q 0,4.4 4.4,4.4 z"
+             style="opacity:0.8;fill:#ffffff;stroke:#cccccc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter"
+             id="path363"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="line2d_16"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <path
+             d="m 199.8,114.24719 h 44"
+             style="fill:none;stroke:#1f77b4;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
+             id="path366"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="line2d_17"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="g371"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <use
+               style="fill:#1f77b4;stroke:#1f77b4;stroke-linecap:butt;stroke-linejoin:round"
+               x="221.8"
+               xlink:href="#me556822e54"
+               y="114.24718"
+               id="use369"
+               width="100%"
+               height="100%" />
+          </g>
+        </g>
+        <g
+           id="text_15"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <!-- coulomb -->
+          <defs
+             id="defs376">
+            <path
+               d="m 40.4375,19 8.640625,-1.125 Q 47.65625,8.9375 41.8125,3.875 35.984375,-1.171875 27.484375,-1.171875 16.84375,-1.171875 10.375,5.78125 3.90625,12.75 3.90625,25.734375 q 0,8.390625 2.78125,14.6875 2.78125,6.3125 8.46875,9.453125 5.6875,3.15625 12.390625,3.15625 8.4375,0 13.8125,-4.28125 5.375,-4.265625 6.890625,-12.125 l -8.546875,-1.328125 q -1.21875,5.234375 -4.328125,7.859375 -3.09375,2.640625 -7.5,2.640625 -6.640625,0 -10.796875,-4.765625 -4.140625,-4.75 -4.140625,-15.046875 0,-10.453125 4,-15.1875 Q 20.953125,6.0625 27.390625,6.0625 32.5625,6.0625 36.03125,9.234375 39.5,12.40625 40.4375,19 Z"
+               id="ArialMT-99"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 40.578125,0 v 7.625 q -6.0625,-8.796875 -16.453125,-8.796875 -4.59375,0 -8.578125,1.75 Q 11.578125,2.34375 9.640625,5 7.71875,7.671875 6.9375,11.53125 6.390625,14.109375 6.390625,19.734375 v 32.125 H 15.1875 V 23.09375 q 0,-6.875 0.53125,-9.28125 0.828125,-3.453125 3.515625,-5.4375 2.6875,-1.984375 6.640625,-1.984375 3.953125,0 7.421875,2.03125 3.46875,2.03125 4.90625,5.515625 1.453125,3.5 1.453125,10.140625 v 27.78125 H 48.4375 V 0 Z"
+               id="ArialMT-117"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0.22,0,0,-0.22,261.4,121.94719)"
+             id="g392">
+            <use
+               xlink:href="#ArialMT-99"
+               id="use378"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               x="0"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="50"
+               xlink:href="#ArialMT-111"
+               id="use380"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="105.61523"
+               xlink:href="#ArialMT-117"
+               id="use382"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="161.23047"
+               xlink:href="#ArialMT-108"
+               id="use384"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="183.44727"
+               xlink:href="#ArialMT-111"
+               id="use386"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="239.0625"
+               xlink:href="#ArialMT-109"
+               id="use388"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="322.36328"
+               xlink:href="#ArialMT-98"
+               id="use390"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+          </g>
+        </g>
+        <g
+           id="line2d_18"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <path
+             d="m 199.8,145.36687 h 44"
+             style="fill:none;stroke:#ff7f0e;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
+             id="path395"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="line2d_19"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="g400"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <use
+               style="fill:#ff7f0e;stroke:#ff7f0e;stroke-linecap:butt;stroke-linejoin:round"
+               x="221.8"
+               xlink:href="#m08a1dea9da"
+               y="145.36688"
+               id="use398"
+               width="100%"
+               height="100%" />
+          </g>
+        </g>
+        <g
+           id="text_16"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <!-- van-der-Waals -->
+          <defs
+             id="defs410">
+            <path
+               d="M 21,0 1.265625,51.859375 h 9.28125 L 21.6875,20.796875 q 1.796875,-5.03125 3.3125,-10.4375 1.171875,4.09375 3.265625,9.859375 l 11.53125,31.640625 h 9.03125 L 29.203125,0 Z"
+               id="ArialMT-118"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="M 6.59375,0 V 51.859375 H 14.5 v -7.375 q 5.71875,8.546875 16.5,8.546875 4.6875,0 8.625,-1.6875 3.9375,-1.6875 5.890625,-4.421875 Q 47.46875,44.1875 48.25,40.4375 48.734375,37.984375 48.734375,31.890625 V 0 H 39.9375 v 31.546875 q 0,5.375 -1.03125,8.03125 -1.015625,2.65625 -3.625,4.234375 -2.609375,1.59375 -6.125,1.59375 -5.625,0 -9.703125,-3.5625 Q 15.375,38.28125 15.375,28.328125 V 0 Z"
+               id="ArialMT-110"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 3.171875,21.484375 v 8.84375 h 27 v -8.84375 z"
+               id="ArialMT-45"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 42.09375,16.703125 9.078125,-1.125 Q 49.03125,7.625 43.21875,3.21875 37.40625,-1.171875 28.375,-1.171875 q -11.375,0 -18.046875,7 -6.671875,7.015625 -6.671875,19.65625 0,13.09375 6.734375,20.3125 6.75,7.234375 17.484375,7.234375 10.40625,0 17,-7.078125 6.59375,-7.078125 6.59375,-19.921875 0,-0.78125 -0.04687,-2.34375 H 12.75 q 0.484375,-8.546875 4.828125,-13.09375 4.34375,-4.53125 10.84375,-4.53125 4.828125,0 8.25,2.53125 3.421875,2.546875 5.421875,8.109375 z M 13.234375,30.90625 H 42.1875 q -0.578125,6.546875 -3.3125,9.8125 -4.203125,5.078125 -10.890625,5.078125 -6.0625,0 -10.1875,-4.046875 -4.125,-4.046875 -4.5625,-10.84375 z"
+               id="ArialMT-101"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 6.5,0 v 51.859375 h 7.90625 V 44 Q 17.4375,49.515625 20,51.265625 q 2.5625,1.765625 5.640625,1.765625 4.4375,0 9.03125,-2.828125 l -3.03125,-8.15625 q -3.21875,1.90625 -6.4375,1.90625 -2.890625,0 -5.1875,-1.734375 -2.296875,-1.734375 -3.265625,-4.8125 -1.46875,-4.6875 -1.46875,-10.25 V 0 Z"
+               id="ArialMT-114"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 20.21875,0 -19,71.578125 H 10.9375 L 21.828125,24.65625 q 1.75,-7.375 3.03125,-14.640625 2.734375,11.46875 3.21875,13.234375 l 13.625,48.328125 H 53.125 l 10.25,-36.21875 q 3.859375,-13.484375 5.578125,-25.34375 1.359375,6.78125 3.5625,15.578125 l 11.21875,45.984375 h 9.53125 L 73.640625,0 H 64.5 L 49.421875,54.546875 q -1.90625,6.828125 -2.25,8.390625 -1.125,-4.921875 -2.109375,-8.390625 L 29.890625,0 Z"
+               id="ArialMT-87"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="m 3.078125,15.484375 8.6875,1.359375 Q 12.5,11.625 15.84375,8.84375 19.1875,6.0625 25.203125,6.0625 q 6.046875,0 8.96875,2.453125 2.9375,2.46875 2.9375,5.796875 0,2.96875 -2.59375,4.6875 Q 32.71875,20.171875 25.53125,21.96875 15.875,24.421875 12.140625,26.203125 8.40625,27.984375 6.46875,31.125 q -1.921875,3.15625 -1.921875,6.96875 0,3.453125 1.578125,6.40625 1.59375,2.96875 4.328125,4.921875 2.046875,1.5 5.578125,2.546875 3.546875,1.0625 7.609375,1.0625 6.09375,0 10.703125,-1.765625 4.625,-1.75 6.8125,-4.765625 2.203125,-3 3.03125,-8.015625 L 35.59375,37.3125 q -0.578125,4 -3.390625,6.234375 -2.8125,2.25 -7.9375,2.25 -6.046875,0 -8.640625,-2 -2.59375,-2 -2.59375,-4.6875 0,-1.703125 1.078125,-3.078125 1.078125,-1.40625 3.375,-2.34375 1.3125,-0.484375 7.765625,-2.234375 9.328125,-2.5 13,-4.09375 3.6875,-1.578125 5.78125,-4.609375 2.109375,-3.015625 2.109375,-7.515625 0,-4.390625 -2.5625,-8.28125 -2.5625,-3.875 -7.40625,-6 -4.828125,-2.125 -10.921875,-2.125 -10.109375,0 -15.40625,4.203125 -5.296875,4.203125 -6.765625,12.453125 z"
+               id="ArialMT-115"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0.22,0,0,-0.22,261.4,153.06687)"
+             id="g438">
+            <use
+               xlink:href="#ArialMT-118"
+               id="use412"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               x="0"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="50"
+               xlink:href="#ArialMT-97"
+               id="use414"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="105.61523"
+               xlink:href="#ArialMT-110"
+               id="use416"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="161.23047"
+               xlink:href="#ArialMT-45"
+               id="use418"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="194.53125"
+               xlink:href="#ArialMT-100"
+               id="use420"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="250.14648"
+               xlink:href="#ArialMT-101"
+               id="use422"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="305.76172"
+               xlink:href="#ArialMT-114"
+               id="use424"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="339.0625"
+               xlink:href="#ArialMT-45"
+               id="use426"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="372.36328"
+               xlink:href="#ArialMT-87"
+               id="use428"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="462.99805"
+               xlink:href="#ArialMT-97"
+               id="use430"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="518.61328"
+               xlink:href="#ArialMT-97"
+               id="use432"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="574.22852"
+               xlink:href="#ArialMT-108"
+               id="use434"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="596.44531"
+               xlink:href="#ArialMT-115"
+               id="use436"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+          </g>
+        </g>
+        <g
+           id="line2d_20"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <path
+             d="m 199.8,176.48656 h 44"
+             style="fill:none;stroke:#2ca02c;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
+             id="path441"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="line2d_21"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="g446"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <use
+               style="fill:#2ca02c;stroke:#2ca02c;stroke-linecap:butt;stroke-linejoin:round"
+               x="221.8"
+               xlink:href="#m133ce8f78c"
+               y="176.48656"
+               id="use444"
+               width="100%"
+               height="100%" />
+          </g>
+        </g>
+        <g
+           id="text_17"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <!-- restraint -->
+          <defs
+             id="defs451">
+            <path
+               d="M 25.78125,7.859375 27.046875,0.09375 Q 23.34375,-0.6875 20.40625,-0.6875 15.625,-0.6875 12.984375,0.828125 10.359375,2.34375 9.28125,4.8125 8.203125,7.28125 8.203125,15.1875 v 29.828125 h -6.4375 v 6.84375 h 6.4375 v 12.84375 L 16.9375,69.96875 V 51.859375 h 8.84375 v -6.84375 H 16.9375 v -30.3125 q 0,-3.765625 0.46875,-4.84375 0.46875,-1.0625 1.515625,-1.703125 1.046875,-0.640625 3,-0.640625 1.46875,0 3.859375,0.34375 z"
+               id="ArialMT-116"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               d="M 6.640625,61.46875 V 71.578125 H 15.4375 V 61.46875 Z M 6.640625,0 V 51.859375 H 15.4375 V 0 Z"
+               id="ArialMT-105"
+               inkscape:connector-curvature="0"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0.22,0,0,-0.22,261.4,184.18656)"
+             id="g471">
+            <use
+               xlink:href="#ArialMT-114"
+               id="use453"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               x="0"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="33.300781"
+               xlink:href="#ArialMT-101"
+               id="use455"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="88.916016"
+               xlink:href="#ArialMT-115"
+               id="use457"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="138.91602"
+               xlink:href="#ArialMT-116"
+               id="use459"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="166.69922"
+               xlink:href="#ArialMT-114"
+               id="use461"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="200"
+               xlink:href="#ArialMT-97"
+               id="use463"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="255.61523"
+               xlink:href="#ArialMT-105"
+               id="use465"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="277.83203"
+               xlink:href="#ArialMT-110"
+               id="use467"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+            <use
+               x="333.44727"
+               xlink:href="#ArialMT-116"
+               id="use469"
+               style="stroke-linecap:butt;stroke-linejoin:round"
+               y="0"
+               width="100%"
+               height="100%" />
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+  <defs
+     id="defs480">
+    <clipPath
+       id="p4c7292cf7d"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <rect
+         height="543.59998"
+         width="1116"
+         x="180"
+         y="86.400002"
+         id="rect477"
+         style="stroke-linecap:butt;stroke-linejoin:round" />
+    </clipPath>
+  </defs>
+  <g
+     id="figure_1-3"
+     style="stroke-linecap:butt;stroke-linejoin:round"
+     transform="matrix(0.66,0,0,0.66,4.8087745,614.42952)">
+    <g
+       id="axes_1-7"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <g
+         id="patch_2-5"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           d="M 97.2,630 H 640.8 V 86.4 H 97.2 Z"
+           style="fill:#ffffff;stroke-linecap:butt;stroke-linejoin:round"
+           id="path8456" />
+      </g>
+      <g
+         id="matplotlib.axis_1-3"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <g
+           id="xtick_1-5"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_1-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <defs
+               id="defs8460">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 0,0 V 12"
+                 id="path11283"
+                 style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               id="g8464"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="121.90909"
+                 xlink:href="#mb151bf601d"
+                 y="631"
+                 id="use8462" />
+            </g>
+          </g>
+          <g
+             id="text_1-2"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.0 -->
+            <defs
+               id="defs8469">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 4.15625,35.296875 q 0,12.703125 2.609375,20.4375 2.609375,7.75 7.75,11.9375 5.15625,4.203125 12.96875,4.203125 5.765625,0 10.109375,-2.328125 4.34375,-2.3125 7.171875,-6.6875 Q 47.609375,58.5 49.21875,52.21875 q 1.609375,-6.265625 1.609375,-16.921875 0,-12.59375 -2.59375,-20.328125 Q 45.65625,7.234375 40.5,3 35.359375,-1.21875 27.484375,-1.21875 q -10.34375,0 -16.25,7.421875 -7.078125,8.9375 -7.078125,29.09375 z m 9.03125,0 q 0,-17.625 4.125,-23.46875 Q 21.4375,6 27.484375,6 q 6.0625,0 10.1875,5.859375 4.125,5.859375 4.125,23.4375 0,17.6875 -4.125,23.484375 -4.125,5.8125 -10.28125,5.8125 -6.046875,0 -9.671875,-5.125 Q 13.1875,52.9375 13.1875,35.296875 Z"
+                 id="path11289"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 9.078125,0 V 10.015625 H 19.09375 V 0 Z"
+                 id="path11291"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,106.61909,662.24719)"
+               id="g8477">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8471"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8473"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8475"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_2-2"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_2-7"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8483"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="220.74545"
+                 xlink:href="#mb151bf601d"
+                 y="631"
+                 id="use8481" />
+            </g>
+          </g>
+          <g
+             id="text_2-0"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.2 -->
+            <defs
+               id="defs8487">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 50.34375,8.453125 V 0 H 3.03125 Q 2.9375,3.171875 4.046875,6.109375 5.859375,10.9375 9.828125,15.625 13.8125,20.3125 21.34375,26.46875 q 11.671875,9.5625 15.765625,15.15625 4.109375,5.59375 4.109375,10.578125 0,5.21875 -3.75,8.796875 -3.734375,3.59375 -9.734375,3.59375 -6.34375,0 -10.15625,-3.8125 Q 13.765625,56.984375 13.71875,50.25 L 4.6875,51.171875 q 0.921875,10.109375 6.96875,15.40625 6.0625,5.296875 16.28125,5.296875 10.296875,0 16.296875,-5.71875 Q 50.25,60.453125 50.25,52 50.25,47.703125 48.484375,43.546875 46.734375,39.40625 42.65625,34.8125 38.578125,30.21875 29.109375,22.21875 21.1875,15.578125 18.9375,13.203125 q -2.234375,-2.359375 -3.703125,-4.75 z"
+                 id="path11303"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,205.45545,662.24719)"
+               id="g8495">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8489"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8491"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-50-9"
+                 id="use8493"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_3-3"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_3-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8501"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="319.58182"
+                 xlink:href="#mb151bf601d"
+                 y="631"
+                 id="use8499" />
+            </g>
+          </g>
+          <g
+             id="text_3-0"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.4 -->
+            <defs
+               id="defs8505">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 32.328125,0 v 17.140625 h -31.0625 v 8.0625 l 32.671875,46.375 h 7.171875 v -46.375 h 9.671875 v -8.0625 H 41.109375 V 0 Z m 0,25.203125 V 57.46875 L 9.90625,25.203125 Z"
+                 id="path11315"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,304.29182,662.24719)"
+               id="g8513">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8507"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8509"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-52-6"
+                 id="use8511"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_4-2"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_4-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8519"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="418.41818"
+                 xlink:href="#mb151bf601d"
+                 y="631"
+                 id="use8517" />
+            </g>
+          </g>
+          <g
+             id="text_4-1"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.6 -->
+            <defs
+               id="defs8523">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 49.75,54.046875 41.015625,53.375 q -1.171875,5.171875 -3.3125,7.515625 -3.578125,3.765625 -8.796875,3.765625 -4.203125,0 -7.375,-2.34375 Q 17.390625,59.28125 14.984375,53.46875 12.59375,47.65625 12.5,36.921875 15.671875,41.75 20.265625,44.09375 q 4.59375,2.34375 9.625,2.34375 8.78125,0 14.953125,-6.46875 Q 51.03125,33.5 51.03125,23.25 51.03125,16.5 48.125,10.71875 45.21875,4.9375 40.140625,1.859375 35.0625,-1.21875 28.609375,-1.21875 17.625,-1.21875 10.6875,6.859375 3.765625,14.9375 3.765625,33.5 q 0,20.75 7.65625,30.171875 6.6875,8.203125 18.015625,8.203125 8.453125,0 13.84375,-4.734375 Q 48.6875,62.40625 49.75,54.046875 Z M 13.875,23.1875 q 0,-4.53125 1.921875,-8.6875 Q 17.71875,10.359375 21.1875,8.171875 24.65625,6 28.46875,6 q 5.5625,0 9.5625,4.484375 4.015625,4.5 4.015625,12.21875 0,7.421875 -3.96875,11.6875 -3.953125,4.28125 -9.953125,4.28125 -5.953125,0 -10.109375,-4.28125 Q 13.875,30.125 13.875,23.1875 Z"
+                 id="path11327"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,403.12818,662.24719)"
+               id="g8531">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8525"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8527"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-54-8"
+                 id="use8529"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_5-7"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_5-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8537"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="517.25452"
+                 xlink:href="#mb151bf601d"
+                 y="631"
+                 id="use8535" />
+            </g>
+          </g>
+          <g
+             id="text_5-2"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.8 -->
+            <defs
+               id="defs8541">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 17.671875,38.8125 q -5.46875,2.015625 -8.109375,5.71875 -2.625,3.71875 -2.625,8.890625 0,7.8125 5.609375,13.125 5.625,5.328125 14.9375,5.328125 9.375,0 15.09375,-5.453125 5.71875,-5.4375 5.71875,-13.25 0,-4.984375 -2.625,-8.671875 Q 43.0625,40.828125 37.75,38.8125 q 6.59375,-2.140625 10.03125,-6.9375 3.4375,-4.78125 3.4375,-11.421875 0,-9.171875 -6.5,-15.421875 -6.484375,-6.25 -17.078125,-6.25 -10.59375,0 -17.09375,6.265625 -6.5,6.28125 -6.5,15.65625 0,6.984375 3.546875,11.6875 3.546875,4.71875 10.078125,6.421875 z m -1.75,14.90625 q 0,-5.078125 3.265625,-8.3125 3.28125,-3.21875 8.5,-3.21875 5.078125,0 8.328125,3.1875 3.25,3.203125 3.25,7.84375 0,4.84375 -3.359375,8.140625 -3.34375,3.296875 -8.3125,3.296875 -5.03125,0 -8.359375,-3.234375 -3.3125,-3.21875 -3.3125,-7.703125 z M 13.09375,20.65625 q 0,-3.765625 1.78125,-7.28125 Q 16.65625,9.859375 20.171875,7.921875 23.6875,6 27.734375,6 34.03125,6 38.125,10.046875 q 4.109375,4.0625 4.109375,10.3125 0,6.34375 -4.21875,10.5 -4.21875,4.15625 -10.578125,4.15625 -6.203125,0 -10.28125,-4.109375 -4.0625,-4.09375 -4.0625,-10.25 z"
+                 id="path11339"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,501.96454,662.24719)"
+               id="g8549">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8543"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8545"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-56-0"
+                 id="use8547"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_6-2"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_6-3"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8555"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="616.09088"
+                 xlink:href="#mb151bf601d"
+                 y="631"
+                 id="use8553" />
+            </g>
+          </g>
+          <g
+             id="text_6-7"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 1.0 -->
+            <defs
+               id="defs8559">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 37.25,0 h -8.78125 v 56 q -3.171875,-3.015625 -8.328125,-6.046875 -5.15625,-3.03125 -9.25,-4.546875 v 8.5 q 7.375,3.46875 12.890625,8.390625 5.515625,4.9375 7.8125,9.578125 H 37.25 Z"
+                 id="path11351"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,600.80091,662.24719)"
+               id="g8567">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-49-5"
+                 id="use8561"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8563"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8565"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="text_7-9"
+           style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+           transform="matrix(2,0,0,2,-368.97984,-679.34969)">
+          <!-- coulomb -->
+          <defs
+             id="defs8577">
+            <path
+               inkscape:connector-curvature="0"
+               d="m 40.4375,19 8.640625,-1.125 Q 47.65625,8.9375 41.8125,3.875 35.984375,-1.171875 27.484375,-1.171875 16.84375,-1.171875 10.375,5.78125 3.90625,12.75 3.90625,25.734375 q 0,8.390625 2.78125,14.6875 2.78125,6.3125 8.46875,9.453125 5.6875,3.15625 12.390625,3.15625 8.4375,0 13.8125,-4.28125 5.375,-4.265625 6.890625,-12.125 l -8.546875,-1.328125 q -1.21875,5.234375 -4.328125,7.859375 -3.09375,2.640625 -7.5,2.640625 -6.640625,0 -10.796875,-4.765625 -4.140625,-4.75 -4.140625,-15.046875 0,-10.453125 4,-15.1875 Q 20.953125,6.0625 27.390625,6.0625 32.5625,6.0625 36.03125,9.234375 39.5,12.40625 40.4375,19 Z"
+               id="path11360"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 3.328125,25.921875 q 0,14.40625 8,21.34375 6.6875,5.765625 16.3125,5.765625 10.6875,0 17.46875,-7.015625 6.796875,-7 6.796875,-19.359375 0,-10 -3,-15.75 -3,-5.734375 -8.75,-8.90625 Q 34.421875,-1.171875 27.640625,-1.171875 16.75,-1.171875 10.03125,5.8125 3.328125,12.796875 3.328125,25.921875 Z m 9.03125,0 q 0,-9.953125 4.34375,-14.90625 4.34375,-4.953125 10.9375,-4.953125 6.546875,0 10.890625,4.96875 4.34375,4.984375 4.34375,15.1875 0,9.625 -4.375,14.578125 Q 34.125,45.75 27.640625,45.75 q -6.59375,0 -10.9375,-4.9375 -4.34375,-4.921875 -4.34375,-14.890625 z"
+               id="path11362"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 40.578125,0 v 7.625 q -6.0625,-8.796875 -16.453125,-8.796875 -4.59375,0 -8.578125,1.75 Q 11.578125,2.34375 9.640625,5 7.71875,7.671875 6.9375,11.53125 6.390625,14.109375 6.390625,19.734375 v 32.125 H 15.1875 V 23.09375 q 0,-6.875 0.53125,-9.28125 0.828125,-3.453125 3.515625,-5.4375 2.6875,-1.984375 6.640625,-1.984375 3.953125,0 7.421875,2.03125 3.46875,2.03125 4.90625,5.515625 1.453125,3.5 1.453125,10.140625 v 27.78125 H 48.4375 V 0 Z"
+               id="path11364"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 6.390625,0 V 71.578125 H 15.1875 V 0 Z"
+               id="path11366"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 6.59375,0 v 51.859375 h 7.859375 v -7.28125 q 2.4375,3.8125 6.484375,6.125 4.0625,2.328125 9.234375,2.328125 5.765625,0 9.453125,-2.390625 3.6875,-2.390625 5.203125,-6.6875 6.15625,9.078125 16.015625,9.078125 7.71875,0 11.859375,-4.28125 4.15625,-4.265625 4.15625,-13.15625 V 0 h -8.75 v 32.671875 q 0,5.265625 -0.859375,7.578125 -0.84375,2.328125 -3.09375,3.734375 -2.234375,1.421875 -5.265625,1.421875 -5.46875,0 -9.09375,-3.640625 Q 46.1875,38.140625 46.1875,30.125 V 0 h -8.78125 v 33.6875 q 0,5.859375 -2.15625,8.78125 -2.140625,2.9375 -7.03125,2.9375 -3.703125,0 -6.859375,-1.953125 Q 18.21875,41.5 16.796875,37.734375 15.375,33.984375 15.375,26.90625 V 0 Z"
+               id="path11368"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 14.703125,0 h -8.15625 v 71.578125 h 8.78125 v -25.53125 q 5.578125,6.984375 14.21875,6.984375 4.78125,0 9.046875,-1.9375 Q 42.875,49.171875 45.625,45.671875 48.390625,42.1875 49.953125,37.25 q 1.5625,-4.921875 1.5625,-10.546875 0,-13.328125 -6.59375,-20.609375 -6.59375,-7.265625 -15.8125,-7.265625 -9.1875,0 -14.40625,7.671875 z M 14.59375,26.3125 Q 14.59375,17 17.140625,12.84375 21.296875,6.0625 28.375,6.0625 q 5.75,0 9.953125,5 4.203125,5 4.203125,14.921875 0,10.15625 -4.03125,14.984375 -4.03125,4.828125 -9.734375,4.828125 -5.765625,0 -9.96875,-5 -4.203125,-5 -4.203125,-14.484375 z"
+               id="path11370"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0.24,0,0,-0.24,323.64562,687.79844)"
+             id="g8593">
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="0"
+               xlink:href="#ArialMT-99-2"
+               id="use8579"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="50"
+               xlink:href="#ArialMT-111-2"
+               id="use8581"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="105.61523"
+               xlink:href="#ArialMT-117-8"
+               id="use8583"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="161.23047"
+               xlink:href="#ArialMT-108-9"
+               id="use8585"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="183.44727"
+               xlink:href="#ArialMT-111-2"
+               id="use8587"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="239.0625"
+               xlink:href="#ArialMT-109-7"
+               id="use8589"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="322.36328"
+               xlink:href="#ArialMT-98-3"
+               id="use8591"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+          </g>
+        </g>
+      </g>
+      <g
+         id="matplotlib.axis_2-6"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <g
+           id="ytick_1-1"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_7-2"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <defs
+               id="defs8598">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 0,0 H -12"
+                 id="path11383"
+                 style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               id="g8602"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#m6aa5d295c1"
+                 y="605.29089"
+                 id="use8600" />
+            </g>
+          </g>
+          <g
+             id="text_8-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.0 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,613.1645)"
+               id="g8611">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8605"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8607"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8609"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_2-3"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_8-1"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8617"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#m6aa5d295c1"
+                 y="506.45456"
+                 id="use8615" />
+            </g>
+          </g>
+          <g
+             id="text_9-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.2 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,514.32814)"
+               id="g8626">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8620"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8622"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-50-9"
+                 id="use8624"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_3-4"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_9-7"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8632"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#m6aa5d295c1"
+                 y="407.61819"
+                 id="use8630" />
+            </g>
+          </g>
+          <g
+             id="text_10-8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.4 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,415.49178)"
+               id="g8641">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8635"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8637"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-52-6"
+                 id="use8639"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_4-4"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_10-5"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8647"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#m6aa5d295c1"
+                 y="308.78183"
+                 id="use8645" />
+            </g>
+          </g>
+          <g
+             id="text_11-0"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.6 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,316.65541)"
+               id="g8656">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8650"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8652"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-54-8"
+                 id="use8654"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_5-3"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_11-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8662"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#m6aa5d295c1"
+                 y="209.94545"
+                 id="use8660" />
+            </g>
+          </g>
+          <g
+             id="text_12-1"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.8 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,217.81905)"
+               id="g8671">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8665"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8667"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-56-0"
+                 id="use8669"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_6-0"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_12-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8677"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#m6aa5d295c1"
+                 y="111.10909"
+                 id="use8675" />
+            </g>
+          </g>
+          <g
+             id="text_13-3"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 1.0 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,118.98269)"
+               id="g8686">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-49-5"
+                 id="use8680"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-1"
+                 id="use8682"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-9"
+                 id="use8684"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="text_14-2"
+           style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+           transform="matrix(2,0,0,2,-55.628522,-357.50507)">
+          <!-- restraint -->
+          <defs
+             id="defs8697">
+            <path
+               inkscape:connector-curvature="0"
+               d="m 6.5,0 v 51.859375 h 7.90625 V 44 Q 17.4375,49.515625 20,51.265625 q 2.5625,1.765625 5.640625,1.765625 4.4375,0 9.03125,-2.828125 l -3.03125,-8.15625 q -3.21875,1.90625 -6.4375,1.90625 -2.890625,0 -5.1875,-1.734375 -2.296875,-1.734375 -3.265625,-4.8125 -1.46875,-4.6875 -1.46875,-10.25 V 0 Z"
+               id="path11440"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 42.09375,16.703125 9.078125,-1.125 Q 49.03125,7.625 43.21875,3.21875 37.40625,-1.171875 28.375,-1.171875 q -11.375,0 -18.046875,7 -6.671875,7.015625 -6.671875,19.65625 0,13.09375 6.734375,20.3125 6.75,7.234375 17.484375,7.234375 10.40625,0 17,-7.078125 6.59375,-7.078125 6.59375,-19.921875 0,-0.78125 -0.04687,-2.34375 H 12.75 q 0.484375,-8.546875 4.828125,-13.09375 4.34375,-4.53125 10.84375,-4.53125 4.828125,0 8.25,2.53125 3.421875,2.546875 5.421875,8.109375 z M 13.234375,30.90625 H 42.1875 q -0.578125,6.546875 -3.3125,9.8125 -4.203125,5.078125 -10.890625,5.078125 -6.0625,0 -10.1875,-4.046875 -4.125,-4.046875 -4.5625,-10.84375 z"
+               id="path11442"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 3.078125,15.484375 8.6875,1.359375 Q 12.5,11.625 15.84375,8.84375 19.1875,6.0625 25.203125,6.0625 q 6.046875,0 8.96875,2.453125 2.9375,2.46875 2.9375,5.796875 0,2.96875 -2.59375,4.6875 Q 32.71875,20.171875 25.53125,21.96875 15.875,24.421875 12.140625,26.203125 8.40625,27.984375 6.46875,31.125 q -1.921875,3.15625 -1.921875,6.96875 0,3.453125 1.578125,6.40625 1.59375,2.96875 4.328125,4.921875 2.046875,1.5 5.578125,2.546875 3.546875,1.0625 7.609375,1.0625 6.09375,0 10.703125,-1.765625 4.625,-1.75 6.8125,-4.765625 2.203125,-3 3.03125,-8.015625 L 35.59375,37.3125 q -0.578125,4 -3.390625,6.234375 -2.8125,2.25 -7.9375,2.25 -6.046875,0 -8.640625,-2 -2.59375,-2 -2.59375,-4.6875 0,-1.703125 1.078125,-3.078125 1.078125,-1.40625 3.375,-2.34375 1.3125,-0.484375 7.765625,-2.234375 9.328125,-2.5 13,-4.09375 3.6875,-1.578125 5.78125,-4.609375 2.109375,-3.015625 2.109375,-7.515625 0,-4.390625 -2.5625,-8.28125 -2.5625,-3.875 -7.40625,-6 -4.828125,-2.125 -10.921875,-2.125 -10.109375,0 -15.40625,4.203125 -5.296875,4.203125 -6.765625,12.453125 z"
+               id="path11444"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 25.78125,7.859375 27.046875,0.09375 Q 23.34375,-0.6875 20.40625,-0.6875 15.625,-0.6875 12.984375,0.828125 10.359375,2.34375 9.28125,4.8125 8.203125,7.28125 8.203125,15.1875 v 29.828125 h -6.4375 v 6.84375 h 6.4375 v 12.84375 L 16.9375,69.96875 V 51.859375 h 8.84375 v -6.84375 H 16.9375 v -30.3125 q 0,-3.765625 0.46875,-4.84375 0.46875,-1.0625 1.515625,-1.703125 1.046875,-0.640625 3,-0.640625 1.46875,0 3.859375,0.34375 z"
+               id="path11446"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 40.4375,6.390625 Q 35.546875,2.25 31.03125,0.53125 q -4.515625,-1.703125 -9.6875,-1.703125 -8.546875,0 -13.140625,4.171875 -4.59375,4.171875 -4.59375,10.671875 0,3.8125 1.734375,6.953125 1.734375,3.15625 4.546875,5.0625 2.8125,1.90625 6.328125,2.875 2.578125,0.6875 7.8125,1.328125 10.640625,1.265625 15.671875,3.015625 0.04687,1.8125 0.04687,2.296875 0,5.375 -2.5,7.578125 -3.359375,2.96875 -10,2.96875 -6.203125,0 -9.15625,-2.171875 -2.953125,-2.171875 -4.375,-7.6875 L 5.125,37.0625 q 1.171875,5.515625 3.859375,8.90625 2.6875,3.390625 7.765625,5.21875 5.078125,1.84375 11.765625,1.84375 6.640625,0 10.78125,-1.5625 4.15625,-1.5625 6.109375,-3.9375 1.953125,-2.359375 2.734375,-5.984375 0.4375,-2.234375 0.4375,-8.09375 v -11.71875 q 0,-12.265625 0.5625,-15.515625 Q 49.703125,2.984375 51.375,0 h -9.1875 q -1.359375,2.734375 -1.75,6.390625 z M 39.703125,26.03125 Q 34.90625,24.078125 25.34375,22.703125 19.921875,21.921875 17.671875,20.9375 15.4375,19.96875 14.203125,18.09375 q -1.21875,-1.875 -1.21875,-4.171875 0,-3.515625 2.65625,-5.859375 2.671875,-2.34375 7.796875,-2.34375 5.078125,0 9.03125,2.21875 3.953125,2.21875 5.8125,6.078125 1.421875,2.984375 1.421875,8.78125 z"
+               id="path11448"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 6.640625,61.46875 V 71.578125 H 15.4375 V 61.46875 Z M 6.640625,0 V 51.859375 H 15.4375 V 0 Z"
+               id="path11450"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 6.59375,0 V 51.859375 H 14.5 v -7.375 q 5.71875,8.546875 16.5,8.546875 4.6875,0 8.625,-1.6875 3.9375,-1.6875 5.890625,-4.421875 Q 47.46875,44.1875 48.25,40.4375 48.734375,37.984375 48.734375,31.890625 V 0 H 39.9375 v 31.546875 q 0,5.375 -1.03125,8.03125 -1.015625,2.65625 -3.625,4.234375 -2.609375,1.59375 -6.125,1.59375 -5.625,0 -9.703125,-3.5625 Q 15.375,38.28125 15.375,28.328125 V 0 Z"
+               id="path11452"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0,-0.24,-0.24,0,41.35,401.54437)"
+             id="g8717">
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="0"
+               xlink:href="#ArialMT-114-0"
+               id="use8699"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="33.300781"
+               xlink:href="#ArialMT-101-6"
+               id="use8701"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="88.916016"
+               xlink:href="#ArialMT-115-1"
+               id="use8703"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="138.91602"
+               xlink:href="#ArialMT-116-5"
+               id="use8705"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="166.69922"
+               xlink:href="#ArialMT-114-0"
+               id="use8707"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="200"
+               xlink:href="#ArialMT-97-5"
+               id="use8709"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="255.61523"
+               xlink:href="#ArialMT-105-4"
+               id="use8711"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="277.83203"
+               xlink:href="#ArialMT-110-7"
+               id="use8713"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="333.44727"
+               xlink:href="#ArialMT-116-5"
+               id="use8715"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+          </g>
+        </g>
+      </g>
+      <g
+         id="line2d_13-6"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           clip-path="url(#pd0b2b36a21)"
+           d="m 121.90909,605.29091 h 98.83636 L 369,555.87273 616.09091,506.45454 V 457.03636 358.2 259.36364 111.10909 v 0 0"
+           style="fill:none;stroke:#1f77b4;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
+           id="path8721" />
+      </g>
+      <g
+         id="PathCollection_1"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <defs
+           id="defs8725">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 0,11.18034 c 2.965061,0 5.80908,-1.178031 7.905694,-3.274646 C 10.002309,5.80908 11.18034,2.965061 11.18034,0 c 0,-2.965061 -1.178031,-5.80908 -3.274646,-7.905694 C 5.80908,-10.002309 2.965061,-11.18034 0,-11.18034 c -2.965061,0 -5.80908,1.178031 -7.905694,3.274646 C -10.002309,-5.80908 -11.18034,-2.965061 -11.18034,0 c 0,2.965061 1.178031,5.80908 3.274646,7.905694 C -5.80908,10.002309 -2.965061,11.18034 0,11.18034 Z"
+             id="path11469"
+             style="stroke-linecap:butt;stroke-linejoin:round" />
+        </defs>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8729"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#3b4cc0;stroke:#3b4cc0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="121.90909"
+             xlink:href="#C0_0_77f4bb5082"
+             y="605.29089"
+             id="use8727" />
+        </g>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8733"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#5d7ce6;stroke:#5d7ce6;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="220.74545"
+             xlink:href="#C0_0_77f4bb5082"
+             y="605.29089"
+             id="use8731" />
+        </g>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8737"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#82a6fb;stroke:#82a6fb;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="369"
+             xlink:href="#C0_0_77f4bb5082"
+             y="555.87274"
+             id="use8735" />
+        </g>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8741"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#aac7fd;stroke:#aac7fd;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_77f4bb5082"
+             y="506.45456"
+             id="use8739" />
+        </g>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8745"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#cdd9ec;stroke:#cdd9ec;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_77f4bb5082"
+             y="457.03638"
+             id="use8743" />
+        </g>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8749"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#ead4c8;stroke:#ead4c8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_77f4bb5082"
+             y="358.20001"
+             id="use8747" />
+        </g>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8753"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#f7b89c;stroke:#f7b89c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_77f4bb5082"
+             y="259.36365"
+             id="use8751" />
+        </g>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8757"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#f18d6f;stroke:#f18d6f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_77f4bb5082"
+             y="111.10909"
+             id="use8755" />
+        </g>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8761"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#d95847;stroke:#d95847;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_77f4bb5082"
+             y="111.10909"
+             id="use8759" />
+        </g>
+        <g
+           clip-path="url(#pd0b2b36a21)"
+           id="g8765"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#b40426;stroke:#b40426;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_77f4bb5082"
+             y="111.10909"
+             id="use8763" />
+        </g>
+      </g>
+      <g
+         id="patch_3-5"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           d="M 96.2,630 V 86.4"
+           style="fill:none;stroke:#262626;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter"
+           id="path8768" />
+      </g>
+      <g
+         id="patch_4-6"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           d="M 97.2,631 H 640.8"
+           style="fill:none;stroke:#262626;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter"
+           id="path8771" />
+      </g>
+    </g>
+  </g>
+  <g
+     id="figure_1-9"
+     style="stroke-linecap:butt;stroke-linejoin:round"
+     transform="matrix(0.66,0,0,0.66,426.23864,614.42952)">
+    <g
+       id="axes_1-74"
+       style="stroke-linecap:butt;stroke-linejoin:round">
+      <g
+         id="patch_2-52"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           d="M 97.2,630 H 640.8 V 86.4 H 97.2 Z"
+           style="fill:#ffffff;stroke-linecap:butt;stroke-linejoin:round"
+           id="path8794" />
+      </g>
+      <g
+         id="matplotlib.axis_1-5"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <g
+           id="xtick_1-4"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_1-7"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <defs
+               id="defs8798">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 0,0 V 12"
+                 id="path12032"
+                 style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               id="g8802"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="121.90909"
+                 xlink:href="#md5c0e90bf0"
+                 y="631"
+                 id="use8800" />
+            </g>
+          </g>
+          <g
+             id="text_1-4"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.0 -->
+            <defs
+               id="defs8807">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 4.15625,35.296875 q 0,12.703125 2.609375,20.4375 2.609375,7.75 7.75,11.9375 5.15625,4.203125 12.96875,4.203125 5.765625,0 10.109375,-2.328125 4.34375,-2.3125 7.171875,-6.6875 Q 47.609375,58.5 49.21875,52.21875 q 1.609375,-6.265625 1.609375,-16.921875 0,-12.59375 -2.59375,-20.328125 Q 45.65625,7.234375 40.5,3 35.359375,-1.21875 27.484375,-1.21875 q -10.34375,0 -16.25,7.421875 -7.078125,8.9375 -7.078125,29.09375 z m 9.03125,0 q 0,-17.625 4.125,-23.46875 Q 21.4375,6 27.484375,6 q 6.0625,0 10.1875,5.859375 4.125,5.859375 4.125,23.4375 0,17.6875 -4.125,23.484375 -4.125,5.8125 -10.28125,5.8125 -6.046875,0 -9.671875,-5.125 Q 13.1875,52.9375 13.1875,35.296875 Z"
+                 id="path12038"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 9.078125,0 V 10.015625 H 19.09375 V 0 Z"
+                 id="path12040"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,106.61909,662.24719)"
+               id="g8815">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8809"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8811"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8813"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_2-0"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_2-78"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8821"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="220.74545"
+                 xlink:href="#md5c0e90bf0"
+                 y="631"
+                 id="use8819" />
+            </g>
+          </g>
+          <g
+             id="text_2-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.2 -->
+            <defs
+               id="defs8825">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 50.34375,8.453125 V 0 H 3.03125 Q 2.9375,3.171875 4.046875,6.109375 5.859375,10.9375 9.828125,15.625 13.8125,20.3125 21.34375,26.46875 q 11.671875,9.5625 15.765625,15.15625 4.109375,5.59375 4.109375,10.578125 0,5.21875 -3.75,8.796875 -3.734375,3.59375 -9.734375,3.59375 -6.34375,0 -10.15625,-3.8125 Q 13.765625,56.984375 13.71875,50.25 L 4.6875,51.171875 q 0.921875,10.109375 6.96875,15.40625 6.0625,5.296875 16.28125,5.296875 10.296875,0 16.296875,-5.71875 Q 50.25,60.453125 50.25,52 50.25,47.703125 48.484375,43.546875 46.734375,39.40625 42.65625,34.8125 38.578125,30.21875 29.109375,22.21875 21.1875,15.578125 18.9375,13.203125 q -2.234375,-2.359375 -3.703125,-4.75 z"
+                 id="path12052"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,205.45545,662.24719)"
+               id="g8833">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8827"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8829"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-50-8"
+                 id="use8831"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_3-8"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_3-4"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8839"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="319.58182"
+                 xlink:href="#md5c0e90bf0"
+                 y="631"
+                 id="use8837" />
+            </g>
+          </g>
+          <g
+             id="text_3-3"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.4 -->
+            <defs
+               id="defs8843">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 32.328125,0 v 17.140625 h -31.0625 v 8.0625 l 32.671875,46.375 h 7.171875 v -46.375 h 9.671875 v -8.0625 H 41.109375 V 0 Z m 0,25.203125 V 57.46875 L 9.90625,25.203125 Z"
+                 id="path12064"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,304.29182,662.24719)"
+               id="g8851">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8845"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8847"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-52-1"
+                 id="use8849"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_4-4"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_4-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8857"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="418.41818"
+                 xlink:href="#md5c0e90bf0"
+                 y="631"
+                 id="use8855" />
+            </g>
+          </g>
+          <g
+             id="text_4-2"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.6 -->
+            <defs
+               id="defs8861">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 49.75,54.046875 41.015625,53.375 q -1.171875,5.171875 -3.3125,7.515625 -3.578125,3.765625 -8.796875,3.765625 -4.203125,0 -7.375,-2.34375 Q 17.390625,59.28125 14.984375,53.46875 12.59375,47.65625 12.5,36.921875 15.671875,41.75 20.265625,44.09375 q 4.59375,2.34375 9.625,2.34375 8.78125,0 14.953125,-6.46875 Q 51.03125,33.5 51.03125,23.25 51.03125,16.5 48.125,10.71875 45.21875,4.9375 40.140625,1.859375 35.0625,-1.21875 28.609375,-1.21875 17.625,-1.21875 10.6875,6.859375 3.765625,14.9375 3.765625,33.5 q 0,20.75 7.65625,30.171875 6.6875,8.203125 18.015625,8.203125 8.453125,0 13.84375,-4.734375 Q 48.6875,62.40625 49.75,54.046875 Z M 13.875,23.1875 q 0,-4.53125 1.921875,-8.6875 Q 17.71875,10.359375 21.1875,8.171875 24.65625,6 28.46875,6 q 5.5625,0 9.5625,4.484375 4.015625,4.5 4.015625,12.21875 0,7.421875 -3.96875,11.6875 -3.953125,4.28125 -9.953125,4.28125 -5.953125,0 -10.109375,-4.28125 Q 13.875,30.125 13.875,23.1875 Z"
+                 id="path12076"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,403.12818,662.24719)"
+               id="g8869">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8863"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8865"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-54-0"
+                 id="use8867"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_5-6"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_5-8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8875"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="517.25452"
+                 xlink:href="#md5c0e90bf0"
+                 y="631"
+                 id="use8873" />
+            </g>
+          </g>
+          <g
+             id="text_5-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.8 -->
+            <defs
+               id="defs8879">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 17.671875,38.8125 q -5.46875,2.015625 -8.109375,5.71875 -2.625,3.71875 -2.625,8.890625 0,7.8125 5.609375,13.125 5.625,5.328125 14.9375,5.328125 9.375,0 15.09375,-5.453125 5.71875,-5.4375 5.71875,-13.25 0,-4.984375 -2.625,-8.671875 Q 43.0625,40.828125 37.75,38.8125 q 6.59375,-2.140625 10.03125,-6.9375 3.4375,-4.78125 3.4375,-11.421875 0,-9.171875 -6.5,-15.421875 -6.484375,-6.25 -17.078125,-6.25 -10.59375,0 -17.09375,6.265625 -6.5,6.28125 -6.5,15.65625 0,6.984375 3.546875,11.6875 3.546875,4.71875 10.078125,6.421875 z m -1.75,14.90625 q 0,-5.078125 3.265625,-8.3125 3.28125,-3.21875 8.5,-3.21875 5.078125,0 8.328125,3.1875 3.25,3.203125 3.25,7.84375 0,4.84375 -3.359375,8.140625 -3.34375,3.296875 -8.3125,3.296875 -5.03125,0 -8.359375,-3.234375 -3.3125,-3.21875 -3.3125,-7.703125 z M 13.09375,20.65625 q 0,-3.765625 1.78125,-7.28125 Q 16.65625,9.859375 20.171875,7.921875 23.6875,6 27.734375,6 34.03125,6 38.125,10.046875 q 4.109375,4.0625 4.109375,10.3125 0,6.34375 -4.21875,10.5 -4.21875,4.15625 -10.578125,4.15625 -6.203125,0 -10.28125,-4.109375 -4.0625,-4.09375 -4.0625,-10.25 z"
+                 id="path12088"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,501.96454,662.24719)"
+               id="g8887">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8881"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8883"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-56-2"
+                 id="use8885"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_6-6"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_6-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8893"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="616.09088"
+                 xlink:href="#md5c0e90bf0"
+                 y="631"
+                 id="use8891" />
+            </g>
+          </g>
+          <g
+             id="text_6-4"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 1.0 -->
+            <defs
+               id="defs8897">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 37.25,0 h -8.78125 v 56 q -3.171875,-3.015625 -8.328125,-6.046875 -5.15625,-3.03125 -9.25,-4.546875 v 8.5 q 7.375,3.46875 12.890625,8.390625 5.515625,4.9375 7.8125,9.578125 H 37.25 Z"
+                 id="path12100"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,600.80091,662.24719)"
+               id="g8905">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-49-9"
+                 id="use8899"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8901"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8903"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="text_7-5"
+           style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+           transform="matrix(2,0,0,2,-368.97984,-679.34969)">
+          <!-- coulomb -->
+          <defs
+             id="defs8915">
+            <path
+               inkscape:connector-curvature="0"
+               d="m 40.4375,19 8.640625,-1.125 Q 47.65625,8.9375 41.8125,3.875 35.984375,-1.171875 27.484375,-1.171875 16.84375,-1.171875 10.375,5.78125 3.90625,12.75 3.90625,25.734375 q 0,8.390625 2.78125,14.6875 2.78125,6.3125 8.46875,9.453125 5.6875,3.15625 12.390625,3.15625 8.4375,0 13.8125,-4.28125 5.375,-4.265625 6.890625,-12.125 l -8.546875,-1.328125 q -1.21875,5.234375 -4.328125,7.859375 -3.09375,2.640625 -7.5,2.640625 -6.640625,0 -10.796875,-4.765625 -4.140625,-4.75 -4.140625,-15.046875 0,-10.453125 4,-15.1875 Q 20.953125,6.0625 27.390625,6.0625 32.5625,6.0625 36.03125,9.234375 39.5,12.40625 40.4375,19 Z"
+               id="path12109"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 3.328125,25.921875 q 0,14.40625 8,21.34375 6.6875,5.765625 16.3125,5.765625 10.6875,0 17.46875,-7.015625 6.796875,-7 6.796875,-19.359375 0,-10 -3,-15.75 -3,-5.734375 -8.75,-8.90625 Q 34.421875,-1.171875 27.640625,-1.171875 16.75,-1.171875 10.03125,5.8125 3.328125,12.796875 3.328125,25.921875 Z m 9.03125,0 q 0,-9.953125 4.34375,-14.90625 4.34375,-4.953125 10.9375,-4.953125 6.546875,0 10.890625,4.96875 4.34375,4.984375 4.34375,15.1875 0,9.625 -4.375,14.578125 Q 34.125,45.75 27.640625,45.75 q -6.59375,0 -10.9375,-4.9375 -4.34375,-4.921875 -4.34375,-14.890625 z"
+               id="path12111"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 40.578125,0 v 7.625 q -6.0625,-8.796875 -16.453125,-8.796875 -4.59375,0 -8.578125,1.75 Q 11.578125,2.34375 9.640625,5 7.71875,7.671875 6.9375,11.53125 6.390625,14.109375 6.390625,19.734375 v 32.125 H 15.1875 V 23.09375 q 0,-6.875 0.53125,-9.28125 0.828125,-3.453125 3.515625,-5.4375 2.6875,-1.984375 6.640625,-1.984375 3.953125,0 7.421875,2.03125 3.46875,2.03125 4.90625,5.515625 1.453125,3.5 1.453125,10.140625 v 27.78125 H 48.4375 V 0 Z"
+               id="path12113"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 6.390625,0 V 71.578125 H 15.1875 V 0 Z"
+               id="path12115"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 6.59375,0 v 51.859375 h 7.859375 v -7.28125 q 2.4375,3.8125 6.484375,6.125 4.0625,2.328125 9.234375,2.328125 5.765625,0 9.453125,-2.390625 3.6875,-2.390625 5.203125,-6.6875 6.15625,9.078125 16.015625,9.078125 7.71875,0 11.859375,-4.28125 4.15625,-4.265625 4.15625,-13.15625 V 0 h -8.75 v 32.671875 q 0,5.265625 -0.859375,7.578125 -0.84375,2.328125 -3.09375,3.734375 -2.234375,1.421875 -5.265625,1.421875 -5.46875,0 -9.09375,-3.640625 Q 46.1875,38.140625 46.1875,30.125 V 0 h -8.78125 v 33.6875 q 0,5.859375 -2.15625,8.78125 -2.140625,2.9375 -7.03125,2.9375 -3.703125,0 -6.859375,-1.953125 Q 18.21875,41.5 16.796875,37.734375 15.375,33.984375 15.375,26.90625 V 0 Z"
+               id="path12117"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 14.703125,0 h -8.15625 v 71.578125 h 8.78125 v -25.53125 q 5.578125,6.984375 14.21875,6.984375 4.78125,0 9.046875,-1.9375 Q 42.875,49.171875 45.625,45.671875 48.390625,42.1875 49.953125,37.25 q 1.5625,-4.921875 1.5625,-10.546875 0,-13.328125 -6.59375,-20.609375 -6.59375,-7.265625 -15.8125,-7.265625 -9.1875,0 -14.40625,7.671875 z M 14.59375,26.3125 Q 14.59375,17 17.140625,12.84375 21.296875,6.0625 28.375,6.0625 q 5.75,0 9.953125,5 4.203125,5 4.203125,14.921875 0,10.15625 -4.03125,14.984375 -4.03125,4.828125 -9.734375,4.828125 -5.765625,0 -9.96875,-5 -4.203125,-5 -4.203125,-14.484375 z"
+               id="path12119"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0.24,0,0,-0.24,323.64562,687.79844)"
+             id="g8931">
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="0"
+               xlink:href="#ArialMT-99-0"
+               id="use8917"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="50"
+               xlink:href="#ArialMT-111-4"
+               id="use8919"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="105.61523"
+               xlink:href="#ArialMT-117-87"
+               id="use8921"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="161.23047"
+               xlink:href="#ArialMT-108-1"
+               id="use8923"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="183.44727"
+               xlink:href="#ArialMT-111-4"
+               id="use8925"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="239.0625"
+               xlink:href="#ArialMT-109-72"
+               id="use8927"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="322.36328"
+               xlink:href="#ArialMT-98-7"
+               id="use8929"
+               style="fill:#1f77b4;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+          </g>
+        </g>
+      </g>
+      <g
+         id="matplotlib.axis_2-2"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <g
+           id="ytick_1-2"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_7-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <defs
+               id="defs8936">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 0,0 H -12"
+                 id="path12132"
+                 style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               id="g8940"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#md12e1c0dc4"
+                 y="605.29089"
+                 id="use8938" />
+            </g>
+          </g>
+          <g
+             id="text_8-1"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.0 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,613.1645)"
+               id="g8949">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8943"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8945"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8947"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_2-0"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_8-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8955"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#md12e1c0dc4"
+                 y="506.45456"
+                 id="use8953" />
+            </g>
+          </g>
+          <g
+             id="text_9-1"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.2 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,514.32814)"
+               id="g8964">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8958"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8960"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-50-8"
+                 id="use8962"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_3-5"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_9-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8970"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#md12e1c0dc4"
+                 y="407.61819"
+                 id="use8968" />
+            </g>
+          </g>
+          <g
+             id="text_10-4"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.4 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,415.49178)"
+               id="g8979">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8973"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8975"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-52-1"
+                 id="use8977"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_4-9"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_10-0"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8985"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#md12e1c0dc4"
+                 y="308.78183"
+                 id="use8983" />
+            </g>
+          </g>
+          <g
+             id="text_11-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.6 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,316.65541)"
+               id="g8994">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use8988"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use8990"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-54-0"
+                 id="use8992"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_5-1"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_11-7"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g9000"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#md12e1c0dc4"
+                 y="209.94545"
+                 id="use8998" />
+            </g>
+          </g>
+          <g
+             id="text_12-7"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.8 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,217.81905)"
+               id="g9009">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-4"
+                 id="use9003"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use9005"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-56-2"
+                 id="use9007"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_6-1"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_12-1"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g9015"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="96.199997"
+                 xlink:href="#md12e1c0dc4"
+                 y="111.10909"
+                 id="use9013" />
+            </g>
+          </g>
+          <g
+             id="text_13-5"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 1.0 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,50.12,118.98269)"
+               id="g9024">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-49-9"
+                 id="use9018"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-3"
+                 id="use9020"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-4"
+                 id="use9022"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="text_14-9"
+           style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+           transform="matrix(2,0,0,2,-55.628522,-358.50656)">
+          <!-- van-der-Waals -->
+          <defs
+             id="defs9037">
+            <path
+               inkscape:connector-curvature="0"
+               d="M 21,0 1.265625,51.859375 h 9.28125 L 21.6875,20.796875 q 1.796875,-5.03125 3.3125,-10.4375 1.171875,4.09375 3.265625,9.859375 l 11.53125,31.640625 h 9.03125 L 29.203125,0 Z"
+               id="path12189"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 40.4375,6.390625 Q 35.546875,2.25 31.03125,0.53125 q -4.515625,-1.703125 -9.6875,-1.703125 -8.546875,0 -13.140625,4.171875 -4.59375,4.171875 -4.59375,10.671875 0,3.8125 1.734375,6.953125 1.734375,3.15625 4.546875,5.0625 2.8125,1.90625 6.328125,2.875 2.578125,0.6875 7.8125,1.328125 10.640625,1.265625 15.671875,3.015625 0.04687,1.8125 0.04687,2.296875 0,5.375 -2.5,7.578125 -3.359375,2.96875 -10,2.96875 -6.203125,0 -9.15625,-2.171875 -2.953125,-2.171875 -4.375,-7.6875 L 5.125,37.0625 q 1.171875,5.515625 3.859375,8.90625 2.6875,3.390625 7.765625,5.21875 5.078125,1.84375 11.765625,1.84375 6.640625,0 10.78125,-1.5625 4.15625,-1.5625 6.109375,-3.9375 1.953125,-2.359375 2.734375,-5.984375 0.4375,-2.234375 0.4375,-8.09375 v -11.71875 q 0,-12.265625 0.5625,-15.515625 Q 49.703125,2.984375 51.375,0 h -9.1875 q -1.359375,2.734375 -1.75,6.390625 z M 39.703125,26.03125 Q 34.90625,24.078125 25.34375,22.703125 19.921875,21.921875 17.671875,20.9375 15.4375,19.96875 14.203125,18.09375 q -1.21875,-1.875 -1.21875,-4.171875 0,-3.515625 2.65625,-5.859375 2.671875,-2.34375 7.796875,-2.34375 5.078125,0 9.03125,2.21875 3.953125,2.21875 5.8125,6.078125 1.421875,2.984375 1.421875,8.78125 z"
+               id="path12191"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 6.59375,0 V 51.859375 H 14.5 v -7.375 q 5.71875,8.546875 16.5,8.546875 4.6875,0 8.625,-1.6875 3.9375,-1.6875 5.890625,-4.421875 Q 47.46875,44.1875 48.25,40.4375 48.734375,37.984375 48.734375,31.890625 V 0 H 39.9375 v 31.546875 q 0,5.375 -1.03125,8.03125 -1.015625,2.65625 -3.625,4.234375 -2.609375,1.59375 -6.125,1.59375 -5.625,0 -9.703125,-3.5625 Q 15.375,38.28125 15.375,28.328125 V 0 Z"
+               id="path12193"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 3.171875,21.484375 v 8.84375 h 27 v -8.84375 z"
+               id="path12195"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 40.234375,0 v 6.546875 q -4.9375,-7.71875 -14.5,-7.71875 -6.203125,0 -11.40625,3.421875 -5.203125,3.421875 -8.0625,9.546875 -2.84375,6.125 -2.84375,14.078125 0,7.765625 2.578125,14.09375 2.59375,6.328125 7.765625,9.6875 5.1875,3.375 11.578125,3.375 4.6875,0 8.34375,-1.984375 3.671875,-1.96875 5.96875,-5.140625 v 25.671875 h 8.734375 V 0 Z m -27.78125,25.875 q 0,-9.953125 4.1875,-14.890625 Q 20.84375,6.0625 26.5625,6.0625 q 5.765625,0 9.78125,4.703125 4.03125,4.71875 4.03125,14.375 0,10.65625 -4.109375,15.625 Q 32.171875,45.75 26.171875,45.75 20.3125,45.75 16.375,40.96875 12.453125,36.1875 12.453125,25.875 Z"
+               id="path12197"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 42.09375,16.703125 9.078125,-1.125 Q 49.03125,7.625 43.21875,3.21875 37.40625,-1.171875 28.375,-1.171875 q -11.375,0 -18.046875,7 -6.671875,7.015625 -6.671875,19.65625 0,13.09375 6.734375,20.3125 6.75,7.234375 17.484375,7.234375 10.40625,0 17,-7.078125 6.59375,-7.078125 6.59375,-19.921875 0,-0.78125 -0.04687,-2.34375 H 12.75 q 0.484375,-8.546875 4.828125,-13.09375 4.34375,-4.53125 10.84375,-4.53125 4.828125,0 8.25,2.53125 3.421875,2.546875 5.421875,8.109375 z M 13.234375,30.90625 H 42.1875 q -0.578125,6.546875 -3.3125,9.8125 -4.203125,5.078125 -10.890625,5.078125 -6.0625,0 -10.1875,-4.046875 -4.125,-4.046875 -4.5625,-10.84375 z"
+               id="path12199"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 6.5,0 v 51.859375 h 7.90625 V 44 Q 17.4375,49.515625 20,51.265625 q 2.5625,1.765625 5.640625,1.765625 4.4375,0 9.03125,-2.828125 l -3.03125,-8.15625 q -3.21875,1.90625 -6.4375,1.90625 -2.890625,0 -5.1875,-1.734375 -2.296875,-1.734375 -3.265625,-4.8125 -1.46875,-4.6875 -1.46875,-10.25 V 0 Z"
+               id="path12201"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 20.21875,0 -19,71.578125 H 10.9375 L 21.828125,24.65625 q 1.75,-7.375 3.03125,-14.640625 2.734375,11.46875 3.21875,13.234375 l 13.625,48.328125 H 53.125 l 10.25,-36.21875 q 3.859375,-13.484375 5.578125,-25.34375 1.359375,6.78125 3.5625,15.578125 l 11.21875,45.984375 h 9.53125 L 73.640625,0 H 64.5 L 49.421875,54.546875 q -1.90625,6.828125 -2.25,8.390625 -1.125,-4.921875 -2.109375,-8.390625 L 29.890625,0 Z"
+               id="path12203"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 3.078125,15.484375 8.6875,1.359375 Q 12.5,11.625 15.84375,8.84375 19.1875,6.0625 25.203125,6.0625 q 6.046875,0 8.96875,2.453125 2.9375,2.46875 2.9375,5.796875 0,2.96875 -2.59375,4.6875 Q 32.71875,20.171875 25.53125,21.96875 15.875,24.421875 12.140625,26.203125 8.40625,27.984375 6.46875,31.125 q -1.921875,3.15625 -1.921875,6.96875 0,3.453125 1.578125,6.40625 1.59375,2.96875 4.328125,4.921875 2.046875,1.5 5.578125,2.546875 3.546875,1.0625 7.609375,1.0625 6.09375,0 10.703125,-1.765625 4.625,-1.75 6.8125,-4.765625 2.203125,-3 3.03125,-8.015625 L 35.59375,37.3125 q -0.578125,4 -3.390625,6.234375 -2.8125,2.25 -7.9375,2.25 -6.046875,0 -8.640625,-2 -2.59375,-2 -2.59375,-4.6875 0,-1.703125 1.078125,-3.078125 1.078125,-1.40625 3.375,-2.34375 1.3125,-0.484375 7.765625,-2.234375 9.328125,-2.5 13,-4.09375 3.6875,-1.578125 5.78125,-4.609375 2.109375,-3.015625 2.109375,-7.515625 0,-4.390625 -2.5625,-8.28125 -2.5625,-3.875 -7.40625,-6 -4.828125,-2.125 -10.921875,-2.125 -10.109375,0 -15.40625,4.203125 -5.296875,4.203125 -6.765625,12.453125 z"
+               id="path12205"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0,-0.24,-0.24,0,41.35,435.76875)"
+             id="g9065">
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="0"
+               xlink:href="#ArialMT-118-7"
+               id="use9039"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="50"
+               xlink:href="#ArialMT-97-7"
+               id="use9041"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="105.61523"
+               xlink:href="#ArialMT-110-6"
+               id="use9043"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="161.23047"
+               xlink:href="#ArialMT-45-7"
+               id="use9045"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="194.53125"
+               xlink:href="#ArialMT-100-3"
+               id="use9047"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="250.14648"
+               xlink:href="#ArialMT-101-65"
+               id="use9049"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="305.76172"
+               xlink:href="#ArialMT-114-6"
+               id="use9051"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="339.0625"
+               xlink:href="#ArialMT-45-7"
+               id="use9053"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="372.36328"
+               xlink:href="#ArialMT-87-3"
+               id="use9055"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="462.99805"
+               xlink:href="#ArialMT-97-7"
+               id="use9057"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="518.61328"
+               xlink:href="#ArialMT-97-7"
+               id="use9059"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="574.22852"
+               xlink:href="#ArialMT-108-1"
+               id="use9061"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="596.44531"
+               xlink:href="#ArialMT-115-9"
+               id="use9063"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+          </g>
+        </g>
+      </g>
+      <g
+         id="line2d_13-4"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           clip-path="url(#p926a99d168)"
+           d="M 121.90909,605.29091 H 220.74545 369 616.09091 V 407.61818 358.2 308.78182 259.36364 209.94545 111.10909"
+           style="fill:none;stroke:#1f77b4;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
+           id="path9069" />
+      </g>
+      <g
+         id="PathCollection_1-8"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <defs
+           id="defs9073">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 0,11.18034 c 2.965061,0 5.80908,-1.178031 7.905694,-3.274646 C 10.002309,5.80908 11.18034,2.965061 11.18034,0 c 0,-2.965061 -1.178031,-5.80908 -3.274646,-7.905694 C 5.80908,-10.002309 2.965061,-11.18034 0,-11.18034 c -2.965061,0 -5.80908,1.178031 -7.905694,3.274646 C -10.002309,-5.80908 -11.18034,-2.965061 -11.18034,0 c 0,2.965061 1.178031,5.80908 3.274646,7.905694 C -5.80908,10.002309 -2.965061,11.18034 0,11.18034 Z"
+             id="path12226"
+             style="stroke-linecap:butt;stroke-linejoin:round" />
+        </defs>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9077"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#3b4cc0;stroke:#3b4cc0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="121.90909"
+             xlink:href="#C0_0_81ac4683e5"
+             y="605.29089"
+             id="use9075" />
+        </g>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9081"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#5d7ce6;stroke:#5d7ce6;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="220.74545"
+             xlink:href="#C0_0_81ac4683e5"
+             y="605.29089"
+             id="use9079" />
+        </g>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9085"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#82a6fb;stroke:#82a6fb;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="369"
+             xlink:href="#C0_0_81ac4683e5"
+             y="605.29089"
+             id="use9083" />
+        </g>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9089"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#aac7fd;stroke:#aac7fd;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_81ac4683e5"
+             y="605.29089"
+             id="use9087" />
+        </g>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9093"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#cdd9ec;stroke:#cdd9ec;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_81ac4683e5"
+             y="407.61819"
+             id="use9091" />
+        </g>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9097"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#ead4c8;stroke:#ead4c8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_81ac4683e5"
+             y="358.20001"
+             id="use9095" />
+        </g>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9101"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#f7b89c;stroke:#f7b89c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_81ac4683e5"
+             y="308.78183"
+             id="use9099" />
+        </g>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9105"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#f18d6f;stroke:#f18d6f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_81ac4683e5"
+             y="259.36365"
+             id="use9103" />
+        </g>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9109"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#d95847;stroke:#d95847;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_81ac4683e5"
+             y="209.94545"
+             id="use9107" />
+        </g>
+        <g
+           clip-path="url(#p926a99d168)"
+           id="g9113"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#b40426;stroke:#b40426;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="616.09088"
+             xlink:href="#C0_0_81ac4683e5"
+             y="111.10909"
+             id="use9111" />
+        </g>
+      </g>
+      <g
+         id="patch_3-1"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           d="M 96.2,630 V 86.4"
+           style="fill:none;stroke:#262626;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter"
+           id="path9116" />
+      </g>
+      <g
+         id="patch_4-2"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           d="M 97.2,631 H 640.8"
+           style="fill:none;stroke:#262626;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter"
+           id="path9119" />
+      </g>
+    </g>
+  </g>
+  <g
+     id="figure_1-93"
+     style="stroke-linecap:butt;stroke-linejoin:round"
+     transform="matrix(0.66,0,0,0.66,922.06851,652.04952)">
+    <g
+       id="axes_1-0"
+       style="stroke-linecap:butt;stroke-linejoin:round"
+       transform="translate(-90,-57)">
+      <g
+         id="patch_2-8"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           d="M 90,630 H 648 V 86.4 H 90 Z"
+           style="fill:#ffffff;stroke-linecap:butt;stroke-linejoin:round"
+           id="path8107" />
+      </g>
+      <g
+         id="matplotlib.axis_1-8"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <g
+           id="xtick_1-50"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_1-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <defs
+               id="defs8111">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 0,0 V 12"
+                 id="path12784"
+                 style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               id="g8115"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="115.36363"
+                 xlink:href="#m1d07b8e1b7"
+                 y="631"
+                 id="use8113" />
+            </g>
+          </g>
+          <g
+             id="text_1-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.0 -->
+            <defs
+               id="defs8120">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 4.15625,35.296875 q 0,12.703125 2.609375,20.4375 2.609375,7.75 7.75,11.9375 5.15625,4.203125 12.96875,4.203125 5.765625,0 10.109375,-2.328125 4.34375,-2.3125 7.171875,-6.6875 Q 47.609375,58.5 49.21875,52.21875 q 1.609375,-6.265625 1.609375,-16.921875 0,-12.59375 -2.59375,-20.328125 Q 45.65625,7.234375 40.5,3 35.359375,-1.21875 27.484375,-1.21875 q -10.34375,0 -16.25,7.421875 -7.078125,8.9375 -7.078125,29.09375 z m 9.03125,0 q 0,-17.625 4.125,-23.46875 Q 21.4375,6 27.484375,6 q 6.0625,0 10.1875,5.859375 4.125,5.859375 4.125,23.4375 0,17.6875 -4.125,23.484375 -4.125,5.8125 -10.28125,5.8125 -6.046875,0 -9.671875,-5.125 Q 13.1875,52.9375 13.1875,35.296875 Z"
+                 id="path12790"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 9.078125,0 V 10.015625 H 19.09375 V 0 Z"
+                 id="path12792"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,100.07364,662.24719)"
+               id="g8128">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8122"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8124"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8126"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_2-5"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_2-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8134"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="216.81818"
+                 xlink:href="#m1d07b8e1b7"
+                 y="631"
+                 id="use8132" />
+            </g>
+          </g>
+          <g
+             id="text_2-1"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.2 -->
+            <defs
+               id="defs8138">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 50.34375,8.453125 V 0 H 3.03125 Q 2.9375,3.171875 4.046875,6.109375 5.859375,10.9375 9.828125,15.625 13.8125,20.3125 21.34375,26.46875 q 11.671875,9.5625 15.765625,15.15625 4.109375,5.59375 4.109375,10.578125 0,5.21875 -3.75,8.796875 -3.734375,3.59375 -9.734375,3.59375 -6.34375,0 -10.15625,-3.8125 Q 13.765625,56.984375 13.71875,50.25 L 4.6875,51.171875 q 0.921875,10.109375 6.96875,15.40625 6.0625,5.296875 16.28125,5.296875 10.296875,0 16.296875,-5.71875 Q 50.25,60.453125 50.25,52 50.25,47.703125 48.484375,43.546875 46.734375,39.40625 42.65625,34.8125 38.578125,30.21875 29.109375,22.21875 21.1875,15.578125 18.9375,13.203125 q -2.234375,-2.359375 -3.703125,-4.75 z"
+                 id="path12804"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,201.52818,662.24719)"
+               id="g8146">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8140"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8142"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-50-1"
+                 id="use8144"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_3-5"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_3-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8152"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="318.27274"
+                 xlink:href="#m1d07b8e1b7"
+                 y="631"
+                 id="use8150" />
+            </g>
+          </g>
+          <g
+             id="text_3-8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.4 -->
+            <defs
+               id="defs8156">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 32.328125,0 v 17.140625 h -31.0625 v 8.0625 l 32.671875,46.375 h 7.171875 v -46.375 h 9.671875 v -8.0625 H 41.109375 V 0 Z m 0,25.203125 V 57.46875 L 9.90625,25.203125 Z"
+                 id="path12816"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,302.98273,662.24719)"
+               id="g8164">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8158"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8160"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-52-4"
+                 id="use8162"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_4-8"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_4-1"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8170"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="419.72726"
+                 xlink:href="#m1d07b8e1b7"
+                 y="631"
+                 id="use8168" />
+            </g>
+          </g>
+          <g
+             id="text_4-0"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.6 -->
+            <defs
+               id="defs8174">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 49.75,54.046875 41.015625,53.375 q -1.171875,5.171875 -3.3125,7.515625 -3.578125,3.765625 -8.796875,3.765625 -4.203125,0 -7.375,-2.34375 Q 17.390625,59.28125 14.984375,53.46875 12.59375,47.65625 12.5,36.921875 15.671875,41.75 20.265625,44.09375 q 4.59375,2.34375 9.625,2.34375 8.78125,0 14.953125,-6.46875 Q 51.03125,33.5 51.03125,23.25 51.03125,16.5 48.125,10.71875 45.21875,4.9375 40.140625,1.859375 35.0625,-1.21875 28.609375,-1.21875 17.625,-1.21875 10.6875,6.859375 3.765625,14.9375 3.765625,33.5 q 0,20.75 7.65625,30.171875 6.6875,8.203125 18.015625,8.203125 8.453125,0 13.84375,-4.734375 Q 48.6875,62.40625 49.75,54.046875 Z M 13.875,23.1875 q 0,-4.53125 1.921875,-8.6875 Q 17.71875,10.359375 21.1875,8.171875 24.65625,6 28.46875,6 q 5.5625,0 9.5625,4.484375 4.015625,4.5 4.015625,12.21875 0,7.421875 -3.96875,11.6875 -3.953125,4.28125 -9.953125,4.28125 -5.953125,0 -10.109375,-4.28125 Q 13.875,30.125 13.875,23.1875 Z"
+                 id="path12828"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,404.43727,662.24719)"
+               id="g8182">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8176"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8178"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-54-3"
+                 id="use8180"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_5-0"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_5-4"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8188"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="521.18182"
+                 xlink:href="#m1d07b8e1b7"
+                 y="631"
+                 id="use8186" />
+            </g>
+          </g>
+          <g
+             id="text_5-4"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.8 -->
+            <defs
+               id="defs8192">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 17.671875,38.8125 q -5.46875,2.015625 -8.109375,5.71875 -2.625,3.71875 -2.625,8.890625 0,7.8125 5.609375,13.125 5.625,5.328125 14.9375,5.328125 9.375,0 15.09375,-5.453125 5.71875,-5.4375 5.71875,-13.25 0,-4.984375 -2.625,-8.671875 Q 43.0625,40.828125 37.75,38.8125 q 6.59375,-2.140625 10.03125,-6.9375 3.4375,-4.78125 3.4375,-11.421875 0,-9.171875 -6.5,-15.421875 -6.484375,-6.25 -17.078125,-6.25 -10.59375,0 -17.09375,6.265625 -6.5,6.28125 -6.5,15.65625 0,6.984375 3.546875,11.6875 3.546875,4.71875 10.078125,6.421875 z m -1.75,14.90625 q 0,-5.078125 3.265625,-8.3125 3.28125,-3.21875 8.5,-3.21875 5.078125,0 8.328125,3.1875 3.25,3.203125 3.25,7.84375 0,4.84375 -3.359375,8.140625 -3.34375,3.296875 -8.3125,3.296875 -5.03125,0 -8.359375,-3.234375 -3.3125,-3.21875 -3.3125,-7.703125 z M 13.09375,20.65625 q 0,-3.765625 1.78125,-7.28125 Q 16.65625,9.859375 20.171875,7.921875 23.6875,6 27.734375,6 34.03125,6 38.125,10.046875 q 4.109375,4.0625 4.109375,10.3125 0,6.34375 -4.21875,10.5 -4.21875,4.15625 -10.578125,4.15625 -6.203125,0 -10.28125,-4.109375 -4.0625,-4.09375 -4.0625,-10.25 z"
+                 id="path12840"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,505.89182,662.24719)"
+               id="g8200">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8194"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8196"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-56-4"
+                 id="use8198"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="xtick_6-4"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_6-7"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8206"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="622.63635"
+                 xlink:href="#m1d07b8e1b7"
+                 y="631"
+                 id="use8204" />
+            </g>
+          </g>
+          <g
+             id="text_6-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 1.0 -->
+            <defs
+               id="defs8210">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="m 37.25,0 h -8.78125 v 56 q -3.171875,-3.015625 -8.328125,-6.046875 -5.15625,-3.03125 -9.25,-4.546875 v 8.5 q 7.375,3.46875 12.890625,8.390625 5.515625,4.9375 7.8125,9.578125 H 37.25 Z"
+                 id="path12852"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,607.34636,662.24719)"
+               id="g8218">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-49-3"
+                 id="use8212"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8214"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8216"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="text_7-1"
+           style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+           transform="matrix(2,0,0,2,-368.69344,-679.34969)">
+          <!-- van-der-Waals -->
+          <defs
+             id="defs8232">
+            <path
+               inkscape:connector-curvature="0"
+               d="M 21,0 1.265625,51.859375 h 9.28125 L 21.6875,20.796875 q 1.796875,-5.03125 3.3125,-10.4375 1.171875,4.09375 3.265625,9.859375 l 11.53125,31.640625 h 9.03125 L 29.203125,0 Z"
+               id="path12861"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 40.4375,6.390625 Q 35.546875,2.25 31.03125,0.53125 q -4.515625,-1.703125 -9.6875,-1.703125 -8.546875,0 -13.140625,4.171875 -4.59375,4.171875 -4.59375,10.671875 0,3.8125 1.734375,6.953125 1.734375,3.15625 4.546875,5.0625 2.8125,1.90625 6.328125,2.875 2.578125,0.6875 7.8125,1.328125 10.640625,1.265625 15.671875,3.015625 0.04687,1.8125 0.04687,2.296875 0,5.375 -2.5,7.578125 -3.359375,2.96875 -10,2.96875 -6.203125,0 -9.15625,-2.171875 -2.953125,-2.171875 -4.375,-7.6875 L 5.125,37.0625 q 1.171875,5.515625 3.859375,8.90625 2.6875,3.390625 7.765625,5.21875 5.078125,1.84375 11.765625,1.84375 6.640625,0 10.78125,-1.5625 4.15625,-1.5625 6.109375,-3.9375 1.953125,-2.359375 2.734375,-5.984375 0.4375,-2.234375 0.4375,-8.09375 v -11.71875 q 0,-12.265625 0.5625,-15.515625 Q 49.703125,2.984375 51.375,0 h -9.1875 q -1.359375,2.734375 -1.75,6.390625 z M 39.703125,26.03125 Q 34.90625,24.078125 25.34375,22.703125 19.921875,21.921875 17.671875,20.9375 15.4375,19.96875 14.203125,18.09375 q -1.21875,-1.875 -1.21875,-4.171875 0,-3.515625 2.65625,-5.859375 2.671875,-2.34375 7.796875,-2.34375 5.078125,0 9.03125,2.21875 3.953125,2.21875 5.8125,6.078125 1.421875,2.984375 1.421875,8.78125 z"
+               id="path12863"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 6.59375,0 V 51.859375 H 14.5 v -7.375 q 5.71875,8.546875 16.5,8.546875 4.6875,0 8.625,-1.6875 3.9375,-1.6875 5.890625,-4.421875 Q 47.46875,44.1875 48.25,40.4375 48.734375,37.984375 48.734375,31.890625 V 0 H 39.9375 v 31.546875 q 0,5.375 -1.03125,8.03125 -1.015625,2.65625 -3.625,4.234375 -2.609375,1.59375 -6.125,1.59375 -5.625,0 -9.703125,-3.5625 Q 15.375,38.28125 15.375,28.328125 V 0 Z"
+               id="path12865"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 3.171875,21.484375 v 8.84375 h 27 v -8.84375 z"
+               id="path12867"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 40.234375,0 v 6.546875 q -4.9375,-7.71875 -14.5,-7.71875 -6.203125,0 -11.40625,3.421875 -5.203125,3.421875 -8.0625,9.546875 -2.84375,6.125 -2.84375,14.078125 0,7.765625 2.578125,14.09375 2.59375,6.328125 7.765625,9.6875 5.1875,3.375 11.578125,3.375 4.6875,0 8.34375,-1.984375 3.671875,-1.96875 5.96875,-5.140625 v 25.671875 h 8.734375 V 0 Z m -27.78125,25.875 q 0,-9.953125 4.1875,-14.890625 Q 20.84375,6.0625 26.5625,6.0625 q 5.765625,0 9.78125,4.703125 4.03125,4.71875 4.03125,14.375 0,10.65625 -4.109375,15.625 Q 32.171875,45.75 26.171875,45.75 20.3125,45.75 16.375,40.96875 12.453125,36.1875 12.453125,25.875 Z"
+               id="path12869"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 42.09375,16.703125 9.078125,-1.125 Q 49.03125,7.625 43.21875,3.21875 37.40625,-1.171875 28.375,-1.171875 q -11.375,0 -18.046875,7 -6.671875,7.015625 -6.671875,19.65625 0,13.09375 6.734375,20.3125 6.75,7.234375 17.484375,7.234375 10.40625,0 17,-7.078125 6.59375,-7.078125 6.59375,-19.921875 0,-0.78125 -0.04687,-2.34375 H 12.75 q 0.484375,-8.546875 4.828125,-13.09375 4.34375,-4.53125 10.84375,-4.53125 4.828125,0 8.25,2.53125 3.421875,2.546875 5.421875,8.109375 z M 13.234375,30.90625 H 42.1875 q -0.578125,6.546875 -3.3125,9.8125 -4.203125,5.078125 -10.890625,5.078125 -6.0625,0 -10.1875,-4.046875 -4.125,-4.046875 -4.5625,-10.84375 z"
+               id="path12871"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 6.5,0 v 51.859375 h 7.90625 V 44 Q 17.4375,49.515625 20,51.265625 q 2.5625,1.765625 5.640625,1.765625 4.4375,0 9.03125,-2.828125 l -3.03125,-8.15625 q -3.21875,1.90625 -6.4375,1.90625 -2.890625,0 -5.1875,-1.734375 -2.296875,-1.734375 -3.265625,-4.8125 -1.46875,-4.6875 -1.46875,-10.25 V 0 Z"
+               id="path12873"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 20.21875,0 -19,71.578125 H 10.9375 L 21.828125,24.65625 q 1.75,-7.375 3.03125,-14.640625 2.734375,11.46875 3.21875,13.234375 l 13.625,48.328125 H 53.125 l 10.25,-36.21875 q 3.859375,-13.484375 5.578125,-25.34375 1.359375,6.78125 3.5625,15.578125 l 11.21875,45.984375 h 9.53125 L 73.640625,0 H 64.5 L 49.421875,54.546875 q -1.90625,6.828125 -2.25,8.390625 -1.125,-4.921875 -2.109375,-8.390625 L 29.890625,0 Z"
+               id="path12875"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 6.390625,0 V 71.578125 H 15.1875 V 0 Z"
+               id="path12877"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="m 3.078125,15.484375 8.6875,1.359375 Q 12.5,11.625 15.84375,8.84375 19.1875,6.0625 25.203125,6.0625 q 6.046875,0 8.96875,2.453125 2.9375,2.46875 2.9375,5.796875 0,2.96875 -2.59375,4.6875 Q 32.71875,20.171875 25.53125,21.96875 15.875,24.421875 12.140625,26.203125 8.40625,27.984375 6.46875,31.125 q -1.921875,3.15625 -1.921875,6.96875 0,3.453125 1.578125,6.40625 1.59375,2.96875 4.328125,4.921875 2.046875,1.5 5.578125,2.546875 3.546875,1.0625 7.609375,1.0625 6.09375,0 10.703125,-1.765625 4.625,-1.75 6.8125,-4.765625 2.203125,-3 3.03125,-8.015625 L 35.59375,37.3125 q -0.578125,4 -3.390625,6.234375 -2.8125,2.25 -7.9375,2.25 -6.046875,0 -8.640625,-2 -2.59375,-2 -2.59375,-4.6875 0,-1.703125 1.078125,-3.078125 1.078125,-1.40625 3.375,-2.34375 1.3125,-0.484375 7.765625,-2.234375 9.328125,-2.5 13,-4.09375 3.6875,-1.578125 5.78125,-4.609375 2.109375,-3.015625 2.109375,-7.515625 0,-4.390625 -2.5625,-8.28125 -2.5625,-3.875 -7.40625,-6 -4.828125,-2.125 -10.921875,-2.125 -10.109375,0 -15.40625,4.203125 -5.296875,4.203125 -6.765625,12.453125 z"
+               id="path12879"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0.24,0,0,-0.24,291.43125,687.79844)"
+             id="g8260">
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="0"
+               xlink:href="#ArialMT-118-75"
+               id="use8234"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="50"
+               xlink:href="#ArialMT-97-9"
+               id="use8236"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="105.61523"
+               xlink:href="#ArialMT-110-62"
+               id="use8238"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="161.23047"
+               xlink:href="#ArialMT-45-1"
+               id="use8240"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="194.53125"
+               xlink:href="#ArialMT-100-7"
+               id="use8242"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="250.14648"
+               xlink:href="#ArialMT-101-8"
+               id="use8244"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="305.76172"
+               xlink:href="#ArialMT-114-5"
+               id="use8246"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="339.0625"
+               xlink:href="#ArialMT-45-1"
+               id="use8248"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="372.36328"
+               xlink:href="#ArialMT-87-7"
+               id="use8250"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="462.99805"
+               xlink:href="#ArialMT-97-9"
+               id="use8252"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="518.61328"
+               xlink:href="#ArialMT-97-9"
+               id="use8254"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="574.22852"
+               xlink:href="#ArialMT-108-4"
+               id="use8256"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="596.44531"
+               xlink:href="#ArialMT-115-18"
+               id="use8258"
+               style="fill:#ff7f0e;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+          </g>
+        </g>
+      </g>
+      <g
+         id="matplotlib.axis_2-5"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <g
+           id="ytick_1-9"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_7-7"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <defs
+               id="defs8265">
+              <path
+                 inkscape:connector-curvature="0"
+                 d="M 0,0 H -12"
+                 id="path12898"
+                 style="stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round" />
+            </defs>
+            <g
+               id="g8269"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="89"
+                 xlink:href="#m44cfcce60e"
+                 y="605.29089"
+                 id="use8267" />
+            </g>
+          </g>
+          <g
+             id="text_8-5"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.0 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,42.92,613.1645)"
+               id="g8278">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8272"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8274"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8276"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_2-38"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_8-8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8284"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="89"
+                 xlink:href="#m44cfcce60e"
+                 y="506.45456"
+                 id="use8282" />
+            </g>
+          </g>
+          <g
+             id="text_9-3"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.2 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,42.92,514.32814)"
+               id="g8293">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8287"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8289"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-50-1"
+                 id="use8291"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_3-1"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_9-8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8299"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="89"
+                 xlink:href="#m44cfcce60e"
+                 y="407.61819"
+                 id="use8297" />
+            </g>
+          </g>
+          <g
+             id="text_10-9"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.4 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,42.92,415.49178)"
+               id="g8308">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8302"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8304"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-52-4"
+                 id="use8306"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_4-6"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_10-4"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8314"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="89"
+                 xlink:href="#m44cfcce60e"
+                 y="308.78183"
+                 id="use8312" />
+            </g>
+          </g>
+          <g
+             id="text_11-3"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.6 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,42.92,316.65541)"
+               id="g8323">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8317"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8319"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-54-3"
+                 id="use8321"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_5-33"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_11-8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8329"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="89"
+                 xlink:href="#m44cfcce60e"
+                 y="209.94545"
+                 id="use8327" />
+            </g>
+          </g>
+          <g
+             id="text_12-6"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 0.8 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,42.92,217.81905)"
+               id="g8338">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8332"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8334"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-56-4"
+                 id="use8336"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="ytick_6-04"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <g
+             id="line2d_12-8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <g
+               id="g8344"
+               style="stroke-linecap:butt;stroke-linejoin:round">
+              <use
+                 height="100%"
+                 width="100%"
+                 style="fill:#262626;stroke:#262626;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round"
+                 x="89"
+                 xlink:href="#m44cfcce60e"
+                 y="111.10909"
+                 id="use8342" />
+            </g>
+          </g>
+          <g
+             id="text_13-8"
+             style="stroke-linecap:butt;stroke-linejoin:round">
+            <!-- 1.0 -->
+            <g
+               style="fill:#262626;stroke-linecap:butt;stroke-linejoin:round"
+               transform="matrix(0.22,0,0,-0.22,42.92,118.98269)"
+               id="g8353">
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="0"
+                 xlink:href="#ArialMT-49-3"
+                 id="use8347"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="55.615234"
+                 xlink:href="#ArialMT-46-8"
+                 id="use8349"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+              <use
+                 height="100%"
+                 width="100%"
+                 y="0"
+                 x="83.398438"
+                 xlink:href="#ArialMT-48-3"
+                 id="use8351"
+                 style="stroke-linecap:butt;stroke-linejoin:round" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="text_14-8"
+           style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+           transform="matrix(2,0,0,2,-48.428522,-357.50507)">
+          <!-- restraint -->
+          <defs
+             id="defs8359">
+            <path
+               inkscape:connector-curvature="0"
+               d="M 25.78125,7.859375 27.046875,0.09375 Q 23.34375,-0.6875 20.40625,-0.6875 15.625,-0.6875 12.984375,0.828125 10.359375,2.34375 9.28125,4.8125 8.203125,7.28125 8.203125,15.1875 v 29.828125 h -6.4375 v 6.84375 h 6.4375 v 12.84375 L 16.9375,69.96875 V 51.859375 h 8.84375 v -6.84375 H 16.9375 v -30.3125 q 0,-3.765625 0.46875,-4.84375 0.46875,-1.0625 1.515625,-1.703125 1.046875,-0.640625 3,-0.640625 1.46875,0 3.859375,0.34375 z"
+               id="path12955"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               inkscape:connector-curvature="0"
+               d="M 6.640625,61.46875 V 71.578125 H 15.4375 V 61.46875 Z M 6.640625,0 V 51.859375 H 15.4375 V 0 Z"
+               id="path12957"
+               style="stroke-linecap:butt;stroke-linejoin:round" />
+          </defs>
+          <g
+             style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round"
+             transform="matrix(0,-0.24,-0.24,0,34.15,401.54437)"
+             id="g8379">
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="0"
+               xlink:href="#ArialMT-114-5"
+               id="use8361"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="33.300781"
+               xlink:href="#ArialMT-101-8"
+               id="use8363"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="88.916016"
+               xlink:href="#ArialMT-115-18"
+               id="use8365"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="138.91602"
+               xlink:href="#ArialMT-116-9"
+               id="use8367"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="166.69922"
+               xlink:href="#ArialMT-114-5"
+               id="use8369"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="200"
+               xlink:href="#ArialMT-97-9"
+               id="use8371"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="255.61523"
+               xlink:href="#ArialMT-105-7"
+               id="use8373"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="277.83203"
+               xlink:href="#ArialMT-110-62"
+               id="use8375"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <use
+               height="100%"
+               width="100%"
+               y="0"
+               x="333.44727"
+               xlink:href="#ArialMT-116-9"
+               id="use8377"
+               style="fill:#2ca02c;fill-opacity:1;stroke-linecap:butt;stroke-linejoin:round" />
+          </g>
+        </g>
+      </g>
+      <g
+         id="line2d_13-7"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           clip-path="url(#p32e771b459)"
+           d="m 115.36364,605.29091 v 0 -49.41818 -49.41819 L 318.27273,457.03636 369,358.2 419.72727,259.36364 470.45454,111.10909 h 50.72728 101.45454"
+           style="fill:none;stroke:#1f77b4;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
+           id="path8383" />
+      </g>
+      <g
+         id="PathCollection_1-6"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <defs
+           id="defs8387">
+          <path
+             inkscape:connector-curvature="0"
+             d="m 0,11.18034 c 2.965061,0 5.80908,-1.178031 7.905694,-3.274646 C 10.002309,5.80908 11.18034,2.965061 11.18034,0 c 0,-2.965061 -1.178031,-5.80908 -3.274646,-7.905694 C 5.80908,-10.002309 2.965061,-11.18034 0,-11.18034 c -2.965061,0 -5.80908,1.178031 -7.905694,3.274646 C -10.002309,-5.80908 -11.18034,-2.965061 -11.18034,0 c 0,2.965061 1.178031,5.80908 3.274646,7.905694 C -5.80908,10.002309 -2.965061,11.18034 0,11.18034 Z"
+             id="path12974"
+             style="stroke-linecap:butt;stroke-linejoin:round" />
+        </defs>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8391"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#3b4cc0;stroke:#3b4cc0;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="115.36363"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="605.29089"
+             id="use8389" />
+        </g>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8395"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#5d7ce6;stroke:#5d7ce6;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="115.36363"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="605.29089"
+             id="use8393" />
+        </g>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8399"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#82a6fb;stroke:#82a6fb;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="115.36363"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="555.87274"
+             id="use8397" />
+        </g>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8403"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#aac7fd;stroke:#aac7fd;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="115.36363"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="506.45456"
+             id="use8401" />
+        </g>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8407"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#cdd9ec;stroke:#cdd9ec;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="318.27274"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="457.03638"
+             id="use8405" />
+        </g>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8411"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#ead4c8;stroke:#ead4c8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="369"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="358.20001"
+             id="use8409" />
+        </g>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8415"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#f7b89c;stroke:#f7b89c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="419.72726"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="259.36365"
+             id="use8413" />
+        </g>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8419"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#f18d6f;stroke:#f18d6f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="470.45456"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="111.10909"
+             id="use8417" />
+        </g>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8423"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#d95847;stroke:#d95847;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="521.18182"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="111.10909"
+             id="use8421" />
+        </g>
+        <g
+           clip-path="url(#p32e771b459)"
+           id="g8427"
+           style="stroke-linecap:butt;stroke-linejoin:round">
+          <use
+             height="100%"
+             width="100%"
+             style="fill:#b40426;stroke:#b40426;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
+             x="622.63635"
+             xlink:href="#C0_0_667cb6c0eb"
+             y="111.10909"
+             id="use8425" />
+        </g>
+      </g>
+      <g
+         id="patch_3-4"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           d="M 89,630 V 86.4"
+           style="fill:none;stroke:#262626;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter"
+           id="path8430" />
+      </g>
+      <g
+         id="patch_4-3"
+         style="stroke-linecap:butt;stroke-linejoin:round">
+        <path
+           inkscape:connector-curvature="0"
+           d="M 90,631 H 648"
+           style="fill:none;stroke:#262626;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter"
+           id="path8433" />
+      </g>
+    </g>
+  </g>
+</svg>
index 686c72c2bc9bc10f80ec87abd7774ec4aab2301d..31b89594bec647672f64417134819d062e37cadc 100644 (file)
@@ -77,7 +77,15 @@ while it is still supported internally in the code, the old 4fd type
 should not be used in new input files. The different types are explained
 in sec. :ref:`virtualsites`.
 
-Parameters for type 2 should look like this:
+Parameters for type 1 should look like this:
+
+::
+
+    [ virtual_sites1 ]
+    ; Site  from        funct
+    5       1           1
+
+for type 2 like this:
 
 ::
 
@@ -85,6 +93,14 @@ Parameters for type 2 should look like this:
     ; Site  from        funct  a
     5       1     2     1      0.7439756
 
+for type 2fd like this:
+
+::
+
+    [ virtual_sites2 ]
+    ; Site  from        funct  d
+    5       1     2     2      -0.105
+
 for type 3 like this:
 
 ::
index 49401c24056670984a04563776cd82baa1c468f4..0ea97bb28a7a7d2757e0d8a9bf599b86c893952c 100644 (file)
@@ -251,6 +251,8 @@ interactions can be converted to constraints by :ref:`grompp <gmx grompp>`.
             +------------------------------------+----------------------------+------------+-----------+-------------------------------------------------------------------------+------------+
             | SETTLE                             | ``settles``                | 1          | 1         | |DOH|, |DHH| (nm)                                                       |            | 
             +------------------------------------+----------------------------+------------+-----------+-------------------------------------------------------------------------+------------+
+            | 1-body virtual site                | ``virtual_sites1``         | 2          | 0         |                                                                         |            |
+            +------------------------------------+----------------------------+------------+-----------+-------------------------------------------------------------------------+------------+
             | 2-body virtual site                | ``virtual_sites2``         | 3          | 1         | |AO| ()                                                                 |            | 
             +------------------------------------+----------------------------+------------+-----------+-------------------------------------------------------------------------+------------+
             | 2-body virtual site (fd)           | ``virtual_sites2``         | 3          | 2         | |DO| (nm)                                                               |            | 
index 761dee81f16e51ae6447afd0a90e218f78b5ae24..dae6a7cd9cbf8bed79cb09a7072b2088e201d297 100644 (file)
@@ -1,7 +1,7 @@
 GROMACS 2020.5 release notes
 ----------------------------
 
-This version was released on TODO, 2020. These release notes
+This version was released on January 6th, 2021. These release notes
 document the changes that have taken place in GROMACS since the
 previous 2020.4 version, to fix known issues. It also incorporates all
 fixes made in version 2019.6 and earlier, which you can find described
@@ -37,6 +37,20 @@ results.
 
 :issue:`3750`
 
+Fix incorrect AWH free-energies when multiple walkers share a bias
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+The AWH free-energy output was incorrect when multiple walkers shared
+an AWH bias. The error went up quadratically with the free-energy update
+interval, as well as with the number of walkers. The error decreases as
+update size decreases with time. This meant that with default AWH settings
+the error was negligible. With a free-energy update interval of 2 ps,
+we observed an error about equal to the statistical error with 32 walkers
+for a rather fast reaction coordinate. For slower coordinates the error
+will be smaller than the statistical error.
+
+:issue:`3828`
+
 Fixed conserved energy for MTTK
 """""""""""""""""""""""""""""""
 
@@ -51,6 +65,72 @@ combination of temperature / pressure coupling algorithms.
 
 :issue:`3796`
 
+Fixed conserved energy for Nose-Hoover
+""""""""""""""""""""""""""""""""""""""
+
+When using `tcoupl=nose-hoover` and one or more temperature groups with
+non-integer number of degrees of freedom, the calculated conserved
+energy was incorrect due to an error dating back to GROMACS 2018.
+Reported conserved energies using Nose-Hoover temperature coupling and
+non-integer number of degrees of freedom since GROMACS 2018 are likely to
+be slightly off. Note that this error does not impact the dynamics, as the
+conserved energy is only reported, but never used in calculations. Also note
+that this will only be noticeable when using small temperature groups or
+small systems.
+
+:issue:`3831`
+
+Fixed kinetic energy and temperature reporting for MTTK
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+When using `pcoupl=MTTK` and `tcoupl=nose-hoover`, the reported kinetic
+energy and temperature were very slightly off. The integration of the
+temperature coupling trailed the reporting by half a time step. Note that
+these errors did not impact the dynamics, as the quantities were correctly
+integrated and only wrongly reported. Also note that the difference is so
+small that it is unlikely to have been significant for any application
+except for rigorous algorithm validation. Finally, note that this bug
+only affects this exact combination of temperature / pressure coupling
+algorithms.
+
+:issue:`3832`
+
+Fix pull error message with angles and dihedrals
+""""""""""""""""""""""""""""""""""""""""""""""""
+
+The COM pull code could print incorrect pull group indices when mdrun exited
+with an error about a too long pull distance in angle and dihedral geometries.
+
+:issue:`3613`
+
+Fix numerical issues in expanded ensemble
+"""""""""""""""""""""""""""""""""""""""""
+
+When performing simulated tempering or expanded ensemble simulations
+with changes in the Hamiltonian that were too large, then Monte Carlo
+proposals to states that were sufficiently unlikely would underflow,
+causing division by zero errors. This was fixed by numerically
+hardening the logical flow so that such proposals would be rejected
+instead.
+
+:issue:`3304`
+
+Fix incorrect electric field strength with applied electric field
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+The electric field generated by the electric field module would be incorrect when
+used together with domain decomposition due to an error with indexing the field
+to all atoms instead of just those on the current domain.
+
+In overlap regions between domains, which have the thickness of the pairlist
+cut-off distance, the electric field would be doubled (or more with 2D or
+3D domain decomposition).
+
+To validate if a simulation has been affected by the issue, users should calculate
+the actual potential across the simulation box using the Poisson equation.
+If this potential agrees with the one provided as the input, a simulation was not affected.
+
+:issue:`3800`
 
 Fixes for ``gmx`` tools
 ^^^^^^^^^^^^^^^^^^^^^^^
@@ -67,6 +147,14 @@ The gmx h2order tool would always take the normal along the z-axis.
 
 :issue:`3820`
 
+Fix pull group index handling
+"""""""""""""""""""""""""""""
+
+The pull code would not validate its index groups correctly, leading
+to infinite loops or assertions being triggered at grompp time.
+
+:issue:`3810`
+
 Fixes that affect portability
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
diff --git a/docs/release-notes/2020/2020.6.rst b/docs/release-notes/2020/2020.6.rst
new file mode 100644 (file)
index 0000000..7a00bf1
--- /dev/null
@@ -0,0 +1,24 @@
+GROMACS 2020.6 release notes
+----------------------------
+
+This version was released on TODO, 2021. These release notes
+document the changes that have taken place in GROMACS since the
+previous 2020.5 version, to fix known issues.
+
+.. Note to developers!
+   Please use """"""" to underline the individual entries for fixed issues in the subfolders,
+   otherwise the formatting on the webpage is messed up.
+   Also, please use the syntax :issue:`number` to reference issues on redmine, without the
+   a space between the colon and number!
+
+Fixes where mdrun could behave incorrectly
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Fixes for ``gmx`` tools
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Fixes that affect portability
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Miscellaneous
+^^^^^^^^^^^^^
diff --git a/docs/release-notes/2021/2021.1.rst b/docs/release-notes/2021/2021.1.rst
new file mode 100644 (file)
index 0000000..4b884a6
--- /dev/null
@@ -0,0 +1,27 @@
+GROMACS 2021.1 release notes
+----------------------------
+
+This version was released on TODO, 2021. These release notes
+document the changes that have taken place in GROMACS since the
+previous 2021 version, to fix known issues. It also incorporates all
+fixes made in version 2020.6 and earlier, which you can find described
+in the :ref:`release-notes`.
+
+.. Note to developers!
+   Please use """"""" to underline the individual entries for fixed issues in the subfolders,
+   otherwise the formatting on the webpage is messed up.
+   Also, please use the syntax :issue:`number` to reference issues on GitLab, without the
+   a space between the colon and number!
+
+Fixes where mdrun could behave incorrectly
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Fixes for ``gmx`` tools
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Fixes that affect portability
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Miscellaneous
+^^^^^^^^^^^^^
+
index 5fec2401a9589292747a9c5a0df8cc60c85492c8..c9ee60641784b93209db15b2bc02384333c24b3f 100644 (file)
@@ -25,6 +25,19 @@ H atoms in particular.
 
 :issue:`3469`
 
+pdb2gmx handles ASPH and GLUH inputs better
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+The default is to treat all such residues as the unprotonated form,
+and not to try to infer the protonation from the residue name in the
+input. Protonated forms are only available via the interactive
+selection options. Now pdb2gmx reports when it is converting such
+input residues automatically. It also ensures that the output
+configuration and topology are naming such residues correctly in both
+the default and interactive-selection cases.
+
+:issue:`2480`
+
 Correct excluded perturbed interactions beyond the non-bonded cut-off distance
 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
@@ -50,6 +63,15 @@ given in the reference manual.
 
 :issue:`3751`
 
+Fixed default for tick-mark spacing in gmx xpm2ps
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+This was inadvertently changed many years ago, leading to the intended
+default of automatic tick-mark spacing being replaced with an
+unsuitable fixed value.
+
+:issue:`3881`
+
 Fixed LJ Ewald exclusions when used with cut-off electrostatics
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
index b250914028dddb367f5f6844f9765485303a6894..6c43588883fa4b662edd589068fd2c116dafb5b7 100644 (file)
@@ -54,6 +54,24 @@ based upon xssp, and make it available under a new gmx tool name.
 Functionality deprecated in |Gromacs| 2021
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+``mdrun -deffnm`` to be removed
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+This functionality is convenient when running very simple simulations,
+because it permits grouping of a set of files that then differ only
+their suffix. However, it does not work in the wider case of an
+``mdrun`` module (or modules) writing multiple ``.xvg`` output
+files. The resulting filenames collide. That, and its interaction with
+checkpointing and appending, have led to quite a few bug reports.
+
+Because users can use a folder to group files (a standard mechanism
+that they understand from experience outside of |Gromacs|), we can
+build and test better software for them if we remove the erstwhile
+convenience of ``mdrun -deffnm``. Please update your workflows
+accordingly.
+
+:issue:`3818`
+
 OpenCL to be removed as a GPU framework
 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 :issue:`3818` Work is underway for ports to AMD and Intel GPUs, and it
@@ -122,6 +140,14 @@ Constant-acceleration MD
 :issue:`1354` This has been broken for many years, and will be removed
 as nobody has been found with interest to fix it.
 
+Reading .pdo files in ``gmx wham``
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+The pull code in |Gromacs| before version 4.0 wrote files in ``.pdo``
+format. Analyses of such files are likely no longer relevant, and if
+they are, using any older GROMACS version will work. ``gmx wham`` will be
+simpler to maintain and extend if we no longer support reading
+``.pdo`` files.
+
 Functionality deprecated in |Gromacs| 2020
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
index 702196b02d312c1a820985702238b3be8d3bd71b..a7819e59ee0f47a2f78fc272901a64c7410252b3 100644 (file)
@@ -1,7 +1,7 @@
 Highlights
 ^^^^^^^^^^
 
-|Gromacs| 2021 was released on INSERT DATE HERE. Patch releases may
+|Gromacs| 2021 was released on January 28th, 2021. 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!
@@ -19,7 +19,7 @@ simulations and hardware. The new features are:
 * Support PME offloading to GPU for free energy simulations
 * Support for ARM SVE and Fujitsu A64FX (contribution by Research Organization for Information Science and Technology (RIST))
 * New nonbonded interaction API with NB-LIB (in collaboration with PRACE)
-
+* New |Gromacs| logo!
 
 .. Note to developers!
    Please use """"""" to underline the individual entries for fixed issues in the subfolders,
index 85b08653c852b526852e9827ca3248e437134c25..06888c99c9b90e743915afdaa7e0bd861085d034 100644 (file)
@@ -7,6 +7,13 @@ Performance improvements
    Also, please use the syntax :issue:`number` to reference issues on GitLab, without the
    a space between the colon and number!
 
+Added support for multiple time-stepping
+""""""""""""""""""""""""""""""""""""""""
+
+A two-level multiple time-stepping scheme has been implemented.
+Any combination of five different force groups can be selected
+to evaluate less frequently, thereby improving performance.
+
 Extend supported use-cases for GPU version of update and constraints
 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
@@ -39,3 +46,10 @@ Allow offloading GPU update and constraints without direct GPU communication
 Allow domain-decomposition and separate PME rank parallel runs to offload update and
 constraints to a GPU with CUDA without requiring the (experimental) direct GPU
 communication features to be also enabled.
+
+Tune CUDA short-range nonbonded kernel parameters on NVIDIA Volta and Ampere A100
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+Recent compilers allowed re-tuning the nonbonded kernel defaults on NVIDIA Volta and
+Ampere A100GPUs which improves performance of the Ewald kernels, especially those that
+also compute energies.
index 90a44ee75e19e7f0aaac0cf48ab06651701a9568..e091330c7fa1036f7419773cabcd5aa62734df36 100644 (file)
@@ -25,6 +25,15 @@ can be found on the `issue tracker`_ at that issue number.
 
 .. todolist::
 
+Patch releases
+^^^^^^^^^^^^^^
+
+.. toctree::
+   :maxdepth: 1
+
+   2021/2021.1
+
+
 Major release
 ^^^^^^^^^^^^^
 
@@ -74,6 +83,7 @@ Patch releases
 .. toctree::
    :maxdepth: 1
 
+   2020/2020.6
    2020/2020.5
    2020/2020.4
    2020/2020.3
index 030c7bb6378eaf10f3e858c6f647405044afe03f..f5ebe9462e7912b12043174c8642a9103f09d852 100644 (file)
@@ -252,18 +252,15 @@ Run control
 
 .. mdp:: mts-level2-forces
 
-   (longrange-nonbonded nonbonded pair dihedral)
-   A list of force groups that will be evaluated only every
+   (longrange-nonbonded)
+   A list of one or more force groups that will be evaluated only every
    :mdp:`mts-level2-factor` steps. Supported entries are:
    ``longrange-nonbonded``, ``nonbonded``, ``pair``, ``dihedral``, ``angle``,
    ``pull`` and ``awh``. With ``pair`` the listed pair forces (such as 1-4)
    are selected. With ``dihedral`` all dihedrals are selected, including cmap.
    All other forces, including all restraints, are evaluated and
    integrated every step. When PME or Ewald is used for electrostatics
-   and/or LJ interactions, ``longrange-nonbonded`` has to be entered here.
-   The default value should work well for most standard atomistic simulations
-   and in particular for replacing virtual site treatment for increasing
-   the time step.
+   and/or LJ interactions, ``longrange-nonbonded`` can not be omitted here.
 
 .. mdp:: mts-level2-factor
 
index 919cf066a2e876049e632da30dc8f9581dd02b55..f7fea772cd6bc88e055ef9820ea3dac0693cb52c 100644 (file)
@@ -5,20 +5,20 @@
 
 # This image serves as a base for integration with the gmxapi Python tools and sample code.
 
-FROM ubuntu:bionic
+FROM ubuntu:groovy as base
 
 # Basic packages
 RUN apt-get update && \
-    apt-get -yq --no-install-suggests --no-install-recommends install software-properties-common && \
+    apt-get -yq --no-install-suggests --no-install-recommends install software-properties-common build-essential && \
     apt-get -yq --no-install-suggests --no-install-recommends install \
         cmake \
         git \
         libblas-dev \
-        libcr-dev \
         libfftw3-dev \
         liblapack-dev \
         libxml2-dev \
         make \
+        vim \
         wget \
         zlib1g-dev && \
     rm -rf /var/lib/apt/lists/*
index 34482daf22bc29aed5dbc55723ccbcec679d0fce..4a3052e4c5b84c464c843dcbbb2cf078086c9dd1 100644 (file)
@@ -3,7 +3,10 @@
 
 # Optionally, set `--build-arg DOCKER_CORES=N` for a Docker engine running with access to more than 1 CPU.
 #    REF=`git show -s --pretty=format:"%h"`
-#    docker build -t gmxapi/gromacs:${REF} --build-arg DOCKER_CORES=4 -f gromacs.dockerfile ../..
+#    docker build -t gmxapi/gromacs-${MPIFLAVOR}:${REF} \
+#               --build-arg DOCKER_CORES=4 \
+#               --build-arg MPIFLAVOR=${MPIFLAVOR} \
+#               -f gromacs.dockerfile ../..
 
 # This image serves as a base for integration with the gmxapi Python tools and sample code.
 
@@ -26,6 +29,7 @@ RUN cmake $SRC_DIR \
         -DGMXAPI=ON \
         -DGMX_THREAD_MPI=ON \
         -DGMX_BUILD_HELP=OFF \
+        -DGMX_USE_RDTSCP=OFF \
         -DGMX_REQUIRE_VALID_TOOLCHAIN=TRUE \
         -DCMAKE_BUILD_TYPE=$TYPE
 RUN make -j$DOCKER_CORES
index f5dd6c33558b909d60cd003608ab0dd4004d9878..ae443a53772e88a12eebf707e8b2aeca0c313c90 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2019,2020, by the GROMACS development team, led by
+# Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -72,7 +72,7 @@ from .exceptions import FeatureNotAvailableError
 _major = 0
 _minor = 3
 _micro = 0
-_suffix = 'b1'
+_suffix = ''
 
 # Reference https://www.python.org/dev/peps/pep-0440/
 # and https://packaging.pypa.io/en/latest/version/
index e1246075cc436d08ccb0192e26a949ae4f99f03d..7ec8697061048710ad4ffc682a6fc0d11123f61d 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2019,2020, by the GROMACS development team, led by
+# Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
index abcaaa8cb9ae46d9353a05f16ca8d1a0fcc7818e..b5d68415bcca08d80dd79c748d3986025b2cf442 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2015,2016,2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2015,2016,2017,2018,2019, The GROMACS development team.
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -164,7 +165,7 @@ void sumPmf(gmx::ArrayRef<PointState> pointState,
     /* Need to temporarily exponentiate the log weights to sum over simulations */
     for (size_t i = 0; i < buffer.size(); i++)
     {
-        buffer[i] = pointState[i].inTargetRegion() ? std::exp(-pointState[i].logPmfSum()) : 0;
+        buffer[i] = pointState[i].inTargetRegion() ? std::exp(pointState[i].logPmfSum()) : 0;
     }
 
     sumOverSimulations(gmx::ArrayRef<double>(buffer), commRecord, multiSimComm);
@@ -175,7 +176,7 @@ void sumPmf(gmx::ArrayRef<PointState> pointState,
     {
         if (pointState[i].inTargetRegion())
         {
-            pointState[i].setLogPmfSum(-std::log(buffer[i] * normFac));
+            pointState[i].setLogPmfSum(std::log(buffer[i] * normFac));
         }
     }
 }
index 7c494282150c8e9887e925b9ab5037f1f5694d78..5be37f1de15eddf38688c85b7f1b4e1e196b6820 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2015,2016,2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2015,2016,2017,2018,2019, The GROMACS development team.
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -316,7 +317,7 @@ void ElectricField::calculateForces(const ForceProviderInput& forceProviderInput
             if (fieldStrength != 0)
             {
                 // TODO: Check parallellism
-                for (index i = 0; i != ssize(f); ++i)
+                for (int i = 0; i < mdatoms.homenr; ++i)
                 {
                     // NOTE: Not correct with perturbed charges
                     f[i][m] += mdatoms.chargeA[i] * fieldStrength;
index c88a7526e99f43497913276698056081acfa653a..89a2d8da3b0b404e5ad9272180808895f377e015 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2008,2009,2010,2011,2012 by the GROMACS development team.
  * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -2433,7 +2433,7 @@ static void check_match(FILE*                           fplog,
     {
         const char msg_precision_difference[] =
                 "You are continuing a simulation with a different precision. Not matching\n"
-                "single/double precision will lead to precision or performance loss.\n";
+                "mixed/double precision will lead to precision or performance loss.\n";
         if (fplog)
         {
             fprintf(fplog, "%s\n", msg_precision_difference);
index 6620f1d6dbce8fb2c50c914fd1e58467cd157f27..d50be6feb9237846ed867c7430a23bec01e75c31 100644 (file)
@@ -152,8 +152,13 @@ enum tpxv
 static const int tpx_version = tpxv_Count - 1;
 
 
-/* This number should only be increased when you edit the TOPOLOGY section
- * or the HEADER of the tpx format.
+/*! \brief
+ * Enum keeping track of incompatible changes for older TPR versions.
+ *
+ * The enum should be updated with a new field when editing the TOPOLOGY
+ * or HEADER of the tpx format. In particular, updating ftupd or
+ * changing the fields of TprHeaderVersion often trigger such needs.
+ *
  * This way we can maintain forward compatibility too for all analysis tools
  * and/or external programs that only need to know the atom/residue names,
  * charges, and bond connectivity.
@@ -164,10 +169,17 @@ static const int tpx_version = tpxv_Count - 1;
  *
  * In particular, it must be increased when adding new elements to
  * ftupd, so that old code can read new .tpr files.
- *
- * Updated for added field that contains the number of bytes of the tpr body, excluding the header.
  */
-static const int tpx_generation = 27;
+enum class TpxGeneration : int
+{
+    Initial = 26, //! First version is 26
+    AddSizeField, //! TPR header modified for writing as a block.
+    AddVSite1,    //! ftupd changed to include VSite1 type.
+    Count         //! Number of entries.
+};
+
+//! Value of Current TPR generation.
+static const int tpx_generation = static_cast<int>(TpxGeneration::Count) - 1;
 
 /* This number should be the most recent backwards incompatible version
  * I.e., if this number is 9, we cannot read tpx version 9 with this code.
@@ -195,6 +207,9 @@ typedef struct
  * obsolete t_interaction_function types. Any data read from such
  * fields is discarded. Their names have _NOLONGERUSED appended to
  * them to make things clear.
+ *
+ * When adding to or making breaking changes to reading this struct,
+ * update TpxGeneration.
  */
 static const t_ftupd ftupd[] = {
     { 70, F_RESTRBONDS },
index b5d7061933bb38e31b6c25d4843a780af5c9f7e7..69e86a344e067f505a163558268f2c5e47d2ac63 100644 (file)
@@ -4,7 +4,7 @@
  * 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.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -633,6 +633,7 @@ static void printmol(t_corr*                 curr,
         }
     }
     xvgrclose(out);
+    fprintf(stdout, "Wrote per-molecule output to %s\n", fn);
     do_view(oenv, fn, "-graphtype bar");
 
     /* Compute variance, stddev and error */
@@ -658,6 +659,7 @@ static void printmol(t_corr*                 curr,
             pdbinfo[i].bfac *= scale;
         }
         write_sto_conf(fn_pdb, "molecular MSD", &top->atoms, x, nullptr, pbcType, box);
+        fprintf(stdout, "Wrote frame for -tpdb to %s\n", fn_pdb);
     }
 }
 
index 22422c2586f15a6a09bd23dd499488d0e7f85099..6b79fa1e83e26ccd4c485e732bc7356dc8d16e11 100644 (file)
@@ -4,7 +4,7 @@
  * 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.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -171,8 +171,8 @@ static void get_params(const char* mpin, const char* mpout, t_psrec* psr)
     psr->ticklinewidth  = get_ereal(&inp, "ticklinewidth", psr->linewidth, wi);
     psr->zerolinewidth  = get_ereal(&inp, "zerolinewidth", psr->ticklinewidth, wi);
     psr->X.lineatzero   = get_eenum(&inp, "x-lineat0value", colors);
-    psr->X.major        = get_ereal(&inp, "x-major", 1, wi);
-    psr->X.minor        = get_ereal(&inp, "x-minor", 1, wi);
+    psr->X.major        = get_ereal(&inp, "x-major", -1, wi);
+    psr->X.minor        = get_ereal(&inp, "x-minor", -1, wi);
     psr->X.offset       = get_ereal(&inp, "x-firstmajor", 0.0, wi);
     psr->X.first        = (get_eenum(&inp, "x-majorat0", gmx_bools) != 0);
     psr->X.majorticklen = get_ereal(&inp, "x-majorticklen", 8.0, wi);
index 0f23058fa79954d5965067f7bf6b83e8ddc770ec..87bbaa5e2cc81778d732059c81c7f82699ce488c 100644 (file)
@@ -4,7 +4,7 @@
  * 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.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -413,43 +413,80 @@ void rename_pdbres(t_atoms* pdba, const char* oldnm, const char* newnm, bool bFu
     }
 }
 
-void rename_bb(t_atoms* pdba, const char* oldnm, const char* newnm, bool bFullCompare, t_symtab* symtab)
+/*! \brief Rename all residues named \c oldnm to \c newnm
+ *
+ * Search for residues for which the residue name from the input
+ * configuration file matches \c oldnm, and when found choose the rtp
+ * entry and name of \c newnm.
+ *
+ * \todo Refactor this function to accept a lambda that accepts i and
+ * numMatchesFound but always produces \c newnm. Then remove
+ * renameResiduesInteractively by calling this method with suitable
+ * lambdas that capture its parameter \c rr and ignores
+ * numMatchesFound. */
+void renameResidue(const gmx::MDLogger& logger,
+                   t_atoms*             pdba,
+                   const char*          oldnm,
+                   const char*          newnm,
+                   bool                 bFullCompare,
+                   t_symtab*            symtab)
 {
-    char* bbnm;
-    int   i;
-
-    for (i = 0; (i < pdba->nres); i++)
+    int numMatchesFound = 0;
+    for (int i = 0; (i < pdba->nres); i++)
     {
-        /* We have not set the rtp name yes, use the residue name */
-        bbnm = *pdba->resinfo[i].name;
-        if ((bFullCompare && (gmx::equalCaseInsensitive(bbnm, oldnm)))
-            || (!bFullCompare && strstr(bbnm, oldnm) != nullptr))
+        /* We have not set the rtp name yet, use the residue name */
+        const char* residueNameInInputConfiguration = *pdba->resinfo[i].name;
+        if ((bFullCompare && (gmx::equalCaseInsensitive(residueNameInInputConfiguration, oldnm)))
+            || (!bFullCompare && strstr(residueNameInInputConfiguration, oldnm) != nullptr))
         {
-            /* Change the rtp builing block name */
-            pdba->resinfo[i].rtp = put_symtab(symtab, newnm);
+            /* Change the rtp building block name */
+            pdba->resinfo[i].rtp  = put_symtab(symtab, newnm);
+            pdba->resinfo[i].name = pdba->resinfo[i].rtp;
+            numMatchesFound++;
         }
     }
+    if (numMatchesFound > 0)
+    {
+        GMX_LOG(logger.info)
+                .asParagraph()
+                .appendTextFormatted(
+                        "Replaced %d residue%s named %s to the default %s. Use interactive "
+                        "selection of protonated residues if that is what you need.",
+                        numMatchesFound,
+                        numMatchesFound > 1 ? "s" : "",
+                        oldnm,
+                        newnm);
+    }
 }
 
-void rename_bbint(t_atoms*                       pdba,
-                  const char*                    oldnm,
-                  const char*                    gettp(int, gmx::ArrayRef<const RtpRename>),
-                  bool                           bFullCompare,
-                  t_symtab*                      symtab,
-                  gmx::ArrayRef<const RtpRename> rr)
+/*! \brief Rename all residues named \c oldnm according to the user's
+ * interactive choice
+ *
+ * Search for residues for which the residue name from the input
+ * configuration file matches \c oldnm, and when found choose the rtp
+ * entry and name of the interactive choice from \c gettp.
+ *
+ * \todo Remove this function, per todo in \c renameResidue. */
+void renameResidueInteractively(t_atoms*    pdba,
+                                const char* oldnm,
+                                const char* gettp(int, gmx::ArrayRef<const RtpRename>),
+                                bool        bFullCompare,
+                                t_symtab*   symtab,
+                                gmx::ArrayRef<const RtpRename> rr)
 {
-    int         i;
-    const char* ptr;
-    char*       bbnm;
-
-    for (i = 0; i < pdba->nres; i++)
+    // Search for residues i for which the residue name from the input
+    // configuration file matches oldnm, so it can replaced by the rtp
+    // entry and name of newnm.
+    for (int i = 0; i < pdba->nres; i++)
     {
         /* We have not set the rtp name yet, use the residue name */
-        bbnm = *pdba->resinfo[i].name;
-        if ((bFullCompare && (strcmp(bbnm, oldnm) == 0)) || (!bFullCompare && strstr(bbnm, oldnm) != nullptr))
+        char* residueNameInInputConfiguration = *pdba->resinfo[i].name;
+        if ((bFullCompare && (strcmp(residueNameInInputConfiguration, oldnm) == 0))
+            || (!bFullCompare && strstr(residueNameInInputConfiguration, oldnm) != nullptr))
         {
-            ptr                  = gettp(i, rr);
-            pdba->resinfo[i].rtp = put_symtab(symtab, ptr);
+            const char* interactiveRtpChoice = gettp(i, rr);
+            pdba->resinfo[i].rtp             = put_symtab(symtab, interactiveRtpChoice);
+            pdba->resinfo[i].name            = pdba->resinfo[i].rtp;
         }
     }
 }
@@ -620,7 +657,8 @@ int read_pdball(const char*     inf,
     return natom;
 }
 
-void process_chain(t_atoms*                       pdba,
+void process_chain(const gmx::MDLogger&           logger,
+                   t_atoms*                       pdba,
                    gmx::ArrayRef<gmx::RVec>       x,
                    bool                           bTrpU,
                    bool                           bPheU,
@@ -639,43 +677,43 @@ void process_chain(t_atoms*                       pdba,
     /* Rename aromatics, lys, asp and histidine */
     if (bTyrU)
     {
-        rename_bb(pdba, "TYR", "TYRU", false, symtab);
+        renameResidue(logger, pdba, "TYR", "TYRU", false, symtab);
     }
     if (bTrpU)
     {
-        rename_bb(pdba, "TRP", "TRPU", false, symtab);
+        renameResidue(logger, pdba, "TRP", "TRPU", false, symtab);
     }
     if (bPheU)
     {
-        rename_bb(pdba, "PHE", "PHEU", false, symtab);
+        renameResidue(logger, pdba, "PHE", "PHEU", false, symtab);
     }
     if (bLysMan)
     {
-        rename_bbint(pdba, "LYS", get_lystp, false, symtab, rr);
+        renameResidueInteractively(pdba, "LYS", get_lystp, false, symtab, rr);
     }
     if (bArgMan)
     {
-        rename_bbint(pdba, "ARG", get_argtp, false, symtab, rr);
+        renameResidueInteractively(pdba, "ARG", get_argtp, false, symtab, rr);
     }
     if (bGlnMan)
     {
-        rename_bbint(pdba, "GLN", get_glntp, false, symtab, rr);
+        renameResidueInteractively(pdba, "GLN", get_glntp, false, symtab, rr);
     }
     if (bAspMan)
     {
-        rename_bbint(pdba, "ASP", get_asptp, false, symtab, rr);
+        renameResidueInteractively(pdba, "ASP", get_asptp, false, symtab, rr);
     }
     else
     {
-        rename_bb(pdba, "ASPH", "ASP", false, symtab);
+        renameResidue(logger, pdba, "ASPH", "ASP", false, symtab);
     }
     if (bGluMan)
     {
-        rename_bbint(pdba, "GLU", get_glutp, false, symtab, rr);
+        renameResidueInteractively(pdba, "GLU", get_glutp, false, symtab, rr);
     }
     else
     {
-        rename_bb(pdba, "GLUH", "GLU", false, symtab);
+        renameResidue(logger, pdba, "GLUH", "GLU", false, symtab);
     }
 
     if (!bHisMan)
@@ -684,7 +722,7 @@ void process_chain(t_atoms*                       pdba,
     }
     else
     {
-        rename_bbint(pdba, "HIS", get_histp, true, symtab, rr);
+        renameResidueInteractively(pdba, "HIS", get_histp, true, symtab, rr);
     }
 
     /* Initialize the rtp builing block names with the residue names
@@ -2298,7 +2336,8 @@ int pdb2gmx::run()
                             "Processing chain %d (%d atoms, %d residues)", chain + 1, natom, nres);
         }
 
-        process_chain(pdba,
+        process_chain(logger,
+                      pdba,
                       x,
                       bUnA_,
                       bUnA_,
index 499fbbd16b7a0d05b1c2d2427c2c2d7c8381a720..9663d50d80f64e5875027c59a9edf8fc02418429 100644 (file)
@@ -72,6 +72,7 @@
 #include "gromacs/topology/mtop_util.h"
 #include "gromacs/topology/symtab.h"
 #include "gromacs/topology/topology.h"
+#include "gromacs/utility/arrayref.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/exceptions.h"
 #include "gromacs/utility/fatalerror.h"
@@ -1964,9 +1965,7 @@ void get_ir(const char*     mdparin,
     {
         gmx::GromppMtsOpts& mtsOpts = opts->mtsOpts;
         mtsOpts.numLevels           = get_eint(&inp, "mts-levels", 2, wi);
-        ir->mtsLevels.resize(2);
-        mtsOpts.level2Forces = setStringEntry(
-                &inp, "mts-level2-forces", "longrange-nonbonded nonbonded pair dihedral");
+        mtsOpts.level2Forces = setStringEntry(&inp, "mts-level2-forces", "longrange-nonbonded");
         mtsOpts.level2Factor = get_eint(&inp, "mts-level2-factor", 2, wi);
 
         // We clear after reading without dynamics to not force the user to remove MTS mdp options
@@ -2779,6 +2778,21 @@ int search_string(const char* s, int ng, char* gn[])
               s);
 }
 
+static void atomGroupRangeValidation(int natoms, int groupIndex, const t_blocka& block)
+{
+    /* Now go over the atoms in the group */
+    for (int j = block.index[groupIndex]; (j < block.index[groupIndex + 1]); j++)
+    {
+        int aj = block.a[j];
+
+        /* Range checking */
+        if ((aj < 0) || (aj >= natoms))
+        {
+            gmx_fatal(FARGS, "Invalid atom number %d in indexfile", aj + 1);
+        }
+    }
+}
+
 static void do_numbering(int                        natoms,
                          SimulationGroups*          groups,
                          gmx::ArrayRef<std::string> groupsFromMdpFile,
@@ -2792,7 +2806,7 @@ static void do_numbering(int                        natoms,
 {
     unsigned short*   cbuf;
     AtomGroupIndices* grps = &(groups->groups[gtype]);
-    int               j, gid, aj, ognr, ntot = 0;
+    int               ntot = 0;
     const char*       title;
     char              warn_buf[STRLEN];
 
@@ -2808,25 +2822,19 @@ static void do_numbering(int                        natoms,
     for (int i = 0; i != groupsFromMdpFile.ssize(); ++i)
     {
         /* Lookup the group name in the block structure */
-        gid = search_string(groupsFromMdpFile[i].c_str(), block->nr, gnames);
+        const int gid = search_string(groupsFromMdpFile[i].c_str(), block->nr, gnames);
         if ((grptp != egrptpONE) || (i == 0))
         {
             grps->emplace_back(gid);
         }
-
+        GMX_ASSERT(block, "Can't have a nullptr block");
+        atomGroupRangeValidation(natoms, gid, *block);
         /* Now go over the atoms in the group */
-        for (j = block->index[gid]; (j < block->index[gid + 1]); j++)
+        for (int j = block->index[gid]; (j < block->index[gid + 1]); j++)
         {
-
-            aj = block->a[j];
-
-            /* Range checking */
-            if ((aj < 0) || (aj >= natoms))
-            {
-                gmx_fatal(FARGS, "Invalid atom number %d in indexfile", aj + 1);
-            }
+            const int aj = block->a[j];
             /* Lookup up the old group number */
-            ognr = cbuf[aj];
+            const int ognr = cbuf[aj];
             if (ognr != NOGID)
             {
                 gmx_fatal(FARGS, "Atom %d in multiple %s groups (%d and %d)", aj + 1, title, ognr + 1, i + 1);
@@ -2860,7 +2868,7 @@ static void do_numbering(int                        natoms,
             warning_note(wi, warn_buf);
         }
         /* Assign all atoms currently unassigned to a rest group */
-        for (j = 0; (j < natoms); j++)
+        for (int j = 0; (j < natoms); j++)
         {
             if (cbuf[j] == NOGID)
             {
@@ -2877,7 +2885,7 @@ static void do_numbering(int                        natoms,
             grps->emplace_back(restnm);
 
             /* Assign the rest name to all atoms not currently assigned to a group */
-            for (j = 0; (j < natoms); j++)
+            for (int j = 0; (j < natoms); j++)
             {
                 if (cbuf[j] == NOGID)
                 {
@@ -3785,6 +3793,14 @@ void do_index(const char*                   mdparin,
 
     if (ir->bPull)
     {
+        for (int i = 1; i < ir->pull->ngroup; i++)
+        {
+            const int gid = search_string(
+                    inputrecStrings->pullGroupNames[i].c_str(), defaultIndexGroups->nr, gnames);
+            GMX_ASSERT(defaultIndexGroups, "Must have initialized default index groups");
+            atomGroupRangeValidation(natoms, gid, *defaultIndexGroups);
+        }
+
         process_pull_groups(ir->pull->group, inputrecStrings->pullGroupNames, defaultIndexGroups, gnames);
 
         checkPullCoords(ir->pull->group, ir->pull->coord);
index 7c4909a487596e8c9a87a5ff4a95be468f665c1e..db9ce4e157e49168acc44eae3466be182bc186a6 100644 (file)
@@ -101,21 +101,22 @@ ATOM     96  HZ2 LYS    22      55.507  22.037  -1.928  1.00  0.00
 ATOM     97  HZ3 LYS    22      55.199  23.547  -2.469  1.00  0.00            
 ATOM     98  C   LYS    22      54.550  21.890  -5.100  1.00  0.00            
 ATOM     99  O   LYS    22      55.310  21.550  -4.200  1.00  0.00            
-ATOM    100  N   GLU    23      55.000  22.860  -5.950  1.00  0.00            
-ATOM    101  H   GLU    23      54.636  22.868  -6.881  1.00  0.00            
-ATOM    102  CA  GLU    23      55.960  23.870  -5.600  1.00  0.00            
-ATOM    103  HA  GLU    23      55.555  24.335  -4.813  1.00  0.00            
-ATOM    104  CB  GLU    23      57.340  23.380  -5.110  1.00  0.00            
-ATOM    105  HB1 GLU    23      57.182  22.666  -4.428  1.00  0.00            
-ATOM    106  HB2 GLU    23      57.819  22.990  -5.897  1.00  0.00            
-ATOM    107  CG  GLU    23      58.260  24.470  -4.470  1.00  0.00            
-ATOM    108  HG1 GLU    23      58.964  24.043  -3.902  1.00  0.00            
-ATOM    109  HG2 GLU    23      58.695  25.022  -5.182  1.00  0.00            
-ATOM    110  CD  GLU    23      57.360  25.360  -3.600  1.00  0.00            
-ATOM    111  OE1 GLU    23      57.280  26.560  -3.940  1.00  0.00            
-ATOM    112  OE2 GLU    23      56.810  24.870  -2.530  1.00  0.00            
-ATOM    113  C   GLU    23      56.080  24.750  -6.790  1.00  0.00            
-ATOM    114  O   GLU    23      55.760  24.380  -7.960  1.00  0.00            
+REMARK Test that naming as GLUH produces the correct default (ie. GLU)
+ATOM    100  N   GLUH   23      55.000  22.860  -5.950  1.00  0.00            
+ATOM    101  H   GLUH   23      54.636  22.868  -6.881  1.00  0.00            
+ATOM    102  CA  GLUH   23      55.960  23.870  -5.600  1.00  0.00            
+ATOM    103  HA  GLUH   23      55.555  24.335  -4.813  1.00  0.00            
+ATOM    104  CB  GLUH   23      57.340  23.380  -5.110  1.00  0.00            
+ATOM    105  HB1 GLUH   23      57.182  22.666  -4.428  1.00  0.00            
+ATOM    106  HB2 GLUH   23      57.819  22.990  -5.897  1.00  0.00            
+ATOM    107  CG  GLUH   23      58.260  24.470  -4.470  1.00  0.00            
+ATOM    108  HG1 GLUH   23      58.964  24.043  -3.902  1.00  0.00            
+ATOM    109  HG2 GLUH   23      58.695  25.022  -5.182  1.00  0.00            
+ATOM    110  CD  GLUH   23      57.360  25.360  -3.600  1.00  0.00            
+ATOM    111  OE1 GLUH   23      57.280  26.560  -3.940  1.00  0.00            
+ATOM    112  OE2 GLUH   23      56.810  24.870  -2.530  1.00  0.00            
+ATOM    113  C   GLUH   23      56.080  24.750  -6.790  1.00  0.00            
+ATOM    114  O   GLUH   23      55.760  24.380  -7.960  1.00  0.00            
 ATOM    115  N   TRP    24      56.440  26.040  -6.540  1.00  0.00            
 ATOM    116  H   TRP    24      56.558  26.344  -5.595  1.00  0.00            
 ATOM    117  CA  TRP    24      56.660  27.000  -7.650  1.00  0.00            
index 060d753faa92fbd0f252e72a1c23c604d76360fb..53128ae8f35d9c4311adc66441cef9738155a308 100644 (file)
@@ -65,18 +65,19 @@ ATOM     60  OH  TYR    53      56.360  31.760   0.090  1.00  0.00
 ATOM     61  HH  TYR    53      55.848  32.179   0.840  1.00  0.00            
 ATOM     62  C   TYR    53      57.080  24.210   1.430  1.00  0.00            
 ATOM     63  O   TYR    53      56.010  23.620   1.130  1.00  0.00            
-ATOM     64  N   ASP    54      57.980  23.720   2.320  1.00  0.00            
-ATOM     65  H   ASP    54      58.615  24.348   2.770  1.00  0.00            
-ATOM     66  CA  ASP    54      58.040  22.320   2.630  1.00  0.00            
-ATOM     67  HA  ASP    54      58.132  21.881   1.736  1.00  0.00            
-ATOM     68  CB  ASP    54      59.260  22.090   3.530  1.00  0.00            
-ATOM     69  HB1 ASP    54      59.097  22.437   4.454  1.00  0.00            
-ATOM     70  HB2 ASP    54      59.497  21.120   3.575  1.00  0.00            
-ATOM     71  CG  ASP    54      60.370  22.780   3.000  1.00  0.00            
-ATOM     72  OD1 ASP    54      60.690  23.920   3.530  1.00  0.00            
-ATOM     73  OD2 ASP    54      61.010  22.280   2.050  1.00  0.00            
-ATOM     74  C   ASP    54      56.760  21.720   3.200  1.00  0.00            
-ATOM     75  O   ASP    54      56.400  20.580   2.900  1.00  0.00            
+REMARK Test that naming as ASPH produces the correct default (ie. ASP)
+ATOM     64  N   ASPH   54      57.980  23.720   2.320  1.00  0.00            
+ATOM     65  H   ASPH   54      58.615  24.348   2.770  1.00  0.00            
+ATOM     66  CA  ASPH   54      58.040  22.320   2.630  1.00  0.00            
+ATOM     67  HA  ASPH   54      58.132  21.881   1.736  1.00  0.00            
+ATOM     68  CB  ASPH   54      59.260  22.090   3.530  1.00  0.00            
+ATOM     69  HB1 ASPH   54      59.097  22.437   4.454  1.00  0.00            
+ATOM     70  HB2 ASPH   54      59.497  21.120   3.575  1.00  0.00            
+ATOM     71  CG  ASPH   54      60.370  22.780   3.000  1.00  0.00            
+ATOM     72  OD1 ASPH   54      60.690  23.920   3.530  1.00  0.00            
+ATOM     73  OD2 ASPH   54      61.010  22.280   2.050  1.00  0.00            
+ATOM     74  C   ASPH   54      56.760  21.720   3.200  1.00  0.00            
+ATOM     75  O   ASPH   54      56.400  20.580   2.900  1.00  0.00            
 ATOM     76  N   ALA    55      56.050  22.530   4.050  1.00  0.00            
 ATOM     77  H   ALA    55      56.390  23.458   4.206  1.00  0.00            
 ATOM     78  CA  ALA    55      54.850  22.130   4.730  1.00  0.00            
index d72b4fa2053d81d2df7ee0a90d494733cd3e134b..475afeea73f47456681b9433a8f4d2036340d623 100644 (file)
@@ -4,7 +4,7 @@
  * 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.
- * Copyright (c) 2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -66,6 +66,7 @@ static gmx::EnumerationArray<Directive, const char*> directive_names = {
       /* All the directives above can not appear after moleculetype */
       "moleculetype",
       "atoms",
+      "virtual_sites1",
       "virtual_sites2",
       "virtual_sites3",
       "virtual_sites4",
@@ -174,6 +175,15 @@ int ifunc_index(Directive d, int type)
             {
                 return F_BHAM;
             }
+        case Directive::d_vsites1:
+            if (type == 1)
+            {
+                return F_VSITE1;
+            }
+            else
+            {
+                gmx_fatal(FARGS, "Invalid vsites1 type %d", type);
+            }
         case Directive::d_vsites2:
             switch (type)
             {
@@ -308,6 +318,7 @@ void DS_Init(DirStack** DS)
         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_vsites1]), Directive::d_atoms, 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);
index 075d989f6b62235c2e31dd20ddf9333af97db8eb..202cd23b11ef3d5b2ff5526f54c7c28294b6fec2 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2019, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -54,6 +54,7 @@ enum class Directive : int
     d_cmaptypes,
     d_moleculetype,
     d_atoms,
+    d_vsites1,
     d_vsites2,
     d_vsites3,
     d_vsites4,
index 998fc40eddde9f8f204b9f138dc680e3b86c5b6a..cf702b1f9178adb9c315e3127253769e6a70c7c1 100644 (file)
@@ -4,7 +4,7 @@
  * 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.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -790,6 +790,7 @@ static char** read_topol(const char*                           infile,
                                       wi);
                             break;
 
+                        case Directive::d_vsites1:
                         case Directive::d_vsites2:
                         case Directive::d_vsites3:
                         case Directive::d_vsites4:
index 86b50cf3c6539b955f30269718726c317e745088..9a2a31d85aefeac35f2bc6cf4b5e36d6e2eba835 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2012,2014,2015,2016,2017 by the GROMACS development team.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -69,12 +69,14 @@ static const unsigned int c_fullWarpMask = 0xffffffff;
  *
  *  Only texture objects supported.
  *  Disable texture support missing in clang (all versions up to <=5.0-dev as of writing).
+ *  Disable texture support on CC 7.0 and 8.0 for performance reasons (Issue #3845).
  *
  *  This option will not influence functionality. All features using textures ought
  *  to have fallback for texture-less reads (direct/LDG loads), all new code needs
  *  to provide fallback code.
  */
-#if defined(GMX_DISABLE_CUDA_TEXTURES) || (defined(__clang__) && defined(__CUDA__))
+#if defined(GMX_DISABLE_CUDA_TEXTURES) || (defined(__clang__) && defined(__CUDA__)) \
+        || (GMX_PTX_ARCH == 700) || (GMX_PTX_ARCH == 800)
 #    define DISABLE_CUDA_TEXTURES 1
 #else
 #    define DISABLE_CUDA_TEXTURES 0
index bb6d001a5132b8c4a30e1a066d1eb995c234749f..b44e6e25e31aa702d00017606b94ffc3d73bd15e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -63,18 +63,18 @@ void doDeviceTransfers(const DeviceInformation& deviceInfo, ArrayRef<const char>
         cl::sycl::property_list syclBufferProperties{ cl::sycl::property::buffer::context_bound(
                 syclQueue.get_context()) };
 
-        cl::sycl::buffer<char> syclBuffer(::sycl::range<1>(input.size()), syclBufferProperties);
+        cl::sycl::buffer<char> syclBuffer(cl::sycl::range<1>(input.size()), syclBufferProperties);
 
         syclQueue
                 .submit([&](cl::sycl::handler& cgh) {
-                    auto accessor = syclBuffer.get_access<cl::sycl::access_mode::discard_write>(cgh);
+                    auto accessor = syclBuffer.get_access<cl::sycl::access::mode::discard_write>(cgh);
                     cgh.copy(input.data(), accessor);
                 })
                 .wait_and_throw();
 
         syclQueue
                 .submit([&](cl::sycl::handler& cgh) {
-                    auto accessor = syclBuffer.get_access<cl::sycl::access_mode::write>(cgh);
+                    auto accessor = syclBuffer.get_access<cl::sycl::access::mode::read>(cgh);
                     cgh.copy(accessor, output.data());
                 })
                 .wait_and_throw();
index 173ca15ee300ccba1c15093351769c1aa55c289e..2bf390321420bc21d0b0d0973fed58e59829ef2e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -204,7 +204,7 @@ TYPED_TEST(HostAllocatorTestCopyable, TransfersWithoutPinningWork)
     {
         setActiveDevice(testDevice->deviceInfo());
         typename TestFixture::VectorType input;
-        fillInput(&input, 1);
+        resizeAndFillInput(&input, 3, 1);
         typename TestFixture::VectorType output;
         output.resizeWithPadding(input.size());
 
@@ -216,7 +216,7 @@ TYPED_TEST(HostAllocatorTestCopyable, FillInputAlsoWorksAfterCallingReserve)
 {
     typename TestFixture::VectorType input;
     input.reserveWithPadding(3);
-    fillInput(&input, 1);
+    resizeAndFillInput(&input, 3, 1);
 }
 
 TYPED_TEST(HostAllocatorTestNoMem, CreateVector)
@@ -303,7 +303,7 @@ TYPED_TEST(HostAllocatorTestCopyable, TransfersWithPinningWorkWithCuda)
         setActiveDevice(testDevice->deviceInfo());
         typename TestFixture::VectorType input;
         changePinningPolicy(&input, PinningPolicy::PinnedIfSupported);
-        fillInput(&input, 1);
+        resizeAndFillInput(&input, 3, 1);
         typename TestFixture::VectorType output;
         changePinningPolicy(&output, PinningPolicy::PinnedIfSupported);
         output.resizeWithPadding(input.size());
@@ -329,7 +329,7 @@ TYPED_TEST(HostAllocatorTestCopyable, ManualPinningOperationsWorkWithCuda)
         changePinningPolicy(&input, PinningPolicy::PinnedIfSupported);
         EXPECT_TRUE(input.get_allocator().pinningPolicy() == PinningPolicy::PinnedIfSupported);
         EXPECT_TRUE(input.empty());
-        fillInput(&input, 1);
+        resizeAndFillInput(&input, 3, 1);
         // realloc and copy).
         auto oldInputData = input.data();
         changePinningPolicy(&input, PinningPolicy::CannotBePinned);
index 063fac54b5203a93da9bee709c2b6c5070e609c7..93021e418f9420c975d46fe9f0b45d90d17944be 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -124,7 +124,8 @@ static bool isDeviceFunctional(const cl::sycl::device& syclDevice, std::string*
         cl::sycl::buffer<int, 1> buffer(numThreads);
         queue.submit([&](cl::sycl::handler& cgh) {
                  auto d_buffer = buffer.get_access<cl::sycl::access::mode::discard_write>(cgh);
-                 cgh.parallel_for<class DummyKernel>(numThreads, [=](cl::sycl::id<1> threadId) {
+                 cl::sycl::range<1> range{ numThreads };
+                 cgh.parallel_for<class DummyKernel>(range, [=](cl::sycl::id<1> threadId) {
                      d_buffer[threadId] = threadId.get(0);
                  });
              })
@@ -202,7 +203,7 @@ std::vector<std::unique_ptr<DeviceInformation>> findDevices()
         deviceInfos[i]->syclDevice = syclDevice;
         deviceInfos[i]->status     = checkDevice(i, *deviceInfos[i]);
         deviceInfos[i]->deviceVendor =
-                getDeviceVendor(syclDevice.get_info<sycl::info::device::vendor>().c_str());
+                getDeviceVendor(syclDevice.get_info<cl::sycl::info::device::vendor>().c_str());
     }
     return deviceInfos;
 }
index ff34ad967c3f3041387c30a7c917cc6a75e9c70e..d8e34936cfd6620a0ef3dc2f38bec7502ebd7644 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -120,6 +120,8 @@ GpuBonded::Impl::Impl(const gmx_ffparams_t& ffparams,
     kernelLaunchConfig_.gridSize[0]  = (fTypeRangeEnd + c_threadsPerBlock) / c_threadsPerBlock;
     kernelLaunchConfig_.gridSize[1]  = 1;
     kernelLaunchConfig_.gridSize[2]  = 1;
+    kernelLaunchConfig_.sharedMemorySize =
+            SHIFTS * sizeof(float3) + (c_threadsPerBlock / warp_size) * 3 * sizeof(float);
 }
 
 GpuBonded::Impl::~Impl()
index d3f9d4f3ac7360513940331e0377dd6aa3fef702..42d24e40e1a33b2d67a3fb1783e5eef31108e618 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -730,11 +730,15 @@ template<bool calcVir, bool calcEner>
 __global__ void exec_kernel_gpu(BondedCudaKernelParameters kernelParams)
 {
     assert(blockDim.y == 1 && blockDim.z == 1);
-    const int  tid          = blockIdx.x * blockDim.x + threadIdx.x;
-    float      vtot_loc     = 0;
-    float      vtotVdw_loc  = 0;
-    float      vtotElec_loc = 0;
-    __shared__ float3 sm_fShiftLoc[SHIFTS];
+    const int tid          = blockIdx.x * blockDim.x + threadIdx.x;
+    float     vtot_loc     = 0;
+    float     vtotVdw_loc  = 0;
+    float     vtotElec_loc = 0;
+
+    extern __shared__ char sm_dynamicShmem[];
+    char*                  sm_nextSlotPtr = sm_dynamicShmem;
+    float3*                sm_fShiftLoc   = (float3*)sm_nextSlotPtr;
+    sm_nextSlotPtr += SHIFTS * sizeof(float3);
 
     if (calcVir)
     {
@@ -852,9 +856,42 @@ __global__ void exec_kernel_gpu(BondedCudaKernelParameters kernelParams)
     {
         float* vtotVdw  = kernelParams.d_vTot + F_LJ14;
         float* vtotElec = kernelParams.d_vTot + F_COUL14;
-        atomicAdd(kernelParams.d_vTot + fType, vtot_loc);
-        atomicAdd(vtotVdw, vtotVdw_loc);
-        atomicAdd(vtotElec, vtotElec_loc);
+
+        // Stage atomic accumulation through shared memory:
+        // each warp will accumulate its own partial sum
+        // and then a single thread per warp will accumulate this to the global sum
+
+        int numWarps = blockDim.x / warpSize;
+        int warpId   = threadIdx.x / warpSize;
+
+        // Shared memory variables to hold block-local partial sum
+        float* sm_vTot = (float*)sm_nextSlotPtr;
+        sm_nextSlotPtr += numWarps * sizeof(float);
+        float* sm_vTotVdw = (float*)sm_nextSlotPtr;
+        sm_nextSlotPtr += numWarps * sizeof(float);
+        float* sm_vTotElec = (float*)sm_nextSlotPtr;
+
+        if (threadIdx.x % warpSize == 0)
+        {
+            // One thread per warp initializes to zero
+            sm_vTot[warpId]     = 0.;
+            sm_vTotVdw[warpId]  = 0.;
+            sm_vTotElec[warpId] = 0.;
+        }
+        __syncwarp(); // All threads in warp must wait for initialization
+
+        // Perform warp-local accumulation in shared memory
+        atomicAdd(sm_vTot + warpId, vtot_loc);
+        atomicAdd(sm_vTotVdw + warpId, vtotVdw_loc);
+        atomicAdd(sm_vTotElec + warpId, vtotElec_loc);
+
+        __syncwarp(); // Ensure all threads in warp have completed
+        if (threadIdx.x % warpSize == 0)
+        { // One thread per warp accumulates partial sum into global sum
+            atomicAdd(kernelParams.d_vTot + fType, sm_vTot[warpId]);
+            atomicAdd(vtotVdw, sm_vTotVdw[warpId]);
+            atomicAdd(vtotElec, sm_vTotElec[warpId]);
+        }
     }
     /* Accumulate shift vectors from shared memory to global memory on the first SHIFTS threads of the block. */
     if (calcVir)
index 5c27087d4c2d4e5e1e54137c95a1916e4300e5a0..a7280159ff90d8d1498defb2986b3a329f3e18ea 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2014,2015,2016,2017,2018 by the GROMACS development team.
- * Copyright (c) 2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -804,8 +804,11 @@ void ListedForces::calculate(struct gmx_wallcycle*                     wcycle,
     // Todo: replace all rvec use here with ArrayRefWithPadding
     const rvec* x = as_rvec_array(coordinates.paddedArrayRef().data());
 
+    const bool calculateRestInteractions =
+            interactionSelection_.test(static_cast<int>(ListedForces::InteractionGroup::Rest));
+
     t_pbc pbc_full; /* Full PBC is needed for position restraints */
-    if (haveRestraints(*fcdata))
+    if (calculateRestInteractions && haveRestraints(*fcdata))
     {
         if (!idef.il[F_POSRES].empty() || !idef.il[F_FBPOSRES].empty())
         {
index 5304ac5fe29f416e8d5f77006944a7de2dfcfedc..2ed5853fc50ff5a8c5c82bf023ce187eadb9db6c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -104,7 +104,7 @@ DensitySimilarityInnerProduct::DensitySimilarityInnerProduct(density referenceDe
     const auto numVoxels = gradient_.asConstView().mapping().required_span_size();
     /* the gradient for the inner product measure of fit is constant and does not
      * depend on the compared density, so it is pre-computed here */
-    std::transform(begin(referenceDensity_), end(referenceDensity), begin(gradient_), [numVoxels](float x) {
+    std::transform(begin(referenceDensity_), end(referenceDensity_), begin(gradient_), [numVoxels](float x) {
         return x / numVoxels;
     });
 }
@@ -235,7 +235,7 @@ struct CrossCorrelationEvaluationHelperValues
     real referenceSquaredSum = 0;
     //! The sum of the squared compared density voxel values
     real comparisonSquaredSum = 0;
-    //! The covariance of the refernce and the compared density
+    //! The covariance of the reference and the compared density
     real covariance = 0;
 };
 
@@ -275,7 +275,7 @@ CrossCorrelationEvaluationHelperValues evaluateHelperValues(DensitySimilarityMea
 class CrossCorrelationGradientAtVoxel
 {
 public:
-    //! Set up the gradident calculation with pre-computed values
+    //! Set up the gradient calculation with pre-computed values
     CrossCorrelationGradientAtVoxel(const CrossCorrelationEvaluationHelperValues& preComputed) :
         prefactor_(evaluatePrefactor(preComputed.comparisonSquaredSum, preComputed.referenceSquaredSum)),
         comparisonPrefactor_(preComputed.covariance / preComputed.comparisonSquaredSum),
@@ -352,7 +352,7 @@ real DensitySimilarityCrossCorrelation::similarity(density comparedDensity)
 
     // To avoid numerical instability due to large squared density value sums
     // division is re-written to avoid multiplying two large numbers
-    // as product of two seperate divisions of smaller numbers
+    // as product of two separate divisions of smaller numbers
     const real covarianceSqrt = sqrt(fabs(helperValues.covariance));
     const int  sign           = helperValues.covariance > 0 ? 1 : -1;
     return sign * (covarianceSqrt / sqrt(helperValues.referenceSquaredSum))
index 47aa53240f868aae5313eefd6ddc99bee9d4da4d..033af87c52ad1c6ef94fea7895e863f30d7c2334 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -44,6 +44,7 @@
 #define GMX_MATH_PADDEDVECTOR_H
 
 #include <algorithm>
+#include <utility>
 #include <vector>
 
 #include "gromacs/math/arrayrefwithpadding.h"
@@ -254,31 +255,42 @@ public:
     }
     //! Copy constructor
     PaddedVector(PaddedVector const& o) : storage_(o.storage_), unpaddedEnd_(begin() + o.size()) {}
-    //! Move constructor
+    /*! \brief Move constructor
+     *
+     * Leaves \c o in a valid state (ie the destructor can be
+     * called). */
     PaddedVector(PaddedVector&& o) noexcept :
-        storage_(std::move(o.storage_)),
-        unpaddedEnd_(std::move(o.unpaddedEnd_))
+        storage_(std::exchange(o.storage_, {})),
+        unpaddedEnd_(o.unpaddedEnd_)
     {
-        unpaddedEnd_ = begin();
     }
-    //! Move constructor using \c alloc for the new vector.
+    /*! \brief Move constructor using \c alloc for the new vector.
+     *
+     * Note that \c alloc is another instance of the same allocator
+     * type as used for \c PaddedVector. This makes sense e.g. for
+     * stateful allocators such as HostAllocator used in
+     * PaddedHostVector.
+     *
+     * Leaves \c o in a valid state (ie. the destructor can be
+     * called). */
     PaddedVector(PaddedVector&& o, const Allocator& alloc) noexcept :
-        storage_(std::move(alloc)),
+        storage_(alloc),
         unpaddedEnd_(begin())
     {
-        auto unpaddedSize = o.size();
         if (alloc == o.storage_.get_allocator())
         {
-            storage_ = std::move(o.storage_);
+            std::swap(storage_, o.storage_);
+            unpaddedEnd_ = o.unpaddedEnd_;
         }
         else
         {
             // If the allocator compares differently, we must
             // reallocate and copy.
+            auto unpaddedSize = o.size();
             resizeWithPadding(unpaddedSize);
             std::copy(o.begin(), o.end(), storage_.begin());
+            unpaddedEnd_ = begin() + unpaddedSize;
         }
-        unpaddedEnd_ = begin() + unpaddedSize;
     }
     //! Construct from an initializer list
     PaddedVector(std::initializer_list<value_type> const& il) :
index 963c2c31f10c69974d5bf7a8e734f1786f2aa32c..7f16d3dfdab36a7eae9fc0fd0fdbade6a0f805ce 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -83,26 +83,112 @@ using Implementations = ::testing::Types<std::allocator<int32_t>,
                                          AlignedAllocator<BasicVector<double>>>;
 TYPED_TEST_CASE(PaddedVectorTest, Implementations);
 
-TYPED_TEST(PaddedVectorTest, ConstructsResizesAndReserves)
+TYPED_TEST(PaddedVectorTest, DefaultConstructorWorks)
+{
+    using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
+
+    VectorType v;
+    EXPECT_EQ(v.size(), 0);
+    EXPECT_EQ(v.paddedSize(), 0);
+    EXPECT_TRUE(v.empty());
+    EXPECT_EQ(v.begin(), v.end());
+    EXPECT_EQ(v.cbegin(), v.cend());
+}
+
+TYPED_TEST(PaddedVectorTest, ResizeWorks)
 {
     using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
 
     VectorType v;
-    fillInput(&v, 1);
 
-    EXPECT_EQ(v.size(), v.size());
+    resizeAndFillInput(&v, 3, 1);
+    EXPECT_EQ(v.size(), 3);
+    EXPECT_GE(v.paddedSize(), 3);
     EXPECT_EQ(v.paddedSize(), v.arrayRefWithPadding().size());
     EXPECT_LE(v.size(), v.arrayRefWithPadding().size());
+}
+
+TYPED_TEST(PaddedVectorTest, ReserveWorks)
+{
+    using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
 
     VectorType vReserved;
     vReserved.reserveWithPadding(5);
-    fillInput(&vReserved, 1);
+    resizeAndFillInput(&vReserved, 3, 1);
 
-    EXPECT_EQ(vReserved.size(), vReserved.size());
     EXPECT_EQ(vReserved.paddedSize(), vReserved.arrayRefWithPadding().size());
     EXPECT_LE(vReserved.size(), vReserved.arrayRefWithPadding().size());
+}
 
-    EXPECT_LE(v.paddedSize(), vReserved.paddedSize());
+TYPED_TEST(PaddedVectorTest, ReserveWorksTheSameAsNoReserve)
+{
+    using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
+
+    VectorType v;
+    resizeAndFillInput(&v, 3, 1);
+
+    {
+        SCOPED_TRACE("Test when the reservation is larger than needed");
+        VectorType vReserved;
+        vReserved.reserveWithPadding(5);
+        resizeAndFillInput(&vReserved, 3, 1);
+
+        EXPECT_EQ(v.size(), vReserved.size());
+        EXPECT_LE(v.paddedSize(), vReserved.paddedSize());
+    }
+    {
+        SCOPED_TRACE("Test when the reservation is smaller than needed");
+        VectorType vReserved;
+        vReserved.reserveWithPadding(1);
+        resizeAndFillInput(&vReserved, 3, 1);
+
+        EXPECT_EQ(v.size(), vReserved.size());
+        EXPECT_GE(v.paddedSize(), vReserved.paddedSize());
+    }
+}
+
+TYPED_TEST(PaddedVectorTest, MoveConstructorWorks)
+{
+    using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
+
+    VectorType vOriginal;
+    resizeAndFillInput(&vOriginal, 3, 1);
+
+    VectorType v(std::move(vOriginal));
+    EXPECT_EQ(v.size(), 3);
+    EXPECT_GE(v.paddedSize(), 3);
+    EXPECT_EQ(v.paddedSize(), v.arrayRefWithPadding().size());
+    EXPECT_LE(v.size(), v.arrayRefWithPadding().size());
+}
+
+TYPED_TEST(PaddedVectorTest, MoveConstructorWithAllocatorWorks)
+{
+    using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
+
+    VectorType vOriginal;
+    resizeAndFillInput(&vOriginal, 3, 1);
+
+    TypeParam  allocatorToTest;
+    VectorType v(std::move(vOriginal), allocatorToTest);
+    EXPECT_EQ(v.size(), 3);
+    EXPECT_GE(v.paddedSize(), 3);
+    EXPECT_EQ(v.paddedSize(), v.arrayRefWithPadding().size());
+    EXPECT_LE(v.size(), v.arrayRefWithPadding().size());
+}
+
+TYPED_TEST(PaddedVectorTest, MoveAssignmentWorks)
+{
+    using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
+
+    VectorType vOriginal;
+    resizeAndFillInput(&vOriginal, 3, 1);
+
+    VectorType v;
+    v = std::move(vOriginal);
+    EXPECT_EQ(v.size(), 3);
+    EXPECT_GE(v.paddedSize(), 3);
+    EXPECT_EQ(v.paddedSize(), v.arrayRefWithPadding().size());
+    EXPECT_LE(v.size(), v.arrayRefWithPadding().size());
 }
 
 TYPED_TEST(PaddedVectorTest, ArrayRefConversionsAreIdentical)
@@ -110,7 +196,7 @@ TYPED_TEST(PaddedVectorTest, ArrayRefConversionsAreIdentical)
     using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
 
     VectorType v;
-    fillInput(&v, 1);
+    resizeAndFillInput(&v, 3, 1);
 
     SCOPED_TRACE("Comparing different paths to create identical unpadded views");
     compareViews(makeArrayRef(v), v.arrayRefWithPadding().unpaddedArrayRef());
@@ -127,8 +213,8 @@ TYPED_TEST(PaddedVectorTest, CanCopyAssign)
     using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
 
     VectorType v, w;
-    fillInput(&v, 1);
-    fillInput(&w, 2);
+    resizeAndFillInput(&v, 3, 1);
+    resizeAndFillInput(&w, 3, 2);
 
     w = v;
     compareViews(v.arrayRefWithPadding().unpaddedArrayRef(), w.arrayRefWithPadding().unpaddedArrayRef());
@@ -140,9 +226,9 @@ TYPED_TEST(PaddedVectorTest, CanMoveAssign)
     using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
 
     VectorType v, w, x;
-    fillInput(&v, 1);
-    fillInput(&w, 2);
-    fillInput(&x, 1);
+    resizeAndFillInput(&v, 3, 1);
+    resizeAndFillInput(&w, 3, 2);
+    resizeAndFillInput(&x, 3, 1);
 
     SCOPED_TRACE("Comparing padded views before move");
     compareViews(v.arrayRefWithPadding().unpaddedArrayRef(), x.arrayRefWithPadding().unpaddedArrayRef());
@@ -162,9 +248,9 @@ TYPED_TEST(PaddedVectorTest, CanSwap)
     using VectorType = PaddedVector<typename TypeParam::value_type, TypeParam>;
 
     VectorType v, w, x;
-    fillInput(&v, 1);
-    fillInput(&w, 2);
-    fillInput(&x, 1);
+    resizeAndFillInput(&v, 3, 1);
+    resizeAndFillInput(&w, 3, 2);
+    resizeAndFillInput(&x, 3, 1);
 
     std::swap(w, x);
     compareViews(v.arrayRefWithPadding().unpaddedArrayRef(), w.arrayRefWithPadding().unpaddedArrayRef());
index bdaae01d68b365c233727664b43a7555552a117a..f6aa58b0327cac76de2a770673a600c765dda408 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -53,40 +53,34 @@ namespace test
 
 //! Initialization overload for non-BasicVector
 template<typename T>
-void fillInputContents(ArrayRef<T> inputRef, int scaleFactor)
+void fillInputContents(ArrayRef<T> inputRef, int scaleFactorForElements)
 {
-    inputRef[0] = 1;
-    inputRef[1] = 2;
-    inputRef[2] = 3;
-    for (auto& element : inputRef)
+    for (size_t i = 0; i < inputRef.size(); i++)
     {
-        element *= scaleFactor;
+        inputRef[i] = T((i + 1) * scaleFactorForElements);
     }
 }
 
 //! Initialization overload for BasicVector
 template<typename T>
-void fillInputContents(ArrayRef<BasicVector<T>> inputRef, int scaleFactor)
+void fillInputContents(ArrayRef<BasicVector<T>> inputRef, int scaleFactorForElements)
 {
-    inputRef[0] = { 1, 2, 3 };
-    inputRef[1] = { 4, 5, 6 };
-    inputRef[2] = { 7, 8, 9 };
-    for (auto& element : inputRef)
+    for (size_t i = 0; i < inputRef.size(); i++)
     {
-        element *= scaleFactor;
+        for (size_t j = 0; j < DIM; j++)
+        {
+            inputRef[i][j] = T((DIM * i + j + 1) * scaleFactorForElements);
+        }
     }
 }
 
 //! Dispatcher function for filling.
 template<typename PaddedVectorOfT>
-void fillInput(PaddedVectorOfT* input, int scaleFactor)
+void resizeAndFillInput(PaddedVectorOfT* input, int newSize, int scaleFactorForElements)
 {
-    // Use a size for the vector in tests that is prime enough to
-    // expose problems where they exist.
-    int sizeOfVector = 3;
-    input->resizeWithPadding(sizeOfVector);
-    fillInputContents(makeArrayRef(*input), scaleFactor);
-    EXPECT_LE(sizeOfVector, input->paddedSize());
+    input->resizeWithPadding(newSize);
+    fillInputContents(makeArrayRef(*input), scaleFactorForElements);
+    EXPECT_LE(newSize, input->paddedSize());
 }
 
 //! Comparison overload for non-BasicVector
index 3f5e7b86c6dfd70f10e88d8270a5c4d05b184f3e..29af5cb4798acdeef71de80ef690539c5eacc8e5 100644 (file)
@@ -1732,7 +1732,7 @@ static real energyNoseHoover(const t_inputrec* ir, const t_state* state, const t
         const double* ivxi  = &state->nosehoover_vxi[i * nh];
         const double* iQinv = &(MassQ->Qinv[i * nh]);
 
-        int  nd   = static_cast<int>(ir->opts.nrdf[i]);
+        real nd   = ir->opts.nrdf[i];
         real reft = std::max<real>(ir->opts.ref_t[i], 0);
         real kT   = BOLTZ * reft;
 
@@ -1747,7 +1747,7 @@ static real energyNoseHoover(const t_inputrec* ir, const t_state* state, const t
                     {
                         energy += 0.5 * gmx::square(ivxi[j]) / iQinv[j];
                         /* contribution from the thermal variable of the NH chain */
-                        int ndj;
+                        real ndj = 0;
                         if (j == 0)
                         {
                             ndj = nd;
index bdac063a161d20d127f5f82dee67b156d22b3d6e..570229515be08ac9bf33ca21c770dc8d3d4133fc 100644 (file)
@@ -70,6 +70,8 @@
 #include "gromacs/utility/gmxmpi.h"
 #include "gromacs/utility/smalloc.h"
 
+#include "expanded_internal.h"
+
 static void init_df_history_weights(df_history_t* dfhist, const t_expanded* expand, int nlim)
 {
     int i;
@@ -344,20 +346,25 @@ static gmx_bool UpdateWeights(int           nlim,
                               int64_t       step)
 {
     gmx_bool bSufficientSamples;
+    real     acceptanceWeight;
     int      i;
-    int      n0, np1, nm1, nval, min_nvalm, min_nvalp, maxc;
-    real     omega_m1_0, omega_p1_0, clam_osum;
-    real     de, de_function;
-    real     cnval, zero_sum_weights;
+    int      min_nvalm, min_nvalp, maxc;
+    real     omega_m1_0, omega_p1_0;
+    real     zero_sum_weights;
     real *omegam_array, *weightsm_array, *omegap_array, *weightsp_array, *varm_array, *varp_array,
             *dwp_array, *dwm_array;
-    real    clam_varm, clam_varp, clam_weightsm, clam_weightsp, clam_minvar;
+    real    clam_varm, clam_varp, clam_osum, clam_weightsm, clam_weightsp, clam_minvar;
     real *  lam_variance, *lam_dg;
     double* p_k;
     double  pks = 0;
-    real    chi_m1_0, chi_p1_0, chi_m2_0, chi_p2_0, chi_p1_m1, chi_p2_m1, chi_m1_p1, chi_m2_p1;
 
-    /* if we have equilibrated the weights, exit now */
+    /* Future potential todos for this function (see #3848):
+     *  - Update the names in the dhist structure to be clearer. Not done for now since this
+     *    a bugfix update and we are mininizing other code changes.
+     *  - Modularize the code some more.
+     *  - potentially merge with accelerated weight histogram functionality, since it's very similar.
+     */
+    /*  if we have equilibrated the expanded ensemble weights, we are not updating them, so exit now */
     if (dfhist->bEquil)
     {
         return FALSE;
@@ -380,12 +387,15 @@ static gmx_bool UpdateWeights(int           nlim,
 
     if (EWL(expand->elamstats))
     {
-        if (expand->elamstats == elamstatsWL) /* Standard Wang-Landau */
+        if (expand->elamstats == elamstatsWL) /* Using standard Wang-Landau for weight updates */
         {
             dfhist->sum_weights[fep_state] -= dfhist->wl_delta;
             dfhist->wl_histo[fep_state] += 1.0;
         }
-        else if (expand->elamstats == elamstatsWWL) /* Weighted Wang-Landau */
+        else if (expand->elamstats == elamstatsWWL)
+        /* Using weighted Wang-Landau for weight updates.
+         * Very closly equivalent to accelerated weight histogram approach
+         * applied to expanded ensemble. */
         {
             snew(p_k, nlim);
 
@@ -427,8 +437,6 @@ static gmx_bool UpdateWeights(int           nlim,
     if (expand->elamstats == elamstatsBARKER || expand->elamstats == elamstatsMETROPOLIS
         || expand->elamstats == elamstatsMINVAR)
     {
-
-        de_function = 0; /* to get rid of warnings, but this value will not be used because of the logic */
         maxc = 2 * expand->c_range + 1;
 
         snew(lam_dg, nlim);
@@ -444,7 +452,11 @@ static gmx_bool UpdateWeights(int           nlim,
         snew(varm_array, maxc);
         snew(dwm_array, maxc);
 
-        /* unpack the current lambdas -- we will only update 2 of these */
+        /* unpack the values of the free energy differences and the
+         * variance in their estimates between nearby lambdas. We will
+         * only actually update 2 of these, the state we are currently
+         * at and the one we end up moving to
+         */
 
         for (i = 0; i < nlim - 1; i++)
         { /* only through the second to last */
@@ -453,166 +465,289 @@ static gmx_bool UpdateWeights(int           nlim,
                     gmx::square(dfhist->sum_variance[i + 1]) - gmx::square(dfhist->sum_variance[i]);
         }
 
-        /* accumulate running averages */
-        for (nval = 0; nval < maxc; nval++)
+        /* accumulate running averages of thermodynamic averages for Bennett Acceptance Ratio-based
+         * estimates of the free energy .
+         * Rather than peforming self-consistent estimation of the free energies at each step,
+         * we keep track of an array of possible different free energies (cnvals),
+         * and we self-consistently choose the best one. The one that leads to a free energy estimate
+         * that is closest to itself is the best estimate of the free energy.  It is essentially a
+         * parallellized version of self-consistent iteration.  maxc is the number of these constants. */
+
+        for (int nval = 0; nval < maxc; nval++)
         {
-            /* constants for later use */
-            cnval = static_cast<real>(nval - expand->c_range);
-            /* actually, should be able to rewrite it w/o exponential, for better numerical stability */
+            const real cnval = static_cast<real>(nval - expand->c_range);
+
+            /* Compute acceptance criterion weight to the state below this one for use in averages.
+             * Note we do not have to have just moved from that state to use this free energy
+             * estimate; these are essentially "virtual" moves. */
+
             if (fep_state > 0)
             {
-                de = std::exp(cnval - (scaled_lamee[fep_state] - scaled_lamee[fep_state - 1]));
-                if (expand->elamstats == elamstatsBARKER || expand->elamstats == elamstatsMINVAR)
-                {
-                    de_function = 1.0 / (1.0 + de);
-                }
-                else if (expand->elamstats == elamstatsMETROPOLIS)
-                {
-                    if (de < 1.0)
-                    {
-                        de_function = 1.0;
-                    }
-                    else
-                    {
-                        de_function = 1.0 / de;
-                    }
-                }
-                dfhist->accum_m[fep_state][nval] += de_function;
-                dfhist->accum_m2[fep_state][nval] += de_function * de_function;
+                const auto lambdaEnergyDifference =
+                        cnval - (scaled_lamee[fep_state] - scaled_lamee[fep_state - 1]);
+                acceptanceWeight =
+                        gmx::calculateAcceptanceWeight(expand->elamstats, lambdaEnergyDifference);
+                dfhist->accum_m[fep_state][nval] += acceptanceWeight;
+                dfhist->accum_m2[fep_state][nval] += acceptanceWeight * acceptanceWeight;
             }
 
+            // Compute acceptance criterion weight to transition to the next state
             if (fep_state < nlim - 1)
             {
-                de = std::exp(-cnval + (scaled_lamee[fep_state + 1] - scaled_lamee[fep_state]));
-                if (expand->elamstats == elamstatsBARKER || expand->elamstats == elamstatsMINVAR)
-                {
-                    de_function = 1.0 / (1.0 + de);
-                }
-                else if (expand->elamstats == elamstatsMETROPOLIS)
-                {
-                    if (de < 1.0)
-                    {
-                        de_function = 1.0;
-                    }
-                    else
-                    {
-                        de_function = 1.0 / de;
-                    }
-                }
-                dfhist->accum_p[fep_state][nval] += de_function;
-                dfhist->accum_p2[fep_state][nval] += de_function * de_function;
+                const auto lambdaEnergyDifference =
+                        -cnval + (scaled_lamee[fep_state + 1] - scaled_lamee[fep_state]);
+                acceptanceWeight =
+                        gmx::calculateAcceptanceWeight(expand->elamstats, lambdaEnergyDifference);
+                dfhist->accum_p[fep_state][nval] += acceptanceWeight;
+                dfhist->accum_p2[fep_state][nval] += acceptanceWeight * acceptanceWeight;
             }
 
-            /* Metropolis transition and Barker transition (unoptimized Bennett) acceptance weight determination */
+            /* Determination of Metropolis transition and Barker transition weights */
 
-            n0 = dfhist->n_at_lam[fep_state];
+            int numObservationsCurrentState = dfhist->n_at_lam[fep_state];
+            /* determine the number of observations above and below the current state */
+            int numObservationsLowerState = 0;
             if (fep_state > 0)
             {
-                nm1 = dfhist->n_at_lam[fep_state - 1];
-            }
-            else
-            {
-                nm1 = 0;
+                numObservationsLowerState = dfhist->n_at_lam[fep_state - 1];
             }
+            int numObservationsHigherState = 0;
             if (fep_state < nlim - 1)
             {
-                np1 = dfhist->n_at_lam[fep_state + 1];
-            }
-            else
-            {
-                np1 = 0;
-            }
-
-            /* logic SHOULD keep these all set correctly whatever the logic, but apparently it can't figure it out. */
-            chi_m1_0 = chi_p1_0 = chi_m2_0 = chi_p2_0 = chi_p1_m1 = chi_p2_m1 = chi_m1_p1 = chi_m2_p1 = 0;
-
-            if (n0 > 0)
-            {
-                chi_m1_0 = dfhist->accum_m[fep_state][nval] / n0;
-                chi_p1_0 = dfhist->accum_p[fep_state][nval] / n0;
-                chi_m2_0 = dfhist->accum_m2[fep_state][nval] / n0;
-                chi_p2_0 = dfhist->accum_p2[fep_state][nval] / n0;
+                numObservationsHigherState = dfhist->n_at_lam[fep_state + 1];
             }
 
-            if ((fep_state > 0) && (nm1 > 0))
-            {
-                chi_p1_m1 = dfhist->accum_p[fep_state - 1][nval] / nm1;
-                chi_p2_m1 = dfhist->accum_p2[fep_state - 1][nval] / nm1;
-            }
-
-            if ((fep_state < nlim - 1) && (np1 > 0))
-            {
-                chi_m1_p1 = dfhist->accum_m[fep_state + 1][nval] / np1;
-                chi_m2_p1 = dfhist->accum_m2[fep_state + 1][nval] / np1;
-            }
+            /* Calculate the biases for each expanded ensemble state that minimize the total
+             * variance, as implemented in Martinez-Veracoechea and Escobedo,
+             * J. Phys. Chem. B 2008, 112, 8120-8128
+             *
+             * The variance associated with the free energy estimate between two states i and j
+             * is calculated as
+             *     Var(i,j) = {avg[xi(i->j)^2] / avg[xi(i->j)]^2 - 1} / numObservations(i->j)
+             *              + {avg[xi(j->i)^2] / avg[xi(j->i)]^2 - 1} / numObservations(j->i)
+             * where xi(i->j) is the acceptance factor / weight associated with moving from state i to j
+             * As we are calculating the acceptance factor to the neighbors every time we're visiting
+             * a state, numObservations(i->j) == numObservations(i) and numObservations(j->i) == numObservations(j)
+             */
 
-            omega_m1_0    = 0;
-            omega_p1_0    = 0;
-            clam_weightsm = 0;
-            clam_weightsp = 0;
-            clam_varm     = 0;
-            clam_varp     = 0;
+            /* Accumulation of acceptance weight averages between the current state and the
+             * states +1 (p1) and -1 (m1), averaged at current state (0)
+             */
+            real avgAcceptanceCurrentToLower  = 0;
+            real avgAcceptanceCurrentToHigher = 0;
+            /* Accumulation of acceptance weight averages quantities between states 0
+             *  and states +1 and -1, squared
+             */
+            real avgAcceptanceCurrentToLowerSquared  = 0;
+            real avgAcceptanceCurrentToHigherSquared = 0;
+            /* Accumulation of free energy quantities from lower state (m1) to current state (0) and squared */
+            real avgAcceptanceLowerToCurrent        = 0;
+            real avgAcceptanceLowerToCurrentSquared = 0;
+            /* Accumulation of free energy quantities from upper state (p1) to current state (0) and squared */
+            real avgAcceptanceHigherToCurrent        = 0;
+            real avgAcceptanceHigherToCurrentSquared = 0;
+
+            if (numObservationsCurrentState > 0)
+            {
+                avgAcceptanceCurrentToLower = dfhist->accum_m[fep_state][nval] / numObservationsCurrentState;
+                avgAcceptanceCurrentToHigher =
+                        dfhist->accum_p[fep_state][nval] / numObservationsCurrentState;
+                avgAcceptanceCurrentToLowerSquared =
+                        dfhist->accum_m2[fep_state][nval] / numObservationsCurrentState;
+                avgAcceptanceCurrentToHigherSquared =
+                        dfhist->accum_p2[fep_state][nval] / numObservationsCurrentState;
+            }
+
+            if ((fep_state > 0) && (numObservationsLowerState > 0))
+            {
+                avgAcceptanceLowerToCurrent =
+                        dfhist->accum_p[fep_state - 1][nval] / numObservationsLowerState;
+                avgAcceptanceLowerToCurrentSquared =
+                        dfhist->accum_p2[fep_state - 1][nval] / numObservationsLowerState;
+            }
+
+            if ((fep_state < nlim - 1) && (numObservationsHigherState > 0))
+            {
+                avgAcceptanceHigherToCurrent =
+                        dfhist->accum_m[fep_state + 1][nval] / numObservationsHigherState;
+                avgAcceptanceHigherToCurrentSquared =
+                        dfhist->accum_m2[fep_state + 1][nval] / numObservationsHigherState;
+            }
+            /* These are accumulation of positive values (see definition of acceptance functions
+             * above), or of squares of positive values.
+             * We're taking this for granted in the following calculation, so make sure
+             * here that nothing weird happened. Although technically all values should be positive,
+             * because of floating point precisions, they might be numerically zero. */
+            GMX_RELEASE_ASSERT(
+                    avgAcceptanceCurrentToLower >= 0 && avgAcceptanceCurrentToLowerSquared >= 0
+                            && avgAcceptanceCurrentToHigher >= 0
+                            && avgAcceptanceCurrentToHigherSquared >= 0 && avgAcceptanceLowerToCurrent >= 0
+                            && avgAcceptanceLowerToCurrentSquared >= 0 && avgAcceptanceHigherToCurrent >= 0
+                            && avgAcceptanceHigherToCurrentSquared >= 0,
+                    "By definition, the acceptance factors should all be nonnegative.");
+
+            real varianceCurrentToLower   = 0;
+            real varianceCurrentToHigher  = 0;
+            real weightDifferenceToLower  = 0;
+            real weightDifferenceToHigher = 0;
+            real varianceToLower          = 0;
+            real varianceToHigher         = 0;
 
             if (fep_state > 0)
             {
-                if (n0 > 0)
+                if (numObservationsCurrentState > 0)
                 {
-                    omega_m1_0 = chi_m2_0 / (chi_m1_0 * chi_m1_0) - 1.0;
-                    if (nm1 > 0)
+                    /* Calculate {avg[xi(i->j)^2] / avg[xi(i->j)]^2 - 1}
+                     *
+                     * Note that if avg[xi(i->j)] == 0, also avg[xi(i->j)^2] == 0 (since the
+                     * acceptances are all positive!), and hence
+                     *     {avg[xi(i->j)^2] / avg[xi(i->j)]^2 - 1} -> 0  for  avg[xi(i->j)] -> 0
+                     * We're catching that case explicitly to avoid numerical
+                     * problems dividing by zero when the overlap between states is small (#3304)
+                     */
+                    if (avgAcceptanceCurrentToLower > 0)
                     {
-                        real omega_p1_m1 = chi_p2_m1 / (chi_p1_m1 * chi_p1_m1) - 1.0;
-                        clam_weightsm    = (std::log(chi_m1_0) - std::log(chi_p1_m1)) + cnval;
-                        clam_varm        = (1.0 / n0) * (omega_m1_0) + (1.0 / nm1) * (omega_p1_m1);
+                        varianceCurrentToLower =
+                                avgAcceptanceCurrentToLowerSquared
+                                        / (avgAcceptanceCurrentToLower * avgAcceptanceCurrentToLower)
+                                - 1.0;
+                    }
+                    if (numObservationsLowerState > 0)
+                    {
+                        /* Calculate {avg[xi(i->j)^2] / avg[xi(i->j)]^2 - 1}
+                         *
+                         * Note that if avg[xi(i->j)] == 0, also avg[xi(i->j)^2] == 0 (since the
+                         * acceptances are all positive!), and hence
+                         *     {avg[xi(i->j)^2] / avg[xi(i->j)]^2 - 1} -> 0  for  avg[xi(i->j)] -> 0
+                         * We're catching that case explicitly to avoid numerical
+                         * problems dividing by zero when the overlap between states is small (#3304)
+                         */
+                        real varianceLowerToCurrent = 0;
+                        if (avgAcceptanceLowerToCurrent > 0)
+                        {
+                            varianceLowerToCurrent =
+                                    avgAcceptanceLowerToCurrentSquared
+                                            / (avgAcceptanceLowerToCurrent * avgAcceptanceLowerToCurrent)
+                                    - 1.0;
+                        }
+                        /* Free energy difference to the state one state lower */
+                        /* if these either of these quantities are zero, the energies are */
+                        /* way too large for the dynamic range.  We need an alternate guesstimate */
+                        if ((avgAcceptanceCurrentToLower == 0) || (avgAcceptanceLowerToCurrent == 0))
+                        {
+                            weightDifferenceToLower =
+                                    (scaled_lamee[fep_state] - scaled_lamee[fep_state - 1]);
+                        }
+                        else
+                        {
+                            weightDifferenceToLower = (std::log(avgAcceptanceCurrentToLower)
+                                                       - std::log(avgAcceptanceLowerToCurrent))
+                                                      + cnval;
+                        }
+                        /* Variance of the free energy difference to the one state lower */
+                        varianceToLower =
+                                (1.0 / numObservationsCurrentState) * (varianceCurrentToLower)
+                                + (1.0 / numObservationsLowerState) * (varianceLowerToCurrent);
                     }
                 }
             }
 
             if (fep_state < nlim - 1)
             {
-                if (n0 > 0)
+                if (numObservationsCurrentState > 0)
                 {
-                    omega_p1_0 = chi_p2_0 / (chi_p1_0 * chi_p1_0) - 1.0;
-                    if (np1 > 0)
+                    /* Calculate {avg[xi(i->j)^2] / avg[xi(i->j)]^2 - 1}
+                     *
+                     * Note that if avg[xi(i->j)] == 0, also avg[xi(i->j)^2] == 0 (since the
+                     * acceptances are all positive!), and hence
+                     *     {avg[xi(i->j)^2] / avg[xi(i->j)]^2 - 1} -> 0  for  avg[xi(i->j)] -> 0
+                     * We're catching that case explicitly to avoid numerical
+                     * problems dividing by zero when the overlap between states is small (#3304)
+                     */
+
+                    if (avgAcceptanceCurrentToHigher < 0)
+                    {
+                        varianceCurrentToHigher =
+                                avgAcceptanceCurrentToHigherSquared
+                                        / (avgAcceptanceCurrentToHigher * avgAcceptanceCurrentToHigher)
+                                - 1.0;
+                    }
+                    if (numObservationsHigherState > 0)
                     {
-                        real omega_m1_p1 = chi_m2_p1 / (chi_m1_p1 * chi_m1_p1) - 1.0;
-                        clam_weightsp    = (std::log(chi_m1_p1) - std::log(chi_p1_0)) + cnval;
-                        clam_varp        = (1.0 / np1) * (omega_m1_p1) + (1.0 / n0) * (omega_p1_0);
+                        /* Calculate {avg[xi(i->j)^2] / avg[xi(i->j)]^2 - 1}
+                         *
+                         * Note that if avg[xi(i->j)] == 0, also avg[xi(i->j)^2] == 0 (since the
+                         * acceptances are all positive!), and hence
+                         *     {avg[xi(i->j)^2] / avg[xi(i->j)]^2 - 1} -> 0  for  avg[xi(i->j)] -> 0
+                         * We're catching that case explicitly to avoid numerical
+                         * problems dividing by zero when the overlap between states is small (#3304)
+                         */
+                        real varianceHigherToCurrent = 0;
+                        if (avgAcceptanceHigherToCurrent > 0)
+                        {
+                            varianceHigherToCurrent =
+                                    avgAcceptanceHigherToCurrentSquared
+                                            / (avgAcceptanceHigherToCurrent * avgAcceptanceHigherToCurrent)
+                                    - 1.0;
+                        }
+                        /* Free energy difference to the state one state higher */
+                        /* if these either of these quantities are zero, the energies are */
+                        /* way too large for the dynamic range.  We need an alternate guesstimate */
+                        if ((avgAcceptanceHigherToCurrent == 0) || (avgAcceptanceCurrentToHigher == 0))
+                        {
+                            weightDifferenceToHigher =
+                                    (scaled_lamee[fep_state + 1] - scaled_lamee[fep_state]);
+                        }
+                        else
+                        {
+                            weightDifferenceToHigher = (std::log(avgAcceptanceHigherToCurrent)
+                                                        - std::log(avgAcceptanceCurrentToHigher))
+                                                       + cnval;
+                        }
+                        /* Variance of the free energy difference to the one state higher */
+                        varianceToHigher =
+                                (1.0 / numObservationsHigherState) * (varianceHigherToCurrent)
+                                + (1.0 / numObservationsCurrentState) * (varianceCurrentToHigher);
                     }
                 }
             }
 
-            if (n0 > 0)
+            if (numObservationsCurrentState > 0)
             {
-                omegam_array[nval] = omega_m1_0;
+                omegam_array[nval] = varianceCurrentToLower;
             }
             else
             {
                 omegam_array[nval] = 0;
             }
-            weightsm_array[nval] = clam_weightsm;
-            varm_array[nval]     = clam_varm;
-            if (nm1 > 0)
+            weightsm_array[nval] = weightDifferenceToLower;
+            varm_array[nval]     = varianceToLower;
+            if (numObservationsLowerState > 0)
             {
-                dwm_array[nval] = fabs((cnval + std::log((1.0 * n0) / nm1)) - lam_dg[fep_state - 1]);
+                dwm_array[nval] =
+                        fabs((cnval + std::log((1.0 * numObservationsCurrentState) / numObservationsLowerState))
+                             - lam_dg[fep_state - 1]);
             }
             else
             {
                 dwm_array[nval] = std::fabs(cnval - lam_dg[fep_state - 1]);
             }
 
-            if (n0 > 0)
+            if (numObservationsCurrentState > 0)
             {
-                omegap_array[nval] = omega_p1_0;
+                omegap_array[nval] = varianceCurrentToHigher;
             }
             else
             {
                 omegap_array[nval] = 0;
             }
-            weightsp_array[nval] = clam_weightsp;
-            varp_array[nval]     = clam_varp;
-            if ((np1 > 0) && (n0 > 0))
+            weightsp_array[nval] = weightDifferenceToHigher;
+            varp_array[nval]     = varianceToHigher;
+            if ((numObservationsHigherState > 0) && (numObservationsCurrentState > 0))
             {
-                dwp_array[nval] = fabs((cnval + std::log((1.0 * np1) / n0)) - lam_dg[fep_state]);
+                dwp_array[nval] =
+                        fabs((cnval + std::log((1.0 * numObservationsHigherState) / numObservationsCurrentState))
+                             - lam_dg[fep_state]);
             }
             else
             {
@@ -620,7 +755,7 @@ static gmx_bool UpdateWeights(int           nlim,
             }
         }
 
-        /* find the C's closest to the old weights value */
+        /* find the free energy estimate closest to the guessed weight's value */
 
         min_nvalm     = FindMinimum(dwm_array, maxc);
         omega_m1_0    = omegam_array[min_nvalm];
@@ -654,7 +789,9 @@ static gmx_bool UpdateWeights(int           nlim,
         if (expand->elamstats == elamstatsMINVAR)
         {
             bSufficientSamples = TRUE;
-            /* make sure they are all past a threshold */
+            /* make sure the number of samples in each state are all
+             * past a user-specified threshold
+             */
             for (i = 0; i < nlim; i++)
             {
                 if (dfhist->n_at_lam[i] < expand->minvarmin)
@@ -967,11 +1104,10 @@ static int ChooseNewLambda(int               nlim,
             de = weighted_lamee[lamtrial] - weighted_lamee[fep_state];
             if (expand->elmcmove == elmcmoveMETROPOLIS)
             {
-                tprob     = 1.0;
-                trialprob = std::exp(de);
-                if (trialprob < tprob)
+                tprob = 1.0;
+                if (de < 0)
                 {
-                    tprob = trialprob;
+                    tprob = std::exp(de);
                 }
                 propose[fep_state] = 0;
                 propose[lamtrial]  = 1.0; /* note that this overwrites the above line if fep_state = ntrial, which only occurs at the ends */
@@ -981,8 +1117,14 @@ static int ChooseNewLambda(int               nlim,
             }
             else if (expand->elmcmove == elmcmoveBARKER)
             {
-                tprob = 1.0 / (1.0 + std::exp(-de));
-
+                if (de > 0) /* Numerically stable version */
+                {
+                    tprob = 1.0 / (1.0 + std::exp(-de));
+                }
+                else if (de < 0)
+                {
+                    tprob = std::exp(de) / (std::exp(de) + 1.0);
+                }
                 propose[fep_state] = (1 - tprob);
                 propose[lamtrial] +=
                         tprob; /* we add, to account for the fact that at the end, they might be the same point */
diff --git a/src/gromacs/mdlib/expanded_internal.cpp b/src/gromacs/mdlib/expanded_internal.cpp
new file mode 100644 (file)
index 0000000..a46f02e
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and 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 internal functionality for expanded ensemble
+ *
+ * \author Pascal Merz <pascal.merz@me.com>
+ * \author Michael Shirts <michael.shirts@colorado.edu>
+ * \ingroup module_mdlib
+ */
+#include "gmxpre.h"
+
+#include "expanded_internal.h"
+
+#include <cmath>
+
+#include "gromacs/mdtypes/md_enums.h"
+#include "gromacs/utility/exceptions.h"
+
+namespace gmx
+{
+real calculateAcceptanceWeight(int calculationMode, real lambdaEnergyDifference)
+{
+    if (calculationMode == elamstatsBARKER || calculationMode == elamstatsMINVAR)
+    {
+        /* Barker acceptance rule forumula is used for accumulation of probability for
+         * both the Barker variant of the weight accumulation algorithm and the
+         * minimum variance variant of the weight accumulation algorithm.
+         *
+         * Barker acceptance rule for a jump from state i -> j is defined as
+         *     exp(-E_i)/exp(-Ei)+exp(-Ej) =   1 / (1 + exp(dE_ij))
+         * where dE_ij is the potential energy difference between the two states
+         * plus a constant offset that can be removed at the end for numerical stability.
+         *     dE_ij = FE_j - FE_i + offset
+         * Numerically, this computation can be unstable if dE gets large. (See #3304)
+         * To avoid numerical instability, we're calculating it as
+         *     1 / (1 + exp(dE_ij))             (if dE < 0)
+         *     exp(-dE_ij) / (exp(-dE_ij) + 1)  (if dE > 0)
+         */
+        if (lambdaEnergyDifference < 0)
+        {
+            return 1.0 / (1.0 + std::exp(lambdaEnergyDifference));
+        }
+        else
+        {
+            return std::exp(-lambdaEnergyDifference) / (1.0 + std::exp(-lambdaEnergyDifference));
+        }
+    }
+    else if (calculationMode == elamstatsMETROPOLIS)
+    {
+        /* Metropolis acceptance rule for a jump from state i -> j is defined as
+         *     1            (if dE_ij < 0)
+         *     exp(-dE_ij)  (if dE_ij >= 0)
+         * where dE_ij is the potential energy difference between the two states
+         * plus a free energy offset that can be subtracted off later:
+         *     dE_ij = FE_j - FE_i + offset
+         */
+        if (lambdaEnergyDifference < 0)
+        {
+            return 1.0;
+        }
+        else
+        {
+            return std::exp(-lambdaEnergyDifference);
+        }
+    }
+
+    GMX_THROW(NotImplementedError("Unknown acceptance calculation mode"));
+}
+
+} // namespace gmx
similarity index 65%
rename from api/nblib/samples/tests/samples.cpp
rename to src/gromacs/mdlib/expanded_internal.h
index cdb289d23eb27e41695dba222781c346b23bdb3a..be3c7c81f0ecb63896d41e089e992dbf482932e9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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.
  */
 /*! \internal \file
- * \brief
- * This tests that sample code can run
+ * \brief Declares internal functionality for expanded ensemble
  *
- * \author Victor Holanda <victor.holanda@cscs.ch>
- * \author Joe Jordan <ejjordan@kth.se>
- * \author Prashanth Kanduri <kanduri@cscs.ch>
- * \author Sebastian Keller <keller@cscs.ch>
+ * This file is only used by expanded.cpp and tests/expanded.cpp.
+ *
+ * \author Pascal Merz <pascal.merz@me.com>
+ * \author Michael Shirts <michael.shirts@colorado.edu>
+ * \ingroup module_mdlib
  */
-#include "gmxpre.h"
+#ifndef GMX_MDLIB_EXPANDEDINTERNAL_H
+#define GMX_MDLIB_EXPANDEDINTERNAL_H
 
-#include "testutils/refdata.h"
-#include "testutils/testasserts.h"
+#include "gromacs/utility/real.h"
 
-//! Google Test defines a main function so we rename the main function of the sample scripts
-#define main ArgonSampleMain
-#include "nblib/samples/argon-forces-integration.cpp"
-TEST(NBlibTest, ArgonSampleDoesNotThrow)
+namespace gmx
 {
-    EXPECT_NO_FATAL_FAILURE(main());
-}
-#undef main
+/*! \brief Calculates the acceptance weight for a lambda state transition
+ *
+ * \param[in] calculationMode  How the lambda weights are calculated
+ * \param[in] lambdaEnergyDifference  The difference in energy between the two states
+ * \return  The acceptance weight
+ */
+real calculateAcceptanceWeight(int calculationMode, real lambdaEnergyDifference);
+} // namespace gmx
+
+#endif // GMX_MDLIB_EXPANDEDINTERNAL_H
index ef2bb647a211f60611895a3e38da20aef7a09a1d..96e4760622302a47ffec0d8ba8f5617da0387204 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2014,2016,2017,2018,2019,2020, by the GROMACS development team, led by
+# Copyright (c) 2014,2016,2017,2018,2019,2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -41,6 +41,7 @@ gmx_add_unit_test(MdlibUnitTest mdlib-test HARDWARE_DETECTION
         ebin.cpp
        energydrifttracker.cpp
         energyoutput.cpp
+        expanded.cpp
         freeenergyparameters.cpp
         leapfrog.cpp
         leapfrogtestdata.cpp
diff --git a/src/gromacs/mdlib/tests/expanded.cpp b/src/gromacs/mdlib/tests/expanded.cpp
new file mode 100644 (file)
index 0000000..887a791
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and 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 expanded ensemble
+ *
+ * This file contains unit tests for functions used by the expanded
+ * ensemble.
+ *
+ * \todo Add more tests as the expanded ensemble implementation
+ *       gets more modular (#3848).
+ *
+ * \author Pascal Merz <pascal.merz@me.com>
+ * \author Michael Shirts <michael.shirts@colorado.edu>
+ * \ingroup module_mdlib
+ */
+#include "gmxpre.h"
+
+#include <cmath>
+
+#include <gtest/gtest.h>
+
+#include "gromacs/mdlib/expanded_internal.h"
+#include "gromacs/mdtypes/md_enums.h"
+
+#include "testutils/testasserts.h"
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+
+//! Test fixture accepting a value to pass into calculateAcceptanceWeight
+class CalculateAcceptanceWeightSimple : public ::testing::Test, public ::testing::WithParamInterface<real>
+{
+};
+// Check that unimplemented calculation modes throw
+TEST_P(CalculateAcceptanceWeightSimple, UnknownCalculationModeThrows)
+{
+    for (auto calculationMode = 0; calculationMode < elamstatsNR; ++calculationMode)
+    {
+        if (calculationMode != elamstatsBARKER && calculationMode != elamstatsMINVAR
+            && calculationMode != elamstatsMETROPOLIS)
+        {
+            EXPECT_THROW_GMX(calculateAcceptanceWeight(calculationMode, GetParam()), NotImplementedError);
+        }
+    }
+}
+// Check that implemented calculation modes don't throw
+TEST_P(CalculateAcceptanceWeightSimple, KnownCalculationModeDoesNotThrow)
+{
+    EXPECT_NO_THROW(calculateAcceptanceWeight(elamstatsMETROPOLIS, GetParam()));
+    EXPECT_NO_THROW(calculateAcceptanceWeight(elamstatsBARKER, GetParam()));
+    EXPECT_NO_THROW(calculateAcceptanceWeight(elamstatsMINVAR, GetParam()));
+}
+// Barker and MinVar are expected to be equal
+TEST_P(CalculateAcceptanceWeightSimple, BarkerAndMinVarAreIdentical)
+{
+    EXPECT_EQ(calculateAcceptanceWeight(elamstatsBARKER, GetParam()),
+              calculateAcceptanceWeight(elamstatsMINVAR, GetParam()));
+}
+
+/*! \brief Test fixture accepting a calculation mode and an input value for
+ *         calculateAcceptanceWeight as well as the expected output value
+ */
+using RegressionTuple = std::tuple<int, real, real>;
+class CalculateAcceptanceWeightRangeRegression :
+    public ::testing::Test,
+    public ::testing::WithParamInterface<RegressionTuple>
+{
+};
+// Check that output is as expected
+TEST_P(CalculateAcceptanceWeightRangeRegression, ValuesMatch)
+{
+    const auto calculationMode = std::get<0>(GetParam());
+    const auto inputValue      = std::get<1>(GetParam());
+    const auto expectedOutput  = std::get<2>(GetParam());
+
+    EXPECT_REAL_EQ(expectedOutput, calculateAcceptanceWeight(calculationMode, inputValue));
+}
+
+INSTANTIATE_TEST_CASE_P(
+        SimpleTests,
+        CalculateAcceptanceWeightSimple,
+        ::testing::Values(1., -1., 0., GMX_REAL_NEGZERO, GMX_REAL_EPS, -GMX_REAL_EPS, GMX_REAL_MAX, -GMX_REAL_MAX));
+INSTANTIATE_TEST_CASE_P(
+        RegressionTests,
+        CalculateAcceptanceWeightRangeRegression,
+        ::testing::Values(RegressionTuple{ elamstatsMETROPOLIS, 0.0, 1.0 },
+                          RegressionTuple{ elamstatsMETROPOLIS, GMX_REAL_NEGZERO, 1.0 },
+                          RegressionTuple{ elamstatsMETROPOLIS, GMX_REAL_EPS, 1.0 },
+                          RegressionTuple{ elamstatsMETROPOLIS, -1.0, 1.0 },
+                          RegressionTuple{ elamstatsMETROPOLIS, -GMX_REAL_MAX, 1.0 },
+                          RegressionTuple{ elamstatsMETROPOLIS, 1.0, std::exp(-1.0) },
+                          RegressionTuple{ elamstatsMETROPOLIS, GMX_REAL_MAX, 0.0 },
+                          RegressionTuple{ elamstatsBARKER, 0.0, 0.5 },
+                          RegressionTuple{ elamstatsBARKER, GMX_REAL_NEGZERO, 0.5 },
+                          RegressionTuple{ elamstatsBARKER, GMX_REAL_EPS, 0.5 },
+                          RegressionTuple{ elamstatsBARKER, -1.0, 1.0 / (1.0 + std::exp(-1.0)) },
+                          RegressionTuple{ elamstatsBARKER, -GMX_REAL_MAX, 1.0 },
+                          RegressionTuple{ elamstatsBARKER, 1.0, 1.0 / (1.0 + std::exp(1.0)) },
+                          RegressionTuple{ elamstatsBARKER, GMX_REAL_MAX, 0.0 }));
+
+} // namespace
+} // namespace test
+} // namespace gmx
index 05b6a4f3bede7a2412e35313c645d4c333769dc0..68db1fbfd7316e0b435bcc0c19ad503c82f6ef39 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2015,2016,2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2015,2016,2017,2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -120,15 +120,16 @@ gmx_bool exist_output_file(const char* fnm_cp, int nfile, const t_filenm fnm[])
 {
     StringOutputStream stream;
     TextWriter         writer(&stream);
-    writer.writeStringFormatted(
+    writer.writeLineFormatted(
             "Some output files listed in the checkpoint file %s are not present or not named "
             "as the output files by the current program:)",
             checkpointFilename);
-    auto settings  = writer.wrapperSettings();
-    auto oldIndent = settings.indent(), newIndent = 2;
+    auto& settings  = writer.wrapperSettings();
+    auto  oldIndent = settings.indent(), newIndent = 2;
 
     writer.writeLine("Expected output files that are present:");
     settings.setIndent(newIndent);
+    settings.setLineLength(78);
     for (const auto& outputfile : outputfiles)
     {
         if (exist_output_file(outputfile.filename, nfile, fnm))
@@ -139,6 +140,15 @@ gmx_bool exist_output_file(const char* fnm_cp, int nfile, const t_filenm fnm[])
     settings.setIndent(oldIndent);
     writer.ensureEmptyLine();
 
+    // The implementation of -deffnm does not handle properly the
+    // naming of output files that share a common suffix, such as
+    // pullx.xvg and pullf.xvg from the pull module. Such output files
+    // will be sought by the wrong name by the code that handles the
+    // restart, even though the pull module would later work out what
+    // they should have been called. Since there is a straightforward
+    // way to work around that, we help the user with that. This can
+    // be removed when gitlab issue #3875 is resolved.
+    bool missingFilesIncludedPullOutputFiles = false;
     writer.writeLine("Expected output files that are not present or named differently:");
     settings.setIndent(newIndent);
     for (const auto& outputfile : outputfiles)
@@ -146,16 +156,38 @@ gmx_bool exist_output_file(const char* fnm_cp, int nfile, const t_filenm fnm[])
         if (!exist_output_file(outputfile.filename, nfile, fnm))
         {
             writer.writeLine(outputfile.filename);
+            // If this was a pull file, then we have a known issue and
+            // work-around (See gitlab issue #3442).
+            if (!missingFilesIncludedPullOutputFiles
+                && (contains(outputfile.filename, "pullx")
+                    || contains(outputfile.filename, "pullf")))
+            {
+                missingFilesIncludedPullOutputFiles = true;
+            }
         }
     }
+    if (missingFilesIncludedPullOutputFiles)
+    {
+        writer.ensureEmptyLine();
+        writer.writeLineFormatted(
+                "It appears that pull output files were not found. It is known that "
+                "using gmx mdrun -deffnm test with pulling and later "
+                "gmx mdrun -deffnm test -cpi will fail to consider the changed default "
+                "filename when checking the pull output files for restarting with "
+                "appending. You may be able to work around this by using a command like "
+                "gmx mdrun -deffnm test -px test_pullx -pf test_pullf -cpi.");
+    }
     settings.setIndent(oldIndent);
 
+    writer.ensureEmptyLine();
     writer.writeLineFormatted(
-            R"(To keep your simulation files safe, this simulation will not restart. Either name your
-output files exactly the same as the previous simulation part (e.g. with -deffnm), or
-make sure all the output files are present (e.g. run from the same directory as the
-previous simulation part), or instruct mdrun to write new output files with mdrun -noappend.
-In the last case, you will not be able to use appending in future for this simulation.)",
+            "To keep your simulation files safe, this simulation will not restart. "
+            "Either name your output files exactly the same as the previous simulation "
+            "part (e.g. with -deffnm or explicit naming), or make sure all the output "
+            "files are present (e.g. run from the same directory as the previous simulation "
+            "part), or instruct mdrun to write new output files with mdrun -noappend. In "
+            "the last case, you will not be able to use appending in future for this "
+            "simulation.",
             numFilesMissing,
             outputfiles.size());
     GMX_THROW(InconsistentInputError(stream.toString()));
index b8804d469b13d49a660cf184bc29ea19b45ddbfd..45edd4352efb54e96344a9d931a5946a57db9398 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -46,6 +46,7 @@
 
 #include "gromacs/mdlib/stat.h"
 #include "gromacs/mdlib/stophandler.h"
+#include "gromacs/mdrunutility/handlerestart.h"
 
 #include "modularsimulatorinterfaces.h"
 
@@ -122,11 +123,11 @@ std::optional<SignallerCallback> LastStepSignaller::registerNSCallback()
 LoggingSignaller::LoggingSignaller(std::vector<SignallerCallback> callbacks,
                                    Step                           nstlog,
                                    Step                           initStep,
-                                   Time                           initTime) :
+                                   StartingBehavior               startingBehavior) :
     callbacks_(std::move(callbacks)),
     nstlog_(nstlog),
     initStep_(initStep),
-    initTime_(initTime),
+    startingBehavior_(startingBehavior),
     lastStep_(-1),
     lastStepRegistrationDone_(false)
 {
@@ -134,7 +135,8 @@ LoggingSignaller::LoggingSignaller(std::vector<SignallerCallback> callbacks,
 
 void LoggingSignaller::signal(Step step, Time time)
 {
-    if (do_per_step(step, nstlog_) || step == lastStep_)
+    if (do_per_step(step, nstlog_) || step == lastStep_
+        || (step == initStep_ && startingBehavior_ == StartingBehavior::NewSimulation))
     {
         runAllCallbacks(callbacks_, step, time);
     }
index 8c8769e4a4b53760d71c549f00076d6318605370..cd2bb66391927bd78f05bc3870929512176fd802 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -54,6 +54,7 @@ namespace gmx
 {
 class StopHandler;
 class TrajectoryElement;
+enum class StartingBehavior;
 
 /*! \internal
  * \ingroup module_modularsimulator
@@ -228,12 +229,15 @@ public:
 private:
     /*! \brief Constructor
      *
-     * \param callbacks  A vector of pointers to callbacks
-     * \param nstlog     The logging frequency
-     * \param initStep   The first step of the simulation
-     * \param initTime   The start time of the simulation
+     * \param callbacks         A vector of pointers to callbacks
+     * \param nstlog            The logging frequency
+     * \param initStep          The first step of the simulation
+     * \param startingBehavior  Whether this is a new simulation or restarting from checkpoint
      */
-    LoggingSignaller(std::vector<SignallerCallback> callbacks, Step nstlog, Step initStep, Time initTime);
+    LoggingSignaller(std::vector<SignallerCallback> callbacks,
+                     Step                           nstlog,
+                     Step                           initStep,
+                     StartingBehavior               startingBehavior);
 
     //! Client callbacks
     std::vector<SignallerCallback> callbacks_;
@@ -242,8 +246,8 @@ private:
     const Step nstlog_;
     //! The initial step of the simulation
     const Step initStep_;
-    //! The initial time of the simulation
-    const Time initTime_;
+    //! How we are starting the simulation
+    const StartingBehavior startingBehavior_;
 
     //! ILastStepSignallerClient implementation
     std::optional<SignallerCallback> registerLastStepCallback() override;
index fc2de3a609c4f5f9cc08339cd7d97213cc5a9d69..d1e8cb5207cec9ab795767fc4c0be87d81ac81ee 100644 (file)
@@ -648,7 +648,8 @@ ModularSimulatorAlgorithm ModularSimulatorAlgorithmBuilder::build()
                                                        trajectoryElement->tngBoxOutCompressed(),
                                                        trajectoryElement->tngLambdaOutCompressed(),
                                                        inputrec->nstenergy));
-        addSignaller(loggingSignallerBuilder_.build(inputrec->nstlog, inputrec->init_step, inputrec->init_t));
+        addSignaller(loggingSignallerBuilder_.build(
+                inputrec->nstlog, inputrec->init_step, legacySimulatorData_->startingBehavior));
         addSignaller(lastStepSignallerBuilder_.build(
                 inputrec->nsteps, inputrec->init_step, algorithm.stopHandler_.get()));
         addSignaller(neighborSearchSignallerBuilder_.build(
index 584c84dc835dac0136070363bec5782a412ad9da..5fa2e00eec6066ff9b1eb86ab5ec53b5498fdc1d 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team.
- * Copyright (c) 2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -138,7 +138,7 @@ static void init_nbparam(NBParamGpu*                     nbp,
      * but gives only 1% speed-up.
      */
     nbp->vdwType  = nbnxmGpuPickVdwKernelType(ic, nbatParams.comb_rule);
-    nbp->elecType = nbnxmGpuPickElectrostaticsKernelType(ic);
+    nbp->elecType = nbnxmGpuPickElectrostaticsKernelType(ic, deviceContext.deviceInfo());
 
     /* generate table for PME */
     nbp->coulomb_tab = nullptr;
index 763482badd75de8702c62632fde035a5c74964ef..1bcc676879c2f66ca2b16e2bbb35e21a256ba2ac 100644 (file)
@@ -2,6 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2014,2015,2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -128,7 +129,8 @@ bool gpu_is_kernel_ewald_analytical(const NbnxmGpu gmx_unused* nb) GPU_FUNC_TERM
 
 /** Return the enum value of electrostatics kernel type for given interaction parameters \p ic. */
 GPU_FUNC_QUALIFIER
-enum ElecType nbnxmGpuPickElectrostaticsKernelType(const interaction_const_t gmx_unused* ic)
+enum ElecType nbnxmGpuPickElectrostaticsKernelType(const interaction_const_t gmx_unused* ic,
+                                                   const DeviceInformation gmx_unused& deviceInfo)
         GPU_FUNC_TERM_WITH_RETURN(ElecType::Count);
 
 /** Return the enum value of VdW kernel type for given \p ic and \p combRule. */
index ad7c2c8017ea3dc28684d0762ba3ede1ca5e46ef..ba869da29a8611ea7d6ad6e7203bbbea96d0467c 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team.
- * Copyright (c) 2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -58,6 +58,7 @@
 
 #include "nbnxm_gpu_data_mgmt.h"
 
+#include "gromacs/hardware/device_information.h"
 #include "gromacs/mdtypes/interaction_const.h"
 #include "gromacs/nbnxm/gpu_data_mgmt.h"
 #include "gromacs/timing/gpu_timing.h"
@@ -97,7 +98,8 @@ void inline printEnvironmentVariableDeprecationMessage(bool               isEnvi
     }
 }
 
-enum ElecType nbnxn_gpu_pick_ewald_kernel_type(const interaction_const_t& ic)
+enum ElecType nbnxn_gpu_pick_ewald_kernel_type(const interaction_const_t& ic,
+                                               const DeviceInformation gmx_unused& deviceInfo)
 {
     bool bTwinCut = (ic.rcoulomb != ic.rvdw);
 
@@ -130,13 +132,19 @@ enum ElecType nbnxn_gpu_pick_ewald_kernel_type(const interaction_const_t& ic)
                 "requested through environment variables.");
     }
 
-    /* By default, use analytical Ewald
-     * TODO: tabulated does not work in OpenCL, it needs fixing, see init_nbparam() in nbnxn_ocl_data_mgmt.cpp
-     *
+    /* By default, use analytical Ewald except with CUDA on NVIDIA CC 7.0 and 8.0.
      */
-    bool bUseAnalyticalEwald = true;
+    const bool c_useTabulatedEwaldDefault =
+#if GMX_GPU_CUDA
+            (deviceInfo.prop.major == 7 && deviceInfo.prop.minor == 0)
+            || (deviceInfo.prop.major == 8 && deviceInfo.prop.minor == 0);
+#else
+            false;
+#endif
+    bool bUseAnalyticalEwald = !c_useTabulatedEwaldDefault;
     if (forceAnalyticalEwald)
     {
+        bUseAnalyticalEwald = true;
         if (debug)
         {
             fprintf(debug, "Using analytical Ewald GPU kernels\n");
@@ -197,7 +205,7 @@ void gpu_pme_loadbal_update_param(const nonbonded_verlet_t* nbv, const interacti
 
     set_cutoff_parameters(nbp, ic, nbv->pairlistSets().params());
 
-    nbp->elecType = nbnxn_gpu_pick_ewald_kernel_type(*ic);
+    nbp->elecType = nbnxn_gpu_pick_ewald_kernel_type(*ic, nb->deviceContext_->deviceInfo());
 
     GMX_RELEASE_ASSERT(ic->coulombEwaldTables, "Need valid Coulomb Ewald correction tables");
     init_ewald_coulomb_force_table(*ic->coulombEwaldTables, nbp, *nb->deviceContext_);
@@ -352,7 +360,8 @@ bool gpu_is_kernel_ewald_analytical(const NbnxmGpu* nb)
             || (nb->nbparam->elecType == ElecType::EwaldAnaTwin));
 }
 
-enum ElecType nbnxmGpuPickElectrostaticsKernelType(const interaction_const_t* ic)
+enum ElecType nbnxmGpuPickElectrostaticsKernelType(const interaction_const_t* ic,
+                                                   const DeviceInformation&   deviceInfo)
 {
     if (ic->eeltype == eelCUT)
     {
@@ -364,7 +373,7 @@ enum ElecType nbnxmGpuPickElectrostaticsKernelType(const interaction_const_t* ic
     }
     else if ((EEL_PME(ic->eeltype) || ic->eeltype == eelEWALD))
     {
-        return nbnxn_gpu_pick_ewald_kernel_type(*ic);
+        return nbnxn_gpu_pick_ewald_kernel_type(*ic, deviceInfo);
     }
     else
     {
index e0e65e562b886157dee6738d27da0672f279b68b..36efd356b9ce45d7dd0e15822c50acb28c25c971 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2012,2013,2014,2015,2017 by the GROMACS development team.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -68,7 +68,8 @@ void init_ewald_coulomb_force_table(const EwaldCorrectionTables& tables,
                                     const DeviceContext&         deviceContext);
 
 /*! \brief Selects the Ewald kernel type, analytical or tabulated, single or twin cut-off. */
-enum ElecType nbnxn_gpu_pick_ewald_kernel_type(const interaction_const_t gmx_unused& ic);
+enum ElecType nbnxn_gpu_pick_ewald_kernel_type(const interaction_const_t gmx_unused& ic,
+                                               const DeviceInformation&              deviceInfo);
 
 /*! \brief Copies all parameters related to the cut-off from ic to nbp
  */
index f37dfbe582a61db82845f8323bb25514d4cf8daf..290d5f669a675b8e9b5ead2c4851f2bd2412879c 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team.
- * Copyright (c) 2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -136,7 +136,7 @@ static void init_nbparam(NBParamGpu*                     nbp,
     set_cutoff_parameters(nbp, ic, listParams);
 
     nbp->vdwType  = nbnxmGpuPickVdwKernelType(ic, nbatParams.comb_rule);
-    nbp->elecType = nbnxmGpuPickElectrostaticsKernelType(ic);
+    nbp->elecType = nbnxmGpuPickElectrostaticsKernelType(ic, deviceContext.deviceInfo());
 
     if (ic->vdwtype == evdwPME)
     {
index 15eaee5503e9578049bbfad7fc7be98c957ab36b..bb7bb49410625c231a8bdbd7309423eccafd5916 100644 (file)
@@ -4,7 +4,7 @@
  * 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.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -449,13 +449,25 @@ real max_pull_distance2(const pull_coord_work_t* pcrd, const t_pbc* pbc)
 
 /* This function returns the distance based on coordinates xg and xref.
  * Note that the pull coordinate struct pcrd is not modified.
+ *
+ * \param[in]  pull  The pull struct
+ * \param[in]  pcrd  The pull coordinate to compute a distance for
+ * \param[in]  pbc   The periodic boundary conditions
+ * \param[in]  xg    The coordinate of group 1
+ * \param[in]  xref  The coordinate of group 0
+ * \param[in]  groupIndex0  The index of group 0 in the pcrd->params.group
+ * \param[in]  groupIndex1  The index of group 1 in the pcrd->params.group
+ * \param[in]  max_dist2    The maximum distance squared
+ * \param[out] dr           The distance vector
  */
 static void low_get_pull_coord_dr(const struct pull_t*     pull,
                                   const pull_coord_work_t* pcrd,
                                   const t_pbc*             pbc,
-                                  dvec                     xg,
+                                  const dvec               xg,
                                   dvec                     xref,
-                                  double                   max_dist2,
+                                  const int                groupIndex0,
+                                  const int                groupIndex1,
+                                  const double             max_dist2,
                                   dvec                     dr)
 {
     const pull_group_work_t* pgrp0 = &pull->group[pcrd->params.group[0]];
@@ -506,8 +518,8 @@ static void low_get_pull_coord_dr(const struct pull_t*     pull,
         gmx_fatal(FARGS,
                   "Distance between pull groups %d and %d (%f nm) is larger than 0.49 times the "
                   "box size (%f).\n%s",
-                  pcrd->params.group[0],
-                  pcrd->params.group[1],
+                  pcrd->params.group[groupIndex0],
+                  pcrd->params.group[groupIndex1],
                   sqrt(dr2),
                   sqrt(0.98 * 0.98 * max_dist2),
                   pcrd->params.eGeom == epullgDIR
@@ -586,6 +598,8 @@ static void get_pull_coord_dr(struct pull_t* pull, int coord_ind, const t_pbc* p
                           pbc,
                           pgrp1->x,
                           pcrd->params.eGeom == epullgCYL ? pull->dyna[coord_ind].x : pgrp0->x,
+                          0,
+                          1,
                           md2,
                           spatialData.dr01);
 
@@ -595,7 +609,7 @@ static void get_pull_coord_dr(struct pull_t* pull, int coord_ind, const t_pbc* p
         pgrp2 = &pull->group[pcrd->params.group[2]];
         pgrp3 = &pull->group[pcrd->params.group[3]];
 
-        low_get_pull_coord_dr(pull, pcrd, pbc, pgrp3->x, pgrp2->x, md2, spatialData.dr23);
+        low_get_pull_coord_dr(pull, pcrd, pbc, pgrp3->x, pgrp2->x, 2, 3, md2, spatialData.dr23);
     }
     if (pcrd->params.ngroup >= 6)
     {
@@ -603,7 +617,7 @@ static void get_pull_coord_dr(struct pull_t* pull, int coord_ind, const t_pbc* p
         pgrp4 = &pull->group[pcrd->params.group[4]];
         pgrp5 = &pull->group[pcrd->params.group[5]];
 
-        low_get_pull_coord_dr(pull, pcrd, pbc, pgrp5->x, pgrp4->x, md2, spatialData.dr45);
+        low_get_pull_coord_dr(pull, pcrd, pbc, pgrp5->x, pgrp4->x, 4, 5, md2, spatialData.dr45);
     }
 }
 
@@ -905,7 +919,7 @@ do_constraint(struct pull_t* pull, t_pbc* pbc, rvec* x, rvec* v, gmx_bool bMaste
 
             /* Get the current difference vector */
             low_get_pull_coord_dr(
-                    pull, pcrd, pbc, rnew[pcrd->params.group[1]], rnew[pcrd->params.group[0]], -1, unc_ij);
+                    pull, pcrd, pbc, rnew[pcrd->params.group[1]], rnew[pcrd->params.group[0]], 0, 1, -1, unc_ij);
 
             if (debug)
             {
@@ -988,8 +1002,8 @@ do_constraint(struct pull_t* pull, t_pbc* pbc, rvec* x, rvec* v, gmx_bool bMaste
 
                 g0 = pcrd->params.group[0];
                 g1 = pcrd->params.group[1];
-                low_get_pull_coord_dr(pull, pcrd, pbc, rnew[g1], rnew[g0], -1, tmp);
-                low_get_pull_coord_dr(pull, pcrd, pbc, dr1, dr0, -1, tmp3);
+                low_get_pull_coord_dr(pull, pcrd, pbc, rnew[g1], rnew[g0], 0, 1, -1, tmp);
+                low_get_pull_coord_dr(pull, pcrd, pbc, dr1, dr0, 0, 1, -1, tmp3);
                 fprintf(debug,
                         "Pull cur %8.5f %8.5f %8.5f j:%8.5f %8.5f %8.5f d: %8.5f\n",
                         rnew[g0][0],
@@ -1033,7 +1047,7 @@ do_constraint(struct pull_t* pull, t_pbc* pbc, rvec* x, rvec* v, gmx_bool bMaste
             }
 
             low_get_pull_coord_dr(
-                    pull, &coord, pbc, rnew[coord.params.group[1]], rnew[coord.params.group[0]], -1, unc_ij);
+                    pull, &coord, pbc, rnew[coord.params.group[1]], rnew[coord.params.group[0]], 0, 1, -1, unc_ij);
 
             switch (coord.params.eGeom)
             {
index 79f67c9cfc2edbf572ba5daf4dcff6e4f20dbbd7..c016ec6dc2dbf51f981e205c4fbe816189fcf0a1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2015,2016,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2015,2016,2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -37,7 +37,7 @@
 
 #include "seed.h"
 
-#include <time.h>
+#include <chrono>
 
 #include "gromacs/utility/basedefinitions.h"
 #include "gromacs/utility/fatalerror.h"
@@ -111,7 +111,10 @@ uint64_t makeRandomSeed()
     }
     else
     {
-        std::mt19937_64 prng(time(nullptr));
+        int64_t microsecondsSinceEpoch = std::chrono::duration_cast<std::chrono::microseconds>(
+                                                 std::chrono::system_clock::now().time_since_epoch())
+                                                 .count();
+        std::mt19937_64 prng(microsecondsSinceEpoch);
         return makeRandomSeedInternal(prng);
     }
 }
index 99d62f56c11c4afdfe4c1febf2df19dd543b2d70..90443b7aa795981fbd1aa626e3590cc5e907f9f3 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2020 Research Organization for Information Science and Technology (RIST).
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and 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_SIMD_HAVE_GATHER_LOADU_BYSIMDINT_TRANSPOSE_DOUBLE 1
 #define GMX_SIMD_HAVE_HSIMD_UTIL_FLOAT 1
 #define GMX_SIMD_HAVE_HSIMD_UTIL_DOUBLE 1
-#define GMX_SIMD_HAVE_4NSIMD_UTIL_FLOAT 0
-#define GMX_SIMD_HAVE_4NSIMD_UTIL_DOUBLE 0
-
-#define GMX_SIMD4_HAVE_FLOAT 1
-#define GMX_SIMD4_HAVE_DOUBLE 1
 
 #define GMX_SIMD_ALIGNMENT 16
 
 #define GMX_SIMD_RSQRT_BITS 8
 #define GMX_SIMD_RCP_BITS 8
 
+
+#if GMX_SIMD_FLOAT_WIDTH > 4
+#    define GMX_SIMD_HAVE_4NSIMD_UTIL_FLOAT 0
+#endif
+
+#if GMX_SIMD_DOUBLE_WIDTH > 4
+#    define GMX_SIMD_HAVE_4NSIMD_UTIL_DOUBLE 0
+#endif
+
+#define GMX_SIMD4_HAVE_FLOAT 1
+#if GMX_SIMD_DOUBLE_WIDTH < 4
+#    define GMX_SIMD4_HAVE_DOUBLE 0
+#else
+#    define GMX_SIMD4_HAVE_DOUBLE 1
+#endif
 #endif // GMX_SIMD_IMPL_ARM_SVE_DEFINITIONS_H
index 2e5e15850d7aa8c2c8f2ca1eccefa4ddbfc4246e..773a44eff9466a7795811454b80a42226a859fff 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2020 Research Organization for Information Science and Technology (RIST).
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -347,7 +347,7 @@ static inline SimdDouble gmx_simdcall maskzRcp(SimdDouble x, SimdDBool m)
     // The result will always be correct since we mask the result with m, but
     // for debug builds we also want to make sure not to generate FP exceptions
 #ifndef NDEBUG
-    x.simdInternal_ = svsel_f64(m, x.simdInternal_, svdup_n_f64(1.0));
+    x.simdInternal_ = svsel_f64(pg, x.simdInternal_, svdup_n_f64(1.0));
 #endif
     return { svreinterpret_f64_u64(svand_n_u64_z(
             pg, svreinterpret_u64_f64(svrecpe_f64(x.simdInternal_)), 0xFFFFFFFFFFFFFFFF)) };
index 572266a9839c74f6c06e8e69ef0af5f807101a38..d3d054c97d1b17e4a9151645bec3bc73d998299b 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2020 Research Organization for Information Science and Technology (RIST).
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -192,6 +192,7 @@ static inline void gmx_simdcall
     alignas(GMX_SIMD_ALIGNMENT) double tvec[3 * GMX_SIMD_DOUBLE_WIDTH];
     v = svcreate3_f64(v0.simdInternal_, v1.simdInternal_, v2.simdInternal_);
     svst3_f64(pg, tvec, v);
+#if GMX_SIMD_DOUBLE_WIDTH >= 3
     pg = svwhilelt_b64(0, 3);
     for (int i = 0; i < GMX_SIMD_DOUBLE_WIDTH; i++)
     {
@@ -200,6 +201,15 @@ static inline void gmx_simdcall
         svfloat64_t t3 = svadd_f64_x(pg, t1, t2);
         svst1_f64(pg, base + align * offset[i], t3);
     }
+#else
+    for (std::size_t i = 0; i < GMX_SIMD_DOUBLE_WIDTH; i++)
+    {
+        for (int j = 0; j < 3; j++)
+        {
+            base[align * offset[i] + j] += tvec[i * 3 + j];
+        }
+    }
+#endif
 }
 
 template<int align>
@@ -213,6 +223,7 @@ static inline void gmx_simdcall
     alignas(GMX_SIMD_ALIGNMENT) double tvec[3 * GMX_SIMD_DOUBLE_WIDTH];
     v = svcreate3_f64(v0.simdInternal_, v1.simdInternal_, v2.simdInternal_);
     svst3_f64(pg, tvec, v);
+#if GMX_SIMD_DOUBLE_WIDTH >= 3
     pg = svwhilelt_b64(0, 3);
     for (int i = 0; i < GMX_SIMD_DOUBLE_WIDTH; i++)
     {
@@ -221,6 +232,15 @@ static inline void gmx_simdcall
         svfloat64_t t3 = svsub_f64_x(pg, t1, t2);
         svst1_f64(pg, base + align * offset[i], t3);
     }
+#else
+    for (std::size_t i = 0; i < GMX_SIMD_DOUBLE_WIDTH; i++)
+    {
+        for (int j = 0; j < 3; j++)
+        {
+            base[align * offset[i] + j] -= tvec[i * 3 + j];
+        }
+    }
+#endif
 }
 
 static inline void gmx_simdcall expandScalarsToTriplets(SimdDouble  scalar,
@@ -284,11 +304,21 @@ static inline double gmx_simdcall
     sum[1] = svadda_f64(pg, 0.0, v1.simdInternal_);
     sum[2] = svadda_f64(pg, 0.0, v2.simdInternal_);
     sum[3] = svadda_f64(pg, 0.0, v3.simdInternal_);
-    pg     = svwhilelt_b64(0, 4);
-    _m     = svld1_f64(pg, m);
-    _s     = svld1_f64(pg, sum);
+#if GMX_SIMD_DOUBLE_WIDTH >= 4
+    pg = svwhilelt_b64(0, 4);
+    _m = svld1_f64(pg, m);
+    _s = svld1_f64(pg, sum);
     svst1_f64(pg, m, svadd_f64_x(pg, _m, _s));
     return svadda_f64(pg, 0.0, _s);
+#else
+    double res = 0;
+    for (int i = 0; i < 4; i++)
+    {
+        m[i] += sum[i];
+        res += sum[i];
+    }
+    return res;
+#endif
 }
 
 static inline SimdDouble gmx_simdcall loadDualHsimd(const double* m0, const double* m1)
@@ -360,11 +390,21 @@ static inline double gmx_simdcall reduceIncr4ReturnSumHsimd(double* m, SimdDoubl
     sum[1] = svadda_f64(pg, 0.0, v0.simdInternal_);
     sum[3] = svadda_f64(pg, 0.0, v1.simdInternal_);
 
+#if GMX_SIMD_DOUBLE_WIDTH >= 4
     pg = svwhilelt_b64(0, 4);
     _m = svld1_f64(pg, m);
     _s = svld1_f64(pg, sum);
     svst1_f64(pg, m, svadd_f64_x(pg, _m, _s));
     return svadda_f64(pg, 0.0, _s);
+#else
+    double res = 0;
+    for (int i = 0; i < 4; i++)
+    {
+        m[i] += sum[i];
+        res += sum[i];
+    }
+    return res;
+#endif
 }
 
 template<int align>
index 18df95a44509255b6392523496b9759bdc02aa7d..fc9fe741711eb110a9f649266542aabfbc67e93b 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 2020 Research Organization for Information Science and Technology (RIST).
- * Copyright (c) 2020, by the GROMACS development team, led by
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -83,7 +83,6 @@ static inline void gmx_simdcall
     }
     else if (2 == align)
     {
-        assert(0);
         svbool_t    pg    = svptrue_b32();
         svfloat32_t t0    = svreinterpret_f32_u64(svld1_gather_s64index_u64(
                 svunpklo_b(pg), (uint64_t*)base, svunpklo_s64(offset.simdInternal_)));
index 9312fdc0bb83e37b92d01b97b5d1d6ea0a700ff2..b1fdb52b743fa1b2e380eb418850ae3af2b7f96b 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2015,2016,2017,2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2015,2016,2017,2018,2019 by the GROMACS development team.
+ * Copyright (c) 2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -508,6 +509,23 @@ int get_nthreads_mpi(const gmx_hw_info_t* hwinfo,
             }
         }
 
+        if (ngpu > 0 && (nrank_new % ngpu) != 0)
+        {
+            /* If we use GPUs, the number of ranks must be divisible by the number of GPUs,
+             * unless the GPUs are very different (and if they are, user should manually
+             * select the parallelization scheme).
+             * Rounding down the number of ranks, or setting it to ngpu, whichever is smaller.
+             * */
+            if (nrank_new > ngpu)
+            {
+                nrank_new = (nrank_new / ngpu) * ngpu;
+            }
+            else
+            {
+                nrank_new = ngpu;
+            }
+        }
+
         nrank = nrank_new;
 
         /* We reduced the number of tMPI ranks, which means we might violate
index cbc9b16a60b9aa7a08f10ea4111a993a4717ba4b..086fd8d29f879a7b842ec4c36d15328b0700961a 100644 (file)
@@ -4,7 +4,7 @@
  * 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.
- * Copyright (c) 2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -343,6 +343,7 @@ void printInteractionParameters(gmx::TextWriter* writer, t_functype ftype, const
         case F_SETTLE:
             writer->writeLineFormatted("doh=%15.8e, dhh=%15.8e", iparams.settle.doh, iparams.settle.dhh);
             break;
+        case F_VSITE1: writer->ensureEmptyLine(); break;
         case F_VSITE2: writer->writeLineFormatted("a=%15.8e", iparams.vsite.a); break;
         case F_VSITE3:
         case F_VSITE3FD:
index ae0ee9dbcda3bebbec355eb3b059f1d00d42f660..273ffde72182325c2a32b72739e29eeb9a9d539a 100644 (file)
@@ -4,7 +4,7 @@
  * 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.
- * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -107,6 +107,7 @@ std::string formatCentered(int width, const char* text)
 
 void printCopyright(gmx::TextWriter* writer)
 {
+    // Contributors sorted alphabetically by last name
     static const char* const Contributors[]  = { "Andrey Alekseenko",
                                                 "Emile Apol",
                                                 "Rossen Apostolov",
@@ -119,6 +120,7 @@ void printCopyright(gmx::TextWriter* writer)
                                                 "Aldert van Buuren",
                                                 "Rudi van Drunen",
                                                 "Anton Feenstra",
+                                                "Gilles Gouaillardet",
                                                 "Alan Gray",
                                                 "Gerrit Groenhof",
                                                 "Anca Hamuraru",
@@ -283,7 +285,7 @@ void gmx_print_version_info(gmx::TextWriter* writer)
 #if GMX_DOUBLE
     writer->writeLine("Precision:          double");
 #else
-    writer->writeLine("Precision:          single");
+    writer->writeLine("Precision:          mixed");
 #endif
     writer->writeLine(formatString("Memory model:       %u bit", static_cast<unsigned>(8 * sizeof(void*))));
 
index e600a404bbc343e16b68b77f76296cedb47aa562..325664ac02607f6b530d35b2af4a0d5908e0a640 100644 (file)
@@ -43,7 +43,7 @@ if(REGRESSIONTEST_DOWNLOAD)
         set(REGRESSIONTEST_URL https://gitlab.com/gromacs/gromacs-regressiontests/-/archive/${REGRESSIONTEST_BRANCH}/gromacs-regressiontests-${REGRESSIONTEST_BRANCH}.tar.gz)
         # REGRESSIONTEST_PATH for dev trees is set later based on the dirname found in the tar
     else()
-        set(REGRESSIONTEST_URL http://ftp.gromacs.org/regressiontests/regressiontests-${REGRESSIONTEST_VERSION}.tar.gz)
+        set(REGRESSIONTEST_URL https://ftp.gromacs.org/regressiontests/regressiontests-${REGRESSIONTEST_VERSION}.tar.gz)
         set(REGRESSIONTEST_PATH
             "${CMAKE_CURRENT_BINARY_DIR}/regressiontests-${REGRESSIONTEST_VERSION}"
             CACHE PATH "Path to auto-downloaded regressiontests" FORCE)