forked from NOAA-EMC/ufsatm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
325 lines (283 loc) · 9.53 KB
/
CMakeLists.txt
File metadata and controls
325 lines (283 loc) · 9.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
# This is the main CMake file for ufsatm.
#
# Dusan Jovic, Alex Richert, Dustin Swales
cmake_minimum_required(VERSION 3.19)
# Handle user build options.
option(ENABLE_FV3ATM_DOCS "Enable generation of doxygen-based documentation." OFF)
# Determine whether or not to generate documentation.
if(ENABLE_FV3ATM_DOCS)
message(STATUS "We will build the fv3atm doxygen documentation.")
find_package(Doxygen REQUIRED)
add_subdirectory(docs)
endif()
# Enable CI build & unit testing:
if(BUILD_CI_TESTING)
if (FV3)
project(ufsatm_fv3 VERSION 1.0 LANGUAGES C CXX Fortran)
endif()
if (MPAS)
project(ufsatm_mpas VERSION 1.0 LANGUAGES C CXX Fortran)
endif()
include(ci/CMakeLists.txt)
endif()
# Set variables for all dycore build options in UFSATM.
set(DYCORE_TARGET_MPAS ufsatm_mpas)
set(DYCORE_TARGET_FV3 ufsatm_fv3)
###############################################################################
### Dynamical Cores
###############################################################################
# CCPP
set(MPI ON)
add_subdirectory(ccpp)
if(CCPP_32BIT)
add_definitions(-DCCPP_32BIT)
else()
remove_definitions(-DCCPP_32BIT)
endif()
# Pnetcdf
if(NOT PARALLEL_NETCDF)
list(APPEND _ufsatm_defs_private NO_PARALLEL_NETCDF)
endif()
if(ENABLE_PARALLELRESTART)
list(APPEND _ufsatm_defs_private ENABLE_PARALLELRESTART)
endif()
# Inline
if(CDEPS_INLINE)
add_definitions(-DCDEPS_INLINE)
endif()
if(ENABLE_RRFS_WAR)
list(APPEND _ufsatm_defs_private ENABLE_RRFS_WAR)
endif()
if(BUILD_CI_TESTING)
include(CTest)
add_subdirectory(tests)
endif()
# Not used yet by MPAS in UFSATM, but needed by ufsatm_cap.F90 to work.
list(APPEND coupling_srcs
cpl/module_block_data.F90
cpl/module_cplfields.F90
cpl/module_cap_cpl.F90
cpl/module_cplscalars.F90)
list(APPEND io_srcs
io/module_write_netcdf.F90
io/module_write_restart_netcdf.F90
io/module_fv3_io_def.F90
io/module_write_internal_state.F90
io/module_wrt_grid_comp.F90)
# Eventually these could be shared by MPAS, and merged with {io_srcs} list.
list(APPEND fv3_io_srcs
io/fv3atm_common_io.F90
io/fv3atm_clm_lake_io.F90
io/fv3atm_rrfs_sd_io.F90
io/fv3atm_sfc_io.F90
io/fv3atm_oro_io.F90
io/fv3atm_history_io.F90
io/fv3atm_restart_io.F90)
###############################################################################
### UFSATM with FV3 dynamical core
###############################################################################
if (FV3)
add_definitions(-DFV3)
set(DYCORE_TARGET ${DYCORE_TARGET_FV3}
CACHE INTERNAL "DYCORE_TARGET Options: fv3atm")
set(DYCORE_TARGET_CAP_MOD ufsatm_cap_mod PARENT_SCOPE)
# These ifdefs need to be turned ON in the dycore.
set(use_WRTCOMP ON)
set(GFS_PHYS ON)
set(GFS_TYPES ON)
set(USE_GFSL63 ON)
if(MOVING_NEST)
set(MOVING_NEST ON)
endif()
if(HYDRO)
set(HYDRO ON)
endif()
add_subdirectory(fv3/atmos_cubed_sphere)
target_compile_definitions(fv3 PRIVATE BYPASS_BREED_SLP_INLINE)
if(INLINE_POST)
set(BUILD_POSTEXEC OFF)
find_package(crtm REQUIRED)
if (TARGET crtm)
add_library(crtm::crtm ALIAS crtm)
endif()
add_subdirectory(upp)
set(POST_SRC io/post_nems_routines.F90 io/post_fv3.F90)
list(APPEND _ufsatm_defs_private INLINE_POST)
endif()
if(MOVING_NEST)
list(APPEND _ufsatm_defs_private MOVING_NEST)
if(NOT HYDRO)
list(APPEND _ufsatm_defs_private MOIST_CAPPA USE_COND)
endif()
if(DEBUG)
list(APPEND _ufsatm_defs_private DEBUG)
endif()
if(GFS_PHYS)
list(APPEND _ufsatm_defs_private GFS_PHYS)
endif()
if(GFS_TYPES)
list(APPEND _ufsatm_defs_private GFS_TYPES)
endif()
if(USE_GFSL63)
list(APPEND _ufsatm_defs_private USE_GFSL63)
endif()
if(INTERNAL_FILE_NML)
list(APPEND _ufsatm_defs_private INTERNAL_FILE_NML)
endif()
if(ENABLE_QUAD_PRECISION)
list(APPEND _ufsatm_defs_private ENABLE_QUAD_PRECISION)
endif()
if(32BIT)
list(APPEND _ufsatm_defs_private OVERLOAD_R4 OVERLOAD_R8)
endif()
list(APPEND moving_nest_srcs
fv3/moving_nest/bounding_box.F90
fv3/moving_nest/fv_tracker.F90
fv3/moving_nest/fv_moving_nest.F90
fv3/moving_nest/fv_moving_nest_main.F90
fv3/moving_nest/fv_moving_nest_physics.F90
fv3/moving_nest/fv_moving_nest_types.F90
fv3/moving_nest/fv_moving_nest_utils.F90
)
else()
list(APPEND moving_nest_srcs "")
endif()
# Inline
if(CDEPS_INLINE)
list(APPEND cdeps_inline_srcs cpl/module_cdeps_inline.F90)
else()
list(APPEND cdeps_inline_srcs "")
endif()
# FV3 drivers and dependencies
add_library(${DYCORE_TARGET}
ufsatm_cap.F90
ufsatm_util.F90
fv3/atmos_model.F90
fv3/module_fv3_config.F90
fv3/module_fcst_grid_comp.F90
fv3/stochastic_physics/stochastic_physics_wrapper.F90
${coupling_srcs}
${fv3_io_srcs}
${io_srcs}
${moving_nest_srcs}
${cdeps_inline_srcs}
${POST_SRC}
)
add_dependencies(${DYCORE_TARGET} fv3 fv3ccpp stochastic_physics)
if(CDEPS_INLINE)
add_dependencies(${DYCORE_TARGET} cdeps::cdeps)
endif()
list(APPEND _ufsatm_defs_private GFS_PHYS
INTERNAL_FILE_NML
use_WRTCOMP)
else()
remove_definitions(-DFV3)
endif()
###############################################################################
### UFSATM with MPAS dynamical core.
###############################################################################
if (MPAS)
add_definitions(-DMPAS)
set(DYCORE_TARGET ${DYCORE_TARGET_MPAS})
# Include MPAS Cmake tools.
include(${CMAKE_CURRENT_SOURCE_DIR}/mpas/MPAS-Model/cmake/Functions/MPAS_Functions.cmake)
# Set any pre-processor directive needed in MPAS dycore.
get_mpas_version(MPAS_VERSION)
set(MPAS_ALL_CORES atmosphere)
set(MPAS_CORES atmosphere CACHE STRING "MPAS cores to build. Options: ${MPAS_ALL_CORES}")
if(MPAS_CORES MATCHES " ") #Convert strings separated with spaces to CMake list separated with ';'
string(REPLACE " " ";" MPAS_CORES ${MPAS_CORES})
set(MPAS_CORES ${MPAS_CORES} CACHE STRING "MPAS cores to build. Options: ${MPAS_ALL_CORES}" FORCE)
endif()
set(MPAS_CAM_DYCORE TRUE)
set(MPAS_USE_PIO TRUE)
add_definitions(-DMPAS_USE_MPI_F08)
add_definitions(-DMPAS_PIO_SUPPORT)
add_definitions(-DMPAS_CAM_DYCORE)
add_definitions(-DMPAS_UFS_DYCORE)
add_definitions(-DSINGLE_PRECISION)
# Source files for MPAS dynamical core drivers.
set(MPAS_MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/mpas/MPAS-Model/src/driver/mpas.F)
set(MPAS_SUBDRIVER_SRC ${CMAKE_CURRENT_SOURCE_DIR}/mpas/MPAS-Model/src/driver/mpas_subdriver.F)
# MPAS dynamical core
add_subdirectory(mpas)
# MPAS drivers and dependencies
add_library(${DYCORE_TARGET}
ufsatm_cap.F90
ufsatm_util.F90
mpas/atmos_model.F90
mpas/module_mpas_config.F90
mpas/module_fcst_grid_comp.F90
mpas/atmos_coupling.F90
mpas/ufs_mpas_subdriver.F90
${coupling_srcs}
${io_srcs}
ccpp/data/MPAS_typedefs.F90
ccpp/driver/MPAS_init.F90
)
add_dependencies(${DYCORE_TARGET} mpas mpasccpp)
if(NOT MPAS_GIT_VERSION)
find_package(Git QUIET)
if(GIT_FOUND)
execute_process(COMMAND ${GIT_EXECUTABLE} describe --dirty
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/mpas/MPAS-Model"
OUTPUT_VARIABLE _mpas_git_version
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
else()
set(_mpas_git_version "Unknown")
endif()
set(MPAS_GIT_VERSION ${_mpas_git_version} CACHE STRING "MPAS-Model git version")
message(STATUS "Setting MPAS_GIT_VERSION ${_mpas_git_version}")
endif()
else()
remove_definitions(-DMPAS)
endif()
###############################################################################
### Link libraries
###############################################################################
# set target properties
target_compile_definitions(${DYCORE_TARGET} PRIVATE "${_ufsatm_defs_private}")
set_target_properties(${DYCORE_TARGET} PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod)
target_include_directories(${DYCORE_TARGET} INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/mod>
$<INSTALL_INTERFACE:mod>)
# link target
if (FV3)
target_link_libraries(${DYCORE_TARGET} PUBLIC fv3
fv3ccpp
stochastic_physics
fms)
if(UFS_TRACING)
target_link_libraries(${DYCORE_TARGET} PUBLIC ufs_tracing)
endif()
if(INLINE_POST)
target_link_libraries(${DYCORE_TARGET} PUBLIC upp::upp)
endif()
if(CDEPS_INLINE)
target_link_libraries(${DYCORE_TARGET} PUBLIC cdeps::cdeps)
endif()
endif()
if (MPAS)
target_link_libraries(${DYCORE_TARGET} PUBLIC mpas
mpasccpp
fms)
endif()
# Always include EMC libraries in dycore install
target_link_libraries(${DYCORE_TARGET} PUBLIC w3emc::w3emc_d
sp::sp_d
bacio::bacio_4
ESMF::ESMF)
# OpenMP
if(OPENMP)
target_link_libraries(${DYCORE_TARGET} PUBLIC OpenMP::OpenMP_Fortran)
endif()
###############################################################################
### Install UFSATM
###############################################################################
install(
TARGETS ${DYCORE_TARGET}
EXPORT ufsatm-config
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod DESTINATION ${CMAKE_INSTALL_PREFIX})
install(EXPORT ufsatm-config
DESTINATION lib/cmake)