HPCW 3.0
Loading...
Searching...
No Matches
icon.cmake
Go to the documentation of this file.
1# Copyright (c) 2020 - 2024 David Guibert
2# Copyright (c) 2024 - 2025 Niclas Schroeter
3# Copyright (c) 2024 Antoine Morvan
4# All rights reserved.
5#
6# SPDX-License-Identifier: Apache-2.0
7
8include(icon-test-setup)
9
10option(ENABLE_icon_gpu "Enable icon gpu parts" OFF)
11option(ENABLE_icon_large_inputs "Enable download of large inputs for icon" OFF)
12option(COPY_ICON_INPUTS "When creating the test cases, the data is copied instead of linked. Recommended if changes to i.e. namelists are planned." OFF)
13set(ICON_TESTCASE_JSON "" CACHE PATH "Absolute path ('~' not expanded) to the input json that contains information on the number of setups per test case.")
14set(ICON_USER_BUILD_WRAPPER "" CACHE STRING "Use an existing config wrapper from ICON")
15
16set(icon_configure_args "" CACHE STRING "Custom configure arguments for ICON")
17set(icon_build_args "" CACHE STRING "Custom Make arguments for ICON")
18
19set_property(GLOBAL PROPERTY icon_can_use_system TRUE)
20set_property(
21 GLOBAL
22 PROPERTY icon_depends
23 mpi
24 openblas
25 libxml2
26 zlib
27 szip
28 netcdf
29 hdf5
30 libfyaml
31 cdo
32 eccodes)
33
34if(ENABLE_icon_gpu)
35 set_property(GLOBAL APPEND PROPERTY icon_depends cuda)
36endif()
37
38if(icon_enabled)
39 if (USE_SYSTEM_icon)
40 find_program(ICON_EXE icon REQUIRED)
41 message(STATUS "ICON: enabled (system installed)")
42 message(STATUS "ICON: ${ICON_EXE}")
43 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${ICON_EXE}")
44 else ()
45 message(STATUS "ICON: enabled (internally built)")
46 set(ICON_EXE icon)
47
48 set(icon_depends_ep ZLIB::ZLIB SZIP::SZIP netcdf::Fortran libfyaml eccodes eccodes_f90)
49 list(APPEND icon_depends_ep openblas LibXml2::LibXml2)
50
51 # use configure as default build script, so that specific sites can use
52 # specific wrappers that are a lot easier to debug
53 set(ICON_BUILD_WRAPPER configure)
54
55 # basic libs setup needed for all ICON tests
56 set(LIBS_LIST "")
57 list(APPEND LIBS_LIST -lxml2)
58 list(APPEND LIBS_LIST -lnetcdf)
59 list(APPEND LIBS_LIST -lnetcdff)
60 list(APPEND LIBS_LIST -lhdf5)
61 list(APPEND LIBS_LIST -lhdf5_hl)
62 list(APPEND LIBS_LIST -lfyaml)
63 list(APPEND LIBS_LIST ${BLAS_LIBRARIES_LIBS})
64 list(APPEND LIBS_LIST ${LAPACK_LIBRARIES_LIBS})
65 list(APPEND LIBS_LIST ${LAPACK_BLAS_LIBS})
66 list(APPEND LIBS_LIST -leccodes)
67 list(APPEND LIBS_LIST -leccodes_f90)
68 # NVC flags
69 set(NVC_FLAGS_LIST "")
70
71 if(NOT ICON_USER_BUILD_WRAPPER STREQUAL "")
72 set(ICON_BUILD_WRAPPER ${ICON_USER_BUILD_WRAPPER})
73 else()
74 set(INCLUDE_FLAGS
75 "-I${HDF5_DIR}/include -I${NETCDF_DIR}/include -I${NETCDFF_DIR}/include -I${LIBXML2_DIR}/include/libxml2 -I${LIBFYAML_INCLUDE_DIR} -I${ECCODES_DIR}/include"
76 )
77 list(APPEND ICON_BUILD_WRAPPER "CC=${MPI_C_COMPILER}")
78 list(APPEND ICON_BUILD_WRAPPER "CFLAGS=${CFLAGS} $ENV{CFLAGS}")
79 list(APPEND ICON_BUILD_WRAPPER "CPPFLAGS=${CPPFLAGS} $ENV{CPPFLAGS} ${INCLUDE_FLAGS}")
80 list(APPEND ICON_BUILD_WRAPPER "FC=${MPI_Fortran_COMPILER}")
81 list(APPEND ICON_BUILD_WRAPPER "FCFLAGS=${FCFLAGS} $ENV{FCFLAGS} ${INCLUDE_FLAGS}")
82 list(APPEND ICON_BUILD_WRAPPER "ICON_FCFLAGS=${ICON_FCFLAGS}")
83
84 set(LDFLAGS_LIST "")
85 list(APPEND LDFLAGS_LIST -L${HDF5_DIR}/lib)
86 list(APPEND LDFLAGS_LIST -L${NETCDF_DIR}/lib)
87 list(APPEND LDFLAGS_LIST -L${NETCDFF_DIR}/lib)
88 list(APPEND LDFLAGS_LIST -L${LIBFYAML_LIB_DIR})
89 list(APPEND LDFLAGS_LIST -L${LIBXML2_DIR}/lib)
90 list(APPEND LDFLAGS_LIST ${BLAS_LINKER_FLAGS})
91 list(APPEND LDFLAGS_LIST ${LAPACK_LINKER_FLAGS})
92 list(APPEND LDFLAGS_LIST -L${ECCODES_DIR}/lib64)
93 if(ENABLE_icon_gpu)
94 list(APPEND LDFLAGS_LIST -L${CUDAToolkit_LIBRARY_DIR})
95 endif()
96 list(JOIN LDFLAGS_LIST " " LDFLAGS_)
97 list(APPEND ICON_BUILD_WRAPPER "LDFLAGS=${LDFLAGS} $ENV{LDFLAGS} ${LDFLAGS_}")
98
99 if(DEFINED ICON_OCEAN_FCFLAGS OR DEFINED ENV{ICON_OCEAN_FCFLAGS})
100 list(APPEND ICON_BUILD_WRAPPER "--enable-fcgroup-OCEAN=src/hamocc:src/ocean:src/sea_ice")
101 list(APPEND ICON_BUILD_WRAPPER "ICON_OCEAN_FCFLAGS=${ICON_OCEAN_FCFLAGS}")
102 endif()
103
104 list(APPEND ICON_BUILD_WRAPPER "MPI_LAUNCH=${MPIEXEC_EXECUTABLE}")
105 if(ENABLE_icon_gpu)
106 list(APPEND LIBS_LIST -c++libs)
107 list(APPEND LIBS_LIST -cuda)
108 if(NVCFLAGS) # this is supposed to be a list because of the
109 # space-quotation-black-magic of cmake
110 list(JOIN NVCFLAGS " " NVCFLAGS)
111 list(APPEND ICON_BUILD_WRAPPER "NVCFLAGS=${NVCFLAGS}")
112 endif()
113 list(APPEND ICON_BUILD_WRAPPER --enable-gpu)
114 # list(APPEND ICON_BUILD_WRAPPER --disable-openmp) # don't mix
115 # gpu and openmp
116 list(APPEND ICON_BUILD_WRAPPER --disable-loop-exchange) # don't interfere
117 # with manual loop
118 # exchange
119 list(APPEND ICON_BUILD_WRAPPER --disable-yaxt) # yaxt is not supposed to
120 # work on the GPU, yet
121 else()
122 list(APPEND ICON_BUILD_WRAPPER --disable-gpu --enable-openmp
123 --enable-yaxt)
124 list(APPEND ICON_BUILD_WRAPPER --enable-intel-consistency
125 --enable-vectorized-lrtm)
126 endif()
127
128 # my workaround for cmake's way to mess around with quotation ALL THE TIME
129 list(JOIN LIBS_LIST " " LIBS)
130 list(APPEND ICON_BUILD_WRAPPER "LIBS=${LIBS}")
131 list(APPEND ICON_BUILD_WRAPPER --enable-parallel-netcdf --enable-mpi
132 --disable-mpi-checks)
133 list(APPEND ICON_BUILD_WRAPPER --enable-grib2 --enable-ecrad)
134 list(APPEND ICON_BUILD_WRAPPER "${default_configure_args};${icon_configure_args}")
135 endif()
136
137 message("Build ICON with '${ICON_BUILD_WRAPPER}'")
138
139 ExternalProject_Data_Add(
140 icon
141 DEPENDS ${icon_depends_ep}
142 ${icon_revision}
143 CONFIGURE_COMMAND
144 COMMAND env
145 CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
146 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
147 PATH=$ENV{PATH} PARALLEL_LEVEL=${BUILD_PARALLEL_LEVEL}
148 <SOURCE_DIR>/${ICON_BUILD_WRAPPER} --prefix=<INSTALL_DIR>
149 BUILD_COMMAND env
150 PATH=$ENV{PATH} CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
151 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
152 ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${icon_build_args}
153 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} install)
154
155 ExternalProject_Get_Property(icon INSTALL_DIR)
156 set(ICON_BIN_DIR "${INSTALL_DIR}/bin")
157 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${ICON_BIN_DIR}")
158 endif()
159
160 #Extra grib definitions for some icon test cases, unpacked in the install
161 #directory. Use this variable in ECCODES_DEFINITION_PATH, if required.
162 set(GRIB_DEFINITIONS_DIR "${INSTALL_DIR}/share/definitions.edzw")
163 ExternalProject_Data_Add(
164 eccodes_definitions
165 TMP_DIR tmp STAMP_DIR ${name}-stamp
166 DOWNLOAD_DIR "${DOWNLOAD_DIR}"
167 SOURCE_DIR "${GRIB_DEFINITIONS_DIR}"
168 USE_DATA_STORE
169 URL DATA{downloads/definitions.edzw.tar.gz}
170 CONFIGURE_COMMAND ":"
171 BUILD_COMMAND ":"
172 INSTALL_COMMAND ":"
173 )
174
175 set(testcase_numbers_list "")
176 if(EXISTS ${ICON_TESTCASE_JSON})
177 parse_json_for_test_numbers(${ICON_TESTCASE_JSON} testcase_numbers_list)
178 endif()
179
180 add_icon_test( "icon-test-nwp-R02B04N06multi" "test_nwp_R02B04N06multi" "${testcase_numbers_list}" )
181 add_icon_test( "icon-atm-tracer-Hadley" "atm_tracer_Hadley" "${testcase_numbers_list}" )
182 add_icon_test( "icon-aes-physics" "aes_physics" "${testcase_numbers_list}" )
183 add_icon_test( "icon-LAM" "LAM" "${testcase_numbers_list}" )
184
185 if(ENABLE_icon_large_inputs)
186 add_icon_test( "icon-NextGEMS-R2B8-2020" "NextGEMS_R2B8_2020" "${testcase_numbers_list}" )
187 endif()
188
189endif(icon_enabled)