Merge "Merge branch release-2020 into master"
authorPaul Bauer <paul.bauer.q@gmail.com>
Wed, 4 Mar 2020 11:01:37 +0000 (12:01 +0100)
committerPaul Bauer <paul.bauer.q@gmail.com>
Wed, 4 Mar 2020 11:01:37 +0000 (12:01 +0100)
89 files changed:
.gitlab-ci.yml
admin/builds/gpucomm-matrix.txt
admin/builds/gpuupdate-matrix.txt
admin/builds/gromacs.py
admin/ci-templates/.build-template.yml
admin/ci-templates/.cuda-gcc-build-template.yml [deleted file]
admin/ci-templates/.cuda-template.yml [new file with mode: 0644]
admin/ci-templates/.image-templates.yml
admin/ci-templates/.include-template.yml
admin/ci-templates/.variables-template.yml
admin/dockerfiles/base/Dockerfile [moved from admin/dockerfiles/ci-gcc-7/Dockerfile with 62% similarity]
admin/dockerfiles/build.sh [deleted file]
admin/dockerfiles/buildall.sh [new file with mode: 0644]
admin/dockerfiles/ci-clang-6/Dockerfile [deleted file]
admin/dockerfiles/ci-clang-7/Dockerfile [deleted file]
admin/dockerfiles/ci-clang-8/Dockerfile [deleted file]
admin/dockerfiles/ci-clang/Dockerfile [new file with mode: 0644]
admin/dockerfiles/ci-docs-clang/Dockerfile [new file with mode: 0644]
admin/dockerfiles/ci-docs-gcc/Dockerfile [new file with mode: 0644]
admin/dockerfiles/ci-docs/Dockerfile [deleted file]
admin/dockerfiles/ci-gcc-5/Dockerfile [deleted file]
admin/dockerfiles/ci-gcc-6/Dockerfile [deleted file]
admin/dockerfiles/ci-gcc-8-cuda-10.2/Dockerfile [moved from admin/dockerfiles/ci-gcc-8/Dockerfile with 87% similarity]
admin/dockerfiles/ci-gcc/Dockerfile [new file with mode: 0644]
cmake/gmxCPackUtilities.cmake
cmake/gmxGenerateVersionInfoRelease.cmake [new file with mode: 0644]
cmake/gmxVersionInfo.cmake
docs/CMakeLists.txt
docs/dev-manual/known-issues.rst
docs/release-notes/2019/2019.6.rst
docs/release-notes/2020/2020.1.rst
docs/release-notes/2020/2020.2.rst [new file with mode: 0644]
docs/release-notes/index.rst
docs/user-guide/mdp-options.rst
docs/user-guide/mdrun-performance.rst
scripts/GMXRC.csh.cmakein
src/api/cpp/tests/stopsignaler.cpp
src/gromacs/domdec/domdec_topology.cpp
src/gromacs/ewald/pme.cpp
src/gromacs/ewald/pme_gpu_internal.cpp
src/gromacs/fileio/checkpoint.cpp
src/gromacs/fileio/checkpoint.h
src/gromacs/gmxana/gmx_disre.cpp
src/gromacs/gmxpreprocess/grompp.cpp
src/gromacs/gmxpreprocess/readir.cpp
src/gromacs/gpu_utils/cudautils.cu
src/gromacs/gpu_utils/gpu_utils.cu
src/gromacs/hardware/gpu_hw_info.cpp
src/gromacs/hardware/gpu_hw_info.h
src/gromacs/listed_forces/orires.cpp
src/gromacs/mdlib/dispersioncorrection.cpp
src/gromacs/mdlib/forcerec.cpp
src/gromacs/mdlib/forcerec.h
src/gromacs/mdlib/md_support.cpp
src/gromacs/mdlib/md_support.h
src/gromacs/mdlib/mdoutf.cpp
src/gromacs/mdlib/mdoutf.h
src/gromacs/mdlib/sim_util.cpp
src/gromacs/mdlib/vsite.cpp
src/gromacs/mdlib/vsite.h
src/gromacs/mdrun/md.cpp
src/gromacs/mdrun/mimic.cpp
src/gromacs/mdrun/minimize.cpp
src/gromacs/mdrun/rerun.cpp
src/gromacs/mdrun/runner.cpp
src/gromacs/modularsimulator/constraintelement.cpp
src/gromacs/modularsimulator/constraintelement.h
src/gromacs/modularsimulator/domdechelper.cpp
src/gromacs/modularsimulator/forceelement.cpp
src/gromacs/modularsimulator/modularsimulator.cpp
src/gromacs/modularsimulator/modularsimulator.h
src/gromacs/modularsimulator/parrinellorahmanbarostat.cpp
src/gromacs/modularsimulator/parrinellorahmanbarostat.h
src/gromacs/modularsimulator/shellfcelement.cpp
src/gromacs/modularsimulator/shellfcelement.h
src/gromacs/modularsimulator/topologyholder.cpp
src/gromacs/modularsimulator/trajectoryelement.cpp
src/gromacs/modularsimulator/trajectoryelement.h
src/gromacs/nbnxm/kernels_reference/kernel_ref.h
src/gromacs/nbnxm/nbnxm_geometry.h
src/gromacs/taskassignment/decidegpuusage.cpp
src/gromacs/taskassignment/decidegpuusage.h
src/gromacs/taskassignment/reportgpuusage.cpp
src/programs/mdrun/tests/CMakeLists.txt
src/programs/mdrun/tests/exactcontinuation.cpp
src/programs/mdrun/tests/orires.cpp [new file with mode: 0644]
src/testutils/simulationdatabase/orires_1lvz.gro [new file with mode: 0644]
src/testutils/simulationdatabase/orires_1lvz.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/orires_1lvz.top [new file with mode: 0644]

index 91b693e1537cf79b97ea771ccddcd5a96c312a7a..ae0f97fc4611acb6b4b89c3be11e054af7aaffb1 100644 (file)
@@ -87,6 +87,11 @@ stages:
     - .gcc-before-script-template
     - .build-gcc-template
 
+.configure-gcc-cuda:
+    extends:
+      - .configure-gcc
+      - .cuda-template
+
 .configure-clang:
   extends:
     - .configure-extends-template
@@ -147,10 +152,10 @@ stages:
     - .build-docs-webpage-template
     - .documentation-before-script-template
 
-.build-cuda-gcc:
-  extends:
-    - .build-gcc
-    - .build-cuda-template
+.build-gcc-cuda:
+    extends:
+      - .build-gcc
+      - .cuda-template
 
 # Templates for test stage
 .test-gcc:
@@ -159,6 +164,11 @@ stages:
     - .gcc-before-script-template
     - .test-gcc-template
 
+.test-gcc-cuda:
+    extends:
+      - .test-gcc
+      - .cuda-template
+
 .test-clang:
   extends:
     - .test-extends-template
@@ -249,6 +259,17 @@ configure-gcc-8:
     variables:
       - $GROMACS_RELEASE
 
+configure-gcc-8-cuda-10.2:
+    extends:
+      - .configure-gcc-cuda
+      - .gcc-8-cuda-10.2-template
+    needs:
+      - job: simple-build
+        artifacts: false
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
 configure-gcc-7-simd-sse41:
   extends:
     - .configure-gcc
@@ -443,6 +464,225 @@ build-gcc-7-double:
       - $GROMACS_RELEASE
 
 build-gcc-8:
+    extends:
+      - .build-gcc
+      - .gcc8-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: configure-gcc-8
+        artifacts: true
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+build-gcc-8-cuda-10.2:
+    extends:
+      - .build-gcc-cuda
+      - .gcc-8-cuda-10.2-template
+    needs:
+      - job: simple-build
+        artifacts: false
+      - job: configure-gcc-8-cuda-10.2
+        artifacts: true
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+build-gcc-7-simd-sse41:
+    extends:
+      - .build-gcc
+      - .gcc7-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: configure-gcc-7-simd-sse41
+        artifacts: true
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+build-clang-7:
+    extends:
+      - .build-clang
+      - .clang7-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: configure-clang-7
+        artifacts: true
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+build-clang-7-gmxapi:
+    extends:
+      - .build-clang
+      - .gmxapi-extra-installs
+      - .clang7-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: configure-clang-7-gmxapi
+        artifacts: true
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+build-clang-8:
+    extends:
+      - .build-clang
+      - .clang8-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: configure-clang-8
+        artifacts: true
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+build-clang-6:
+    extends:
+      - .build-clang
+      - .clang6-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: configure-clang-6
+        artifacts: true
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+# Jobs running during test stage
+test-gcc-7:
+    extends:
+      - .test-gcc
+      - .gcc7-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-gcc-7
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+test-gcc-7-gmxapi:
+    extends:
+      - .test-gcc
+      - .gmxapi-extra-installs
+      - .gcc7-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-gcc-7-gmxapi
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+test-gcc-7-double:
+    extends:
+      - .test-gcc
+      - .gcc7-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-gcc-7-double
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+test-gcc-8:
+    extends:
+      - .test-gcc
+      - .gcc8-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-gcc-8
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+test-gcc-8-cuda-10.2:
+    variables:
+      KUBERNETES_EXTENDED_RESOURCE_NAME: "nvidia.com/gpu"
+      KUBERNETES_EXTENDED_RESOURCE_LIMIT: 1
+    extends:
+      - .test-gcc-cuda
+      - .gcc-8-cuda-10.2-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-gcc-8-cuda-10.2
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+test-gcc-7-simd-sse41:
+    extends:
+      - .test-gcc
+      - .gcc7-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-gcc-7-simd-sse41
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+test-clang-7:
+    extends:
+      - .test-clang
+      - .clang7-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-clang-7
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+test-clang-7-gmxapi:
+    extends:
+      - .test-clang
+      - .gmxapi-extra-installs
+      - .clang7-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-clang-7-gmxapi
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+test-clang-8:
+    extends:
+      - .test-clang
+      - .clang8-template
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-clang-8
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+test-clang-6:
+    extends:
+      - .test-clang
+      - .clang6-template       
+    needs:
+      - job: simple-build
+        artifacts: false 
+      - job: build-clang-6
+    except:
+      variables:
+        - $GROMACS_RELEASE
+
+# Jobs running in source checking stage
+build-clang-tidy:
   extends:
     - .build-gcc
     - .gcc8-template
index ef7895fe30e6fedff9ebcff4367ec8d53943148f..644334dba5ba20d9cb8d8721482efa4a0e0342ba 100644 (file)
@@ -1,7 +1,10 @@
-# This matrix is intended to permit Jenkins on-demand testing
-# of code hidden behind the GMX_USE_BUFFER_OPS feature flag
-# during development. When the feature flag is removed, the
-# normal test matrices will be adapted to cover this code path.
+# This matrix is intended to permit Jenkins:
+# - nigtly testing of the GPU direct communations experimental features in the 2020 release
+# - on-demand testing of the GPU direct communication code path
+# This is neceassary due to:
+# i) the limitations of the integration tests which only test the deafult code-path
+# ii) limitations of the regresssion tests which are not able to rerun update with a
+#     different offload mode unless the default is observed to be GPU.
 #
 # Comment line(s) preceding each configuration document the main
 # intent behind that configuration, so that we can correctly judge
index cd0c31b09e1a3c09c7ead449fbb3981a200ffc80..f31acc2e34565c31af36dbe76e6eb6423302cbbb 100644 (file)
@@ -1,5 +1,10 @@
-# This matrix is intended to permit Jenkins on-demand testing
-# of GPU update code path during development.
+# This matrix is intended to permit Jenkins:
+# - nigtly testing of the GPU update features in the 2020 release
+# - on-demand testing of the GPU update code path
+# This is neceassary due to:
+# i) the limitations of the integration tests which only test the deafult code-path
+# ii) limitations of the regresssion tests which are not able to rerun update with a
+#     different offload mode unless the default is observed to be GPU.
 #
 # Comment line(s) preceding each configuration document the main
 # intent behind that configuration, so that we can correctly judge
index d78c29c13ede1b383ec59ab695a828014847aeca..7dce328844b31afb28e15b8a6067a034f95f8b19 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2015,2016,2017,2018,2019,2020, by the GROMACS development team.
+# Copyright (c) 2015,2016,2017,2018,2019,2020, The GROMACS development team.
 # 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
@@ -184,11 +184,9 @@ def do_build(context):
         context.env.set_env_var('GMX_GPU_DD_COMMS', "1")
         context.env.set_env_var('GMX_GPU_PME_PP_COMMS', "1")
 
-    # GPU update flag enables GPU update+constraints as well as buffer ops (dependency)
+    # GPU update flag changes the default for '-update auto' to GPU
     if context.opts.gpuupdate:
         context.env.set_env_var('GMX_FORCE_UPDATE_DEFAULT_GPU', "1")
-        context.env.set_env_var('GMX_GPU_DD_COMMS', "1")
-        context.env.set_env_var('GMX_GPU_PME_PP_COMMS', "1")
 
     regressiontests_path = context.workspace.get_project_dir(Project.REGRESSIONTESTS)
 
index bc14efe4da8267d54eb31102e0c75a61ae2e8110..69d6108e3948044f16ebb094a5cf694e1c98674b 100644 (file)
       - $BUILD_DIR
       - $INSTALL_DIR/
 
+# Right now we need to use an ugly hack to move the original build directory
+# and the ccache files out of the build archive, as it is not possible to use
+# the custom build directory due to https://gitlab.com/gitlab-org/gitlab-runner/issues/4203
+# As soon as this is resolved we should use the separate build directories instead of
+# manually hacking things. TODO
+# Redmine #3361
 .archive-build-template:
   # Dockerfiles are from dockerhub, user eriklindahl
   image: gromacs/continuous-integration:ci-docs
     - if [ -s buildErrors.log ] ; then echo "Found warnings during build"; cat buildErrors.log; exit 1; fi
     - mv gromacs*tar.gz ..
     - cd ..
+    # ugly hack begins here
+    - mkdir tempdir
+    - SOURCETARBALL=`ls gromacs*tar.gz`
+    - mv $SOURCETARBALL tempdir
+    - cd tempdir
+    - tar -xf $SOURCETARBALL
+    - rm -rf gromacs-*/$BUILD_DIR
+    - tar -c --gzip -f $SOURCETARBALL gromacs-*/
+    - mv $SOURCETARBALL ..
+    - cd ..
+    - rm -rf tempdir
+    # Hack ends here
   artifacts:
     when: always
     expire_in: 1 week
diff --git a/admin/ci-templates/.cuda-gcc-build-template.yml b/admin/ci-templates/.cuda-gcc-build-template.yml
deleted file mode 100644 (file)
index 3f12a56..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-.build-cuda-template:
-  variables:
-    CMAKE_PRECISION_OPTIONS: "-DGMX_DOUBLE=OFF"
-    CUDA_BASE_VERSION: "10.1"
-    BUILD_DIR: build-cuda-$CUDA_BASE_VERSION
-    CMAKE_EXTRA_OPTIONS: -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda/ -DGMX_GPU=ON
-
-  image: nvidia/cuda:${CUDA_BASE_VERSION}-devel
-
diff --git a/admin/ci-templates/.cuda-template.yml b/admin/ci-templates/.cuda-template.yml
new file mode 100644 (file)
index 0000000..20a8945
--- /dev/null
@@ -0,0 +1,8 @@
+.cuda-template:
+  variables:
+    CMAKE_PRECISION_OPTIONS: "-DGMX_DOUBLE=OFF"
+    CUDA_BASE_VERSION: ""
+    BUILD_DIR: build-cuda
+    CMAKE_EXTRA_OPTIONS: -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda/
+    CMAKE_GPU_OPTIONS: -DGMX_GPU=ON
+
index cfd568de30d10e8902ae8d33308052f599871bc9..a7196734a5b2726064562ae6c38096b86d51749e 100644 (file)
@@ -40,3 +40,9 @@
 .clang8-gmxapi-template:
   image: gromacs/continuous-integration:ci-clang-8-gmxapi
 
+.gcc-8-cuda-10.2-template:
+  image: gromacs/continuous-integration:ci-gcc-8-cuda-10.2
+  variables:
+    CUDA_BASE_VERSION: "10.2"
+    COMPILER_MAJOR_VERSION: 8
+
index 1a0e26f064fb0a8ac9359a30f716e28c9b08927d..1027664ed19098099aaa91633b4f3bc767d96f13 100644 (file)
@@ -15,7 +15,7 @@ include:
     - local: '/admin/ci-templates/.tags-template.yml'
     - local: '/admin/ci-templates/.test-script-template.yml'
     - local: '/admin/ci-templates/.build-docs-template.yml'
-    - local: '/admin/ci-templates/.cuda-gcc-build-template.yml'
+    - local: '/admin/ci-templates/.cuda-template.yml'
     - local: '/admin/ci-templates/.build-mpi-template.yml'
     - local: '/admin/ci-templates/.build-gmxapi-template.yml'
     - local: '/admin/ci-templates/.regressiontest-template.yml'
index c7c8becb9bb24d3c9273a13e97748eb0ffafcbb4..b3d919a42332759dfb0a1202cc926149f7663f0a 100644 (file)
@@ -3,6 +3,8 @@
      KUBERNETES_CPU_LIMIT: 8
      KUBERNETES_CPU_REQUEST: 4
      KUBERNETES_MEMORY_LIMIT: 8Gi
+     KUBERNETES_EXTENDED_RESOURCE_NAME: ""
+     KUBERNETES_EXTENDED_RESOURCE_LIMIT: 0
      CACHE_FALLBACK_KEY: "$CI_JOB_NAME-$CI_JOB_STAGE-master"
      BUILD_DIR: build
      INSTALL_DIR: install
similarity index 62%
rename from admin/dockerfiles/ci-gcc-7/Dockerfile
rename to admin/dockerfiles/base/Dockerfile
index fc0c30ee4200708704b8c3ecc4137754211f45ec..25f8a637f8e6b859e3afc3a46ac49be70451404e 100644 (file)
@@ -4,30 +4,25 @@
 # Some optional GROMACS dependencies are obtained from the
 # distribution, e.g.  fftw3, hwloc, blas and lapack so that the build
 # is as fast as possible.
-FROM ubuntu:18.04 as ci-basic-dependencies
+FROM ubuntu:18.04
 ENV DEBIAN_FRONTEND=noninteractive
 WORKDIR /tmp
 RUN \
   apt-get update && \
-  apt-get install -y \
+  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
+    build-essential \
+    ccache \
     cmake \
     git \
-    ninja-build \
-    ccache \
-    build-essential \
-    wget \
-    moreutils \
-    rsync \
     libfftw3-dev \
     libhwloc-dev \
     liblapack-dev \
+    moreutils \
+    ninja-build \
+    python3-pip \
+    rsync \
+    wget \
     xsltproc \
