Skip to content
This repository was archived by the owner on Aug 28, 2024. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
Pulled down changes made on Linux machine
  • Loading branch information
daminton committed Aug 11, 2023
2 parents adbb88d + a5d044f commit 9b896b1
Show file tree
Hide file tree
Showing 11 changed files with 359 additions and 159 deletions.
21 changes: 21 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Ignore everything
*
# Whitelist what is necessary
!setup.py
!version.txt
!environment.yml
!pyproject.toml
!requirements.txt
!distclean.cmake
!cmake/Modules/*.cmake
!CMakeLists.txt
!src/CMakeLists.txt
!swiftest/CMakeLists.txt
!swiftest/tests/CMakeLists.txt
!swiftest/*.py
!swiftest/*.pyx
!swiftest/*.h
!swiftest/tests/*.py
!src/*/*.f90
!buildscripts/*.sh
!buildscripts/*.yml
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,13 @@ dump*
!singularity/
!Dockerfile
!environment.yml
!.dockerignore

bin/
build/*
hdf5-*
netcdf-c-*
netcdf-fortran-*
zlib-*


169 changes: 14 additions & 155 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,160 +13,19 @@
# dynamically.

# This build target compiles all dependencies and the swiftest driver itself
FROM intel/oneapi-hpckit:2023.1.0-devel-ubuntu20.04 as build_deps

ENV INSTALL_DIR="/usr/local"
ENV FC="${ONEAPI_ROOT}/mpi/latest/bin/mpiifort"
ENV CC="${ONEAPI_ROOT}/mpi/latest/bin/mpicc -cc=icx"
ENV CXX="${ONEAPI_ROOT}/mpi/latest/bin/mpicc -cc=icpx"
ENV F77="${FC}"
ENV CFLAGS="-fPIC"

# Get the HDF5, NetCDF-C, and NetCDF-Fortran libraries
RUN wget -qO- https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.14/hdf5-1.14.1/src/hdf5-1.14.1-2.tar.gz | tar xvz && \
wget -qO- https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.9.2.tar.gz | tar xvz && \
wget -qO- https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.6.1.tar.gz | tar xvz && \
wget -qO- https://www.zlib.net/zlib-1.2.13.tar.gz | tar xvz

RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
m4 && \
rm -rf /var/lib/apt/lists/*

RUN cd zlib-1.2.13 && \
./configure --prefix=${INSTALL_DIR} --static && \
make && \
make install

RUN cd hdf5-1.14.1-2 && \
./configure --disable-shared \
--enable-build-mode=production \
--disable-fortran \
--disable-java \
--disable-cxx \
--prefix=${INSTALL_DIR} \
--with-zlib=${INSTALL_DIR} && \
make && \
make install

RUN cd netcdf-c-4.9.2 && \
./configure --disable-shared \
--disable-dap \
--disable-libxml2 \
--disable-byterange \
--prefix=${INSTALL_DIR} && \
make && \
make install

ENV NCDIR="${INSTALL_DIR}"
ENV NFDIR="${INSTALL_DIR}"
ENV HDF5_ROOT="${INSTALL_DIR}"
ENV HDF5_LIBDIR="${HDF5_ROOT}/lib"
ENV HDF5_INCLUDE_DIR="${HDF5_ROOT}/include"
ENV HDF5_PLUGIN_PATH="${HDF5_LIBDIR}/plugin"

# NetCDF-Fortran library
ENV FCFLAGS="${CFLAGS} -standard-semantics"
ENV FFLAGS=${CFLAGS}
ENV CPPFLAGS="-I${INSTALL_DIR}/include"
ENV LIBS="-L/usr/local/lib -L/usr/lib/x86_64-linux-gnu -lnetcdf -lhdf5_hl -lhdf5 -lm -lz"
RUN cd netcdf-fortran-4.6.1 && \
./configure --disable-shared --prefix=${NFDIR} && \
make && \
make install

FROM intel/oneapi-hpckit:2023.1.0-devel-ubuntu20.04 as build_driver
SHELL ["/bin/bash", "-c"]

# The MACHINE_CODE_VALUE argument is a string that is used when compiling the swiftest_driver. It is appended to the "-x" compiler
# option: (-x${MACHINE_CODE_VALUE}). The default value is set to "sse2" which allows for certain SIMD instructions to be used while
# remaining # compatible with a wide range of CPUs. To get the highest performance, you can pass "host" as an argument, but the
# compiled binary # would only run on a CPU with an architecture compatible with the one that the build was performed on.
# For more details and other options, see:
# https://www.intel.com/content/www/us/en/docs/fortran-compiler/developer-guide-reference/2023-1/x-qx.html
ARG MACHINE_CODE_VALUE="sse2"

ARG BUILD_TYPE="RELEASE"

# Additional CMAKE options:
ARG EXTRA_CMAKE_OPTIONS=""

ENV INSTALL_DIR="/usr/local"
ENV NETCDF_HOME=${INSTALL_DIR}
ENV NETCDF_FORTRAN_HOME=${NETCDF_HOME}
ENV NETCDF_LIBRARY=${NETCDF_HOME}
ENV FOR_COARRAY_NUM_IMAGES=1
ENV OMP_NUM_THREADS=1
ENV FC="${ONEAPI_ROOT}/mpi/latest/bin/mpiifort"
ENV CC="${ONEAPI_ROOT}/mpi/latest/bin/mpicc"
ENV CXX="${ONEAPI_ROOT}/mpi/latest/bin/mpicxx"
ENV FFLAGS="-fPIC -standard-semantics"
ENV LDFLAGS="-L${INSTALL_DIR}/lib"
ENV LIBS="-lhdf5_hl -lhdf5 -lz"
ENV PATH /root/miniconda3/bin:$PATH

COPY --from=build_deps ${INSTALL_DIR}/. ${INSTALL_DIR}/

COPY ./environment.yml /swiftest/

RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-x86_64.sh && \
/bin/bash Miniconda3-py311_23.5.2-0-Linux-x86_64.sh -b && \
/root/miniconda3/bin/conda init bash && \
source /root/.bashrc && conda update --all -y && \
conda install conda-libmamba-solver -y && \
conda config --set solver libmamba && \
cd swiftest && \
conda env create -f environment.yml && \
conda init bash && \
echo "conda activate swiftest-env" >> ~/.bashrc && \
source ~/.bashrc && \
conda install -c conda-forge scikit-build -y&& \
conda install -c anaconda cython -y

COPY ./cmake/ /swiftest/cmake/
COPY ./src/ /swiftest/src/
COPY ./CMakeLists.txt /swiftest/
COPY ./swiftest/ /swiftest/swiftest/
COPY ./version.txt /swiftest/
COPY ./setup.py /swiftest/
COPY ./requirements.txt /swiftest/
COPY ./pyproject.toml /swiftest/

ENV CMAKE_ARGS="-DMACHINE_CODE_VALUE=${MACHINE_CODE_VALUE} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DBUILD_SHARED_LIBS=OFF ${EXTRA_CMAKE_OPTIONS}"

RUN cd swiftest && \
pip install . -v

# This build target creates a container that executes just the driver program
FROM ubuntu:20.04 as driver
COPY --from=build_driver /root/miniconda3/envs/swiftest-env/bin/swiftest_driver /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/swiftest_driver"]

# This build target exports the binary to the host
FROM scratch AS export_driver
COPY --from=driver /usr/local/bin/swiftest_driver /

# This build target creates a container with a conda environment with all dependencies needed to run the Python front end and
# analysis tools
FROM continuumio/miniconda3 as python
ARG BUILDIMAGE="intel/oneapi-hpckit:2023.1.0-devel-ubuntu20.04"
FROM ${BUILDIMAGE} as build-deps
ENV SCRIPT_DIR="buildscripts"
SHELL ["/bin/bash", "--login", "-c"]
ENV INSTALL_DIR="/usr/local"
ENV CONDA_DIR="/opt/conda"
ENV SHELL="/bin/bash"
ENV PATH="${CONDA_DIR}/bin:${PATH}"

COPY --from=build_driver /root/miniconda3/envs/swiftest-env/ ${CONDA_DIR}/envs/
RUN conda update --all -y && \
conda install conda-libmamba-solver -y && \
conda config --set solver libmamba && \
conda init bash && \
echo "conda activate swiftest-env" >> ~/.bashrc && \
conda clean --all -y && \
mkdir -p /.astropy && \
chmod -R 777 /.astropy && \
mkdir -p /.cache/matplotlib && \
mkdir -p /.config/matplotlib && \
chmod -R 777 /.cache/matplotlib && \
chmod -R 777 /.config/matplotlib

ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "swiftest-env"]
WORKDIR /swiftest
COPY . ./
RUN ${SCRIPT_DIR}/fetch_dependencies.sh
RUN if [ "$BUILDIMAGE" = "intel/oneapi-hpckit:2023.1.0-devel-ubuntu20.04" ]; then \
${SCRIPT_DIR}/build_dependencies.sh Intel; \
else \
${SCRIPT_DIR}/make_build_environment.sh && \
echo "conda activate swiftest-build-env" >> ~/.bashrc && \
/bin/bash -lic "${SCRIPT_DIR}/build_dependencies.sh GNU"; \
fi
RUN pip install .
2 changes: 2 additions & 0 deletions buildscripts/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
!*.sh
!*.yml
68 changes: 68 additions & 0 deletions buildscripts/build_all.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#!/bin/bash
# This script will determine the steps necessary to set up an appropriate build environment necessary to build Swiftest and all its
# dependencies. The steps that are executed depend on the combination of platform and architecture, as follows:
#
# Linux amd64/x86_64:
# Docker present: The build scripts will run inside a Docker container with Intel compilers (preferred).
# Docker not present: The build scripts will run inside a custom conda environment and build with Intel compilers if available,
# or GNU compiler compilers otherwise.
# Linux aarch64/arm64:
# Docker present: The build scripts will run inside a Docker container with GNU compilers
# Docker not present: The build scripts will run inside a custom conda environment with GNU compilers
# Mac OS (Darwin):
# The build scripts will run inside a custom conda environment with GNU compilers
#
# Copyright 2023 - David Minton
# This file is part of Swiftest.
# Swiftest is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
# Swiftest is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with Swiftest.
# If not, see: https://www.gnu.org/licenses.


# Determine the platform and architecture
SCRIPT_DIR=$(realpath $(dirname $0))
ROOT_DIR=$(realpath ${SCRIPT_DIR}/..)
BUILD_DIR=$(realpath ${ROOT_DIR}/build)
read -r OS ARCH < <($SCRIPT_DIR/get_platform.sh)

# Determine if we are in the correct directory (the script can either be run from the Swiftest project root directory or the
# buildscripts directory)
if [ ! -f "${ROOT_DIR}/setup.py" ]; then
echo "Error: setup.py not found"
exit 1
fi
cd ${ROOT_DIR}
VERSION=$( cat version.txt )
echo "Building Swiftest version ${VERSION} for ${OS}-${ARCH}"

case $OS in
Linux)
# Determine if Docker is available
if command -v docker &> /dev/null; then
echo "Docker detected"
if [ "$ARCH" = "x86_64" ]; then
BUILDIMAGE="intel/oneapi-hpckit:2023.1.0-devel-ubuntu20.04"
else
BUILDIMAGE="condaforge/mambaforge:23.1.0-4"
fi
cmd="docker build --tag swiftest:latest --tag swiftest:${VERSION} --build-arg BUILDIMAGE=\"${BUILDIMAGE}\" ."
echo "Executing Docker build:\n${cmd}"
eval "$cmd"
exit 0
else
echo "Docker not detected"
fi
;;
MacOSX)
;;
*)
echo "Swiftest is currently not configured to build for platform ${OS}-${ARCH}"
exit 1
;;
esac



105 changes: 105 additions & 0 deletions buildscripts/build_dependencies.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
#!/bin/bash
# This script will build all of the dependency libraries needed by Swiftest. Builds the following from source:
# Zlib, hdf5, netcdf-c, netcdf-fortran
#
# Copyright 2023 - David Minton
# This file is part of Swiftest.
# Swiftest is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
# Swiftest is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with Swiftest.
# If not, see: https://www.gnu.org/licenses.
SCRIPT_DIR=$(realpath $(dirname $0))
BUILD_DIR=$(realpath ${SCRIPT_DIR}/../build)
mkdir -p ${BUILD_DIR}
cd $BUILD_DIR

USTMT="Usage: $0 <{Intel}|GNU>"
if [[ ( $@ == "--help") || $@ == "-h" ]]; then
echo $USTMT
exit 0
fi
COMPILER=${1:-Intel}

case $COMPILER in
Intel)
if command -v ifx &> /dev/null; then
export FC=$(command -v ifx)
export CC=$(command -v icx)
export CXX=$(command -v icpx)
elif command -v ifort &> /dev/null; then
export FC=$(command -v ifort)
export CC=$(command -v icc)
export CXX=$(command -v icpc)
else
echo "Error. Cannot find valid Intel fortran compiler."
exit 1
fi
export F77="${FC}"
;;
GNU)
export FC=$(command -v gfortran)
export CC=$(command -v gcc)
export CXX=$(command -v g++)
;;
*)
echo "Unknown compiler type: ${COMPILER}"
echo $USTMT
exit 1
;;
esac
export F77=${FC}
echo "Using $COMPILER compilers:\nFC: $FC\nCC: $CC\nCXX: $CXX\n"

export INSTALL_DIR=${BUILD_DIR}
mkdir -p ${INSTALL_DIR}
export NCDIR="${INSTALL_DIR}"
export NFDIR="${INSTALL_DIR}"
export HDF5_ROOT="${INSTALL_DIR}"
export HDF5_LIBDIR="${HDF5_ROOT}/lib"
export HDF5_INCLUDE_DIR="${HDF5_ROOT}/include"
export HDF5_PLUGIN_PATH="${HDF5_LIBDIR}/plugin"

export LDFLAGS="-L${INSTALL_DIR}/lib"
export CPATH="${INSTALL_DIR}/include"
export CFLAGS="-fPIC"

cd zlib-1.2.13
./configure --prefix=${INSTALL_DIR} --static
make
make install
cd ../hdf5-1.14.1-2
./configure --disable-shared \
--enable-build-mode=production \
--disable-fortran \
--disable-java \
--disable-cxx \
--prefix=${INSTALL_DIR} \
--with-zlib=${INSTALL_DIR}
make
make install

cd ../netcdf-c-4.9.2
./configure --disable-shared \
--disable-dap \
--disable-byterange \
--prefix=${INSTALL_DIR}
make
make check
make install

if [ $COMPILER = "Intel" ]; then
export FCFLAGS="${CFLAGS} -standard-semantics"
export FFLAGS=${CFLAGS}
else
export FCFLAGS="${CFLAGS}"
export FFLAGS="${CFLAGS}"
fi

export LIBS="$(${INSTALL_DIR}/bin/nc-config --libs)"
cd ../netcdf-fortran-4.6.1
./configure --disable-shared --with-pic --prefix=${NFDIR}
make
make check
make install
Loading

0 comments on commit 9b896b1

Please sign in to comment.