-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathBuildPDAF.cmake
More file actions
289 lines (236 loc) · 9.27 KB
/
Copy pathBuildPDAF.cmake
File metadata and controls
289 lines (236 loc) · 9.27 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
# PDAF variables
# --------------
# Required packages
# -----------------
# NetCDF is required
# For eCLM-PDAF, NetCDF is not loaded by other component models
find_package(NetCDF REQUIRED)
# Check forPnetCDF if eCLM is defined
if(DEFINED eCLM_SRC)
option(PDAF_WITH_PNETCDF "PDAF: Whether to build with PnetCDF" TRUE)
find_package(PnetCDF REQUIRED)
endif()
# MKL is required (error: https://gitlab.jsc.fz-juelich.de/HPSCTerrSys/tsmp-internal-development-tracking/-/issues/87)
# `find_package`command for oneMKL from https://www.intel.com/content/www/us/en/docs/onemkl/developer-guide-windows/2024-0/cmake-config-for-onemkl.html
# set(MKL_LINK static) # Switching to static MKL libraries
# find_package(MKL CONFIG REQUIRED PATHS $ENV{MKLROOT})
# LAPACK is required
# For eCLM-PDAF, this setting has to be consistent with MKL/LAPACK
# loading in `eCLM/src/clm5/CMakelists.txt`
# https://cmake.org/cmake/help/latest/module/FindLAPACK.html
find_package(LAPACK REQUIRED)
message(STATUS "LAPACK_LIBRARIES: ${LAPACK_LIBRARIES}")
message(STATUS "LAPACK_LINKER_FLAGS: ${LAPACK_LINKER_FLAGS}")
# OpenMP is required
find_package(OpenMP REQUIRED)
# # TODO: Insert CMake-finding of "-lm"
# find_library(M_LIB NAMES m)
# if(M_LIB)
# message(STATUS "M_LIB: ${M_LIB}")
# endif()
# Set PDAF_DEPENDENCIES: component models / OASIS
# -----------------------------------------------
if(DEFINED OASIS_SRC)
list(APPEND PDAF_DEPENDENCIES OASIS3_MCT)
endif()
if(DEFINED eCLM_SRC)
list(APPEND PDAF_DEPENDENCIES eCLM)
endif()
if(DEFINED CLM35_SRC)
list(APPEND PDAF_DEPENDENCIES CLM3_5)
endif()
if(DEFINED PARFLOW_SRC)
list(APPEND PDAF_DEPENDENCIES ParFlow)
endif()
# Set environment header/include file for PDAF-library compilation
# ----------------------------------------------------------------
set(PDAF_ARCH "cmake")
# Set PDAF source directory
# -------------------------
set(PDAF_DIR "${PDAF_SRC}")
# Set PDAF_LINK_LIBS for Makefile header
# --------------------------------------
list(APPEND PDAF_LINK_LIBS "${LAPACK_LIBRARIES}")
list(APPEND PDAF_LINK_LIBS "${LAPACK_LINKER_FLAGS}")
# Explicit libraries named in comments should be handed over by the
# variables. For checking this, search `$BUILD_DIR/CMakeCache.txt`.
list(APPEND PDAF_LINK_LIBS "${MPICH_Fortran_LDFLAGS}") # "-lpthread"
if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel"
OR CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
list(APPEND PDAF_LINK_LIBS "-lmpich")
endif()
list(APPEND PDAF_LINK_LIBS "${OpenMP_Fortran_FLAGS}") # "-qopenmp"
# Use locally set NetCDF libraries variable
list(APPEND PDAF_LINK_LIBS "${NetCDF_LIBRARIES}") # "-lnetcdf", "-lnetcdff"
if(${PDAF_WITH_PNETCDF})
list(APPEND PDAF_LINK_LIBS "${PnetCDF_PDAF_LIBRARIES}") # "-lpnetcdf"
endif()
# list(APPEND PDAF_LINK_LIBS "${NetCDF_F90_STATIC_LDFLAGS}") # "-lnetcdf", "-lnetcdff", "-lpnetcdf", "-lm"
# Join list
list(JOIN PDAF_LINK_LIBS " " PDAF_LINK_LIBS)
# Set PDAF_FOPT for Makefile header
# ----------------------------------
if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel"
OR CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
# using Intel Compiler
if (CMAKE_BUILD_TYPE STREQUAL "RELEASE")
# Release optimization flags
list(APPEND PDAF_FOPT "-O2")
# Adding `-fp-model=source` to avoid precision changes between
# DEBUG and RELEASE simulations
#
# Background, why `source` is chosen over `precise`:
# https://www.intel.com/content/www/us/en/developer/articles/guide/porting-guide-for-ifort-to-ifx.html
list(APPEND PDAF_FOPT "-fp-model=source")
elseif (CMAKE_BUILD_TYPE STREQUAL "DEBUG")
# Debug optimization flags
list(APPEND PDAF_FOPT "-O0")
list(APPEND PDAF_FOPT "-g")
list(APPEND PDAF_FOPT "-traceback")
list(APPEND PDAF_FOPT "-fpe0") # compare eCLM debug flags
# list(APPEND PDAF_FOPT "-check all") # compare eCLM debug flags
else()
message(FATAL_ERROR "Unsupported CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
endif()
list(APPEND PDAF_FOPT "-xHost")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# using GCC (experimental)
if (CMAKE_BUILD_TYPE STREQUAL "RELEASE")
# Release optimization flags
list(APPEND PDAF_FOPT "-O2")
elseif (CMAKE_BUILD_TYPE STREQUAL "DEBUG")
# Debug optimization flags
list(APPEND PDAF_FOPT "-O0")
list(APPEND PDAF_FOPT "-g")
list(APPEND PDAF_FOPT "-fbacktrace")
else()
message(FATAL_ERROR "Unsupported CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
endif()
list(APPEND PDAF_FOPT "-falign-commons")
list(APPEND PDAF_FOPT "-fno-automatic")
list(APPEND PDAF_FOPT "-finit-local-zero")
list(APPEND PDAF_FOPT "-mcmodel=large")
# Flags from eCLM, `Setbuildoptions.cmake:29`
list(APPEND PDAF_FOPT "-fconvert=big-endian")
list(APPEND PDAF_FOPT "-ffree-line-length-none")
list(APPEND PDAF_FOPT "-ffixed-line-length-none")
list(APPEND PDAF_FOPT "-ffree-form")
# list(APPEND PDAF_FOPT "-fopenmp")
list(APPEND PDAF_FOPT "-fallow-argument-mismatch")
list(APPEND PDAF_FOPT "-fcommon")
else()
message(FATAL_ERROR "Unsupported CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
endif()
# Join list
list(JOIN PDAF_FOPT " " PDAF_FOPT)
# Set PDAF_COPT for Makefile header
# ----------------------------------
if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel"
OR CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
# using Intel Compiler
if (CMAKE_BUILD_TYPE STREQUAL "RELEASE")
# Release optimization flags
list(APPEND PDAF_COPT "-O2")
elseif (CMAKE_BUILD_TYPE STREQUAL "DEBUG")
# Debug optimization flags
list(APPEND PDAF_COPT "-O0")
list(APPEND PDAF_COPT "-g")
list(APPEND PDAF_COPT "-traceback")
else()
message(FATAL_ERROR "Unsupported CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
endif()
list(APPEND PDAF_COPT "-xHost")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# using GCC (experimental)
if (CMAKE_BUILD_TYPE STREQUAL "RELEASE")
# Release optimization flags
list(APPEND PDAF_COPT "-O2")
elseif (CMAKE_BUILD_TYPE STREQUAL "DEBUG")
# Debug optimization flags
list(APPEND PDAF_COPT "-O0")
list(APPEND PDAF_COPT "-g")
list(APPEND PDAF_COPT "-fbacktrace")
else()
message(FATAL_ERROR "Unsupported CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
endif()
list(APPEND PDAF_COPT "-falign-commons")
list(APPEND PDAF_COPT "-fno-automatic")
list(APPEND PDAF_COPT "-finit-local-zero")
list(APPEND PDAF_COPT "-mcmodel=large")
list(APPEND PDAF_COPT "-fcommon")
else()
message(FATAL_ERROR "Unsupported CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
endif()
# Join list
list(JOIN PDAF_COPT " " PDAF_COPT)
# Set PDAF_DOUBLEPRECISION for Makefile header
# --------------------------------------------
if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel"
OR CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
list(APPEND PDAF_DOUBLEPRECISION "-r8")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
list(APPEND PDAF_DOUBLEPRECISION "-fdefault-real-8")
else()
message(FATAL_ERROR "Unsupported CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
endif()
# Join list
list(JOIN PDAF_DOUBLEPRECISION " " PDAF_DOUBLEPRECISION)
# Set PDAF_MPI_INC for Makefile header
# ----------------------------------
if(DEFINED MPICH_Fortran_INCLUDEDIR AND NOT MPICH_Fortran_INCLUDEDIR STREQUAL "")
list(APPEND PDAF_MPI_INC "-I${MPICH_Fortran_INCLUDEDIR}")
endif()
# Join list
list(JOIN PDAF_MPI_INC " " PDAF_MPI_INC)
# Set PDAF_CPP_DEFS for Makefile header
# ----------------------------------
# `-DUSE_PDAF` is always needed in the PDAF header file
list(APPEND PDAF_CPP_DEFS "-DUSE_PDAF")
if (CMAKE_BUILD_TYPE STREQUAL "DEBUG")
# For debugging runs, turn on `-DPDAF_DEBUG`
list(APPEND PDAF_CPP_DEFS "-DPDAF_DEBUG")
endif()
# Join list
list(JOIN PDAF_CPP_DEFS " " PDAF_CPP_DEFS)
# Set PDAF_MODULEOPT for Makefile header
# ----------------------------------
# Modules flag dependent on compiler
if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel"
OR CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
list(APPEND PDAF_MODULEOPT "-module")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
list(APPEND PDAF_MODULEOPT "-J")
else()
message(FATAL_ERROR "Unsupported CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
endif()
# Join list
list(JOIN PDAF_MODULEOPT " " PDAF_MODULEOPT)
# Set env vars required by PDAF Makefiles
# ---------------------------------------
list(APPEND PDAF_ENV_VARS PDAF_ARCH=${PDAF_ARCH})
list(APPEND PDAF_ENV_VARS PDAF_DIR=${PDAF_DIR})
list(APPEND PDAF_ENV_VARS TSMPPDAFLINK_LIBS=${PDAF_LINK_LIBS})
list(APPEND PDAF_ENV_VARS TSMPPDAFOPTIM=${PDAF_FOPT}) #backward compatibility
list(APPEND PDAF_ENV_VARS TSMPPDAFFOPT=${PDAF_FOPT})
list(APPEND PDAF_ENV_VARS TSMPPDAFCOPT=${PDAF_COPT})
list(APPEND PDAF_ENV_VARS TSMPPDAFDOUBLEPRECISION=${PDAF_DOUBLEPRECISION})
list(APPEND PDAF_ENV_VARS TSMPPDAFMPI_INC=${PDAF_MPI_INC})
list(APPEND PDAF_ENV_VARS TSMPPDAFCPP_DEFS=${PDAF_CPP_DEFS})
list(APPEND PDAF_ENV_VARS TSMPPDAFMODULEOPT=${PDAF_MODULEOPT})
list(JOIN PDAF_ENV_VARS " " PDAF_ENV_VARS_STR)
# message(STATUS "${PDAF_ENV_VARS_STR}")
# message(WARNING "${PDAF_ENV_VARS_STR}")
# message(FATAL_ERROR "${PDAF_ENV_VARS}")
# # uncomment to force stop CMake @ Configure step
# make pdaf
ExternalProject_Add(PDAF
PREFIX PDAF
SOURCE_DIR ${PDAF_SRC}
BUILD_IN_SOURCE TRUE
CONFIGURE_COMMAND ""
BUILD_COMMAND make ${PDAF_ENV_VARS} clean directories libpdaf
INSTALL_COMMAND ""
DEPENDS ${PDAF_DEPENDENCIES}
)
get_model_version(${PDAF_SRC} PDAF_VERSION)
list(APPEND TSMP2_MODEL_VERSIONS "PDAF: ${PDAF_VERSION}")