Matrix-Free Linear Operator #29
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 workflow will install Python dependencies and run tests with a variety of Python versions | |
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions | |
name: Run tests | |
on: | |
push: | |
branches: [ devel ] | |
pull_request: | |
branches: [ devel ] | |
jobs: | |
test: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ ubuntu-latest ] | |
python-version: [ 3.8, 3.9, '3.10', '3.11' ] | |
isMerge: | |
- ${{ github.event_name == 'push' && github.ref == 'refs/heads/devel' }} | |
exclude: | |
- { isMerge: false, python-version: 3.9 } | |
- { isMerge: false, python-version: '3.10' } | |
include: | |
- os: macos-latest | |
python-version: '3.10' | |
name: ${{ matrix.os }} / Python ${{ matrix.python-version }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Set up Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Install non-Python dependencies on Ubuntu | |
if: matrix.os == 'ubuntu-latest' | |
run: | | |
sudo apt-get update | |
sudo apt-get install gfortran | |
sudo apt-get install openmpi-bin libopenmpi-dev | |
sudo apt-get install libhdf5-openmpi-dev | |
- name: Install non-Python dependencies on macOS | |
if: matrix.os == 'macos-latest' | |
run: | | |
brew install open-mpi | |
brew install hdf5-mpi | |
brew install libomp | |
GFORTRAN_HOME=$(which gfortran || true) | |
echo "GFORTRAN_HOME : $GFORTRAN_HOME" | |
if [[ ! -f "$GFORTRAN_HOME" ]]; then | |
gfort=$(find ${PATH//:/\/ } -name 'gfortran-*' -exec basename {} \; | sort | tail -n 1 || true) | |
echo "Found $gfort" | |
gfort_path=$(which ${gfort}) | |
folder=$(dirname ${gfort_path}) | |
ln -s ${gfort_path} ${folder}/gfortran | |
fi | |
echo "MPI_OPTS=--oversubscribe" >> $GITHUB_ENV | |
- name: Print information on MPI and HDF5 libraries | |
run: | | |
ompi_info | |
h5pcc -showconfig -echo || true | |
- name: Upgrade pip | |
run: | | |
python -m pip install --upgrade pip | |
# - name: Get pip cache dir | |
# id: pip-cache-dir | |
# run: | | |
# echo "::set-output name=dir::$(python -m pip cache dir)" | |
# | |
# - name: pip cache | |
# uses: actions/cache@v2 | |
# id: pip-cache | |
# with: | |
# path: ${{ steps.pip-cache-dir.outputs.dir }} | |
# key: ${{ matrix.os }}-${{ matrix.python-version }}-pip-${{ hashFiles('**/requirements.txt') }} | |
# restore-keys: | | |
# ${{ matrix.os }}-${{ matrix.python-version }}-pip- | |
- name: Determine directory of parallel HDF5 library | |
run: | | |
if [[ "${{ matrix.os }}" == "ubuntu-latest" ]]; then | |
HDF5_DIR=$(dpkg -L libhdf5-openmpi-dev | grep libhdf5.so | xargs dirname) | |
elif [[ "${{ matrix.os }}" == "macos-latest" ]]; then | |
HDF5_DIR=$(brew list hdf5-mpi | grep "libhdf5.dylib" | xargs dirname | xargs dirname) | |
fi | |
echo $HDF5_DIR | |
echo "HDF5_DIR=$HDF5_DIR" >> $GITHUB_ENV | |
- name: Download a specific release of PETSc | |
run: | | |
git clone --depth 1 --branch v3.20.5 https://gitlab.com/petsc/petsc.git | |
- name: Install PETSc with complex support, and test it | |
working-directory: ./petsc | |
run: | | |
export PETSC_DIR=$(pwd) | |
export PETSC_ARCH=petsc-cmplx | |
./configure --with-scalar-type=complex --with-fortran-bindings=0 --have-numpy=1 | |
make all check | |
echo "PETSC_DIR=$PETSC_DIR" >> $GITHUB_ENV | |
echo "PETSC_ARCH=$PETSC_ARCH" >> $GITHUB_ENV | |
- name: Install petsc4py | |
working-directory: ./petsc | |
run: | | |
python -m pip install wheel Cython numpy | |
python -m pip install src/binding/petsc4py | |
- name: Install Python dependencies | |
run: | | |
export CC="mpicc" HDF5_MPI="ON" | |
python -m pip install -r requirements.txt | |
python -m pip install -r requirements_extra.txt --no-build-isolation | |
python -m pip list | |
- name: Check h5py installation | |
run: | | |
python -c "from h5py import File; print(File)" | |
- name: Install project | |
run: | | |
python -m pip install . | |
python -m pip freeze | |
- name: Initialize test directory | |
run: | | |
mkdir pytest | |
cp mpi_tester.py pytest | |
- name: Run single-process tests with Pytest | |
working-directory: ./pytest | |
run: | | |
export PSYDAC_MESH_DIR=$GITHUB_WORKSPACE/mesh | |
export OMP_NUM_THREADS=2 | |
python -m pytest -n auto --pyargs psydac -m "not parallel and not petsc" | |
- name: Run MPI tests with Pytest | |
working-directory: ./pytest | |
run: | | |
export PSYDAC_MESH_DIR=$GITHUB_WORKSPACE/mesh | |
export OMP_NUM_THREADS=2 | |
python mpi_tester.py --mpirun="mpiexec -n 4 ${MPI_OPTS}" --pyargs psydac -m "parallel and not petsc" | |
- name: Run single-process PETSc tests with Pytest | |
working-directory: ./pytest | |
run: | | |
export PSYDAC_MESH_DIR=$GITHUB_WORKSPACE/mesh | |
export OMP_NUM_THREADS=2 | |
python -m pytest -n auto --pyargs psydac -m "not parallel and petsc" | |
- name: Run MPI PETSc tests with Pytest | |
working-directory: ./pytest | |
run: | | |
export PSYDAC_MESH_DIR=$GITHUB_WORKSPACE/mesh | |
export OMP_NUM_THREADS=2 | |
python mpi_tester.py --mpirun="mpiexec -n 4 ${MPI_OPTS}" --pyargs psydac -m "parallel and petsc" | |
- name: Remove test directory | |
if: ${{ always() }} | |
run: | | |
rm -rf pytest |