about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/science/molecular-dynamics/lammps/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/applications/science/molecular-dynamics/lammps/default.nix')
-rw-r--r--nixpkgs/pkgs/applications/science/molecular-dynamics/lammps/default.nix121
1 files changed, 121 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/applications/science/molecular-dynamics/lammps/default.nix b/nixpkgs/pkgs/applications/science/molecular-dynamics/lammps/default.nix
new file mode 100644
index 000000000000..4c2a80c2f1b7
--- /dev/null
+++ b/nixpkgs/pkgs/applications/science/molecular-dynamics/lammps/default.nix
@@ -0,0 +1,121 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, libpng
+, gzip
+, fftw
+, blas
+, lapack
+, cmake
+, cudaPackages
+, pkg-config
+# Available list of packages can be found near here:
+#
+# - https://github.com/lammps/lammps/blob/develop/cmake/CMakeLists.txt#L222
+# - https://docs.lammps.org/Build_extras.html
+, packages ? {
+  ASPHERE = true;
+  BODY = true;
+  CLASS2 = true;
+  COLLOID = true;
+  COMPRESS = true;
+  CORESHELL = true;
+  DIPOLE = true;
+  GRANULAR = true;
+  KSPACE = true;
+  MANYBODY = true;
+  MC = true;
+  MISC = true;
+  MOLECULE = true;
+  OPT = true;
+  PERI = true;
+  QEQ = true;
+  REPLICA = true;
+  RIGID = true;
+  SHOCK = true;
+  ML-SNAP = true;
+  SRD = true;
+  REAXFF = true;
+}
+# Extra cmakeFlags to add as "-D${attr}=${value}"
+, extraCmakeFlags ? {}
+# Extra `buildInputs` - meant for packages that require more inputs
+, extraBuildInputs ? []
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  # LAMMPS has weird versioning convention. Updates should go smoothly with:
+  # nix-update --commit lammps --version-regex 'stable_(.*)'
+  version = "2Aug2023_update3";
+  pname = "lammps";
+
+  src = fetchFromGitHub {
+    owner = "lammps";
+    repo = "lammps";
+    rev = "stable_${finalAttrs.version}";
+    hash = "sha256-jx0hkiYxQlnE2sa4WTvluEgphF//sNbK91VGAQJMwjw=";
+  };
+  preConfigure = ''
+    cd cmake
+  '';
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    # Although not always needed, it is needed if cmakeFlags include
+    # GPU_API=cuda, and it doesn't users that don't enable the GPU package.
+    cudaPackages.autoAddDriverRunpath
+  ];
+
+  passthru = {
+    # Remove these at some point - perhaps after release 23.11. See discussion at:
+    # https://github.com/NixOS/nixpkgs/pull/238771#discussion_r1235459961
+    mpi = throw "`lammps-mpi.passthru.mpi` was removed in favor of `extraBuildInputs`";
+    inherit packages;
+    inherit extraCmakeFlags;
+    inherit extraBuildInputs;
+  };
+  cmakeFlags = [
+  ]
+  ++ (builtins.map (p: "-DPKG_${p}=ON") (builtins.attrNames (lib.filterAttrs (n: v: v) packages)))
+  ++ (lib.mapAttrsToList (n: v: "-D${n}=${v}") extraCmakeFlags)
+  ;
+
+  buildInputs = [
+    fftw
+    libpng
+    blas
+    lapack
+    gzip
+  ] ++ extraBuildInputs
+  ;
+
+  postInstall = ''
+    # For backwards compatibility
+    ln -s $out/bin/lmp $out/bin/lmp_serial
+    # Install vim and neovim plugin
+    install -Dm644 ../../tools/vim/lammps.vim $out/share/vim-plugins/lammps/syntax/lammps.vim
+    install -Dm644 ../../tools/vim/filetype.vim $out/share/vim-plugins/lammps/ftdetect/lammps.vim
+    mkdir -p $out/share/nvim
+    ln -s $out/share/vim-plugins/lammps $out/share/nvim/site
+  '';
+
+  meta = with lib; {
+    description = "Classical Molecular Dynamics simulation code";
+    longDescription = ''
+      LAMMPS is a classical molecular dynamics simulation code designed to
+      run efficiently on parallel computers. It was developed at Sandia
+      National Laboratories, a US Department of Energy facility, with
+      funding from the DOE. It is an open-source code, distributed freely
+      under the terms of the GNU Public License (GPL).
+      '';
+    homepage = "https://www.lammps.org";
+    license = licenses.gpl2Only;
+    platforms = platforms.linux;
+    # compiling lammps with 64 bit support blas and lapack might cause runtime
+    # segfaults. In anycase both blas and lapack should have the same #bits
+    # support.
+    broken = (blas.isILP64 && lapack.isILP64);
+    maintainers = [ maintainers.costrouc maintainers.doronbehar ];
+    mainProgram = "lmp";
+  };
+})