Skip to content

Commit

Permalink
Update MUSICA index mapping API and CMake script (#208)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
boulderdaze authored Feb 26, 2025
1 parent 603de70 commit 3722442
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 141 deletions.
6 changes: 3 additions & 3 deletions schemes/musica/tuvx/musica_ccpp_tuvx.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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, &
Expand Down Expand Up @@ -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()
Expand Down
5 changes: 4 additions & 1 deletion test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@ cmake_minimum_required(VERSION 3.21)

project(
atmosphericphysics
VERSION 0.0.0
VERSION 0.1.0
LANGUAGES Fortran C CXX
)

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.
Expand Down
28 changes: 19 additions & 9 deletions test/docker/Dockerfile.musica
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -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 \
Expand All @@ -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
10 changes: 6 additions & 4 deletions test/docker/Dockerfile.musica.no_install
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -49,16 +50,14 @@ 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

# 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 \
Expand All @@ -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
122 changes: 58 additions & 64 deletions test/musica/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -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(
Expand All @@ -52,62 +82,23 @@ add_test(

add_memory_check_test(test_musica_api $<TARGET_FILE: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(
Expand All @@ -116,4 +107,7 @@ add_test(
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
)

add_memory_check_test(test_musica_species $<TARGET_FILE:test_musica_species> "" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
add_memory_check_test(test_musica_species $<TARGET_FILE:test_musica_species> "" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

add_subdirectory(micm)
add_subdirectory(tuvx)
7 changes: 1 addition & 6 deletions test/musica/micm/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Loading

0 comments on commit 3722442

Please sign in to comment.