-    python3-pip
-
-# Make an image that has the dependencies for building GROMACS with gcc-7.
-FROM ci-basic-dependencies as ci-gcc-7
-WORKDIR /tmp
-RUN apt-get -qqy --no-install-suggests --no-install-recommends install \
-  gcc-7 \
-  g++-7 && \
-  rm -rf /var/lib/apt/lists/*
+    && \
+  rm -rf /var/lib/apt/lists/* && \
+  rm -rf /var/cache/apt/archives/*
diff --git a/admin/dockerfiles/build.sh b/admin/dockerfiles/build.sh
deleted file mode 100755 (executable)
index a6f202e..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-if [ -z "$*" ]
-then
-    echo "usage: `basename "$0"` name-of-target"
-    exit
-fi
-
-docker login
-docker build $1 --target $1 -t gromacs/continuous-integration:$1
-docker push gromacs/continuous-integration:$1
diff --git a/admin/dockerfiles/buildall.sh b/admin/dockerfiles/buildall.sh
new file mode 100644 (file)
index 0000000..0e68cf6
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+export TARGET=$0
+export TARGET_VERSION=$1
+export MATRIX="$TARGET-$TARGET_VERSION"
+export SLUG="ci-$MATRIX"
+
+docker login
+
+docker pull gromacs/base || true
+docker build -t gromacs/base --cache-from gromacs/base base
+docker push gromacs/base
+
+tool=clang
+for tool_version in 6 7 8; do
+  MATRIX="$tool-$tool_version"
+  SLUG="ci-$MATRIX"
+  docker build \
+    -t gromacs/continuous-integration:$SLUG \
+    --build-arg TOOL_VERSION=$tool_version \
+    ci-$tool
+done
+
+tool=gcc
+for tool_version in 5 6 7 8; do
+  MATRIX="$tool-$tool_version"
+  SLUG="ci-$MATRIX"
+  docker build \
+    -t gromacs/continuous-integration:$SLUG \
+    --build-arg TOOL_VERSION=$tool_version \
+    ci-$tool
+done
+
+docker build -t gromacs/continuous-integration:ci-docs-clang \
+             ci-docs-clang
+
+docker build -t gromacs/continuous-integration:ci-docs-gcc \
+             ci-docs-gcc
+
+docker push gromacs/continuous-integration
diff --git a/admin/dockerfiles/ci-clang-6/Dockerfile b/admin/dockerfiles/ci-clang-6/Dockerfile
deleted file mode 100644 (file)
index 3af8888..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-# Make an image that has the basic dependencies for building GROMACS.
-# This is the same for all other build images and gets used by those.
-
-# Some optional GROMACS dependencies are obtained from the
-# distribution, e.g.  fftw3, hwloc, blas and lapack so that the build
-# is as fast as possible.
-FROM ubuntu:18.04 as ci-basic-dependencies
-ENV DEBIAN_FRONTEND=noninteractive
-WORKDIR /tmp
-RUN \
-  apt-get update && \
-  apt-get install -y \
-    cmake \
-    git \
-    ninja-build \
-    ccache \
-    build-essential \
-    wget \
-    moreutils \
-    rsync \
-    libfftw3-dev \
-    libhwloc-dev \
-    liblapack-dev \
-    xsltproc \
-    python3-pip
-
-# Make an image that has the dependencies for building GROMACS with clang-6.
-FROM ci-basic-dependencies as ci-clang-6
-WORKDIR /tmp
-RUN \
-  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
-    apt-utils \
-    software-properties-common \
-    gpg-agent && \
-  wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \
-  apt-add-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-6.0 main" && \
-  apt-get -qq update && \
-  apt-get -qqy --no-install-suggests --no-install-recommends install \
-    clang++-6.0 \
-    clang-tools-6.0 \
-    libomp-dev && \
-  rm -rf /var/lib/apt/lists/*
diff --git a/admin/dockerfiles/ci-clang-7/Dockerfile b/admin/dockerfiles/ci-clang-7/Dockerfile
deleted file mode 100644 (file)
index 1599d58..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-# Make an image that has the basic dependencies for building GROMACS.
-# This is the same for all other build images and gets used by those.
-
-# Some optional GROMACS dependencies are obtained from the
-# distribution, e.g.  fftw3, hwloc, blas and lapack so that the build
-# is as fast as possible.
-FROM ubuntu:18.04 as ci-basic-dependencies
-ENV DEBIAN_FRONTEND=noninteractive
-WORKDIR /tmp
-RUN \
-  apt-get update && \
-  apt-get install -y \
-    cmake \
-    git \
-    ninja-build \
-    ccache \
-    build-essential \
-    wget \
-    moreutils \
-    rsync \
-    libfftw3-dev \
-    libhwloc-dev \
-    liblapack-dev \
-    xsltproc \
-    python3-pip
-
-# Make an image that has the dependencies for building GROMACS with clang-7.
-FROM ci-basic-dependencies as ci-clang-7
-WORKDIR /tmp
-RUN \
-  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
-    apt-utils \
-    software-properties-common \
-    gpg-agent && \
-  wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \
-  apt-add-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-7 main" && \
-  apt-get -qq update && \
-  apt-get -qqy --no-install-suggests --no-install-recommends install \
-    clang++-7 \
-    clang-tools-7 \
-    libomp-dev && \
-  rm -rf /var/lib/apt/lists/*
diff --git a/admin/dockerfiles/ci-clang-8/Dockerfile b/admin/dockerfiles/ci-clang-8/Dockerfile
deleted file mode 100644 (file)
index bf33db1..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-# Make an image that has the basic dependencies for building GROMACS.
-# This is the same for all other build images and gets used by those.
-
-# Some optional GROMACS dependencies are obtained from the
-# distribution, e.g.  fftw3, hwloc, blas and lapack so that the build
-# is as fast as possible.
-FROM ubuntu:18.04 as ci-basic-dependencies
-ENV DEBIAN_FRONTEND=noninteractive
-WORKDIR /tmp
-RUN \
-  apt-get update && \
-  apt-get install -y \
-    cmake \
-    git \
-    ninja-build \
-    ccache \
-    build-essential \
-    wget \
-    moreutils \
-    rsync \
-    libfftw3-dev \
-    libhwloc-dev \
-    liblapack-dev \
-    xsltproc \
-    python3-pip
-
-# Make an image that has the dependencies for building GROMACS with clang-8.
-FROM ci-basic-dependencies as ci-clang-8
-WORKDIR /tmp
-RUN \
-  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
-    apt-utils \
-    software-properties-common \
-    gpg-agent && \
-  wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \
-  apt-add-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-8 main" && \
-  apt-get -qq update && \
-  apt-get -qqy --no-install-suggests --no-install-recommends install \
-    clang++-8 \
-    clang-tools-8 \
-    libomp-dev && \
-  rm -rf /var/lib/apt/lists/*
diff --git a/admin/dockerfiles/ci-clang/Dockerfile b/admin/dockerfiles/ci-clang/Dockerfile
new file mode 100644 (file)
index 0000000..54f6e3b
--- /dev/null
@@ -0,0 +1,28 @@
+# Make an image that has the dependencies for building GROMACS with clang.
+# Note when specifying TOOL_VERSION that clang 6.0 packages use the minor version
+# in the name, while 7 and 8 do not.
+FROM gromacs/base
+WORKDIR /tmp
+ARG TOOL_VERSION
+RUN \
+  apt-get update && \
+  apt_version=$TOOL_VERSION && \
+  if [ "$TOOL_VERSION" -lt "7" ] ; then apt_version="$apt_version.0"; fi && \
+  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
+    apt-utils \
+    software-properties-common \
+    gpg-agent && \
+  wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \
+  apt-add-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-$apt_version main" && \
+  apt-get -qq update && \
+  apt-get -qqy --no-install-suggests --no-install-recommends install \
+    clang++-$apt_version \
+    clang-tools-$apt_version \
+    libomp-dev && \
+  if [ "$apt_version" != "$TOOL_VERSION" ] ; then \
+    ln -s /usr/bin/clang-$apt_version /usr/bin/clang-$TOOL_VERSION; \
+    ln -s /usr/bin/clang++-$apt_version /usr/bin/clang++-$TOOL_VERSION; \
+    ln -s /usr/bin/clang-format-$apt_version /usr/bin/clang-format-$TOOL_VERSION; \
+    ln -s /usr/bin/clang-tidy-$apt_version /usr/bin/clang-tidy-$TOOL_VERSION; fi && \
+  rm -rf /var/lib/apt/lists/* && \
+  rm -rf /var/cache/apt/archives/*
diff --git a/admin/dockerfiles/ci-docs-clang/Dockerfile b/admin/dockerfiles/ci-docs-clang/Dockerfile
new file mode 100644 (file)
index 0000000..deaa2fb
--- /dev/null
@@ -0,0 +1,55 @@
+# Make an image that has the dependencies for building GROMACS documentation.
+
+# Make an intermediate image that can build a static Doxygen 1.8.5 that other
+# containers will be able to use.
+
+FROM ubuntu:18.04 as doxygen-builder
+ENV DEBIAN_FRONTEND=noninteractive
+WORKDIR /tmp
+RUN \
+  apt-get update && \
+  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
+      bison \
+      build-essential \
+      gcc \
+      m4 \
+      wget \
+  && \
+  wget --no-check-certificate https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/flex/2.5.35-10ubuntu3/flex_2.5.35.orig.tar.gz && \
+  tar xf flex_2.5.35.orig.tar.gz && \
+  cd flex-2.5.35 && \
+  ./configure --prefix=/tmp/install-of-flex --disable-shared && \
+  make -j && make install && cd .. && rm -rf flex* && \
+  wget --no-check-certificate https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/doxygen/1.8.5-1/doxygen_1.8.5.orig.tar.gz && \
+  tar xf doxygen_1.8.5.orig.tar.gz && \
+  cd doxygen-1.8.5 && \
+  ./configure --flex /tmp/install-of-flex/bin/flex --static && \
+  make -j && make install && cd .. && rm -rf doxygen* && \
+  rm -rf /var/lib/apt/lists/*
+
+# The ImageMagick package from apt has highly secure settings by
+# default, suitable for use behind a webserver, which we don't
+# need. So we use sed to remove those.
+# We also install it separatly because it pulls in some dependencies
+# that are needed for the documentation build.
+
+FROM gromacs/continuous-integration:ci-clang-7
+WORKDIR /tmp
+COPY --from=doxygen-builder /usr/local/bin/* /usr/local/bin/
+RUN \
+  apt-get update && \
+  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
+    graphviz \
+    linkchecker \
+    mscgen \
+    texlive-latex-base \
+    texlive-latex-extra \
+    texlive-fonts-recommended \
+    texlive-fonts-extra && \
+  apt-get -y install imagemagick && \
+  rm -rf /var/lib/apt/lists/*
+RUN \
+  sed -i \
+    '/\"XPS\"/d;/\"PDF\"/d;/\"PS\"/d;/\"EPS\"/d;/disable ghostscript format types/d' \
+    /etc/ImageMagick-6/policy.xml && \
+  pip3 install sphinx==1.6.1
diff --git a/admin/dockerfiles/ci-docs-gcc/Dockerfile b/admin/dockerfiles/ci-docs-gcc/Dockerfile
new file mode 100644 (file)
index 0000000..b9c85a9
--- /dev/null
@@ -0,0 +1,55 @@
+# Make an image that has the dependencies for building GROMACS documentation.
+
+# Make an intermediate image that can build a static Doxygen 1.8.5 that other
+# containers will be able to use.
+
+FROM ubuntu:18.04 as doxygen-builder
+ENV DEBIAN_FRONTEND=noninteractive
+WORKDIR /tmp
+RUN \
+  apt-get update && \
+  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
+      bison \
+      build-essential \
+      gcc \
+      m4 \
+      wget \
+  && \
+  wget --no-check-certificate https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/flex/2.5.35-10ubuntu3/flex_2.5.35.orig.tar.gz && \
+  tar xf flex_2.5.35.orig.tar.gz && \
+  cd flex-2.5.35 && \
+  ./configure --prefix=/tmp/install-of-flex --disable-shared && \
+  make -j && make install && cd .. && rm -rf flex* && \
+  wget --no-check-certificate https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/doxygen/1.8.5-1/doxygen_1.8.5.orig.tar.gz && \
+  tar xf doxygen_1.8.5.orig.tar.gz && \
+  cd doxygen-1.8.5 && \
+  ./configure --flex /tmp/install-of-flex/bin/flex --static && \
+  make -j && make install && cd .. && rm -rf doxygen* && \
+  rm -rf /var/lib/apt/lists/*
+
+# The ImageMagick package from apt has highly secure settings by
+# default, suitable for use behind a webserver, which we don't
+# need. So we use sed to remove those.
+# We also install it separatly because it pulls in some dependencies
+# that are needed for the documentation build.
+
+FROM gromacs/continuous-integration:ci-gcc-7
+WORKDIR /tmp
+COPY --from=doxygen-builder /usr/local/bin/* /usr/local/bin/
+RUN \
+  apt-get update && \
+  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
+    graphviz \
+    linkchecker \
+    mscgen \
+    texlive-latex-base \
+    texlive-latex-extra \
+    texlive-fonts-recommended \
+    texlive-fonts-extra && \
+  apt-get -y install imagemagick && \
+  rm -rf /var/lib/apt/lists/*
+RUN \
+  sed -i \
+    '/\"XPS\"/d;/\"PDF\"/d;/\"PS\"/d;/\"EPS\"/d;/disable ghostscript format types/d' \
+    /etc/ImageMagick-6/policy.xml && \
+  pip3 install sphinx==1.6.1
diff --git a/admin/dockerfiles/ci-docs/Dockerfile b/admin/dockerfiles/ci-docs/Dockerfile
deleted file mode 100644 (file)
index d5da0ae..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-# Make an image that has the basic dependencies for building GROMACS.
-# This is the same for all other build images and gets used by those.
-
-# Some optional GROMACS dependencies are obtained from the
-# distribution, e.g.  fftw3, hwloc, blas and lapack so that the build
-# is as fast as possible.
-FROM ubuntu:18.04 as ci-basic-dependencies
-ENV DEBIAN_FRONTEND=noninteractive
-WORKDIR /tmp
-RUN \
-  apt-get update && \
-  apt-get install -y \
-    cmake \
-    git \
-    ninja-build \
-    ccache \
-    build-essential \
-    wget \
-    moreutils \
-    rsync \
-    libfftw3-dev \
-    libhwloc-dev \
-    liblapack-dev \
-    xsltproc \
-    python3-pip
-
-# Make an image that has the dependencies for building GROMACS with clang-7.
-FROM ci-basic-dependencies as ci-clang-7
-WORKDIR /tmp
-RUN \
-  apt-get -y -q=2 --no-install-suggests --no-install-recommends install \
-    apt-utils \
-    software-properties-common \
-    gpg-agent && \
-  wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \
-  apt-add-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-7 main" && \
-  apt-get -qq update && \
-  apt-get -qqy --no-install-suggests --no-install-recommends install \
-    clang++-7 \
-    clang-tools-7 \
-    libomp-dev && \
-  rm -rf /var/lib/apt/lists/*
-
-# Make a container that can build a static Doxygen 1.8.5 that other
-# containers will be able to use.
-
-FROM ubuntu:18.04 as doxygen-builder
-ENV DEBIAN_FRONTEND=noninteractive
-WORKDIR /tmp
-RUN apt-get install -y \
-  gcc \
-  build-essential \
-  m4 \
-  bison \
-  wget && \
-  wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/flex/2.5.35-10ubuntu3/flex_2.5.35.orig.tar.gz && \
-  tar xf flex_2.5.35.orig.tar.gz && \
-  cd flex-2.5.35 && \
-  ./configure --prefix=/tmp/install-of-flex --disable-shared && \
-  make -j && make install && cd .. && rm -rf flex* && \
-  wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/doxygen/1.8.5-1/doxygen_1.8.5.orig.tar.gz && \
-  tar xf doxygen_1.8.5.orig.tar.gz && \
-  cd doxygen-1.8.5 && \
-  ./configure --flex /tmp/install-of-flex/bin/flex --static && \
-  make -j && make install && cd .. && rm -rf doxygen*
-
-# Make an image that has the dependencies for building GROMACS documentation.
-
-# The ImageMagick package from apt has highly secure settings by
-# default, suitable for use behind a webserver, which we don't
-# need. So we use sed to remove those.
-
-# Some optional GROMACS dependencies are obtained from the
-# distribution, e.g.  fftw3, hwloc, blas and lapack so that the build
-# is as fast as possible.
-
-FROM ci-clang-7 as ci-docs
-WORKDIR /tmp
-COPY --from=doxygen-builder /usr/local/bin/* /usr/local/bin/
-RUN apt-get install -y \
-  texlive-latex-base \
-  texlive-fonts-recommended \
-  texlive-fonts-extra \
-  texlive-latex-extra &&
-  apt-get install -y \
-    graphviz \
-    imagemagick \
-    linkchecker \
-    mscgen && \
-  sed -i \
-    '/\"XPS\"/d;/\"PDF\"/d;/\"PS\"/d;/\"EPS\"/d;/disable ghostscript format types/d' \
-    /etc/ImageMagick-6/policy.xml && \
-  pip3 install sphinx==1.6.1 && \
-  rm -rf /var/lib/apt/lists/*
diff --git a/admin/dockerfiles/ci-gcc-5/Dockerfile b/admin/dockerfiles/ci-gcc-5/Dockerfile
deleted file mode 100644 (file)
index 0b20d70..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-# Make an image that has the basic dependencies for building GROMACS.
-# This is the same for all other build images and gets used by those.
-
-# Some optional GROMACS dependencies are obtained from the
-# distribution, e.g.  fftw3, hwloc, blas and lapack so that the build
-# is as fast as possible.
-FROM ubuntu:18.04 as ci-basic-dependencies
-ENV DEBIAN_FRONTEND=noninteractive
-WORKDIR /tmp
-RUN \
-  apt-get update && \
-  apt-get install -y \
-    cmake \
-    git \
-    ninja-build \
-    ccache \
-    build-essential \
-    wget \
-    moreutils \
-    rsync \
-    libfftw3-dev \
-    libhwloc-dev \
-    liblapack-dev \
-    xsltproc \
-    python3-pip
-
-# Make an image that has the dependencies for building GROMACS with gcc-5.
-FROM ci-basic-dependencies as ci-gcc-5
-WORKDIR /tmp
-RUN apt-get -qqy --no-install-suggests --no-install-recommends install \
-  gcc-5 \
-  g++-5 && \
-  rm -rf /var/lib/apt/lists/*
diff --git a/admin/dockerfiles/ci-gcc-6/Dockerfile b/admin/dockerfiles/ci-gcc-6/Dockerfile
deleted file mode 100644 (file)
index be3c8bc..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-# Make an image that has the basic dependencies for building GROMACS.
-# This is the same for all other build images and gets used by those.
-
-# Some optional GROMACS dependencies are obtained from the
-# distribution, e.g.  fftw3, hwloc, blas and lapack so that the build
-# is as fast as possible.
-FROM ubuntu:18.04 as ci-basic-dependencies
-ENV DEBIAN_FRONTEND=noninteractive
-WORKDIR /tmp
-RUN \
-  apt-get update && \
-  apt-get install -y \
-    cmake \
-    git \
-    ninja-build \
-    ccache \
-    build-essential \
-    wget \
-    moreutils \
-    rsync \
-    libfftw3-dev \
-    libhwloc-dev \
-    liblapack-dev \
-    xsltproc \
-    python3-pip
-
-# Make an image that has the dependencies for building GROMACS with gcc-6.
-FROM ci-basic-dependencies as ci-gcc-6
-WORKDIR /tmp
-RUN apt-get -qqy --no-install-suggests --no-install-recommends install \
-  gcc-6 \
-  g++-6 && \
-  rm -rf /var/lib/apt/lists/*
similarity index 87%
rename from admin/dockerfiles/ci-gcc-8/Dockerfile
rename to admin/dockerfiles/ci-gcc-8-cuda-10.2/Dockerfile
index 30f9a30482ab3226e60fb991a3d9e43279f1a8e8..86d22999c487ce8cb1563e55d15bc6ba705fd34c 100644 (file)
@@ -4,7 +4,7 @@
 # Some optional GROMACS dependencies are obtained from the
 # distribution, e.g.  fftw3, hwloc, blas and lapack so that the build
 # is as fast as possible.
-FROM ubuntu:18.04 as ci-basic-dependencies
+FROM nvidia/cuda:10.2-devel as cuda-ci-basic-dependencies
 ENV DEBIAN_FRONTEND=noninteractive
 WORKDIR /tmp
 RUN \
@@ -25,7 +25,7 @@ RUN \
     python3-pip
 
 # Make an image that has the dependencies for building GROMACS with gcc-8.
-FROM ci-basic-dependencies as ci-gcc-8
+FROM cuda-ci-basic-dependencies as ci-gcc-8-cuda-10.2
 WORKDIR /tmp
 RUN apt-get -qqy --no-install-suggests --no-install-recommends install \
   gcc-8 \
diff --git a/admin/dockerfiles/ci-gcc/Dockerfile b/admin/dockerfiles/ci-gcc/Dockerfile
new file mode 100644 (file)
index 0000000..a7ac7e7
--- /dev/null
@@ -0,0 +1,13 @@
+# Make an image that has the dependencies for building GROMACS with gcc.
+
+
+FROM gromacs/base
+WORKDIR /tmp
+ARG TOOL_VERSION
+RUN \
+  apt-get update && \
+  apt-get -qqy --no-install-suggests --no-install-recommends install \
+      gcc-$TOOL_VERSION \
+      g++-$TOOL_VERSION && \
+  rm -rf /var/lib/apt/lists/* && \
+  rm -rf /var/cache/apt/archives/*
index 9a90b88bf5a739526c38fd73ce89d7057e6dda23..88b90f25f9421170f3125de52baceb39463494ff 100644 (file)
@@ -126,7 +126,9 @@ function (gmx_cpack_write_config)
         \\\\.gitattributes
         INSTALL-dev
         cmake/FindCUDA\\\\.cmake
-        cmake/FindCUDA)
+        cmake/FindCUDA
+        # entry below is needed for CI not to include the cache directory
+        ccache)
     set(CPACK_SOURCE_IGNORE_FILES ${FILES_NOT_INCLUDED_IN_SOURCE_PACKAGE})
 
     # Get the list of directories added with gmx_cpack_add_generated_source_directory()
diff --git a/cmake/gmxGenerateVersionInfoRelease.cmake b/cmake/gmxGenerateVersionInfoRelease.cmake
new file mode 100644 (file)
index 0000000..9810748
--- /dev/null
@@ -0,0 +1,135 @@
+#
+# 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.
+
+# Generate GROMACS release build version information, as well as build
+# directory integrity checking.
+
+# This script generates version information for a build from a release tarball
+# source tree based on the release information in the released tarball.
+# It is assumed that by default the script is run in cmake script mode.
+# If *not* called in script mode but used in generating cache variables,
+# 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
+#
+# 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.
+# Output:
+# VERSION_OUT is configured from the input VERSION_CMAKEIN
+# using the variables listed below.
+#
+# GMX_VERSION_STRING_FULL       - version string
+# GMX_RELEASE_SOURCE_FILE_CHECKSUM - Sha256 hash of source tree files at release
+# GMX_CURRENT_SOURCE_FILE_CHECKSUM - Sha256 hash of current source tree files
+#
+# Paul Bauer (paul.bauer.q@gmail.com)
+# (authors of git Version of the script that this is based on below)
+# Szilard Pall (pszilard@cbr.su.se)
+# Teemu Murtola (teemu.murtola@gmail.com)
+
+# Check input variables.
+if("${PROJECT_VERSION}" STREQUAL "")
+    message(FATAL_ERROR "PROJECT_VERSION undefined!")
+endif()
+if (NOT EXISTS "${PROJECT_SOURCE_DIR}")
+    message(FATAL_ERROR "Project source directory ${PROJECT_SOURCE_DIR} does not exist")
+endif()
+if ("${DIRECTORIES_TO_CHECKSUM}" STREQUAL "")
+    message(FATAL_ERROR "Need list of directories to generate the hash for")
+endif()
+if ("${VERSION_CMAKEIN}" STREQUAL "")
+    message(FATAL_ERROR "Missing input parameter VERSION_CMAKEIN!")
+endif()
+if ("${VERSION_OUT}" STREQUAL "")
+    message(FATAL_ERROR "Missing input parameter VERSION_OUT!")
+endif()
+
+# Prepare version string to populate
+set(GMX_VERSION_STRING_FULL          ${PROJECT_VERSION})
+
+# We had to pass the directory list as a string, so now we convert it back to a list
+string(REPLACE ":" ";" DIRECTORIES_TO_CHECKSUM_LIST ${DIRECTORIES_TO_CHECKSUM})
+
+# Prepare for checking source tree file hashes.
+# To notify the user during compilation and at runtime that the build source
+# has not been modified after unpacking the source tarball, the contents are hashed
+# to be compared to a hash computed during the release process. If the hash matches
+# all is fine and the user gets a message in the log file indicating that.
+# If either the release hash file is missing, or if the hash does not match
+# a different message is printed to indicate that the source has been changed
+# compared to the version actually released. This is not needed in case a build
+# is done in git, as we have the information there already.
+# This is not done if the user has explicitly set an additional custom version string with
+# -DGMX_VERSION_STRING_OF_FORK, as this indicates that they are knowing that a custom
+# version of GROMACS is in use.
+set(RELEASE_CHECKSUM_FILE "${PROJECT_SOURCE_DIR}/src/reference_checksum")
+if(NOT VERSION_STRING_OF_FORK OR "${VERSION_STRING_OF_FORK}" STREQUAL "")
+    if(EXISTS ${RELEASE_CHECKSUM_FILE} AND PYTHON_EXECUTABLE)
+        file(READ ${RELEASE_CHECKSUM_FILE} GMX_RELEASE_SOURCE_FILE_CHECKSUM)
+        string(STRIP ${GMX_RELEASE_SOURCE_FILE_CHECKSUM} GMX_RELEASE_SOURCE_FILE_CHECKSUM)
+        set(CHECKSUM_RESULT_FILE "${CMAKE_CURRENT_BINARY_DIR}/computed_checksum")
+        execute_process(COMMAND ${PYTHON_EXECUTABLE}
+                                ${PROJECT_SOURCE_DIR}/admin/createFileHash.py
+                                -s ${DIRECTORIES_TO_CHECKSUM_LIST}
+                                -o ${CHECKSUM_RESULT_FILE}
+                        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+                        OUTPUT_QUIET)
+                    file(READ ${CHECKSUM_RESULT_FILE} GMX_CURRENT_SOURCE_FILE_CHECKSUM)
+        string(STRIP ${GMX_CURRENT_SOURCE_FILE_CHECKSUM} GMX_CURRENT_SOURCE_FILE_CHECKSUM)
+        if(NOT ${GMX_RELEASE_SOURCE_FILE_CHECKSUM} STREQUAL ${GMX_CURRENT_SOURCE_FILE_CHECKSUM})
+            set(GMX_VERSION_STRING_FULL "${GMX_VERSION_STRING_FULL}-MODIFIED")
+            message(STATUS "The source code for this GROMACS installation is different from the officially released version.")
+        endif()
+    elseif(PYTHON_EXECUTABLE)
+        set(GMX_VERSION_STRING_FULL "${GMX_VERSION_STRING_FULL}-UNCHECKED")
+        set(GMX_RELEASE_SOURCE_FILE_CHECKSUM "NoChecksumFile")
+        set(GMX_CURRENT_SOURCE_FILE_CHECKSUM "NoChecksumFile")
+        message(WARNING "Could not valdiate the GROMACS source due to missing reference checksum file.")
+    else()
+        set(GMX_VERSION_STRING_FULL "${GMX_VERSION_STRING_FULL}-UNCHECKED")
+        set(GMX_RELEASE_SOURCE_FILE_CHECKSUM "NoPythonAvailable")
+        set(GMX_CURRENT_SOURCE_FILE_CHECKSUM "NoPythonAvailable")
+        message(STATUS "Could not calculate checksum of source files without Python")
+    endif()
+endif()
+
+# Generate the output file.
+configure_file(${VERSION_CMAKEIN} ${VERSION_OUT})
index 26ea22f6f74273174e751fa66e7fd4d85bb9a3e2..66bdd6e3157c1b7149d7cc25fabd78a0093221b9 100644 (file)
@@ -262,7 +262,7 @@ set(REGRESSIONTEST_BRANCH "refs/heads/master")
 # build the regressiontests tarball with all the right naming. The
 # naming affects the md5sum that has to go here, and if it isn't right
 # release workflow will report a failure.
-set(REGRESSIONTEST_MD5SUM "2fe8e35878bc9ee3cf60e92d5b250175" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
+set(REGRESSIONTEST_MD5SUM "b032e4517195b1f8cd9db87cee1b30df" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
 
 math(EXPR GMX_VERSION_NUMERIC
      "${GMX_VERSION_MAJOR}*10000 + ${GMX_VERSION_PATCH}")
@@ -335,6 +335,8 @@ set(VERSION_INFO_CONFIGURE_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/gmxConfigureVersionI
 # A set of directories to scan for calculating the hash of source files.
 set(SET_OF_DIRECTORIES_TO_CHECKSUM  "${PROJECT_SOURCE_DIR}/src")
 list(APPEND SET_OF_DIRECTORIES_TO_CHECKSUM "${PROJECT_SOURCE_DIR}/python_packaging")
+# Due to the limitations for passing a list as arguments, we make the directories a string here
+string(REPLACE ";" ":" DIRECTORIES_TO_CHECKSUM_STRING "${SET_OF_DIRECTORIES_TO_CHECKSUM}")
 # Try to find python for the checksumming script
 set(PythonInterp_FIND_QUIETLY ON)
 find_package(PythonInterp 3.5)
@@ -365,18 +367,19 @@ find_package(PythonInterp 3.5)
 #        - These are again custom commands that depend on the output from
 #          step 1, so they get regenerated only when the static version info
 #          changes.
+
+# Configure information known at this time into a partially filled
+# version info file.
+set(VERSION_INFO_CMAKEIN_FILE_PARTIAL
+    ${PROJECT_BINARY_DIR}/VersionInfo-partial.cmake.cmakein)
+# Leave these to be substituted by the targets below.
+set(GMX_VERSION_STRING_FULL       "\@GMX_VERSION_STRING_FULL\@")
+
 if (GMX_GIT_VERSION_INFO)
-    # Configure information known at this time into a partially filled
-    # version info file.
-    set(VERSION_INFO_CMAKEIN_FILE_PARTIAL
-        ${PROJECT_BINARY_DIR}/VersionInfo-partial.cmake.cmakein)
     # Leave these to be substituted by the custom target below.
-    set(GMX_VERSION_STRING_FULL       "\@GMX_VERSION_STRING_FULL\@")
+    # Specific for building from git.
     set(GMX_VERSION_FULL_HASH         "\@GMX_VERSION_FULL_HASH\@")
     set(GMX_VERSION_CENTRAL_BASE_HASH "\@GMX_VERSION_CENTRAL_BASE_HASH\@")
-    configure_file(${VERSION_INFO_CMAKEIN_FILE}
-                   ${VERSION_INFO_CMAKEIN_FILE_PARTIAL}
-                   @ONLY)
     # If generating the version info, create a target that runs on every build
     # and does the actual git calls, storing the results into a CMake script.
     # This needs to be run at build time to update the version information
@@ -397,54 +400,28 @@ if (GMX_GIT_VERSION_INFO)
         COMMENT "Generating git version information")
     list(APPEND VERSION_INFO_DEPS git-version-info)
 else()
-    # If the version info is static, just generate the CMake script with the
-    # version variables during the CMake run.
-    set(GMX_VERSION_STRING_FULL       ${GMX_VERSION_STRING})
-    set(GMX_VERSION_FULL_HASH         "")
-    set(GMX_VERSION_CENTRAL_BASE_HASH "")
-    # To notify the user during compilation and at runtime that the build source
-    # has not been modified after unpacking the source tarball, the contents are hashed
-    # to be compared to a hash computed during the release process. If the hash matches
-    # all is fine and the user gets a message in the log file indicating that.
-    # If either the release hash file is missing, or if the hash does not match
-    # a different message is printed to indicate that the source has been changed
-    # compared to the version actually released. This is not needed in case a build
-    # is done in git, as we have the information there already.
-    # This is not done if the user has explicitly set an additional custom version string with
-    # -DGMX_VERSION_STRING_OF_FORK, as this indicates that they are knowing that a custom
-    # version of GROMACS is in use.
-    set(RELEASE_CHECKSUM_FILE "${PROJECT_SOURCE_DIR}/src/reference_checksum")
-    if(NOT GMX_VERSION_STRING_OF_FORK OR "${GMX_VERSION_STRING_OF_FORK}" STREQUAL "")
-        if(EXISTS ${RELEASE_CHECKSUM_FILE} AND PythonInterp_FOUND)
-            file(READ ${RELEASE_CHECKSUM_FILE} GMX_RELEASE_SOURCE_FILE_CHECKSUM)
-            string(STRIP ${GMX_RELEASE_SOURCE_FILE_CHECKSUM} GMX_RELEASE_SOURCE_FILE_CHECKSUM)
-            set(CHECKSUM_RESULT_FILE "${CMAKE_CURRENT_BINARY_DIR}/computed_checksum")
-            execute_process(COMMAND ${PYTHON_EXECUTABLE} 
-                                    ${PROJECT_SOURCE_DIR}/admin/createFileHash.py
-                                    -s ${SET_OF_DIRECTORIES_TO_CHECKSUM}
-                                    -o ${CHECKSUM_RESULT_FILE}
-                            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-                            OUTPUT_QUIET)
-                        file(READ ${CHECKSUM_RESULT_FILE} GMX_CURRENT_SOURCE_FILE_CHECKSUM)
-            string(STRIP ${GMX_CURRENT_SOURCE_FILE_CHECKSUM} GMX_CURRENT_SOURCE_FILE_CHECKSUM)
-            if(NOT ${GMX_RELEASE_SOURCE_FILE_CHECKSUM} STREQUAL ${GMX_CURRENT_SOURCE_FILE_CHECKSUM})
-                set(GMX_VERSION_STRING_FULL "${GMX_VERSION_STRING_FULL}-MODIFIED")
-                message(STATUS "The source code for this GROMACS installation is different from the officially released version.")
-            endif()
-        elseif(PythonInterp_FOUND)
-            set(GMX_VERSION_STRING_FULL "${GMX_VERSION_STRING_FULL}-UNCHECKED")
-            set(GMX_RELEASE_SOURCE_FILE_CHECKSUM "NoChecksumFile")
-            set(GMX_CURRENT_SOURCE_FILE_CHECKSUM "NoChecksumFile")
-            message(WARNING "Could not valdiate the GROMACS source due to missing reference checksum file.")
-        else()
-            set(GMX_VERSION_STRING_FULL "${GMX_VERSION_STRING_FULL}-UNCHECKED")
-            set(GMX_RELEASE_SOURCE_FILE_CHECKSUM "NoPythonAvailable")
-            set(GMX_CURRENT_SOURCE_FILE_CHECKSUM "NoPythonAvailable")
-            message(STATUS "Could not calculate checksum of source files without Python")
-        endif()
-    endif()
-    configure_file(${VERSION_INFO_CMAKEIN_FILE} ${VERSION_INFO_CMAKE_FILE})
+    # Leave these to be substituted by the custom target below.
+    # Specific for building from source tarball.
+    set(GMX_RELEASE_SOURCE_FILE_CHECKSUM "\@GMX_RELEASE_SOURCE_FILE_CHECKSUM\@")
+    set(GMX_CURRENT_SOURCE_FILE_CHECKSUM "\@GMX_CURRENT_SOURCE_FILE_CHECKSUM\@")
+    gmx_add_custom_output_target(release-version-info RUN_ALWAYS
+        OUTPUT ${VERSION_INFO_CMAKE_FILE}
+        COMMAND ${CMAKE_COMMAND}
+            -D PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
+            -D PROJECT_VERSION=${GMX_VERSION_STRING}
+            -D PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
+            -D DIRECTORIES_TO_CHECKSUM=${DIRECTORIES_TO_CHECKSUM_STRING}
+            -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}
+            -P ${CMAKE_CURRENT_LIST_DIR}/gmxGenerateVersionInfoRelease.cmake
+        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+        COMMENT "Generating release version information")
+    list(APPEND VERSION_INFO_DEPS release-version-info)
 endif()
+configure_file(${VERSION_INFO_CMAKEIN_FILE}
+               ${VERSION_INFO_CMAKEIN_FILE_PARTIAL}
+               @ONLY)
 unset(GMX_VERSION_STRING_FULL)
 unset(GMX_VERSION_FULL_HASH)
 unset(GMX_VERSION_CENTRAL_BASE_HASH)
index d900ca80b4d0355415d646e23b648c68b059a586..932ba838fb1531184e6fd9c2c8a98a5191f49c04 100644 (file)
@@ -374,6 +374,7 @@ if (SPHINX_FOUND)
         release-notes/2021/major/portability.rst
         release-notes/2021/major/miscellaneous.rst
         release-notes/2020/2020.1.rst
+        release-notes/2020/2020.2.rst
         release-notes/2020/major/highlights.rst
         release-notes/2020/major/features.rst
         release-notes/2020/major/performance.rst
index 50c468210e854dbf3f59c3b212adbe5e0eab7458..1d97c22e85643081990e1beb50afdc3a6cffe922 100644 (file)
@@ -21,3 +21,11 @@ GPU emulation does not work
 The non-bonded GPU emulation mode does not work, at least for builds
 with GPU support; then a GPU setup call is called.
 Also dynamic pruning needs to be implemented for GPU emulation.
+
+OpenCL on NVIDIA Volta and later broken
+---------------------------------------
+
+The OpenCL code produces incorrect results on Volta and Turing GPU architectures
+from NVIDIA (CC 7.0 and 7.5). This is an issue that affects certain flavors of 
+the nonboded kernels, most likely a result of miscompilation, and there is no
+known workaround.
index 5218a809e991b2b3b02441cbd8fcfb66d1104bf2..bf676ce57fabaa607f3c24289694f4cc0f4d05a6 100644 (file)
@@ -1,7 +1,7 @@
 GROMACS 2019.6 release notes
 ----------------------------
 
-This version was released on TODO, 2020. These release notes
+This version was released on February 28th, 2020. These release notes
 document the changes that have taken place in GROMACS since the
 previous 2019.5 version, to fix known issues. It also incorporates all
 fixes made in version 2018.8 and earlier, which you can find described
@@ -16,9 +16,40 @@ in the :ref:`release-notes`.
 Fixes where mdrun could behave incorrectly
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+Actually fix PME forces with FE without perturbed q/LJ
+""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+PME would incorrectly ignore the mesh forces on perturbed atoms when
+no charges or LJ atom types were actually perturbed. Note that this
+is a rather uncommon scenario.
+
+:issue:`2640`
+:issue:`3359`
+
+Avoid overzealous program abort with orientation restraints
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+It could happen that mdrun would abort on checking orientation
+restraints in multiple molecules even though no restraints where
+applied to them.
+
+:issue:`3375`
+
+Calculate Coulomb and LJ reciprocal terms in rerun
+""""""""""""""""""""""""""""""""""""""""""""""""""
+
+Reruns would not calculate Coulomb and LJ reciprocal terms, leading
+to wrong potential energies. This bug only showed up if GROMACS was
+compiled without GPU support.
+
+:issue:`3400`
+
 Fixes for ``gmx`` tools
 ^^^^^^^^^^^^^^^^^^^^^^^
 
+Added check for inconsistent input of distance restraint labels
+in gmx disre.
+
 Fixes that affect portability
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
@@ -31,3 +62,9 @@ Compilation was failing with ``mcpcom: core dumped`` for the file :file:`pulluti
 Miscellaneous
 ^^^^^^^^^^^^^
 
+Avoid cryptic GPU detection errors when devices are unavailable or out of memory
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+:issue:`3178`
+:issue:`3399`
+
index f99a71ed906aed2185014073e0f796d10e39be86..534d10a0b2c2d385d0ecd466c18cf0aa8be10677 100644 (file)
@@ -1,10 +1,10 @@
 GROMACS 2020.1 release notes
 ----------------------------
 
-This version was released on TODO, 2020. These release notes
+This version was released on March 3rd, 2020. These release notes
 document the changes that have taken place in GROMACS since the
 previous 2020 version, to fix known issues. It also incorporates all
-fixes made in version 2019.5 and earlier, which you can find described
+fixes made in version 2019.6 and earlier, which you can find described
 in the :ref:`release-notes`.
 
 .. Note to developers!
@@ -46,6 +46,137 @@ in the MPI rank count even when the grid was specified by the user.
 
 :issue:`3336`
 
+Actually fix PME forces with FE without perturbed q/LJ
+""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+PME would incorrectly ignore the mesh forces on perturbed atoms when
+no charges or LJ atom types were actually perturbed. Note that this
+is a rather uncommon scenario.
+
+:issue:`2640`
+:issue:`3359`
+
+Avoid deadlock when checking for missing DD interactions
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+When missing bonded interactions after domain decomposition were detected,
+mdrun was deadlocking instead of exiting with a failure.
+
+:issue:`3373`
+
+Fix checkpoint restarts using Parrinello-Rahman and md-vv
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+Checkpoints using Parrinello-Rahman and md-vv (only implemented in
+the new modular simulator approach) could not be read.
+
+:issue:`3377`
+
+Avoid overzealous program abort with orientation restraints
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+It could happen that mdrun would abort on checking orientation restraints in multiple
+molecules even though no restraints where applied to them.
+
+:issue:`3375`
+
+Add fatal error for mdrun -multidir when simulations sharing state start at different step
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+When (re)starting mdrun -multidir for simulations sharing state data
+(e.g., replica exchange, AWH with bias sharing or NMR ensemble averaging)
+having a different initial step only caused a note to be printed, which
+could lead to simulations getting out of sync. Now a fatal error is issued
+in this situation.
+
+:issue:`2440`
+:issue:`3990`
+
+Correct skewed box using modular simulator without DD
+"""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+Using modular simulator without DD, it was not checked whether the box
+was getting overly skewed when using pressure control.
+
+:issue:`3383`
+
+Fix NMR restraints using modular simulator
+""""""""""""""""""""""""""""""""""""""""""
+
+Using NMR restraints (distance or orientation restraints) under modular simulator
+did not work as expected. All orientation restraint simulations would fail with a
+segmentation fault, as would distance restraint simulations using time averaging.
+All other distance restraint simulations would run correctly, but output to the
+energy trajectory would only occur if it coincided with general energy writing
+steps.
+
+:issue:`3388`
+
+Avoid integer overflow when using dispersion correction
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+A change in the integer type storing the index meant that the value could overflow
+and turn negative, leading to wrong lookup and unphysical values.
+
+:issue:`3391`
+
+Fix too small pairlist buffer on Intel GPUs
+"""""""""""""""""""""""""""""""""""""""""""
+
+The pairlist buffer generated for Intel GPUs was slightly too small,
+because it assumed a 4x4 atom-cluster pair kernel instead of 4x2.
+
+:issue:`3407`
+
+Fix checkpoint files getting out of sync with simulations sharing data
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+When simulations share data, e.g., replica exchange, AWH with bias sharing
+or NMR ensemble averaging, MPI barrier have now been added before renaming
+the checkpointing files to avoid that checkpoints files from the simulations
+can get out of sync. Now in very unlikely cases some checkpoint files might
+have temporary names, but all content will be in sync.
+
+:issue:`2440`
+
+Fix simulations using graph and modular simulations
+"""""""""""""""""""""""""""""""""""""""""""""""""""
+
+Simulations using modular simulator and a graph object would fail with a
+segmentation fault.
+
+:issue:`3389`
+
+Fix center of mass motion removal with frozen atoms
+"""""""""""""""""""""""""""""""""""""""""""""""""""
+
+When frozen atoms were part of center of mass motion removal groups,
+they would still contribute to the mass of those groups. This meant that
+the COM velocity correction was (slightly) too small. Now completely
+frozen atoms are removed from COM removal groups by grompp.
+When atoms are only frozen along one or two dimensions and part of
+a COM removal group, grompp now issues a warning.
+
+:issue:`2553`
+
+Fix temperature calculation when center of mass motion is removed for part of the system
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+In the uncommon case where the center of mass motion is removed for part of the system
+but not the whole system, the number of degrees of freedom for the part without
+COMM removal would be incorrectly lowered by 3.
+
+:issue:`3406`
+
+Fix possible issue with picking undefined NB kernel types
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+The CPU reference implementations for the NB kernels were missing some definitions for specific kernel
+types. This only affected installations that have SIMD explicitly turned off, something that is
+unlikely to happen in production environments.
+
+:issue:`2728`
+
 Fixes for ``gmx`` tools
 ^^^^^^^^^^^^^^^^^^^^^^^
 
@@ -58,6 +189,18 @@ Add support for ICC NextGen
 Add support for Intel Compiler based on LLVM technology.
 To compile GROMACS with this compiler use ``CXX=icpc CXXFLAGS=-qnextgen cmake``.
 
+Document known issues with OpenCL on Volta and Turing
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+:issue:`3125`
+
 Miscellaneous
 ^^^^^^^^^^^^^
 
+Fix check for modified source files in release tarballs
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""
+It could happen that modifications to the source tree were not picked
+up if they happened after the build directory had been generated.
+
+:issue:`3302`
+
diff --git a/docs/release-notes/2020/2020.2.rst b/docs/release-notes/2020/2020.2.rst
new file mode 100644 (file)
index 0000000..c793676
--- /dev/null
@@ -0,0 +1,27 @@
+GROMACS 2020.2 release notes
+----------------------------
+
+This version was released on TODO, 2020. These release notes
+document the changes that have taken place in GROMACS since the
+previous 2020.1 version, to fix known issues. It also incorporates all
+fixes made in version 2019.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 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
+^^^^^^^^^^^^^
+
index db768ddfee3518c6f9652e702a577725995913f2..e14445edff3449e15af46a14855d5d46832f3ecc 100644 (file)
@@ -52,6 +52,7 @@ Patch releases
    :maxdepth: 1
 
    2020/2020.1
+   2020/2020.2
 
 Major release
 ^^^^^^^^^^^^^
index 282fc9abd1c5efacfa38a8509ecfb0df52b31557..0070fa99137440112a43b50fbdc5581d935b970d 100644 (file)
@@ -3237,6 +3237,11 @@ electron-microscopy experiments. (See the `reference manual`_ for details)
       between reference density and simulated density as similarity measure.
       Negative density values are ignored.
 
+   .. mdp-value:: cross-correlation
+
+      Uses the Pearson correlation coefficient between reference density and
+      simulated density as similarity measure.
+
 .. mdp:: density-guided-simulation-atom-spreading-weight
 
    (unity) Determines the multiplication factor for the Gaussian kernel when
index ee1e4d0cbe7543df565db32a96615d838e735b8c..1769f8e4b4082aefa7d38d833d18d1448e425d88 100644 (file)
@@ -1086,8 +1086,6 @@ Known limitations
 
 **Please note again the limitations outlined below!**
 
-- PME GPU offload is supported on NVIDIA hardware with CUDA and AMD hardware with OpenCL.
-
 - Only a PME order of 4 is supported on GPUs.
 
 - PME will run on a GPU only when exactly one rank has a
@@ -1328,6 +1326,9 @@ Limitations in the current OpenCL support of interest to |Gromacs| users:
 - On NVIDIA GPUs the OpenCL kernels achieve much lower performance
   than the equivalent CUDA kernels due to limitations of the NVIDIA OpenCL
   compiler.
+- On the NVIDIA Volta an Turing architectures the OpenCL code is known to produce
+  incorrect results with driver version up to 440.x (most likely due to compiler issues).
+  Runs typically fail on these architectures.
 
 Limitations of interest to |Gromacs| developers:
 
index aa3accde0c7d34832f92b50c035d59f4999cd8ab..ccb1461e35c970a0cb5ea5e99076f31a2de957e1 100644 (file)
@@ -75,7 +75,7 @@ setenv GMXBIN ${GMXPREFIX}/@CMAKE_INSTALL_BINDIR@
 setenv GMXLDLIB ${GMXPREFIX}/@CMAKE_INSTALL_LIBDIR@
 setenv GMXMAN ${GMXPREFIX}/@CMAKE_INSTALL_MANDIR@
 setenv GMXDATA ${GMXPREFIX}/@GMX_INSTALL_GMXDATADIR@
-setenv GMXTOOLCHAINDIR=${GMXPREFIX}/@GMX_INSTALL_CMAKEDIR@
+setenv GMXTOOLCHAINDIR ${GMXPREFIX}/@GMX_INSTALL_CMAKEDIR@
 setenv GROMACS_DIR ${GMXPREFIX}
 
 #make them begin with :
index 60928caa4ec9723c5583257cf9d56710c94f62a8..53961ecd69071dd1c2929e27600d3ce377e36cf5 100644 (file)
  */
 #include <memory>
 
+#include "gromacs/compat/optional.h"
 #include "gromacs/math/functions.h"
 #include "gromacs/math/vectypes.h"
 #include "gromacs/restraint/restraintpotential.h"
