HPCW 3.0
Loading...
Searching...
No Matches
nicamdc.cmake
Go to the documentation of this file.
1# Copyright (c) 2024 Sam Hatfield
2# Copyright (c) 2024 - 2025 Niclas Schroeter
3# Copyright (c) 2024 David Guibert
4# All rights reserved.
5#
6# SPDX-License-Identifier: Apache-2.0
7
8set_property(GLOBAL PROPERTY nicamdc_can_use_system TRUE)
9set_property(GLOBAL PROPERTY nicamdc_depends mpi)
10
11set(nicamdc_change_timestep "10" CACHE STRING "Adjust the number of timesteps for nicamdc test cases (default 10)")
12
13set(nicamdc_build_args "" CACHE STRING "Custom Make arguments for nicamdc")
14
15if(nicamdc_enabled)
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)
25 else()
26 message(STATUS "nicamdc: enabled (internally built)")
27
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")
35 else()
36 message(FATAL_ERROR "Unrecognized compiler, please define Fortran_ADDITIONAL_FLAGS_FOR_NICAMDC manually")
37 endif()
38 endif()
39
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)
45
46 # Add NICAM-DC as an external non-CMake project, with custom configure, build, and install
47 # commands
48 ExternalProject_Data_Add(
49 nicamdc
50 ${nicamdc_revision}
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
53 PATCH_COMMAND
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}
57 INSTALL_COMMAND "")
58
59 set(NICAM_ROOT "${CMAKE_BINARY_DIR}/nicamdc")
60 endif()
61
62 # Test cases
63 set(cases "small" "medium" "big")
64 set(configs "gl05rl00z94pe10" "gl08rl03z94pe640" "gl09rl04z94pe2560")
65
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")
68
69 # Handle all of the test cases
70 foreach(case config IN ZIP_LISTS cases configs)
71 # Build the test in a setup step
72 add_test(
73 NAME build-nicamdc-${case}
74 COMMAND
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})
79
80 # Run the test
81 add_test(
82 NAME nicamdc-${case}
83 COMMAND $<TARGET_FILE:job_launcher> --name=nicamdc-${case}
84 --log-dir=${LOG_DIR}
85 -- ./nhm_driver
86 WORKING_DIRECTORY ${NICAM_ROOT}/test/framework/benchmark/${config})
87
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})
91
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)")
98
99 ExternalData_Add_Test(offline_nicamdc_${case}
100 NAME link-data-nicamdc-${case}
101 COMMAND
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:.*}
107 )
108 ExternalData_Add_Target(offline_nicamdc_${case})
109 add_dependencies(offline offline_nicamdc_${case})
110
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})
113 endif()
114
115 endforeach()
116endif()