- .gcc-before-script-template
- .build-gcc-template
+.configure-gcc-cuda:
+ extends:
+ - .configure-gcc
+ - .cuda-template
+
.configure-clang:
extends:
- .configure-extends-template
- .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:
- .gcc-before-script-template
- .test-gcc-template
+.test-gcc-cuda:
+ extends:
+ - .test-gcc
+ - .cuda-template
+
.test-clang:
extends:
- .test-extends-template
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
- $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
-# 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
-# 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
#
# 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
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)
- $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
+++ /dev/null
-.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
-
--- /dev/null
+.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
+
.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
+
- 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'
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
# 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/*
+++ /dev/null
-#!/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
--- /dev/null
+#!/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
+++ /dev/null
-# 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/*
+++ /dev/null
-# 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/*
+++ /dev/null
-# 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/*
--- /dev/null
+# 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/*
--- /dev/null
+# 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
--- /dev/null
+# 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
+++ /dev/null
-# 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/*
+++ /dev/null
-# 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/*
+++ /dev/null
-# 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/*
# 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 \
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 \
--- /dev/null
+# 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/*
\\\\.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()
--- /dev/null
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2020, by the GROMACS development team, led by
+# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+# and including many others, as listed in the AUTHORS file in the
+# top-level source directory and at http://www.gromacs.org.
+#
+# GROMACS is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# GROMACS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with GROMACS; if not, see
+# http://www.gnu.org/licenses, or write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# If you want to redistribute modifications to GROMACS, please
+# consider that scientific software is very special. Version
+# control is crucial - bugs must be traceable. We will be happy to
+# consider code for inclusion in the official distribution, but
+# derived work must not be called official GROMACS. Details are found
+# in the README & COPYING files - if they are missing, get the
+# official version at http://www.gromacs.org.
+#
+# To help us fund GROMACS development, we humbly ask that you cite
+# the research papers on the package. Check out http://www.gromacs.org.
+
+# 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})
# 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}")
# 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)
# - 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
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)
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
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.
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
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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Miscellaneous
^^^^^^^^^^^^^
+Avoid cryptic GPU detection errors when devices are unavailable or out of memory
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+:issue:`3178`
+:issue:`3399`
+
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!
: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
^^^^^^^^^^^^^^^^^^^^^^^
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`
+
--- /dev/null
+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
+^^^^^^^^^^^^^
+
:maxdepth: 1
2020/2020.1
+ 2020/2020.2
Major release
^^^^^^^^^^^^^
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
**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
- 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:
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 :
*/
#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"
// 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;
/*!
* \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.
*/
//! \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:
*/
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);
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());
// 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);
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());
|| (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,
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);
}
}
*
* 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
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);
* 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)
pme_gpu_realloc_spline_data(pmeGpu);
pme_gpu_realloc_grid_indices(pmeGpu);
}
+ pme_gpu_select_best_performing_pme_spreadgather_kernels(pmeGpu);
}
/*! \internal \brief
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,
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 */
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");
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?");
#include "gromacs/math/vectypes.h"
#include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/gmxmpi.h"
#include "gromacs/utility/keyvaluetreebuilder.h"
class energyhistory_t;
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.
*
* 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
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);
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);
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];
s);
}
-static bool do_numbering(int natoms,
+static void do_numbering(int natoms,
SimulationGroups* groups,
gmx::ArrayRef<std::string> groupsFromMdpFile,
t_blocka* block,
AtomGroupIndices* grps = &(groups->groups[gtype]);
int j, gid, aj, ognr, ntot = 0;
const char* title;
- bool bRest;
char warn_buf[STRLEN];
title = shortName(gtype);
}
/* Now check whether we have done all atoms */
- bRest = FALSE;
if (ntot != natoms)
{
if (grptp == egrptpALL)
if (cbuf[j] == NOGID)
{
cbuf[j] = grps->size();
- bRest = TRUE;
}
}
if (grptp != egrptpPART)
}
sfree(cbuf);
-
- return (bRest && grptp == egrptpPART);
}
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)
{
}
}
+/* 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,
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)
{
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());
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 */
/*
* 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
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");
}
/*
* 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.
/** 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)
*
* \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.
*/
}
}
+ 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;
* 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)
/*
* 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.
// 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"
};
/*
* 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
*
* 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,
egpuIncompatible,
egpuIncompatibleClusterSize,
egpuInsane,
+ egpuUnavailable,
egpuNR
} e_gpu_detect_res_t;
*
* 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
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 "
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;
{
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;
}
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);
}
*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,
(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
{
*
* 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
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
*
* 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
}
// 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.
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)))
{
*
* 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
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,
/*
* 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
#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"
rvec* f_global;
gmx::IMDOutputProvider* outputProvider;
const gmx::MdModulesNotifier* mdModulesNotifier;
+ bool simulationsShareState;
+ MPI_Comm mpiCommMasters;
};
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;
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;
{
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))
/*
* 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
class energyhistory_t;
struct gmx_mtop_t;
+struct gmx_multisim_t;
struct gmx_output_env_t;
struct ObservablesHistory;
struct t_commrec;
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);
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,
// 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);
}
}
&& (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 */
*
* 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
*
* 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
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);
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);
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,
}
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!");
+ }
}
}
if (useGpuForUpdate)
{
- if (bNS)
+ if (bNS && (bFirstStep || DOMAINDECOMP(cr)))
{
integrator->set(stateGpu->getCoordinates(), stateGpu->getVelocities(),
stateGpu->getForces(), top.idef, *mdatoms, ekind->ngtc);
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);
*
* 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
/* 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);
/* 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);
/* 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);
/* 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 });
*/
#include "gmxpre.h"
-#include "config.h"
-
#include <cinttypes>
#include <cmath>
#include <cstdio>
}
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);
}
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)
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
*
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
}
/* 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,
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
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.
#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"
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)
{
}
constr_->apply(writeLog, writeEnergy, step, 1, 1.0, x, xprime, min_proj, statePropagatorData_->box(),
- lambda, dvdlambda, v, calculateVirial ? &vir_con : nullptr, variable);
+ lambdaBonded, &dvdlambda, v, calculateVirial ? &vir_con : nullptr, variable);
if (calculateVirial)
{
}
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>
/*
* 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.
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
/*
* 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.
// 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))
{
#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"
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.
#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"
#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"
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
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)
"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,
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
"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 "
"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
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()
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;
offset_(offset),
couplingTimeStep_(couplingTimeStep),
initStep_(initStep),
- isInitStep_(true),
scalingTensor_(scalingTensor),
propagatorCallback_(std::move(propagatorCallback)),
statePropagatorData_(statePropagatorData),
{
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());
}
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
/*
* 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.
//! 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
#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"
| (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_++;
}
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();
// 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);
}
//! 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_;
/*
* 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.
}
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.");
}
}
/*
* 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.
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),
/*
* 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.
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_;
/*
* 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
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,
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,
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,
#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 */
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";
if (!errorMessage.empty())
{
- if (updateTarget != TaskTarget::Gpu && forceGpuUpdateDefault)
+ if (updateTarget == TaskTarget::Auto && devFlags.forceGpuUpdateDefault)
{
GMX_LOG(mdlog.warning)
.asParagraph()
return false;
}
- if (isDomainDecomposition)
- {
- return forceGpuUpdateDefault;
- }
- else
- {
- return (updateTarget == TaskTarget::Gpu || forceGpuUpdateDefault);
- }
+ return (updateTarget == TaskTarget::Gpu
+ || (updateTarget == TaskTarget::Auto && devFlags.forceGpuUpdateDefault));
}
} // namespace gmx
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
/*! \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.
* \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
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");
{
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 */
#
# 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
initialconstraints.cpp
interactiveMD.cpp
outputfiles.cpp
+ orires.cpp
pmetest.cpp
simulator.cpp
swapcoords.cpp
/*
* 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.
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'",
::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"),
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2020, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+
+/*! \internal \file
+ * \brief
+ * 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
--- /dev/null
+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
--- /dev/null
+[ System ]
+ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+ 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
+ 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
+ 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
+ 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
+ 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
+ 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
+ 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
+ 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
+ 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
+ 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
+ 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
+ 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
+ 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
+ 211 212 213 214 215
+[ 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
--- /dev/null
+;\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