@@ -6,7 +6,7 @@ project(ccpp_physics
6
6
7
7
#------------------------------------------------------------------------------
8
8
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" )
10
10
11
11
#------------------------------------------------------------------------------
12
12
# Set MPI flags for Fortran with MPI F08 interface
@@ -17,7 +17,7 @@ endif()
17
17
18
18
#------------------------------------------------------------------------------
19
19
# Set OpenMP flags for C/C++/Fortran
20
- if (OPENMP )
20
+ if (OPENMP )
21
21
find_package (OpenMP REQUIRED )
22
22
endif ()
23
23
@@ -51,12 +51,6 @@ else(TYPEDEFS)
51
51
endif (TYPEDEFS )
52
52
list (REMOVE_DUPLICATES TYPEDEFS )
53
53
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
-
60
54
#------------------------------------------------------------------------------
61
55
# Set the sources: physics schemes
62
56
set (SCHEMES $ENV{CCPP_SCHEMES} )
@@ -78,45 +72,40 @@ else(CAPS)
78
72
endif (CAPS )
79
73
list (REMOVE_DUPLICATES CAPS )
80
74
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
-
86
75
#------------------------------------------------------------------------------
87
76
88
77
# 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 )
114
103
115
104
# List of files that need to be compiled with different precision
116
105
set (SCHEMES_DYNAMICS )
117
106
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 )
120
109
endif ()
121
110
122
111
# Remove files that need to be compiled with different precision
@@ -137,55 +126,75 @@ endif()
137
126
138
127
# Assign standard floating point precision flags to all remaining schemes and caps
139
128
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 ()
141
146
142
147
# Lower optimization for certain schemes when compiling with Intel in Release mode
143
148
if (CMAKE_BUILD_TYPE STREQUAL "Release" AND (${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel" OR ${CMAKE_Fortran_COMPILER_ID} STREQUAL "IntelLLVM" ))
144
149
# 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
+ )
149
157
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" )
156
160
endforeach ()
157
161
endif ()
158
162
159
163
# No optimization for certain schemes when compiling with Intel in Release mode
160
164
if (CMAKE_BUILD_TYPE STREQUAL "Release" AND (${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel" OR ${CMAKE_Fortran_COMPILER_ID} STREQUAL "IntelLLVM" ))
161
165
# 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
+ )
163
170
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" )
169
173
endforeach ()
170
174
endif ()
171
175
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
+
172
183
#------------------------------------------------------------------------------
173
184
185
+ set (CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /${CMAKE_INSTALL_INCLUDEDIR} )
186
+
174
187
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 ()
182
188
183
189
set_target_properties (ccpp_physics PROPERTIES VERSION ${PROJECT_VERSION}
184
190
SOVERSION ${PROJECT_VERSION_MAJOR} )
185
191
186
192
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
+ )
188
196
197
+ target_link_libraries (ccpp_physics PRIVATE MPI::MPI_Fortran )
189
198
target_link_libraries (ccpp_physics PUBLIC w3emc::w3emc_d
190
199
sp::sp_d
191
200
NetCDF::NetCDF_Fortran )
@@ -202,6 +211,5 @@ install(EXPORT ccpp_physics-targets
202
211
FILE ccpp_physics-config.cmake
203
212
DESTINATION lib/cmake
204
213
)
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