diff options
Diffstat (limited to 'pkgs/by-name/mu/mumps/package.nix')
-rw-r--r-- | pkgs/by-name/mu/mumps/package.nix | 202 |
1 files changed, 115 insertions, 87 deletions
diff --git a/pkgs/by-name/mu/mumps/package.nix b/pkgs/by-name/mu/mumps/package.nix index 17c005946f57..2620d5b602b5 100644 --- a/pkgs/by-name/mu/mumps/package.nix +++ b/pkgs/by-name/mu/mumps/package.nix @@ -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,114 +64,96 @@ 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.isDarwin '' - substituteInPlace src/Makefile --replace-fail \ - "-Wl,\''$(SONAME),libmumps_common" \ - "-Wl,-install_name,$out/lib/libmumps_common" - ''; + 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 = - lib.optionals stdenv.isDarwin [ + 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 = '' - mkdir $out - cp -r include lib $out + 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 - ''; + # Add some compatibility with coin-or-mumps + 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 = [ - blas - lapack - metis - scotch - ]; + # 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.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; }; }) |