Commit 0b324cc3 authored by qbisi's avatar qbisi
Browse files

mumps: add variant mumps_par with mpi support

parent 4df34892
Loading
Loading
Loading
Loading
+104 −45
Original line number Diff line number Diff line
@@ -6,10 +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";
@@ -26,28 +71,31 @@ stdenv.mkDerivation (finalAttrs: {
  '';

  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 =
    lib.optionals stdenv.hostPlatform.isDarwin [
      "SONAME="
      "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

@@ -55,15 +103,15 @@ stdenv.mkDerivation (finalAttrs: {
      ln -s $out/include/mumps_seq/mpi.h $out/include/mumps_mpi.h
    '';

  nativeBuildInputs =
    lib.optionals stdenv.hostPlatform.isDarwin [
      fixDarwinDylibNames
    ]
    ++ [
  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
@@ -71,30 +119,41 @@ stdenv.mkDerivation (finalAttrs: {
    ];

  doInstallCheck = true;
  installCheckPhase =
    lib.optionalString stdenv.hostPlatform.isDarwin ''
      export DYLD_LIBRARY_PATH=$out/lib
    ''
    + ''
  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
      ./ssimpletest <input_simpletest_real
      ./dsimpletest <input_simpletest_real
      ./csimpletest <input_simpletest_cmplx
      ./zsimpletest <input_simpletest_cmplx
      ./c_example
      ./multiple_arithmetics_example
      ./ssimpletest_save_restore <input_simpletest_real
      ./dsimpletest_save_restore <input_simpletest_real
      ./csimpletest_save_restore <input_simpletest_cmplx
      ./zsimpletest_save_restore <input_simpletest_cmplx
      ./c_example_save_restore
    $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 { };