Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/flake.nix
3196 views
{
  description = "Elmer FEM";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";

    flake-utils.url = "github:numtide/flake-utils";

    flake-compat.url = "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz";

    nix-filter.url = "github:numtide/nix-filter";

    mumps = {
      url = "github:mk3z/mumps";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    mmg = {
      url = "github:mk3z/mmg/develop";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    parmmg = {
      url = "github:mk3z/parmmg/develop";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        mmg.follows = "mmg";
      };
    };
  };

  nixConfig = {
    extra-substituters = [
      "https://elmerfem.cachix.org"
    ];
    extra-trusted-public-keys = [
      "elmerfem.cachix.org-1:nWIb5JzEzC2/W6qiuaC0urJRG+S7KvTn9WatX43gkHk="
    ];
  };

  outputs = {
    self,
    nixpkgs,
    flake-utils,
    nix-filter,
    ...
  } @ inputs:
    (flake-utils.lib.eachDefaultSystem (
      system: let
        pkgs = nixpkgs.legacyPackages.${system};

        mumps = inputs.mumps.packages.${system}.default;
        mmg = inputs.mmg.packages.${system}.default;
        parmmg = inputs.parmmg.packages.${system}.default;

        basePkg = {
          name,
          nativeBuildInputs ? [],
          buildInputs ? [],
          cmakeFlags ? [],
          doCheck,
          checkOptions ? ''-L "quick|fast" -E "ForceToStress_parallel"'',
          ...
        }: let
          storepath = placeholder "out";
          extraNativeBuildInputs = nativeBuildInputs;
          extraBuildInputs = buildInputs;
          extraCmakeFlags = cmakeFlags;
        in
          pkgs.stdenv.mkDerivation {
            inherit name doCheck storepath;

            pname = "${name}-devel";

            src = nix-filter {
              root = self;
              include = [
                "cmake"
                "CMakeLists.txt"
                "contrib"
                "cpack"
                "elmergrid"
                "ElmerGUI"
                "ElmerGUIlogger"
                "ElmerGUItester"
                "elmerice"
                "ElmerWorkflows"
                "fem"
                "fhutiter"
                "license_texts"
                "matc"
                "mathlibs"
                "meshgen2d"
                "misc"
                "pics"
                "post"
                "umfpack"
              ];
            };

            hardeningDisable = ["format"];

            nativeBuildInputs = with pkgs;
              [
                cmake
                gfortran
                pkg-config
                autoPatchelfHook
              ]
              ++ extraNativeBuildInputs;

            buildInputs = with pkgs;
              [
                mpi
                blas
                liblapack
                tbb
              ]
              ++ extraBuildInputs;

            cmakeFlags =
              [
                "-DCMAKE_INSTALL_LIBDIR=lib"
                "-DCMAKE_INSTALL_INCLUDEDIR=include"
                "-DWITH_LUA:BOOL=TRUE"

                "-DWITH_OpenMP:BOOLEAN=TRUE"
                "-DWITH_MPI:BOOLEAN=TRUE"

                "-DWITH_ElmerIce:BOOL=TRUE"

                "-DMPIEXEC_PREFLAGS=-oversubscribe"

                "-Wno-dev"
              ]
              ++ extraCmakeFlags;

            checkPhase = ''
              runHook preCheckPhase
              ctest -j $NIX_BUILD_CORES ${checkOptions}
              runHook postCheckPhase
            '';

            autoPatchelfIgnoreMissingDeps = ["libmpi_stubs.so"];

            preConfigure = ''
              patchShebangs ./
            '';

            nativeCheckInputs = with pkgs; [
              mpiCheckPhaseHook
              openssh
            ];
          };

        default = {doCheck ? false}:
          basePkg {
            inherit doCheck;
            name = "elmer";
          };

        gui = {doCheck ? false}:
          basePkg {
            inherit doCheck;
            name = "elmer-gui";

            nativeBuildInputs = [pkgs.libsForQt5.wrapQtAppsHook];

            buildInputs = with pkgs; [
              libsForQt5.qtbase
              libsForQt5.qtscript
              libsForQt5.qwt
              libGL
              libGLU
              opencascade-occt_7_6
              vtkWithQt5
            ];

            cmakeFlags = [
              "-DWITH_ELMERGUI:BOOLEAN=TRUE"
              "-DWITH_QT5:BOOLEAN=TRUE"
              "-DWITH_OCC:BOOLEAN=TRUE"
              "-DWITH_VTK:BOOLEAN=TRUE"
              "-DCMAKE_OpenGL_GL_PREFERENCE=GLVND"
            ];
          };

        full = {doCheck ? false}:
          basePkg {
            inherit doCheck;
            name = "elmer-full";

            buildInputs = with pkgs;
              [
                libcsa
                hdf5-mpi
                hypre
                nn
                scalapack
              ]
              ++ [mumps];

            cmakeFlags = [
              "-DWITH_NETCDF:BOOL=TRUE"
              "-DNETCDF_LIBRARY=${pkgs.netcdf-mpi}/lib/libnetcdf.so"
              "-DNETCDF_INCLUDE_DIR=${pkgs.netcdf-mpi}/include"
              "-DNETCDFF_LIBRARY=${pkgs.netcdffortran}/lib/libnetcdff.so"
              "-DCMAKE_Fortran_FLAGS=-I${pkgs.netcdffortran}/include"

              "-DWITH_Hypre:BOOL=TRUE"

              "-DWITH_Mumps:BOOL=TRUE"

              "-DWITH_ScatteredDataInterpolator:BOOL=TRUE"

              "-DCSA_LIBRARY=${pkgs.libcsa}/lib/libcsa.a"
              "-DCSA_INCLUDE_DIR=${pkgs.libcsa}/include"

              "-DNN_INCLUDE_DIR=${pkgs.nn}/include"
              "-DNN_LIBRARY=${pkgs.nn}/lib/libnn.a"

              "-DWITH_MMG:BOOL=TRUE"
              "-DMMG_INCLUDE_DIR=${mmg}/include"
              "-DMMG_LIBRARY=${mmg}/lib/libmmg.so"

              "-DWITH_PARMMG:BOOL=TRUE"
              "-DPARMMG_INCLUDE_DIR=${parmmg}/include"
              "-DPARMMG_LIBRARY=${parmmg}/lib/libparmmg.so"

              "-DWITH_GridDataReader:BOOL=TRUE"

              "-DWITH_Trilinos:BOOL=FALSE"
            ];
          };
      in {
        checks = {
          default = default {doCheck = true;};
          gui = gui {doCheck = true;};
          full = full {doCheck = true;};
        };

        packages = {
          default = default {};
          gui = gui {};
          full = full {};
        };
      }
    ))
    // {
      overlay = final: prev: {
        elmer = self.packages.${final.system}.default;
        elmer-gui = self.packages.${final.system}.gui;
        elmer-full = self.packages.${final.system}.full;
      };
    };
}