1# Copyright (c) 2024 Sam Hatfield
2# Copyright (c) 2024 - 2025 Niclas Schroeter
3# Copyright (c) 2024 David Guibert
6# SPDX-License-Identifier: Apache-2.0
8set_property(GLOBAL PROPERTY nicamdc_can_use_system TRUE)
9set_property(GLOBAL PROPERTY nicamdc_depends mpi)
11set(nicamdc_change_timestep "10" CACHE STRING "Adjust the number of timesteps for nicamdc test cases (default 10)")
13set(nicamdc_build_args "" CACHE STRING "Custom Make arguments for nicamdc")
16 if(USE_SYSTEM_nicamdc)
17 #For externally built versions of Nicam, we are still relying on the
18 #presence of the "Makedef." file in the sysdep directory.
19 find_program(NICAM_DRIVER nhm_driver REQUIRED)
20 get_filename_component(NICAM_ROOT ${NICAM_DRIVER}/../.. ABSOLUTE)
21 message(STATUS "nicamdc: enabled (system installed)")
22 message(STATUS "nicamdc root: ${NICAM_ROOT}")
23 configure_file(${CMAKE_SOURCE_DIR}/cmake/nicamdc-mkjobshell.cmake.in
24 ${NICAM_ROOT}/sysdep/Mkjobshell..sh @ONLY)
26 message(STATUS "nicamdc: enabled (internally built)")
28 if(NOT DEFINED Fortran_ADDITIONAL_FLAGS_FOR_NICAMDC)
29 if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
30 set(Fortran_ADDITIONAL_FLAGS_FOR_NICAMDC "-fconvert=big-endian -frecord-marker=4")
31 # Apart from the record length treatment, GNU also limits the line length to 132 by default.
32 string(APPEND Fortran_ADDITIONAL_FLAGS_FOR_NICAMDC " -ffree-line-length-512")
33 elseif(CMAKE_Fortran_COMPILER_ID MATCHES "^Intel(LLVM)?$")
34 set(Fortran_ADDITIONAL_FLAGS_FOR_NICAMDC "-assume byterecl -convert big_endian")
36 message(FATAL_ERROR "Unrecognized compiler, please define Fortran_ADDITIONAL_FLAGS_FOR_NICAMDC manually")
40 # Preprocess makedef template file into a form the NICAM-DC build-system expects
41 configure_file(${CMAKE_SOURCE_DIR}/cmake/nicamdc-makedef_file.cmake.in
42 ${CMAKE_BINARY_DIR}/Makedef.)
43 configure_file(${CMAKE_SOURCE_DIR}/cmake/nicamdc-mkjobshell.cmake.in
44 ${CMAKE_BINARY_DIR}/Mkjobshell..sh @ONLY)
46 # Add NICAM-DC as an external non-CMake project, with custom configure, build, and install
48 ExternalProject_Data_Add(
51 CONFIGURE_COMMAND cp ${CMAKE_BINARY_DIR}/Makedef. ${CMAKE_BINARY_DIR}/nicamdc/sysdep/Makedef.
52 COMMAND cp ${CMAKE_BINARY_DIR}/Mkjobshell..sh ${CMAKE_BINARY_DIR}/nicamdc/sysdep/Mkjobshell..sh
54 ${Patch_EXECUTABLE} -p1 -i ${CMAKE_SOURCE_DIR}/projects/nicam_dependency.patch
55 BUILD_COMMAND env NICAM_SYS=
56 ${CMAKE_MAKE_PROGRAM} -C ${CMAKE_BINARY_DIR}/nicamdc/src ${default_build_args} ${nicamdc_build_args}
59 set(NICAM_ROOT "${CMAKE_BINARY_DIR}/nicamdc")
63 set(cases "small" "medium" "big")
64 set(configs "gl05rl00z94pe10" "gl08rl03z94pe640" "gl09rl04z94pe2560")
66 set(makefile_sed "s/SYSDEPDIR = $(abspath ..)//g")
67 set(change_timestep_sed "&& sed -i.orig 's/LSTEP_MAX[[:space:]]*=[[:space:]]*10,/LSTEP_MAX = ${nicamdc_change_timestep},/' nhm_driver.cnf")
69 # Handle all of the test cases
70 foreach(case config IN ZIP_LISTS cases configs)
71 # Build the test in a setup step
73 NAME build-nicamdc-${case}
75 bash -c "sed -i '${makefile_sed}' Makefile &&
76 NICAM_SYS= ${CMAKE_MAKE_PROGRAM} jobshell &&
77 ./prepare_rundir.sh ${change_timestep_sed}"
78 WORKING_DIRECTORY ${NICAM_ROOT}/test/framework/benchmark/${config})
83 COMMAND $<TARGET_FILE:job_launcher> --name=nicamdc-${case}
86 WORKING_DIRECTORY ${NICAM_ROOT}/test/framework/benchmark/${config})
88 # Make sure build-nicamdc-${case} is always executed before nicamdc-${case}
89 set_tests_properties(build-nicamdc-${case} PROPERTIES FIXTURES_SETUP _setup-nicam-${case})
90 set_tests_properties(nicamdc-${case} PROPERTIES FIXTURES_REQUIRED _setup-nicam-${case})
92 #Medium and big test case require extra data in predetermined dirs
93 if(NOT case STREQUAL "small")
94 set(unpack_data "tar --skip-old-files -xzf nicamdc-${case}.tar.gz")
95 set(link_boundary_data "ln -sf $PWD/nicamdc-${case}/boundary/* ${NICAM_ROOT}/data/grid/boundary/")
96 set(link_mapping_data "ln -sf $PWD/nicamdc-${case}/llmap/* ${NICAM_ROOT}/data/grid/llmap/")
97 set(link_mnginfo_if_present "(test -d $PWD/nicamdc-${case}/mnginfo && ln -sf $PWD/nicamdc-${case}/mnginfo/* ${NICAM_ROOT}/data/mnginfo || true)")
99 ExternalData_Add_Test(offline_nicamdc_${case}
100 NAME link-data-nicamdc-${case}
102 bash -c "${unpack_data} &&
103 ${link_boundary_data} &&
104 ${link_mapping_data} &&
105 ${link_mnginfo_if_present}"
106 WORKING_DIRECTORY DATA{inputs/nicamdc/,RECURSE:,REGEX:.*}
108 ExternalData_Add_Target(offline_nicamdc_${case})
109 add_dependencies(offline offline_nicamdc_${case})
111 set_tests_properties(link-data-nicamdc-${case} PROPERTIES FIXTURES_SETUP _setup-build-${case})
112 set_tests_properties(build-nicamdc-${case} PROPERTIES FIXTURES_REQUIRED _setup-build-${case})