152 lines
3.1 KiB
Nix
152 lines
3.1 KiB
Nix
{ stdenv
|
|
, lib
|
|
, buildPythonPackage
|
|
, fetchFromGitHub
|
|
, autoreconfHook
|
|
, pkg-config
|
|
, gfortran
|
|
, mpi
|
|
, blas
|
|
, lapack
|
|
, fftw
|
|
, hdf5-mpi
|
|
, swig
|
|
, gsl
|
|
, harminv
|
|
, libctl
|
|
, libGDSII
|
|
, openssh
|
|
, guile
|
|
, python
|
|
, numpy
|
|
, scipy
|
|
, matplotlib
|
|
, h5py-mpi
|
|
, cython
|
|
, autograd
|
|
, mpi4py
|
|
}:
|
|
|
|
assert !blas.isILP64;
|
|
assert !lapack.isILP64;
|
|
|
|
buildPythonPackage rec {
|
|
pname = "meep";
|
|
version = "1.25.0";
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "NanoComp";
|
|
repo = pname;
|
|
rev = "v${version}";
|
|
hash = "sha256-4rIz2RXLSWzZbRuv8d4nidOa0ULYc4QHIdaYrGu1WkI=";
|
|
};
|
|
|
|
format = "other";
|
|
|
|
# MPI is needed in nativeBuildInputs too, otherwise MPI libs will be missing
|
|
# at runtime
|
|
nativeBuildInputs = [
|
|
autoreconfHook
|
|
gfortran
|
|
pkg-config
|
|
swig
|
|
mpi
|
|
];
|
|
|
|
buildInputs = [
|
|
gsl
|
|
blas
|
|
lapack
|
|
fftw
|
|
hdf5-mpi
|
|
harminv
|
|
libctl
|
|
libGDSII
|
|
guile
|
|
gsl
|
|
];
|
|
|
|
propagatedBuildInputs = [
|
|
mpi
|
|
numpy
|
|
scipy
|
|
matplotlib
|
|
h5py-mpi
|
|
cython
|
|
autograd
|
|
mpi4py
|
|
];
|
|
|
|
propagatedUserEnvPkgs = [ mpi ];
|
|
|
|
dontUseSetuptoolsBuild = true;
|
|
dontUsePipInstall = true;
|
|
dontUseSetuptoolsCheck = true;
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
preConfigure = ''
|
|
export HDF5_MPI=ON
|
|
export PYTHON=${python}/bin/${python.executable};
|
|
'';
|
|
|
|
configureFlags = [
|
|
"--without-libctl"
|
|
"--enable-shared"
|
|
"--with-mpi"
|
|
"--with-openmp"
|
|
"--enable-maintainer-mode"
|
|
];
|
|
|
|
passthru = { inherit mpi; };
|
|
|
|
/*
|
|
This test is taken from the MEEP tutorial "Fields in a Waveguide" at
|
|
<https://meep.readthedocs.io/en/latest/Python_Tutorials/Basics/>.
|
|
It is important, that the test actually performs a calculation
|
|
(calls `sim.run()`), as only then MPI will be initialised and MPI linking
|
|
errors can be caught.
|
|
*/
|
|
doCheck = true;
|
|
checkPhase = ''
|
|
export PATH=$PATH:${openssh}/bin
|
|
export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
|
|
|
|
export OMP_NUM_THREADS=1
|
|
|
|
# Fix to make mpich run in a sandbox
|
|
export HYDRA_IFACE=lo
|
|
export OMPI_MCA_rmaps_base_oversubscribe=1
|
|
|
|
# Generate a python test script
|
|
cat > test.py << EOF
|
|
import meep as mp
|
|
cell = mp.Vector3(16,8,0)
|
|
geometry = [mp.Block(mp.Vector3(mp.inf,1,mp.inf),
|
|
center=mp.Vector3(),
|
|
material=mp.Medium(epsilon=12))]
|
|
sources = [mp.Source(mp.ContinuousSource(frequency=0.15),
|
|
component=mp.Ez,
|
|
center=mp.Vector3(-7,0))]
|
|
pml_layers = [mp.PML(1.0)]
|
|
resolution = 10
|
|
sim = mp.Simulation(cell_size=cell,
|
|
boundary_layers=pml_layers,
|
|
geometry=geometry,
|
|
sources=sources,
|
|
resolution=resolution)
|
|
sim.run(until=200)
|
|
EOF
|
|
|
|
${mpi}/bin/mpiexec -np 2 python3 test.py
|
|
'';
|
|
|
|
meta = with lib; {
|
|
description = "Free finite-difference time-domain (FDTD) software for electromagnetic simulations";
|
|
homepage = "https://meep.readthedocs.io/en/latest/";
|
|
license = licenses.gpl2Only;
|
|
platforms = platforms.linux;
|
|
maintainers = with maintainers; [ sheepforce markuskowa ];
|
|
};
|
|
}
|