-#include "gromacs/utility/arrayref.h"
-#include "gromacs/utility/classhelpers.h"
+#include "gromacs/utility.h"
 
 #include "gmxapi/context.h"
 #include "gmxapi/md.h"
@@ -84,11 +84,10 @@ public:
         // Note that evaluate gets called once for each site,
         // which is twice per time step for a pair restraint.
         // The following initialization logic is not atomic, but it is sufficient.
-        if (!isInitialized_)
+        if (!isInitialized())
         {
             // Force is also calculated for initial step.
             simulationStartTime_ = t;
-            isInitialized_       = true;
         }
         lastSimulationTime_ = t;
 
@@ -114,14 +113,14 @@ public:
     /*!
      * \brief Record the simulation time at the last step active.
      */
-    double lastSimulationTime_ = 0.;
+    gmx::compat::optional<double> lastSimulationTime_;
 
-private:
     /*!
-     * \brief Whether to consider current simulation time to be the start time.
+     * \brief Whether restraint was ever used
      */
-    bool isInitialized_ = false;
+    bool isInitialized() const { return lastSimulationTime_.has_value(); }
 
+private:
     /*!
      * \brief Handle through which to get signalling resources.
      */
@@ -155,16 +154,17 @@ public:
     //! \endcond
 
     /*!
-     * \brief Number of steps in which this restraint was active.
+     * \brief Last time this restraint was active, minus the simulation start time.
      *
-     * \return Number of MD time steps.
+     * \return Time elapsed since start.
      */
-    int numberOfTimesCalled() const
+    double timeElapsedSinceStart() const
     {
-        const auto timeElapsed = restraint_->lastSimulationTime_ - restraint_->simulationStartTime_;
-
-        const auto numSteps = timeElapsed / getTestStepSize();
-        return gmx::roundToInt(numSteps);
+        if (!restraint_->isInitialized())
+        {
+            GMX_THROW(gmx::InternalError("timeElapsedSinceStart called before restraint was used"));
+        }
+        return restraint_->lastSimulationTime_.value() - restraint_->simulationStartTime_;
     }
 
 private:
