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
|
{ stdenv
, lib
, fetchFromGitHub
, cmake
, pkg-config
, mpi
, mpiCheckPhaseHook
, openssh
, gfortran
, blas
, lapack
, gsl
, libxc
, hdf5
, spglib
, spfft
, spla
, costa
, scalapack
, boost
, eigen
, libvdwxc
, llvmPackages
, cudaPackages
, rocmPackages
, config
, gpuBackend ? (
if config.cudaSupport
then "cuda"
else if config.rocmSupport
then "rocm"
else "none"
)
}:
assert builtins.elem gpuBackend [ "none" "cuda" "rocm" ];
stdenv.mkDerivation rec {
pname = "SIRIUS";
version = "7.4.3";
src = fetchFromGitHub {
owner = "electronic-structure";
repo = pname;
rev = "v${version}";
hash = "sha256-s4rO+dePvtvn41wxCvbqgQGrEckWmfng7sPX2M8OPB0=";
};
postPatch = ''
substituteInPlace src/gpu/acc_blas_api.hpp \
--replace '#include <rocblas.h>' '#include <rocblas/rocblas.h>'
'';
nativeBuildInputs = [
cmake
gfortran
pkg-config
] ++ lib.optional (gpuBackend == "cuda") cudaPackages.cuda_nvcc;
buildInputs = [
blas
lapack
gsl
libxc
hdf5
spglib
spfft
spla
costa
scalapack
boost
eigen
libvdwxc
]
++ lib.optionals (gpuBackend == "cuda") [
cudaPackages.cuda_cudart
cudaPackages.cuda_profiler_api
cudaPackages.cudatoolkit
cudaPackages.libcublas
] ++ lib.optionals (gpuBackend == "rocm") [
rocmPackages.clr
rocmPackages.rocblas
] ++ lib.optional stdenv.isDarwin llvmPackages.openmp
;
propagatedBuildInputs = [ mpi ];
CXXFLAGS = [
# GCC 13: error: 'uintptr_t' in namespace 'std' does not name a type
"-include cstdint"
];
cmakeFlags = [
"-DUSE_SCALAPACK=ON"
"-DBUILD_TESTING=ON"
"-DUSE_VDWXC=ON"
"-DCREATE_FORTRAN_BINDINGS=ON"
"-DUSE_OPENMP=ON"
"-DBUILD_TESTING=ON"
]
++ lib.optionals (gpuBackend == "cuda") [
"-DUSE_CUDA=ON"
"-DCUDA_TOOLKIT_ROOT_DIR=${cudaPackages.cudatoolkit}"
]
++ lib.optionals (gpuBackend == "rocm") [
"-DUSE_ROCM=ON"
"-DHIP_ROOT_DIR=${rocmPackages.clr}"
];
doCheck = true;
# Can not run parallel checks generally as it requires exactly multiples of 4 MPI ranks
checkPhase = ''
runHook preCheck
ctest --output-on-failure --label-exclude integration_test
ctest --output-on-failure -L cpu_serial
runHook postCheck
'';
nativeCheckInputs = [
mpiCheckPhaseHook
openssh
];
meta = with lib; {
description = "Domain specific library for electronic structure calculations";
homepage = "https://github.com/electronic-structure/SIRIUS";
license = licenses.bsd2;
platforms = platforms.linux;
maintainers = [ maintainers.sheepforce ];
};
}
|