From 87679294301b56b9d1fe645b3eafa2a666f93870 Mon Sep 17 00:00:00 2001 From: Rahul Mahajan Date: Wed, 29 Jun 2022 17:22:11 -0400 Subject: [PATCH] add spack-based ci. (#528) * add spack-based ci. replace dependency on w3nco with w3emc. Update w3emc to 2.9.2 on all machines (wcoss2 is already at 2.9.2) * remove deprecated hera and orion env. modulefiles * update nemsio version to 2.5.4. Flush cache --- .github/workflows/build_and_test.yml | 66 ---------------- .github/workflows/gcc.yml | 96 ++++++++++++++++++++++ .github/workflows/intel.yml | 114 +++++++++++++++++++++++++++ CMakeLists.txt | 8 +- ci/spack.yaml | 23 ++++++ cmake/PackageConfig.cmake.in | 2 +- modulefiles/cheyenne | 3 +- modulefiles/cheyenne_gnu | 3 +- modulefiles/hera.lua | 4 +- modulefiles/jet | 3 +- modulefiles/orion.lua | 2 - modulefiles/s4 | 3 +- modulefiles/wcoss2.lua | 2 - modulefiles/wcoss_cray | 3 +- modulefiles/wcoss_dell_p3 | 3 +- sorc/ncep_post.fd/CMakeLists.txt | 2 +- 16 files changed, 243 insertions(+), 94 deletions(-) delete mode 100644 .github/workflows/build_and_test.yml create mode 100644 .github/workflows/gcc.yml create mode 100644 .github/workflows/intel.yml create mode 100644 ci/spack.yaml mode change 100755 => 100644 modulefiles/hera.lua mode change 100755 => 100644 modulefiles/jet mode change 100755 => 100644 modulefiles/orion.lua mode change 100755 => 100644 modulefiles/s4 mode change 100755 => 100644 modulefiles/wcoss2.lua mode change 100755 => 100644 modulefiles/wcoss_cray mode change 100755 => 100644 modulefiles/wcoss_dell_p3 diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml deleted file mode 100644 index aef646eb6..000000000 --- a/.github/workflows/build_and_test.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: Build and Test -on: [push, pull_request] - -jobs: - build: - runs-on: ubuntu-20.04 - env: - FC: gfortran-9 - CC: gcc-9 - - steps: - - name: install-dependencies - run: | - sudo apt-get update - sudo apt-get install libmpich-dev - sudo apt-get install libnetcdf-dev libnetcdff-dev netcdf-bin pkg-config - sudo apt-get install libpng-dev - sudo apt-get install libjpeg-dev - sudo apt-get install doxygen - - - name: checkout-jasper - uses: actions/checkout@v2 - with: - repository: jasper-software/jasper - path: jasper - ref: version-2.0.22 - - - name: build-jasper - run: | - cd jasper - mkdir build-jasper && cd build-jasper - cmake .. -DCMAKE_INSTALL_PREFIX=~ - make -j2 - make install - - - name: checkout-nceplibs - uses: actions/checkout@v2 - with: - repository: NOAA-EMC/NCEPLIBS - path: nceplibs - ref: v1.2.0 - - - name: build-nceplibs - run: | - cd nceplibs - mkdir build && cd build - cmake .. -DCMAKE_INSTALL_PREFIX=~ -DFLAT=ON -DBUILD_POST=OFF - make -j2 - - - name: checkout-post - uses: actions/checkout@v2 - with: - path: post - - - name: build-post - run: | - cd post - mkdir build && cd build - cmake .. -DCMAKE_PREFIX_PATH=~ -DENABLE_DOCS=ON - make -j2 - - - - - - diff --git a/.github/workflows/gcc.yml b/.github/workflows/gcc.yml new file mode 100644 index 000000000..da033fa71 --- /dev/null +++ b/.github/workflows/gcc.yml @@ -0,0 +1,96 @@ +name: GCC Linux Build +on: [push, pull_request, workflow_dispatch] + + +# Use custom shell with -l so .bash_profile is sourced +# without having to do it in manually every step +defaults: + run: + shell: bash -leo pipefail {0} + +env: + cache_key: gcc2 # The number (#) following the cache_key "gcc" is to flush Action cache. + CC: gcc-10 + FC: gfortran-10 + CXX: g++-10 + +# A note on flushing Action cache and relevance to "cache_key" above. +# There is no way to flush the Action cache, and hence a number (#) is appended +# to the "cache_key" (gcc). +# If the dependencies change, increment this number and a new cache will be +# generated by the dependency build step "setup" +# There is a Github issue to force clear the cache. +# See discussion on: +# https://stackoverflow.com/questions/63521430/clear-cache-in-github-actions + +# The jobs are split into: +# 1. a dependency build step (setup), and +# 2. a UPP build step (build) +# The setup is run once and the environment is cached, +# so each build of UPP can reuse the cached dependencies to save time (and compute). + +jobs: + setup: + runs-on: ubuntu-latest + + steps: + # Cache spack, compiler and dependencies + - name: cache-env + id: cache-env + uses: actions/cache@v2 + with: + path: | + spack + ~/.spack + key: spack-${{ runner.os }}-${{ env.cache_key }} + + - name: checkout-upp # This is for getting spack.yaml + if: steps.cache-env.outputs.cache-hit != 'true' + uses: actions/checkout@v2 + with: + path: UPP + + # Install dependencies using Spack + - name: install-dependencies-with-spack + if: steps.cache-env.outputs.cache-hit != 'true' + run: | + git clone -c feature.manyFiles=true https://github.com/NOAA-EMC/spack.git + source spack/share/spack/setup-env.sh + spack env create upp-env UPP/ci/spack.yaml + spack env activate upp-env + spack compiler find + spack external find + spack add mpich@3.4.2 + spack concretize + spack install --dirty -v + + build: + needs: setup + runs-on: ubuntu-latest + + steps: + - name: checkout-upp + uses: actions/checkout@v2 + with: + path: UPP + + - name: cache-env + id: cache-env + uses: actions/cache@v2 + with: + path: | + spack + ~/.spack + key: spack-${{ runner.os }}-${{ env.cache_key }} + + - name: build-upp + run: | + source spack/share/spack/setup-env.sh + spack env activate upp-env + export CC=mpicc + export FC=mpif90 + cd UPP + mkdir -p build && cd build + cmake -DCMAKE_INSTALL_PREFIX=../install .. + make -j2 VERBOSE=1 + make install diff --git a/.github/workflows/intel.yml b/.github/workflows/intel.yml new file mode 100644 index 000000000..97ab17caa --- /dev/null +++ b/.github/workflows/intel.yml @@ -0,0 +1,114 @@ +name: Intel Linux Build +on: [push, pull_request, workflow_dispatch] + +# Use custom shell with -l so .bash_profile is sourced which loads intel/oneapi/setvars.sh +# without having to do it in manually every step +defaults: + run: + shell: bash -leo pipefail {0} + +# Set I_MPI_CC/F90 so Intel MPI wrapper uses icc/ifort instead of gcc/gfortran +env: + cache_key: intel2 # The number (#) following the cache_key "intel" is to flush Action cache. + CC: icc + FC: ifort + CXX: icpc + I_MPI_CC: icc + I_MPI_F90: ifort + +# A note on flushing Action cache and relevance to "cache_key" above. +# There is no way to flush the Action cache, and hence a number (#) is appended +# to the "cache_key" (intel). +# If the dependencies change, increment this number and a new cache will be +# generated by the dependency build step "setup" +# There is a Github issue to force clear the cache. +# See discussion on: +# https://stackoverflow.com/questions/63521430/clear-cache-in-github-actions + +# The jobs are split into: +# 1. a dependency build step (setup), and +# 2. a UPP build step (build) +# The setup is run once and the environment is cached, +# so each build of UPP can reuse the cached dependencies to save time (and compute). + +jobs: + setup: + runs-on: ubuntu-latest + + steps: + # Cache spack, compiler and dependencies + - name: cache-env + id: cache-env + uses: actions/cache@v2 + with: + path: | + spack + ~/.spack + /opt/intel + key: spack-${{ runner.os }}-${{ env.cache_key }} + + - name: install-intel-compilers + if: steps.cache-env.outputs.cache-hit != '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 + echo "deb https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list + sudo apt-get update + sudo apt-get install intel-oneapi-dev-utilities intel-oneapi-mpi-devel intel-oneapi-openmp intel-oneapi-compiler-fortran intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic + echo "source /opt/intel/oneapi/setvars.sh" >> ~/.bash_profile + + - name: checkout-upp # This is for getting spack.yaml + if: steps.cache-env.outputs.cache-hit != 'true' + uses: actions/checkout@v2 + with: + path: UPP + + # Install dependencies using Spack + - name: install-dependencies-with-spack + if: steps.cache-env.outputs.cache-hit != 'true' + run: | + git clone -c feature.manyFiles=true https://github.com/NOAA-EMC/spack.git + source spack/share/spack/setup-env.sh + spack env create upp-env UPP/ci/spack.yaml + spack env activate upp-env + spack compiler find + spack external find + spack add intel-oneapi-mpi + spack concretize + spack install --dirty -v + + build: + needs: setup + runs-on: ubuntu-latest + + steps: + - name: checkout-upp + uses: actions/checkout@v2 + with: + path: UPP + + - name: install-intel + run: | + echo "source /opt/intel/oneapi/setvars.sh" >> ~/.bash_profile + + - name: cache-env + id: cache-env + uses: actions/cache@v2 + with: + path: | + spack + ~/.spack + /opt/intel + key: spack-${{ runner.os }}-${{ env.cache_key }} + + - name: build-upp + run: | + source spack/share/spack/setup-env.sh + spack env activate upp-env + export CC=mpiicc + export FC=mpiifort + cd UPP + mkdir -p build && cd build + cmake -DCMAKE_INSTALL_PREFIX=../install .. + make -j2 VERBOSE=1 + make install diff --git a/CMakeLists.txt b/CMakeLists.txt index ca0255482..483d8defd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,18 +57,12 @@ if(BUILD_POSTEXEC) find_package(sfcio REQUIRED) find_package(sigio REQUIRED) find_package(sp REQUIRED) - find_package(w3nco REQUIRED) + find_package(w3emc REQUIRED) if(BUILD_WITH_WRFIO) find_package(wrf_io REQUIRED) endif() endif() -### Switch RUNTIME DESTINATION DIR between bin and exec -set(exec_dir bin) -if(EMC_EXEC_DIR) - set(exec_dir exec) -endif() - add_subdirectory(sorc) add_subdirectory(parm) diff --git a/ci/spack.yaml b/ci/spack.yaml new file mode 100644 index 000000000..1c7aa122e --- /dev/null +++ b/ci/spack.yaml @@ -0,0 +1,23 @@ +# Spack environment file to build UPP dependencies +spack: + packages: + all: + compiler: [intel, gcc] + specs: + - netcdf-c@4.7.4 + - netcdf-fortran@4.5.3 + - bacio@2.4.1 + - w3emc@2.9.2 + - g2@3.4.5 + - g2tmpl@1.10.0 + - sp@2.3.3 + - ip@3.3.3 + - sigio@2.3.2 + - sfcio@1.4.1 + - nemsio@2.5.4 + - wrf-io@1.2.0 + - crtm@2.3.0 + view: true + concretizer: + unify: true + diff --git a/cmake/PackageConfig.cmake.in b/cmake/PackageConfig.cmake.in index acaf390bf..88f9902d7 100644 --- a/cmake/PackageConfig.cmake.in +++ b/cmake/PackageConfig.cmake.in @@ -30,7 +30,7 @@ find_dependency(ip CONFIG) #find_dependency(sfcio CONFIG) #find_dependency(sigio CONFIG) #find_dependency(sp CONFIG) -#find_dependency(w3nco CONFIG) +#find_dependency(w3emc CONFIG) # Get the build type from library target get_target_property(@PROJECT_NAME@_BUILD_TYPES @PROJECT_NAME@::@PROJECT_NAME@ IMPORTED_CONFIGURATIONS) diff --git a/modulefiles/cheyenne b/modulefiles/cheyenne index 75ae507e5..f5a40a5bd 100644 --- a/modulefiles/cheyenne +++ b/modulefiles/cheyenne @@ -35,6 +35,5 @@ module load nemsio/2.5.2 module load sfcio/1.4.1 module load sigio/2.3.2 module load sp/2.3.3 -module load w3nco/2.4.1 -module load w3emc/2.7.3 +module load w3emc/2.9.2 module load wrf_io/1.2.0 diff --git a/modulefiles/cheyenne_gnu b/modulefiles/cheyenne_gnu index c7dbc8e18..d14c372e6 100644 --- a/modulefiles/cheyenne_gnu +++ b/modulefiles/cheyenne_gnu @@ -36,6 +36,5 @@ module load nemsio/2.5.2 module load sfcio/1.4.1 module load sigio/2.3.2 module load sp/2.3.3 -module load w3nco/2.4.1 -module load w3emc/2.7.3 +module load w3emc/2.9.2 module load wrf_io/1.2.0 diff --git a/modulefiles/hera.lua b/modulefiles/hera.lua old mode 100755 new mode 100644 index 22c6e1839..a0e6574a7 --- a/modulefiles/hera.lua +++ b/modulefiles/hera.lua @@ -31,8 +31,6 @@ g2_ver=os.getenv("g2_ver") or "3.4.5" load(pathJoin("g2", g2_ver)) g2tmpl_ver=os.getenv("g2tmpl_ver") or "1.10.0" load(pathJoin("g2tmpl", g2tmpl_ver)) -w3nco_ver=os.getenv("w3nco_ver") or "2.4.1" -load(pathJoin("w3nco", w3nco_ver)) bacio_ver=os.getenv("bacio_ver") or "2.4.1" load(pathJoin("bacio", bacio_ver)) ip_ver=os.getenv("ip_ver") or "3.3.3" @@ -44,7 +42,7 @@ load(pathJoin("crtm", crtm_ver)) w3emc_ver=os.getenv("w3emc_ver") or "2.9.2" load(pathJoin("w3emc", w3emc_ver)) -nemsio_ver=os.getenv("nemsio_ver") or "2.5.2" +nemsio_ver=os.getenv("nemsio_ver") or "2.5.4" load(pathJoin("nemsio", nemsio_ver)) sigio_ver=os.getenv("sigio_ver") or "2.3.2" load(pathJoin("sigio", sigio_ver)) diff --git a/modulefiles/jet b/modulefiles/jet old mode 100755 new mode 100644 index adafe445f..e789ff698 --- a/modulefiles/jet +++ b/modulefiles/jet @@ -30,6 +30,5 @@ module load nemsio/2.5.2 module load sfcio/1.4.1 module load sigio/2.3.2 module load sp/2.3.3 -module load w3nco/2.4.1 -module load w3emc/2.7.3 +module load w3emc/2.9.2 module load wrf_io/1.1.1 diff --git a/modulefiles/orion.lua b/modulefiles/orion.lua old mode 100755 new mode 100644 index bb355e4b2..2d39e1225 --- a/modulefiles/orion.lua +++ b/modulefiles/orion.lua @@ -31,8 +31,6 @@ g2_ver=os.getenv("g2_ver") or "3.4.5" load(pathJoin("g2", g2_ver)) g2tmpl_ver=os.getenv("g2tmpl_ver") or "1.10.0" load(pathJoin("g2tmpl", g2tmpl_ver)) -w3nco_ver=os.getenv("w3nco_ver") or "2.4.1" -load(pathJoin("w3nco", w3nco_ver)) bacio_ver=os.getenv("bacio_ver") or "2.4.1" load(pathJoin("bacio", bacio_ver)) ip_ver=os.getenv("ip_ver") or "3.3.3" diff --git a/modulefiles/s4 b/modulefiles/s4 old mode 100755 new mode 100644 index 3147aa294..f41835c42 --- a/modulefiles/s4 +++ b/modulefiles/s4 @@ -29,6 +29,5 @@ module load nemsio/2.5.2 module load sfcio/1.4.1 module load sigio/2.3.2 module load sp/2.3.3 -module load w3nco/2.4.1 -module load w3emc/2.7.3 +module load w3emc/2.9.2 module load wrf_io/1.1.1 diff --git a/modulefiles/wcoss2.lua b/modulefiles/wcoss2.lua old mode 100755 new mode 100644 index 158837b40..e18bbce62 --- a/modulefiles/wcoss2.lua +++ b/modulefiles/wcoss2.lua @@ -25,7 +25,6 @@ load(pathJoin("zlib", zlib_ver)) g2_ver=os.getenv("g2_ver") or "3.4.5" g2tmpl_ver=os.getenv("g2tmpl_ver") or "1.10.0" -w3nco_ver=os.getenv("w3nco_ver") or "2.4.1" bacio_ver=os.getenv("bacio_ver") or "2.4.1" ip_ver=os.getenv("ip_ver") or "3.3.3" sp_ver=os.getenv("sp_ver") or "2.3.3" @@ -33,7 +32,6 @@ crtm_ver=os.getenv("crtm_ver") or "2.3.0" w3emc_ver=os.getenv("w3emc_ver") or "2.9.2" load(pathJoin("g2", g2_ver)) load(pathJoin("g2tmpl", g2tmpl_ver)) -load(pathJoin("w3nco", w3nco_ver)) load(pathJoin("bacio", bacio_ver)) load(pathJoin("ip", ip_ver)) load(pathJoin("sp", sp_ver)) diff --git a/modulefiles/wcoss_cray b/modulefiles/wcoss_cray old mode 100755 new mode 100644 index 72457d598..f8866064d --- a/modulefiles/wcoss_cray +++ b/modulefiles/wcoss_cray @@ -36,6 +36,5 @@ module load nemsio/2.5.2 module load sfcio/1.4.1 module load sigio/2.3.2 module load sp/2.3.3 -module load w3nco/2.4.1 -module load w3emc/2.7.3 +module load w3emc/2.9.2 module load wrf_io/1.1.1 diff --git a/modulefiles/wcoss_dell_p3 b/modulefiles/wcoss_dell_p3 old mode 100755 new mode 100644 index c6692ecfa..e8821e22d --- a/modulefiles/wcoss_dell_p3 +++ b/modulefiles/wcoss_dell_p3 @@ -30,6 +30,5 @@ module load nemsio/2.5.2 module load sfcio/1.4.1 module load sigio/2.3.2 module load sp/2.3.3 -module load w3nco/2.4.1 -module load w3emc/2.7.3 +module load w3emc/2.9.2 module load wrf_io/1.1.1 diff --git a/sorc/ncep_post.fd/CMakeLists.txt b/sorc/ncep_post.fd/CMakeLists.txt index bce8c8361..3bd218cf3 100644 --- a/sorc/ncep_post.fd/CMakeLists.txt +++ b/sorc/ncep_post.fd/CMakeLists.txt @@ -217,7 +217,7 @@ if(BUILD_POSTEXEC) target_link_libraries(${EXENAME} PRIVATE ${LIBNAME} nemsio::nemsio - w3nco::w3nco_4 + w3emc::w3emc_4 sp::sp_4 sfcio::sfcio sigio::sigio)