Fix missing private clauses in 3D viscous GPU loops #5310
Workflow file for this run
This file contains hidden or 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: 'Test Suite' | |
| on: | |
| push: | |
| branches: [master] | |
| pull_request: | |
| types: [opened, synchronize, reopened, ready_for_review] | |
| workflow_dispatch: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| lint-gate: | |
| name: Lint Gate | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Clone | |
| uses: actions/checkout@v4 | |
| - name: Setup Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Initialize MFC | |
| run: ./mfc.sh init | |
| - name: Check Formatting | |
| run: | | |
| ./mfc.sh format -j "$(nproc)" | |
| git diff --exit-code || (echo "::error::Code is not formatted. Run './mfc.sh format' locally." && exit 1) | |
| - name: Spell Check | |
| run: ./mfc.sh spelling | |
| - name: Lint Toolchain | |
| run: ./mfc.sh lint | |
| - name: Lint Source - No Raw Directives | |
| run: | | |
| ! grep -iR '!\$acc\|!\$omp' --exclude="parallel_macros.fpp" --exclude="acc_macros.fpp" --exclude="omp_macros.fpp" --exclude="shared_parallel_macros.fpp" --exclude="syscheck.fpp" ./src/* | |
| - name: Lint Source - No Double Precision Intrinsics | |
| run: | | |
| ! grep -iR 'double_precision\|dsqrt\|dexp\|dlog\|dble\|dabs\|double\ precision\|real(8)\|real(4)\|dprod\|dmin\|dmax\|dfloat\|dreal\|dcos\|dsin\|dtan\|dsign\|dtanh\|dsinh\|dcosh\|d0' --exclude-dir=syscheck --exclude="*nvtx*" --exclude="*precision_select*" ./src/* | |
| - name: Lint Source - No Junk Code | |
| run: | | |
| ! grep -iR -e '\.\.\.' -e '\-\-\-' -e '===' ./src/* | |
| - name: Lint Docs | |
| run: python3 toolchain/mfc/lint_docs.py | |
| file-changes: | |
| name: Detect File Changes | |
| runs-on: 'ubuntu-latest' | |
| outputs: | |
| checkall: ${{ steps.changes.outputs.checkall }} | |
| steps: | |
| - name: Clone | |
| uses: actions/checkout@v4 | |
| - name: Detect Changes | |
| uses: dorny/paths-filter@v3 | |
| id: changes | |
| with: | |
| filters: ".github/file-filter.yml" | |
| github: | |
| name: Github | |
| if: needs.file-changes.outputs.checkall == 'true' | |
| needs: [lint-gate, file-changes] | |
| strategy: | |
| matrix: | |
| os: ['ubuntu', 'macos'] | |
| mpi: ['mpi'] | |
| precision: [''] | |
| debug: ['debug', 'no-debug'] | |
| intel: [true, false] | |
| exclude: | |
| - os: macos | |
| intel: true | |
| include: | |
| - os: ubuntu | |
| mpi: no-mpi | |
| precision: single | |
| debug: no-debug | |
| intel: false | |
| fail-fast: false | |
| continue-on-error: true | |
| runs-on: ${{ matrix.os }}-latest | |
| steps: | |
| - name: Clone | |
| uses: actions/checkout@v4 | |
| - name: Setup MacOS | |
| if: matrix.os == 'macos' | |
| run: | | |
| brew update | |
| brew upgrade | |
| brew install coreutils python fftw hdf5 gcc@15 boost open-mpi lapack | |
| echo "FC=gfortran-15" >> $GITHUB_ENV | |
| echo "BOOST_INCLUDE=/opt/homebrew/include/" >> $GITHUB_ENV | |
| - name: Setup Ubuntu | |
| if: matrix.os == 'ubuntu' && matrix.intel == false | |
| run: | | |
| sudo apt update -y | |
| sudo apt install -y cmake gcc g++ python3 python3-dev hdf5-tools \ | |
| libfftw3-dev libhdf5-dev openmpi-bin libopenmpi-dev \ | |
| libblas-dev liblapack-dev | |
| - name: Setup Ubuntu (Intel) | |
| if: matrix.os == 'ubuntu' && matrix.intel == true | |
| run: | | |
| wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | |
| sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | |
| sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main" | |
| sudo apt-get update | |
| sudo apt-get install -y intel-oneapi-compiler-fortran intel-oneapi-mpi intel-oneapi-mpi-devel | |
| # Export only new/changed env vars from setvars.sh. | |
| # `printenv >> $GITHUB_ENV` dumps all vars including shell internals | |
| # with special characters that corrupt GITHUB_ENV parsing. | |
| printenv | sort > /tmp/env_before | |
| source /opt/intel/oneapi/setvars.sh | |
| printenv | sort > /tmp/env_after | |
| diff /tmp/env_before /tmp/env_after | grep '^>' | sed 's/^> //' >> $GITHUB_ENV | |
| - name: Build | |
| run: | | |
| /bin/bash mfc.sh test -v --dry-run -j $(nproc) --${{ matrix.debug }} --${{ matrix.mpi }} $PRECISION $TEST_ALL | |
| env: | |
| TEST_ALL: ${{ matrix.mpi == 'mpi' && '--test-all' || '' }} | |
| PRECISION: ${{ matrix.precision != '' && format('--{0}', matrix.precision) || '' }} | |
| - name: Test | |
| run: | | |
| /bin/bash mfc.sh test -v --max-attempts 3 -j $(nproc) $TEST_ALL $TEST_PCT | |
| env: | |
| TEST_ALL: ${{ matrix.mpi == 'mpi' && '--test-all' || '' }} | |
| TEST_PCT: ${{ matrix.debug == 'debug' && '-% 20' || '' }} | |
| self: | |
| name: "${{ matrix.cluster_name }} (${{ matrix.device }}${{ matrix.interface != 'none' && format('-{0}', matrix.interface) || '' }}${{ matrix.shard != '' && format(' [{0}]', matrix.shard) || '' }})" | |
| if: github.repository == 'MFlowCode/MFC' && needs.file-changes.outputs.checkall == 'true' && github.event.pull_request.draft != true | |
| needs: [lint-gate, file-changes] | |
| # Frontier CCE compiler is periodically broken by toolchain updates (e.g. | |
| # cpe/25.03 introduced an IPA SIGSEGV in CCE 19.0.0). Allow Frontier to | |
| # fail without blocking PR merges; Phoenix remains a hard gate. | |
| continue-on-error: ${{ matrix.runner == 'frontier' }} | |
| timeout-minutes: 480 | |
| strategy: | |
| matrix: | |
| include: | |
| # Phoenix (GT) — build+test combined in SLURM job | |
| - runner: 'gt' | |
| cluster: 'phoenix' | |
| cluster_name: 'Georgia Tech | Phoenix' | |
| device: 'gpu' | |
| interface: 'acc' | |
| - runner: 'gt' | |
| cluster: 'phoenix' | |
| cluster_name: 'Georgia Tech | Phoenix' | |
| device: 'gpu' | |
| interface: 'omp' | |
| - runner: 'gt' | |
| cluster: 'phoenix' | |
| cluster_name: 'Georgia Tech | Phoenix' | |
| device: 'cpu' | |
| interface: 'none' | |
| # Frontier (ORNL) — CCE | |
| - runner: 'frontier' | |
| cluster: 'frontier' | |
| cluster_name: 'Oak Ridge | Frontier' | |
| device: 'gpu' | |
| interface: 'acc' | |
| shard: '1/2' | |
| - runner: 'frontier' | |
| cluster: 'frontier' | |
| cluster_name: 'Oak Ridge | Frontier' | |
| device: 'gpu' | |
| interface: 'acc' | |
| shard: '2/2' | |
| - runner: 'frontier' | |
| cluster: 'frontier' | |
| cluster_name: 'Oak Ridge | Frontier' | |
| device: 'gpu' | |
| interface: 'omp' | |
| shard: '1/2' | |
| - runner: 'frontier' | |
| cluster: 'frontier' | |
| cluster_name: 'Oak Ridge | Frontier' | |
| device: 'gpu' | |
| interface: 'omp' | |
| shard: '2/2' | |
| - runner: 'frontier' | |
| cluster: 'frontier' | |
| cluster_name: 'Oak Ridge | Frontier' | |
| device: 'cpu' | |
| interface: 'none' | |
| # Frontier AMD — build on login node, GPU tests sharded for batch partition | |
| - runner: 'frontier' | |
| cluster: 'frontier_amd' | |
| cluster_name: 'Oak Ridge | Frontier (AMD)' | |
| device: 'gpu' | |
| interface: 'omp' | |
| shard: '1/2' | |
| - runner: 'frontier' | |
| cluster: 'frontier_amd' | |
| cluster_name: 'Oak Ridge | Frontier (AMD)' | |
| device: 'gpu' | |
| interface: 'omp' | |
| shard: '2/2' | |
| - runner: 'frontier' | |
| cluster: 'frontier_amd' | |
| cluster_name: 'Oak Ridge | Frontier (AMD)' | |
| device: 'cpu' | |
| interface: 'none' | |
| runs-on: | |
| group: phoenix | |
| labels: ${{ matrix.runner }} | |
| env: | |
| NODE_OPTIONS: ${{ matrix.cluster == 'phoenix' && '--max-old-space-size=2048' || '' }} | |
| steps: | |
| - name: Clone | |
| uses: actions/checkout@v4 | |
| with: | |
| # clean: false preserves .slurm_job_id files across reruns so | |
| # submit-slurm-job.sh can detect and cancel stale SLURM jobs on retry. | |
| clean: false | |
| - name: Clean stale output files | |
| run: rm -f *.out | |
| - name: Build (login node) | |
| if: matrix.cluster != 'phoenix' | |
| timeout-minutes: 60 | |
| run: bash .github/workflows/${{ matrix.cluster }}/build.sh ${{ matrix.device }} ${{ matrix.interface }} | |
| - name: Test | |
| run: bash .github/scripts/submit-slurm-job.sh .github/workflows/common/test.sh ${{ matrix.device }} ${{ matrix.interface }} ${{ matrix.cluster }} ${{ matrix.shard }} | |
| - name: Cancel SLURM Jobs | |
| if: cancelled() | |
| run: | | |
| find . -name "*.slurm_job_id" | while read -r f; do | |
| job_id=$(cat "$f") | |
| echo "Cancelling SLURM job $job_id" | |
| scancel "$job_id" 2>/dev/null || true | |
| done | |
| - name: Compute Log Slug | |
| if: always() | |
| id: log | |
| run: | | |
| SLUG="test-${{ matrix.device }}-${{ matrix.interface }}" | |
| SHARD="${{ matrix.shard }}" | |
| if [ -n "$SHARD" ]; then | |
| SLUG="${SLUG}-$(echo "$SHARD" | sed 's|/|-of-|')" | |
| fi | |
| echo "slug=${SLUG}" >> "$GITHUB_OUTPUT" | |
| - name: Print Logs | |
| if: always() | |
| run: cat ${{ steps.log.outputs.slug }}.out | |
| - name: Archive Logs | |
| uses: actions/upload-artifact@v4 | |
| if: matrix.cluster != 'phoenix' | |
| with: | |
| name: logs-${{ strategy.job-index }}-${{ steps.log.outputs.slug }} | |
| path: ${{ steps.log.outputs.slug }}.out | |
| case-optimization: | |
| name: "Case Opt | ${{ matrix.cluster_name }} (${{ matrix.device }}-${{ matrix.interface }})" | |
| if: github.repository == 'MFlowCode/MFC' && needs.file-changes.outputs.checkall == 'true' && github.event.pull_request.draft != true | |
| needs: [lint-gate, file-changes] | |
| # Frontier is non-blocking for the same reason as the self job above. | |
| continue-on-error: ${{ matrix.runner == 'frontier' }} | |
| timeout-minutes: 480 | |
| strategy: | |
| matrix: | |
| include: | |
| - runner: 'gt' | |
| cluster: 'phoenix' | |
| cluster_name: 'Georgia Tech | Phoenix' | |
| device: 'gpu' | |
| interface: 'acc' | |
| - runner: 'gt' | |
| cluster: 'phoenix' | |
| cluster_name: 'Georgia Tech | Phoenix' | |
| device: 'gpu' | |
| interface: 'omp' | |
| - runner: 'frontier' | |
| cluster: 'frontier' | |
| cluster_name: 'Oak Ridge | Frontier' | |
| device: 'gpu' | |
| interface: 'acc' | |
| - runner: 'frontier' | |
| cluster: 'frontier' | |
| cluster_name: 'Oak Ridge | Frontier' | |
| device: 'gpu' | |
| interface: 'omp' | |
| - runner: 'frontier' | |
| cluster: 'frontier_amd' | |
| cluster_name: 'Oak Ridge | Frontier (AMD)' | |
| device: 'gpu' | |
| interface: 'omp' | |
| runs-on: | |
| group: phoenix | |
| labels: ${{ matrix.runner }} | |
| steps: | |
| - name: Clone | |
| uses: actions/checkout@v4 | |
| with: | |
| clean: false | |
| - name: Clean stale output files | |
| run: rm -f *.out | |
| - name: Pre-Build (SLURM) | |
| if: matrix.cluster == 'phoenix' | |
| run: bash .github/scripts/submit-slurm-job.sh .github/scripts/prebuild-case-optimization.sh cpu ${{ matrix.interface }} ${{ matrix.cluster }} | |
| - name: Pre-Build (login node) | |
| if: matrix.cluster != 'phoenix' | |
| run: bash .github/scripts/prebuild-case-optimization.sh ${{ matrix.cluster }} ${{ matrix.device }} ${{ matrix.interface }} | |
| - name: Run Case-Optimization Tests | |
| run: bash .github/scripts/submit-slurm-job.sh .github/scripts/run_case_optimization.sh ${{ matrix.device }} ${{ matrix.interface }} ${{ matrix.cluster }} | |
| - name: Cancel SLURM Jobs | |
| if: cancelled() | |
| run: | | |
| find . -name "*.slurm_job_id" | while read -r f; do | |
| job_id=$(cat "$f") | |
| echo "Cancelling SLURM job $job_id" | |
| scancel "$job_id" 2>/dev/null || true | |
| done | |
| - name: Print Logs | |
| if: always() | |
| run: | | |
| for f in prebuild-case-optimization-${{ matrix.device }}-${{ matrix.interface }}.out \ | |
| run-case-optimization-${{ matrix.device }}-${{ matrix.interface }}.out; do | |
| [ -f "$f" ] && echo "=== $f ===" && cat "$f" | |
| done | |
| - name: Archive Logs | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: case-opt-${{ strategy.job-index }}-${{ matrix.cluster }}-${{ matrix.interface }} | |
| path: | | |
| prebuild-case-optimization-${{ matrix.device }}-${{ matrix.interface }}.out | |
| run-case-optimization-${{ matrix.device }}-${{ matrix.interface }}.out |