HPCW 3.0
Loading...
Searching...
No Matches
nemo.cmake
Go to the documentation of this file.
1# Copyright (c) 2020 - 2025 David Guibert
2# Copyright (c) 2024 Antoine Morvan
3# All rights reserved.
4#
5# SPDX-License-Identifier: Apache-2.0
6
7option(ENABLE_nemo_bench_orca1_like_small
8 "Enable small nemo test case (BENCH ORCA1 LIKE)" ON)
9option(ENABLE_nemo_orca25_medium "Enable medium nemo test case (ORCA25)" ON)
10
11set(NEMO_BUILD_PARALLEL_LEVEL
12 "${BUILD_PARALLEL_LEVEL}"
13 CACHE STRING "Enable NEMO parallel compilation")
14set(XIOS_BUILD_PARALLEL_LEVEL
15 "${BUILD_PARALLEL_LEVEL}"
16 CACHE STRING "Enable XIOS parallel compilation")
17
18set_property(GLOBAL PROPERTY nemo_can_use_system TRUE)
19if(USE_SYSTEM_nemo)
20 set_property(GLOBAL PROPERTY nemo_depends mpi cdo)
21else()
22 set_property(GLOBAL PROPERTY nemo_depends mpi netcdf xios cdo)
23endif()
24
25set(nemo_cmake_args "" CACHE STRING "Custom CMake arguments for NEMO")
26set(nemo_build_args "" CACHE STRING "Custom makenemo arguments for NEMO")
27
28if(nemo_enabled)
29 if(USE_SYSTEM_nemo)
30 message(STATUS "nemo: enabled (system installed)")
31 find_program(NEMO_EXE nemo.exe REQUIRED)
32 message(STATUS "nemo: ${NEMO_EXE}")
33
34 get_filename_component(NEMO_EXE_DIR "${NEMO_EXE}" DIRECTORY)
35 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NEMO_EXE_DIR}")
36
37 if(ENABLE_nemo_bench_orca1_like_small)
38 ExternalProject_Data_Add(
39 nemo_bench1
40 ${nemo_bench1_revision}
41 CONFIGURE_COMMAND ""
42 BUILD_COMMAND "" #${CMAKE_COMMAND} -E make_directory <BINARY_DIR>/tests/BENCH/EXP00
43 COMMAND
44 ${CMAKE_COMMAND} -E copy_directory
45 <BINARY_DIR>/tests/BENCH/EXPREF
46 <BINARY_DIR>/tests/BENCH/EXP00
47 COMMAND
48 ${CMAKE_COMMAND} -E copy_if_different
49 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg_orca1_like
50 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
51 COMMAND
52 sed -i -e "s@nn_itend[[:space:]]*=[[:space:]]*[0-9]\\+@nn_itend = 10@"
53 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
54 INSTALL_COMMAND "")
55
56 ExternalProject_Get_Property(nemo_bench1 BINARY_DIR)
57 set(NEMO_bench1_DIR ${BINARY_DIR})
58 endif()
59 if(ENABLE_nemo_orca25_medium)
60 ExternalProject_Data_Add(
61 nemo_orca25_medium
62 ${nemo_orca25_revision}
63 CONFIGURE_COMMAND ""
64 BUILD_COMMAND ""
65 COMMAND ${CMAKE_COMMAND} -E make_directory <BINARY_DIR>/orca25-run
66 INSTALL_COMMAND "")
67
68 ExternalProject_Get_Property(nemo_orca25_medium BINARY_DIR)
69 set(NEMO_ORCA25_DIR ${BINARY_DIR})
70
71 endif()
72
73 else()
74 set(NEMO_EXE ./nemo)
75 include(macros)
76 add_library(nemo_deps INTERFACE)
77 target_link_libraries(nemo_deps INTERFACE MPI::MPI_Fortran netcdf::Fortran
78 XIOS::Fortran)
79
80 set(nemo_depends_ep)
81 if(NOT USE_SYSTEM_xios)
82 list(APPEND nemo_depends_ep xios)
83 endif()
84 add_library(nemo_options INTERFACE)
85 target_compile_options(
86 nemo_options
87 INTERFACE $<$<STREQUAL:"${CMAKE_Fortran_COMPILER_ID}","GNU">:-g
88 -fdefault-real-8
89 -O3
90 -funroll-all-loops
91 -fcray-pointer
92 -ffree-line-length-none>
93 $<$<STREQUAL:"${CMAKE_Fortran_COMPILER_ID}","Intel">:-g
94 -xHost
95 -align
96 array64byte
97 -traceback
98 -i4
99 -r8
100 -O3
101 -fp-model
102 precise
103 -fno-alias>)
104
105 add_link_lib(nemo_deps)
106 message(STATUS "nemo link_libs: ${link_libs}")
107 add_inc_dirs(nemo_deps)
108 message(STATUS "nemo inc_dirs: ${inc_dirs}")
109
110 if(ENABLE_nemo_bench_orca1_like_small)
111 ExternalProject_Data_Add(
112 nemo_bench1
113 ${nemo_bench1_revision}
114 DEPENDS nemo_options nemo_deps
115 PATCH_COMMAND ${Patch_EXECUTABLE} -p3 -i
116 ${CMAKE_SOURCE_DIR}/projects/nemo-makenemo.patch
117 COMMAND ${CMAKE_SOURCE_DIR}/bin/patchShebangs <BINARY_DIR> || true
118 CONFIGURE_COMMAND
119 ${CMAKE_COMMAND} ${cmake_params}
120 -DSOURCE_DIR=${PROJECT_SOURCE_DIR}
121 -DBINARY_DIR=${PROJECT_BINARY_DIR}
122 -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
123 -DNEMO_COMPILE_OPTIONS=$<TARGET_PROPERTY:nemo_options,INTERFACE_COMPILE_OPTIONS>
124 -DNEMO_USER_INC=${inc_dirs} -DNEMO_USER_LIB=${link_libs}
125 -DNEMO_ARCH_FCM_FILE=<BINARY_DIR>/arch/arch-X64_hpcw.fcm -P
126 ${CMAKE_SOURCE_DIR}/projects/nemo-configure-files.cmake
127 ${default_cmake_args}
128 ${nemo_cmake_args}
129 # NEMO does not well support parallel compilation by user defined
130 # MAKEFLAGS or by calling 'make -j N' with Cmake --> Apply a patch to
131 # avoid compilation error when compiling in parallel via MAKEFLAGS or
132 # via 'make -j N' by unsetting MAKEFLAGS in makenemo. So by default NEMO
133 # is compiled in sequential
134 #
135 # To enable NEMO parallel compilation, set NEMO_BUILD_PARALLEL_LEVEL to
136 # N with N the number of parallel processes
137 # note: no not pass default build args as this is non standard make
138 BUILD_COMMAND ./makenemo -a BENCH -m X64_hpcw -j
139 ${NEMO_BUILD_PARALLEL_LEVEL} ${nemo_build_args}
140 COMMAND
141 ${CMAKE_COMMAND} -E copy_if_different
142 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg_orca1_like
143 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
144 COMMAND
145 sed -i -e "s@nn_itend[[:space:]]*=[[:space:]]*[0-9]\\+@nn_itend = 10@"
146 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
147 INSTALL_COMMAND "")
148
149 ExternalProject_Get_Property(nemo_bench1 BINARY_DIR)
150 set(NEMO_bench1_DIR ${BINARY_DIR})
151 endif()
152 if(ENABLE_nemo_orca25_medium)
153 ExternalProject_Data_Add(
154 nemo_orca25_medium
155 ${nemo_orca25_revision}
156 DEPENDS nemo_options nemo_deps ${nemo_depends_ep}
157 PATCH_COMMAND ${Patch_EXECUTABLE} -p3 -i
158 ${CMAKE_SOURCE_DIR}/projects/nemo-makenemo.patch
159 COMMAND ${CMAKE_SOURCE_DIR}/bin/patchShebangs <BINARY_DIR> || true
160 CONFIGURE_COMMAND
161 ${CMAKE_COMMAND} ${cmake_params}
162 -DSOURCE_DIR=${PROJECT_SOURCE_DIR}
163 -DBINARY_DIR=${PROJECT_BINARY_DIR}
164 -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
165 -DNEMO_COMPILE_OPTIONS=$<TARGET_PROPERTY:nemo_options,INTERFACE_COMPILE_OPTIONS>
166 -DNEMO_USER_INC=${inc_dirs} -DNEMO_USER_LIB=${link_libs}
167 -DNEMO_ARCH_FCM_FILE=<BINARY_DIR>/arch/arch-X64_hpcw.fcm -P
168 ${CMAKE_SOURCE_DIR}/projects/nemo-configure-files.cmake
169 ${default_cmake_args}
170 ${nemo_cmake_args}
171 # NEMO does not well support parallel compilation by user defined
172 # MAKEFLAGS or by calling 'make -j N' with Cmake --> Apply a patch to
173 # avoid compilation error when compiling in parallel via MAKEFLAGS or
174 # via 'make -j N' by unsetting MAKEFLAGS in makenemo. So by default NEMO
175 # is compiled in sequential
176 #
177 # To enable NEMO parallel compilation, set NEMO_BUILD_PARALLEL_LEVEL to
178 # N with N the number of parallel processes
179 # note: no not pass default build args as this is non standard make
180 BUILD_COMMAND env
181 ./makenemo -m X64_hpcw -n MY_ORCA25 -r ORCA2_ICE_PISCES -j
182 ${NEMO_BUILD_PARALLEL_LEVEL} del_key "key_top" add_key
183 "key_si3 key_iomput key_mpp_mpi key_mpi2" ${nemo_build_args}
184 COMMAND ${CMAKE_COMMAND} -E make_directory <BINARY_DIR>/orca25-run
185 INSTALL_COMMAND "")
186
187 ExternalProject_Get_Property(nemo_orca25_medium BINARY_DIR)
188 set(NEMO_ORCA25_DIR ${BINARY_DIR})
189
190
191 endif()
192 endif()
193
194 if(ENABLE_nemo_bench_orca1_like_small)
195 add_test(
196 NAME nemo-bench-orca1-like-small
197 COMMAND
198 env CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
199 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
200 MPI_C_LIBRARY_VERSION_STRING=${MPI_C_LIBRARY_VERSION_STRING}
201 PATH=$ENV{PATH} $<TARGET_FILE:job_launcher>
202 --name=nemo-bench-orca1-like-small
203 --log-dir=${LOG_DIR}
204 -- ${NEMO_EXE}
205 WORKING_DIRECTORY ${NEMO_bench1_DIR}/tests/BENCH/EXP00)
206 endif()
207
208 if(ENABLE_nemo_orca25_medium)
209 # ln -sf $DATADIR/namelist* . ln -sf $DATADIR/*.xml . ln -sf
210 # $DATADIR/Forcing/* . ln -sf $DATADIR/InitialCondition/* . ln -s $EXE
211 # nemo.exe
212 ExternalData_Add_Test(offline_nemo-orca25-medium
213 NAME nemo-orca25-medium-stage-in
214 COMMAND
215 $<TARGET_FILE:job_launcher> --name=nemo-orca25-medium-stage-in
216 --log-dir=${CMAKE_BINARY_DIR}/logs
217 --
218 $<TARGET_FILE:job_stagein> --strip-components=-1 # keep filename
219 -s DATA{inputs/nemo-orca25/context_nemo.xml} -s
220 DATA{inputs/nemo-orca25/domain_def_nemo.xml} -s
221 DATA{inputs/nemo-orca25/field_def_nemo-ice.xml} -s
222 DATA{inputs/nemo-orca25/field_def_nemo-oce.xml} -s
223 DATA{inputs/nemo-orca25/file_def_nemo-ice.xml} -s
224 DATA{inputs/nemo-orca25/file_def_nemo-oce.xml} -s
225 DATA{inputs/nemo-orca25/Forcing/JRA55_precip_y2000.nc} -s
226 DATA{inputs/nemo-orca25/Forcing/JRA55_q_10_y2000.nc} -s
227 DATA{inputs/nemo-orca25/Forcing/JRA55_rain_y2000.nc} -s
228 DATA{inputs/nemo-orca25/Forcing/JRA55_rlds_y2000.nc} -s
229 DATA{inputs/nemo-orca25/Forcing/JRA55_rsds_y2000.nc} -s
230 DATA{inputs/nemo-orca25/Forcing/JRA55_slp_y2000.nc} -s
231 DATA{inputs/nemo-orca25/Forcing/JRA55_snow_y2000.nc} -s
232 DATA{inputs/nemo-orca25/Forcing/JRA55_t_10_y2000.nc} -s
233 DATA{inputs/nemo-orca25/Forcing/JRA55_u_10_y2000.nc} -s
234 DATA{inputs/nemo-orca25/Forcing/JRA55_v_10_y2000.nc} -s
235 DATA{inputs/nemo-orca25/Forcing/ORCA025_ESACCI_CHLA_bicubic_new.nc} -s
236 DATA{inputs/nemo-orca25/Forcing/ORCA025_JRA55_weights_bicubic.nc} -s
237 DATA{inputs/nemo-orca25/Forcing/ORCA025_JRA55_weights_bilinear.nc} -s
238 DATA{inputs/nemo-orca25/InitialConditions/domain_cfg.nc} -s
239 DATA{inputs/nemo-orca25/InitialConditions/domain_cfg_updated.nc} -s
240 DATA{inputs/nemo-orca25/InitialConditions/domain_cfg_updated_new.nc} -s
241 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_CHLA_bicubic.nc
242} -s
243 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_CHLA_bicubic_new.nc
244} -s
245 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_CHLA_bilinear.nc
246} -s
247 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_weights_bilinear.nc
248} -s
249 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_JRA55_weights_bicubic.nc
250} -s
251 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_JRA55_weights_bilinear.nc
252} -s DATA{inputs/nemo-orca25/InitialConditions/runoff_child.nc} -s
253 DATA{inputs/nemo-orca25/InitialConditions/runoff_clim.nc} -s
254 DATA{inputs/nemo-orca25/InitialConditions/runoff.nc} -s
255 DATA{inputs/nemo-orca25/InitialConditions/WOA13_ORCA025_S_nomask.nc} -s
256 DATA{inputs/nemo-orca25/InitialConditions/WOA13_ORCA025_T_nomask.nc}
257 #-s DATA{inputs/nemo-orca25/InitialConditions/EU/,REGEX:.*} -s
258 #DATA{inputs/nemo-orca25/InitialConditions/EU2/,REGEX:.*} -s
259 #DATA{inputs/nemo-orca25/InitialConditions/EU_small/,REGEX:.*} -s
260 #DATA{inputs/nemo-orca25/InitialConditions/ICE_SVD/,REGEX:.*}
261 -s DATA{inputs/nemo-orca25/grid_def_nemo.xml} -s
262 DATA{inputs/nemo-orca25/iodef.xml} -s
263 DATA{inputs/nemo-orca25/namelist_cfg} -s
264 DATA{inputs/nemo-orca25/namelist_ice_cfg} -s
265 DATA{inputs/nemo-orca25/namelist_ice_ref} -s
266 DATA{inputs/nemo-orca25/namelist_ref}
267 WORKING_DIRECTORY ${NEMO_ORCA25_DIR}/orca25-run)
268 ExternalData_add_target(offline_nemo-orca25-medium)
269 add_dependencies(offline offline_nemo-orca25-medium)
270
271 set_property(
272 TEST nemo-orca25-medium-stage-in
273 APPEND
274 PROPERTY FIXTURES_SETUP nemo-orca25-medium-stage-in-out)
275
276 add_test(
277 NAME nemo-orca25-medium
278 COMMAND
279 env CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
280 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
281 MPI_C_LIBRARY_VERSION_STRING=${MPI_C_LIBRARY_VERSION_STRING}
282 PATH=$ENV{PATH} $<TARGET_FILE:job_launcher> --name=nemo-orca25-medium
283 --log-dir=${LOG_DIR}
284 --
285 ${NEMO_EXE}
286 WORKING_DIRECTORY ${NEMO_ORCA25_DIR}/orca25-run)
287
288 set_property(
289 TEST nemo-orca25-medium
290 APPEND
291 PROPERTY FIXTURES_REQUIRED nemo-orca25-medium-stage-in-out)
292
293 add_test(
294 NAME nemo-orca25-medium-validation
295 COMMAND
296 env LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} PATH=$ENV{PATH}
297 $<TARGET_FILE:job_launcher> --name=nemo-orca25-medium-validation
298 --log-dir=${LOG_DIR}
299 --
300 ${CMAKE_SOURCE_DIR}/validation/nemo.sh
301 WORKING_DIRECTORY ${NEMO_ORCA25_DIR}/orca25-run)
302 set_tests_properties(
303 nemo-orca25-medium-validation PROPERTIES FIXTURES_CLEANUP
304 nemo-orca25-medium-stage-in-out)
305 set_tests_properties(nemo-orca25-medium-validation
306 PROPERTIES DEPENDS nemo-orca25-medium)
307 set_tests_properties(nemo-orca25-medium-validation
308 PROPERTIES FIXTURES_REQUIRED _run-nemo-orca25)
309 set_tests_properties(nemo-orca25-medium PROPERTIES FIXTURES_SETUP
310 _run-nemo-orca25)
311 endif()
312
313endif()