diff --git a/.gitignore b/.gitignore index 46f42f8..de20ac4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,61 @@ -CMakeLists.txt.user -CMakeCache.txt -CMakeFiles -CMakeScripts -Testing -Makefile -cmake_install.cmake -install_manifest.txt -compile_commands.json -CTestTestfile.cmake -_deps +# Ignore these files anywhere in the tree +*DS_Store* +*.[aox] +*.so +*.mod +*.pyc +*.v3breakpoints +*.swp +*.sublime-workspace +*~ +git_branches_as_of_* + +# Ignore the contents of these directories +build*/ + +# ECMWF libraries +atlas/ +eckit/ +fckit/ + + +# JEDI core repos +jedicmake/ +saber/ +odc/ +odyssey/ +ioda-converters/ +ioda/ +oops/ +ufo/ +ewok/ + +# FMS +fms/ + +# UFS +ufs/ + +# fv3-jedi and related repos +fv3/ +femps/ +fv3-jedi-lm/ +fv3-jedi/ + +# Observation operators +crtm/ +gsw/ +geos-aero/ +ropp-ufo/ + +# Test data +fv3-jedi-data/ +test-data-release/ +ioda-data/ +ufo-data/ +saber-data/ + + +Testing/ + +EWOK_TMP/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6d3215c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,186 @@ +# (C) Copyright 2021-2021 NOAA + +# ########## +# ufs-jedi-bundle +# ########## + +cmake_minimum_required( VERSION 3.12 FATAL_ERROR ) + +find_package( ecbuild 3.5 REQUIRED HINTS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../ecbuild) + +project( ufs-jedi-bundle VERSION 1.1.0 LANGUAGES C CXX Fortran ) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +include( ecbuild_bundle ) + +set(DEPEND_LIB_ROOT ${CMAKE_CURRENT_BINARY_DIR}/Depends) +list(APPEND CMAKE_PREFIX_PATH ${DEPEND_LIB_ROOT}) +message("prefix path is ${CMAKE_PREFIX_PATH}") + +# Default release mode +set( ECBUILD_DEFAULT_BUILD_TYPE Release ) + +# Enable MPI +set( ENABLE_MPI ON CACHE BOOL "Compile with MPI") + +# Initialize +ecbuild_bundle_initialize() +ecbuild_bundle( PROJECT jedicmake GIT "https://github.com/jcsda-internal/jedi-cmake.git" BRANCH develop UPDATE ) +include( jedicmake/cmake/Functions/git_functions.cmake ) + +# ECMWF libs +# ---------- +option("BUNDLE_SKIP_ECKIT" "Don't build eckit" "ON" ) # Skip eckit build unless user passes -DBUNDLE_SKIP_ECKIT=OFF +option("BUNDLE_SKIP_FCKIT" "Don't build fckit" "ON") # Skip fckit build unless user passes -DBUNDLE_SKIP_FCKIT=OFF +option("BUNDLE_SKIP_ATLAS" "Don't build atlas" "ON") # Skip atlas build unless user passes -DBUNDLE_SKIP_ATLAS=OFF + +ecbuild_bundle( PROJECT eckit GIT "https://github.com/ecmwf/eckit.git" TAG 1.16.0 ) +ecbuild_bundle( PROJECT fckit GIT "https://github.com/ecmwf/fckit.git" TAG 0.9.2 ) +ecbuild_bundle( PROJECT atlas GIT "https://github.com/ecmwf/atlas.git" TAG 0.24.1 ) + +# External (required) observation operators +# ------------------------------ +option("BUNDLE_SKIP_CRTM" "Don't build CRTM" "OFF") # Build crtm unless user passes -DBUNDLE_SKIP_CRTM=ON +ecbuild_bundle( PROJECT crtm GIT "https://github.com/jcsda-internal/crtm.git" BRANCH release/crtm_jedi UPDATE ) + +# Core JEDI repositories +# ---------------------- +ecbuild_bundle( PROJECT oops GIT "https://github.com/jcsda-internal/oops.git" BRANCH develop UPDATE ) +ecbuild_bundle( PROJECT saber GIT "https://github.com/jcsda-internal/saber.git" BRANCH develop UPDATE ) +ecbuild_bundle( PROJECT ioda GIT "https://github.com/jcsda-internal/ioda.git" BRANCH develop UPDATE ) +ecbuild_bundle( PROJECT ufo GIT "https://github.com/jcsda-internal/ufo.git" BRANCH develop UPDATE ) + +# Options for building with certain models +# ---------------------------------------- +set(UFS_APP "ATM" CACHE STRING "Choose the UFS Application") +set_property(CACHE UFS_APP PROPERTY STRINGS "ATM" "NG-GODAS" "S2S") +if(NOT UFS_APP MATCHES "^(ATM|NG-GODAS|S2S)$") + ecbuild_error("Valid options for -DUFS_APP are ATM|NG-GODAS|S2S") +endif() +ecbuild_info("Building with UFS application: ${UFS_APP}") + +# fv3-jedi linear model +# --------------------- +ecbuild_bundle( PROJECT fv3-jedi-lm GIT "https://github.com/jcsda-internal/fv3-jedi-linearmodel.git" BRANCH feature/ufs UPDATE ) + +include_directories(${DEPEND_LIB_ROOT}/include) +link_directories(${DEPEND_LIB_ROOT}/lib) + +include( ExternalProject ) + +ExternalProject_Add(ufs-weather-model + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/ufs-weather-model + GIT_REPOSITORY https://github.com/mark-a-potts/ufs-weather-model.git + GIT_SUBMODULES_RECURSE TRUE + GIT_TAG develop + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ufs-weather-model + INSTALL_DIR ${DEPEND_LIB_ROOT} + CMAKE_ARGS ${UFS_WEATHER_MODEL_ARGS} + CMAKE_ARGS -DCCPP_SUITES=FV3_GFS_v16,FV3_GFS_v16_coupled,FV3_GFS_v15p2 -DREPRO=on -DOPENMP=ON -DINLINE_POST=OFF -DMULTI_GASES=OFF -DMPI=ON -DAPP=${UFS_APP} -DCMAKE_INSTALL_PREFIX=${DEPEND_LIB_ROOT} + INSTALL_COMMAND make install + BUILD_ALWAYS FALSE + ) + +ExternalProject_Add(FMS + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/fms + GIT_REPOSITORY https://github.com/jcsda/FMS.git + GIT_SUBMODULES_RECURSE TRUE + GIT_TAG dev/jcsda + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/fms + INSTALL_DIR ${DEPEND_LIB_ROOT} + CMAKE_ARGS -DGFS_PHYS=ON -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_Fortran_FLAGS="-fPIC" -D64BIT=ON -DOPENMP=ON -DCMAKE_INSTALL_PREFIX=${DEPEND_LIB_ROOT} + INSTALL_COMMAND make install + BUILD_ALWAYS TRUE + ) + +add_dependencies(ufs-weather-model FMS ) +add_library( ufs IMPORTED STATIC) +add_library( FMS::fms_r4 IMPORTED STATIC) +add_library( FMS::fms_r8 IMPORTED STATIC) +add_library( ccpp IMPORTED STATIC) +add_library( stochastic_physics IMPORTED STATIC) +add_library( fv3atm IMPORTED STATIC) +add_library( ccppphys IMPORTED STATIC) +set_target_properties(FMS::fms_r4 PROPERTIES IMPORTED_LOCATION ${DEPEND_LIB_ROOT}/lib/libfms_r4.a) +set_target_properties(FMS::fms_r8 PROPERTIES IMPORTED_LOCATION ${DEPEND_LIB_ROOT}/lib/libfms_r8.a) +set_target_properties(ufs PROPERTIES IMPORTED_LOCATION ${DEPEND_LIB_ROOT}/lib/libufs.a) +set_target_properties(ccpp PROPERTIES IMPORTED_LOCATION ${DEPEND_LIB_ROOT}/lib/libccpp_framework.a) +set_target_properties(stochastic_physics PROPERTIES IMPORTED_LOCATION ${DEPEND_LIB_ROOT}/lib/libstochastic_physics.a) +set_target_properties(fv3atm PROPERTIES IMPORTED_LOCATION ${DEPEND_LIB_ROOT}/lib/libfv3atm.a) +set_target_properties(ccppphys PROPERTIES IMPORTED_LOCATION ${DEPEND_LIB_ROOT}/lib/libccpp_physics.a) + +if(UFS_APP MATCHES "^(S2S)$") + # fv3-jedi and associated repositories + # ------------------------------------ + ecbuild_bundle( PROJECT femps GIT "https://github.com/jcsda-internal/femps.git" BRANCH develop UPDATE ) + ecbuild_bundle( PROJECT fv3-jedi GIT "https://github.com/jcsda-internal/fv3-jedi.git" BRANCH feature/ufs UPDATE ) + ecbuild_bundle( PROJECT gsw GIT "https://github.com/jcsda-internal/GSW-Fortran.git" BRANCH develop UPDATE ) + ecbuild_bundle( PROJECT soca GIT "https://github.com/jcsda-internal/soca.git" BRANCH develop UPDATE ) +elseif(UFS_APP MATCHES "^(NG-GODAS)$") + ecbuild_bundle( PROJECT gsw GIT "https://github.com/jcsda-internal/GSW-Fortran.git" BRANCH develop UPDATE ) + ecbuild_bundle( PROJECT soca GIT "https://github.com/jcsda-internal/soca.git" BRANCH feature/ufs UPDATE ) +elseif(UFS_APP MATCHES "^(ATM)$") + ecbuild_bundle( PROJECT femps GIT "https://github.com/jcsda-internal/femps.git" BRANCH develop UPDATE ) + ecbuild_bundle( PROJECT fv3-jedi GIT "https://github.com/jcsda-internal/fv3-jedi.git" BRANCH feature/ufs UPDATE ) +endif() + + +# ioda, ufo, fv3-jedi and saber test data +#---------------------------------------- + +# If IODA branch is being built set GIT_BRANCH_FUNC to IODA's current branch. +# If a tagged version of IODA is being built set GIT_TAG_FUNC to ioda's current tag. In this case, +# IODA test files will be download from UCAR DASH and ioda-data repo will not be cloned. +# When LOCAL_PATH_JEDI_TESTFILES is set to the directory of IODA test files stored +# in a local directory, ioda-data repo will not be cloned + +find_branch_name(REPO_DIR_NAME ioda) +# When LOCAL_PATH_JEDI_TESTFILES is set to the directory of IODA test files stored +# in a local directory, ioda-data repo will not be cloned +if( NOT DEFINED ENV{LOCAL_PATH_JEDI_TESTFILES} AND NOT DEFINED ${GIT_TAG_FUNC} ) + ecbuild_bundle( PROJECT ioda-data GIT "https://github.com/JCSDA-internal/ioda-data.git" BRANCH develop UPDATE ) +endif() + +# If IODA's current branch is available in ioda-data repo, that branch will be checked out +branch_checkout (REPO_DIR_NAME ioda-data + BRANCH ${GIT_BRANCH_FUNC} ) + +# same procedure for ufo-data +find_branch_name(REPO_DIR_NAME ufo) +if( NOT DEFINED ENV{LOCAL_PATH_JEDI_TESTFILES} AND NOT DEFINED ${GIT_TAG_FUNC} ) + ecbuild_bundle( PROJECT ufo-data GIT "https://github.com/JCSDA-internal/ufo-data.git" BRANCH develop UPDATE ) +endif() + +# If UFO's current branch is available in ufo-data repo, that branch will be checked out +branch_checkout (REPO_DIR_NAME ufo-data + BRANCH ${GIT_BRANCH_FUNC} ) + +# same procedure for fv3-jedi-data +find_branch_name(REPO_DIR_NAME fv3-jedi) +if( NOT DEFINED ENV{LOCAL_PATH_JEDI_TESTFILES} AND NOT DEFINED ${GIT_TAG_FUNC} ) + ecbuild_bundle( PROJECT fv3-jedi-data GIT "https://github.com/JCSDA-internal/fv3-jedi-data.git" BRANCH develop UPDATE ) +endif() + +# If fv3-jedi's current branch is available in fv3-jedi-data repo, that branch will be checked out +branch_checkout (REPO_DIR_NAME fv3-jedi-data + BRANCH ${GIT_BRANCH_FUNC} ) + +# same procedure for saber-data +find_branch_name(REPO_DIR_NAME saber) +if( NOT DEFINED ENV{LOCAL_PATH_JEDI_TESTFILES} AND NOT DEFINED ${GIT_TAG_FUNC} ) + ecbuild_bundle( PROJECT saber-data GIT "https://github.com/JCSDA-internal/saber-data.git" BRANCH develop UPDATE ) +endif() + +# If saber's current branch is available in saber-data repo, that branch will be checked out +branch_checkout (REPO_DIR_NAME saber-data + BRANCH ${GIT_BRANCH_FUNC} ) + +# Build Doxygen documentation +# --------------------------- +option(BUILD_UFSJEDI_BUNDLE_DOC "Build documentation" OFF) +if(BUILD_UFSJEDI_BUNDLE_DOC) + add_subdirectory( Documentation ) +endif() + +ecbuild_bundle_finalize() diff --git a/README.md b/README.md index ffdc443..8735c52 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# ufsjedi-bundle +# ufs-jedi-bundle Bundle for interfacing UFS models with JEDI interfaces