From 37224423f62d9a71922cb6fe9beca1516d9403a4 Mon Sep 17 00:00:00 2001 From: Jiwon Gim <55209567+boulderdaze@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:46:31 -0700 Subject: [PATCH] Update MUSICA index mapping API and CMake script (#208) Originator(s): @boulderdaze Summary (include the keyword ['closes', 'fixes', 'resolves'] and issue number): - Reworked the CMake script for the case where the MUSICA library is linked from the installed version. - Updated MUSICA index mapping API. - Updated Dockerfile for MUSICA. Describe any changes made to the namelist: N/A List all files eliminated and why: Please refer to the `Files changed` tab List all files added and what they do: Please refer to the `Files changed` tab List all existing files that have been modified, and describe the changes: Please refer to the `Files changed` tab List any test failures: N/A Is this a science-changing update? New physics package, algorithm change, tuning changes, etc? No --- schemes/musica/tuvx/musica_ccpp_tuvx.F90 | 6 +- test/CMakeLists.txt | 5 +- test/docker/Dockerfile.musica | 28 ++++-- test/docker/Dockerfile.musica.no_install | 10 +- test/musica/CMakeLists.txt | 122 +++++++++++------------ test/musica/micm/CMakeLists.txt | 7 +- test/musica/tuvx/CMakeLists.txt | 63 ++---------- 7 files changed, 100 insertions(+), 141 deletions(-) diff --git a/schemes/musica/tuvx/musica_ccpp_tuvx.F90 b/schemes/musica/tuvx/musica_ccpp_tuvx.F90 index 293a2905..eaac00dc 100644 --- a/schemes/musica/tuvx/musica_ccpp_tuvx.F90 +++ b/schemes/musica/tuvx/musica_ccpp_tuvx.F90 @@ -133,7 +133,7 @@ subroutine tuvx_init(vertical_layer_dimension, vertical_interface_dimension, & errmsg, errcode) use ccpp_constituent_prop_mod, only: ccpp_constituent_prop_ptr_t use musica_tuvx, only: grid_map_t, profile_map_t, radiator_map_t - use musica_util, only: error_t, configuration_t + use musica_util, only: error_t, configuration_t, MUSICA_INDEX_MAPPINGS_MAP_ANY use musica_ccpp_namelist, only: filename_of_tuvx_micm_mapping_configuration use musica_ccpp_util, only: PI use musica_ccpp_tuvx_height_grid, & @@ -486,8 +486,8 @@ subroutine tuvx_init(vertical_layer_dimension, vertical_interface_dimension, & end if photolysis_rate_constants_mapping => & - index_mappings_t( config, photolysis_rate_constants_ordering, & - micm_rate_parameter_ordering, error ) + index_mappings_t( config, MUSICA_INDEX_MAPPINGS_MAP_ANY, & + photolysis_rate_constants_ordering, micm_rate_parameter_ordering, error ) if (has_error_occurred( error, errmsg, errcode )) then deallocate( tuvx ) tuvx => null() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9ac2d8c0..3ab88891 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.21) project( atmosphericphysics - VERSION 0.0.0 + VERSION 0.1.0 LANGUAGES Fortran C CXX ) @@ -10,6 +10,9 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH};${CMAKE_CURRENT_LIST_DIR}/cmake) set(CMAKE_USER_MAKE_RULES_OVERRIDE ${CMAKE_MODULE_PATH}/SetDefaults.cmake) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + # --------------------------------------------------------------------------------------------- # NOTE: If 'CCPP_ENABLE_MUSICA_TESTS' is enabled, this is no longer a stand-alone CMake project. # The MUSICA CCPP wrapper requires both the MUSICA library and ccpp-framework/src. diff --git a/test/docker/Dockerfile.musica b/test/docker/Dockerfile.musica index dbab331b..8c1dfdcc 100644 --- a/test/docker/Dockerfile.musica +++ b/test/docker/Dockerfile.musica @@ -5,8 +5,9 @@ FROM ubuntu:22.04 -ARG MUSICA_GIT_TAG=326b5119768d5be9654baf96ae3bd6a1b757fdc8 +ARG MUSICA_GIT_TAG=cc39bb00d2220fc81c85b22d3ceea4a39bd2bacf ARG CAM_SIMA_CHEMISTRY_DATA_TAG=ea3539f1d7b71162e8a78d900ecbe265ba870e3d +ARG USE_INSTALLED_MUSICA_LIB=ON ARG BUILD_TYPE=Debug RUN apt update \ @@ -47,30 +48,34 @@ RUN sudo apt update \ ENV FC=mpif90 ENV FFLAGS="-I/usr/include/" -# Install MUSICA (MUSICA-C) +# Install MUSICA RUN git clone https://github.com/NCAR/musica.git \ && cd musica \ && git checkout ${MUSICA_GIT_TAG} \ && cmake -S . -B build \ - -D CMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -D CMAKE_BUILD_TYPE=Release \ -D MUSICA_ENABLE_TESTS=OFF \ - -D MUSICA_BUILD_FORTRAN_INTERFACE=OFF \ - -D MUSICA_ENABLE_MICM=ON \ - -D MUSICA_ENABLE_TUVX=ON \ + -D MUSICA_ENABLE_INSTALL=ON \ + -D MUSICA_BUILD_FORTRAN_INTERFACE=ON \ -D CMAKE_Fortran_COMPILER=mpif90 \ - -D CMAKE_C_COMPILER=mpicc \ -D CMAKE_CXX_COMPILER=mpicxx \ && cd build \ && sudo make install +ENV FFLAGS="${FFLAGS} \ + -I/usr/local/include/micm \ + -I/usr/local/include/musica \ + -I/usr/local/include/musica/micm \ + -I/usr/local/include/musica/tuvx \ + -I/usr/local/include/musica/fortran" + COPY . atmospheric_physics RUN sudo chown -R test_user:test_user atmospheric_physics # Clone the MUSICA chemistry data set repository RUN git clone https://github.com/NCAR/cam-sima-chemistry-data.git \ && cd cam-sima-chemistry-data \ - && git checkout ${CAM_SIMA_CHEMISTRY_DATA_TAG} \ - && mv mechanisms /home/test_user/atmospheric_physics/schemes/musica/configurations + && git checkout ${CAM_SIMA_CHEMISTRY_DATA_TAG} # Make CCPP-framework available before building test RUN cd atmospheric_physics/test \ @@ -90,6 +95,11 @@ RUN cd atmospheric_physics/test \ -D CMAKE_BUILD_TYPE=${BUILD_TYPE} \ -D CCPP_ENABLE_MUSICA_TESTS=ON \ -D CCPP_ENABLE_MEMCHECK=ON \ + -D CMAKE_Fortran_COMPILER=mpif90 \ + -D CMAKE_CXX_COMPILER=mpicxx \ && cmake --build ./build +# Move the MUSICA configuration to the build root to make the data available for testing +RUN mv /home/test_user/cam-sima-chemistry-data/mechanisms /home/test_user/atmospheric_physics/test/build/musica_configurations + WORKDIR /home/test_user/atmospheric_physics/test/build diff --git a/test/docker/Dockerfile.musica.no_install b/test/docker/Dockerfile.musica.no_install index 1a4acd79..6abec992 100644 --- a/test/docker/Dockerfile.musica.no_install +++ b/test/docker/Dockerfile.musica.no_install @@ -8,8 +8,9 @@ FROM ubuntu:22.04 -ARG MUSICA_GIT_TAG=326b5119768d5be9654baf96ae3bd6a1b757fdc8 +ARG MUSICA_GIT_TAG=cc39bb00d2220fc81c85b22d3ceea4a39bd2bacf ARG CAM_SIMA_CHEMISTRY_DATA_TAG=ea3539f1d7b71162e8a78d900ecbe265ba870e3d +ARG USE_INSTALLED_MUSICA_LIB=OFF ARG BUILD_TYPE=Debug RUN apt update \ @@ -49,7 +50,6 @@ RUN sudo apt update \ ENV FC=mpif90 ENV FFLAGS="-I/usr/include/" -ENV MUSICA_GIT_TAG=${MUSICA_GIT_TAG} COPY . atmospheric_physics RUN sudo chown -R test_user:test_user atmospheric_physics @@ -57,8 +57,7 @@ RUN sudo chown -R test_user:test_user atmospheric_physics # Clone the MUSICA chemistry data set repository RUN git clone https://github.com/NCAR/cam-sima-chemistry-data.git \ && cd cam-sima-chemistry-data \ - && git checkout ${CAM_SIMA_CHEMISTRY_DATA_TAG} \ - && mv mechanisms /home/test_user/atmospheric_physics/schemes/musica/configurations + && git checkout ${CAM_SIMA_CHEMISTRY_DATA_TAG} # Make ccpp-framework available before building test RUN cd atmospheric_physics/test \ @@ -80,4 +79,7 @@ RUN cd atmospheric_physics/test \ -D CCPP_ENABLE_MEMCHECK=ON \ && cmake --build ./build +# Move the MUSICA configuration to the build root to make the data available for testing +RUN mv /home/test_user/cam-sima-chemistry-data/mechanisms /home/test_user/atmospheric_physics/test/build/musica_configurations + WORKDIR /home/test_user/atmospheric_physics/test/build diff --git a/test/musica/CMakeLists.txt b/test/musica/CMakeLists.txt index f060ac59..1b3e24ad 100644 --- a/test/musica/CMakeLists.txt +++ b/test/musica/CMakeLists.txt @@ -1,17 +1,52 @@ -include(FetchContent) +# If the MUSICA library is not installed, it will fetch +# the MUSICA repository to build the library +if(NOT $ENV{USE_INSTALLED_MUSICA_LIB}) # Set by docker + include(FetchContent) -FetchContent_Declare(musica - GIT_REPOSITORY https://github.com/NCAR/musica.git - GIT_TAG $ENV{MUSICA_GIT_TAG} # Set by docker + FetchContent_Declare(musica + GIT_REPOSITORY https://github.com/NCAR/musica.git + GIT_TAG $ENV{MUSICA_GIT_TAG} # Set by docker + ) + + set(MUSICA_BUILD_C_CXX_INTERFACE ON) + set(MUSICA_BUILD_FORTRAN_INTERFACE ON) + set(MUSICA_ENABLE_TESTS OFF) + set(MUSICA_ENABLE_INSTALL OFF) + + FetchContent_MakeAvailable(musica) + +else() + if (CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -ffree-line-length-none") + endif() + + link_directories("/usr/local/lib") +endif() + +find_package(Python REQUIRED) + +# Test metadata against the source code +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/metadata_test) +add_custom_target( + copy_metadata_test_files ALL ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/../../schemes/musica/musica_ccpp.meta + ${CMAKE_CURRENT_SOURCE_DIR}/../../schemes/musica/musica_ccpp.F90 + ${CMAKE_BINARY_DIR}/metadata_test ) -message(STATUS "Using MUSICA commit: $ENV{MUSICA_GIT_TAG}") -set(MUSICA_BUILD_C_CXX_INTERFACE ON) -set(MUSICA_BUILD_FORTRAN_INTERFACE ON) -set(MUSICA_ENABLE_TESTS OFF) -set(MUSICA_ENABLE_INSTALL OFF) +add_test( + NAME test_metadata_against_source_code + COMMAND ${Python_EXECUTABLE} ${CMAKE_BINARY_DIR}/../$ENV{CCPP_FORTRAN_TOOLS_PATH}/offline_check_fortran_vs_metadata.py + --directory ${CMAKE_BINARY_DIR}/metadata_test +) -FetchContent_MakeAvailable(musica) +# Test musica scheme metadata against the CCPP standard names +add_test( + NAME test_musica_metadata_against_ccpp_standard_names + COMMAND ${Python_EXECUTABLE} ${CMAKE_BINARY_DIR}/../$ENV{CCPP_STD_NAMES_PATH}/tools/meta_stdname_check.py + --metafile-loc ${CMAKE_BINARY_DIR}/metadata_test/musica_ccpp.meta + --stdname-dict ${CMAKE_BINARY_DIR}/../$ENV{CCPP_STD_NAMES_PATH}/standard_names.xml +) # MUSICA CCPP API test add_executable(test_musica_api test_musica_api.F90 musica_ccpp_namelist.F90) @@ -36,12 +71,7 @@ target_sources(test_musica_api target_link_libraries(test_musica_api PRIVATE - musica::musica-fortran -) - -set_target_properties(test_musica_api - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -52,62 +82,23 @@ add_test( add_memory_check_test(test_musica_api $ "" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) -# copy MUSICA configuration data into the build folder -add_custom_target( - copy_micm_configs ALL ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_CURRENT_SOURCE_DIR}/../../schemes/musica/configurations ${CMAKE_BINARY_DIR}/musica_configurations -) - -add_subdirectory(micm) -add_subdirectory(tuvx) - -# Test metadata against the source code -find_package(Python REQUIRED) - -file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/metadata_test) -add_custom_target( - copy_metadata_test_files ALL ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/../../schemes/musica/musica_ccpp.meta - ${CMAKE_CURRENT_SOURCE_DIR}/../../schemes/musica/musica_ccpp.F90 - ${CMAKE_BINARY_DIR}/metadata_test -) - -add_test( - NAME test_metadata_against_source_code - COMMAND ${Python_EXECUTABLE} ${CMAKE_BINARY_DIR}/../$ENV{CCPP_FORTRAN_TOOLS_PATH}/offline_check_fortran_vs_metadata.py - --directory ${CMAKE_BINARY_DIR}/metadata_test -) - -# Test musica scheme metadata against the CCPP standard names -add_test( - NAME test_musica_metadata_against_ccpp_standard_names - COMMAND ${Python_EXECUTABLE} ${CMAKE_BINARY_DIR}/../$ENV{CCPP_STD_NAMES_PATH}/tools/meta_stdname_check.py - --metafile-loc ${CMAKE_BINARY_DIR}/metadata_test/musica_ccpp.meta - --stdname-dict ${CMAKE_BINARY_DIR}/../$ENV{CCPP_STD_NAMES_PATH}/standard_names.xml -) - # MUSICA species test add_executable(test_musica_species test_musica_species.F90 musica_ccpp_namelist.F90) target_sources(test_musica_species PUBLIC - ${MUSICA_CCPP_SOURCES} - ${TO_BE_CCPPIZED_SRC_PATH}/ccpp_const_utils.F90 - ${TO_BE_CCPPIZED_SRC_PATH}/ccpp_tuvx_utils.F90 - ${CCPP_SRC_PATH}/ccpp_constituent_prop_mod.F90 - ${CCPP_SRC_PATH}/ccpp_hash_table.F90 - ${CCPP_SRC_PATH}/ccpp_hashable.F90 - ${CCPP_TEST_SRC_PATH}/ccpp_kinds.F90 + ${MUSICA_CCPP_SOURCES} + ${TO_BE_CCPPIZED_SRC_PATH}/ccpp_const_utils.F90 + ${TO_BE_CCPPIZED_SRC_PATH}/ccpp_tuvx_utils.F90 + ${CCPP_SRC_PATH}/ccpp_constituent_prop_mod.F90 + ${CCPP_SRC_PATH}/ccpp_hash_table.F90 + ${CCPP_SRC_PATH}/ccpp_hashable.F90 + ${CCPP_TEST_SRC_PATH}/ccpp_kinds.F90 ) target_link_libraries(test_musica_species PRIVATE - musica::musica-fortran -) - -set_target_properties(test_musica_species - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -116,4 +107,7 @@ add_test( WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ) -add_memory_check_test(test_musica_species $ "" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) \ No newline at end of file +add_memory_check_test(test_musica_species $ "" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + +add_subdirectory(micm) +add_subdirectory(tuvx) diff --git a/test/musica/micm/CMakeLists.txt b/test/musica/micm/CMakeLists.txt index 0c1c7853..6a8735be 100644 --- a/test/musica/micm/CMakeLists.txt +++ b/test/musica/micm/CMakeLists.txt @@ -8,12 +8,7 @@ target_sources(test_micm_util target_link_libraries(test_micm_util PRIVATE - musica::musica-fortran -) - -set_target_properties(test_micm_util - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( diff --git a/test/musica/tuvx/CMakeLists.txt b/test/musica/tuvx/CMakeLists.txt index c12d0d57..c8571a9c 100644 --- a/test/musica/tuvx/CMakeLists.txt +++ b/test/musica/tuvx/CMakeLists.txt @@ -10,12 +10,7 @@ target_sources(test_tuvx_height_grid target_link_libraries(test_tuvx_height_grid PRIVATE - musica::musica-fortran -) - -set_target_properties(test_tuvx_height_grid - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -38,12 +33,7 @@ target_sources(test_tuvx_wavelength_grid target_link_libraries(test_tuvx_wavelength_grid PRIVATE - musica::musica-fortran -) - -set_target_properties(test_tuvx_wavelength_grid - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -67,12 +57,7 @@ target_sources(test_tuvx_temperature target_link_libraries(test_tuvx_temperature PRIVATE - musica::musica-fortran -) - -set_target_properties(test_tuvx_temperature - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -96,12 +81,7 @@ target_sources(test_tuvx_surface_albedo target_link_libraries(test_tuvx_surface_albedo PRIVATE - musica::musica-fortran -) - -set_target_properties(test_tuvx_surface_albedo - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -126,12 +106,7 @@ target_sources(test_tuvx_extraterrestrial_flux target_link_libraries(test_tuvx_extraterrestrial_flux PRIVATE - musica-fortran -) - -set_target_properties(test_tuvx_extraterrestrial_flux - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -157,12 +132,7 @@ target_sources(test_tuvx_cloud_optics target_link_libraries(test_tuvx_cloud_optics PRIVATE - musica::musica-fortran -) - -set_target_properties(test_tuvx_cloud_optics - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -187,12 +157,7 @@ target_sources(test_tuvx_aerosol_optics target_link_libraries(test_tuvx_aerosol_optics PRIVATE - musica::musica-fortran -) - -set_target_properties(test_tuvx_aerosol_optics - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -220,12 +185,7 @@ target_sources(test_tuvx_gas_species target_link_libraries(test_tuvx_gas_species PRIVATE - musica::musica-fortran -) - -set_target_properties(test_tuvx_gas_species - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test( @@ -254,12 +214,7 @@ target_sources(test_tuvx_load_species target_link_libraries(test_tuvx_load_species PRIVATE - musica::musica-fortran -) - -set_target_properties(test_tuvx_load_species - PROPERTIES - LINKER_LANGUAGE Fortran + musica-fortran musica yaml-cpp stdc++ netcdff ) add_test(