-
Notifications
You must be signed in to change notification settings - Fork 161
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
338d484
commit 8d228b8
Showing
2 changed files
with
178 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
# DockerFile for an environment into which firedrake can be installed. | ||
|
||
FROM ubuntu:24.04 | ||
|
||
# Update and install required packages for Firedrake | ||
USER root | ||
SHELL ["/bin/bash", "-o", "pipefail", "-c"] | ||
RUN apt-get update \ | ||
&& apt-get -y dist-upgrade \ | ||
&& DEBIAN_FRONTEND=noninteractive apt-get -y install tzdata \ | ||
&& apt-get -y install curl vim docker.io \ | ||
openssh-client build-essential autoconf automake \ | ||
cmake gfortran git libopenblas-serial-dev \ | ||
libtool python3-dev python3-pip python3-tk python3-venv \ | ||
python3-requests zlib1g-dev libboost-dev sudo gmsh \ | ||
bison flex ninja-build \ | ||
libocct-ocaf-dev libocct-data-exchange-dev \ | ||
swig graphviz \ | ||
libcurl4-openssl-dev libxml2-dev \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# Use a more sane locale | ||
ENV LC_ALL C.UTF-8 | ||
|
||
# Change the `ubuntu` user to `firedrake` | ||
# and ensure that we do not run as root on self-hosted systems | ||
RUN usermod -d /home/firedrake -m ubuntu && \ | ||
usermod -l firedrake ubuntu && \ | ||
groupmod -n firedrake ubuntu && \ | ||
usermod -aG sudo firedrake && \ | ||
echo "firedrake:docker" | chpasswd && \ | ||
echo "firedrake ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \ | ||
ldconfig | ||
|
||
USER firedrake | ||
WORKDIR /home/firedrake | ||
|
||
# Fetch PETSc, SLEPc and eigen | ||
RUN git clone https://github.com/firedrakeproject/petsc.git | ||
RUN git clone https://github.com/firedrakeproject/slepc.git | ||
|
||
# Build MPICH manually because we don't want PETSc to build it twice | ||
RUN bash -c 'cd petsc; \ | ||
./configure \ | ||
--with-64-bit-indices=1 \ | ||
--COPTFLAGS=-O3 -march=native -mtune=native \ | ||
--CXXOPTFLAGS=-O3 -march=native -mtune=native \ | ||
--FOPTFLAGS=-O3 -march=native -mtune=native \ | ||
--with-c2html=0 \ | ||
--with-debugging=0 \ | ||
--with-fortran-bindings=0 \ | ||
--with-make-np=12 \ | ||
--with-shared-libraries=1 \ | ||
--with-zlib \ | ||
--download-fftw \ | ||
--download-hdf5 \ | ||
--download-hwloc \ | ||
--download-hypre \ | ||
--download-metis \ | ||
--download-mumps \ | ||
--download-mpich \ | ||
--download-mpich-device=ch3:sock \ | ||
--download-netcdf \ | ||
--download-pastix \ | ||
--download-pnetcdf \ | ||
--download-ptscotch \ | ||
--download-scalapack \ | ||
--download-suitesparse \ | ||
--download-superlu_dist \ | ||
PETSC_ARCH=packages; \ | ||
mv packages/include/petscconf.h packages/include/old_petscconf.nope;' | ||
# Don't run make here, we only want MPICH and HWLOC | ||
# It is also necessary to move `petscconf.h` so packages isn't treated like a working PETSc | ||
|
||
# Build default Firedrake PETSc | ||
RUN bash -c 'export PACKAGES=/home/firedrake/petsc/packages; \ | ||
cd petsc; \ | ||
./configure \ | ||
--with-64-bit-indices=1 \ | ||
--COPTFLAGS=-O3 -march=native -mtune=native \ | ||
--CXXOPTFLAGS=-O3 -march=native -mtune=native \ | ||
--FOPTFLAGS=-O3 -march=native -mtune=native \ | ||
--with-c2html=0 \ | ||
--with-debugging=0 \ | ||
--with-fortran-bindings=0 \ | ||
--with-make-np=12 \ | ||
--with-shared-libraries=1 \ | ||
--with-bison \ | ||
--with-flex \ | ||
--with-zlib \ | ||
--with-fftw-dir=$PACKAGES \ | ||
--with-hdf5-dir=$PACKAGES \ | ||
--with-hwloc-dir=$PACKAGES \ | ||
--with-hypre-dir=$PACKAGES \ | ||
--with-metis-dir=$PACKAGES \ | ||
--with-mpi-dir=$PACKAGES \ | ||
--with-mumps-dir=$PACKAGES \ | ||
--with-netcdf-dir=$PACKAGES \ | ||
--with-pastix-dir=$PACKAGES \ | ||
--with-pnetcdf-dir=$PACKAGES \ | ||
--with-ptscotch-dir=$PACKAGES \ | ||
--with-scalapack-dir=$PACKAGES \ | ||
--with-suitesparse-dir=$PACKAGES \ | ||
--with-superlu_dist-dir=$PACKAGES \ | ||
PETSC_ARCH=default; \ | ||
make PETSC_DIR=/home/firedrake/petsc PETSC_ARCH=default all;' | ||
|
||
# Build default Firedrake SLEPc | ||
RUN bash -c 'export PETSC_DIR=/home/firedrake/petsc; \ | ||
export PETSC_ARCH=default; \ | ||
cd slepc; \ | ||
./configure; \ | ||
make SLEPC_DIR=/home/firedrake/slepc PETSC_DIR=/home/firedrake/petsc PETSC_ARCH=default;' | ||
|
||
# Additionally build complex PETSc for Firedrake | ||
RUN bash -c 'export PACKAGES=/home/firedrake/petsc/packages; \ | ||
cd petsc; \ | ||
./configure \ | ||
--with-64-bit-indices=1 \ | ||
--COPTFLAGS=-O3 -march=native -mtune=native \ | ||
--CXXOPTFLAGS=-O3 -march=native -mtune=native \ | ||
--FOPTFLAGS=-O3 -march=native -mtune=native \ | ||
--with-c2html=0 \ | ||
--with-debugging=0 \ | ||
--with-fortran-bindings=0 \ | ||
--with-make-np=12 \ | ||
--with-scalar-type=complex \ | ||
--with-shared-libraries=1 \ | ||
--with-bison \ | ||
--with-flex \ | ||
--with-zlib \ | ||
--with-fftw-dir=$PACKAGES \ | ||
--with-hdf5-dir=$PACKAGES \ | ||
--with-hwloc-dir=$PACKAGES \ | ||
--with-metis-dir=$PACKAGES \ | ||
--with-mpi-dir=$PACKAGES \ | ||
--with-mumps-dir=$PACKAGES \ | ||
--with-netcdf-dir=$PACKAGES \ | ||
--with-pastix-dir=$PACKAGES \ | ||
--with-pnetcdf-dir=$PACKAGES \ | ||
--with-ptscotch-dir=$PACKAGES \ | ||
--with-scalapack-dir=$PACKAGES \ | ||
--with-suitesparse-dir=$PACKAGES \ | ||
--with-superlu_dist-dir=$PACKAGES \ | ||
PETSC_ARCH=complex; \ | ||
make PETSC_DIR=/home/firedrake/petsc PETSC_ARCH=complex all;' | ||
|
||
# Build complex Firedrake SLEPc | ||
RUN bash -c 'export PETSC_DIR=/home/firedrake/petsc; \ | ||
export PETSC_ARCH=complex; \ | ||
cd slepc; \ | ||
./configure; \ | ||
make SLEPC_DIR=/home/firedrake/slepc PETSC_DIR=/home/firedrake/petsc PETSC_ARCH=complex;' | ||
|
||
# Clean up unnecessary files | ||
RUN rm -rf /home/firedrake/petsc/**/externalpackages \ | ||
&& rm -rf /home/firedrake/petsc/src/docs \ | ||
&& rm -f /home/firedrake/petsc/src/**/tutorials/output/* \ | ||
&& rm -f /home/firedrake/petsc/src/**/tests/output/* | ||
|
||
# Set some useful environment variables | ||
ENV PETSC_DIR /home/firedrake/petsc | ||
ENV SLEPC_DIR /home/firedrake/slepc | ||
ENV MPICH_DIR /home/firedrake/petsc/packages/bin | ||
ENV HDF5_DIR /home/firedrake/petsc/packages | ||
ENV HDF5_MPI ON | ||
ENV OMP_NUM_THREADS 1 | ||
ENV OPENBLAS_NUM_THREADS 1 |