# 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.
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()
#
# 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.
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)))
# 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.
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__":
#
# 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
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"
-# 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
- $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
--- /dev/null
+# 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'
+
--- /dev/null
+# 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
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
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"
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"
* 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.
* \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
{
#
# 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.
#
# 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>
integrator.cpp
interactions.cpp
molecules.cpp
+ particlesequencer.cpp
particletype.cpp
simulationstate.cpp
topologyhelpers.cpp
molecules.h
kerneloptions.h
nblib.h
+ particlesequencer.h
particletype.h
- ppmap.h
simulationstate.h
topology.h
- topologyhelpers.h
DESTINATION include/nblib)
endif()
/*
* 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.
/*
* 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.
/*
* 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/forcecalculator.h"
#include "nblib/gmxcalculator.h"
#include "nblib/gmxsetup.h"
+#include "gromacs/utility/arrayref.h"
namespace nblib
{
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)
/*
* 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 "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"
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,
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);
}
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());
}
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());
/*
* 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.
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);
/*
* 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/interactions.h"
-#include "nblib/util/internal.h"
namespace nblib
{
/*
* 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/kerneloptions.h"
#include "nblib/particletype.h"
-#include "nblib/util/user.h"
+#include "nblib/util/util.hpp"
namespace nblib
{
/*
* 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.
/*
* 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 <array>
#include "nblib/particletype.h"
-#include "nblib/ppmap.h"
-#include "nblib/util/user.h"
+#include "nblib/util/util.hpp"
namespace nblib
{
}
-/*! \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 }
{
}
};
/*
* 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.
* \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>
/*
* 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 <unordered_map>
#include "nblib/listed_forces/definitions.h"
+#include "nblib/vector.h"
namespace gmx
{
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
/*
* 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.
*/
/*! \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>
#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"
};
template<>
-struct ListedIndex<DefaultAngle> : std::integral_constant<int, F_ANGLES>
+struct ListedIndex<HarmonicAngleType> : std::integral_constant<int, F_ANGLES>
{
};
}
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)
{
}
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)
{
}
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)
{
}
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)
{
}
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)
{
}
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)
{
}
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)
{
#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
{
/*! \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,
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);
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,
[[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,
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,
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;
}
/*! \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,
/*! \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,
} // namespace nblib
+#undef NBLIB_ALWAYS_INLINE
+
#endif // NBLIB_LISTEDFORCES_DATAFLOW_HPP
/*
* 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
//***********************************************************************************
-/*! \brief These macros define what interaction types are supported in
+/*! \brief These type lists define what interaction types are supported in
* -Molecule
* -Topology
* -ListedForceCalculator
* 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
+++ /dev/null
-/*
- * 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
+++ /dev/null
-/*
- * 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
#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
{
} // namespace nblib
+#undef NBLIB_ALWAYS_INLINE
+
#endif // NBLIB_LISTEDFORCSES_HELPERS_HPP
/*
* 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.
//! 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);
}
#
# 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.
/*
* 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>
*/
#include "nblib/listed_forces/bondtypes.h"
-#include "nblib/util/internal.h"
+#include "nblib/util/util.hpp"
#include "testutils/testasserts.h"
{
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);
}
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);
}
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);
}
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);
/*
* 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.
// 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));
}
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");
}
/*
* 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.
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;
}
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);
/*
* 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.
{
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]
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);
}
/*
* 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.
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)
}
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);
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Reduced energy">0.32409546497033953</Real>
+</ReferenceData>
--- /dev/null
+<?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>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Angle energy">0.11276812148357591</Real>
+</ReferenceData>
--- /dev/null
+<?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>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Bond energy">0.2113273434867636</Real>
+</ReferenceData>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
/*
* 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.
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);
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);
}
/*
* 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.
{ { 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) }*/ };
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
/*
* 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
{
/*
* 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);
/*
* 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.
} // 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
}
//! \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
}
//! \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;
}
/*
* 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
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
/*
* 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.
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);
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:
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
/*
* 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
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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
/*
* 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 <string>
-#include "nblib/util/user.h"
+#include "nblib/util/util.hpp"
+#include "nblib/basicdefinitions.h"
namespace nblib
{
#include "gromacs/math/vec.h"
#include "gromacs/pbcutil/pbc_aiuc.h"
-struct PbcAiuc;
-
namespace nblib
{
+++ /dev/null
-/*
- * 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
#
# 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()
/*
* 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
// 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.
// 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.
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.
--- /dev/null
+/*
+ * 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
+++ /dev/null
-#
-# 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})
--- /dev/null
+/*
+ * 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
/*
* 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/simulationstate.h"
#include "nblib/simulationstateimpl.h"
+#include "nblib/util/setup.h"
namespace nblib
{
/*
* 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 <memory>
#include <vector>
-#include "nblib/box.h"
-#include "nblib/topology.h"
+#include "box.h"
+#include "topology.h"
+#include "vector.h"
namespace nblib
{
/*
* 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/kerneloptions.h"
#include "nblib/simulationstate.h"
#include "nblib/tests/testsystems.h"
+#include "gromacs/utility/arrayref.h"
namespace nblib
{
/*
* 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/particletype.h"
#include "nblib/simulationstate.h"
#include "nblib/topology.h"
-#include "nblib/util/internal.h"
#include "testutils/testasserts.h"
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);
i,
step);
}
+ integrator.integrate(dt,
+ simulationState.coordinates(),
+ simulationState.velocities(),
+ simulationState.forces());
}
- integrator.integrate(
- dt, simulationState.coordinates(), simulationState.velocities(), simulationState.forces());
}
}
/*
* 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.
}
}
-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;
//! 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();
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);
//! 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
/*
* 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/tests/testhelpers.h"
#include "nblib/tests/testsystems.h"
#include "nblib/topology.h"
+#include "nblib/util/setup.h"
namespace nblib
{
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");
}
/*
* 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>
*/
-#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"
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:
} // namespace test
} // namespace nblib
-#endif // NBLIB_TESTS_TESTHELPERS_H
+#endif // NBLIB_TESTHELPERS_H
/*
* 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.
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);
}
/*
* 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
{
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 } };
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);
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);
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);
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);
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);
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)
/*
* 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 <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_;
"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),
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;
}
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;
}
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);
return combinationRule_;
}
-gmx::ListOfLists<int> Topology::getGmxExclusions() const
+ExclusionLists<int> Topology::exclusionLists() const
{
- return exclusions_;
+ return exclusionLists_;
}
} // namespace nblib
/*
* 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
//! 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;
//! 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
//! 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>
/*
* 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;
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
/*
* 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
#
# 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.
#
# 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()
/*
* 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 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)
--- /dev/null
+/*
+ * 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
#
# 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.
#
# 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>
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})
/*
* 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 <vector>
#include "nblib/tests/testhelpers.h"
-#include "nblib/util/user.h"
+#include "nblib/util/setup.h"
#include "testutils/testasserts.h"
/*
* 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.
*/
/*! \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>;
EXPECT_EQ(1, outOfRange);
}
-TEST(NblibInternalUtils, FindIndexTuple2)
+TEST(NblibTraitsUtils, FindIndexTuple2)
{
using TupleType = std::tuple<float, int>;
EXPECT_EQ(2, outOfRange);
}
-TEST(NblibInternalUtils, FindIndexTypeList1)
+TEST(NblibTraitsUtils, FindIndexTypeList1)
{
using ListType = TypeList<float>;
EXPECT_EQ(1, outOfRange);
}
-TEST(NblibInternalUtils, FindIndexTypeList2)
+TEST(NblibTraitsUtils, FindIndexTypeList2)
{
using ListType = TypeList<float, int>;
}
-TEST(NblibInternalUtils, Contains)
+TEST(NblibTraitsUtils, Contains)
{
using ListType = TypeList<float, int>;
EXPECT_FALSE(hasUint);
}
-TEST(NblibInternalUtils, FindIndexTupleRepeated)
+TEST(NblibTraitsUtils, FindIndexTupleRepeated)
{
using TupleType = std::tuple<float, float, int>;
EXPECT_EQ(3, outOfRange);
}
-TEST(NblibInternalUtils, FindIndexTypeListRepeated)
+TEST(NblibTraitsUtils, FindIndexTypeListRepeated)
{
using TupleType = TypeList<float, float, int>;
*/
/*! \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>
* \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
{
*/
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>>>>
{
};
//! \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
*
{
};
-//! 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
* \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
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)
{
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
/*
* 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.
#
# 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.
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})
# 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.
# 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}")
-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")
# 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})
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()
# 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.
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
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
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
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
# 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.
.. |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
.. _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
# 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.
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.
``-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
--- /dev/null
+%!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
--- /dev/null
+<?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>
--- /dev/null
+%!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
--- /dev/null
+<?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>
--- /dev/null
+%!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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+%!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
--- /dev/null
+<?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
--- /dev/null
+%!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
--- /dev/null
+<?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
--- /dev/null
+%!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
--- /dev/null
+<?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
--- /dev/null
+<?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
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:
::
--- /dev/null
+<?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>
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:
::
; 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:
::
+------------------------------------+----------------------------+------------+-----------+-------------------------------------------------------------------------+------------+
| 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) | |
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
: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
"""""""""""""""""""""""""""""""
: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
^^^^^^^^^^^^^^^^^^^^^^^
: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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
--- /dev/null
+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
+^^^^^^^^^^^^^
--- /dev/null
+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
+^^^^^^^^^^^^^
+
: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
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: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
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
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
: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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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!
* 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,
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
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
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.
.. todolist::
+Patch releases
+^^^^^^^^^^^^^^
+
+.. toctree::
+ :maxdepth: 1
+
+ 2021/2021.1
+
+
Major release
^^^^^^^^^^^^^
.. toctree::
:maxdepth: 1
+ 2020/2020.6
2020/2020.5
2020/2020.4
2020/2020.3
.. 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
# 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/*
# 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.
-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
#
# 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.
_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/
#
# 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.
/*
* 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.
/* 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);
{
if (pointState[i].inTargetRegion())
{
- pointState[i].setLogPmfSum(-std::log(buffer[i] * normFac));
+ pointState[i].setLogPmfSum(std::log(buffer[i] * normFac));
}
}
}
/*
* 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.
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;
*
* 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.
{
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);
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.
*
* 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.
* 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 },
* 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.
}
}
xvgrclose(out);
+ fprintf(stdout, "Wrote per-molecule output to %s\n", fn);
do_view(oenv, fn, "-graphtype bar");
/* Compute variance, stddev and error */
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);
}
}
* 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.
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);
* 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.
}
}
-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;
}
}
}
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,
/* 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)
}
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
"Processing chain %d (%d atoms, %d residues)", chain + 1, natom, nres);
}
- process_chain(pdba,
+ process_chain(logger,
+ pdba,
x,
bUnA_,
bUnA_,
#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"
{
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
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,
{
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];
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);
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)
{
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)
{
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);
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
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
* 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.
/* All the directives above can not appear after moleculetype */
"moleculetype",
"atoms",
+ "virtual_sites1",
"virtual_sites2",
"virtual_sites3",
"virtual_sites4",
{
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)
{
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);
*
* 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.
d_cmaptypes,
d_moleculetype,
d_atoms,
+ d_vsites1,
d_vsites2,
d_vsites3,
d_vsites4,
* 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.
wi);
break;
+ case Directive::d_vsites1:
case Directive::d_vsites2:
case Directive::d_vsites3:
case Directive::d_vsites4:
* 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.
*
* 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
/*
* 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.
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();
/*
* 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.
{
setActiveDevice(testDevice->deviceInfo());
typename TestFixture::VectorType input;
- fillInput(&input, 1);
+ resizeAndFillInput(&input, 3, 1);
typename TestFixture::VectorType output;
output.resizeWithPadding(input.size());
{
typename TestFixture::VectorType input;
input.reserveWithPadding(3);
- fillInput(&input, 1);
+ resizeAndFillInput(&input, 3, 1);
}
TYPED_TEST(HostAllocatorTestNoMem, CreateVector)
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());
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);
/*
* 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.
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);
});
})
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;
}
/*
* 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.
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()
/*
* 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.
__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)
{
{
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)
* 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.
// 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())
{
/*
* 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.
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;
});
}
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;
};
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),
// 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))
/*
* 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.
#define GMX_MATH_PADDEDVECTOR_H
#include <algorithm>
+#include <utility>
#include <vector>
#include "gromacs/math/arrayrefwithpadding.h"
}
//! 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) :
/*
* 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.
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)
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());
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());
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());
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());
/*
* 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.
//! 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
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;
{
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;
#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;
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;
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);
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);
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 */
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
{
}
}
- /* 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];
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)
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 */
}
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 */
--- /dev/null
+/*
+ * 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
/*
* 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
#
# 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.
ebin.cpp
energydrifttracker.cpp
energyoutput.cpp
+ expanded.cpp
freeenergyparameters.cpp
leapfrog.cpp
leapfrogtestdata.cpp
--- /dev/null
+/*
+ * 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
/*
* 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.
{
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))
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)
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()));
/*
* 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.
#include "gromacs/mdlib/stat.h"
#include "gromacs/mdlib/stophandler.h"
+#include "gromacs/mdrunutility/handlerestart.h"
#include "modularsimulatorinterfaces.h"
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)
{
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);
}
/*
* 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.
{
class StopHandler;
class TrajectoryElement;
+enum class StartingBehavior;
/*! \internal
* \ingroup module_modularsimulator
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_;
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;
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(
* 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.
* 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;
* 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.
/** 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. */
* 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.
#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"
}
}
-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);
"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");
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_);
|| (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)
{
}
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
{
* 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.
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
*/
* 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.
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)
{
* 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.
/* 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]];
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
pbc,
pgrp1->x,
pcrd->params.eGeom == epullgCYL ? pull->dyna[coord_ind].x : pgrp0->x,
+ 0,
+ 1,
md2,
spatialData.dr01);
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)
{
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);
}
}
/* 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)
{
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],
}
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)
{
/*
* 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.
#include "seed.h"
-#include <time.h>
+#include <chrono>
#include "gromacs/utility/basedefinitions.h"
#include "gromacs/utility/fatalerror.h"
}
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);
}
}
* 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
* 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.
// 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)) };
* 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.
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++)
{
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>
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++)
{
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,
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)
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>
* 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.
}
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_)));
/*
* 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.
}
}
+ 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
* 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.
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:
* 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.
void printCopyright(gmx::TextWriter* writer)
{
+ // Contributors sorted alphabetically by last name
static const char* const Contributors[] = { "Andrey Alekseenko",
"Emile Apol",
"Rossen Apostolov",
"Aldert van Buuren",
"Rudi van Drunen",
"Anton Feenstra",
+ "Gilles Gouaillardet",
"Alan Gray",
"Gerrit Groenhof",
"Anca Hamuraru",
#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*))));
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)