CarpetX: a Cactus driver for the Einstein Toolkit based on AMReX
# How to build this Docker image:
#     docker build . --tag eschnett/cactus-amrex
#     docker push eschnett/cactus-amrex

# Use Ubuntu
FROM ubuntu:19.10

RUN mkdir /cactus
WORKDIR /cactus

# Install system packages
RUN apt-get update && \
    apt-get --yes --no-install-recommends install \
        build-essential \
        ca-certificates \
        clang-7 \
        flang-7 \
        git \
        libgsl-dev \
        libhwloc-dev \
        libmpich-dev \
        perl \
        pkg-config \
        python \
        python3 \
        rsync \
        subversion \
        wget \
        zlib1g-dev \
        && \
    rm -rf /var/lib/apt/lists/*

# Install cmake
# (AMReX 20.01 requires at least cmake 3.14)
RUN mkdir dist && \
    ( cd dist && \
    wget https://github.com/Kitware/CMake/releases/download/v3.16.2/cmake-3.16.2-Linux-x86_64.tar.gz && \
    tar xzf cmake-3.16.2-Linux-x86_64.tar.gz -C /usr/local --strip-components=1 && \
    true ) && \
    rm -rf dist

# Install NSIMD
# Note: This assumes that the system has x86_64 CPUs with AVX2 and FMA
RUN mkdir src && \
    ( cd src && \
    git clone -b eschnett/storeu_masked https://github.com/eschnett/nsimd.git && \
    cd nsimd && \
    python3 egg/hatch.py --all --force --disable-clang-format && \
    mkdir build && \
    cd build && \
    cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER=clang-7 -DCMAKE_CXX_COMPILER=clang++-7 -DSIMD=AVX2 -DSIMD_OPTIONALS=FMA -DCMAKE_INSTALL_PREFIX=/cactus/nsimd .. && \
    make -j$(nproc) && \
    make -j$(nproc) install && \
    true ) && \
    rm -rf src

# Install AMReX
RUN mkdir src && \
    ( cd src && \
    wget https://github.com/AMReX-Codes/amrex/archive/20.01.tar.gz && \
    tar xzf 20.01.tar.gz && \
    cd amrex-20.01 && \
    mkdir build && \
    cd build && \
    cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang-7 -DCMAKE_CXX_COMPILER=clang++-7 -DCMAKE_Fortran_COMPILER=flang-7 -DENABLE_PARTICLES=ON -DENABLE_ASSERTIONS=ON -DENABLE_BACKTRACE=ON -DENABLE_OMP=OFF -DCMAKE_INSTALL_PREFIX=/cactus/amrex .. && \
    make -j$(nproc) && \
    make -j$(nproc) install && \
    true ) && \
    rm -rf src

# As documentation
COPY Dockerfile /Dockerfile