Skip to content

Commit

Permalink
Mumps: add variant mumps_par with mpi support (NixOS#351476)
Browse files Browse the repository at this point in the history
  • Loading branch information
MatthewCroughan authored Oct 29, 2024
2 parents 6868113 + 0b324cc commit ec7caab
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 91 deletions.
6 changes: 6 additions & 0 deletions maintainers/maintainer-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -17676,6 +17676,12 @@
githubId = 12017109;
name = "Rabindra Dhakal";
};
qbisi = {
name = "qbisicwate";
email = "[email protected]";
github = "qbisi";
githubId = 84267544;
};
qbit = {
name = "Aaron Bieber";
email = "[email protected]";
Expand Down
14 changes: 9 additions & 5 deletions pkgs/by-name/ca/casadi/package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
cplex,
fatrop,
fetchFromGitHub,
fetchpatch,
gurobi,
highs,
hpipm,
Expand Down Expand Up @@ -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
Expand All @@ -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;" \
Expand Down
200 changes: 114 additions & 86 deletions pkgs/by-name/mu/mumps/package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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 ''
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 =
Expand All @@ -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 = ''
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.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 changes: 2 additions & 0 deletions pkgs/top-level/all-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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 { };
Expand Down

0 comments on commit ec7caab

Please sign in to comment.