1# Copyright (c) 2020 - 2025 David Guibert
2# Copyright (c) 2024 Antoine Morvan
5# SPDX-License-Identifier: Apache-2.0
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)
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")
18set_property(GLOBAL PROPERTY nemo_can_use_system TRUE)
20 set_property(GLOBAL PROPERTY nemo_depends mpi cdo)
22 set_property(GLOBAL PROPERTY nemo_depends mpi netcdf xios cdo)
25set(nemo_cmake_args "" CACHE STRING "Custom CMake arguments for NEMO")
26set(nemo_build_args "" CACHE STRING "Custom makenemo arguments for NEMO")
30 message(STATUS "nemo: enabled (system installed)")
31 find_program(NEMO_EXE nemo.exe REQUIRED)
32 message(STATUS "nemo: ${NEMO_EXE}")
34 get_filename_component(NEMO_EXE_DIR "${NEMO_EXE}" DIRECTORY)
35 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NEMO_EXE_DIR}")
37 if(ENABLE_nemo_bench_orca1_like_small)
38 ExternalProject_Data_Add(
40 ${nemo_bench1_revision}
42 BUILD_COMMAND "" #${CMAKE_COMMAND} -E make_directory <BINARY_DIR>/tests/BENCH/EXP00
44 ${CMAKE_COMMAND} -E copy_directory
45 <BINARY_DIR>/tests/BENCH/EXPREF
46 <BINARY_DIR>/tests/BENCH/EXP00
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
52 sed -i -e "s@nn_itend[[:space:]]*=[[:space:]]*[0-9]\\+@nn_itend = 10@"
53 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
56 ExternalProject_Get_Property(nemo_bench1 BINARY_DIR)
57 set(NEMO_bench1_DIR ${BINARY_DIR})
59 if(ENABLE_nemo_orca25_medium)
60 ExternalProject_Data_Add(
62 ${nemo_orca25_revision}
65 COMMAND ${CMAKE_COMMAND} -E make_directory <BINARY_DIR>/orca25-run
68 ExternalProject_Get_Property(nemo_orca25_medium BINARY_DIR)
69 set(NEMO_ORCA25_DIR ${BINARY_DIR})
76 add_library(nemo_deps INTERFACE)
77 target_link_libraries(nemo_deps INTERFACE MPI::MPI_Fortran netcdf::Fortran
81 if(NOT USE_SYSTEM_xios)
82 list(APPEND nemo_depends_ep xios)
84 add_library(nemo_options INTERFACE)
85 target_compile_options(
87 INTERFACE $<$<STREQUAL:"${CMAKE_Fortran_COMPILER_ID}","GNU">:-g
92 -ffree-line-length-none>
93 $<$<STREQUAL:"${CMAKE_Fortran_COMPILER_ID}","Intel">:-g
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}")
110 if(ENABLE_nemo_bench_orca1_like_small)
111 ExternalProject_Data_Add(
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
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}
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
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}
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
145 sed -i -e "s@nn_itend[[:space:]]*=[[:space:]]*[0-9]\\+@nn_itend = 10@"
146 <BINARY_DIR>/tests/BENCH/EXP00/namelist_cfg
149 ExternalProject_Get_Property(nemo_bench1 BINARY_DIR)
150 set(NEMO_bench1_DIR ${BINARY_DIR})
152 if(ENABLE_nemo_orca25_medium)
153 ExternalProject_Data_Add(
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
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}
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
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
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
187 ExternalProject_Get_Property(nemo_orca25_medium BINARY_DIR)
188 set(NEMO_ORCA25_DIR ${BINARY_DIR})
194 if(ENABLE_nemo_bench_orca1_like_small)
196 NAME nemo-bench-orca1-like-small
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
205 WORKING_DIRECTORY ${NEMO_bench1_DIR}/tests/BENCH/EXP00)
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
212 ExternalData_Add_Test(offline_nemo-orca25-medium
213 NAME nemo-orca25-medium-stage-in
215 $<TARGET_FILE:job_launcher> --name=nemo-orca25-medium-stage-in
216 --log-dir=${CMAKE_BINARY_DIR}/logs
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
243 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_CHLA_bicubic_new.nc
245 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_CHLA_bilinear.nc
247 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_ESACCI_weights_bilinear.nc
249 DATA{inputs/nemo-orca25/InitialConditions/ORCA025_JRA55_weights_bicubic.nc
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)
272 TEST nemo-orca25-medium-stage-in
274 PROPERTY FIXTURES_SETUP nemo-orca25-medium-stage-in-out)
277 NAME nemo-orca25-medium
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
286 WORKING_DIRECTORY ${NEMO_ORCA25_DIR}/orca25-run)
289 TEST nemo-orca25-medium
291 PROPERTY FIXTURES_REQUIRED nemo-orca25-medium-stage-in-out)
294 NAME nemo-orca25-medium-validation
296 env LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} PATH=$ENV{PATH}
297 $<TARGET_FILE:job_launcher> --name=nemo-orca25-medium-validation
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