# CI pipeline configuration

default:
   image: gmulas/np-tmcode

# Switch from branch pipelines to merge request pipelines when a merge request is created
workflow:
  rules:
    # Ensures next rules do not block triggered pipelines
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
      when: never
    # always run for merge requests
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    # never run a branch pipeline if there is an open merge request for that branch
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
      when: never
    # the only allowed branch pipeline is that on the default branch
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

stages:
   - compatibility
   - build
   - run
   - test

compatibility_stage:
   stage: compatibility
   tags: ["np-tmcode"]
   allow_failure: true
   artifacts:
      paths:
         - build/cluster/*
         - build/sphere/*
         - build/testing/*
         - build/trapping/*
         - build/libnptm/*
      exclude:
         - ".git*"
         - ".git/**/*"
      expire_in: 2 hours
   script:
      # bash commands to be executed
      - pwd
      - hostname
      - echo $CI_COMMIT_SHA
      - echo $CI_COMMIT_BRANCH
      - echo "Getting system info ..."
      - cat /etc/os-release
      - cd src
      - echo "Running make with gnu compilers version 11..."
      - make clean && BUILDDIR=$PWD/../build_gnu11 CXX=g++-11 FC=gfortran-11 make -j
      - echo "Running make with gnu compilers version 12..."
      - make clean && BUILDDIR=$PWD/../build_gnu12 CXX=g++-12 FC=gfortran-12 make -j
      - echo "Running make with gnu compilers version 13..."
      - make clean && BUILDDIR=$PWD/../build_gnu13 CXX=g++-13 FC=gfortran-13 make -j
      - echo "Running make with gnu compilers version 14..."
      - make clean && BUILDDIR=$PWD/../build_gnu14 CXX=g++-14 FC=gfortran-14 make -j
      - echo "Running make with flang version 16 and clang version 16..."
      - make clean && BUILDDIR=$PWD/../build_clang16 CXX="clang++-16 -stdlib=libstdc++ -I/usr/include/c++/13 -I/usr/include/x86_64-linux-gnu/c++/13" FC=flang-new-16 FCFLAGS=-O3 LDFLAGS="-L/usr/lib/llvm-16/lib -L/usr/lib/gcc/x86_64-linux-gnu/13" make -j
      - echo "Running make with flang version 17 and clang version 17..."
      - make clean && BUILDDIR=$PWD/../build_clang17 CXX="clang++-17 -stdlib=libstdc++ -I/usr/include/c++/13 -I/usr/include/x86_64-linux-gnu/c++/13" FC=flang-new-17 FCFLAGS=-O3 LDFLAGS="-L/usr/lib/llvm-17/lib -L/usr/lib/gcc/x86_64-linux-gnu/13" make -j
      - echo "Running make with Intel ifort and Intel icpx..."
      - make clean && LD_LIBRARY_PATH=/opt/intel/oneapi/compiler/2024.2/lib PATH=/opt/intel/oneapi/compiler/2024.2/bin:$PATH BUILDDIR=$PWD/../build_ifort-icpx CXX=icpx FC=ifort FCFLAGS="-O3 -diag-disable=10448" make -j
      - echo "Running make with Intel ifx and Intel icpx..."
      - make clean && LD_LIBRARY_PATH=/opt/intel/oneapi/compiler/2024.2/lib PATH=/opt/intel/oneapi/compiler/2024.2/bin:$PATH BUILDDIR=$PWD/../build_ifx-icpx CXX=icpx FC=ifx FCFLAGS=-O3 make -j
      - echo "Running make with default MPI compilers"
      - make clean && BUILDDIR=$PWD/../build_mpi CXX=mpicxx FC=mpif90 USE_MPI=1 make -j
   
building_stage:
   stage: build
   tags: ["np-tmcode"]
   allow_failure: false
   artifacts:
      paths:
         - build/cluster/*
         - build/sphere/*
         - build/testing/*
         - build/trapping/*
         - build/libnptm/*
         - doc/build/*
      exclude:
         - ".git*"
         - ".git/**/*"
      expire_in: 2 hours
   script:
      # bash commands to be executed
      - pwd
      - hostname
      - echo $CI_COMMIT_SHA
      - echo $CI_COMMIT_BRANCH
      - echo "Getting system info ..."
      - cat /etc/os-release
      - cd src
      - echo "Running make with default compilers..."
      - make clean && USE_LAPACK=1 USE_ILP64=1 make -j
      - make docs -j && make -C ../doc/build/latex -j

running_stage:
   stage: run
   tags: ["np-tmcode"]
   allow_failure: false
   needs:
      - job: building_stage
   dependencies:
      - building_stage
   artifacts:
      paths:
         - build/cluster/c_*
         - build/sphere/c_*
         #- build/trapping/*
      exclude:
         - ".git*"
         - ".git/**/*"
      expire_in: 2 hours
   script:
      # bash commands to be executed
      - pwd
      - hostname
      - echo $CI_COMMIT_SHA
      - echo $CI_COMMIT_BRANCH
      - cd build/sphere
      - echo "Running np_sphere"
      - chmod +x np_sphere
      - ./np_sphere
      - cd ../cluster
      - echo "Running np_cluster"
      - chmod +x np_cluster
      - ./np_cluster
      
testing_stage:
   stage: test
   tags: ["np-tmcode"]
   allow_failure: false
   needs:
      - job: building_stage
      - job: running_stage
   dependencies:
      - building_stage
      - running_stage
   artifacts:
      paths:
         - build/cluster/pycompare.html
         - build/sphere/pycompare.html
      exclude:
         - ".git*"
         - ".git/**/*"
      expire_in: 2 hours
   script:
      # bash commands to be executed
      - pwd
      - hostname
      - echo $CI_COMMIT_SHA
      - echo $CI_COMMIT_BRANCH
      - cd build/sphere
      - export FFILE=../../test_data/sphere/OSPH
      - echo "Comparing output of SPHERE"
      - python3 ../../src/scripts/pycompare.py --no-progress --ffile=$FFILE --cfile=c_OSPH --html
      - echo "Checking consistency among legacy and HDF5 configuration files"
      - ../testing/test_TEDF ../../test_data/sphere/DEDFB c_TEDF c_TEDF.hd5
      - cd ../cluster
      - echo "Comparing output of CLUSTER"
      - export FFILE=../../test_data/cluster/OCLU
      - python3 ../../src/scripts/pycompare.py --no-progress --ffile=$FFILE --cfile=c_OCLU --html
      - echo "Testing cluster with 24 spheres"
      - ./np_cluster ../../test_data/cluster/DEDFB_24 ../../test_data/cluster/DCLU_24 .
      - echo "Comparing output of CLUSTER with 24 spheres"
      - export FFILE=../../test_data/cluster/OCLU_24
      - python3 ../../src/scripts/pycompare.py --no-progress --ffile=$FFILE --cfile=c_OCLU --html
      - echo "Checking consistency among legacy and HDF5 configuration files"
      - ../testing/test_TEDF ../../test_data/cluster/DEDFB_24 c_TEDF c_TEDF.hd5
      - echo "Checking consistency among legacy and HDF5 TM files"
      - ../testing/test_TTMS c_TTMS c_TTMS.hd5
