diff --git a/overlay.nix b/overlay.nix index 6d2af14b..3d83c8b8 100644 --- a/overlay.nix +++ b/overlay.nix @@ -59,6 +59,8 @@ let tampi = callPackage ./pkgs/tampi/default.nix { }; upc-qaire-exporter = prev.callPackage ./pkgs/upc-qaire-exporter/default.nix { }; wxparaver = callPackage ./pkgs/paraver/default.nix { }; + + gromacs = callPackage ./pkgs/gromacs/default.nix { enableSYCL = true; }; }; tests = rec { diff --git a/pkgs/gromacs/default.nix b/pkgs/gromacs/default.nix new file mode 100644 index 00000000..c7fa2fdf --- /dev/null +++ b/pkgs/gromacs/default.nix @@ -0,0 +1,188 @@ +{ + lib, + stdenv, + fetchurl, + cmake, + hwloc, + fftw, + perl, + blas, + lapack, + llvmPackages, + intelPackages ? null, + mpi, + cudaPackages, + plumed, + singlePrec ? true, + config, + enableSYCL ? false, + enableCuda ? config.cudaSupport, + enableMpi ? false, + enablePlumed ? false, + cpuAcceleration ? null, +}: + +# CUDA is only implemented for single precission +assert enableCuda -> singlePrec; + +assert !(enableSYCL && enableCuda); + +assert enableSYCL -> intelPackages != null; + +let + inherit (cudaPackages.flags) cmakeCudaArchitecturesString; + + # Select reasonable defaults for all major platforms + # The possible values are defined in CMakeLists.txt: + # AUTO None SSE2 SSE4.1 AVX_128_FMA AVX_256 AVX2_256 + # AVX2_128 AVX_512 AVX_512_KNL MIC ARM_NEON ARM_NEON_ASIMD + SIMD = + x: + if (cpuAcceleration != null) then + x + else if stdenv.hostPlatform.system == "i686-linux" then + "SSE2" + else if stdenv.hostPlatform.system == "x86_64-linux" then + "SSE4.1" + else if stdenv.hostPlatform.system == "x86_64-darwin" then + "SSE4.1" + else if stdenv.hostPlatform.system == "aarch64-linux" then + "ARM_NEON_ASIMD" + else + "None"; + + source = + if enablePlumed then + { + version = "2024.2"; + hash = "sha256-gCp+M18uiVdw9XsVnk7DaOuw/yzm2sz3BsboAlw2hSs="; + } + else + { + version = "2025.3"; + hash = "sha256-i9/KAmjz8Qp8o8BuWbYvc+oCQgxnIRwP85EvMteDPGU="; + }; + + stdenv' = + if enableSYCL then intelPackages.stdenv else stdenv; + +in +stdenv'.mkDerivation rec { + pname = "gromacs"; + version = source.version; + + src = fetchurl { + url = "ftp://ftp.gromacs.org/pub/gromacs/gromacs-${version}.tar.gz"; + inherit (source) hash; + }; + + patches = [ (if enablePlumed then ./pkgconfig-2024.patch else ./pkgconfig-2025.patch) ]; + + postPatch = lib.optionalString enablePlumed '' + plumed patch -p -e gromacs-${source.version} + ''; + + outputs = [ + "out" + "dev" + "man" + ]; + + nativeBuildInputs = [ + cmake + ] + ++ lib.optional enablePlumed plumed + ++ lib.optionals enableCuda [ cudaPackages.cuda_nvcc ]; + + buildInputs = [ + fftw + perl + hwloc + blas + lapack + ] + ++ lib.optional enableMpi mpi + ++ lib.optionals enableCuda [ + cudaPackages.cuda_cccl + cudaPackages.cuda_cudart + cudaPackages.libcufft + cudaPackages.cuda_profiler_api + ] + ++ lib.optional stdenv.hostPlatform.isDarwin llvmPackages.openmp; + + propagatedBuildInputs = lib.optional enableMpi mpi; + propagatedUserEnvPkgs = lib.optional enableMpi mpi; + + cmakeFlags = [ + (lib.cmakeBool "GMX_HWLOC" true) + "-DGMX_SIMD:STRING=${SIMD cpuAcceleration}" + "-DGMX_OPENMP:BOOL=TRUE" + "-DBUILD_SHARED_LIBS=ON" + ] + ++ ( + if singlePrec then + [ + "-DGMX_DOUBLE=OFF" + ] + else + [ + "-DGMX_DOUBLE=ON" + "-DGMX_DEFAULT_SUFFIX=OFF" + ] + ) + ++ ( + if enableMpi then + [ + "-DGMX_MPI:BOOL=TRUE" + "-DGMX_THREAD_MPI:BOOL=FALSE" + ] + else + [ + "-DGMX_MPI:BOOL=FALSE" + ] + ) + ++ (lib.optionals enableSYCL [ + "-DGMX_GPU=SYCL" + ]) + ++ lib.optionals enableCuda [ + "-DGMX_GPU=CUDA" + (lib.cmakeFeature "CMAKE_CUDA_ARCHITECTURES" cmakeCudaArchitecturesString) + + # Gromacs seems to ignore and override the normal variables, so we add this ad hoc: + (lib.cmakeFeature "GMX_CUDA_TARGET_COMPUTE" cmakeCudaArchitecturesString) + ]; + + postInstall = '' + moveToOutput share/cmake $dev + ''; + + meta = with lib; { + homepage = "https://www.gromacs.org"; + license = licenses.lgpl21Plus; + description = "Molecular dynamics software package"; + longDescription = '' + GROMACS is a versatile package to perform molecular dynamics, + i.e. simulate the Newtonian equations of motion for systems + with hundreds to millions of particles. + + It is primarily designed for biochemical molecules like + proteins, lipids and nucleic acids that have a lot of + complicated bonded interactions, but since GROMACS is + extremely fast at calculating the nonbonded interactions (that + usually dominate simulations) many groups are also using it + for research on non-biological systems, e.g. polymers. + + GROMACS supports all the usual algorithms you expect from a + modern molecular dynamics implementation, (check the online + reference or manual for details), but there are also quite a + few features that make it stand out from the competition. + + See: https://www.gromacs.org/about.html for details. + ''; + platforms = platforms.unix; + maintainers = with maintainers; [ + sheepforce + markuskowa + ]; + }; +} diff --git a/pkgs/gromacs/pkgconfig-2024.patch b/pkgs/gromacs/pkgconfig-2024.patch new file mode 100644 index 00000000..6740d231 --- /dev/null +++ b/pkgs/gromacs/pkgconfig-2024.patch @@ -0,0 +1,24 @@ +diff --git a/src/external/muparser/muparser.pc.in b/src/external/muparser/muparser.pc.in +index 646787cb53..9b97ad57f7 100644 +--- a/src/external/muparser/muparser.pc.in ++++ b/src/external/muparser/muparser.pc.in +@@ -1,7 +1,5 @@ +-prefix=@CMAKE_INSTALL_PREFIX@ +-exec_prefix=${prefix} +-libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ +-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ ++libdir=@CMAKE_INSTALL_FULL_LIBDIR@ ++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + + Name: @PACKAGE_NAME@ + Description: Mathematical expressions parser library +diff --git a/src/gromacs/libgromacs.pc.cmakein b/src/gromacs/libgromacs.pc.cmakein +index ec1ed6684e..ca1105474a 100644 +--- a/src/gromacs/libgromacs.pc.cmakein ++++ b/src/gromacs/libgromacs.pc.cmakein +@@ -1,4 +1,4 @@ +-libdir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@ ++libdir=@CMAKE_INSTALL_FULL_LIBDIR@ + + Name: libgromacs@GMX_LIBS_SUFFIX@ + Description: Gromacs library diff --git a/pkgs/gromacs/pkgconfig-2025.patch b/pkgs/gromacs/pkgconfig-2025.patch new file mode 100644 index 00000000..246ffb89 --- /dev/null +++ b/pkgs/gromacs/pkgconfig-2025.patch @@ -0,0 +1,36 @@ +diff --git a/src/external/muparser/muparser.pc.in b/src/external/muparser/muparser.pc.in +index 646787cb53..d26e84de8f 100644 +--- a/src/external/muparser/muparser.pc.in ++++ b/src/external/muparser/muparser.pc.in +@@ -1,11 +1,9 @@ +-prefix=@CMAKE_INSTALL_PREFIX@ +-exec_prefix=${prefix} +-libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ +-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ +- +-Name: @PACKAGE_NAME@ +-Description: Mathematical expressions parser library +-Version: @MUPARSER_VERSION@ +-Requires: +-Libs: -L${libdir} -lmuparser +-Cflags: -I${includedir} @PKG_CONFIG_FLAGS@ ++libdir=@CMAKE_INSTALL_FULL_LIBDIR@ ++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ ++ ++Name: @PACKAGE_NAME@ ++Description: Mathematical expressions parser library ++Version: @MUPARSER_VERSION@ ++Requires: ++Libs: -L${libdir} -lmuparser ++Cflags: -I${includedir} @PKG_CONFIG_FLAGS@ +diff --git a/src/gromacs/libgromacs.pc.cmakein b/src/gromacs/libgromacs.pc.cmakein +index af9b5a6dc0..5f58d549bf 100644 +--- a/src/gromacs/libgromacs.pc.cmakein ++++ b/src/gromacs/libgromacs.pc.cmakein +@@ -1,5 +1,4 @@ +-prefix=@CMAKE_INSTALL_PREFIX@ +-libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ ++libdir=@CMAKE_INSTALL_FULL_LIBDIR@ + + Name: libgromacs@GMX_LIBS_SUFFIX@ + Description: Gromacs library