Skip to content

Commit 06ad5e0

Browse files
committed
Update cmake build to support NEPTUNE cmake (aka use modern cmake and fix OpenMP bugs) (#6)
Update CMakeLists.txt to: - Bring in updates from NCAR ccpp-physics main as needed and update CMakeLists.txt to modern cmake version 3 - Support NEPTUNE cmake build while retaining compatibility with UFS/SCM - Fix existing bugs for assigning compilation flags: OpenMP on/off wasn't handled correctly, some schemes had host model flags applied twice. Fixing the OpenMP flags triggered an error in the OpenMP-on build in NEPTUNE that this PR fixes
1 parent 0f1b726 commit 06ad5e0

File tree

1 file changed

+76
-68
lines changed

1 file changed

+76
-68
lines changed

CMakeLists.txt

Lines changed: 76 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ project(ccpp_physics
66

77
#------------------------------------------------------------------------------
88
set(PACKAGE "ccpp-physics")
9-
set(AUTHORS "Grant Firl" "Dustin Swales" "Man Zhang" "Mike Kavulich" )
9+
set(AUTHORS "Grant Firl" "Dustin Swales" "Dom Heinzeller" "Man Zhang" "Mike Kavulich")
1010

1111
#------------------------------------------------------------------------------
1212
# Set MPI flags for Fortran with MPI F08 interface
@@ -17,7 +17,7 @@ endif()
1717

1818
#------------------------------------------------------------------------------
1919
# Set OpenMP flags for C/C++/Fortran
20-
if (OPENMP)
20+
if(OPENMP)
2121
find_package(OpenMP REQUIRED)
2222
endif()
2323

@@ -51,12 +51,6 @@ else(TYPEDEFS)
5151
endif(TYPEDEFS)
5252
list(REMOVE_DUPLICATES TYPEDEFS)
5353

54-
# Generate list of Fortran modules from the CCPP type
55-
# definitions that need need to be installed
56-
foreach(typedef_module ${TYPEDEFS})
57-
list(APPEND MODULES_F90 ${CMAKE_CURRENT_BINARY_DIR}/${typedef_module})
58-
endforeach()
59-
6054
#------------------------------------------------------------------------------
6155
# Set the sources: physics schemes
6256
set(SCHEMES $ENV{CCPP_SCHEMES})
@@ -78,45 +72,40 @@ else(CAPS)
7872
endif(CAPS)
7973
list(REMOVE_DUPLICATES CAPS)
8074

81-
# Schemes and caps from the CCPP code generator use full paths with symlinks
82-
# resolved, we need to do the same here for the below logic to work
83-
get_filename_component(FULL_PATH_TO_CMAKELISTS CMakeLists.txt REALPATH BASE_DIR ${LOCAL_CURRENT_SOURCE_DIR})
84-
get_filename_component(LOCAL_CURRENT_SOURCE_DIR ${FULL_PATH_TO_CMAKELISTS} DIRECTORY)
85-
8675
#------------------------------------------------------------------------------
8776

8877
# List of files that need to be compiled without OpenMP
89-
set(SCHEMES_OPENMP_OFF ${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_gas_optics.F90
90-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_rrtmgp_constants.F90
91-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_gas_concentrations.F90
92-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_rrtmgp_util_string.F90
93-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/kernels/mo_gas_optics_kernels.F90
94-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_gas_optics_rrtmgp.F90
95-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_rrtmgp_clr_all_sky.F90
96-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_fluxes_byband.F90
97-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/solar_variability/mo_solar_variability.F90
98-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_heating_rates.F90
99-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_fluxes_bygpoint.F90
100-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_compute_bc.F90
101-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/cloud_optics/mo_cloud_sampling.F90
102-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/cloud_optics/mo_cloud_optics.F90
103-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_config.F90
104-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_source_functions.F90
105-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_sw.F90
106-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_fluxes.F90
107-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_lw.F90
108-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_util_array.F90
109-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/kernels/mo_rte_solver_kernels.F90
110-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/kernels/mo_optical_props_kernels.F90
111-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/kernels/mo_fluxes_broadband_kernels.F90
112-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_kind.F90
113-
${LOCAL_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_optical_props.F90)
78+
set(SCHEMES_OPENMP_OFF ${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_gas_optics.F90
79+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_rrtmgp_constants.F90
80+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_gas_concentrations.F90
81+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_rrtmgp_util_string.F90
82+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/kernels/mo_gas_optics_kernels.F90
83+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rrtmgp/mo_gas_optics_rrtmgp.F90
84+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_rrtmgp_clr_all_sky.F90
85+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_fluxes_byband.F90
86+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/solar_variability/mo_solar_variability.F90
87+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_heating_rates.F90
88+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_fluxes_bygpoint.F90
89+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/mo_compute_bc.F90
90+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/cloud_optics/mo_cloud_sampling.F90
91+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/extensions/cloud_optics/mo_cloud_optics.F90
92+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_config.F90
93+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_source_functions.F90
94+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_sw.F90
95+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_fluxes.F90
96+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_lw.F90
97+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_util_array.F90
98+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/kernels/mo_rte_solver_kernels.F90
99+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/kernels/mo_optical_props_kernels.F90
100+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/kernels/mo_fluxes_broadband_kernels.F90
101+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_rte_kind.F90
102+
${CMAKE_CURRENT_SOURCE_DIR}/physics/Radiation/RRTMGP/rte-rrtmgp/rte/mo_optical_props.F90)
114103

115104
# List of files that need to be compiled with different precision
116105
set(SCHEMES_DYNAMICS)
117106

118-
if(${LOCAL_CURRENT_SOURCE_DIR}/physics/MP/GFDL/fv_sat_adj.F90 IN_LIST SCHEMES)
119-
list(APPEND SCHEMES_DYNAMICS ${LOCAL_CURRENT_SOURCE_DIR}/physics/MP/GFDL/fv_sat_adj.F90)
107+
if(${CMAKE_CURRENT_SOURCE_DIR}/physics/MP/GFDL/fv_sat_adj.F90 IN_LIST SCHEMES)
108+
list(APPEND SCHEMES_DYNAMICS ${CMAKE_CURRENT_SOURCE_DIR}/physics/MP/GFDL/fv_sat_adj.F90)
120109
endif()
121110

122111
# Remove files that need to be compiled with different precision
@@ -137,55 +126,75 @@ endif()
137126

138127
# Assign standard floating point precision flags to all remaining schemes and caps
139128
SET_PROPERTY(SOURCE ${SCHEMES} ${CAPS}
140-
APPEND_STRING PROPERTY COMPILE_FLAGS " ${CMAKE_Fortran_FLAGS_PHYSICS} ${OpenMP_Fortran_FLAGS}")
129+
APPEND_STRING PROPERTY COMPILE_FLAGS " ${CMAKE_Fortran_FLAGS_PHYSICS}")
130+
131+
if(OPENMP)
132+
# Compile all remaining schemes and caps with OpenMP flags
133+
SET_PROPERTY(SOURCE ${SCHEMES} ${CAPS}
134+
APPEND_STRING PROPERTY COMPILE_FLAGS "${OpenMP_Fortran_FLAGS}")
135+
endif()
136+
137+
# For CAPS, remove bounds checks with Intel Classic (ifort), Intel LLVM (ifx),
138+
# and GNU (gfortran) to avoid the compilation being killed or taking forever
139+
if (${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel" OR ${CMAKE_Fortran_COMPILER_ID} STREQUAL "IntelLLVM")
140+
set_PROPERTY(SOURCE ${CAPS}
141+
APPEND_STRING PROPERTY COMPILE_FLAGS "-check nobounds")
142+
elseif(${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU")
143+
set_PROPERTY(SOURCE ${CAPS}
144+
APPEND_STRING PROPERTY COMPILE_FLAGS "-fcheck=no-bounds")
145+
endif()
141146

142147
# Lower optimization for certain schemes when compiling with Intel in Release mode
143148
if(CMAKE_BUILD_TYPE STREQUAL "Release" AND (${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel" OR ${CMAKE_Fortran_COMPILER_ID} STREQUAL "IntelLLVM"))
144149
# Define a list of schemes that need lower optimization with Intel in Release mode
145-
set(SCHEME_NAMES_LOWER_OPTIMIZATION module_sf_mynn.F90
146-
module_mp_nssl_2mom.F90
147-
mynnedmf_wrapper.F90
148-
gcycle.F90)
150+
set(SCHEME_NAMES_LOWER_OPTIMIZATION
151+
${CMAKE_CURRENT_SOURCE_DIR}/physics/module_sf_mynn.F90
152+
${CMAKE_CURRENT_SOURCE_DIR}/physics/mynnedmf_wrapper.F90
153+
${CMAKE_CURRENT_SOURCE_DIR}/physics/gcycle.F90
154+
${CMAKE_CURRENT_SOURCE_DIR}/physics/module_mp_nssl_2mom.F90
155+
${CMAKE_CURRENT_SOURCE_DIR}/physics/rte-rrtmgp/rrtmgp/kernels/mo_gas_optics_kernels.F90
156+
)
149157
foreach(SCHEME_NAME IN LISTS SCHEME_NAMES_LOWER_OPTIMIZATION)
150-
set(SCHEMES_TMP ${SCHEMES})
151-
# Need to determine the name of the scheme with its path
152-
list(FILTER SCHEMES_TMP INCLUDE REGEX ".*${SCHEME_NAME}$")
153-
SET_SOURCE_FILES_PROPERTIES(${SCHEMES_TMP}
154-
APPEND_STRING PROPERTY COMPILE_FLAGS
155-
" ${CMAKE_Fortran_FLAGS_PHYSICS} ${OpenMP_Fortran_FLAGS} -O1")
158+
SET_SOURCE_FILES_PROPERTIES(${SCHEME_NAME}
159+
APPEND_STRING PROPERTY COMPILE_FLAGS "-O1")
156160
endforeach()
157161
endif()
158162

159163
# No optimization for certain schemes when compiling with Intel in Release mode
160164
if(CMAKE_BUILD_TYPE STREQUAL "Release" AND (${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel" OR ${CMAKE_Fortran_COMPILER_ID} STREQUAL "IntelLLVM"))
161165
# Define a list of schemes that can't be optimized with Intel in Release mode
162-
set(SCHEME_NAMES_NO_OPTIMIZATION GFS_typedefs.F90)
166+
set(SCHEME_NAMES_NO_OPTIMIZATION
167+
${CMAKE_CURRENT_SOURCE_DIR}/physics/aerinterp.F90
168+
${CMAKE_CURRENT_SOURCE_DIR}/physics/GFS_typedefs.F90
169+
)
163170
foreach(SCHEME_NAME IN LISTS SCHEME_NAMES_NO_OPTIMIZATION)
164-
set(SCHEMES_TMP ${SCHEMES})
165-
# Need to determine the name of the scheme with its path
166-
list(FILTER SCHEMES_TMP INCLUDE REGEX ".*${SCHEME_NAME}$")
167-
SET_SOURCE_FILES_PROPERTIES(${SCHEMES_TMP}
168-
APPEND_STRING PROPERTY COMPILE_FLAGS " ${CMAKE_Fortran_FLAGS_PHYSICS} ${OpenMP_Fortran_FLAGS} -O0")
171+
SET_SOURCE_FILES_PROPERTIES(${SCHEME_NAME}
172+
APPEND_STRING PROPERTY COMPILE_FLAGS "-O0")
169173
endforeach()
170174
endif()
171175

176+
if(${CMAKE_CURRENT_SOURCE_DIR}/physics/mersenne_twister.f IN_LIST SCHEMES)
177+
if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU")
178+
SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/physics/mersenne_twister.f
179+
APPEND_STRING PROPERTY COMPILE_FLAGS " -fno-range-check")
180+
endif()
181+
endif()
182+
172183
#------------------------------------------------------------------------------
173184

185+
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR})
186+
174187
add_library(ccpp_physics STATIC ${SCHEMES} ${SCHEMES_OPENMP_OFF} ${SCHEMES_DYNAMICS} ${CAPS})
175-
# Generate list of Fortran modules from defined sources
176-
foreach(source_f90 ${CAPS})
177-
get_filename_component(tmp_source_f90 ${source_f90} NAME)
178-
string(REGEX REPLACE ".F90" ".mod" tmp_module_f90 ${tmp_source_f90})
179-
string(TOLOWER ${tmp_module_f90} module_f90)
180-
list(APPEND MODULES_F90 ${CMAKE_CURRENT_BINARY_DIR}/${module_f90})
181-
endforeach()
182188

183189
set_target_properties(ccpp_physics PROPERTIES VERSION ${PROJECT_VERSION}
184190
SOVERSION ${PROJECT_VERSION_MAJOR})
185191

186192
target_include_directories(ccpp_physics PUBLIC
187-
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
193+
INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}>
194+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
195+
)
188196

197+
target_link_libraries(ccpp_physics PRIVATE MPI::MPI_Fortran)
189198
target_link_libraries(ccpp_physics PUBLIC w3emc::w3emc_d
190199
sp::sp_d
191200
NetCDF::NetCDF_Fortran)
@@ -202,6 +211,5 @@ install(EXPORT ccpp_physics-targets
202211
FILE ccpp_physics-config.cmake
203212
DESTINATION lib/cmake
204213
)
205-
# Define where to install the C headers and Fortran modules
206-
#install(FILES ${HEADERS_C} DESTINATION include)
207-
install(FILES ${MODULES_F90} DESTINATION include)
214+
215+
install(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

0 commit comments

Comments
 (0)