1# Copyright (c) 2020 - 2025 David Guibert
2# Copyright (c) 2024 Antoine Morvan
3# Copyright (c) 2025 Niclas Schroeter
6# SPDX-License-Identifier: Apache-2.0
8option(ENABLE_nemo_bench_orca1_like_small
9 "Enable small nemo test case (BENCH ORCA1 LIKE)" ON)
10option(ENABLE_nemo_orca25_medium "Enable medium nemo test case (ORCA25)" ON)
12set(NEMO_BUILD_PARALLEL_LEVEL
13 "${BUILD_PARALLEL_LEVEL}"
14 CACHE STRING "Enable NEMO parallel compilation")
15set(XIOS_BUILD_PARALLEL_LEVEL
16 "${BUILD_PARALLEL_LEVEL}"
17 CACHE STRING "Enable XIOS parallel compilation")
19set_property(GLOBAL PROPERTY nemo_can_use_system TRUE)
21 set_property(GLOBAL PROPERTY nemo_depends mpi cdo)
23 set_property(GLOBAL PROPERTY nemo_depends mpi netcdf xios cdo)
26set(nemo_cmake_args "" CACHE STRING "Custom CMake arguments for NEMO")
27set(nemo_build_args "" CACHE STRING "Custom makenemo arguments for NEMO")
31 message(STATUS "nemo: enabled (system installed)")
32 find_program(NEMO_EXE nemo.exe REQUIRED)
33 message(STATUS "nemo: ${NEMO_EXE}")
35 get_filename_component(NEMO_EXE_DIR "${NEMO_EXE}" DIRECTORY)
36 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NEMO_EXE_DIR}")
38 if(ENABLE_nemo_bench_orca1_like_small)
39 ExternalProject_Data_Add(
41 ${nemo_bench1_revision}
43 BUILD_COMMAND "" #${CMAKE_COMMAND} -E make_directory <BINARY_DIR>/tests/BENCH/EXP00
45 ${CMAKE_COMMAND} -E copy_directory
46 <BINARY_DIR>/tests/BENCH/EXPREF
47 <BINARY_DIR>/tests/BENCH/EXP00
49 ${CMAKE_COMMAND} -E copy_if_different
50 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg_orca1_like
51 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
53 sed -i -e "s@nn_itend[[:space:]]*=[[:space:]]*[0-9]\\+@nn_itend = 10@"
54 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
57 ExternalProject_Get_Property(nemo_bench1 BINARY_DIR)
58 set(NEMO_bench1_DIR ${BINARY_DIR})
60 if(ENABLE_nemo_orca25_medium)
61 ExternalProject_Data_Add(
63 ${nemo_orca25_revision}
66 COMMAND ${CMAKE_COMMAND} -E make_directory <BINARY_DIR>/orca25-run
69 ExternalProject_Get_Property(nemo_orca25_medium BINARY_DIR)
70 set(NEMO_ORCA25_DIR ${BINARY_DIR})
77 add_library(nemo_deps INTERFACE)
78 target_link_libraries(nemo_deps INTERFACE MPI::MPI_Fortran netcdf::Fortran
82 if(NOT USE_SYSTEM_xios)
83 list(APPEND nemo_depends_ep xios)
85 add_library(nemo_options INTERFACE)
86 target_compile_options(
88 INTERFACE $<$<STREQUAL:"${CMAKE_Fortran_COMPILER_ID}","GNU">:-g
93 -ffree-line-length-none>
94 $<$<STREQUAL:"${CMAKE_Fortran_COMPILER_ID}","Intel">:-g
106 add_link_lib(nemo_deps)
107 message(STATUS "nemo link_libs: ${link_libs}")
108 add_inc_dirs(nemo_deps)
109 message(STATUS "nemo inc_dirs: ${inc_dirs}")
111 if(ENABLE_nemo_bench_orca1_like_small)
112 ExternalProject_Data_Add(
114 ${nemo_bench1_revision}
115 DEPENDS nemo_options nemo_deps
116 PATCH_COMMAND ${Patch_EXECUTABLE} -p3 -i
117 ${CMAKE_SOURCE_DIR}/projects/nemo_makenemo.patch
118 COMMAND ${CMAKE_SOURCE_DIR}/bin/patchShebangs <BINARY_DIR> || true
120 ${CMAKE_COMMAND} ${cmake_params}
121 -DSOURCE_DIR=${PROJECT_SOURCE_DIR}
122 -DBINARY_DIR=${PROJECT_BINARY_DIR}
123 -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
124 -DNEMO_COMPILE_OPTIONS=$<TARGET_PROPERTY:nemo_options,INTERFACE_COMPILE_OPTIONS>
125 -DNEMO_USER_INC=${inc_dirs} -DNEMO_USER_LIB=${link_libs}
126 -DNEMO_ARCH_FCM_FILE=<BINARY_DIR>/arch/arch-X64_hpcw.fcm -P
127 ${CMAKE_SOURCE_DIR}/projects/nemo-configure-files.cmake
128 ${default_cmake_args}
130 # NEMO does not well support parallel compilation by user defined
131 # MAKEFLAGS or by calling 'make -j N' with Cmake --> Apply a patch to
132 # avoid compilation error when compiling in parallel via MAKEFLAGS or
133 # via 'make -j N' by unsetting MAKEFLAGS in makenemo. So by default NEMO
134 # is compiled in sequential
136 # To enable NEMO parallel compilation, set NEMO_BUILD_PARALLEL_LEVEL to
137 # N with N the number of parallel processes
138 # note: no not pass default build args as this is non standard make
139 BUILD_COMMAND ./makenemo -a BENCH -m X64_hpcw -j
140 ${NEMO_BUILD_PARALLEL_LEVEL} ${nemo_build_args}
142 ${CMAKE_COMMAND} -E copy_if_different
143 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg_orca1_like
144 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
146 sed -i -e "s@nn_itend[[:space:]]*=[[:space:]]*[0-9]\\+@nn_itend = 10@"
147 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
150 ExternalProject_Get_Property(nemo_bench1 BINARY_DIR)
151 set(NEMO_bench1_DIR ${BINARY_DIR})
153 if(ENABLE_nemo_orca25_medium)
154 ExternalProject_Data_Add(
156 ${nemo_orca25_revision}
157 DEPENDS nemo_options nemo_deps ${nemo_depends_ep}
158 PATCH_COMMAND ${Patch_EXECUTABLE} -p3 -i
159 ${CMAKE_SOURCE_DIR}/projects/nemo_makenemo.patch
160 COMMAND ${CMAKE_SOURCE_DIR}/bin/patchShebangs <BINARY_DIR> || true
162 ${CMAKE_COMMAND} ${cmake_params}
163 -DSOURCE_DIR=${PROJECT_SOURCE_DIR}
164 -DBINARY_DIR=${PROJECT_BINARY_DIR}
165 -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
166 -DNEMO_COMPILE_OPTIONS=$<TARGET_PROPERTY:nemo_options,INTERFACE_COMPILE_OPTIONS>
167 -DNEMO_USER_INC=${inc_dirs} -DNEMO_USER_LIB=${link_libs}
168 -DNEMO_ARCH_FCM_FILE=<BINARY_DIR>/arch/arch-X64_hpcw.fcm -P
169 ${CMAKE_SOURCE_DIR}/projects/nemo-configure-files.cmake
170 ${default_cmake_args}
172 # NEMO does not well support parallel compilation by user defined
173 # MAKEFLAGS or by calling 'make -j N' with Cmake --> Apply a patch to
174 # avoid compilation error when compiling in parallel via MAKEFLAGS or
175 # via 'make -j N' by unsetting MAKEFLAGS in makenemo. So by default NEMO
176 # is compiled in sequential
178 # To enable NEMO parallel compilation, set NEMO_BUILD_PARALLEL_LEVEL to
179 # N with N the number of parallel processes
180 # note: no not pass default build args as this is non standard make
182 ./makenemo -m X64_hpcw -n MY_ORCA25 -r ORCA2_ICE_PISCES -j
183 ${NEMO_BUILD_PARALLEL_LEVEL} del_key "key_top" add_key
184 "key_si3 key_iomput key_mpp_mpi key_mpi2" ${nemo_build_args}
185 COMMAND ${CMAKE_COMMAND} -E make_directory <BINARY_DIR>/orca25-run
188 ExternalProject_Get_Property(nemo_orca25_medium BINARY_DIR)
189 set(NEMO_ORCA25_DIR ${BINARY_DIR})
195 if(ENABLE_nemo_bench_orca1_like_small)
197 NAME nemo-bench-orca1-like-small
199 env CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
200 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
201 MPI_C_LIBRARY_VERSION_STRING=${MPI_C_LIBRARY_VERSION_STRING}
202 PATH=$ENV{PATH} $<TARGET_FILE:job_launcher>
203 --name=nemo-bench-orca1-like-small
206 WORKING_DIRECTORY ${NEMO_bench1_DIR}/tests/BENCH/EXP00)
209 if(ENABLE_nemo_orca25_medium)
210 # ln -sf $DATADIR/namelist* . ln -sf $DATADIR/*.xml . ln -sf
211 # $DATADIR/Forcing/* . ln -sf $DATADIR/InitialCondition/* . ln -s $EXE
213 ExternalData_Add_Test(offline_nemo-orca25-medium
214 NAME nemo-orca25-medium-stage-in
216 $<TARGET_FILE:job_launcher> --name=nemo-orca25-medium-stage-in
217 --log-dir=${CMAKE_BINARY_DIR}/logs
219 $<TARGET_FILE:job_stagein> --strip-components=-1 # keep filename
220 -s DATA{inputs/nemo-orca25/context_nemo.xml} -s
221 DATA{inputs/nemo-orca25/domain_def_nemo.xml} -s
222 DATA{inputs/nemo-orca25/field_def_nemo-ice.xml} -s
223 DATA{inputs/nemo-orca25/field_def_nemo-oce.xml} -s
224 DATA{inputs/nemo-orca25/file_def_nemo-ice.xml} -s
225 DATA{inputs/nemo-orca25/file_def_nemo-oce.xml} -s
226 DATA{inputs/nemo-orca25/Forcing/JRA55_precip_y2000.nc} -s
227 DATA{inputs/nemo-orca25/Forcing/JRA55_q_10_y2000.nc} -s
228 DATA{inputs/nemo-orca25/Forcing/JRA55_rain_y2000.nc} -s
229 DATA{inputs/nemo-orca25/Forcing/JRA55_rlds_y2000.nc} -s
230 DATA{inputs/nemo-orca25/Forcing/JRA55_rsds_y2000.nc} -s
231 DATA{inputs/nemo-orca25/Forcing/JRA55_slp_y2000.nc} -s
232 DATA{inputs/nemo-orca25/Forcing/JRA55_snow_y2000.nc} -s
233 DATA{inputs/nemo-orca25/Forcing/JRA55_t_10_y2000.nc} -s
234 DATA{inputs/nemo-orca25/Forcing/JRA55_u_10_y2000.nc} -s
235 DATA{inputs/nemo-orca25/Forcing/JRA55_v_10_y2000.nc} -s
236 DATA{inputs/nemo-orca25/Forcing/ORCA025_ESACCI_CHLA_bicubic_new.nc} -s
237 DATA{inputs/nemo-orca25/Forcing/ORCA025_JRA55_weights_bicubic.nc} -s
238 DATA{inputs/nemo-orca25/Forcing/ORCA025_JRA55_weights_bilinear.nc} -s
239 DATA{inputs/nemo-orca25/InitialConditions/domain_cfg.nc} -s
240 DATA{inputs/nemo-orca25/InitialConditions/domain_cfg_updated.nc} -s
241 DATA{inputs/nemo-orca25/InitialConditions/domain_cfg_updated_new.nc} -s
242 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_CHLA_bicubic.nc
244 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_CHLA_bicubic_new.nc
246 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_CHLA_bilinear.nc
248 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_weights_bilinear.nc
250 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_JRA55_weights_bicubic.nc
252 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_JRA55_weights_bilinear.nc
253} -s DATA{inputs/nemo-orca25/InitialConditions/runoff_child.nc} -s
254 DATA{inputs/nemo-orca25/InitialConditions/runoff_clim.nc} -s
255 DATA{inputs/nemo-orca25/InitialConditions/runoff.nc} -s
256 DATA{inputs/nemo-orca25/InitialConditions/WOA13_ORCA025_S_nomask.nc} -s
257 DATA{inputs/nemo-orca25/InitialConditions/WOA13_ORCA025_T_nomask.nc}
258 #-s DATA{inputs/nemo-orca25/InitialConditions/EU/,REGEX:.*} -s
259 #DATA{inputs/nemo-orca25/InitialConditions/EU2/,REGEX:.*} -s
260 #DATA{inputs/nemo-orca25/InitialConditions/EU_small/,REGEX:.*} -s
261 #DATA{inputs/nemo-orca25/InitialConditions/ICE_SVD/,REGEX:.*}
262 -s DATA{inputs/nemo-orca25/grid_def_nemo.xml} -s
263 DATA{inputs/nemo-orca25/iodef.xml} -s
264 DATA{inputs/nemo-orca25/namelist_cfg} -s
265 DATA{inputs/nemo-orca25/namelist_ice_cfg} -s
266 DATA{inputs/nemo-orca25/namelist_ice_ref} -s
267 DATA{inputs/nemo-orca25/namelist_ref}
268 WORKING_DIRECTORY ${NEMO_ORCA25_DIR}/orca25-run)
269 ExternalData_add_target(offline_nemo-orca25-medium)
270 add_dependencies(offline offline_nemo-orca25-medium)
273 TEST nemo-orca25-medium-stage-in
275 PROPERTY FIXTURES_SETUP nemo-orca25-medium-stage-in-out)
278 NAME nemo-orca25-medium
280 env CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
281 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
282 MPI_C_LIBRARY_VERSION_STRING=${MPI_C_LIBRARY_VERSION_STRING}
283 PATH=$ENV{PATH} $<TARGET_FILE:job_launcher> --name=nemo-orca25-medium
287 WORKING_DIRECTORY ${NEMO_ORCA25_DIR}/orca25-run)
290 TEST nemo-orca25-medium
292 PROPERTY FIXTURES_REQUIRED nemo-orca25-medium-stage-in-out)
295 NAME nemo-orca25-medium-validation
297 env LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} PATH=$ENV{PATH}
298 $<TARGET_FILE:job_launcher> --name=nemo-orca25-medium-validation
301 ${CMAKE_SOURCE_DIR}/validation/nemo.sh
302 WORKING_DIRECTORY ${NEMO_ORCA25_DIR}/orca25-run)
303 set_tests_properties(
304 nemo-orca25-medium-validation PROPERTIES FIXTURES_CLEANUP
305 nemo-orca25-medium-stage-in-out)
306 set_tests_properties(nemo-orca25-medium-validation
307 PROPERTIES DEPENDS nemo-orca25-medium)
308 set_tests_properties(nemo-orca25-medium-validation
309 PROPERTIES FIXTURES_REQUIRED _run-nemo-orca25)
310 set_tests_properties(nemo-orca25-medium PROPERTIES FIXTURES_SETUP