@@ -177,15 +177,17 @@ private:
  */
 TEST_F(GmxApiTest, ApiRunnerStopSignalClient)
 {
-    makeTprFile(3);
+    const int nsteps = 1;
+    makeTprFile(nsteps);
     auto system  = gmxapi::fromTprFile(runner_.tprFileName_);
     auto context = std::make_shared<gmxapi::Context>();
 
     // Check assumptions about basic simulation behavior.
     {
-        gmxapi::MDArgs args = makeMdArgs();
+        const int      nstlist = 1;
+        gmxapi::MDArgs args    = makeMdArgs();
         args.emplace_back("-nstlist");
-        args.emplace_back("1");
+        args.emplace_back(std::to_string(nstlist));
 
         context->setMDArgs(args);
 
@@ -195,12 +197,12 @@ TEST_F(GmxApiTest, ApiRunnerStopSignalClient)
         EXPECT_TRUE(session);
 
         gmxapi::addSessionRestraint(session.get(), restraint);
-        EXPECT_EQ(0, restraint->numberOfTimesCalled());
+        EXPECT_THROW(restraint->timeElapsedSinceStart(), gmx::InternalError);
 
         gmxapi::Status status;
         ASSERT_NO_THROW(status = session->run());
         EXPECT_TRUE(status.success());
-        EXPECT_EQ(3, restraint->numberOfTimesCalled());
+        EXPECT_EQ(nsteps, gmx::roundToInt(restraint->timeElapsedSinceStart() / getTestStepSize()));
 
         status = session->close();
         EXPECT_TRUE(status.success());
@@ -208,12 +210,13 @@ TEST_F(GmxApiTest, ApiRunnerStopSignalClient)
 
     // Make sure that stop signal shortens simulation.
     {
-        gmxapi::MDArgs args = makeMdArgs();
+        const int      nstlist = 1;
+        gmxapi::MDArgs args    = makeMdArgs();
         args.emplace_back("-nstlist");
-        args.emplace_back("1");
-        // TODO should use api functionality to extend simulation instead
+        args.emplace_back(std::to_string(nstlist));
+        // TODO (Ref #3256) use api functionality to extend simulation instead
         args.emplace_back("-nsteps");
-        args.emplace_back("6");
+        args.emplace_back(std::to_string(nsteps * 2));
 
         context->setMDArgs(args);
 
@@ -224,12 +227,20 @@ TEST_F(GmxApiTest, ApiRunnerStopSignalClient)
         EXPECT_TRUE(session);
 
         gmxapi::addSessionRestraint(session.get(), restraint);
-        EXPECT_EQ(0, restraint->numberOfTimesCalled());
+        EXPECT_THROW(restraint->timeElapsedSinceStart(), gmx::InternalError);
 
         gmxapi::Status status;
         ASSERT_NO_THROW(status = session->run());
         EXPECT_TRUE(status.success());
-        EXPECT_EQ(1, restraint->numberOfTimesCalled());
+        /* StopHandler promises to stop a simulation at the next NS step after the signal got communicated.
+         * We don't know the communication interval, but we know that it is at most nstlist. We cannot assume
+         * that the signal gets communicated on the step it is set, even if that step is a communication step.
+         * As the signal is set on the first step, we know that the restraint will be called at
+         * most 2*nstlist + 1 times.
+         * Since the time elapsed after the first step is 0, however, we expect the elapsed time
+         * divided by the step size to be at most 2*nstlist.
+         */
+        EXPECT_LE(gmx::roundToInt(restraint->timeElapsedSinceStart() / getTestStepSize()), 2 * nstlist);
 
         status = session->close();
         EXPECT_TRUE(status.success());
index e627bd2262e26bf1a6979702bc1a77c308255396..f2176f28287b3dbbba5fe8dc049052931943c799 100644 (file)
@@ -178,7 +178,10 @@ static gmx_bool dd_check_ftype(int ftype, gmx_bool bBCheck, gmx_bool bConstr, gm
             || (bConstr && (ftype == F_CONSTR || ftype == F_CONSTRNC)) || (bSettle && ftype == F_SETTLE));
 }
 
-/*! \brief Help print error output when interactions are missing */
+/*! \brief Help print error output when interactions are missing
+ *
+ * \note This function needs to be called on all ranks (contains a global summation)
+ */
 static std::string print_missing_interactions_mb(t_commrec*               cr,
                                                  const gmx_reverse_top_t* rt,
                                                  const char*              moltypename,
@@ -322,10 +325,10 @@ static void print_missing_interactions_atoms(const gmx::MDLogger& mdlog,
         int                  a_start = a_end;
         a_end                        = a_start + molb.nmol * moltype.atoms.nr;
 
-        GMX_LOG(mdlog.warning)
-                .appendText(print_missing_interactions_mb(cr, rt, *(moltype.name),
-                                                          &rt->ril_mt[molb.type], a_start, a_end,
-                                                          moltype.atoms.nr, molb.nmol, idef));
+        auto warning = print_missing_interactions_mb(cr, rt, *(moltype.name), &rt->ril_mt[molb.type],
+                                                     a_start, a_end, moltype.atoms.nr, molb.nmol, idef);
+
+        GMX_LOG(mdlog.warning).appendText(warning);
     }
 }
 
index 475453973ef52d58ce0ce2dc8d47749a15500b25..340bf9ca1a29bda0391e023b5cdeb916cf1dfdee 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -1040,14 +1040,14 @@ int gmx_pme_do(struct gmx_pme_t*              pme,
     const gmx_bool       bBackFFT      = (flags & (GMX_PME_CALC_F | GMX_PME_CALC_POT)) != 0;
     const gmx_bool       bCalcF        = (flags & GMX_PME_CALC_F) != 0;
 
-    /* We could be passing lambda!=1 while no q or LJ is actually perturbed */
+    /* We could be passing lambda!=0 while no q or LJ is actually perturbed */
     if (!pme->bFEP_q)
     {
-        lambda_q = 1;
+        lambda_q = 0;
     }
     if (!pme->bFEP_lj)
     {
-        lambda_lj = 1;
+        lambda_lj = 0;
     }
 
     assert(pme->nnodes > 0);
index 78bf617dbe8843f6ec3340ef66cf9412d90ef89f..255f273fde9101bfb890eed131281d61ce8b06f2 100644 (file)
@@ -965,7 +965,6 @@ void pme_gpu_reinit(gmx_pme_t* pme, const DeviceInformation* deviceInfo, const P
      * update for mixed mode on grid switch. TODO: use shared recipbox field.
      */
     std::memset(pme->gpu->common->previousBox, 0, sizeof(pme->gpu->common->previousBox));
-    pme_gpu_select_best_performing_pme_spreadgather_kernels(pme->gpu);
 }
 
 void pme_gpu_destroy(PmeGpu* pmeGpu)
@@ -1013,6 +1012,7 @@ void pme_gpu_reinit_atoms(PmeGpu* pmeGpu, const int nAtoms, const real* charges)
         pme_gpu_realloc_spline_data(pmeGpu);
         pme_gpu_realloc_grid_indices(pmeGpu);
     }
+    pme_gpu_select_best_performing_pme_spreadgather_kernels(pmeGpu);
 }
 
 /*! \internal \brief
index 86fa1695f0f5709838395c15d7060529a91ee69e..72f8a8dea7456b689f26967930970d36f14a9cbb 100644 (file)
@@ -2177,6 +2177,18 @@ static int do_cpt_files(XDR* xd, gmx_bool bRead, std::vector<gmx_file_position_t
     return 0;
 }
 
+static void mpiBarrierBeforeRename(const bool applyMpiBarrierBeforeRename, MPI_Comm mpiBarrierCommunicator)
+{
+    if (applyMpiBarrierBeforeRename)
+    {
+#if GMX_MPI
+        MPI_Barrier(mpiBarrierCommunicator);
+#else
+        GMX_RELEASE_ASSERT(false, "Should not request a barrier without MPI");
+        GMX_UNUSED_VALUE(mpiBarrierCommunicator);
+#endif
+    }
+}
 
 void write_checkpoint(const char*                   fn,
                       gmx_bool                      bNumberAndKeep,
@@ -2192,7 +2204,9 @@ void write_checkpoint(const char*                   fn,
                       double                        t,
                       t_state*                      state,
                       ObservablesHistory*           observablesHistory,
-                      const gmx::MdModulesNotifier& mdModulesNotifier)
+                      const gmx::MdModulesNotifier& mdModulesNotifier,
+                      bool                          applyMpiBarrierBeforeRename,
+                      MPI_Comm                      mpiBarrierCommunicator)
 {
     t_fileio* fp;
     char*     fntemp; /* the temporary checkpoint file name */
@@ -2419,6 +2433,8 @@ void write_checkpoint(const char*                   fn,
         if (gmx_fexist(fn))
         {
             /* Rename the previous checkpoint file */
+            mpiBarrierBeforeRename(applyMpiBarrierBeforeRename, mpiBarrierCommunicator);
+
             std::strcpy(buf, fn);
             buf[std::strlen(fn) - std::strlen(ftp2ext(fn2ftp(fn))) - 1] = '\0';
             std::strcat(buf, "_prev");
@@ -2440,6 +2456,10 @@ void write_checkpoint(const char*                   fn,
                 gmx_file_rename(fn, buf);
             }
         }
+
+        /* Rename the checkpoint file from the temporary to the final name */
+        mpiBarrierBeforeRename(applyMpiBarrierBeforeRename, mpiBarrierCommunicator);
+
         if (gmx_file_rename(fntemp, fn) != 0)
         {
             gmx_file("Cannot rename checkpoint file; maybe you are out of disk space?");
index cb1d6e15e60d07b614bbedd29bee3604c397bf33..fb8f7268be8df1ad347308af9d1cde8ce06abaf0 100644 (file)
@@ -45,6 +45,7 @@
 
 #include "gromacs/math/vectypes.h"
 #include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/gmxmpi.h"
 #include "gromacs/utility/keyvaluetreebuilder.h"
 
 class energyhistory_t;
@@ -194,7 +195,9 @@ void write_checkpoint(const char*                   fn,
                       double                        t,
                       t_state*                      state,
                       ObservablesHistory*           observablesHistory,
-                      const gmx::MdModulesNotifier& notifier);
+                      const gmx::MdModulesNotifier& notifier,
+                      bool                          applyMpiBarrierBeforeRename,
+                      MPI_Comm                      mpiBarrierCommunicator);
 
 /* Loads a checkpoint from fn for run continuation.
  * Generates a fatal error on system size mismatch.
index 70fa6e5480fa979530e8d7bbca79c3b3ae6c2a38..046573194a9db863758e58dddac12a85bb5fd3f1 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -183,11 +183,33 @@ static void check_viol(FILE*       log,
         vvindex[j] = 0;
     }
     nat = interaction_function[F_DISRES].nratoms + 1;
+    // Check internal consistency of disres.label
+    // The label for a distance restraint should be at most one larger
+    // than the previous label.
+    int label_old = forceparams[forceatoms[0]].disres.label;
+    for (i = 0; (i < disres->nr); i += nat)
+    {
+        type  = forceatoms[i];
+        label = forceparams[type].disres.label;
+        if ((label == label_old) || (label == label_old + 1))
+        {
+            label_old = label;
+        }
+        else
+        {
+            gmx_fatal(FARGS,
+                      "Label mismatch in distance restrains. Label for restraint %d is %d, "
+                      "expected it to be either %d or %d",
+                      i / nat, label, label_old, label_old + 1);
+        }
+    }
+    // Get offset for label index
+    label_old = forceparams[forceatoms[0]].disres.label;
     for (i = 0; (i < disres->nr);)
     {
         type  = forceatoms[i];
         n     = 0;
-        label = forceparams[type].disres.label;
+        label = forceparams[type].disres.label - label_old;
         if (debug)
         {
             fprintf(debug, "DISRE: ndr = %d, label = %d  i=%d, n =%d\n", ndr, label, i, n);
@@ -195,7 +217,8 @@ static void check_viol(FILE*       log,
         do
         {
             n += nat;
-        } while (((i + n) < disres->nr) && (forceparams[forceatoms[i + n]].disres.label == label));
+        } while (((i + n) < disres->nr)
+                 && (forceparams[forceatoms[i + n]].disres.label == label + label_old));
 
         calc_disres_R_6(nullptr, nullptr, n, &forceatoms[i], x, pbc, fcd, nullptr);
 
index 29ac09631610d8b4b04f3f547ead77fa79853b51..f010d6e6bc485c9a589e7afbcfcd347f16e08ac6 100644 (file)
@@ -1379,7 +1379,7 @@ static void checkForUnboundAtoms(const gmx_moltype_t* molt, gmx_bool bVerbose, w
 
     for (int ftype = 0; ftype < F_NRE; ftype++)
     {
-        if (((interaction_function[ftype].flags & IF_BOND) && ftype != F_CONNBONDS)
+        if (((interaction_function[ftype].flags & IF_BOND) && NRAL(ftype) == 2 && ftype != F_CONNBONDS)
             || (interaction_function[ftype].flags & IF_CONSTRAINT) || ftype == F_SETTLE)
         {
             const InteractionList& il   = molt->ilist[ftype];
index 8f9cc8112f0ae6b66500126b0d81be294f61b4fd..64f54f903404b3371fb3af12a76e95c129c496dd 100644 (file)
@@ -2706,7 +2706,7 @@ int search_string(const char* s, int ng, char* gn[])
               s);
 }
 
-static bool do_numbering(int                        natoms,
+static void do_numbering(int                        natoms,
                          SimulationGroups*          groups,
                          gmx::ArrayRef<std::string> groupsFromMdpFile,
                          t_blocka*                  block,
@@ -2721,7 +2721,6 @@ static bool do_numbering(int                        natoms,
     AtomGroupIndices* grps = &(groups->groups[gtype]);
     int               j, gid, aj, ognr, ntot = 0;
     const char*       title;
-    bool              bRest;
     char              warn_buf[STRLEN];
 
     title = shortName(gtype);
@@ -2777,7 +2776,6 @@ static bool do_numbering(int                        natoms,
     }
 
     /* Now check whether we have done all atoms */
-    bRest = FALSE;
     if (ntot != natoms)
     {
         if (grptp == egrptpALL)
@@ -2795,7 +2793,6 @@ static bool do_numbering(int                        natoms,
             if (cbuf[j] == NOGID)
             {
                 cbuf[j] = grps->size();
-                bRest   = TRUE;
             }
         }
         if (grptp != egrptpPART)
@@ -2834,8 +2831,6 @@ static bool do_numbering(int                        natoms,
     }
 
     sfree(cbuf);
-
-    return (bRest && grptp == egrptpPART);
 }
 
 static void calc_nrdf(const gmx_mtop_t* mtop, t_inputrec* ir, char** gnames)
@@ -3038,17 +3033,19 @@ static void calc_nrdf(const gmx_mtop_t* mtop, t_inputrec* ir, char** gnames)
 
     if (ir->nstcomm != 0)
     {
-        int ndim_rm_vcm;
+        GMX_RELEASE_ASSERT(!groups.groups[SimulationAtomGroupType::MassCenterVelocityRemoval].empty(),
+                           "Expect at least one group when removing COM motion");
 
         /* We remove COM motion up to dim ndof_com() */
-        ndim_rm_vcm = ndof_com(ir);
+        const int ndim_rm_vcm = ndof_com(ir);
 
         /* Subtract ndim_rm_vcm (or less with frozen dimensions) from
          * the number of degrees of freedom in each vcm group when COM
          * translation is removed and 6 when rotation is removed as well.
+         * Note that we do not and should not include the rest group here.
          */
         for (gmx::index j = 0;
-             j < gmx::ssize(groups.groups[SimulationAtomGroupType::MassCenterVelocityRemoval]) + 1; j++)
+             j < gmx::ssize(groups.groups[SimulationAtomGroupType::MassCenterVelocityRemoval]); j++)
         {
             switch (ir->comm_mode)
             {
@@ -3236,6 +3233,88 @@ static void make_IMD_group(t_IMD* IMDgroup, char* IMDgname, t_blocka* grps, char
     }
 }
 
+/* Checks whether atoms are both part of a COM removal group and frozen.
+ * If a fully frozen atom is part of a COM removal group, it is removed
+ * from the COM removal group. A note is issued if such atoms are present.
+ * A warning is issued for atom with one or two dimensions frozen that
+ * are part of a COM removal group (mdrun would need to compute COM mass
+ * per dimension to handle this correctly).
+ * Also issues a warning when non-frozen atoms are not part of a COM
+ * removal group while COM removal is active.
+ */
+static void checkAndUpdateVcmFreezeGroupConsistency(SimulationGroups* groups,
+                                                    const int         numAtoms,
+                                                    const t_grpopts&  opts,
+                                                    warninp_t         wi)
+{
+    const int vcmRestGroup =
+            std::max(int(groups->groups[SimulationAtomGroupType::MassCenterVelocityRemoval].size()), 1);
+
+    int numFullyFrozenVcmAtoms     = 0;
+    int numPartiallyFrozenVcmAtoms = 0;
+    int numNonVcmAtoms             = 0;
+    for (int a = 0; a < numAtoms; a++)
+    {
+        const int freezeGroup   = getGroupType(*groups, SimulationAtomGroupType::Freeze, a);
+        int       numFrozenDims = 0;
+        for (int d = 0; d < DIM; d++)
+        {
+            numFrozenDims += opts.nFreeze[freezeGroup][d];
+        }
+
+        const int vcmGroup = getGroupType(*groups, SimulationAtomGroupType::MassCenterVelocityRemoval, a);
+        if (vcmGroup < vcmRestGroup)
+        {
+            if (numFrozenDims == DIM)
+            {
+                /* Do not remove COM motion for this fully frozen atom */
+                if (groups->groups[SimulationAtomGroupType::MassCenterVelocityRemoval].empty())
+                {
+                    groups->groups[SimulationAtomGroupType::MassCenterVelocityRemoval].resize(numAtoms, 0);
+                }
+                groups->groups[SimulationAtomGroupType::MassCenterVelocityRemoval][a] = vcmRestGroup;
+                numFullyFrozenVcmAtoms++;
+            }
+            else if (numFrozenDims > 0)
+            {
+                numPartiallyFrozenVcmAtoms++;
+            }
+        }
+        else if (numFrozenDims < DIM)
+        {
+            numNonVcmAtoms++;
+        }
+    }
+
+    if (numFullyFrozenVcmAtoms > 0)
+    {
+        std::string warningText = gmx::formatString(
+                "There are %d atoms that are fully frozen and part of COMM removal group(s), "
+                "removing these atoms from the COMM removal group(s)",
+                numFullyFrozenVcmAtoms);
+        warning_note(wi, warningText.c_str());
+    }
+    if (numPartiallyFrozenVcmAtoms > 0 && numPartiallyFrozenVcmAtoms < numAtoms)
+    {
+        std::string warningText = gmx::formatString(
+                "There are %d atoms that are frozen along less then %d dimensions and part of COMM "
+                "removal group(s), due to limitations in the code these still contribute to the "
+                "mass of the COM along frozen dimensions and therefore the COMM correction will be "
+                "too small.",
+                numPartiallyFrozenVcmAtoms, DIM);
+        warning(wi, warningText.c_str());
+    }
+    if (numNonVcmAtoms > 0)
+    {
+        std::string warningText = gmx::formatString(
+                "%d atoms are not part of any center of mass motion removal group.\n"
+                "This may lead to artifacts.\n"
+                "In most cases one should use one group for the whole system.",
+                numNonVcmAtoms);
+        warning(wi, warningText.c_str());
+    }
+}
+
 void do_index(const char*                   mdparin,
               const char*                   ndx,
               gmx_mtop_t*                   mtop,
@@ -3248,12 +3327,12 @@ void do_index(const char*                   mdparin,
     int       natoms;
     t_symtab* symtab;
     t_atoms   atoms_all;
-    char      warnbuf[STRLEN], **gnames;
+    char**    gnames;
     int       nr;
     real      tau_min;
     int       nstcmin;
     int       i, j, k, restnm;
-    bool      bExcl, bTable, bAnneal, bRest;
+    bool      bExcl, bTable, bAnneal;
     char      warn_buf[STRLEN];
 
     if (bVerbose)
@@ -3653,7 +3732,7 @@ void do_index(const char*                   mdparin,
             {
                 if (!gmx::equalCaseInsensitive(freezeDims[k], "N", 1))
                 {
-                    sprintf(warnbuf,
+                    sprintf(warn_buf,
                             "Please use Y(ES) or N(O) for freezedim only "
                             "(not %s)",
                             freezeDims[k].c_str());
@@ -3676,15 +3755,13 @@ void do_index(const char*                   mdparin,
     add_wall_energrps(groups, ir->nwall, symtab);
     ir->opts.ngener    = groups->groups[SimulationAtomGroupType::EnergyOutput].size();
     auto vcmGroupNames = gmx::splitString(is->vcm);
-    bRest              = do_numbering(natoms, groups, vcmGroupNames, defaultIndexGroups, gnames,
-                         SimulationAtomGroupType::MassCenterVelocityRemoval, restnm,
-                         vcmGroupNames.empty() ? egrptpALL_GENREST : egrptpPART, bVerbose, wi);
-    if (bRest)
+    do_numbering(natoms, groups, vcmGroupNames, defaultIndexGroups, gnames,
+                 SimulationAtomGroupType::MassCenterVelocityRemoval, restnm,
+                 vcmGroupNames.empty() ? egrptpALL_GENREST : egrptpPART, bVerbose, wi);
+
+    if (ir->comm_mode != ecmNO)
     {
-        warning(wi,
-                "Some atoms are not part of any center of mass motion removal group.\n"
-                "This may lead to artifacts.\n"
-                "In most cases one should use one group for the whole system.");
+        checkAndUpdateVcmFreezeGroupConsistency(groups, natoms, ir->opts, wi);
     }
 
     /* Now we have filled the freeze struct, so we can calculate NRDF */
index 8574d7ef8dc270929fd4d63075d5e73b190281eb..1442bf47c2298462be116a3ec7ab2ef0d4de138a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2012,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -179,7 +179,7 @@ void initParamLookupTable(T*& d_ptr, cudaTextureObject_t& texObj, const T* h_ptr
 template<typename T>
 void destroyParamLookupTable(T* d_ptr, cudaTextureObject_t texObj)
 {
-    if (!c_disableCudaTextures)
+    if (!c_disableCudaTextures && texObj)
     {
         CU_RET_ERR(cudaDestroyTextureObject(texObj), "cudaDestroyTextureObject on texObj failed");
     }
index 16215c1fe657e08c4c8a55ee794d9cc63299be16..83232bb93c8e0f330e58443c348108991440fc94 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010-2018, The GROMACS development team.
- * Copyright (c) 2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016, The GROMACS development team.
+ * Copyright (c) 2017,2018,2019,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.
@@ -75,28 +75,25 @@ static bool cudaProfilerRun = ((getenv("NVPROF_ID") != nullptr));
 /** Dummy kernel used for sanity checking. */
 static __global__ void k_dummy_test(void) {}
 
-static void checkCompiledTargetCompatibility(int deviceId, const cudaDeviceProp& deviceProp)
+static cudaError_t checkCompiledTargetCompatibility(int deviceId, const cudaDeviceProp& deviceProp)
 {
     cudaFuncAttributes attributes;
     cudaError_t        stat = cudaFuncGetAttributes(&attributes, k_dummy_test);
 
     if (cudaErrorInvalidDeviceFunction == stat)
     {
-        gmx_fatal(FARGS,
-                  "The %s binary does not include support for the CUDA architecture of a "
-                  "detected GPU: %s, ID #%d (compute capability %d.%d). "
-                  "By default, GROMACS supports all architectures of compute "
-                  "capability >= 3.0, so your GPU "
-                  "might be rare, or some architectures were disabled in the build. "
-                  "Consult the install guide for how to use the GMX_CUDA_TARGET_SM and "
-                  "GMX_CUDA_TARGET_COMPUTE CMake variables to add this architecture. "
-                  "To work around this error, use the CUDA_VISIBLE_DEVICES environment"
-                  "variable to pass a list of GPUs that excludes the ID %d.",
-                  gmx::getProgramContext().displayName(), deviceProp.name, deviceId,
-                  deviceProp.major, deviceProp.minor, deviceId);
-    }
-
-    CU_RET_ERR(stat, "cudaFuncGetAttributes failed");
+        fprintf(stderr,
+                "\nWARNING: The %s binary does not include support for the CUDA architecture of "
+                "the GPU ID #%d (compute capability %d.%d) detected during detection. "
+                "By default, GROMACS supports all architectures of compute "
+                "capability >= 3.0, so your GPU "
+                "might be rare, or some architectures were disabled in the build. \n"
+                "Consult the install guide for how to use the GMX_CUDA_TARGET_SM and "
+                "GMX_CUDA_TARGET_COMPUTE CMake variables to add this architecture. \n",
+                gmx::getProgramContext().displayName(), deviceId, deviceProp.major, deviceProp.minor);
+    }
+
+    return stat;
 }
 
 bool isHostMemoryPinned(const void* h_ptr)
@@ -129,7 +126,7 @@ bool isHostMemoryPinned(const void* h_ptr)
  *
  * \param[in]  dev_id      the device ID of the GPU or -1 if the device has already been initialized
  * \param[in]  dev_prop    The device properties structure
- * \returns                0 if the device looks OK
+ * \returns                0 if the device looks OK, -1 if it sanity checks failed, and -2 if the device is busy
  *
  * TODO: introduce errors codes and handle errors more smoothly.
  */
@@ -200,13 +197,36 @@ static int do_sanity_checks(int dev_id, const cudaDeviceProp& dev_prop)
         }
     }
 
+    cu_err = checkCompiledTargetCompatibility(dev_id, dev_prop);
+    // Avoid triggering an error if GPU devices are in exclusive or prohibited mode;
+    // it is enough to check for cudaErrorDevicesUnavailable only here because
+    // if we encounter it that will happen in cudaFuncGetAttributes in the above function.
+    if (cu_err == cudaErrorDevicesUnavailable)
+    {
+        return -2;
+    }
+    else if (cu_err != cudaSuccess)
+    {
+        return -1;
+    }
+
     /* try to execute a dummy kernel */
-    checkCompiledTargetCompatibility(dev_id, dev_prop);
+    try
+    {
+        KernelLaunchConfig config;
+        config.blockSize[0]       = 512;
+        const auto dummyArguments = prepareGpuKernelArguments(k_dummy_test, config);
+        launchGpuKernel(k_dummy_test, config, nullptr, "Dummy kernel", dummyArguments);
+    }
+    catch (gmx::GromacsException& ex)
+    {
+        // launchGpuKernel error is not fatal and should continue with marking the device bad
+        fprintf(stderr,
+                "Error occurred while running dummy kernel sanity check on device #%d:\n %s\n", id,
+                formatExceptionMessageToString(ex).c_str());
+        return -1;
+    }
 
-    KernelLaunchConfig config;
-    config.blockSize[0]       = 512;
-    const auto dummyArguments = prepareGpuKernelArguments(k_dummy_test, config);
-    launchGpuKernel(k_dummy_test, config, nullptr, "Dummy kernel", dummyArguments);
     if (cudaDeviceSynchronize() != cudaSuccess)
     {
         return -1;
@@ -315,12 +335,16 @@ static int is_gmx_supported_gpu_id(int deviceId, const cudaDeviceProp& devicePro
      * the dummy test kernel fails to execute with a "device busy message" we
      * should appropriately report that the device is busy instead of insane.
      */
-    if (do_sanity_checks(deviceId, deviceProp) != 0)
+    const int checkResult = do_sanity_checks(deviceId, deviceProp);
+    switch (checkResult)
     {
-        return egpuInsane;
+        case 0: return egpuCompatible;
+        case -1: return egpuInsane;
+        case -2: return egpuUnavailable;
+        default:
+            GMX_RELEASE_ASSERT(false, "Invalid do_sanity_checks() return value");
+            return egpuCompatible;
     }
-
-    return egpuCompatible;
 }
 
 bool isGpuDetectionFunctional(std::string* errorMessage)
index cf913ed041b79a30cc7a94aa6065a5909abd9654..8c79bf432028c32c3f5475729ac81c6c0f73099f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019,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.
@@ -46,6 +46,7 @@
 // move to a single place in gpu_utils.
 /* Names of the GPU detection/check results (see e_gpu_detect_res_t in hw_info.h). */
 const char* const gpu_detect_res_str[egpuNR] = {
-    "compatible", "nonexistent", "incompatible",
-    "incompatible (please recompile with GMX_OPENCL_NB_CLUSTER_SIZE=4)", "insane"
+    "compatible",   "nonexistent",
+    "incompatible", "incompatible (please recompile with GMX_OPENCL_NB_CLUSTER_SIZE=4)",
+    "insane",       "unavailable"
 };
index 98f87760cddef0df4aaeb8f48b078abe68671ffa..8952ca4f8747333d47bc8d55b3f578bed47d9d71 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017 by the GROMACS development team.
+ * Copyright (c) 2012,2013,2014,2015,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -44,7 +44,10 @@ struct DeviceInformation;
  *
  * The egpuInsane value means that during the sanity checks an error
  * occurred that indicates malfunctioning of the device, driver, or
- * incompatible driver/runtime. */
+ * incompatible driver/runtime.
+ * eGpuUnavailable indicates that CUDA devices are busy or unavailable
+ * typically due to use of cudaComputeModeExclusive, cudaComputeModeProhibited modes.
+ */
 typedef enum
 {
     egpuCompatible = 0,
@@ -52,6 +55,7 @@ typedef enum
     egpuIncompatible,
     egpuIncompatibleClusterSize,
     egpuInsane,
+    egpuUnavailable,
     egpuNR
 } e_gpu_detect_res_t;
 
index 63f09ba0cf3f109e13970734932771f034a465e7..d9c58c9574192dce6ed8d54845c64ced32da2fc1 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -123,7 +123,7 @@ void init_orires(FILE*                 fplog,
     int                  nmol;
     while (const InteractionLists* il = gmx_mtop_ilistloop_next(iloop, &nmol))
     {
-        if (nmol > 1)
+        if (nmol > 1 && (*il)[F_ORIRES].size() > 0)
         {
             gmx_fatal(FARGS,
                       "Found %d copies of a molecule with orientation restrains while the current "
index 6a8487e93aac291bd317aa63a571d98a3b85f769..d53a7e6b383638666780781bee3e9ad6cc601911 100644 (file)
@@ -137,10 +137,10 @@ DispersionCorrection::TopologyParams::TopologyParams(const gmx_mtop_t&         m
 
     for (int q = 0; q < (inputrec.efep == efepNO ? 1 : 2); q++)
     {
-        double csix    = 0;
-        double ctwelve = 0;
-        int    npair   = 0;
-        int    nexcl   = 0;
+        double  csix    = 0;
+        double  ctwelve = 0;
+        int64_t npair   = 0;
+        int64_t nexcl   = 0;
         if (!EI_TPI(inputrec.eI))
         {
             numAtomsForDensity_ = mtop.natoms;
@@ -154,9 +154,9 @@ DispersionCorrection::TopologyParams::TopologyParams(const gmx_mtop_t&         m
             {
                 for (int tpj = tpi; tpj < ntp; tpj++)
                 {
-                    const int iCount = typecount[tpi];
-                    const int jCount = typecount[tpj];
-                    int       npair_ij;
+                    const int64_t iCount = typecount[tpi];
+                    const int64_t jCount = typecount[tpj];
+                    int64_t       npair_ij;
                     if (tpi != tpj)
                     {
                         npair_ij = iCount * jCount;
@@ -278,7 +278,7 @@ DispersionCorrection::TopologyParams::TopologyParams(const gmx_mtop_t&         m
         }
         if (debug)
         {
-            fprintf(debug, "Counted %d exclusions\n", nexcl);
+            fprintf(debug, "Counted %" PRId64 " exclusions\n", nexcl);
             fprintf(debug, "Average C6 parameter is: %10g\n", csix);
             fprintf(debug, "Average C12 parameter is: %10g\n", ctwelve);
         }
index 90e74a077df3f7e7d2aa098cb5d92512a6c7851e..2ccb5601bee14a679a1d2bfa1af743153fd19f12 100644 (file)
@@ -918,6 +918,75 @@ static void init_interaction_const(FILE*                 fp,
     *interaction_const = ic;
 }
 
+bool areMoleculesDistributedOverPbc(const t_inputrec& ir, const gmx_mtop_t& mtop, const gmx::MDLogger& mdlog)
+{
+    bool       areMoleculesDistributedOverPbc = false;
+    const bool useEwaldSurfaceCorrection = (EEL_PME_EWALD(ir.coulombtype) && ir.epsilon_surface != 0);
+
+    const bool bSHAKE =
+            (ir.eConstrAlg == econtSHAKE
+             && (gmx_mtop_ftype_count(mtop, F_CONSTR) > 0 || gmx_mtop_ftype_count(mtop, F_CONSTRNC) > 0));
+
+    /* The group cut-off scheme and SHAKE assume charge groups
+     * are whole, but not using molpbc is faster in most cases.
+     * With intermolecular interactions we need PBC for calculating
+     * distances between atoms in different molecules.
+     */
+    if (bSHAKE && !mtop.bIntermolecularInteractions)
+    {
+        areMoleculesDistributedOverPbc = ir.bPeriodicMols;
+
+        if (areMoleculesDistributedOverPbc)
+        {
+            gmx_fatal(FARGS, "SHAKE is not supported with periodic molecules");
+        }
+    }
+    else
+    {
+        /* Not making molecules whole is faster in most cases,
+         * but with orientation restraints or non-tinfoil boundary
+         * conditions we need whole molecules.
+         */
+        areMoleculesDistributedOverPbc =
+                (gmx_mtop_ftype_count(mtop, F_ORIRES) == 0 && !useEwaldSurfaceCorrection);
+
+        if (getenv("GMX_USE_GRAPH") != nullptr)
+        {
+            areMoleculesDistributedOverPbc = false;
+
+            GMX_LOG(mdlog.warning)
+                    .asParagraph()
+                    .appendText(
+                            "GMX_USE_GRAPH is set, using the graph for bonded "
+                            "interactions");
+
+            if (mtop.bIntermolecularInteractions)
+            {
+                GMX_LOG(mdlog.warning)
+                        .asParagraph()
+                        .appendText(
+                                "WARNING: Molecules linked by intermolecular interactions "
+                                "have to reside in the same periodic image, otherwise "
+                                "artifacts will occur!");
+            }
+        }
+
+        GMX_RELEASE_ASSERT(areMoleculesDistributedOverPbc || !mtop.bIntermolecularInteractions,
+                           "We need to use PBC within molecules with inter-molecular interactions");
+
+        if (bSHAKE && areMoleculesDistributedOverPbc)
+        {
+            gmx_fatal(FARGS,
+                      "SHAKE is not properly supported with intermolecular interactions. "
+                      "For short simulations where linked molecules remain in the same "
+                      "periodic image, the environment variable GMX_USE_GRAPH can be used "
+                      "to override this check.\n");
+        }
+    }
+
+    return areMoleculesDistributedOverPbc;
+}
+
 void init_forcerec(FILE*                            fp,
                    const gmx::MDLogger&             mdlog,
                    t_forcerec*                      fr,
@@ -1047,70 +1116,13 @@ void init_forcerec(FILE*                            fp,
                 (EEL_PME_EWALD(ir->coulombtype) && ir->epsilon_surface != 0);
         if (!DOMAINDECOMP(cr))
         {
-            gmx_bool bSHAKE;
-
-            bSHAKE = (ir->eConstrAlg == econtSHAKE
-                      && (gmx_mtop_ftype_count(mtop, F_CONSTR) > 0
-                          || gmx_mtop_ftype_count(mtop, F_CONSTRNC) > 0));
-
-            /* The group cut-off scheme and SHAKE assume charge groups
-             * are whole, but not using molpbc is faster in most cases.
-             * With intermolecular interactions we need PBC for calculating
-             * distances between atoms in different molecules.
-             */
-            if (bSHAKE && !mtop->bIntermolecularInteractions)
-            {
-                fr->bMolPBC = ir->bPeriodicMols;
-
-                if (bSHAKE && fr->bMolPBC)
-                {
-                    gmx_fatal(FARGS, "SHAKE is not supported with periodic molecules");
-                }
-            }
-            else
-            {
-                /* Not making molecules whole is faster in most cases,
-                 * but with orientation restraints or non-tinfoil boundary
-                 * conditions we need whole molecules.
-                 */
-                fr->bMolPBC = (fcd->orires.nr == 0 && !useEwaldSurfaceCorrection);
-
-                if (getenv("GMX_USE_GRAPH") != nullptr)
-                {
-                    fr->bMolPBC = FALSE;
-                    if (fp)
-                    {
-                        GMX_LOG(mdlog.warning)
-                                .asParagraph()
-                                .appendText(
-                                        "GMX_USE_GRAPH is set, using the graph for bonded "
-                                        "interactions");
-                    }
-
-                    if (mtop->bIntermolecularInteractions)
-                    {
-                        GMX_LOG(mdlog.warning)
-                                .asParagraph()
-                                .appendText(
-                                        "WARNING: Molecules linked by intermolecular interactions "
-                                        "have to reside in the same periodic image, otherwise "
-                                        "artifacts will occur!");
-                    }
-                }
-
-                GMX_RELEASE_ASSERT(
-                        fr->bMolPBC || !mtop->bIntermolecularInteractions,
-                        "We need to use PBC within molecules with inter-molecular interactions");
-
-                if (bSHAKE && fr->bMolPBC)
-                {
-                    gmx_fatal(FARGS,
-                              "SHAKE is not properly supported with intermolecular interactions. "
-                              "For short simulations where linked molecules remain in the same "
-                              "periodic image, the environment variable GMX_USE_GRAPH can be used "
-                              "to override this check.\n");
-                }
-            }
+            fr->bMolPBC = areMoleculesDistributedOverPbc(*ir, *mtop, mdlog);
+            // The assert below is equivalent to fcd->orires.nr != gmx_mtop_ftype_count(mtop, F_ORIRES)
+            GMX_RELEASE_ASSERT(!fr->bMolPBC || fcd->orires.nr == 0,
+                               "Molecules broken over PBC exist in a simulation including "
+                               "orientation restraints. "
+                               "This likely means that the global topology and the force constant "
+                               "data have gotten out of sync.");
         }
         else
         {
index cba9875e48eb40954c2c8597e077266ad094b0a5..c7f38cb5f5b800a11bce29de1ef13dfe5c5b58bc 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -116,6 +116,17 @@ void init_forcerec(FILE*                            fplog,
                    gmx::ArrayRef<const std::string> tabbfnm,
                    real                             print_force);
 
+/*! \brief Check whether molecules are ever distributed over PBC boundaries
+ *
+ * Note: This covers only the non-DD case. For DD runs, domdec.h offers an
+ *       equivalent dd_bonded_molpbc(...) function.
+ *
+ * \param[in]  ir                 Inputrec structure
+ * \param[in]  mtop               Molecular topology
+ * \param[in]  mdlog              File for printing
+ */
+bool areMoleculesDistributedOverPbc(const t_inputrec& ir, const gmx_mtop_t& mtop, const gmx::MDLogger& mdlog);
+
 /*! \brief Divide exclusions over threads
  *
  * Set the exclusion load for the local exclusions and possibly threads
index 9eb763a25d1a47b826353e1950c422999c3cd49e..33056bc855cf580e759f91c09bd65d88b06ab5c3 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -505,7 +505,7 @@ void rerun_parallel_comm(t_commrec* cr, t_trxframe* fr, gmx_bool* bLastStep)
 }
 
 // TODO Most of this logic seems to belong in the respective modules
-void set_state_entries(t_state* state, const t_inputrec* ir)
+void set_state_entries(t_state* state, const t_inputrec* ir, bool useModularSimulator)
 {
     /* The entries in the state in the tpx file might not correspond
      * with what is needed, so we correct this here.
@@ -535,7 +535,10 @@ void set_state_entries(t_state* state, const t_inputrec* ir)
         if ((ir->epc == epcPARRINELLORAHMAN) || (ir->epc == epcMTTK))
         {
             state->flags |= (1 << estBOXV);
-            state->flags |= (1 << estPRES_PREV);
+            if (!useModularSimulator)
+            {
+                state->flags |= (1 << estPRES_PREV);
+            }
         }
         if (inputrecNptTrotter(ir) || (inputrecNphTrotter(ir)))
         {
index e13fa1f4838da0caa0415f1c194545b1785f78a3..333cde82ec8c90f7c280afb0fe830ad874fadbc5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -105,7 +105,7 @@ bool multisim_int_all_are_equal(const gmx_multisim_t* ms, int64_t value);
 void rerun_parallel_comm(t_commrec* cr, t_trxframe* fr, gmx_bool* bLastStep);
 
 //! \brief Allocate and initialize node-local state entries
-void set_state_entries(t_state* state, const t_inputrec* ir);
+void set_state_entries(t_state* state, const t_inputrec* ir, bool useModularSimulator);
 
 /* Set the lambda values in the global state from a frame read with rerun */
 void setCurrentLambdasRerun(int64_t           step,
index 3f3a426fb83cad4e6826797290373e4bcd0e2a2d..dac8b7754d04f354fe4c1763a19bd334966e1f5f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -49,6 +49,7 @@
 #include "gromacs/math/vec.h"
 #include "gromacs/mdlib/trajectory_writing.h"
 #include "gromacs/mdrunutility/handlerestart.h"
+#include "gromacs/mdrunutility/multisim.h"
 #include "gromacs/mdtypes/commrec.h"
 #include "gromacs/mdtypes/imdoutputprovider.h"
 #include "gromacs/mdtypes/inputrec.h"
@@ -83,6 +84,8 @@ struct gmx_mdoutf
     rvec*                         f_global;
     gmx::IMDOutputProvider*       outputProvider;
     const gmx::MdModulesNotifier* mdModulesNotifier;
+    bool                          simulationsShareState;
+    MPI_Comm                      mpiCommMasters;
 };
 
 
@@ -97,7 +100,9 @@ gmx_mdoutf_t init_mdoutf(FILE*                         fplog,
                          gmx_mtop_t*                   top_global,
                          const gmx_output_env_t*       oenv,
                          gmx_wallcycle_t               wcycle,
-                         const gmx::StartingBehavior   startingBehavior)
+                         const gmx::StartingBehavior   startingBehavior,
+                         bool                          simulationsShareState,
+                         const gmx_multisim_t*         ms)
 {
     gmx_mdoutf_t of;
     const char * appendMode = "a+", *writeMode = "w+", *filemode;
@@ -123,6 +128,14 @@ gmx_mdoutf_t init_mdoutf(FILE*                         fplog,
     of->f_global                = nullptr;
     of->outputProvider          = outputProvider;
 
+    GMX_RELEASE_ASSERT(!simulationsShareState || ms != nullptr,
+                       "Need valid multisim object when simulations share state");
+    of->simulationsShareState = simulationsShareState;
+    if (of->simulationsShareState)
+    {
+        of->mpiCommMasters = ms->mpi_comm_masters;
+    }
+
     if (MASTER(cr))
     {
         of->bKeepAndNumCPT = mdrunOptions.checkpointOptions.keepAndNumberCheckpointFiles;
@@ -296,12 +309,18 @@ void mdoutf_write_to_trajectory_files(FILE*                    fplog,
         {
             fflush_tng(of->tng);
             fflush_tng(of->tng_low_prec);
+            /* Write the checkpoint file.
+             * When simulations share the state, an MPI barrier is applied before
+             * renaming old and new checkpoint files to minimize the risk of
+             * checkpoint files getting out of sync.
+             */
             ivec one_ivec = { 1, 1, 1 };
             write_checkpoint(of->fn_cpt, of->bKeepAndNumCPT, fplog, cr,
                              DOMAINDECOMP(cr) ? cr->dd->numCells : one_ivec,
                              DOMAINDECOMP(cr) ? cr->dd->nnodes : cr->nnodes, of->eIntegrator,
                              of->simulation_part, of->bExpanded, of->elamstats, step, t,
-                             state_global, observablesHistory, *(of->mdModulesNotifier));
+                             state_global, observablesHistory, *(of->mdModulesNotifier),
+                             of->simulationsShareState, of->mpiCommMasters);
         }
 
         if (mdof_flags & (MDOF_X | MDOF_V | MDOF_F))
index 4add522f7971f3d3d572589cb2d9bc9d6ffbafb9..a6f9371ce6eee68897c41e6fee0786434adee6f7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -46,6 +46,7 @@
 
 class energyhistory_t;
 struct gmx_mtop_t;
+struct gmx_multisim_t;
 struct gmx_output_env_t;
 struct ObservablesHistory;
 struct t_commrec;
@@ -78,7 +79,9 @@ gmx_mdoutf_t init_mdoutf(FILE*                         fplog,
                          gmx_mtop_t*                   mtop,
                          const gmx_output_env_t*       oenv,
                          gmx_wallcycle_t               wcycle,
-                         gmx::StartingBehavior         startingBehavior);
+                         gmx::StartingBehavior         startingBehavior,
+                         bool                          simulationsShareState,
+                         const gmx_multisim_t*         ms);
 
 /*! \brief Getter for file pointer */
 ener_file_t mdoutf_get_fp_ene(gmx_mdoutf_t of);
index df856edbd33d639b322110534746e437b5812e16..dc5538bf4851076d9dc3ef0b5198f2bf3e374a5b 100644 (file)
@@ -1003,6 +1003,44 @@ void do_force(FILE*                               fplog,
 
     nbnxn_atomdata_copy_shiftvec(stepWork.haveDynamicBox, fr->shift_vec, nbv->nbat.get());
 
+#if GMX_MPI
+    const bool pmeSendCoordinatesFromGpu =
+            simulationWork.useGpuPmePpCommunication && !(stepWork.doNeighborSearch);
+    const bool reinitGpuPmePpComms =
+            simulationWork.useGpuPmePpCommunication && (stepWork.doNeighborSearch);
+#endif
+
+    const auto localXReadyOnDevice = (stateGpu != nullptr)
+                                             ? stateGpu->getCoordinatesReadyOnDeviceEvent(
+                                                       AtomLocality::Local, simulationWork, stepWork)
+                                             : nullptr;
+
+#if GMX_MPI
+    // If coordinates are to be sent to PME task from CPU memory, perform that send here.
+    // Otherwise the send will occur after H2D coordinate transfer.
+    if (!thisRankHasDuty(cr, DUTY_PME) && !pmeSendCoordinatesFromGpu)
+    {
+        /* Send particle coordinates to the pme nodes.
+         * Since this is only implemented for domain decomposition
+         * and domain decomposition does not use the graph,
+         * we do not need to worry about shifting.
+         */
+        if (!stepWork.doNeighborSearch && simulationWork.useGpuUpdate)
+        {
+            GMX_RELEASE_ASSERT(false,
+                               "GPU update and separate PME ranks are only supported with GPU "
+                               "direct communication!");
+            // TODO: when this code-path becomes supported add:
+            // stateGpu->waitCoordinatesReadyOnHost(AtomLocality::Local);
+        }
+
+        gmx_pme_send_coordinates(fr, cr, box, as_rvec_array(x.unpaddedArrayRef().data()), lambda[efptCOUL],
+                                 lambda[efptVDW], (stepWork.computeVirial || stepWork.computeEnergy),
+                                 step, simulationWork.useGpuPmePpCommunication, reinitGpuPmePpComms,
+                                 pmeSendCoordinatesFromGpu, localXReadyOnDevice, wcycle);
+    }
+#endif /* GMX_MPI */
+
     // Coordinates on the device are needed if PME or BufferOps are offloaded.
     // The local coordinates can be copied right away.
     // NOTE: Consider moving this copy to right after they are updated and constrained,
@@ -1025,6 +1063,7 @@ void do_force(FILE*                               fplog,
         // 2. The buffers were reinitialized on search step
         if (!simulationWork.useGpuUpdate || stepWork.doNeighborSearch)
         {
+            GMX_ASSERT(stateGpu != nullptr, "stateGpu should not be null");
             stateGpu->copyCoordinatesToGpu(x.unpaddedArrayRef(), AtomLocality::Local);
         }
     }
@@ -1055,40 +1094,25 @@ void do_force(FILE*                               fplog,
         && (runScheduleWork->domainWork.haveCpuLocalForceWork || stepWork.computeVirial
             || haveHostPmePpComms || haveHostHaloExchangeComms))
     {
+        GMX_ASSERT(stateGpu != nullptr, "stateGpu should not be null");
         stateGpu->copyCoordinatesFromGpu(x.unpaddedArrayRef(), AtomLocality::Local);
         haveCopiedXFromGpu = true;
     }
 
-    const auto localXReadyOnDevice = (stateGpu != nullptr)
-                                             ? stateGpu->getCoordinatesReadyOnDeviceEvent(
-                                                       AtomLocality::Local, simulationWork, stepWork)
-                                             : nullptr;
-
 #if GMX_MPI
-    if (!thisRankHasDuty(cr, DUTY_PME))
+    // If coordinates are to be sent to PME task from GPU memory, perform that send here.
+    // Otherwise the send will occur before the H2D coordinate transfer.
+    if (pmeSendCoordinatesFromGpu)
     {
         /* Send particle coordinates to the pme nodes.
          * Since this is only implemented for domain decomposition
          * and domain decomposition does not use the graph,
          * we do not need to worry about shifting.
          */
-        bool reinitGpuPmePpComms = simulationWork.useGpuPmePpCommunication && (stepWork.doNeighborSearch);
-        bool sendCoordinatesFromGpu =
-                simulationWork.useGpuPmePpCommunication && !(stepWork.doNeighborSearch);
-
-        if (!stepWork.doNeighborSearch && simulationWork.useGpuUpdate && !sendCoordinatesFromGpu)
-        {
-            GMX_RELEASE_ASSERT(false,
-                               "GPU update and separate PME ranks are only supported with GPU "
-                               "direct communication!");
-            // TODO: when this code-path becomes supported add:
-            // stateGpu->waitCoordinatesReadyOnHost(AtomLocality::Local);
-        }
-
         gmx_pme_send_coordinates(fr, cr, box, as_rvec_array(x.unpaddedArrayRef().data()), lambda[efptCOUL],
                                  lambda[efptVDW], (stepWork.computeVirial || stepWork.computeEnergy),
                                  step, simulationWork.useGpuPmePpCommunication, reinitGpuPmePpComms,
-                                 sendCoordinatesFromGpu, localXReadyOnDevice, wcycle);
+                                 pmeSendCoordinatesFromGpu, localXReadyOnDevice, wcycle);
     }
 #endif /* GMX_MPI */
 
index 5d8d19ef21e83b579974f3e7b476570e7ef255ee..74c82f64598d9a298624094441c119e2a6965bc5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
index 8069b6250c7ea87d17f57d2fc9885db171793203..65287fcb14827696d493f92c5b7c7b9c7a3be7f3 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
index 0f3fc85c0707a9fd8b3cbefabef7d4c9f5fa6148..9e7943640deaba55beb8d74a039d5b5d973372f3 100644 (file)
@@ -258,12 +258,42 @@ void gmx::LegacySimulator::do_md()
     initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
     Update     upd(ir, deform);
     const bool doSimulatedAnnealing = initSimulatedAnnealing(ir, &upd);
+    const bool useReplicaExchange   = (replExParams.exchangeInterval > 0);
+
+    bool simulationsShareState = false;
+    int  nstSignalComm         = nstglobalcomm;
+    {
+        // TODO This implementation of ensemble orientation restraints is nasty because
+        // a user can't just do multi-sim with single-sim orientation restraints.
+        bool usingEnsembleRestraints =
+                (fcd->disres.nsystems > 1) || ((ms != nullptr) && (fcd->orires.nr != 0));
+        bool awhUsesMultiSim = (ir->bDoAwh && ir->awhParams->shareBiasMultisim && (ms != nullptr));
+
+        // Replica exchange, ensemble restraints and AWH need all
+        // simulations to remain synchronized, so they need
+        // checkpoints and stop conditions to act on the same step, so
+        // the propagation of such signals must take place between
+        // simulations, not just within simulations.
+        // TODO: Make algorithm initializers set these flags.
+        simulationsShareState = useReplicaExchange || usingEnsembleRestraints || awhUsesMultiSim;
+
+        if (simulationsShareState)
+        {
+            // Inter-simulation signal communication does not need to happen
+            // often, so we use a minimum of 200 steps to reduce overhead.
+            const int c_minimumInterSimulationSignallingInterval = 200;
+            nstSignalComm = ((c_minimumInterSimulationSignallingInterval + nstglobalcomm - 1) / nstglobalcomm)
+                            * nstglobalcomm;
+        }
+    }
+
     if (startingBehavior != StartingBehavior::RestartWithAppending)
     {
         pleaseCiteCouplingAlgorithms(fplog, *ir);
     }
-    gmx_mdoutf*       outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider,
-                                   mdModulesNotifier, ir, top_global, oenv, wcycle, startingBehavior);
+    gmx_mdoutf* outf =
+            init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, ir,
+                        top_global, oenv, wcycle, startingBehavior, simulationsShareState, ms);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, ir, pull_work,
                                    mdoutf_get_fp_dhdl(outf), false, startingBehavior, mdModulesNotifier);
 
@@ -421,7 +451,6 @@ void gmx::LegacySimulator::do_md()
                                 startingBehavior != StartingBehavior::NewSimulation,
                                 shellfc != nullptr, opt2fn("-awh", nfile, fnm), pull_work);
 
-    const bool useReplicaExchange = (replExParams.exchangeInterval > 0);
     if (useReplicaExchange && MASTER(cr))
     {
         repl_ex = init_replica_exchange(fplog, ms, top_global->natoms, ir, replExParams);
@@ -660,33 +689,6 @@ void gmx::LegacySimulator::do_md()
     bExchanged       = FALSE;
     bNeedRepartition = FALSE;
 
-    bool simulationsShareState = false;
-    int  nstSignalComm         = nstglobalcomm;
-    {
-        // TODO This implementation of ensemble orientation restraints is nasty because
-        // a user can't just do multi-sim with single-sim orientation restraints.
-        bool usingEnsembleRestraints =
-                (fcd->disres.nsystems > 1) || ((ms != nullptr) && (fcd->orires.nr != 0));
-        bool awhUsesMultiSim = (ir->bDoAwh && ir->awhParams->shareBiasMultisim && (ms != nullptr));
-
-        // Replica exchange, ensemble restraints and AWH need all
-        // simulations to remain synchronized, so they need
-        // checkpoints and stop conditions to act on the same step, so
-        // the propagation of such signals must take place between
-        // simulations, not just within simulations.
-        // TODO: Make algorithm initializers set these flags.
-        simulationsShareState = useReplicaExchange || usingEnsembleRestraints || awhUsesMultiSim;
-
-        if (simulationsShareState)
-        {
-            // Inter-simulation signal communication does not need to happen
-            // often, so we use a minimum of 200 steps to reduce overhead.
-            const int c_minimumInterSimulationSignallingInterval = 200;
-            nstSignalComm = ((c_minimumInterSimulationSignallingInterval + nstglobalcomm - 1) / nstglobalcomm)
-                            * nstglobalcomm;
-        }
-    }
-
     auto stopHandler = stopHandlerBuilder->getStopHandlerMD(
             compat::not_null<SimulationSignal*>(&signals[eglsSTOPCOND]), simulationsShareState,
             MASTER(cr), ir->nstlist, mdrunOptions.reproducible, nstSignalComm,
@@ -721,10 +723,24 @@ void gmx::LegacySimulator::do_md()
         }
         if (!multisim_int_all_are_equal(ms, ir->init_step))
         {
-            GMX_LOG(mdlog.warning)
-                    .appendText(
-                            "Note: The initial step is not consistent across multi simulations,\n"
-                            "but we are proceeding anyway!");
+            if (simulationsShareState)
+            {
+                if (MASTER(cr))
+                {
+                    gmx_fatal(FARGS,
+                              "The initial step is not consistent across multi simulations which "
+                              "share the state");
+                }
+                gmx_barrier(cr);
+            }
+            else
+            {
+                GMX_LOG(mdlog.warning)
+                        .appendText(
+                                "Note: The initial step is not consistent across multi "
+                                "simulations,\n"
+                                "but we are proceeding anyway!");
+            }
         }
     }
 
@@ -1264,7 +1280,7 @@ void gmx::LegacySimulator::do_md()
 
         if (useGpuForUpdate)
         {
-            if (bNS)
+            if (bNS && (bFirstStep || DOMAINDECOMP(cr)))
             {
                 integrator->set(stateGpu->getCoordinates(), stateGpu->getVelocities(),
                                 stateGpu->getForces(), top.idef, *mdatoms, ekind->ngtc);
index 12daf94c25e0d86c7c5b40a47e347016997ab6fb..381b3b27a6e561127e0cb3187d94602887fecd09 100644 (file)
@@ -226,8 +226,10 @@ void gmx::LegacySimulator::do_mimic()
 
     initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
 
-    gmx_mdoutf* outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier,
-                                   ir, top_global, oenv, wcycle, StartingBehavior::NewSimulation);
+    const bool        simulationsShareState = false;
+    gmx_mdoutf*       outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider,
+                                   mdModulesNotifier, ir, top_global, oenv, wcycle,
+                                   StartingBehavior::NewSimulation, simulationsShareState, ms);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, ir, pull_work,
                                    mdoutf_get_fp_dhdl(outf), true, StartingBehavior::NewSimulation,
                                    mdModulesNotifier);
index 6b36ce823b9a9569afab95865207ea84058cbb3b..3fc65f392f966cfa4737385490152413ebe547bc 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -1093,9 +1093,10 @@ void LegacySimulator::do_cg()
     /* Init em and store the local state in s_min */
     init_em(fplog, mdlog, CG, cr, inputrec, imdSession, pull_work, state_global, top_global, s_min,
             &top, nrnb, fr, &graph, mdAtoms, &gstat, vsite, constr, nullptr);
-    gmx_mdoutf* outf =
-            init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier,
-                        inputrec, top_global, nullptr, wcycle, StartingBehavior::NewSimulation);
+    const bool        simulationsShareState = false;
+    gmx_mdoutf*       outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider,
+                                   mdModulesNotifier, inputrec, top_global, nullptr, wcycle,
+                                   StartingBehavior::NewSimulation, simulationsShareState, ms);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, inputrec, pull_work, nullptr,
                                    false, StartingBehavior::NewSimulation, mdModulesNotifier);
 
@@ -1706,9 +1707,10 @@ void LegacySimulator::do_lbfgs()
     /* Init em */
     init_em(fplog, mdlog, LBFGS, cr, inputrec, imdSession, pull_work, state_global, top_global,
             &ems, &top, nrnb, fr, &graph, mdAtoms, &gstat, vsite, constr, nullptr);
-    gmx_mdoutf* outf =
-            init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier,
-                        inputrec, top_global, nullptr, wcycle, StartingBehavior::NewSimulation);
+    const bool        simulationsShareState = false;
+    gmx_mdoutf*       outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider,
+                                   mdModulesNotifier, inputrec, top_global, nullptr, wcycle,
+                                   StartingBehavior::NewSimulation, simulationsShareState, ms);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, inputrec, pull_work, nullptr,
                                    false, StartingBehavior::NewSimulation, mdModulesNotifier);
 
@@ -2386,9 +2388,10 @@ void LegacySimulator::do_steep()
     /* Init em and store the local state in s_try */
     init_em(fplog, mdlog, SD, cr, inputrec, imdSession, pull_work, state_global, top_global, s_try,
             &top, nrnb, fr, &graph, mdAtoms, &gstat, vsite, constr, nullptr);
-    gmx_mdoutf* outf =
-            init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier,
-                        inputrec, top_global, nullptr, wcycle, StartingBehavior::NewSimulation);
+    const bool        simulationsShareState = false;
+    gmx_mdoutf*       outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider,
+                                   mdModulesNotifier, inputrec, top_global, nullptr, wcycle,
+                                   StartingBehavior::NewSimulation, simulationsShareState, ms);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, inputrec, pull_work, nullptr,
                                    false, StartingBehavior::NewSimulation, mdModulesNotifier);
 
@@ -2631,9 +2634,10 @@ void LegacySimulator::do_nm()
     /* Init em and store the local state in state_minimum */
     init_em(fplog, mdlog, NM, cr, inputrec, imdSession, pull_work, state_global, top_global,
             &state_work, &top, nrnb, fr, &graph, mdAtoms, &gstat, vsite, constr, &shellfc);
-    gmx_mdoutf* outf =
-            init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier,
-                        inputrec, top_global, nullptr, wcycle, StartingBehavior::NewSimulation);
+    const bool  simulationsShareState = false;
+    gmx_mdoutf* outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider,
+                                   mdModulesNotifier, inputrec, top_global, nullptr, wcycle,
+                                   StartingBehavior::NewSimulation, simulationsShareState, ms);
 
     std::vector<int>       atom_index = get_atom_index(top_global);
     std::vector<gmx::RVec> fneg(atom_index.size(), { 0, 0, 0 });
index dc45ee51944b2edcb22b12ceb0aa6f74707b29e4..29c1ae1c6bc383dcfabfb2eeff45f938bc7fd69d 100644 (file)
@@ -41,8 +41,6 @@
  */
 #include "gmxpre.h"
 
-#include "config.h"
-
 #include <cinttypes>
 #include <cmath>
 #include <cstdio>
@@ -302,8 +300,10 @@ void gmx::LegacySimulator::do_rerun()
     }
 
     initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
-    gmx_mdoutf* outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier,
-                                   ir, top_global, oenv, wcycle, StartingBehavior::NewSimulation);
+    const bool        simulationsShareState = false;
+    gmx_mdoutf*       outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider,
+                                   mdModulesNotifier, ir, top_global, oenv, wcycle,
+                                   StartingBehavior::NewSimulation, simulationsShareState, ms);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, ir, pull_work,
                                    mdoutf_get_fp_dhdl(outf), true, StartingBehavior::NewSimulation,
                                    mdModulesNotifier);
@@ -542,7 +542,7 @@ void gmx::LegacySimulator::do_rerun()
         }
 
         force_flags = (GMX_FORCE_STATECHANGED | GMX_FORCE_DYNAMICBOX | GMX_FORCE_ALLFORCES
-                       | (GMX_GPU ? GMX_FORCE_VIRIAL : 0) | // TODO: Get rid of this once #2649 is solved
+                       | GMX_FORCE_VIRIAL | // TODO: Get rid of this once #2649 and #3400 are solved
                        GMX_FORCE_ENERGY | (doFreeEnergyPerturbation ? GMX_FORCE_DHDL : 0));
 
         if (shellfc)
index a567f75944181204739301a3051a01e1ca5874fe..6827e7e9de8ca19bb8b710788e2b79a406e8df3c 100644 (file)
 namespace gmx
 {
 
-/*! \brief Structure that holds boolean flags corresponding to the development
- *        features present enabled through environment variables.
- *
- */
-struct DevelopmentFeatureFlags
-{
-    //! True if the Buffer ops development feature is enabled
-    // TODO: when the trigger of the buffer ops offload is fully automated this should go away
-    bool enableGpuBufferOps = false;
-    //! If true, forces 'mdrun -update auto' default to 'gpu'
-    bool forceGpuUpdateDefault = false;
-    //! True if the GPU halo exchange development feature is enabled
-    bool enableGpuHaloExchange = false;
-    //! True if the PME PP direct communication GPU development feature is enabled
-    bool enableGpuPmePPComm = false;
-};
 
 /*! \brief Manage any development feature flag variables encountered
  *
@@ -907,6 +891,11 @@ int Mdrunner::mdrunner()
     const DevelopmentFeatureFlags devFlags =
             manageDevelopmentFeatures(mdlog, useGpuForNonbonded, pmeRunMode);
 
+    const bool inputIsCompatibleWithModularSimulator = ModularSimulator::isInputCompatible(
+            false, inputrec, doRerun, mtop, ms, replExParams, nullptr, doEssentialDynamics, doMembed);
+    const bool useModularSimulator = inputIsCompatibleWithModularSimulator
+                                     && !(getenv("GMX_DISABLE_MODULAR_SIMULATOR") != nullptr);
+
     // Build restraints.
     // TODO: hide restraint implementation details from Mdrunner.
     // There is nothing unique about restraints at this point as far as the
@@ -953,7 +942,7 @@ int Mdrunner::mdrunner()
         }
 
         /* now make sure the state is initialized and propagated */
-        set_state_entries(globalState.get(), inputrec);
+        set_state_entries(globalState.get(), inputrec, useModularSimulator);
     }
 
     /* NM and TPI parallelize over force/energy calculations, not atoms,
@@ -1181,10 +1170,10 @@ int Mdrunner::mdrunner()
         const bool useUpdateGroups = cr->dd ? ddUsesUpdateGroups(*cr->dd) : false;
 
         useGpuForUpdate = decideWhetherToUseGpuForUpdate(
-                devFlags.forceGpuUpdateDefault, useDomainDecomposition, useUpdateGroups, pmeRunMode,
-                domdecOptions.numPmeRanks > 0, useGpuForNonbonded, updateTarget, gpusWereDetected,
-                *inputrec, mtop, doEssentialDynamics, gmx_mtop_ftype_count(mtop, F_ORIRES) > 0,
-                replExParams.exchangeInterval > 0, doRerun, mdlog);
+                useDomainDecomposition, useUpdateGroups, pmeRunMode, domdecOptions.numPmeRanks > 0,
+                useGpuForNonbonded, updateTarget, gpusWereDetected, *inputrec, mtop,
+                doEssentialDynamics, gmx_mtop_ftype_count(mtop, F_ORIRES) > 0,
+                replExParams.exchangeInterval > 0, doRerun, devFlags, mdlog);
     }
     GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR
 
@@ -1553,13 +1542,6 @@ int Mdrunner::mdrunner()
                             domdecOptions.checkBondedInteractions, fr->cginfo_mb);
         }
 
-        const bool inputIsCompatibleWithModularSimulator = ModularSimulator::isInputCompatible(
-                false, inputrec, doRerun, vsite.get(), ms, replExParams, fcd,
-                static_cast<int>(filenames.size()), filenames.data(), &observablesHistory, membed);
-
-        const bool useModularSimulator = inputIsCompatibleWithModularSimulator
-                                         && !(getenv("GMX_DISABLE_MODULAR_SIMULATOR") != nullptr);
-
         // TODO This is not the right place to manage the lifetime of
         // this data structure, but currently it's the easiest way to
         // make it work.
index 4a0b7fe545b6c456b0cfa0a1881919bb7d039a7f..fcd03cd8d0868215746a5436932aebff6ab4df18 100644 (file)
@@ -44,6 +44,7 @@
 #include "constraintelement.h"
 
 #include "gromacs/math/vec.h"
+#include "gromacs/mdtypes/enerdata.h"
 #include "gromacs/mdtypes/inputrec.h"
 #include "gromacs/mdtypes/state.h"
 #include "gromacs/utility/fatalerror.h"
@@ -130,9 +131,10 @@ void ConstraintsElement<variable>::apply(Step step, bool calculateVirial, bool w
     ArrayRef<RVec>            min_proj;
     ArrayRefWithPadding<RVec> v;
 
-    // disabled functionality
-    real  lambda    = 0;
-    real* dvdlambda = nullptr;
+    const real lambdaBonded = freeEnergyPerturbationElement_
+                                      ? freeEnergyPerturbationElement_->constLambdaView()[efptBONDED]
+                                      : 0;
+    real dvdlambda = 0;
 
     switch (variable)
     {
@@ -150,7 +152,7 @@ void ConstraintsElement<variable>::apply(Step step, bool calculateVirial, bool w
     }
 
     constr_->apply(writeLog, writeEnergy, step, 1, 1.0, x, xprime, min_proj, statePropagatorData_->box(),
-                   lambdadvdlambda, v, calculateVirial ? &vir_con : nullptr, variable);
+                   lambdaBonded, &dvdlambda, v, calculateVirial ? &vir_con : nullptr, variable);
 
     if (calculateVirial)
     {
@@ -163,6 +165,16 @@ void ConstraintsElement<variable>::apply(Step step, bool calculateVirial, bool w
         }
         energyElement_->addToConstraintVirial(vir_con, step);
     }
+
+    /* The factor of 2 correction is necessary because half of the constraint
+     * force is removed in the VV step. This factor is either exact or a very
+     * good approximation, statistically insignificant in any real free energy
+     * calculation. Any possible error is not a simulation propagation error,
+     * but a potential reporting error in the data that goes to dh/dlambda.
+     * Cf. redmine issue #1255
+     */
+    const real c_dvdlConstraintCorrectionFactor = EI_VV(inputrec_->eI) ? 2.0 : 1.0;
+    energyElement_->enerdata()->term[F_DVDL_CONSTR] += c_dvdlConstraintCorrectionFactor * dvdlambda;
 }
 
 template<ConstraintVariable variable>
index 996642b70813efbf0e0eaf92d93ba79a78bbaf4a..2b754d33c2edf9f7b31f20c4173f7ee6242df922 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2019, by the GROMACS development team, led by
+ * Copyright (c) 2019,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.
@@ -128,7 +128,7 @@ private:
     StatePropagatorData* statePropagatorData_;
     //! Pointer to the energy element
     EnergyElement* energyElement_;
-    //! Pointer to the free energy perturbation element (only for initial constraining)
+    //! Pointer to the free energy perturbation element
     FreeEnergyPerturbationElement* freeEnergyPerturbationElement_;
 
     // Access to ISimulator data
index 858fe0b09ed51352063c3eb06ab8a08d20f59784..e731c73bd733dc1c7b761c7bb553f71137fbe344 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2019, by the GROMACS development team, led by
+ * Copyright (c) 2019,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.
@@ -136,6 +136,8 @@ void DomDecHelper::run(Step step, Time gmx_unused time)
     // Correct the new box if it is too skewed
     if (inputrecDynamicBox(inputrec_))
     {
+        // TODO: Correcting the box is done here (if using DD) or in ForceElement (non-DD simulations).
+        //       Think about unifying this responsibility, could this be done in one place?
         t_graph* graph = nullptr;
         if (correct_box(fplog_, step, localState->box, graph))
         {
index c3bf1bb5525b899e079a7474fa0884615b24a447..36f304b3dcf6a79fb7ece4ffa356af9f532135c2 100644 (file)
@@ -47,7 +47,9 @@
 #include "gromacs/mdlib/force.h"
 #include "gromacs/mdlib/force_flags.h"
 #include "gromacs/mdlib/mdatoms.h"
+#include "gromacs/mdtypes/inputrec.h"
 #include "gromacs/mdtypes/mdatom.h"
+#include "gromacs/pbcutil/pbc.h"
 
 #include "energyelement.h"
 #include "freeenergyperturbationelement.h"
@@ -132,6 +134,14 @@ void ForceElement::run(Step step, Time time, unsigned int flags)
     gmx_multisim_t* ms    = nullptr;
     t_graph*        graph = nullptr;
 
+    if (!DOMAINDECOMP(cr_) && (flags & GMX_FORCE_NS) && inputrecDynamicBox(inputrec_))
+    {
+        // TODO: Correcting the box is done in DomDecHelper (if using DD) or here (non-DD simulations).
+        //       Think about unifying this responsibility, could this be done in one place?
+        auto box = statePropagatorData_->box();
+        correct_box(fplog_, step, box, graph);
+    }
+
     /* The coordinates (x) are shifted (to get whole molecules)
      * in do_force.
      * This is parallelized as well, and does communication too.
index 370831a67bb67583e2862bfdc2976d7e591f378f..dfedd40457b5635dda9c5837a46fd9cf3221d359 100644 (file)
@@ -54,6 +54,7 @@
 #include "gromacs/mdlib/checkpointhandler.h"
 #include "gromacs/mdlib/constr.h"
 #include "gromacs/mdlib/energyoutput.h"
+#include "gromacs/mdlib/forcerec.h"
 #include "gromacs/mdlib/mdatoms.h"
 #include "gromacs/mdlib/resethandler.h"
 #include "gromacs/mdlib/stat.h"
@@ -72,6 +73,7 @@
 #include "gromacs/mdtypes/state.h"
 #include "gromacs/nbnxm/nbnxm.h"
 #include "gromacs/timing/walltime_accounting.h"
+#include "gromacs/topology/mtop_util.h"
 #include "gromacs/topology/topology.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/fatalerror.h"
@@ -476,7 +478,7 @@ void ModularSimulator::constructElementsAndSignallers()
     loggingSignallerBuilder.registerSignallerClient(compat::make_not_null(energySignaller.get()));
     auto trajectoryElement = trajectoryElementBuilder.build(
             fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, inputrec,
-            top_global, oenv, wcycle, startingBehavior);
+            top_global, oenv, wcycle, startingBehavior, simulationsShareState);
     loggingSignallerBuilder.registerSignallerClient(compat::make_not_null(trajectoryElement.get()));
 
     // Add checkpoint helper here since we need a pointer to the trajectory element and
@@ -766,14 +768,12 @@ std::unique_ptr<ISimulatorElement> ModularSimulator::buildIntegrator(
 bool ModularSimulator::isInputCompatible(bool                             exitOnFailure,
                                          const t_inputrec*                inputrec,
                                          bool                             doRerun,
-                                         const gmx_vsite_t*               vsite,
+                                         const gmx_mtop_t&                globalTopology,
                                          const gmx_multisim_t*            ms,
                                          const ReplicaExchangeParameters& replExParams,
                                          const t_fcdata*                  fcd,
-                                         int                              nfile,
-                                         const t_filenm*                  fnm,
-                                         ObservablesHistory*              observablesHistory,
-                                         const gmx_membed_t*              membed)
+                                         bool                             doEssentialDynamics,
+                                         bool                             doMembed)
 {
     auto conditionalAssert = [exitOnFailure](bool condition, const char* message) {
         if (exitOnFailure)
@@ -866,11 +866,20 @@ bool ModularSimulator::isInputCompatible(bool                             exitOn
                        "Deformation is not supported by the modular simulator.");
     isInputCompatible =
             isInputCompatible
-            && conditionalAssert(vsite == nullptr,
+            && conditionalAssert(gmx_mtop_interaction_count(globalTopology, IF_VSITE) == 0,
                                  "Virtual sites are not supported by the modular simulator.");
     isInputCompatible = isInputCompatible
                         && conditionalAssert(!inputrec->bDoAwh,
                                              "AWH is not supported by the modular simulator.");
+    isInputCompatible =
+            isInputCompatible
+            && conditionalAssert(gmx_mtop_ftype_count(globalTopology, F_DISRES) == 0,
+                                 "Distance restraints are not supported by the modular simulator.");
+    isInputCompatible =
+            isInputCompatible
+            && conditionalAssert(
+                       gmx_mtop_ftype_count(globalTopology, F_ORIRES) == 0,
+                       "Orientation restraints are not supported by the modular simulator.");
     isInputCompatible =
             isInputCompatible
             && conditionalAssert(ms == nullptr,
@@ -879,9 +888,23 @@ bool ModularSimulator::isInputCompatible(bool                             exitOn
             isInputCompatible
             && conditionalAssert(replExParams.exchangeInterval == 0,
                                  "Replica exchange is not supported by the modular simulator.");
+
+    int numEnsembleRestraintSystems;
+    if (fcd)
+    {
+        numEnsembleRestraintSystems = fcd->disres.nsystems;
+    }
+    else
+    {
+        auto distantRestraintEnsembleEnvVar = getenv("GMX_DISRE_ENSEMBLE_SIZE");
+        numEnsembleRestraintSystems =
+                (ms != nullptr && distantRestraintEnsembleEnvVar != nullptr)
+                        ? static_cast<int>(strtol(distantRestraintEnsembleEnvVar, nullptr, 10))
+                        : 0;
+    }
     isInputCompatible =
             isInputCompatible
-            && conditionalAssert(fcd->disres.nsystems <= 1,
+            && conditionalAssert(numEnsembleRestraintSystems <= 1,
                                  "Ensemble restraints are not supported by the modular simulator.");
     isInputCompatible =
             isInputCompatible
@@ -897,9 +920,8 @@ bool ModularSimulator::isInputCompatible(bool                             exitOn
                                              "the modular simulator.");
     isInputCompatible =
             isInputCompatible
-            && conditionalAssert(
-                       !(opt2bSet("-ei", nfile, fnm) || observablesHistory->edsamHistory != nullptr),
-                       "Essential dynamics is not supported by the modular simulator.");
+            && conditionalAssert(!doEssentialDynamics,
+                                 "Essential dynamics is not supported by the modular simulator.");
     isInputCompatible = isInputCompatible
                         && conditionalAssert(inputrec->eSwapCoords == eswapNO,
                                              "Ion / water position swapping is not supported by "
@@ -910,8 +932,12 @@ bool ModularSimulator::isInputCompatible(bool                             exitOn
                                  "Interactive MD is not supported by the modular simulator.");
     isInputCompatible =
             isInputCompatible
-            && conditionalAssert(membed == nullptr,
+            && conditionalAssert(!doMembed,
                                  "Membrane embedding is not supported by the modular simulator.");
+    const bool useGraph = !areMoleculesDistributedOverPbc(*inputrec, globalTopology, MDLogger());
+    isInputCompatible =
+            isInputCompatible
+            && conditionalAssert(!useGraph, "Graph is not supported by the modular simulator.");
     // TODO: Change this to the boolean passed when we merge the user interface change for the GPU update.
     isInputCompatible =
             isInputCompatible
@@ -933,8 +959,15 @@ bool ModularSimulator::isInputCompatible(bool                             exitOn
 
 void ModularSimulator::checkInputForDisabledFunctionality()
 {
-    isInputCompatible(true, inputrec, doRerun, vsite, ms, replExParams, fcd, nfile, fnm,
-                      observablesHistory, membed);
+    isInputCompatible(true, inputrec, doRerun, *top_global, ms, replExParams, fcd,
+                      opt2bSet("-ei", nfile, fnm), membed != nullptr);
+    if (observablesHistory->edsamHistory)
+    {
+        gmx_fatal(FARGS,
+                  "The checkpoint is from a run with essential dynamics sampling, "
+                  "but the current run did not specify the -ei option. "
+                  "Either specify the -ei option to mdrun, or do not use this checkpoint file.");
+    }
 }
 
 SignallerCallbackPtr ModularSimulator::SignalHelper::registerLastStepCallback()
index c16ee189269cb49a85e0cb0ffcdd99f882a0d12a..114c4a21aab71bae1edb3ef659ce52a5d00be386 100644 (file)
@@ -85,14 +85,12 @@ public:
     static bool isInputCompatible(bool                             exitOnFailure,
                                   const t_inputrec*                inputrec,
                                   bool                             doRerun,
-                                  const gmx_vsite_t*               vsite,
+                                  const gmx_mtop_t&                globalTopology,
                                   const gmx_multisim_t*            ms,
                                   const ReplicaExchangeParameters& replExParams,
                                   const t_fcdata*                  fcd,
-                                  int                              nfile,
-                                  const t_filenm*                  fnm,
-                                  ObservablesHistory*              observablesHistory,
-                                  const gmx_membed_t*              membed);
+                                  bool                             doEssentialDynamics,
+                                  bool                             doMembed);
 
     // Only builder can construct
     friend class SimulatorBuilder;
index 1cb6abf590463b819b15c29cd7c07ab246d24445..21ffd812bc79d794d2dba2b3e4fceeaaacc0c96f 100644 (file)
@@ -78,7 +78,6 @@ ParrinelloRahmanBarostat::ParrinelloRahmanBarostat(int                   nstpcou
     offset_(offset),
     couplingTimeStep_(couplingTimeStep),
     initStep_(initStep),
-    isInitStep_(true),
     scalingTensor_(scalingTensor),
     propagatorCallback_(std::move(propagatorCallback)),
     statePropagatorData_(statePropagatorData),
@@ -133,7 +132,7 @@ void ParrinelloRahmanBarostat::integrateBoxVelocityEquations(Step step)
 {
     auto box = statePropagatorData_->constBox();
     parrinellorahman_pcoupl(fplog_, step, inputrec_, couplingTimeStep_, energyElement_->pressure(step),
-                            box, boxRel_, boxVelocity_, scalingTensor_.data(), mu_, isInitStep_);
+                            box, boxRel_, boxVelocity_, scalingTensor_.data(), mu_, false);
     // multiply matrix by the coupling time step to avoid having the propagator needing to know about that
     msmul(scalingTensor_.data(), couplingTimeStep_, scalingTensor_.data());
 }
@@ -173,10 +172,22 @@ void ParrinelloRahmanBarostat::elementSetup()
     const bool scaleOnInitStep = do_per_step(initStep_ + nstpcouple_ + offset_, nstpcouple_);
     if (scaleOnInitStep)
     {
-        integrateBoxVelocityEquations(initStep_);
-        (*propagatorCallback_)(initStep_ + 1);
+        // If we need to scale on the first step, we need to set the scaling matrix using the current
+        // box velocity. If this is a fresh start, we will hence not move the box (this does currently
+        // never happen as the offset is set to -1 in all cases). If this is a restart, we will use
+        // the saved box velocity which we would have updated right before checkpointing.
+        // Setting bFirstStep = true in parrinellorahman_pcoupl (last argument) makes sure that only
+        // the scaling matrix is calculated, without updating the box velocities.
+        // The call to parrinellorahman_pcoupl is using nullptr for fplog (since we don't expect any
+        // output here) and for the pressure (since it might not be calculated yet, and we don't need it).
+        auto box = statePropagatorData_->constBox();
+        parrinellorahman_pcoupl(nullptr, initStep_, inputrec_, couplingTimeStep_, nullptr, box,
+                                boxRel_, boxVelocity_, scalingTensor_.data(), mu_, true);
+        // multiply matrix by the coupling time step to avoid having the propagator needing to know about that
+        msmul(scalingTensor_.data(), couplingTimeStep_, scalingTensor_.data());
+
+        (*propagatorCallback_)(initStep_);
     }
-    isInitStep_ = false;
 }
 
 const rvec* ParrinelloRahmanBarostat::boxVelocities() const
index d73dbdbdc35186400767fde624f59f4b9ac967ac..25b40d546bc0a801baf9f37a3c3f221441a0e72b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2019, by the GROMACS development team, led by
+ * Copyright (c) 2019,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.
@@ -111,9 +111,6 @@ private:
     //! The first step of the simulation
     const Step initStep_;
 
-    //! Whether this is the first step
-    bool isInitStep_;
-
     //! View on the velocity scaling tensor (owned by the propagator)
     ArrayRef<rvec> scalingTensor_;
     //! Callback to let propagator know that we updated lambda
index 380a1c287d3021f173144f438b3c968d565c1c31..8eca620e4c21459e222cc645e63c383d16fa3958 100644 (file)
@@ -52,6 +52,7 @@
 #include "gromacs/mdrun/shellfc.h"
 #include "gromacs/mdtypes/inputrec.h"
 #include "gromacs/mdtypes/mdatom.h"
+#include "gromacs/pbcutil/pbc.h"
 #include "gromacs/topology/atoms.h"
 #include "gromacs/topology/mtop_util.h"
 
@@ -147,8 +148,9 @@ void ShellFCElement::scheduleTask(Step step, Time time, const RegisterRunFunctio
              | (nextEnergyCalculationStep_ == step ? GMX_FORCE_ENERGY : 0)
              | (nextFreeEnergyCalculationStep_ == step ? GMX_FORCE_DHDL : 0));
 
+    const bool isNSStep = (step == nextNSStep_);
     (*registerRunFunction)(std::make_unique<SimulatorRunFunction>(
-            [this, step, time, flags]() { run(step, time, flags); }));
+            [this, step, time, flags, isNSStep]() { run(step, time, isNSStep, flags); }));
     nSteps_++;
 }
 
@@ -157,12 +159,20 @@ void ShellFCElement::elementSetup()
     GMX_ASSERT(localTopology_, "Setup called before local topology was set.");
 }
 
-void ShellFCElement::run(Step step, Time time, unsigned int flags)
+void ShellFCElement::run(Step step, Time time, bool isNSStep, unsigned int flags)
 {
     // Disabled functionality
     gmx_multisim_t* ms    = nullptr;
     t_graph*        graph = nullptr;
 
+    if (!DOMAINDECOMP(cr_) && isNSStep && inputrecDynamicBox(inputrec_))
+    {
+        // TODO: Correcting the box is done in DomDecHelper (if using DD) or here (non-DD simulations).
+        //       Think about unifying this responsibility, could this be done in one place?
+        auto box = statePropagatorData_->box();
+        correct_box(fplog_, step, box, graph);
+    }
+
     auto       x      = statePropagatorData_->positionsView();
     auto       v      = statePropagatorData_->velocitiesView();
     auto       forces = statePropagatorData_->forcesView();
@@ -173,12 +183,12 @@ void ShellFCElement::run(Step step, Time time, unsigned int flags)
     // TODO: Make lambda const (needs some adjustments in lower force routines)
     ArrayRef<real> lambda =
             freeEnergyPerturbationElement_ ? freeEnergyPerturbationElement_->lambdaView() : lambda_;
-    relax_shell_flexcon(
-            fplog_, cr_, ms, isVerbose_, enforcedRotation_, step, inputrec_, imdSession_,
-            pull_work_, step == nextNSStep_, static_cast<int>(flags), localTopology_, constr_,
-            energyElement_->enerdata(), fcd_, statePropagatorData_->localNumAtoms(), x, v, box,
-            lambda, hist, forces, force_vir, mdAtoms_->mdatoms(), nrnb_, wcycle_, graph, shellfc_,
-            fr_, runScheduleWork_, time, energyElement_->muTot(), vsite_, ddBalanceRegionHandler_);
+    relax_shell_flexcon(fplog_, cr_, ms, isVerbose_, enforcedRotation_, step, inputrec_, imdSession_,
+                        pull_work_, isNSStep, static_cast<int>(flags), localTopology_, constr_,
+                        energyElement_->enerdata(), fcd_, statePropagatorData_->localNumAtoms(), x,
+                        v, box, lambda, hist, forces, force_vir, mdAtoms_->mdatoms(), nrnb_,
+                        wcycle_, graph, shellfc_, fr_, runScheduleWork_, time,
+                        energyElement_->muTot(), vsite_, ddBalanceRegionHandler_);
     energyElement_->addToForceVirial(force_vir, step);
 }
 
index a6963a1620a1d56bca2c2a01d0914d265f5a4bbe..548ff18e8f2cd92256ac5e9ba9a74b05b79a4814 100644 (file)
@@ -127,7 +127,7 @@ private:
     //! IEnergySignallerClient implementation
     SignallerCallbackPtr registerEnergyCallback(EnergySignallerEvent event) override;
     //! The actual do_force call
-    void run(Step step, Time time, unsigned int flags);
+    void run(Step step, Time time, bool isNSStep, unsigned int flags);
 
     //! The shell / FC helper struct
     gmx_shellfc_t* shellfc_;
index 2c7662c1f3a57a047c13df20f27f5410bffbdd17..e5bf8f5b874704069ee63d483571b3bbb8d66a2d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2019, by the GROMACS development team, led by
+ * Copyright (c) 2019,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.
@@ -66,11 +66,13 @@ TopologyHolder::TopologyHolder(const gmx_mtop_t& globalTopology,
     }
     else
     {
+        t_graph* graph = nullptr;
         // Generate and initialize new topology
         // Note that most of the data needed for the constructor is used here -
         // this function should probably be simplified sooner or later.
-        mdAlgorithmsSetupAtomData(cr, inputrec, globalTopology, localTopology_.get(), fr, nullptr,
+        mdAlgorithmsSetupAtomData(cr, inputrec, globalTopology, localTopology_.get(), fr, &graph,
                                   mdAtoms, constr, vsite, nullptr);
+        GMX_RELEASE_ASSERT(graph == nullptr, "Graph is not implemented for the modular simulator.");
     }
 }
 
index 60998cdf0610286a153f311eaa71c82cc3cd1265..1195b294cb70b286d0bcead32fe0ebe83126b723 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2019, by the GROMACS development team, led by
+ * Copyright (c) 2019,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.
@@ -63,10 +63,24 @@ TrajectoryElement::TrajectoryElement(std::vector<SignallerCallbackPtr>     signa
                                      gmx_mtop_t*                           top_global,
                                      const gmx_output_env_t*               oenv,
                                      gmx_wallcycle*                        wcycle,
-                                     StartingBehavior                      startingBehavior) :
+                                     StartingBehavior                      startingBehavior,
+                                     const bool                            simulationsShareState) :
     writeEnergyStep_(-1),
     writeStateStep_(-1),
-    outf_(init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, inputrec, top_global, oenv, wcycle, startingBehavior)),
+    outf_(init_mdoutf(fplog,
+                      nfile,
+                      fnm,
+                      mdrunOptions,
+                      cr,
+                      outputProvider,
+                      mdModulesNotifier,
+                      inputrec,
+                      top_global,
+                      oenv,
+                      wcycle,
+                      startingBehavior,
+                      simulationsShareState,
+                      nullptr)),
     nstxout_(inputrec->nstxout),
     nstvout_(inputrec->nstvout),
     nstfout_(inputrec->nstfout),
index d33656a85b478dc2efd572159609cf5d11ed4c6f..fd7060202439d0c6ff4fc8d8e98f75ecabbf29aa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2019, by the GROMACS development team, led by
+ * Copyright (c) 2019,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.
@@ -159,7 +159,8 @@ private:
                       gmx_mtop_t*                           top_global,
                       const gmx_output_env_t*               oenv,
                       gmx_wallcycle*                        wcycle,
-                      StartingBehavior                      startingBehavior);
+                      StartingBehavior                      startingBehavior,
+                      bool                                  simulationsSharingState);
 
     //! The next energy writing step
     Step writeEnergyStep_;
index e98d2deba6b85311a7b10fbbbd8b9608b2c756ad..242536c99f7784930b795552a39db7ceef2e188a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017 by the GROMACS development team.
+ * Copyright (c) 2012,2013,2014,2015,2017 The GROMACS development team.
  * Copyright (c) 2018,2019,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
@@ -118,6 +118,10 @@ static p_nbk_func_noener nbnxn_kernel_noener_ref[coulktNR][vdwktNR_ref] = {
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJFsw_F_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJPsw_F_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombLB_F_ref },
+    { nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_ref,
+      nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJFsw_F_ref,
+      nbnxn_kernel_ElecQSTabTwinCut_VdwLJPsw_F_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_ref,
+      nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombLB_F_ref },
     { nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJFsw_F_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJPsw_F_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_ref,
@@ -136,6 +140,10 @@ static p_nbk_func_ener nbnxn_kernel_ener_ref[coulktNR][vdwktNR_ref] = {
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJFsw_VF_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJPsw_VF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombLB_VF_ref },
+    { nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_ref,
+      nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJFsw_VF_ref,
+      nbnxn_kernel_ElecQSTabTwinCut_VdwLJPsw_VF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_ref,
+      nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombLB_VF_ref },
     { nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJFsw_VF_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJPsw_VF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_ref,
@@ -155,6 +163,10 @@ static p_nbk_func_ener nbnxn_kernel_energrp_ref[coulktNR][vdwktNR_ref] = {
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJFsw_VgrpF_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJPsw_VgrpF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombLB_VgrpF_ref },
+    { nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_ref,
+      nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJFsw_VgrpF_ref,
+      nbnxn_kernel_ElecQSTabTwinCut_VdwLJPsw_VgrpF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_ref,
+      nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombLB_VgrpF_ref },
     { nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJFsw_VgrpF_ref,
       nbnxn_kernel_ElecQSTabTwinCut_VdwLJPsw_VgrpF_ref, nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_ref,
index debc49b17e3e2b1315c0d4a6fec536e6e9eae78d..3362a410db3c7fd50ec1a92e6ff6985f9a505d60 100644 (file)
@@ -90,7 +90,7 @@ static constexpr gmx::EnumerationArray<KernelType, int> JClusterSizePerKernelTyp
 #else
       0, 0,
 #endif
-      c_nbnxnGpuClusterSize, c_nbnxnGpuClusterSize }
+      c_nbnxnGpuClusterSize, c_nbnxnGpuClusterSize / 2 }
 };
 
 /*! \brief Returns whether the pair-list corresponding to nb_kernel_type is simple */
index b6659b2e7b4adc8a048a8203a3dd885b68a89da7..2f9d2baa85f8c8f208b93e5e77b209b942cdfddf 100644 (file)
@@ -521,73 +521,86 @@ bool decideWhetherToUseGpusForBonded(const bool       useGpuForNonbonded,
     return gpusWereDetected && usingOurCpuForPmeOrEwald;
 }
 
-bool decideWhetherToUseGpuForUpdate(const bool           forceGpuUpdateDefault,
-                                    const bool           isDomainDecomposition,
-                                    const bool           useUpdateGroups,
-                                    const PmeRunMode     pmeRunMode,
-                                    const bool           havePmeOnlyRank,
-                                    const bool           useGpuForNonbonded,
-                                    const TaskTarget     updateTarget,
-                                    const bool           gpusWereDetected,
-                                    const t_inputrec&    inputrec,
-                                    const gmx_mtop_t&    mtop,
-                                    const bool           useEssentialDynamics,
-                                    const bool           doOrientationRestraints,
-                                    const bool           useReplicaExchange,
-                                    const bool           doRerun,
-                                    const gmx::MDLogger& mdlog)
+bool decideWhetherToUseGpuForUpdate(const bool                     isDomainDecomposition,
+                                    const bool                     useUpdateGroups,
+                                    const PmeRunMode               pmeRunMode,
+                                    const bool                     havePmeOnlyRank,
+                                    const bool                     useGpuForNonbonded,
+                                    const TaskTarget               updateTarget,
+                                    const bool                     gpusWereDetected,
+                                    const t_inputrec&              inputrec,
+                                    const gmx_mtop_t&              mtop,
+                                    const bool                     useEssentialDynamics,
+                                    const bool                     doOrientationRestraints,
+                                    const bool                     useReplicaExchange,
+                                    const bool                     doRerun,
+                                    const DevelopmentFeatureFlags& devFlags,
+                                    const gmx::MDLogger&           mdlog)
 {
 
     // '-update cpu' overrides the environment variable, '-update auto' does not
-    if (updateTarget == TaskTarget::Cpu || (updateTarget == TaskTarget::Auto && !forceGpuUpdateDefault))
+    if (updateTarget == TaskTarget::Cpu
+        || (updateTarget == TaskTarget::Auto && !devFlags.forceGpuUpdateDefault))
     {
         return false;
     }
 
     const bool hasAnyConstraints = gmx_mtop_interaction_count(mtop, IF_CONSTRAINT) > 0;
+    const bool pmeUsesCpu = (pmeRunMode == PmeRunMode::CPU || pmeRunMode == PmeRunMode::Mixed);
 
     std::string errorMessage;
 
     if (isDomainDecomposition)
     {
-        if (!forceGpuUpdateDefault)
+        if (!devFlags.enableGpuHaloExchange)
         {
-            errorMessage += "Domain decomposition is not supported.\n ";
+            errorMessage += "Domain decomposition without GPU halo exchange is not supported.\n ";
         }
-        else if (hasAnyConstraints && !useUpdateGroups)
+        else
+        {
+            if (hasAnyConstraints && !useUpdateGroups)
+            {
+                errorMessage +=
+                        "Domain decomposition is only supported with constraints when update "
+                        "groups "
+                        "are used. This means constraining all bonds is not supported, except for "
+                        "small molecules, and box sizes close to half the pair-list cutoff are not "
+                        "supported.\n ";
+            }
+
+            if (pmeUsesCpu)
+            {
+                errorMessage += "With domain decomposition, PME must run fully on the GPU.\n";
+            }
+        }
+    }
+
+    if (havePmeOnlyRank)
+    {
+        if (pmeUsesCpu)
+        {
+            errorMessage += "With separate PME rank(s), PME must run fully on the GPU.\n";
+        }
+
+        if (!devFlags.enableGpuPmePPComm)
         {
-            errorMessage +=
-                    "Domain decomposition is only supported with constraints when update groups "
-                    "are used. This means constraining all bonds is not supported, except for "
-                    "small molecules, and box sizes close to half the pair-list cutoff are not "
-                    "supported.\n ";
+            errorMessage += "With separate PME rank(s), PME must use direct communication.\n";
         }
     }
+
     if (inputrec.eConstrAlg == econtSHAKE && hasAnyConstraints && gmx_mtop_ftype_count(mtop, F_CONSTR) > 0)
     {
         errorMessage += "SHAKE constraints are not supported.\n";
     }
     // Using the GPU-version of update if:
-    // 1. PME is on the GPU (there should be a copy of coordinates on GPU for PME spread), or
+    // 1. PME is on the GPU (there should be a copy of coordinates on GPU for PME spread) or inactive, or
     // 2. Non-bonded interactions are on the GPU.
-    if (pmeRunMode == PmeRunMode::CPU && !useGpuForNonbonded)
+    if ((pmeRunMode == PmeRunMode::CPU || pmeRunMode == PmeRunMode::None) && !useGpuForNonbonded)
     {
         errorMessage +=
                 "Either PME or short-ranged non-bonded interaction tasks must run on the GPU.\n";
     }
 
-    // If PME is active (i.e. not PmeRunMode::None), then GPU update requires
-    // either a single-rank run, or that PME runs fully on the GPU.
-    const bool pmeRunningOnCpu = (pmeRunMode == PmeRunMode::CPU || pmeRunMode == PmeRunMode::Mixed);
-    if (pmeRunningOnCpu && isDomainDecomposition)
-    {
-        errorMessage += "With domain decomposition, PME must run fully on the GPU.\n";
-    }
-    if (pmeRunningOnCpu && havePmeOnlyRank)
-    {
-        errorMessage += "With separate PME rank(s), PME must run fully on the GPU.\n";
-    }
-
     if (!gpusWereDetected)
     {
         errorMessage += "Compatible GPUs must have been found.\n";
@@ -668,7 +681,7 @@ bool decideWhetherToUseGpuForUpdate(const bool           forceGpuUpdateDefault,
 
     if (!errorMessage.empty())
     {
-        if (updateTarget != TaskTarget::Gpu && forceGpuUpdateDefault)
+        if (updateTarget == TaskTarget::Auto && devFlags.forceGpuUpdateDefault)
         {
             GMX_LOG(mdlog.warning)
                     .asParagraph()
@@ -689,14 +702,8 @@ bool decideWhetherToUseGpuForUpdate(const bool           forceGpuUpdateDefault,
         return false;
     }
 
-    if (isDomainDecomposition)
-    {
-        return forceGpuUpdateDefault;
-    }
-    else
-    {
-        return (updateTarget == TaskTarget::Gpu || forceGpuUpdateDefault);
-    }
+    return (updateTarget == TaskTarget::Gpu
+            || (updateTarget == TaskTarget::Auto && devFlags.forceGpuUpdateDefault));
 }
 
 } // namespace gmx
index 921b0a778bdf14e626ea63cf8424c92038999405..bfb002547a36996a9beb535ee09d108c55b26826 100644 (file)
@@ -72,6 +72,25 @@ enum class EmulateGpuNonbonded : bool
     Yes
 };
 
+/*! \libinternal
+ *  \brief Structure that holds boolean flags corresponding to the development
+ *        features present enabled through environment variables.
+ *
+ */
+struct DevelopmentFeatureFlags
+{
+    //! True if the Buffer ops development feature is enabled
+    // TODO: when the trigger of the buffer ops offload is fully automated this should go away
+    bool enableGpuBufferOps = false;
+    //! If true, forces 'mdrun -update auto' default to 'gpu'
+    bool forceGpuUpdateDefault = false;
+    //! True if the GPU halo exchange development feature is enabled
+    bool enableGpuHaloExchange = false;
+    //! True if the PME PP direct communication GPU development feature is enabled
+    bool enableGpuPmePPComm = false;
+};
+
+
 class MDAtoms;
 
 /*! \brief Decide whether this thread-MPI simulation will run
@@ -249,7 +268,6 @@ bool decideWhetherToUseGpusForBonded(bool       useGpuForNonbonded,
 
 /*! \brief Decide whether to use GPU for update.
  *
- * \param[in]  forceGpuUpdateDefault        If update should run on GPU by default.
  * \param[in]  isDomainDecomposition        Whether there more than one domain.
  * \param[in]  useUpdateGroups              If the constraints can be split across domains.
  * \param[in]  pmeRunMode                   PME running mode: CPU, GPU or mixed.
@@ -263,27 +281,28 @@ bool decideWhetherToUseGpusForBonded(bool       useGpuForNonbonded,
  * \param[in]  doOrientationRestraints      If orientation restraints are enabled.
  * \param[in]  useReplicaExchange           If this is a REMD simulation.
  * \param[in]  doRerun                      It this is a rerun.
+ * \param[in]  devFlags                     GPU development / experimental feature flags.
  * \param[in]  mdlog                        MD logger.
  *
  * \returns    Whether complete simulation can be run on GPU.
  * \throws     std::bad_alloc            If out of memory
  *             InconsistentInputError    If the user requirements are inconsistent.
  */
-bool decideWhetherToUseGpuForUpdate(bool                 forceGpuUpdateDefault,
-                                    bool                 isDomainDecomposition,
-                                    bool                 useUpdateGroups,
-                                    PmeRunMode           pmeRunMode,
-                                    bool                 havePmeOnlyRank,
-                                    bool                 useGpuForNonbonded,
-                                    TaskTarget           updateTarget,
-                                    bool                 gpusWereDetected,
-                                    const t_inputrec&    inputrec,
-                                    const gmx_mtop_t&    mtop,
-                                    bool                 useEssentialDynamics,
-                                    bool                 doOrientationRestraints,
-                                    bool                 useReplicaExchange,
-                                    bool                 doRerun,
-                                    const gmx::MDLogger& mdlog);
+bool decideWhetherToUseGpuForUpdate(bool                           isDomainDecomposition,
+                                    bool                           useUpdateGroups,
+                                    PmeRunMode                     pmeRunMode,
+                                    bool                           havePmeOnlyRank,
+                                    bool                           useGpuForNonbonded,
+                                    TaskTarget                     updateTarget,
+                                    bool                           gpusWereDetected,
+                                    const t_inputrec&              inputrec,
+                                    const gmx_mtop_t&              mtop,
+                                    bool                           useEssentialDynamics,
+                                    bool                           doOrientationRestraints,
+                                    bool                           useReplicaExchange,
+                                    bool                           doRerun,
+                                    const DevelopmentFeatureFlags& devFlags,
+                                    const gmx::MDLogger&           mdlog);
 
 
 } // namespace gmx
index 680ce4d31522d68dea137fd3b777a0d5679015c8..48d825f282aa0ed4752f24cef1ef65df7f919cd2 100644 (file)
@@ -138,6 +138,8 @@ void reportGpuUsage(const MDLogger&                   mdlog,
         output += gmx::formatString(
                 "PP tasks will do (non-perturbed) short-ranged%s interactions on the GPU\n",
                 useGpuForBonded ? " and most bonded" : "");
+        output += gmx::formatString("PP task will update and constrain coordinates on the %s",
+                                    useGpuForUpdate ? "GPU" : "CPU");
         if (pmeRunMode == PmeRunMode::Mixed)
         {
             output += gmx::formatString("PME tasks will do only spread and gather on the GPU\n");
@@ -146,8 +148,6 @@ void reportGpuUsage(const MDLogger&                   mdlog,
         {
             output += gmx::formatString("PME tasks will do all aspects on the GPU\n");
         }
-        output += gmx::formatString("Coordinates will be updated and constrained on the %s.",
-                                    useGpuForUpdate ? "GPU" : "CPU");
     }
 
     /* NOTE: this print is only for and on one physical node */
index 315b30e24223d677ee73f000b4071e4471b6c612..24af506d980463cd454b414bf83cd17ea49fbb41 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+# Copyright (c) 2013,2014,2015,2016,2017 The GROMACS development team.
 # Copyright (c) 2018,2019,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
@@ -60,6 +60,7 @@ gmx_add_gtest_executable(
     initialconstraints.cpp
     interactiveMD.cpp
     outputfiles.cpp
+    orires.cpp
     pmetest.cpp
     simulator.cpp
     swapcoords.cpp
index db688cdd1824c7db3b4495b2f45c9176a1e08e4d..6e40311a5a424603421d497ef43874882180fc07 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018,2019, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019,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.
@@ -354,6 +354,25 @@ TEST_P(MdrunNoAppendContinuationIsExact, WithinTolerances)
     auto integrator          = std::get<1>(params);
     auto temperatureCoupling = std::get<2>(params);
     auto pressureCoupling    = std::get<3>(params);
+
+    // Check for unimplemented functionality
+    // TODO: Update this as modular simulator gains functionality
+    const bool isModularSimulatorExplicitlyDisabled = (getenv("GMX_DISABLE_MODULAR_SIMULATOR") != nullptr);
+    const bool isTCouplingCompatibleWithModularSimulator =
+            (temperatureCoupling == "no" || temperatureCoupling == "v-rescale");
+    if (integrator == "md-vv" && pressureCoupling == "parrinello-rahman"
+        && (isModularSimulatorExplicitlyDisabled || !isTCouplingCompatibleWithModularSimulator))
+    {
+        // Under md-vv, Parrinello-Rahman is only implemented for the modular simulator
+        return;
+    }
+    if (integrator == "md-vv" && temperatureCoupling == "nose-hoover"
+        && pressureCoupling == "berendsen")
+    {
+        // This combination is not implemented in either legacy or modular simulator
+        return;
+    }
+
     SCOPED_TRACE(
             formatString("Comparing normal and two-part run of simulation '%s' "
                          "with integrator '%s'",
@@ -411,42 +430,28 @@ INSTANTIATE_TEST_CASE_P(NormalIntegratorsWithFEP,
                                            ::testing::Values("no")));
 
 INSTANTIATE_TEST_CASE_P(
-        NormalNVT,
+        NVT,
         MdrunNoAppendContinuationIsExact,
         ::testing::Combine(::testing::Values("argon12"),
                            ::testing::Values("md", "md-vv"),
                            ::testing::Values("berendsen", "v-rescale", "nose-hoover"),
                            ::testing::Values("no")));
 
-INSTANTIATE_TEST_CASE_P(LeapfrogNPH,
+INSTANTIATE_TEST_CASE_P(NPH,
                         MdrunNoAppendContinuationIsExact,
                         ::testing::Combine(::testing::Values("argon12"),
-                                           ::testing::Values("md"),
+                                           ::testing::Values("md", "md-vv"),
                                            ::testing::Values("no"),
                                            ::testing::Values("berendsen", "parrinello-rahman")));
 
 INSTANTIATE_TEST_CASE_P(
-        LeapfrogNPT,
+        NPT,
         MdrunNoAppendContinuationIsExact,
         ::testing::Combine(::testing::Values("argon12"),
-                           ::testing::Values("md"),
+                           ::testing::Values("md", "md-vv"),
                            ::testing::Values("berendsen", "v-rescale", "nose-hoover"),
                            ::testing::Values("berendsen", "parrinello-rahman")));
 
-INSTANTIATE_TEST_CASE_P(VelocityVerletNPH,
-                        MdrunNoAppendContinuationIsExact,
-                        ::testing::Combine(::testing::Values("argon12"),
-                                           ::testing::Values("md-vv"),
-                                           ::testing::Values("no"),
-                                           ::testing::Values("berendsen")));
-
-INSTANTIATE_TEST_CASE_P(VelocityVerletNPT,
-                        MdrunNoAppendContinuationIsExact,
-                        ::testing::Combine(::testing::Values("argon12"),
-                                           ::testing::Values("md-vv"),
-                                           ::testing::Values("v-rescale"),
-                                           ::testing::Values("berendsen")));
-
 INSTANTIATE_TEST_CASE_P(MTTK,
                         MdrunNoAppendContinuationIsExact,
                         ::testing::Combine(::testing::Values("argon12"),
diff --git a/src/programs/mdrun/tests/orires.cpp b/src/programs/mdrun/tests/orires.cpp
new file mode 100644 (file)
index 0000000..0705af9
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * 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
+ * Test for MD with orientation restraints
+ *
+ * \author David van der Spoel <david.vanderspoel@icm.uu.se>
+ * \ingroup module_mdrun_integration_tests
+ */
+#include "gmxpre.h"
+
+#include "moduletest.h"
+
+namespace gmx
+{
+namespace test
+{
+
+class OriresTestFixture : public MdrunTestFixture
+{
+protected:
+    OriresTestFixture();
+    ~OriresTestFixture() override;
+};
+
+OriresTestFixture::OriresTestFixture() {}
+
+OriresTestFixture::~OriresTestFixture() {}
+
+//! Test fixture for mdrun with orires
+typedef gmx::test::OriresTestFixture OriresTest;
+
+/* Check whether the orires function works. */
+TEST_F(OriresTest, OriresCanRun)
+{
+    runner_.useTopGroAndNdxFromDatabase("orires_1lvz");
+    const std::string mdpContents = R"(
+        dt            = 0.002
+        nsteps        = 10
+        tcoupl        = Berendsen
+        tc-grps       = System
+        tau-t         = 0.5
+        ref-t         = 300
+        constraints   = h-bonds
+        cutoff-scheme = Verlet
+        orire         = Yes
+        orire-fitgrp  = backbone
+    )";
+    runner_.useStringAsMdpFile(mdpContents);
+
+    EXPECT_EQ(0, runner_.callGrompp());
+
+    ::gmx::test::CommandLine oriresCaller;
+
+    // Do an mdrun with ORIRES enabled
+    ASSERT_EQ(0, runner_.callMdrun(oriresCaller));
+}
+
+} // namespace test
+} // namespace gmx
diff --git a/src/testutils/simulationdatabase/orires_1lvz.gro b/src/testutils/simulationdatabase/orires_1lvz.gro
new file mode 100644 (file)
index 0000000..40ad092
--- /dev/null
@@ -0,0 +1,218 @@
+GUANINE NUCLEOTIDE-BINDING PROTEIN G(T), ALPHA-1\r
+  215\r
+    1ILE      N    1   2.423   2.571   1.751  0.0936 -0.3219 -0.0355\r
+    1ILE     H1    2   2.471   2.606   1.669 -2.9915  0.2125 -1.7758\r
+    1ILE     H2    3   2.346   2.637   1.754  0.0150 -0.2794 -1.7958\r
+    1ILE     H3    4   2.488   2.574   1.828 -1.8243  0.9739  1.6753\r
+    1ILE     CA    5   2.390   2.431   1.722 -0.0040 -0.3102  0.0167\r
+    1ILE     HA    6   2.323   2.434   1.636 -0.2465 -1.2965  0.1610\r
+    1ILE     CB    7   2.514   2.348   1.691  0.1548 -0.0167 -0.1390\r
+    1ILE     HB    8   2.560   2.401   1.607  3.5618 -0.2132  1.4412\r
+    1ILE    CG2    9   2.614   2.337   1.805  0.0404 -1.1364 -0.1327\r
+    1ILE   HG21   10   2.712   2.313   1.764 -1.2409 -2.3870 -2.6543\r
+    1ILE   HG22   11   2.622   2.425   1.870 -1.9742  0.2679 -1.6710\r
+    1ILE   HG23   12   2.585   2.259   1.876  1.0656 -1.6613 -0.2640\r
+    1ILE    CG1   13   2.466   2.213   1.638 -0.1684 -0.4516  1.2294\r
+    1ILE   HG11   14   2.393   2.229   1.559  2.4089  2.0711 -0.8483\r
+    1ILE   HG12   15   2.429   2.151   1.720 -1.2108 -0.2315  0.9452\r
+    1ILE     CD   16   2.588   2.138   1.585 -0.4056 -0.1240  0.1927\r
+    1ILE    HD1   17   2.656   2.208   1.536  2.6377 -2.2144  1.1352\r
+    1ILE    HD2   18   2.636   2.088   1.669  0.0941 -0.2702 -0.1801\r
+    1ILE    HD3   19   2.542   2.076   1.508 -0.8460  1.5249 -0.9365\r
+    1ILE      C   20   2.302   2.367   1.828 -0.1261 -0.0840  0.0509\r
+    1ILE      O   21   2.217   2.288   1.788 -0.1254 -0.2860  0.4413\r
+    2ARG      N   22   2.313   2.403   1.957  0.3813 -0.2249  0.0459\r
+    2ARG      H   23   2.368   2.486   1.972  0.5336  0.3645 -3.1220\r
+    2ARG     CA   24   2.237   2.338   2.061  0.1502  0.1391  0.1040\r
+    2ARG     HA   25   2.259   2.231   2.065 -2.6348 -0.5011  1.6122\r
+    2ARG     CB   26   2.286   2.415   2.183 -0.6640  0.4800  0.2203\r
+    2ARG    HB1   27   2.248   2.516   2.168 -1.9093 -0.1917 -1.4780\r
+    2ARG    HB2   28   2.395   2.415   2.185 -0.6732  0.8448  1.2487\r
+    2ARG     CG   29   2.247   2.355   2.318  0.1107 -0.1795  0.1531\r
+    2ARG    HG1   30   2.276   2.250   2.327 -0.1239 -0.0974  2.6200\r
+    2ARG    HG2   31   2.139   2.355   2.332 -0.3872 -1.6470 -2.7549\r
+    2ARG     CD   32   2.306   2.435   2.433  0.4397 -0.4298  0.1617\r
+    2ARG    HD1   33   2.408   2.466   2.407 -0.0073  1.8954  0.9116\r
+    2ARG    HD2   34   2.304   2.379   2.526  1.7767 -2.1717 -0.7954\r
+    2ARG     NE   35   2.221   2.552   2.456  0.6417 -0.2564  0.0480\r
+    2ARG     HE   36   2.149   2.567   2.387  0.8932  1.5191  0.1445\r
+    2ARG     CZ   37   2.237   2.639   2.557 -0.2182  0.1165 -0.1247\r
+    2ARG    NH1   38   2.325   2.632   2.658 -0.2428 -0.1092 -0.1168\r
+    2ARG   HH11   39   2.403   2.568   2.659  0.0097  0.1379  2.7157\r
+    2ARG   HH12   40   2.307   2.692   2.737 -0.0540  1.5964 -1.3081\r
+    2ARG    NH2   41   2.150   2.740   2.566  0.7550  1.0205 -0.6821\r
+    2ARG   HH21   42   2.092   2.756   2.485 -0.5254 -0.5336 -0.1216\r
+    2ARG   HH22   43   2.168   2.809   2.638  3.1877  0.7170 -0.9288\r
+    2ARG      C   44   2.085   2.344   2.050  0.1568 -0.7156 -0.5178\r
+    2ARG      O   45   2.018   2.254   2.100  0.1123 -0.5463 -0.2711\r
+    3GLU      N   46   2.030   2.447   1.986 -0.0863 -0.6508 -0.2018\r
+    3GLU      H   47   2.107   2.506   1.957  2.5076 -2.7563  1.8233\r
+    3GLU     CA   48   1.892   2.459   1.943 -0.0791  0.2737  0.0090\r
+    3GLU     HA   49   1.837   2.448   2.037 -0.0446 -2.3690 -0.2034\r
+    3GLU     CB   50   1.865   2.601   1.894 -0.2581  0.1853 -0.1468\r
+    3GLU    HB1   51   1.917   2.622   1.801 -1.4334  0.8957 -0.6630\r
+    3GLU    HB2   52   1.907   2.668   1.969  0.3663  1.1113 -1.2777\r
+    3GLU     CG   53   1.716   2.632   1.880 -0.2972  0.0131 -0.1084\r
+    3GLU    HG1   54   1.660   2.592   1.965 -0.5576  0.8787  0.1337\r
+    3GLU    HG2   55   1.681   2.577   1.793  1.2727 -2.5557  0.7537\r
+    3GLU     CD   56   1.682   2.778   1.861  0.2056  0.1281 -0.1580\r
+    3GLU    OE1   57   1.769   2.867   1.852  0.0423  0.3023 -0.0305\r
+    3GLU    OE2   58   1.562   2.800   1.831  0.1337 -0.3582 -0.2334\r
+    3GLU      C   59   1.852   2.355   1.840  0.0033  0.3192 -0.0686\r
+    3GLU      O   60   1.749   2.291   1.855  0.2870 -0.1890 -0.2784\r
+    4ASN      N   61   1.934   2.319   1.741  0.0582 -0.4105  0.2369\r
+    4ASN      H   62   2.011   2.383   1.724 -0.7026  0.2943 -0.6897\r
+    4ASN     CA   63   1.924   2.204   1.654  0.6640 -0.3126  0.0317\r
+    4ASN     HA   64   1.832   2.201   1.597 -0.0998 -0.7187  1.2592\r
+    4ASN     CB   65   2.035   2.216   1.550  0.7497 -0.1563  0.1416\r
+    4ASN    HB1   66   2.138   2.213   1.585  0.6873 -2.0392  0.2656\r
+    4ASN    HB2   67   2.020   2.315   1.507  0.5996 -0.2743 -0.0752\r
+    4ASN     CG   68   2.028   2.114   1.438  0.6663  0.3106 -0.2822\r
+    4ASN    OD1   69   2.086   2.007   1.454  0.4121  0.2228  0.0416\r
+    4ASN    ND2   70   1.940   2.128   1.338  0.0395 -0.1433  0.2007\r
+    4ASN   HD21   71   1.873   2.204   1.335  0.1268 -0.0060  1.2169\r
+    4ASN   HD22   72   1.942   2.064   1.260  0.8502 -0.3474  0.3858\r
+    4ASN      C   73   1.927   2.076   1.737  0.0386 -0.2349  0.1798\r
+    4ASN      O   74   1.840   1.991   1.717 -0.0458 -0.3335  0.9355\r
+    5LEU      N   75   2.021   2.063   1.831 -0.0687  0.6090  0.4036\r
+    5LEU      H   76   2.094   2.132   1.831 -0.4774  1.1622 -2.5375\r
+    5LEU     CA   77   2.032   1.944   1.913 -0.0413  0.5320  0.2883\r
+    5LEU     HA   78   2.027   1.857   1.848 -2.4141  1.5946 -1.0762\r
+    5LEU     CB   79   2.166   1.955   1.987  0.1109 -0.0905  0.1059\r
+    5LEU    HB1   80   2.170   1.872   2.058  2.6174  0.6698  0.9454\r
+    5LEU    HB2   81   2.162   2.047   2.045  0.8089  0.5599 -0.8616\r
+    5LEU     CG   82   2.288   1.952   1.895  0.0512 -0.2565  0.0305\r
+    5LEU     HG   83   2.285   2.039   1.829 -0.4586  0.4334  0.9230\r
+    5LEU    CD1   84   2.408   1.964   1.988  0.0055  0.1775  0.0372\r
+    5LEU   HD11   85   2.407   1.877   2.053  0.0883  0.1450 -0.0054\r
+    5LEU   HD12   86   2.501   1.962   1.932 -0.4579 -1.7524 -0.7446\r
+    5LEU   HD13   87   2.402   2.060   2.041  1.9484 -0.0759  0.8026\r
+    5LEU    CD2   88   2.309   1.825   1.814  0.4229 -0.0957 -0.1266\r
+    5LEU   HD21   89   2.222   1.814   1.748 -1.5139  2.0474  1.8761\r
+    5LEU   HD22   90   2.406   1.834   1.765  0.0073 -2.6964 -1.5970\r
+    5LEU   HD23   91   2.313   1.735   1.875  0.0387 -1.7936 -2.4350\r
+    5LEU      C   92   1.915   1.936   2.010 -0.2894  0.1139 -0.0464\r
+    5LEU      O   93   1.876   1.826   2.049 -0.1455 -0.1880 -0.7352\r
+    6LYS      N   94   1.842   2.045   2.034 -0.6901  0.0243 -0.8226\r
+    6LYS      H   95   1.882   2.132   2.004  0.8199 -0.9562 -1.7789\r
+    6LYS     CA   96   1.719   2.046   2.110 -0.2719  0.1430 -0.1383\r
+    6LYS     HA   97   1.741   1.993   2.203  0.9730 -0.6169 -0.8467\r
+    6LYS     CB   98   1.672   2.187   2.146 -0.2506  0.0636  0.2090\r
+    6LYS    HB1   99   1.625   2.232   2.059  0.9820  2.6593  0.7788\r
+    6LYS    HB2  100   1.755   2.252   2.173  0.1270 -0.8653  1.3155\r
+    6LYS     CG  101   1.583   2.188   2.270 -0.3322 -0.0661  0.1524\r
+    6LYS    HG1  102   1.651   2.161   2.351  2.0085  2.7494 -0.6671\r
+    6LYS    HG2  103   1.497   2.122   2.264  0.2178 -0.8095  0.2702\r
+    6LYS     CD  104   1.541   2.333   2.293  0.4968  0.1971  0.0589\r
+    6LYS    HD1  105   1.522   2.376   2.195  1.7394  0.6881  0.0130\r
+    6LYS    HD2  106   1.620   2.389   2.343  0.0016  0.7250  0.2662\r
+    6LYS     CE  107   1.416   2.344   2.380  0.7798  0.1243  0.4757\r
+    6LYS    HE1  108   1.340   2.270   2.355 -1.1187  1.9929  0.4302\r
+    6LYS    HE2  109   1.363   2.437   2.361 -1.3895 -1.1540 -0.0331\r
+    6LYS     NZ  110   1.441   2.318   2.523  0.6853  0.4103  0.5445\r
+    6LYS    HZ1  111   1.361   2.279   2.570 -0.0921  1.4011  0.0796\r
+    6LYS    HZ2  112   1.513   2.248   2.533  0.3965  0.2699  1.8626\r
+    6LYS    HZ3  113   1.474   2.400   2.572  0.9530  0.7453 -0.1836\r
+    6LYS      C  114   1.609   1.980   2.028 -0.0506  0.3156 -0.5774\r
+    6LYS      O  115   1.522   1.915   2.087 -0.0003  0.4952 -0.3006\r
+    7ASP      N  116   1.606   1.984   1.895  0.1681 -0.2273 -0.5995\r
+    7ASP      H  117   1.664   2.055   1.852  1.5543 -1.5568 -1.0282\r
+    7ASP     CA  118   1.509   1.911   1.816 -0.1619  0.2418 -0.6279\r
+    7ASP     HA  119   1.413   1.911   1.868 -0.3314  1.7001 -0.8973\r
+    7ASP     CB  120   1.487   1.969   1.677  0.4599 -0.5002 -1.0444\r
+    7ASP    HB1  121   1.422   1.905   1.618  2.1452 -2.1706 -1.1680\r
+    7ASP    HB2  122   1.582   1.983   1.626  1.0920  1.4900  0.5546\r
+    7ASP     CG  123   1.437   2.112   1.663  0.1593 -0.4950  0.0059\r
+    7ASP    OD1  124   1.373   2.166   1.756 -0.4294  0.3704 -0.8781\r
+    7ASP    OD2  125   1.451   2.169   1.553  0.1888  0.3519  0.4321\r
+    7ASP      C  126   1.545   1.765   1.792  0.3318  0.3579 -0.5897\r
+    7ASP      O  127   1.461   1.686   1.750 -0.0629  0.1795  0.5235\r
+    8SER      N  128   1.670   1.724   1.815  0.2385  0.1590 -0.4441\r
+    8SER      H  129   1.747   1.787   1.832  1.7195 -1.6506 -0.0484\r
+    8SER     CA  130   1.707   1.584   1.799 -0.1400 -0.0362  0.3462\r
+    8SER     HA  131   1.666   1.564   1.700  2.3315 -0.8831 -0.5812\r
+    8SER     CB  132   1.859   1.565   1.798 -0.0427  0.6957  0.2654\r
+    8SER    HB1  133   1.905   1.636   1.730 -0.3410 -0.1665 -0.8636\r
+    8SER    HB2  134   1.879   1.464   1.763  0.7777  0.1943  2.0685\r
+    8SER     OG  135   1.909   1.562   1.930  0.2456  0.6083  0.1532\r
+    8SER     HG  136   1.910   1.652   1.963 -0.0997  1.1774 -1.3071\r
+    8SER      C  137   1.634   1.498   1.900 -0.3761 -0.0841  0.1342\r
+    8SER      O  138   1.618   1.379   1.872 -0.1086 -0.0425 -0.1938\r
+    9GLY      N  139   1.603   1.546   2.021 -0.8083 -0.0860  0.0251\r
+    9GLY      H  140   1.649   1.632   2.046  1.0775 -1.0793  0.1291\r
+    9GLY     CA  141   1.559   1.466   2.134 -0.2229 -0.2196  0.1597\r
+    9GLY    HA1  142   1.472   1.410   2.100  0.9214  0.4124 -4.5132\r
+    9GLY    HA2  143   1.531   1.537   2.212  1.0939  0.5737 -0.0511\r
+    9GLY      C  144   1.665   1.373   2.190  0.1423  0.1523  0.0935\r
+    9GLY      O  145   1.634   1.303   2.287 -0.4717  0.4476  0.1139\r
+   10LEU      N  146   1.786   1.358   2.135 -0.0857  0.0788 -0.3970\r
+   10LEU      H  147   1.810   1.425   2.063  0.9925 -0.8606 -0.9407\r
+   10LEU     CA  148   1.897   1.277   2.180 -0.2014  0.1010 -0.0670\r
+   10LEU     HA  149   1.856   1.189   2.229 -0.3069 -1.5412 -2.9031\r
+   10LEU     CB  150   1.971   1.232   2.055 -0.2947  0.0573 -0.1062\r
+   10LEU    HB1  151   2.052   1.171   2.097 -0.0778  0.7093  0.4427\r
+   10LEU    HB2  152   2.010   1.320   2.004 -0.2353  0.7669  1.1344\r
+   10LEU     CG  153   1.884   1.156   1.956 -0.1920  0.5272 -0.5642\r
+   10LEU     HG  154   1.806   1.212   1.904 -0.3825 -0.6450 -1.5878\r
+   10LEU    CD1  155   1.978   1.101   1.849 -0.0609  0.4181 -0.3931\r
+   10LEU   HD11  156   1.924   1.056   1.766  0.0468 -1.4596  0.5037\r
+   10LEU   HD12  157   2.043   1.175   1.802  1.6876 -0.3308  0.7317\r
+   10LEU   HD13  158   2.042   1.023   1.891  1.0543  1.5004 -0.0242\r
+   10LEU    CD2  159   1.808   1.046   2.029  0.7995  0.0120 -0.2899\r
+   10LEU   HD21  160   1.860   0.977   2.096 -1.4402 -1.0796  0.4376\r
+   10LEU   HD22  161   1.719   1.077   2.085 -1.6181 -2.6169 -2.3914\r
+   10LEU   HD23  162   1.761   0.986   1.951 -0.2814 -0.8529  0.9735\r
+   10LEU      C  163   1.986   1.354   2.278 -0.1641 -0.1064  0.0627\r
+   10LEU      O  164   2.078   1.295   2.334 -0.1827 -0.0007  0.2057\r
+   11PHE      N  165   1.966   1.484   2.299 -0.1651 -0.0363 -0.3616\r
+   11PHE      H  166   1.881   1.529   2.267 -1.5975 -1.4086  1.3043\r
+   11PHE     CA  167   2.063   1.574   2.359 -0.4167 -0.1086  0.1618\r
+   11PHE     HA  168   2.146   1.515   2.399 -0.9779 -0.5706  0.6735\r
+   11PHE     CB  169   2.128   1.654   2.247 -0.7180 -0.2172 -0.0927\r
+   11PHE    HB1  170   2.145   1.758   2.274 -0.0255 -0.3036 -0.1819\r
+   11PHE    HB2  171   2.053   1.660   2.168  0.1930  0.2958 -0.9555\r
+   11PHE     CG  172   2.257   1.600   2.189 -0.3828  0.5005 -0.0355\r
+   11PHE    CD1  173   2.257   1.503   2.087  0.6644  0.5474 -0.0918\r
+   11PHE    HD1  174   2.159   1.478   2.048 -1.1761  4.0170  1.7102\r
+   11PHE    CE1  175   2.377   1.453   2.036  0.3452 -0.9590  0.5803\r
+   11PHE    HE1  176   2.376   1.385   1.951  0.5811 -0.1294 -0.1025\r
+   11PHE     CZ  177   2.497   1.479   2.103  0.4084  0.3115  0.0073\r
+   11PHE     HZ  178   2.589   1.435   2.067 -0.2225 -1.0535 -0.0223\r
+   11PHE    CE2  179   2.495   1.585   2.194  0.0892 -0.4109  0.8548\r
+   11PHE    HE2  180   2.591   1.614   2.233 -0.9734  0.2875  3.1320\r
+   11PHE    CD2  181   2.378   1.647   2.240 -0.1009  0.1958 -0.4170\r
+   11PHE    HD2  182   2.371   1.726   2.313 -0.8800 -0.3576  0.1153\r
+   11PHE      C  183   2.012   1.664   2.470  0.1919  0.0750  0.2944\r
+   11PHE    OC1  184   1.903   1.721   2.453  0.1210 -0.0696  0.2605\r
+   11PHE    OC2  185   2.078   1.675   2.576 -0.3707  0.4761  0.6025\r
+   12SOL     OW  186   3.873   0.044   3.044 -0.2983  0.3579 -0.0212\r
+   12SOL    HW1  187   3.929   0.094   2.984  2.4308 -0.0923  1.9919\r
+   12SOL    HW2  188   3.882   0.088   3.128  0.1698 -2.0064  1.2441\r
+   13SOL     OW  189   3.300   3.670   3.302 -0.2897 -0.5158 -0.1517\r
+   13SOL    HW1  190   3.229   3.716   3.346 -0.9753 -1.2956 -0.4340\r
+   13SOL    HW2  191   3.334   3.609   3.368  0.5166  0.2449  0.1700\r
+   14SOL     OW  192   3.835   3.670   1.359  0.5733 -0.4605 -0.0371\r
+   14SOL    HW1  193   3.783   3.614   1.302  1.2593 -2.0638  0.8277\r
+   14SOL    HW2  194   3.915   3.620   1.376  1.1344  0.7012  0.9362\r
+   15SOL     OW  195   0.782   2.741   1.583  0.3241  0.3358  0.3704\r
+   15SOL    HW1  196   0.759   2.784   1.666 -1.5933 -0.1989  0.1555\r
+   15SOL    HW2  197   0.713   2.677   1.569 -0.0345  1.1794 -2.2267\r
+   16SOL     OW  198   1.556   1.656   0.760  0.0766  0.1757 -0.0926\r
+   16SOL    HW1  199   1.602   1.738   0.744  1.4009 -0.7885 -1.6586\r
+   16SOL    HW2  200   1.626   1.592   0.772 -0.8985 -0.9048 -0.0060\r
+   17SOL     OW  201   3.141   3.132   3.392  0.0944  0.2707  0.1807\r
+   17SOL    HW1  202   3.169   3.112   3.481  1.0627 -0.8159 -0.3515\r
+   17SOL    HW2  203   3.073   3.068   3.373 -0.1843  0.5675  0.1572\r
+   18SOL     OW  204   0.105   1.434   0.498 -0.4822 -0.4474 -0.5695\r
+   18SOL    HW1  205   0.086   1.354   0.546  0.5427  0.0586  0.7387\r
+   18SOL    HW2  206   0.124   1.405   0.409 -0.4729 -1.6162 -0.2027\r
+   19SOL     OW  207   2.107   2.873   3.366 -0.2955  0.3323 -0.4196\r
+   19SOL    HW1  208   2.126   2.797   3.421  1.6975  0.3369 -1.0365\r
+   19SOL    HW2  209   2.096   2.945   3.429 -0.8651 -0.1900  0.0982\r
+   20SOL     OW  210   0.224   1.018   0.877  0.0313  0.0274 -0.5438\r
+   20SOL    HW1  211   0.137   0.989   0.853 -0.8808  2.0702  0.0306\r
+   20SOL    HW2  212   0.231   0.998   0.971  0.3370 -0.4605 -0.6666\r
+   21SOL     OW  213   2.917   1.502   3.799  0.1262  0.5285  0.2875\r
+   21SOL    HW1  214   2.887   1.585   3.762 -0.1020  0.2306 -0.2081\r
+   21SOL    HW2  215   2.963   1.458   3.728 -1.6917 -0.7588 -0.1707\r
+   3.98279   3.98279   3.98279\r
diff --git a/src/testutils/simulationdatabase/orires_1lvz.ndx b/src/testutils/simulationdatabase/orires_1lvz.ndx
new file mode 100644 (file)
index 0000000..590c396
--- /dev/null
@@ -0,0 +1,23 @@
+[ System ]
+   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15
+  16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+  31   32   33   34   35   36   37   38   39   40   41   42   43   44   45
+  46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+  61   62   63   64   65   66   67   68   69   70   71   72   73   74   75
+  76   77   78   79   80   81   82   83   84   85   86   87   88   89   90
+  91   92   93   94   95   96   97   98   99  100  101  102  103  104  105
+ 106  107  108  109  110  111  112  113  114  115  116  117  118  119  120
+ 121  122  123  124  125  126  127  128  129  130  131  132  133  134  135
+ 136  137  138  139  140  141  142  143  144  145  146  147  148  149  150
+ 151  152  153  154  155  156  157  158  159  160  161  162  163  164  165
+ 166  167  168  169  170  171  172  173  174  175  176  177  178  179  180
+ 181  182  183  184  185  186  187  188  189  190  191  192  193  194  195
+ 196  197  198  199  200  201  202  203  204  205  206  207  208  209  210
+ 211  212  213  214  215
+[ Backbone ]
+   1    5   20   22   24   44   46   48   59   61   63   73   75   77   92
+  94   96  114  116  118  126  128  130  137  139  141  144  146  148  163
+ 165  167  183
+[ SOL ]
+ 186  187  188  189  190  191  192  193  194  195  196  197  198  199  200
+ 201  202  203  204  205  206  207  208  209  210  211  212  213  214  215
diff --git a/src/testutils/simulationdatabase/orires_1lvz.top b/src/testutils/simulationdatabase/orires_1lvz.top
new file mode 100644 (file)
index 0000000..0748a43
--- /dev/null
@@ -0,0 +1,1820 @@
+;\r
+;      File '1lvz.top' was generated\r
+;      By user: anna (502)\r
+;      On host: phy-freki.physics.uu.se\r
+;      At date: Mon Feb  3 17:42:15 2020\r
+;\r
+;      This is a standalone topology file\r
+;\r
+;      Created by:\r
+;                          :-) GROMACS - gmx pdb2gmx, 2019.4 (-:\r
+;      \r
+;      Executable:   /usr/local/gromacs/bin/gmx\r
+;      Data prefix:  /usr/local/gromacs\r
+;      Working dir:  /Users/anna/Git/NMRreader\r
+;      Command line:\r
+;        gmx -quiet pdb2gmx -f 1lvz.pdb -ignh -ff amber99sb-ildn -water tip3p -p 1lvz.top -o 1lvz.gro\r
+;      Force field was read from the standard GROMACS share directory.\r
+;\r
+\r
+; Include forcefield parameters\r
+#include "amber99sb-ildn.ff/forcefield.itp"\r
+\r
+[ moleculetype ]\r
+; Name            nrexcl\r
+Protein_chain_A     3\r
+\r
+[ atoms ]\r
+;   nr       type  resnr residue  atom   cgnr     charge       mass  typeB    chargeB      massB\r
+; residue   1 ILE rtp NILE q +1.0\r
+     1         N3      1    ILE      N      1     0.0311      14.01\r
+     2          H      1    ILE     H1      2     0.2329      1.008\r
+     3          H      1    ILE     H2      3     0.2329      1.008\r
+     4          H      1    ILE     H3      4     0.2329      1.008\r
+     5         CT      1    ILE     CA      5     0.0257      12.01\r
+     6         HP      1    ILE     HA      6     0.1031      1.008\r
+     7         CT      1    ILE     CB      7     0.1885      12.01\r
+     8         HC      1    ILE     HB      8     0.0213      1.008\r
+     9         CT      1    ILE    CG2      9     -0.372      12.01\r
+    10         HC      1    ILE   HG21     10     0.0947      1.008\r
+    11         HC      1    ILE   HG22     11     0.0947      1.008\r
+    12         HC      1    ILE   HG23     12     0.0947      1.008\r
+    13         CT      1    ILE    CG1     13    -0.0387      12.01\r
+    14         HC      1    ILE   HG11     14     0.0201      1.008\r
+    15         HC      1    ILE   HG12     15     0.0201      1.008\r
+    16         CT      1    ILE     CD     16    -0.0908      12.01\r
+    17         HC      1    ILE    HD1     17     0.0226      1.008\r
+    18         HC      1    ILE    HD2     18     0.0226      1.008\r
+    19         HC      1    ILE    HD3     19     0.0226      1.008\r
+    20          C      1    ILE      C     20     0.6123      12.01\r
+    21          O      1    ILE      O     21    -0.5713         16   ; qtot 1\r
+; residue   2 ARG rtp ARG  q +1.0\r
+    22          N      2    ARG      N     22    -0.3479      14.01\r
+    23          H      2    ARG      H     23     0.2747      1.008\r
+    24         CT      2    ARG     CA     24    -0.2637      12.01\r
+    25         H1      2    ARG     HA     25      0.156      1.008\r
+    26         CT      2    ARG     CB     26    -0.0007      12.01\r
+    27         HC      2    ARG    HB1     27     0.0327      1.008\r
+    28         HC      2    ARG    HB2     28     0.0327      1.008\r
+    29         CT      2    ARG     CG     29      0.039      12.01\r
+    30         HC      2    ARG    HG1     30     0.0285      1.008\r
+    31         HC      2    ARG    HG2     31     0.0285      1.008\r
+    32         CT      2    ARG     CD     32     0.0486      12.01\r
+    33         H1      2    ARG    HD1     33     0.0687      1.008\r
+    34         H1      2    ARG    HD2     34     0.0687      1.008\r
+    35         N2      2    ARG     NE     35    -0.5295      14.01\r
+    36          H      2    ARG     HE     36     0.3456      1.008\r
+    37         CA      2    ARG     CZ     37     0.8076      12.01\r
+    38         N2      2    ARG    NH1     38    -0.8627      14.01\r
+    39          H      2    ARG   HH11     39     0.4478      1.008\r
+    40          H      2    ARG   HH12     40     0.4478      1.008\r
+    41         N2      2    ARG    NH2     41    -0.8627      14.01\r
+    42          H      2    ARG   HH21     42     0.4478      1.008\r
+    43          H      2    ARG   HH22     43     0.4478      1.008\r
+    44          C      2    ARG      C     44     0.7341      12.01\r
+    45          O      2    ARG      O     45    -0.5894         16   ; qtot 2\r
+; residue   3 GLU rtp GLU  q -1.0\r
+    46          N      3    GLU      N     46    -0.5163      14.01\r
+    47          H      3    GLU      H     47     0.2936      1.008\r
+    48         CT      3    GLU     CA     48     0.0397      12.01\r
+    49         H1      3    GLU     HA     49     0.1105      1.008\r
+    50         CT      3    GLU     CB     50      0.056      12.01\r
+    51         HC      3    GLU    HB1     51    -0.0173      1.008\r
+    52         HC      3    GLU    HB2     52    -0.0173      1.008\r
+    53         CT      3    GLU     CG     53     0.0136      12.01\r
+    54         HC      3    GLU    HG1     54    -0.0425      1.008\r
+    55         HC      3    GLU    HG2     55    -0.0425      1.008\r
+    56          C      3    GLU     CD     56     0.8054      12.01\r
+    57         O2      3    GLU    OE1     57    -0.8188         16\r
+    58         O2      3    GLU    OE2     58    -0.8188         16\r
+    59          C      3    GLU      C     59     0.5366      12.01\r
+    60          O      3    GLU      O     60    -0.5819         16   ; qtot 1\r
+; residue   4 ASN rtp ASN  q  0.0\r
+    61          N      4    ASN      N     61    -0.4157      14.01\r
+    62          H      4    ASN      H     62     0.2719      1.008\r
+    63         CT      4    ASN     CA     63     0.0143      12.01\r
+    64         H1      4    ASN     HA     64     0.1048      1.008\r
+    65         CT      4    ASN     CB     65    -0.2041      12.01\r
+    66         HC      4    ASN    HB1     66     0.0797      1.008\r
+    67         HC      4    ASN    HB2     67     0.0797      1.008\r
+    68          C      4    ASN     CG     68      0.713      12.01\r
+    69          O      4    ASN    OD1     69    -0.5931         16\r
+    70          N      4    ASN    ND2     70    -0.9191      14.01\r
+    71          H      4    ASN   HD21     71     0.4196      1.008\r
+    72          H      4    ASN   HD22     72     0.4196      1.008\r
+    73          C      4    ASN      C     73     0.5973      12.01\r
+    74          O      4    ASN      O     74    -0.5679         16   ; qtot 1\r
+; residue   5 LEU rtp LEU  q  0.0\r
+    75          N      5    LEU      N     75    -0.4157      14.01\r
+    76          H      5    LEU      H     76     0.2719      1.008\r
+    77         CT      5    LEU     CA     77    -0.0518      12.01\r
+    78         H1      5    LEU     HA     78     0.0922      1.008\r
+    79         CT      5    LEU     CB     79    -0.1102      12.01\r
+    80         HC      5    LEU    HB1     80     0.0457      1.008\r
+    81         HC      5    LEU    HB2     81     0.0457      1.008\r
+    82         CT      5    LEU     CG     82     0.3531      12.01\r
+    83         HC      5    LEU     HG     83    -0.0361      1.008\r
+    84         CT      5    LEU    CD1     84    -0.4121      12.01\r
+    85         HC      5    LEU   HD11     85        0.1      1.008\r
+    86         HC      5    LEU   HD12     86        0.1      1.008\r
+    87         HC      5    LEU   HD13     87        0.1      1.008\r
+    88         CT      5    LEU    CD2     88    -0.4121      12.01\r
+    89         HC      5    LEU   HD21     89        0.1      1.008\r
+    90         HC      5    LEU   HD22     90        0.1      1.008\r
+    91         HC      5    LEU   HD23     91        0.1      1.008\r
+    92          C      5    LEU      C     92     0.5973      12.01\r
+    93          O      5    LEU      O     93    -0.5679         16   ; qtot 1\r
+; residue   6 LYS rtp LYS  q +1.0\r
+    94          N      6    LYS      N     94    -0.3479      14.01\r
+    95          H      6    LYS      H     95     0.2747      1.008\r
+    96         CT      6    LYS     CA     96      -0.24      12.01\r
+    97         H1      6    LYS     HA     97     0.1426      1.008\r
+    98         CT      6    LYS     CB     98    -0.0094      12.01\r
+    99         HC      6    LYS    HB1     99     0.0362      1.008\r
+   100         HC      6    LYS    HB2    100     0.0362      1.008\r
+   101         CT      6    LYS     CG    101     0.0187      12.01\r
+   102         HC      6    LYS    HG1    102     0.0103      1.008\r
+   103         HC      6    LYS    HG2    103     0.0103      1.008\r
+   104         CT      6    LYS     CD    104    -0.0479      12.01\r
+   105         HC      6    LYS    HD1    105     0.0621      1.008\r
+   106         HC      6    LYS    HD2    106     0.0621      1.008\r
+   107         CT      6    LYS     CE    107    -0.0143      12.01\r
+   108         HP      6    LYS    HE1    108     0.1135      1.008\r
+   109         HP      6    LYS    HE2    109     0.1135      1.008\r
+   110         N3      6    LYS     NZ    110    -0.3854      14.01\r
+   111          H      6    LYS    HZ1    111       0.34      1.008\r
+   112          H      6    LYS    HZ2    112       0.34      1.008\r
+   113          H      6    LYS    HZ3    113       0.34      1.008\r
+   114          C      6    LYS      C    114     0.7341      12.01\r
+   115          O      6    LYS      O    115    -0.5894         16   ; qtot 2\r
+; residue   7 ASP rtp ASP  q -1.0\r
+   116          N      7    ASP      N    116    -0.5163      14.01\r
+   117          H      7    ASP      H    117     0.2936      1.008\r
+   118         CT      7    ASP     CA    118     0.0381      12.01\r
+   119         H1      7    ASP     HA    119      0.088      1.008\r
+   120         CT      7    ASP     CB    120    -0.0303      12.01\r
+   121         HC      7    ASP    HB1    121    -0.0122      1.008\r
+   122         HC      7    ASP    HB2    122    -0.0122      1.008\r
+   123          C      7    ASP     CG    123     0.7994      12.01\r
+   124         O2      7    ASP    OD1    124    -0.8014         16\r
+   125         O2      7    ASP    OD2    125    -0.8014         16\r
+   126          C      7    ASP      C    126     0.5366      12.01\r
+   127          O      7    ASP      O    127    -0.5819         16   ; qtot 1\r
+; residue   8 SER rtp SER  q  0.0\r
+   128          N      8    SER      N    128    -0.4157      14.01\r
+   129          H      8    SER      H    129     0.2719      1.008\r
+   130         CT      8    SER     CA    130    -0.0249      12.01\r
+   131         H1      8    SER     HA    131     0.0843      1.008\r
+   132         CT      8    SER     CB    132     0.2117      12.01\r
+   133         H1      8    SER    HB1    133     0.0352      1.008\r
+   134         H1      8    SER    HB2    134     0.0352      1.008\r
+   135         OH      8    SER     OG    135    -0.6546         16\r
+   136         HO      8    SER     HG    136     0.4275      1.008\r
+   137          C      8    SER      C    137     0.5973      12.01\r
+   138          O      8    SER      O    138    -0.5679         16   ; qtot 1\r
+; residue   9 GLY rtp GLY  q  0.0\r
+   139          N      9    GLY      N    139    -0.4157      14.01\r
+   140          H      9    GLY      H    140     0.2719      1.008\r
+   141         CT      9    GLY     CA    141    -0.0252      12.01\r
+   142         H1      9    GLY    HA1    142     0.0698      1.008\r
+   143         H1      9    GLY    HA2    143     0.0698      1.008\r
+   144          C      9    GLY      C    144     0.5973      12.01\r
+   145          O      9    GLY      O    145    -0.5679         16   ; qtot 1\r
+; residue  10 LEU rtp LEU  q  0.0\r
+   146          N     10    LEU      N    146    -0.4157      14.01\r
+   147          H     10    LEU      H    147     0.2719      1.008\r
+   148         CT     10    LEU     CA    148    -0.0518      12.01\r
+   149         H1     10    LEU     HA    149     0.0922      1.008\r
+   150         CT     10    LEU     CB    150    -0.1102      12.01\r
+   151         HC     10    LEU    HB1    151     0.0457      1.008\r
+   152         HC     10    LEU    HB2    152     0.0457      1.008\r
+   153         CT     10    LEU     CG    153     0.3531      12.01\r
+   154         HC     10    LEU     HG    154    -0.0361      1.008\r
+   155         CT     10    LEU    CD1    155    -0.4121      12.01\r
+   156         HC     10    LEU   HD11    156        0.1      1.008\r
+   157         HC     10    LEU   HD12    157        0.1      1.008\r
+   158         HC     10    LEU   HD13    158        0.1      1.008\r
+   159         CT     10    LEU    CD2    159    -0.4121      12.01\r
+   160         HC     10    LEU   HD21    160        0.1      1.008\r
+   161         HC     10    LEU   HD22    161        0.1      1.008\r
+   162         HC     10    LEU   HD23    162        0.1      1.008\r
+   163          C     10    LEU      C    163     0.5973      12.01\r
+   164          O     10    LEU      O    164    -0.5679         16   ; qtot 1\r
+; residue  11 PHE rtp CPHE q -1.0\r
+   165          N     11    PHE      N    165    -0.3821      14.01\r
+   166          H     11    PHE      H    166     0.2681      1.008\r
+   167         CT     11    PHE     CA    167    -0.1825      12.01\r
+   168         H1     11    PHE     HA    168     0.1098      1.008\r
+   169         CT     11    PHE     CB    169    -0.0959      12.01\r
+   170         HC     11    PHE    HB1    170     0.0443      1.008\r
+   171         HC     11    PHE    HB2    171     0.0443      1.008\r
+   172         CA     11    PHE     CG    172     0.0552      12.01\r
+   173         CA     11    PHE    CD1    173      -0.13      12.01\r
+   174         HA     11    PHE    HD1    174     0.1408      1.008\r
+   175         CA     11    PHE    CE1    175    -0.1847      12.01\r
+   176         HA     11    PHE    HE1    176     0.1461      1.008\r
+   177         CA     11    PHE     CZ    177    -0.0944      12.01\r
+   178         HA     11    PHE     HZ    178      0.128      1.008\r
+   179         CA     11    PHE    CE2    179    -0.1847      12.01\r
+   180         HA     11    PHE    HE2    180     0.1461      1.008\r
+   181         CA     11    PHE    CD2    181      -0.13      12.01\r
+   182         HA     11    PHE    HD2    182     0.1408      1.008\r
+   183          C     11    PHE      C    183      0.766      12.01\r
+   184         O2     11    PHE    OC1    184    -0.8026         16\r
+   185         O2     11    PHE    OC2    185    -0.8026         16   ; qtot 0\r
+\r
+[ bonds ]\r
+;  ai    aj funct            c0            c1            c2            c3\r
+    1     2     1 \r
+    1     3     1 \r
+    1     4     1 \r
+    1     5     1 \r
+    5     6     1 \r
+    5     7     1 \r
+    5    20     1 \r
+    7     8     1 \r
+    7     9     1 \r
+    7    13     1 \r
+    9    10     1 \r
+    9    11     1 \r
+    9    12     1 \r
+   13    14     1 \r
+   13    15     1 \r
+   13    16     1 \r
+   16    17     1 \r
+   16    18     1 \r
+   16    19     1 \r
+   20    21     1 \r
+   20    22     1 \r
+   22    23     1 \r
+   22    24     1 \r
+   24    25     1 \r
+   24    26     1 \r
+   24    44     1 \r
+   26    27     1 \r
+   26    28     1 \r
+   26    29     1 \r
+   29    30     1 \r
+   29    31     1 \r
+   29    32     1 \r
+   32    33     1 \r
+   32    34     1 \r
+   32    35     1 \r
+   35    36     1 \r
+   35    37     1 \r
+   37    38     1 \r
+   37    41     1 \r
+   38    39     1 \r
+   38    40     1 \r
+   41    42     1 \r
+   41    43     1 \r
+   44    45     1 \r
+   44    46     1 \r
+   46    47     1 \r
+   46    48     1 \r
+   48    49     1 \r
+   48    50     1 \r
+   48    59     1 \r
+   50    51     1 \r
+   50    52     1 \r
+   50    53     1 \r
+   53    54     1 \r
+   53    55     1 \r
+   53    56     1 \r
+   56    57     1 \r
+   56    58     1 \r
+   59    60     1 \r
+   59    61     1 \r
+   61    62     1 \r
+   61    63     1 \r
+   63    64     1 \r
+   63    65     1 \r
+   63    73     1 \r
+   65    66     1 \r
+   65    67     1 \r
+   65    68     1 \r
+   68    69     1 \r
+   68    70     1 \r
+   70    71     1 \r
+   70    72     1 \r
+   73    74     1 \r
+   73    75     1 \r
+   75    76     1 \r
+   75    77     1 \r
+   77    78     1 \r
+   77    79     1 \r
+   77    92     1 \r
+   79    80     1 \r
+   79    81     1 \r
+   79    82     1 \r
+   82    83     1 \r
+   82    84     1 \r
+   82    88     1 \r
+   84    85     1 \r
+   84    86     1 \r
+   84    87     1 \r
+   88    89     1 \r
+   88    90     1 \r
+   88    91     1 \r
+   92    93     1 \r
+   92    94     1 \r
+   94    95     1 \r
+   94    96     1 \r
+   96    97     1 \r
+   96    98     1 \r
+   96   114     1 \r
+   98    99     1 \r
+   98   100     1 \r
+   98   101     1 \r
+  101   102     1 \r
+  101   103     1 \r
+  101   104     1 \r
+  104   105     1 \r
+  104   106     1 \r
+  104   107     1 \r
+  107   108     1 \r
+  107   109     1 \r
+  107   110     1 \r
+  110   111     1 \r
+  110   112     1 \r
+  110   113     1 \r
+  114   115     1 \r
+  114   116     1 \r
+  116   117     1 \r
+  116   118     1 \r
+  118   119     1 \r
+  118   120     1 \r
+  118   126     1 \r
+  120   121     1 \r
+  120   122     1 \r
+  120   123     1 \r
+  123   124     1 \r
+  123   125     1 \r
+  126   127     1 \r
+  126   128     1 \r
+  128   129     1 \r
+  128   130     1 \r
+  130   131     1 \r
+  130   132     1 \r
+  130   137     1 \r
+  132   133     1 \r
+  132   134     1 \r
+  132   135     1 \r
+  135   136     1 \r
+  137   138     1 \r
+  137   139     1 \r
+  139   140     1 \r
+  139   141     1 \r
+  141   142     1 \r
+  141   143     1 \r
+  141   144     1 \r
+  144   145     1 \r
+  144   146     1 \r
+  146   147     1 \r
+  146   148     1 \r
+  148   149     1 \r
+  148   150     1 \r
+  148   163     1 \r
+  150   151     1 \r
+  150   152     1 \r
+  150   153     1 \r
+  153   154     1 \r
+  153   155     1 \r
+  153   159     1 \r
+  155   156     1 \r
+  155   157     1 \r
+  155   158     1 \r
+  159   160     1 \r
+  159   161     1 \r
+  159   162     1 \r
+  163   164     1 \r
+  163   165     1 \r
+  165   166     1 \r
+  165   167     1 \r
+  167   168     1 \r
+  167   169     1 \r
+  167   183     1 \r
+  169   170     1 \r
+  169   171     1 \r
+  169   172     1 \r
+  172   173     1 \r
+  172   181     1 \r
+  173   174     1 \r
+  173   175     1 \r
+  175   176     1 \r
+  175   177     1 \r
+  177   178     1 \r
+  177   179     1 \r
+  179   180     1 \r
+  179   181     1 \r
+  181   182     1 \r
+  183   184     1 \r
+  183   185     1 \r
+\r
+[ pairs ]\r
+;  ai    aj funct            c0            c1            c2            c3\r
+    1     8     1 \r
+    1     9     1 \r
+    1    13     1 \r
+    1    21     1 \r
+    1    22     1 \r
+    2     6     1 \r
+    2     7     1 \r
+    2    20     1 \r
+    3     6     1 \r
+    3     7     1 \r
+    3    20     1 \r
+    4     6     1 \r
+    4     7     1 \r
+    4    20     1 \r
+    5    10     1 \r
+    5    11     1 \r
+    5    12     1 \r
+    5    14     1 \r
+    5    15     1 \r
+    5    16     1 \r
+    5    23     1 \r
+    5    24     1 \r
+    6     8     1 \r
+    6     9     1 \r
+    6    13     1 \r
+    6    21     1 \r
+    6    22     1 \r
+    7    17     1 \r
+    7    18     1 \r
+    7    19     1 \r
+    7    21     1 \r
+    7    22     1 \r
+    8    10     1 \r
+    8    11     1 \r
+    8    12     1 \r
+    8    14     1 \r
+    8    15     1 \r
+    8    16     1 \r
+    8    20     1 \r
+    9    14     1 \r
+    9    15     1 \r
+    9    16     1 \r
+    9    20     1 \r
+   10    13     1 \r
+   11    13     1 \r
+   12    13     1 \r
+   13    20     1 \r
+   14    17     1 \r
+   14    18     1 \r
+   14    19     1 \r
+   15    17     1 \r
+   15    18     1 \r
+   15    19     1 \r
+   20    25     1 \r
+   20    26     1 \r
+   20    44     1 \r
+   21    23     1 \r
+   21    24     1 \r
+   22    27     1 \r
+   22    28     1 \r
+   22    29     1 \r
+   22    45     1 \r
+   22    46     1 \r
+   23    25     1 \r
+   23    26     1 \r
+   23    44     1 \r
+   24    30     1 \r
+   24    31     1 \r
+   24    32     1 \r
+   24    47     1 \r
+   24    48     1 \r
+   25    27     1 \r
+   25    28     1 \r
+   25    29     1 \r
+   25    45     1 \r
+   25    46     1 \r
+   26    33     1 \r
+   26    34     1 \r
+   26    35     1 \r
+   26    45     1 \r
+   26    46     1 \r
+   27    30     1 \r
+   27    31     1 \r
+   27    32     1 \r
+   27    44     1 \r
+   28    30     1 \r
+   28    31     1 \r
+   28    32     1 \r
+   28    44     1 \r
+   29    36     1 \r
+   29    37     1 \r
+   29    44     1 \r
+   30    33     1 \r
+   30    34     1 \r
+   30    35     1 \r
+   31    33     1 \r
+   31    34     1 \r
+   31    35     1 \r
+   32    38     1 \r
+   32    41     1 \r
+   33    36     1 \r
+   33    37     1 \r
+   34    36     1 \r
+   34    37     1 \r
+   35    39     1 \r
+   35    40     1 \r
+   35    42     1 \r
+   35    43     1 \r
+   36    38     1 \r
+   36    41     1 \r
+   38    42     1 \r
+   38    43     1 \r
+   39    41     1 \r
+   40    41     1 \r
+   44    49     1 \r
+   44    50     1 \r
+   44    59     1 \r
+   45    47     1 \r
+   45    48     1 \r
+   46    51     1 \r
+   46    52     1 \r
+   46    53     1 \r
+   46    60     1 \r
+   46    61     1 \r
+   47    49     1 \r
+   47    50     1 \r
+   47    59     1 \r
+   48    54     1 \r
+   48    55     1 \r
+   48    56     1 \r
+   48    62     1 \r
+   48    63     1 \r
+   49    51     1 \r
+   49    52     1 \r
+   49    53     1 \r
+   49    60     1 \r
+   49    61     1 \r
+   50    57     1 \r
+   50    58     1 \r
+   50    60     1 \r
+   50    61     1 \r
+   51    54     1 \r
+   51    55     1 \r
+   51    56     1 \r
+   51    59     1 \r
+   52    54     1 \r
+   52    55     1 \r
+   52    56     1 \r
+   52    59     1 \r
+   53    59     1 \r
+   54    57     1 \r
+   54    58     1 \r
+   55    57     1 \r
+   55    58     1 \r
+   59    64     1 \r
+   59    65     1 \r
+   59    73     1 \r
+   60    62     1 \r
+   60    63     1 \r
+   61    66     1 \r
+   61    67     1 \r
+   61    68     1 \r
+   61    74     1 \r
+   61    75     1 \r
+   62    64     1 \r
+   62    65     1 \r
+   62    73     1 \r
+   63    69     1 \r
+   63    70     1 \r
+   63    76     1 \r
+   63    77     1 \r
+   64    66     1 \r
+   64    67     1 \r
+   64    68     1 \r
+   64    74     1 \r
+   64    75     1 \r
+   65    71     1 \r
+   65    72     1 \r
+   65    74     1 \r
+   65    75     1 \r
+   66    69     1 \r
+   66    70     1 \r
+   66    73     1 \r
+   67    69     1 \r
+   67    70     1 \r
+   67    73     1 \r
+   68    73     1 \r
+   69    71     1 \r
+   69    72     1 \r
+   73    78     1 \r
+   73    79     1 \r
+   73    92     1 \r
+   74    76     1 \r
+   74    77     1 \r
+   75    80     1 \r
+   75    81     1 \r
+   75    82     1 \r
+   75    93     1 \r
+   75    94     1 \r
+   76    78     1 \r
+   76    79     1 \r
+   76    92     1 \r
+   77    83     1 \r
+   77    84     1 \r
+   77    88     1 \r
+   77    95     1 \r
+   77    96     1 \r
+   78    80     1 \r
+   78    81     1 \r
+   78    82     1 \r
+   78    93     1 \r
+   78    94     1 \r
+   79    85     1 \r
+   79    86     1 \r
+   79    87     1 \r
+   79    89     1 \r
+   79    90     1 \r
+   79    91     1 \r
+   79    93     1 \r
+   79    94     1 \r
+   80    83     1 \r
+   80    84     1 \r
+   80    88     1 \r
+   80    92     1 \r
+   81    83     1 \r
+   81    84     1 \r
+   81    88     1 \r
+   81    92     1 \r
+   82    92     1 \r
+   83    85     1 \r
+   83    86     1 \r
+   83    87     1 \r
+   83    89     1 \r
+   83    90     1 \r
+   83    91     1 \r
+   84    89     1 \r
+   84    90     1 \r
+   84    91     1 \r
+   85    88     1 \r
+   86    88     1 \r
+   87    88     1 \r
+   92    97     1 \r
+   92    98     1 \r
+   92   114     1 \r
+   93    95     1 \r
+   93    96     1 \r
+   94    99     1 \r
+   94   100     1 \r
+   94   101     1 \r
+   94   115     1 \r
+   94   116     1 \r
+   95    97     1 \r
+   95    98     1 \r
+   95   114     1 \r
+   96   102     1 \r
+   96   103     1 \r
+   96   104     1 \r
+   96   117     1 \r
+   96   118     1 \r
+   97    99     1 \r
+   97   100     1 \r
+   97   101     1 \r
+   97   115     1 \r
+   97   116     1 \r
+   98   105     1 \r
+   98   106     1 \r
+   98   107     1 \r
+   98   115     1 \r
+   98   116     1 \r
+   99   102     1 \r
+   99   103     1 \r
+   99   104     1 \r
+   99   114     1 \r
+  100   102     1 \r
+  100   103     1 \r
+  100   104     1 \r
+  100   114     1 \r
+  101   108     1 \r
+  101   109     1 \r
+  101   110     1 \r
+  101   114     1 \r
+  102   105     1 \r
+  102   106     1 \r
+  102   107     1 \r
+  103   105     1 \r
+  103   106     1 \r
+  103   107     1 \r
+  104   111     1 \r
+  104   112     1 \r
+  104   113     1 \r
+  105   108     1 \r
+  105   109     1 \r
+  105   110     1 \r
+  106   108     1 \r
+  106   109     1 \r
+  106   110     1 \r
+  108   111     1 \r
+  108   112     1 \r
+  108   113     1 \r
+  109   111     1 \r
+  109   112     1 \r
+  109   113     1 \r
+  114   119     1 \r
+  114   120     1 \r
+  114   126     1 \r
+  115   117     1 \r
+  115   118     1 \r
+  116   121     1 \r
+  116   122     1 \r
+  116   123     1 \r
+  116   127     1 \r
+  116   128     1 \r
+  117   119     1 \r
+  117   120     1 \r
+  117   126     1 \r
+  118   124     1 \r
+  118   125     1 \r
+  118   129     1 \r
+  118   130     1 \r
+  119   121     1 \r
+  119   122     1 \r
+  119   123     1 \r
+  119   127     1 \r
+  119   128     1 \r
+  120   127     1 \r
+  120   128     1 \r
+  121   124     1 \r
+  121   125     1 \r
+  121   126     1 \r
+  122   124     1 \r
+  122   125     1 \r
+  122   126     1 \r
+  123   126     1 \r
+  126   131     1 \r
+  126   132     1 \r
+  126   137     1 \r
+  127   129     1 \r
+  127   130     1 \r
+  128   133     1 \r
+  128   134     1 \r
+  128   135     1 \r
+  128   138     1 \r
+  128   139     1 \r
+  129   131     1 \r
+  129   132     1 \r
+  129   137     1 \r
+  130   136     1 \r
+  130   140     1 \r
+  130   141     1 \r
+  131   133     1 \r
+  131   134     1 \r
+  131   135     1 \r
+  131   138     1 \r
+  131   139     1 \r
+  132   138     1 \r
+  132   139     1 \r
+  133   136     1 \r
+  133   137     1 \r
+  134   136     1 \r
+  134   137     1 \r
+  135   137     1 \r
+  137   142     1 \r
+  137   143     1 \r
+  137   144     1 \r
+  138   140     1 \r
+  138   141     1 \r
+  139   145     1 \r
+  139   146     1 \r
+  140   142     1 \r
+  140   143     1 \r
+  140   144     1 \r
+  141   147     1 \r
+  141   148     1 \r
+  142   145     1 \r
+  142   146     1 \r
+  143   145     1 \r
+  143   146     1 \r
+  144   149     1 \r
+  144   150     1 \r
+  144   163     1 \r
+  145   147     1 \r
+  145   148     1 \r
+  146   151     1 \r
+  146   152     1 \r
+  146   153     1 \r
+  146   164     1 \r
+  146   165     1 \r
+  147   149     1 \r
+  147   150     1 \r
+  147   163     1 \r
+  148   154     1 \r
+  148   155     1 \r
+  148   159     1 \r
+  148   166     1 \r
+  148   167     1 \r
+  149   151     1 \r
+  149   152     1 \r
+  149   153     1 \r
+  149   164     1 \r
+  149   165     1 \r
+  150   156     1 \r
+  150   157     1 \r
+  150   158     1 \r
+  150   160     1 \r
+  150   161     1 \r
+  150   162     1 \r
+  150   164     1 \r
+  150   165     1 \r
+  151   154     1 \r
+  151   155     1 \r
+  151   159     1 \r
+  151   163     1 \r
+  152   154     1 \r
+  152   155     1 \r
+  152   159     1 \r
+  152   163     1 \r
+  153   163     1 \r
+  154   156     1 \r
+  154   157     1 \r
+  154   158     1 \r
+  154   160     1 \r
+  154   161     1 \r
+  154   162     1 \r
+  155   160     1 \r
+  155   161     1 \r
+  155   162     1 \r
+  156   159     1 \r
+  157   159     1 \r
+  158   159     1 \r
+  163   168     1 \r
+  163   169     1 \r
+  163   183     1 \r
+  164   166     1 \r
+  164   167     1 \r
+  165   170     1 \r
+  165   171     1 \r
+  165   172     1 \r
+  165   184     1 \r
+  165   185     1 \r
+  166   168     1 \r
+  166   169     1 \r
+  166   183     1 \r
+  167   173     1 \r
+  167   181     1 \r
+  168   170     1 \r
+  168   171     1 \r
+  168   172     1 \r
+  168   184     1 \r
+  168   185     1 \r
+  169   174     1 \r
+  169   175     1 \r
+  169   179     1 \r
+  169   182     1 \r
+  169   184     1 \r
+  169   185     1 \r
+  170   173     1 \r
+  170   181     1 \r
+  170   183     1 \r
+  171   173     1 \r
+  171   181     1 \r
+  171   183     1 \r
+  172   176     1 \r
+  172   177     1 \r
+  172   180     1 \r
+  172   183     1 \r
+  173   178     1 \r
+  173   179     1 \r
+  173   182     1 \r
+  174   176     1 \r
+  174   177     1 \r
+  174   181     1 \r
+  175   180     1 \r
+  175   181     1 \r
+  176   178     1 \r
+  176   179     1 \r
+  177   182     1 \r
+  178   180     1 \r
+  178   181     1 \r
+  180   182     1 \r
+\r
+[ angles ]\r
+;  ai    aj    ak funct            c0            c1            c2            c3\r
+    2     1     3     1 \r
+    2     1     4     1 \r
+    2     1     5     1 \r
+    3     1     4     1 \r
+    3     1     5     1 \r
+    4     1     5     1 \r
+    1     5     6     1 \r
+    1     5     7     1 \r
+    1     5    20     1 \r
+    6     5     7     1 \r
+    6     5    20     1 \r
+    7     5    20     1 \r
+    5     7     8     1 \r
+    5     7     9     1 \r
+    5     7    13     1 \r
+    8     7     9     1 \r
+    8     7    13     1 \r
+    9     7    13     1 \r
+    7     9    10     1 \r
+    7     9    11     1 \r
+    7     9    12     1 \r
+   10     9    11     1 \r
+   10     9    12     1 \r
+   11     9    12     1 \r
+    7    13    14     1 \r
+    7    13    15     1 \r
+    7    13    16     1 \r
+   14    13    15     1 \r
+   14    13    16     1 \r
+   15    13    16     1 \r
+   13    16    17     1 \r
+   13    16    18     1 \r
+   13    16    19     1 \r
+   17    16    18     1 \r
+   17    16    19     1 \r
+   18    16    19     1 \r
+    5    20    21     1 \r
+    5    20    22     1 \r
+   21    20    22     1 \r
+   20    22    23     1 \r
+   20    22    24     1 \r
+   23    22    24     1 \r
+   22    24    25     1 \r
+   22    24    26     1 \r
+   22    24    44     1 \r
+   25    24    26     1 \r
+   25    24    44     1 \r
+   26    24    44     1 \r
+   24    26    27     1 \r
+   24    26    28     1 \r
+   24    26    29     1 \r
+   27    26    28     1 \r
+   27    26    29     1 \r
+   28    26    29     1 \r
+   26    29    30     1 \r
+   26    29    31     1 \r
+   26    29    32     1 \r
+   30    29    31     1 \r
+   30    29    32     1 \r
+   31    29    32     1 \r
+   29    32    33     1 \r
+   29    32    34     1 \r
+   29    32    35     1 \r
+   33    32    34     1 \r
+   33    32    35     1 \r
+   34    32    35     1 \r
+   32    35    36     1 \r
+   32    35    37     1 \r
+   36    35    37     1 \r
+   35    37    38     1 \r
+   35    37    41     1 \r
+   38    37    41     1 \r
+   37    38    39     1 \r
+   37    38    40     1 \r
+   39    38    40     1 \r
+   37    41    42     1 \r
+   37    41    43     1 \r
+   42    41    43     1 \r
+   24    44    45     1 \r
+   24    44    46     1 \r
+   45    44    46     1 \r
+   44    46    47     1 \r
+   44    46    48     1 \r
+   47    46    48     1 \r
+   46    48    49     1 \r
+   46    48    50     1 \r
+   46    48    59     1 \r
+   49    48    50     1 \r
+   49    48    59     1 \r
+   50    48    59     1 \r
+   48    50    51     1 \r
+   48    50    52     1 \r
+   48    50    53     1 \r
+   51    50    52     1 \r
+   51    50    53     1 \r
+   52    50    53     1 \r
+   50    53    54     1 \r
+   50    53    55     1 \r
+   50    53    56     1 \r
+   54    53    55     1 \r
+   54    53    56     1 \r
+   55    53    56     1 \r
+   53    56    57     1 \r
+   53    56    58     1 \r
+   57    56    58     1 \r
+   48    59    60     1 \r
+   48    59    61     1 \r
+   60    59    61     1 \r
+   59    61    62     1 \r
+   59    61    63     1 \r
+   62    61    63     1 \r
+   61    63    64     1 \r
+   61    63    65     1 \r
+   61    63    73     1 \r
+   64    63    65     1 \r
+   64    63    73     1 \r
+   65    63    73     1 \r
+   63    65    66     1 \r
+   63    65    67     1 \r
+   63    65    68     1 \r
+   66    65    67     1 \r
+   66    65    68     1 \r
+   67    65    68     1 \r
+   65    68    69     1 \r
+   65    68    70     1 \r
+   69    68    70     1 \r
+   68    70    71     1 \r
+   68    70    72     1 \r
+   71    70    72     1 \r
+   63    73    74     1 \r
+   63    73    75     1 \r
+   74    73    75     1 \r
+   73    75    76     1 \r
+   73    75    77     1 \r
+   76    75    77     1 \r
+   75    77    78     1 \r
+   75    77    79     1 \r
+   75    77    92     1 \r
+   78    77    79     1 \r
+   78    77    92     1 \r
+   79    77    92     1 \r
+   77    79    80     1 \r
+   77    79    81     1 \r
+   77    79    82     1 \r
+   80    79    81     1 \r
+   80    79    82     1 \r
+   81    79    82     1 \r
+   79    82    83     1 \r
+   79    82    84     1 \r
+   79    82    88     1 \r
+   83    82    84     1 \r
+   83    82    88     1 \r
+   84    82    88     1 \r
+   82    84    85     1 \r
+   82    84    86     1 \r
+   82    84    87     1 \r
+   85    84    86     1 \r
+   85    84    87     1 \r
+   86    84    87     1 \r
+   82    88    89     1 \r
+   82    88    90     1 \r
+   82    88    91     1 \r
+   89    88    90     1 \r
+   89    88    91     1 \r
+   90    88    91     1 \r
+   77    92    93     1 \r
+   77    92    94     1 \r
+   93    92    94     1 \r
+   92    94    95     1 \r
+   92    94    96     1 \r
+   95    94    96     1 \r
+   94    96    97     1 \r
+   94    96    98     1 \r
+   94    96   114     1 \r
+   97    96    98     1 \r
+   97    96   114     1 \r
+   98    96   114     1 \r
+   96    98    99     1 \r
+   96    98   100     1 \r
+   96    98   101     1 \r
+   99    98   100     1 \r
+   99    98   101     1 \r
+  100    98   101     1 \r
+   98   101   102     1 \r
+   98   101   103     1 \r
+   98   101   104     1 \r
+  102   101   103     1 \r
+  102   101   104     1 \r
+  103   101   104     1 \r
+  101   104   105     1 \r
+  101   104   106     1 \r
+  101   104   107     1 \r
+  105   104   106     1 \r
+  105   104   107     1 \r
+  106   104   107     1 \r
+  104   107   108     1 \r
+  104   107   109     1 \r
+  104   107   110     1 \r
+  108   107   109     1 \r
+  108   107   110     1 \r
+  109   107   110     1 \r
+  107   110   111     1 \r
+  107   110   112     1 \r
+  107   110   113     1 \r
+  111   110   112     1 \r
+  111   110   113     1 \r
+  112   110   113     1 \r
+   96   114   115     1 \r
+   96   114   116     1 \r
+  115   114   116     1 \r
+  114   116   117     1 \r
+  114   116   118     1 \r
+  117   116   118     1 \r
+  116   118   119     1 \r
+  116   118   120     1 \r
+  116   118   126     1 \r
+  119   118   120     1 \r
+  119   118   126     1 \r
+  120   118   126     1 \r
+  118   120   121     1 \r
+  118   120   122     1 \r
+  118   120   123     1 \r
+  121   120   122     1 \r
+  121   120   123     1 \r
+  122   120   123     1 \r
+  120   123   124     1 \r
+  120   123   125     1 \r
+  124   123   125     1 \r
+  118   126   127     1 \r
+  118   126   128     1 \r
+  127   126   128     1 \r
+  126   128   129     1 \r
+  126   128   130     1 \r
+  129   128   130     1 \r
+  128   130   131     1 \r
+  128   130   132     1 \r
+  128   130   137     1 \r
+  131   130   132     1 \r
+  131   130   137     1 \r
+  132   130   137     1 \r
+  130   132   133     1 \r
+  130   132   134     1 \r
+  130   132   135     1 \r
+  133   132   134     1 \r
+  133   132   135     1 \r
+  134   132   135     1 \r
+  132   135   136     1 \r
+  130   137   138     1 \r
+  130   137   139     1 \r
+  138   137   139     1 \r
+  137   139   140     1 \r
+  137   139   141     1 \r
+  140   139   141     1 \r
+  139   141   142     1 \r
+  139   141   143     1 \r
+  139   141   144     1 \r
+  142   141   143     1 \r
+  142   141   144     1 \r
+  143   141   144     1 \r
+  141   144   145     1 \r
+  141   144   146     1 \r
+  145   144   146     1 \r
+  144   146   147     1 \r
+  144   146   148     1 \r
+  147   146   148     1 \r
+  146   148   149     1 \r
+  146   148   150     1 \r
+  146   148   163     1 \r
+  149   148   150     1 \r
+  149   148   163     1 \r
+  150   148   163     1 \r
+  148   150   151     1 \r
+  148   150   152     1 \r
+  148   150   153     1 \r
+  151   150   152     1 \r
+  151   150   153     1 \r
+  152   150   153     1 \r
+  150   153   154     1 \r
+  150   153   155     1 \r
+  150   153   159     1 \r
+  154   153   155     1 \r
+  154   153   159     1 \r
+  155   153   159     1 \r
+  153   155   156     1 \r
+  153   155   157     1 \r
+  153   155   158     1 \r
+  156   155   157     1 \r
+  156   155   158     1 \r
+  157   155   158     1 \r
+  153   159   160     1 \r
+  153   159   161     1 \r
+  153   159   162     1 \r
+  160   159   161     1 \r
+  160   159   162     1 \r
+  161   159   162     1 \r
+  148   163   164     1 \r
+  148   163   165     1 \r
+  164   163   165     1 \r
+  163   165   166     1 \r
+  163   165   167     1 \r
+  166   165   167     1 \r
+  165   167   168     1 \r
+  165   167   169     1 \r
+  165   167   183     1 \r
+  168   167   169     1 \r
+  168   167   183     1 \r
+  169   167   183     1 \r
+  167   169   170     1 \r
+  167   169   171     1 \r
+  167   169   172     1 \r
+  170   169   171     1 \r
+  170   169   172     1 \r
+  171   169   172     1 \r
+  169   172   173     1 \r
+  169   172   181     1 \r
+  173   172   181     1 \r
+  172   173   174     1 \r
+  172   173   175     1 \r
+  174   173   175     1 \r
+  173   175   176     1 \r
+  173   175   177     1 \r
+  176   175   177     1 \r
+  175   177   178     1 \r
+  175   177   179     1 \r
+  178   177   179     1 \r
+  177   179   180     1 \r
+  177   179   181     1 \r
+  180   179   181     1 \r
+  172   181   179     1 \r
+  172   181   182     1 \r
+  179   181   182     1 \r
+  167   183   184     1 \r
+  167   183   185     1 \r
+  184   183   185     1 \r
+\r
+[ dihedrals ]\r
+;  ai    aj    ak    al funct            c0            c1            c2            c3            c4            c5\r
+    2     1     5     6     9 \r
+    2     1     5     7     9 \r
+    2     1     5    20     9 \r
+    3     1     5     6     9 \r
+    3     1     5     7     9 \r
+    3     1     5    20     9 \r
+    4     1     5     6     9 \r
+    4     1     5     7     9 \r
+    4     1     5    20     9 \r
+    1     5     7     9     9    torsion_ILE_N_CA_CB_CG2_mult1\r
+    1     5     7     9     9    torsion_ILE_N_CA_CB_CG2_mult2\r
+    1     5     7     8     9 \r
+    1     5     7    13     9 \r
+    6     5     7     8     9 \r
+    6     5     7     9     9 \r
+    6     5     7    13     9 \r
+   20     5     7     8     9 \r
+   20     5     7     9     9 \r
+   20     5     7    13     9 \r
+    1     5    20    21     9 \r
+    1     5    20    22     9 \r
+    6     5    20    21     9 \r
+    6     5    20    22     9 \r
+    7     5    20    21     9 \r
+    7     5    20    22     9 \r
+    5     7     9    10     9 \r
+    5     7     9    11     9 \r
+    5     7     9    12     9 \r
+    8     7     9    10     9 \r
+    8     7     9    11     9 \r
+    8     7     9    12     9 \r
+   13     7     9    10     9 \r
+   13     7     9    11     9 \r
+   13     7     9    12     9 \r
+    5     7    13    14     9 \r
+    5     7    13    15     9 \r
+    5     7    13    16     9 \r
+    8     7    13    14     9 \r
+    8     7    13    15     9 \r
+    8     7    13    16     9 \r
+    9     7    13    14     9 \r
+    9     7    13    15     9 \r
+    9     7    13    16     9 \r
+    7    13    16    17     9 \r
+    7    13    16    18     9 \r
+    7    13    16    19     9 \r
+   14    13    16    17     9 \r
+   14    13    16    18     9 \r
+   14    13    16    19     9 \r
+   15    13    16    17     9 \r
+   15    13    16    18     9 \r
+   15    13    16    19     9 \r
+    5    20    22    23     9 \r
+    5    20    22    24     9 \r
+   21    20    22    23     9 \r
+   21    20    22    24     9 \r
+   20    22    24    25     9 \r
+   20    22    24    26     9 \r
+   20    22    24    44     9 \r
+   23    22    24    25     9 \r
+   23    22    24    26     9 \r
+   23    22    24    44     9 \r
+   22    24    26    27     9 \r
+   22    24    26    28     9 \r
+   22    24    26    29     9 \r
+   25    24    26    27     9 \r
+   25    24    26    28     9 \r
+   25    24    26    29     9 \r
+   44    24    26    27     9 \r
+   44    24    26    28     9 \r
+   44    24    26    29     9 \r
+   22    24    44    45     9 \r
+   22    24    44    46     9 \r
+   25    24    44    45     9 \r
+   25    24    44    46     9 \r
+   26    24    44    45     9 \r
+   26    24    44    46     9 \r
+   24    26    29    30     9 \r
+   24    26    29    31     9 \r
+   24    26    29    32     9 \r
+   27    26    29    30     9 \r
+   27    26    29    31     9 \r
+   27    26    29    32     9 \r
+   28    26    29    30     9 \r
+   28    26    29    31     9 \r
+   28    26    29    32     9 \r
+   26    29    32    33     9 \r
+   26    29    32    34     9 \r
+   26    29    32    35     9 \r
+   30    29    32    33     9 \r
+   30    29    32    34     9 \r
+   30    29    32    35     9 \r
+   31    29    32    33     9 \r
+   31    29    32    34     9 \r
+   31    29    32    35     9 \r
+   29    32    35    36     9 \r
+   29    32    35    37     9 \r
+   33    32    35    36     9 \r
+   33    32    35    37     9 \r
+   34    32    35    36     9 \r
+   34    32    35    37     9 \r
+   32    35    37    38     9 \r
+   32    35    37    41     9 \r
+   36    35    37    38     9 \r
+   36    35    37    41     9 \r
+   35    37    38    39     9 \r
+   35    37    38    40     9 \r
+   41    37    38    39     9 \r
+   41    37    38    40     9 \r
+   35    37    41    42     9 \r
+   35    37    41    43     9 \r
+   38    37    41    42     9 \r
+   38    37    41    43     9 \r
+   24    44    46    47     9 \r
+   24    44    46    48     9 \r
+   45    44    46    47     9 \r
+   45    44    46    48     9 \r
+   44    46    48    49     9 \r
+   44    46    48    50     9 \r
+   44    46    48    59     9 \r
+   47    46    48    49     9 \r
+   47    46    48    50     9 \r
+   47    46    48    59     9 \r
+   46    48    50    51     9 \r
+   46    48    50    52     9 \r
+   46    48    50    53     9 \r
+   49    48    50    51     9 \r
+   49    48    50    52     9 \r
+   49    48    50    53     9 \r
+   59    48    50    51     9 \r
+   59    48    50    52     9 \r
+   59    48    50    53     9 \r
+   46    48    59    60     9 \r
+   46    48    59    61     9 \r
+   49    48    59    60     9 \r
+   49    48    59    61     9 \r
+   50    48    59    60     9 \r
+   50    48    59    61     9 \r
+   48    50    53    54     9 \r
+   48    50    53    55     9 \r
+   48    50    53    56     9 \r
+   51    50    53    54     9 \r
+   51    50    53    55     9 \r
+   51    50    53    56     9 \r
+   52    50    53    54     9 \r
+   52    50    53    55     9 \r
+   52    50    53    56     9 \r
+   50    53    56    57     9 \r
+   50    53    56    58     9 \r
+   54    53    56    57     9 \r
+   54    53    56    58     9 \r
+   55    53    56    57     9 \r
+   55    53    56    58     9 \r
+   48    59    61    62     9 \r
+   48    59    61    63     9 \r
+   60    59    61    62     9 \r
+   60    59    61    63     9 \r
+   59    61    63    64     9 \r
+   59    61    63    65     9 \r
+   59    61    63    73     9 \r
+   62    61    63    64     9 \r
+   62    61    63    65     9 \r
+   62    61    63    73     9 \r
+   73    63    65    68     9    torsion_ASN_C_CA_CB_CG_mult1\r
+   73    63    65    68     9    torsion_ASN_C_CA_CB_CG_mult2\r
+   73    63    65    68     9    torsion_ASN_C_CA_CB_CG_mult3\r
+   73    63    65    68     9    torsion_ASN_C_CA_CB_CG_mult4\r
+   73    63    65    68     9    torsion_ASN_C_CA_CB_CG_mult5\r
+   73    63    65    68     9    torsion_ASN_C_CA_CB_CG_mult6\r
+   61    63    65    66     9 \r
+   61    63    65    67     9 \r
+   61    63    65    68     9 \r
+   64    63    65    66     9 \r
+   64    63    65    67     9 \r
+   64    63    65    68     9 \r
+   73    63    65    66     9 \r
+   73    63    65    67     9 \r
+   61    63    73    74     9 \r
+   61    63    73    75     9 \r
+   64    63    73    74     9 \r
+   64    63    73    75     9 \r
+   65    63    73    74     9 \r
+   65    63    73    75     9 \r
+   63    65    68    70     9    torsion_ASN_CA_CB_CG_ND2_mult1\r
+   63    65    68    70     9    torsion_ASN_CA_CB_CG_ND2_mult2\r
+   63    65    68    70     9    torsion_ASN_CA_CB_CG_ND2_mult3\r
+   63    65    68    70     9    torsion_ASN_CA_CB_CG_ND2_mult4\r
+   63    65    68    70     9    torsion_ASN_CA_CB_CG_ND2_mult5\r
+   63    65    68    70     9    torsion_ASN_CA_CB_CG_ND2_mult6\r
+   63    65    68    69     9 \r
+   66    65    68    69     9 \r
+   66    65    68    70     9 \r
+   67    65    68    69     9 \r
+   67    65    68    70     9 \r
+   65    68    70    71     9 \r
+   65    68    70    72     9 \r
+   69    68    70    71     9 \r
+   69    68    70    72     9 \r
+   63    73    75    76     9 \r
+   63    73    75    77     9 \r
+   74    73    75    76     9 \r
+   74    73    75    77     9 \r
+   73    75    77    78     9 \r
+   73    75    77    79     9 \r
+   73    75    77    92     9 \r
+   76    75    77    78     9 \r
+   76    75    77    79     9 \r
+   76    75    77    92     9 \r
+   92    77    79    82     9    torsion_LEU_C_CA_CB_CG_mult1\r
+   92    77    79    82     9    torsion_LEU_C_CA_CB_CG_mult2\r
+   92    77    79    82     9    torsion_LEU_C_CA_CB_CG_mult3\r
+   75    77    79    80     9 \r
+   75    77    79    81     9 \r
+   75    77    79    82     9 \r
+   78    77    79    80     9 \r
+   78    77    79    81     9 \r
+   78    77    79    82     9 \r
+   92    77    79    80     9 \r
+   92    77    79    81     9 \r
+   75    77    92    93     9 \r
+   75    77    92    94     9 \r
+   78    77    92    93     9 \r
+   78    77    92    94     9 \r
+   79    77    92    93     9 \r
+   79    77    92    94     9 \r
+   77    79    82    83     9 \r
+   77    79    82    84     9 \r
+   77    79    82    88     9 \r
+   80    79    82    83     9 \r
+   80    79    82    84     9 \r
+   80    79    82    88     9 \r
+   81    79    82    83     9 \r
+   81    79    82    84     9 \r
+   81    79    82    88     9 \r
+   79    82    84    85     9 \r
+   79    82    84    86     9 \r
+   79    82    84    87     9 \r
+   83    82    84    85     9 \r
+   83    82    84    86     9 \r
+   83    82    84    87     9 \r
+   88    82    84    85     9 \r
+   88    82    84    86     9 \r
+   88    82    84    87     9 \r
+   79    82    88    89     9 \r
+   79    82    88    90     9 \r
+   79    82    88    91     9 \r
+   83    82    88    89     9 \r
+   83    82    88    90     9 \r
+   83    82    88    91     9 \r
+   84    82    88    89     9 \r
+   84    82    88    90     9 \r
+   84    82    88    91     9 \r
+   77    92    94    95     9 \r
+   77    92    94    96     9 \r
+   93    92    94    95     9 \r
+   93    92    94    96     9 \r
+   92    94    96    97     9 \r
+   92    94    96    98     9 \r
+   92    94    96   114     9 \r
+   95    94    96    97     9 \r
+   95    94    96    98     9 \r
+   95    94    96   114     9 \r
+   94    96    98    99     9 \r
+   94    96    98   100     9 \r
+   94    96    98   101     9 \r
+   97    96    98    99     9 \r
+   97    96    98   100     9 \r
+   97    96    98   101     9 \r
+  114    96    98    99     9 \r
+  114    96    98   100     9 \r
+  114    96    98   101     9 \r
+   94    96   114   115     9 \r
+   94    96   114   116     9 \r
+   97    96   114   115     9 \r
+   97    96   114   116     9 \r
+   98    96   114   115     9 \r
+   98    96   114   116     9 \r
+   96    98   101   102     9 \r
+   96    98   101   103     9 \r
+   96    98   101   104     9 \r
+   99    98   101   102     9 \r
+   99    98   101   103     9 \r
+   99    98   101   104     9 \r
+  100    98   101   102     9 \r
+  100    98   101   103     9 \r
+  100    98   101   104     9 \r
+   98   101   104   105     9 \r
+   98   101   104   106     9 \r
+   98   101   104   107     9 \r
+  102   101   104   105     9 \r
+  102   101   104   106     9 \r
+  102   101   104   107     9 \r
+  103   101   104   105     9 \r
+  103   101   104   106     9 \r
+  103   101   104   107     9 \r
+  101   104   107   108     9 \r
+  101   104   107   109     9 \r
+  101   104   107   110     9 \r
+  105   104   107   108     9 \r
+  105   104   107   109     9 \r
+  105   104   107   110     9 \r
+  106   104   107   108     9 \r
+  106   104   107   109     9 \r
+  106   104   107   110     9 \r
+  104   107   110   111     9 \r
+  104   107   110   112     9 \r
+  104   107   110   113     9 \r
+  108   107   110   111     9 \r
+  108   107   110   112     9 \r
+  108   107   110   113     9 \r
+  109   107   110   111     9 \r
+  109   107   110   112     9 \r
+  109   107   110   113     9 \r
+   96   114   116   117     9 \r
+   96   114   116   118     9 \r
+  115   114   116   117     9 \r
+  115   114   116   118     9 \r
+  114   116   118   119     9 \r
+  114   116   118   120     9 \r
+  114   116   118   126     9 \r
+  117   116   118   119     9 \r
+  117   116   118   120     9 \r
+  117   116   118   126     9 \r
+  116   118   120   123     9    torsion_ASP_N_CA_CB_CG_mult1\r
+  116   118   120   123     9    torsion_ASP_N_CA_CB_CG_mult2\r
+  116   118   120   123     9    torsion_ASP_N_CA_CB_CG_mult3\r
+  116   118   120   123     9    torsion_ASP_N_CA_CB_CG_mult4\r
+  116   118   120   123     9    torsion_ASP_N_CA_CB_CG_mult5\r
+  116   118   120   123     9    torsion_ASP_N_CA_CB_CG_mult6\r
+  116   118   120   121     9 \r
+  116   118   120   122     9 \r
+  119   118   120   121     9 \r
+  119   118   120   122     9 \r
+  119   118   120   123     9 \r
+  126   118   120   121     9 \r
+  126   118   120   122     9 \r
+  126   118   120   123     9 \r
+  116   118   126   127     9 \r
+  116   118   126   128     9 \r
+  119   118   126   127     9 \r
+  119   118   126   128     9 \r
+  120   118   126   127     9 \r
+  120   118   126   128     9 \r
+  118   120   123   124     9    torsion_ASP_CA_CB_CG_OD_mult1\r
+  118   120   123   124     9    torsion_ASP_CA_CB_CG_OD_mult2\r
+  118   120   123   124     9    torsion_ASP_CA_CB_CG_OD_mult3\r
+  118   120   123   124     9    torsion_ASP_CA_CB_CG_OD_mult4\r
+  118   120   123   124     9    torsion_ASP_CA_CB_CG_OD_mult5\r
+  118   120   123   124     9    torsion_ASP_CA_CB_CG_OD_mult6\r
+  118   120   123   125     9    torsion_ASP_CA_CB_CG_OD_mult1\r
+  118   120   123   125     9    torsion_ASP_CA_CB_CG_OD_mult2\r
+  118   120   123   125     9    torsion_ASP_CA_CB_CG_OD_mult3\r
+  118   120   123   125     9    torsion_ASP_CA_CB_CG_OD_mult4\r
+  118   120   123   125     9    torsion_ASP_CA_CB_CG_OD_mult5\r
+  118   120   123   125     9    torsion_ASP_CA_CB_CG_OD_mult6\r
+  121   120   123   124     9 \r
+  121   120   123   125     9 \r
+  122   120   123   124     9 \r
+  122   120   123   125     9 \r
+  118   126   128   129     9 \r
+  118   126   128   130     9 \r
+  127   126   128   129     9 \r
+  127   126   128   130     9 \r
+  126   128   130   131     9 \r
+  126   128   130   132     9 \r
+  126   128   130   137     9 \r
+  129   128   130   131     9 \r
+  129   128   130   132     9 \r
+  129   128   130   137     9 \r
+  128   130   132   133     9 \r
+  128   130   132   134     9 \r
+  128   130   132   135     9 \r
+  131   130   132   133     9 \r
+  131   130   132   134     9 \r
+  131   130   132   135     9 \r
+  137   130   132   133     9 \r
+  137   130   132   134     9 \r
+  137   130   132   135     9 \r
+  128   130   137   138     9 \r
+  128   130   137   139     9 \r
+  131   130   137   138     9 \r
+  131   130   137   139     9 \r
+  132   130   137   138     9 \r
+  132   130   137   139     9 \r
+  130   132   135   136     9 \r
+  133   132   135   136     9 \r
+  134   132   135   136     9 \r
+  130   137   139   140     9 \r
+  130   137   139   141     9 \r
+  138   137   139   140     9 \r
+  138   137   139   141     9 \r
+  137   139   141   142     9 \r
+  137   139   141   143     9 \r
+  137   139   141   144     9 \r
+  140   139   141   142     9 \r
+  140   139   141   143     9 \r
+  140   139   141   144     9 \r
+  139   141   144   145     9 \r
+  139   141   144   146     9 \r
+  142   141   144   145     9 \r
+  142   141   144   146     9 \r
+  143   141   144   145     9 \r
+  143   141   144   146     9 \r
+  141   144   146   147     9 \r
+  141   144   146   148     9 \r
+  145   144   146   147     9 \r
+  145   144   146   148     9 \r
+  144   146   148   149     9 \r
+  144   146   148   150     9 \r
+  144   146   148   163     9 \r
+  147   146   148   149     9 \r
+  147   146   148   150     9 \r
+  147   146   148   163     9 \r
+  163   148   150   153     9    torsion_LEU_C_CA_CB_CG_mult1\r
+  163   148   150   153     9    torsion_LEU_C_CA_CB_CG_mult2\r
+  163   148   150   153     9    torsion_LEU_C_CA_CB_CG_mult3\r
+  146   148   150   151     9 \r
+  146   148   150   152     9 \r
+  146   148   150   153     9 \r
+  149   148   150   151     9 \r
+  149   148   150   152     9 \r
+  149   148   150   153     9 \r
+  163   148   150   151     9 \r
+  163   148   150   152     9 \r
+  146   148   163   164     9 \r
+  146   148   163   165     9 \r
+  149   148   163   164     9 \r
+  149   148   163   165     9 \r
+  150   148   163   164     9 \r
+  150   148   163   165     9 \r
+  148   150   153   154     9 \r
+  148   150   153   155     9 \r
+  148   150   153   159     9 \r
+  151   150   153   154     9 \r
+  151   150   153   155     9 \r
+  151   150   153   159     9 \r
+  152   150   153   154     9 \r
+  152   150   153   155     9 \r
+  152   150   153   159     9 \r
+  150   153   155   156     9 \r
+  150   153   155   157     9 \r
+  150   153   155   158     9 \r
+  154   153   155   156     9 \r
+  154   153   155   157     9 \r
+  154   153   155   158     9 \r
+  159   153   155   156     9 \r
+  159   153   155   157     9 \r
+  159   153   155   158     9 \r
+  150   153   159   160     9 \r
+  150   153   159   161     9 \r
+  150   153   159   162     9 \r
+  154   153   159   160     9 \r
+  154   153   159   161     9 \r
+  154   153   159   162     9 \r
+  155   153   159   160     9 \r
+  155   153   159   161     9 \r
+  155   153   159   162     9 \r
+  148   163   165   166     9 \r
+  148   163   165   167     9 \r
+  164   163   165   166     9 \r
+  164   163   165   167     9 \r
+  163   165   167   168     9 \r
+  163   165   167   169     9 \r
+  163   165   167   183     9 \r
+  166   165   167   168     9 \r
+  166   165   167   169     9 \r
+  166   165   167   183     9 \r
+  165   167   169   170     9 \r
+  165   167   169   171     9 \r
+  165   167   169   172     9 \r
+  168   167   169   170     9 \r
+  168   167   169   171     9 \r
+  168   167   169   172     9 \r
+  183   167   169   170     9 \r
+  183   167   169   171     9 \r
+  183   167   169   172     9 \r
+  165   167   183   184     9 \r
+  165   167   183   185     9 \r
+  168   167   183   184     9 \r
+  168   167   183   185     9 \r
+  169   167   183   184     9 \r
+  169   167   183   185     9 \r
+  167   169   172   173     9 \r
+  167   169   172   181     9 \r
+  170   169   172   173     9 \r
+  170   169   172   181     9 \r
+  171   169   172   173     9 \r
+  171   169   172   181     9 \r
+  169   172   173   174     9 \r
+  169   172   173   175     9 \r
+  181   172   173   174     9 \r
+  181   172   173   175     9 \r
+  169   172   181   179     9 \r
+  169   172   181   182     9 \r
+  173   172   181   179     9 \r
+  173   172   181   182     9 \r
+  172   173   175   176     9 \r
+  172   173   175   177     9 \r
+  174   173   175   176     9 \r
+  174   173   175   177     9 \r
+  173   175   177   178     9 \r
+  173   175   177   179     9 \r
+  176   175   177   178     9 \r
+  176   175   177   179     9 \r
+  175   177   179   180     9 \r
+  175   177   179   181     9 \r
+  178   177   179   180     9 \r
+  178   177   179   181     9 \r
+  177   179   181   172     9 \r
+  177   179   181   182     9 \r
+  180   179   181   172     9 \r
+  180   179   181   182     9 \r
+\r
+[ dihedrals ]\r
+;  ai    aj    ak    al funct            c0            c1            c2            c3\r
+    5    22    20    21     4 \r
+   20    24    22    23     4 \r
+   24    46    44    45     4 \r
+   32    37    35    36     4 \r
+   35    38    37    41     4 \r
+   37    39    38    40     4 \r
+   37    42    41    43     4 \r
+   44    48    46    47     4 \r
+   48    61    59    60     4 \r
+   53    57    56    58     4 \r
+   59    63    61    62     4 \r
+   63    75    73    74     4 \r
+   65    70    68    69     4 \r
+   68    71    70    72     4 \r
+   73    77    75    76     4 \r
+   77    94    92    93     4 \r
+   92    96    94    95     4 \r
+   96   116   114   115     4 \r
+  114   118   116   117     4 \r
+  118   128   126   127     4 \r
+  120   124   123   125     4 \r
+  126   130   128   129     4 \r
+  130   139   137   138     4 \r
+  137   141   139   140     4 \r
+  141   146   144   145     4 \r
+  144   148   146   147     4 \r
+  148   165   163   164     4 \r
+  163   167   165   166     4 \r
+  167   184   183   185     4 \r
+  169   172   181   173     4 \r
+  172   175   173   174     4 \r
+  172   179   181   182     4 \r
+  173   177   175   176     4 \r
+  175   179   177   178     4 \r
+  177   181   179   180     4 \r
+\r
+[ orientation_restraints ]\r
+;    ai            aj    type    exp.   label   alpha  const.    obs.  weight\r
+;                                                 Hz    nm^3      Hz    Hz^-2\r
+\r
+    46     47       1       1       1       3   6.083     1.1     1.0\r
+    61     62       1       1       2       3   6.083    -0.4     1.0\r
+    75     76       1       1       3       3   6.083     0.7     1.0\r
+    94     95       1       1       4       3   6.083     2.0     1.0\r
+   116    117       1       1       5       3   6.083    -0.1     1.0\r
+   128    129       1       1       6       3   6.083    -0.1     1.0\r
+   139    140       1       1       7       3   6.083     2.4     1.0\r
+   146    147       1       1       8       3   6.083    -0.3     1.0\r
+   165    166       1       1       9       3   6.083    -0.7     1.0\r
+\r
+; Include water topology\r
+#include "amber99sb-ildn.ff/tip3p.itp"\r
+\r
+#ifdef POSRES_WATER\r
+; Position restraint for each water oxygen\r
+[ position_restraints ]\r
+;  i funct       fcx        fcy        fcz\r
+   1    1       1000       1000       1000\r
+#endif\r
+\r
+; Include topology for ions\r
+#include "amber99sb-ildn.ff/ions.itp"\r
+\r
+[ system ]\r
+; Name\r
+GUANINE NUCLEOTIDE-BINDING PROTEIN G(T), ALPHA-1; 3 SUBUNIT in water\r
+\r
+[ molecules ]\r
+; Compound        #mols\r
+Protein_chain_A     1\r
+SOL                 10\r