The build procedure outlined herein uses Open MPI on top of the Intel compiler suite.
To begin, choose a directory in which the Gromacs_Plumed version(s) will be built and installed. To build in your home directory, for example:
[user@login00.darwin ~]$ GP_BASEDIR=~/sw/Gromacs_Plumed [user@login00.darwin ~]$ G_BASEDIR="${GP_BASEDIR}/Gromacs" [user@login00.darwin ~]$ P_BASEDIR="${GP_BASEDIR}/Plumed" [user@login00.darwin ~]$ GP_BASEDIR_PRIVS=0700
If you are managing Gromacs_Plumed software for your entire workgroup, you could instead use
[user@login00.darwin ~]$ GP_BASEDIR="${WORKDIR}/sw/Gromacs_Plumed" [user@login00.darwin ~]$ G_BASEDIR="${GP_BASEDIR}/Gromacs" [user@login00.darwin ~]$ P_BASEDIR="${GP_BASEDIR}/Plumed" [user@login00.darwin ~]$ GP_BASEDIR_PRIVS=2770
If the directory hierarchy does not yet exist, it can be setup using
[user@login00.darwin ~]$ mkdir -p -m $GP_BASEDIR_PRIVS "${GP_BASEDIR}" [user@login00.darwin ~]$ mkdir -p -m $GP_BASEDIR_PRIVS "${G_BASEDIR}" [user@login00.darwin ~]$ mkdir -p -m $GP_BASEDIR_PRIVS "${P_BASEDIR}"
In this example version 2.8.3 of Plumed will be built. Our standard recipes for Plumed will entail use of the Intel compilers, the MKL for BLAS/LAPACK/FFTW/ScaLAPACK/BLACS, and Open MPI for parallelism.
Download and unpack "plumed-2.8.3.tgz" and create a directory to hold our base build of plumed-2.8.3, naming it with the version identifier: v2.8.3
. The source is then unpacked therein:
[user@login00.darwin ~]$ cd $P_BASEDIR [user@login00.darwin Plumed]$ wget https://github.com/plumed/plumed2/releases/download/v2.8.3/plumed-2.8.3.tgz [user@login00.darwin Plumed]$ tar -xvzf plumed-2.8.3.tgz
We use configure for compilation and installation on "v2.8.3" directory.
[user@login00.darwin ~]$ P_INSTALL_PREFIX="${P_BASEDIR}/v2.8.3" [user@login00.darwin ~]$ export P_INSTALL_PREFIX [user@login00.darwin ~]$ P_SRC_PREFIX="${P_BASEDIR}/plumed-2.8.3" [user@login00.darwin ~]$ mkdir -m $GP_BASEDIR_PRIVS "$P_INSTALL_PREFIX" [user@login00.darwin ~]$ cd "$P_SRC_PREFIX" [user@login00.darwin plumed-2.8.3]$ vpkg_devrequire openmpi/4.1.5:intel-oneapi-2023 [user@login00.darwin plumed-2.8.3]$ ./configure --prefix=$P_INSTALL_PREFIX CC=mpicc CXX=mpicxx FC=mpifort LDFLAGS=-qmkl=sequential [user@login00.darwin plumed-2.8.3]$ make [user@login00.darwin plumed-2.8.3]$ make install
Our current working directory is now the source directory.
Here, we create sourceme.sh
:
TPATH="${P_INSTALL_PREFIX}" export PATH="$TPATH/bin/:$PATH" export LIBRARY_PATH="$TPATH/lib/:$LIBRARY_PATH" export LD_LIBRARY_PATH="$TPATH/lib/:$LD_LIBRARY_PATH" export PLUMED_KERNEL="$TPATH/lib/libplumedKernel.so" export PLUMED_VIMPATH="$TPATH/lib/plumed/vim/" export PYTHONPATH="$TPATH/lib/python/:$PYTHONPATH" export CPATH="$TPATH/include/:$CPATH” export INCLUDE="$TPATH/include/:$INCLUDE”
Executing the script.
[user@login00.darwin plumed-2.8.3]$ source sourceme.sh
In this example version 2022.5 of Gromacs will be built. Our standard recipes for Gromacs will entail use of the Intel compilers, the MKL for BLAS/LAPACK/FFTW/ScaLAPACK/BLACS, and Open MPI for parallelism.
Download and unpack "gromacs-2022.5.tar.gz" and create a directory to hold our base build of gromacs-2022.5, naming it with the version identifier: v2022.5
. The source is then unpacked therein:
[user@login00.darwin plumed-2.8.3]$ cd $G_BASEDIR [user@login00.darwin Gromacs]$ wget https://ftp.gromacs.org/gromacs/gromacs-2022.5.tar.gz [user@login00.darwin Gromacs]$ tar -xvzf gromacs-2022.5.tar.gz
We use cmake for compilation and installation on Plumed-patched Gromacs "v2022.5" directory.
[user@login00.darwin Gromacs]$ G_INSTALL_PREFIX="${G_BASEDIR}/v2022.5" [user@login00.darwin Gromacs]$ export G_INSTALL_PREFIX [user@login00.darwin Gromacs]$ G_SRC_PREFIX="${G_BASEDIR}/gromacs-2022.5" [user@login00.darwin Gromacs]$ mkdir -m $GP_BASEDIR_PRIVS "$G_INSTALL_PREFIX" [user@login00.darwin Gromacs]$ G_BUILDDIR="${G_SRC_PREFIX}/build" [user@login00.darwin Gromacs]$ mkdir -m $GP_BASEDIR_PRIVS "$G_BUILDDIR" [user@login00.darwin Gromacs]$ cd "$G_SRC_PREFIX"
Hear, we patch Plumed on Gromacs.
[user@login00.darwin gromacs-2022.5]$ plumed patch -p --static
Select 4:
1) gromacs-2019.6 5) gromacs-4.5.7 9) qespresso-5.0.2 2) gromacs-2020.7 6) namd-2.12 10) qespresso-6.2 3) gromacs-2021.7 7) namd-2.13 4) gromacs-2022.5 8) namd-2.14
[user@login00.darwin gromacs-2022.5]$ cd "$G_BUILDDIR"
Our current working directory is now the build root.
Here, we create SWMGR-build.sh
:
#!/bin/bash -l vpkg_require cmake/default openmpi/4.1.5:intel-oneapi-2023 PREFIX="${G_INSTALL_PREFIX}" CPU_GMX_SIMD=AVX2_256 BASE_BUILD_FLAGS=" -DCMAKE_BUILD_TYPE=Release -DGMX_SIMD=${CPU_GMX_SIMD} -DGMX_FFT_LIBRARY=mkl -DMKL_MPI=openmpi -DBUILD_SHARED_LIBS=OFF -DGMX_PREFER_STATIC_LIBS=ON " # BASE_BUILD_FLAGS="$BASE_BUILD_FLAGS -DGMX_GPU=SYCL" # -DMKL_INCLUDE_DIR=$MKLROOT/include # -DMKL_LIBRARIES=-mkl=sequential #" build_variant() { local DBL=$1 MPI=$2 local build_dir="" local build_flags="" if [ $DBL -ne 0 ]; then build_dir="double" build_flags="${build_flags} -DGMX_DOUBLE=on" else build_dir="single" build_flags="${build_flags} -DGMX_DOUBLE=off" fi if [ $MPI -eq 0 ]; then build_dir="${build_dir}-thread" build_flags="${build_flags} -DGMX_MPI=off -DGMX_THREAD_MPI=on -DCMAKE_DISABLE_FIND_PACKAGE_MPI=on" CC=icx CXX=icpx FC=ifx else build_dir="${build_dir}-mpi" build_flags="${build_flags} -DGMX_MPI=on -DGMX_THREAD_MPI=off" CC=mpicc CXX=mpicxx FC=mpifort fi [ -d "build-${build_dir}" ] && rm -rf "build-${build_dir}" mkdir "build-${build_dir}" ; pushd "build-${build_dir}" CC=$CC CXX=$CXX FC=$FC \ cmake \ -DCMAKE_INSTALL_PREFIX="${PREFIX}/${build_dir}" \ $BASE_BUILD_FLAGS $build_flags \ ../.. if [ $? -eq 0 ]; then make -j 20 if [ $? -eq 0 ]; then make install fi fi popd } ## ## SYCL only supports single precision. ## # DOUBLE? MPI? #build_variant 0 0 #build_variant 1 0 #build_variant 0 1 build_variant 1 1
#!/bin/bash -l vpkg_require cmake/default openmpi/4.1.4:intel-oneapi-2023 PREFIX="${G_INSTALL_PREFIX}" CPU_GMX_SIMD=AVX2_256 BASE_BUILD_FLAGS=" -DCMAKE_BUILD_TYPE=Release -DGMX_SIMD=${CPU_GMX_SIMD} -DGMX_FFT_LIBRARY=mkl -DMKL_MPI=openmpi -DBUILD_SHARED_LIBS=OFF -DGMX_PREFER_STATIC_LIBS=ON " # BASE_BUILD_FLAGS="$BASE_BUILD_FLAGS -DGMX_GPU=SYCL" # -DMKL_INCLUDE_DIR=$MKLROOT/include # -DMKL_LIBRARIES=-mkl=sequential #" build_variant() { local DBL=$1 MPI=$2 local build_dir="" local build_flags="" if [ $DBL -ne 0 ]; then build_dir="double" build_flags="${build_flags} -DGMX_DOUBLE=on" else build_dir="single" build_flags="${build_flags} -DGMX_DOUBLE=off" fi if [ $MPI -eq 0 ]; then build_dir="${build_dir}-thread" build_flags="${build_flags} -DGMX_MPI=off -DGMX_THREAD_MPI=on -DCMAKE_DISABLE_FIND_PACKAGE_MPI=on" CC=icx CXX=icpx FC=ifx else build_dir="${build_dir}-mpi" build_flags="${build_flags} -DGMX_MPI=on -DGMX_THREAD_MPI=off" CC=mpicc CXX=mpicxx FC=mpifort fi [ -d "build-${build_dir}" ] && rm -rf "build-${build_dir}" mkdir "build-${build_dir}" ; pushd "build-${build_dir}" CC=$CC CXX=$CXX FC=$FC \ cmake \ -DCMAKE_INSTALL_PREFIX="${PREFIX}/${build_dir}" \ $BASE_BUILD_FLAGS $build_flags \ ../.. if [ $? -eq 0 ]; then make -j 20 if [ $? -eq 0 ]; then make install fi fi popd } ## ## SYCL only supports single precision. ## # DOUBLE? MPI? #build_variant 0 0 #build_variant 1 0 #build_variant 0 1 build_variant 1 1
Executing the script compile and install plumed-patched gromacs.
[user@login00.darwin build]$ ./SWMGR-build.sh
With this version of Gromacs_Plumed built, the remaining step is to leverage VALET for setup of the runtime environment when you use the software. VALET automatically recognizes the standard directory layout, so configuring versions/variants of Gromacs_Plumed
is very straightforward. First, note your installation path:
[user@login00.darwin build]$ vpkg_rollback all [user@login00.darwin build]$ cd [user@login00.darwin ~]$ echo $GP_BASEDIR /home/user/sw/Gromacs_Plumed
Since this build was done in the user's home directory, they were personal copies of the software and should use a VALET package definition file stored in ~/.valet
[user@login00.darwin ~]$ VALET_PKG_DIR=~/.valet ; VALET_PKG_DIR_MODE=0700
versus an installation made for an entire workgroup, which would store the VALET package definition files in $WORKDIR/sw/valet
[user@login00.darwin ~]$ VALET_PKG_DIR="$WORKDIR/sw/valet" ; VALET_PKG_DIR_MODE=2770
Whichever scheme is in-use, ensure the directory exists:
[user@login00.darwin ~]$ mkdir -p --mode=$VALET_PKG_DIR_MODE "$VALET_PKG_DIR"
VALET allows package definitions in a variety of formats (XML, JSON, YAML) but YAML tends to be the simplest format so we will use it here.
The package section of the definition file includes items that apply to all versions/variants of the software:
Gromacs_Plumed: prefix: /home/user/sw/Gromacs_Plumed/Gromacs description: Gromacs_Plumed url: "https://www.gromacs.org/"
The package identifier is the top-level key in the document — Gromacs_Plumed
— and the value of $GP_BASEDIR
is the value of the prefix
key in this section. The URL and description are information taken from the official Gromacs web site.
The versions
key is used to provide a list of the versions/variants of the software:
gromacs-plumed: prefix: /home/user/sw/Gromacs_Plumed/Gromacs description: Gromacs_Plumed url: "https://www.gromacs.org/" default-version: "v2022.5" versions: "v2022.5": prefix: "v2022.5/double-mpi" description: Gromacs patched with Plumed v2.8.3 dependencies: - openmpi/4.1.5:intel-oneapi-2023
The version identifier v7.3
is inferred to be the path prefix to the version in question here. The package's prefix (/home/user/sw/Gromacs_Plumed
) with the version identifier appended (/home/user/sw/Gromacs_Plumed/Gromacs/v2022.5
) is implicit.
The implicit behavior is overridden by providing a prefix
key in the version definition: a relative path is appended to the package's prefix, an absolute path is used as-is.
It is a good idea to specify which version definition should act as the default. This yields the following package definition file
gromacs-plumed: prefix: /home/user/sw/Gromacs_Plumed/Gromacs description: Gromacs_Plumed url: "https://www.gromacs.org/" default-version: "v2022.5" versions: "v2022.5": prefix: "v2022.5/double-mpi" description: Gromacs patched with Plumed v2.8.3 dependencies: - openmpi/4.1.5:intel-oneapi-2023
gromacs-plumed: prefix: /home/user/sw/Gromacs_Plumed/Gromacs description: Gromacs_Plumed url: "https://www.gromacs.org/" default-version: "v2022.5" versions: "v2022.5": prefix: "v2022.5/double-mpi" description: Gromacs patched with Plumed v2.8.3 dependencies: - openmpi/4.1.4:intel-oneapi-2023
saved at $VALET_PKG_DIR/gromacs-plumed.vpkg_yaml
.
The package definition file can be checked for proper syntax using the VALET command vpkg_check
:
[user@login00.darwin ~]$ vpkg_check "$VALET_PKG_DIR/gromacs-plumed.vpkg_yaml" /home/user/.valet/gromacs-plumed.vpkg_yaml is OK [gromacs-plumed] { contexts: all actions: { GROMACS_PLUMED_PREFIX=${VALET_PATH_PREFIX} (contexts: development) } https://www.gromacs.org/ Gromacs_Plumed prefix: /home/user/sw/Gromacs_Plumed/Gromacs source file: /home/user/.valet/gromacs-plumed.vpkg_yaml default version: gromacs-plumed/v2022.5 versions: { [gromacs-plumed/v2022.5] { contexts: all dependencies: { openmpi/4.1.5:intel-oneapi-2023 } Gromacs patched with Plumed v2.8.3 prefix: /home/user/sw/Gromacs_Plumed/Gromacs/v2022.5/double-mpi standard paths: { bin: /home/user/sw/Gromacs_Plumed/Gromacs/v2022.5/double-mpi/bin lib: /home/user/sw/Gromacs_Plumed/Gromacs/v2022.5/double-mpi/lib64 man: /home/user/sw/Gromacs_Plumed/Gromacs/v2022.5/double-mpi/share/man include: /home/user/sw/Gromacs_Plumed/Gromacs/v2022.5/double-mpi/include } } } }
The file had no errors in its YAML syntax. Notice also that the standard path (bin
) is found and noted by VALET!
To load Gromacs_Plumed v2022.5 into the runtime environment, the vpkg_require
command is used:
[user@login00.darwin ~]$ vpkg_require gromacs-plumed/v2022.5 Adding dependency `binutils/2.35.1` to your environment Adding dependency `gcc/12.2.0` to your environment Adding dependency `intel-oneapi/2023.0.0.25537` to your environment Adding dependency `ucx/1.13.1` to your environment Adding dependency `openmpi/4.1.5:intel-oneapi-2023` to your environment Adding package `gromacs-plumed/v2022.5` to your environment [user@login00.darwin ~]$ which gmx_mpi_d ~/sw/Gromacs_Plumed/Gromacs/v2022.5/double-mpi/bin/gmx_mpi_d