summaryrefslogtreecommitdiff
path: root/pkgs/development/python-modules/fenics-dolfinx/default.nix
blob: fac8944562637776dfc560b4ebe3124ef0576a8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
{
  lib,
  stdenv,
  toPythonModule,
  fetchFromGitHub,
  buildPythonPackage,

  # build-system
  scikit-build-core,
  nanobind,

  # nativeBuildInputs
  cmake,
  ninja,
  pkg-config,

  # buildInputs
  dolfinx,
  darwinMinVersionHook,

  # dependency
  numpy,
  cffi,
  mpi4py,
  petsc4py,
  slepc4py,
  adios2,
  kahip,
  fenics-ffcx,
  fenics-basix,
  fenics-ufl,

  # nativeCheckInputs
  scipy,
  matplotlib,
  pytestCheckHook,
  writableTmpDirAsHomeHook,
  mpiCheckPhaseHook,

  # custom options
  withParmetis ? false,

  # passthru.tests
  fenics-dolfinx,
  mpich,
}:

let
  fenicsPackages = petsc4py.petscPackages.overrideScope (
    final: prev: {
      slepc = final.callPackage slepc4py.override { };
      adios2 = final.callPackage adios2.override { };
      kahip = final.callPackage kahip.override { };
      dolfinx = final.callPackage dolfinx.override { inherit withParmetis; };
    }
  );
in
buildPythonPackage (finalAttrs: {
  inherit (dolfinx)
    version
    src
    ;
  pname = "fenics-dolfinx";
  pyproject = true;

  pythonRelaxDeps = [
    "fenics-ufl"
  ];

  preConfigure = ''
    cd python
  '';

  dontUseCmakeConfigure = true;

  build-system = [
    scikit-build-core
    nanobind
  ];

  nativeBuildInputs = [
    cmake
    ninja
    pkg-config
    fenicsPackages.mpi
  ];

  buildInputs = [
    fenicsPackages.dolfinx
  ]
  ++ lib.optional stdenv.hostPlatform.isDarwin (darwinMinVersionHook "13.3");

  dependencies = [
    numpy
    cffi
    fenics-basix
    fenics-ffcx
    fenics-ufl
    petsc4py
    fenicsPackages.slepc
    fenicsPackages.adios2
    fenicsPackages.kahip
    (mpi4py.override { inherit (fenicsPackages) mpi; })
  ];

  nativeCheckInputs = [
    scipy
    matplotlib
    pytestCheckHook
    writableTmpDirAsHomeHook
    mpiCheckPhaseHook
  ];

  preCheck = ''
    cd test
  '';

  pythonImportsCheck = [
    "dolfinx"
  ];

  passthru = {
    tests = {
      complex = fenics-dolfinx.override {
        petsc4py = petsc4py.override { scalarType = "complex"; };
      };
    }
    // lib.optionalAttrs stdenv.hostPlatform.isLinux {
      mpich = fenics-dolfinx.override {
        petsc4py = petsc4py.override { mpi = mpich; };
      };
    };
  };

  meta = {
    homepage = "https://fenicsproject.org";
    downloadPage = "https://github.com/fenics/dolfinx";
    description = "Computational environment of FEniCSx and implements the FEniCS Problem Solving Environment in C++ and Python";
    changelog = "https://github.com/fenics/dolfinx/releases/tag/v${finalAttrs.version}";
    license = with lib.licenses; [
      bsd2
      lgpl3Plus
    ];
    platforms = lib.platforms.unix;
    maintainers = with lib.maintainers; [ qbisi ];
  };
})