Implement equal/close checkers for integers/reals (#20) #298
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
name: ci | |
on: | |
push: | |
branches: [main] | |
pull_request: | |
branches: [main] | |
workflow_dispatch: | |
jobs: | |
# | |
# Build and test Fortuno in various system configurations | |
# | |
build-and-test: | |
runs-on: ${{ matrix.os }} | |
env: | |
BUILD_DIR: _build | |
INSTALL_DIR: _install | |
FPM_EXPORT_DIR: _fpm_export | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-24.04 | |
compiler: gnu | |
mpi: nompi | |
interface: serial | |
- os: ubuntu-24.04 | |
compiler: gnu | |
mpi: mpich | |
interface: mpi | |
- os: ubuntu-24.04 | |
compiler: gnu | |
mpi: openmpi | |
interface: mpi | |
- os: ubuntu-24.04 | |
compiler: intel | |
mpi: nompi | |
interface: serial | |
- os: ubuntu-24.04 | |
compiler: intel | |
mpi: impi | |
interface: mpi | |
- os: ubuntu-24.04 | |
compiler: intel | |
mpi: nompi | |
interface: coarray | |
- os: macos-latest | |
compiler: gnu | |
mpi: nompi | |
interface: serial | |
# MPICH on MacOS seems to lack mpi_f08 interface | |
# - os: macos-latest | |
# compiler: gnu | |
# mpi: mpich | |
# interface: mpi | |
- os: macos-latest | |
compiler: gnu | |
mpi: openmpi | |
interface: mpi | |
steps: | |
- name: Check-out code | |
uses: actions/checkout@v4 | |
- name: Setup Intel compiler | |
if: ${{ contains(matrix.compiler, 'intel') }} | |
uses: rscohn2/setup-oneapi@v0 | |
with: | |
# Restricting to 2024 as fpm fails to build MPI-programs with oneAPI 2025.0 | |
components: | | |
[email protected] | |
[email protected] | |
[email protected] | |
- name: Setup Intel environment | |
if: ${{ contains(matrix.compiler, 'intel') }} | |
run: | | |
source /opt/intel/oneapi/setvars.sh | |
printenv >> ${GITHUB_ENV} | |
echo "FC=ifx" >> ${GITHUB_ENV} | |
echo "FPM_FC=ifx" >> ${GITHUB_ENV} | |
# Overriding default FPM_FFLAGS as default setting contains '-standard-semantics' | |
# which is incompatible with intel MPI. | |
echo "FPM_FFLAGS='-warn all -check all,nouninit -error-limit 1 -O0 -g -stand f18 -traceback'" >> ${GITHUB_ENV} | |
- name: Setup GNU compiler | |
if: ${{ contains(matrix.compiler, 'gnu') }} | |
uses: fortran-lang/setup-fortran@v1 | |
with: | |
compiler: gcc | |
version: 13 | |
- name: Setup GNU environment | |
if: ${{ contains(matrix.compiler, 'gnu') }} | |
run: | | |
echo "FC=${{ env.FC }}" >> ${GITHUB_ENV} | |
echo "FPM_FC=${{ env.FC }}" >> ${GITHUB_ENV} | |
if [[ ${{ matrix.interface }} == serial ]] && [[ ${{ matrix.os }} == ubuntu-* ]]; then | |
echo "FFLAGS=-ffree-line-length-none -Og -fsanitize=address" >> ${GITHUB_ENV} | |
echo "LDFLAGS=-fsanitize=address" >> ${GITHUB_ENV} | |
else | |
echo "FFLAGS=-ffree-line-length-none" >> ${GITHUB_ENV} | |
fi | |
echo "FPM_FFLAGS=-ffree-line-length-none" >> ${GITHUB_ENV} | |
- name: Setup MPICH on Ubuntu | |
if: ${{ contains(matrix.os, 'ubuntu') && contains(matrix.mpi, 'mpich') }} | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y mpich | |
- name: Setup OpenMPI on Ubuntu | |
if: ${{ contains(matrix.os, 'ubuntu') && contains(matrix.mpi, 'openmpi') }} | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y openmpi-common openmpi-bin libopenmpi-dev | |
echo "FC=mpifort" >> ${GITHUB_ENV} | |
echo "MPI_OPTIONS=--oversubscribe" >> ${GITHUB_ENV} | |
- name: Setup MPICH on MacOS | |
if: ${{ contains(matrix.os, 'macos') && contains(matrix.mpi, 'mpich') }} | |
run: | | |
brew install mpich | |
- name: Setup OpenMPI on MacOS | |
if: ${{ contains(matrix.os, 'macos') && contains(matrix.mpi, 'openmpi') }} | |
run: | | |
brew install openmpi | |
echo "MPI_OPTIONS=--oversubscribe" >> ${GITHUB_ENV} | |
- name: Setup serial interface options | |
if: ${{ contains(matrix.interface, 'serial') }} | |
run: | | |
echo "CMAKE_OPTIONS=-DFORTUNO_WITH_SERIAL=ON" >> ${GITHUB_ENV} | |
echo "MESON_OPTIONS_NOFALLBACK=" >> ${GITHUB_ENV} | |
echo "MESON_OPTIONS_FALLBACK=-Dfortuno:with_serial=true" >> ${GITHUB_ENV} | |
echo "INTERFACE=serial" >> ${GITHUB_ENV} | |
echo "RUN_PREFIX=" >> ${GITHUB_ENV} | |
- name: Setup mpi interface options | |
if: ${{ contains(matrix.interface, 'mpi') }} | |
run: | | |
echo "CMAKE_OPTIONS=-DFORTUNO_WITH_MPI=ON" >> ${GITHUB_ENV} | |
echo "MESON_OPTIONS_NOFALLBACK=" >> ${GITHUB_ENV} | |
echo "MESON_OPTIONS_FALLBACK=-Dfortuno:with_mpi=true" >> ${GITHUB_ENV} | |
echo "INTERFACE=mpi" >> ${GITHUB_ENV} | |
echo "RUN_PREFIX=mpirun -n 2 ${MPI_OPTIONS}" >> ${GITHUB_ENV} | |
- name: Setup coarray interface options | |
if: ${{ contains(matrix.interface, 'coarray') }} | |
run: | | |
echo "CMAKE_OPTIONS=-DFORTUNO_WITH_COARRAY=ON -DFORTUNO_FFLAGS_COARRAY='-coarray' -DFORTUNO_LDFLAGS_COARRAY='-coarray'" >> ${GITHUB_ENV} | |
echo "MESON_OPTIONS_NOFALLBACK=-Dfflags_coarray=-coarray -Dldflags_coarray=-coarray" >> ${GITHUB_ENV} | |
echo "MESON_OPTIONS_FALLBACK=-Dfflags_coarray=-coarray -Dldflags_coarray=-coarray -Dfortuno:with_coarray=true -Dfortuno:fflags_coarray=-coarray -Dfortuno:ldflags_coarray=-coarray" >> ${GITHUB_ENV} | |
echo "FPM_FFLAGS=${FPM_FFLAGS} -coarray" >> ${GITHUB_ENV} | |
echo "FPM_LDFLAGS=${FPM_LDFLAGS} -coarray" >> ${GITHUB_ENV} | |
echo "INTERFACE=coarray" >> ${GITHUB_ENV} | |
echo "RUN_PREFIX=" >> ${GITHUB_ENV} | |
- name: Setup build tools | |
run: | | |
pip install cmake fpm meson ninja fypp | |
- name: Build Fortuno | |
run: | | |
cmake ${CMAKE_OPTIONS} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -B ${BUILD_DIR} -G Ninja | |
cmake --build ${BUILD_DIR} --verbose | |
cmake --install ${BUILD_DIR} --verbose | |
ctest --test-dir ${BUILD_DIR} --verbose | |
rm -rf ${BUILD_DIR} | |
- name: Test CMake export | |
run: | | |
CMAKE_PREFIX_PATH=${INSTALL_DIR} cmake -B ${BUILD_DIR} -G Ninja test/export/${INTERFACE} | |
cmake --build ${BUILD_DIR} | |
${RUN_PREFIX} ${BUILD_DIR}/app/testapp | |
${RUN_PREFIX} ${BUILD_DIR}/app/testapp_fpp | |
${RUN_PREFIX} ${BUILD_DIR}/app/testapp_fypp | |
rm -rf ${BUILD_DIR} | |
- name: Test fpm export | |
run: | | |
./devel/fpm-repo/export-fpm-repo.sh ${INTERFACE} ${FPM_EXPORT_DIR} | |
fpm run -C ${FPM_EXPORT_DIR}/test/export/${INTERFACE} --runner "${RUN_PREFIX}" testapp testapp_fpp | |
rm -rf ${FPM_EXPORT_DIR} | |
- name: Test Meson pkgconfig export | |
# Meson only detects OpenMPI reliably (as of version 1.5.2) | |
if: ${{ !contains(matrix.interface, 'mpi') || contains(matrix.mpi, 'openmpi') }} | |
run: | | |
export PKG_CONFIG_PATH="${PWD}/${INSTALL_DIR}/lib/pkgconfig:${PKG_CONFIG_PATH}" | |
cd test/export/${INTERFACE} | |
meson setup ${MESON_OPTIONS_NOFALLBACK} --wrap-mode nofallback ${BUILD_DIR} | |
ninja -j1 -v -C ${BUILD_DIR} | |
${RUN_PREFIX} ${BUILD_DIR}/testapp | |
${RUN_PREFIX} ${BUILD_DIR}/testapp_fpp | |
rm -rf ./${BUILD_DIR} | |
- name: Test Meson subproject export | |
# Meson only detects OpenMPI reliably (as of version 1.5.2) | |
if: ${{ !contains(matrix.interface, 'mpi') || contains(matrix.mpi, 'openmpi') }} | |
run: | | |
FORTUNO_DIR=${PWD} | |
GIT_REV=$(git rev-parse HEAD) | |
cd test/export/${INTERFACE} | |
mkdir subprojects | |
echo -e "[wrap-git]\ndirectory=fortuno\n" > subprojects/fortuno.wrap | |
echo -e "url=file://${FORTUNO_DIR}\nrevision=${GIT_REV}\n" >> subprojects/fortuno.wrap | |
meson setup ${MESON_OPTIONS_FALLBACK} --wrap-mode forcefallback ${BUILD_DIR} | |
ninja -j1 -v -C ${BUILD_DIR} | |
${RUN_PREFIX} ${BUILD_DIR}/testapp | |
${RUN_PREFIX} ${BUILD_DIR}/testapp_fpp | |
rm -rf subprojects ${BUILD_DIR} | |
deploy-fpm-repos: | |
needs: build-and-test | |
if: github.repository == 'fortuno-repos/fortuno' && github.event_name == 'push' && github.ref == 'refs/heads/main' | |
runs-on: ubuntu-24.04 | |
env: | |
DEPLOYMENT_KEY_PREFIX: DEPLOY_KEY | |
DEPLOYMENT_TARGET_REPO_PREFIX: fortuno-fpm | |
steps: | |
- name: Check-out code | |
uses: actions/checkout@v4 | |
- name: Export serial repository content | |
run: ./devel/fpm-repo/export-fpm-repo.sh serial _fpm_serial | |
- name: Push to serial repository | |
uses: cpina/github-action-push-to-another-repository@main | |
env: | |
SSH_DEPLOY_KEY: ${{ secrets[format('{0}_FORTUNO_FPM_SERIAL', env.DEPLOYMENT_KEY_PREFIX)] }} | |
with: | |
source-directory: _fpm_serial | |
destination-github-username: fortuno-repos | |
destination-repository-name: ${{ format('{0}-serial', env.DEPLOYMENT_TARGET_REPO_PREFIX) }} | |
user-email: [email protected] | |
target-branch: main | |
- name: Export mpi repository content | |
run: ./devel/fpm-repo/export-fpm-repo.sh mpi _fpm_mpi | |
- name: Push to mpi repository | |
uses: cpina/github-action-push-to-another-repository@main | |
env: | |
SSH_DEPLOY_KEY: ${{ secrets[format('{0}_FORTUNO_FPM_MPI', env.DEPLOYMENT_KEY_PREFIX)] }} | |
with: | |
source-directory: _fpm_mpi | |
destination-github-username: fortuno-repos | |
destination-repository-name: ${{ format('{0}-mpi', env.DEPLOYMENT_TARGET_REPO_PREFIX) }} | |
user-email: [email protected] | |
target-branch: main | |
- name: Export coarray repository content | |
run: ./devel/fpm-repo/export-fpm-repo.sh coarray _fpm_coarray | |
- name: Push to coarray repository | |
uses: cpina/github-action-push-to-another-repository@main | |
env: | |
SSH_DEPLOY_KEY: ${{ secrets[format('{0}_FORTUNO_FPM_COARRAY', env.DEPLOYMENT_KEY_PREFIX)] }} | |
with: | |
source-directory: _fpm_coarray | |
destination-github-username: fortuno-repos | |
destination-repository-name: ${{ format('{0}-coarray', env.DEPLOYMENT_TARGET_REPO_PREFIX) }} | |
user-email: [email protected] | |
target-branch: main |