Unverified Commit ec7caabe authored by Matthew Croughan's avatar Matthew Croughan Committed by GitHub
Browse files

Mumps: add variant mumps_par with mpi support (#351476)

parents 68681138 0b324cc3
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -17676,6 +17676,12 @@
    githubId = 12017109;
    name = "Rabindra Dhakal";
  };
  qbisi = {
    name = "qbisicwate";
    email = "qbisicwate@gmail.com";
    github = "qbisi";
    githubId = 84267544;
  };
  qbit = {
    name = "Aaron Bieber";
    email = "aaron@bolddaemon.com";
+9 −5
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
  cplex,
  fatrop,
  fetchFromGitHub,
  fetchpatch,
  gurobi,
  highs,
  hpipm,
@@ -45,6 +46,14 @@ stdenv.mkDerivation (finalAttrs: {
    hash = "sha256-Mft0qhjdAbU82RgjYuKue5p7EqbTbt3ii5yXSsCFHrQ=";
  };

  patches = [
    (fetchpatch {
      name = "fix-FindMUMPS.cmake.patch";
      url = "https://github.com/casadi/casadi/pull/3899/commits/274f4b23f73e60c5302bec0479fe1e92682b63d2.patch";
      hash = "sha256-3GWEWlN8dKLD6htpnOQLChldcT3hE09JWLeuCfAhY+4=";
    })
  ];

  postPatch =
    ''
      # fix case of hpipmConfig.cmake
@@ -57,11 +66,6 @@ stdenv.mkDerivation (finalAttrs: {
        '$'{CLANG_LLVM_LIB_DIR} \
        ${llvmPackages_17.libclang.lib}/lib

      # fix mumps lib name. No idea where this comes from.
      substituteInPlace cmake/FindMUMPS.cmake --replace-fail \
        "mumps_seq" \
        "mumps"

      # help casadi find its own libs
      substituteInPlace casadi/core/casadi_os.cpp --replace-fail \
        "std::vector<std::string> search_paths;" \
+114 −86
Original line number Diff line number Diff line
@@ -6,9 +6,55 @@
  lapack,
  lib,
  metis,
  parmetis,
  withParmetis ? false, # default to false due to unfree license
  scotch,
  withPtScotch ? mpiSupport,
  stdenv,
  fixDarwinDylibNames,
  mpi,
  mpiSupport ? false,
  mpiCheckPhaseHook,
  scalapack,
}:
assert withParmetis -> mpiSupport;
assert withPtScotch -> mpiSupport;
let
  profile = if mpiSupport then "debian.PAR" else "debian.SEQ";
  metisFlags =
    if withParmetis then
      ''
        IMETIS="-I${parmetis}/include -I${metis}/include" \
        LMETIS="-L${parmetis}/lib -lparmetis -L${metis}/lib -lmetis"
      ''
    else
      ''
        IMETIS=-I${metis}/include \
        LMETIS="-L${metis}/lib -lmetis"
      '';
  scotchFlags =
    if withPtScotch then
      ''
        ISCOTCH=-I${scotch.dev}/include \
        LSCOTCH="-L${scotch}/lib -lptscotch -lptesmumps -lptscotcherr"
      ''
    else
      ''
        ISCOTCH=-I${scotch.dev}/include \
        LSCOTCH="-L${scotch}/lib -lesmumps -lscotch -lscotcherr"
      '';
  macroFlags =
    "-Dmetis -Dpord -Dscotch"
    + lib.optionalString withParmetis " -Dparmetis"
    + lib.optionalString withPtScotch " -Dptscotch";
  # Optimized options
  # Disable -fopenmp in lines below to benefit from OpenMP
  optFlags = ''
    OPTF="-O3 -fallow-argument-mismatch" \
    OPTL="-O3" \
    OPTC="-O3"
  '';
in
stdenv.mkDerivation (finalAttrs: {
  name = "mumps";
  version = "5.7.3";
@@ -18,28 +64,20 @@ stdenv.mkDerivation (finalAttrs: {
    hash = "sha256-ZnIfAuvOBJDYqCtKGlWs0r39nG6X2lAVRuUmeIJenZw=";
  };

  patches = [
    # Compatibility with coin-or-mumps version
    (fetchpatch {
      url = "https://raw.githubusercontent.com/coin-or-tools/ThirdParty-Mumps/bd0bdf9baa3f3677bd34fb36ce63b2b32cc6cc7d/mumps_mpi.patch";
      hash = "sha256-70qZUKBVBpJOSRxYxng5Y6ct1fdCUQUGur3chDhGabQ=";
    })
  ];

  postPatch =
    ''
      # Compatibility with coin-or-mumps version
      # https://github.com/coin-or-tools/ThirdParty-Mumps/blob/stable/3.0/get.Mumps#L66
      cp libseq/mpi.h libseq/mumps_mpi.h
    ''
    + lib.optionalString stdenv.hostPlatform.isDarwin ''
  postPatch = lib.optionalString stdenv.hostPlatform.isDarwin ''
    substituteInPlace src/Makefile --replace-fail \
      "-Wl,\''$(SONAME),libmumps_common" \
      "-Wl,-install_name,$out/lib/libmumps_common"
  '';

  configurePhase = ''
    cp Make.inc/Makefile.debian.SEQ ./Makefile.inc
    cp Make.inc/Makefile.${profile} ./Makefile.inc
  '';

  enableParallelBuilding = true;

  preBuild = ''
    makeFlagsArray+=(${metisFlags} ${scotchFlags} ORDERINGSF="${macroFlags}" ${optFlags})
  '';

  makeFlags =
@@ -48,84 +86,74 @@ stdenv.mkDerivation (finalAttrs: {
      "LIBEXT_SHARED=.dylib"
    ]
    ++ [
      "LSCOTCHDIR=${scotch}/lib"
      "ISCOTCH=-I${scotch.dev}/include"
      "LMETISDIR=${metis}/lib"
      "IMETIS=-I${metis}/include"
      "SCALAP=-lscalapack"
      "allshared"
    ];

  installPhase = ''
  installPhase =
    ''
      mkdir $out
      cp -r include lib $out
    ''
    + lib.optionalString (!mpiSupport) ''
      # Install mumps_seq headers
      install -Dm 444 -t $out/include/mumps_seq libseq/*.h

      # Add some compatibility with coin-or-mumps
    ln -s $out/include $out/include/mumps
    cp libseq/mumps_mpi.h $out/include
      ln -s $out/include/mumps_seq/mpi.h $out/include/mumps_mpi.h
    '';

  nativeBuildInputs = [ gfortran ];
  nativeBuildInputs = [
    gfortran
  ] ++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames ++ lib.optional mpiSupport mpi;

  buildInputs = [
  # Parmetis should be placed before scotch to avoid conflict of header file "parmetis.h"
  buildInputs =
    lib.optional withParmetis parmetis
    ++ lib.optional mpiSupport scalapack
    ++ [
      blas
      lapack
      metis
      scotch
    ];

  preFixup = lib.optionalString stdenv.hostPlatform.isDarwin ''
    install_name_tool \
      -change    libmpiseq.dylib \
        $out/lib/libmpiseq.dylib \
      -change    libpord.dylib \
        $out/lib/libpord.dylib \
        $out/lib/libmumps_common.dylib
    install_name_tool \
      -change    libmpiseq.dylib \
        $out/lib/libmpiseq.dylib \
      -change    libpord.dylib \
        $out/lib/libpord.dylib \
      -id \
        $out/lib/libcmumps.dylib \
        $out/lib/libcmumps.dylib
    install_name_tool \
      -change    libmpiseq.dylib \
        $out/lib/libmpiseq.dylib \
      -change    libpord.dylib \
        $out/lib/libpord.dylib \
      -id \
        $out/lib/libdmumps.dylib \
        $out/lib/libdmumps.dylib
    install_name_tool \
      -change    libmpiseq.dylib \
        $out/lib/libmpiseq.dylib \
      -change    libpord.dylib \
        $out/lib/libpord.dylib \
      -id \
        $out/lib/libsmumps.dylib \
        $out/lib/libsmumps.dylib
    install_name_tool \
      -change    libmpiseq.dylib \
        $out/lib/libmpiseq.dylib \
      -change    libpord.dylib \
        $out/lib/libpord.dylib \
      -id \
        $out/lib/libzmumps.dylib \
        $out/lib/libzmumps.dylib
    install_name_tool \
      -id \
        $out/lib/libmpiseq.dylib \
        $out/lib/libmpiseq.dylib
    install_name_tool \
      -id \
        $out/lib/libpord.dylib \
        $out/lib/libpord.dylib
  doInstallCheck = true;
  nativeInstallCheckInputs = lib.optional mpiSupport mpiCheckPhaseHook;
  installCheckPhase = ''
    runHook preInstallCheck
    ${lib.optionalString stdenv.hostPlatform.isDarwin "export DYLD_LIBRARY_PATH=$out/lib\n"}
    ${lib.optionalString mpiSupport "export MPIRUN='mpirun -n 2'\n"}
    cd examples
    make all
    $MPIRUN ./ssimpletest <input_simpletest_real
    $MPIRUN ./dsimpletest <input_simpletest_real
    $MPIRUN ./csimpletest <input_simpletest_cmplx
    $MPIRUN ./zsimpletest <input_simpletest_cmplx
    $MPIRUN ./c_example
    $MPIRUN ./multiple_arithmetics_example
    $MPIRUN ./ssimpletest_save_restore <input_simpletest_real
    $MPIRUN ./dsimpletest_save_restore <input_simpletest_real
    $MPIRUN ./csimpletest_save_restore <input_simpletest_cmplx
    $MPIRUN ./zsimpletest_save_restore <input_simpletest_cmplx
    $MPIRUN ./c_example_save_restore
    runHook postInstallCheck
  '';

  passthru = {
    inherit withParmetis withPtScotch mpiSupport;
  };

  meta = {
    description = "MUltifrontal Massively Parallel sparse direct Solver";
    homepage = "http://mumps-solver.org/";
    license = lib.licenses.cecill-c;
    maintainers = with lib.maintainers; [ nim65s ];
    maintainers = with lib.maintainers; [
      nim65s
      qbisi
    ];
    platforms = lib.platforms.unix;
    # Dependency of scalapack for mpiSupport is broken on darwin platform
    broken = mpiSupport && stdenv.hostPlatform.isDarwin;
  };
})
+2 −0
Original line number Diff line number Diff line
@@ -681,6 +681,8 @@ with pkgs;
    inherit (darwin) DarwinTools;
  };
  mumps_par = callPackage ../by-name/mu/mumps/package.nix { mpiSupport = true; };
  mix2nix = callPackage ../development/tools/mix2nix { };
  n98-magerun = callPackage ../development/tools/misc/n98-magerun { };