From 19919e4be2a6f990b61fcdd6e1b6822d70d32fdf Mon Sep 17 00:00:00 2001 From: Alexander Soklev Date: Mon, 10 Feb 2025 11:40:34 +0200 Subject: [PATCH 1/6] Moved all generated header files to /headers and included them in the install step --- rrtmgp-kernels/CMakeLists.txt | 12 +++++++----- rte-kernels/CMakeLists.txt | 18 +++++++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/rrtmgp-kernels/CMakeLists.txt b/rrtmgp-kernels/CMakeLists.txt index 254df5f2f..88160a37c 100644 --- a/rrtmgp-kernels/CMakeLists.txt +++ b/rrtmgp-kernels/CMakeLists.txt @@ -42,6 +42,7 @@ if(BUILD_C_HEADERS) get_target_property(RRTMGPKERNELS_SOURCES rrtmgpkernels SOURCES) if(RRTMGPKERNELS_SOURCES) + set(RRTMGP_HEADER ${CMAKE_BINARY_DIR}/headers/rrtmgp_kernels.h) # Convert sources to absolute paths set(ABSOLUTE_RRTMGPKERNELS_SOURCES "") @@ -53,18 +54,17 @@ if(BUILD_C_HEADERS) endforeach() add_custom_command( - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/api/rrtmgp_kernels.h + OUTPUT ${RRTMGP_HEADER} COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/cbind_generator.py -if - ${ABSOLUTE_RRTMGPKERNELS_SOURCES} -of - ${CMAKE_CURRENT_SOURCE_DIR}/api/rrtmgp_kernels.h + ${ABSOLUTE_RRTMGPKERNELS_SOURCES} -of ${RRTMGP_HEADER} COMMENT "Generating RRTMGPKernels' C bindings header" DEPENDS ${ABSOLUTE_RRTMGPKERNELS_SOURCES} ) add_custom_target( rrtmgpkernels_header - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/api/rrtmgp_kernels.h + DEPENDS ${RRTMGP_HEADER} COMMENT "Ensure rrtmgpkernels_header is built before rrtmgpkernels can use its output" ) @@ -76,8 +76,10 @@ if(BUILD_C_HEADERS) target_sources( rrtmgpkernels PRIVATE # cmake-format: sort - api/rrtmgp_kernels.h + ${RRTMGP_HEADER} ) + + install(FILES ${RRTMGP_HEADER} TYPE INCLUDE) endif() else() message(WARNING "No sources found for rrtmgpkernels!") diff --git a/rte-kernels/CMakeLists.txt b/rte-kernels/CMakeLists.txt index baf0d675b..61ffdad43 100644 --- a/rte-kernels/CMakeLists.txt +++ b/rte-kernels/CMakeLists.txt @@ -53,13 +53,14 @@ target_include_directories(rtekernels PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}) if(BUILD_C_HEADERS) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/api/rte_types.h.in - ${CMAKE_CURRENT_SOURCE_DIR}/api/rte_types.h + ${CMAKE_BINARY_DIR}/headers/rte_types.h @ONLY ) get_target_property(RTEKERNELS_SOURCES rtekernels SOURCES) if(RTEKERNELS_SOURCES) + set(RTE_HEADER ${CMAKE_BINARY_DIR}/headers/rte_kernels.h) # Convert sources to absolute paths set(ABSOLUTE_RTEKERNELS_SOURCES "") @@ -71,18 +72,17 @@ if(BUILD_C_HEADERS) endforeach() add_custom_command( - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/api/rte_kernels.h + OUTPUT ${RTE_HEADER} COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/cbind_generator.py -if - ${ABSOLUTE_RTEKERNELS_SOURCES} -of - ${CMAKE_CURRENT_SOURCE_DIR}/api/rte_kernels.h + ${ABSOLUTE_RTEKERNELS_SOURCES} -of ${RTE_HEADER} COMMENT "Generating RTEKernels' C bindings header" DEPENDS ${ABSOLUTE_RTEKERNELS_SOURCES} ) add_custom_target( rtekernels_header - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/api/rte_kernels.h + DEPENDS ${RTE_HEADER} COMMENT "Ensure rtekernels_header is built before rtekernels can use its output" ) @@ -94,11 +94,15 @@ if(BUILD_C_HEADERS) target_sources( rtekernels PRIVATE # cmake-format: sort - api/rte_kernels.h - api/rte_types.h + ${CMAKE_BINARY_DIR}/headers/rte_types.h + ${RTE_HEADER} ) endif() + + install(FILES ${RTE_HEADER} TYPE INCLUDE) else() message(WARNING "No sources found for rtekernels!") endif() + + install(FILES ${CMAKE_BINARY_DIR}/headers/rte_types.h TYPE INCLUDE) endif() From 632b9a047b861295345260d65efc2c97d0631062 Mon Sep 17 00:00:00 2001 From: Alexander Soklev Date: Mon, 10 Feb 2025 11:40:34 +0200 Subject: [PATCH 2/6] bug fix: generate all headers in any KERNEL_MODE --- rrtmgp-kernels/CMakeLists.txt | 5 ++--- rte-kernels/CMakeLists.txt | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/rrtmgp-kernels/CMakeLists.txt b/rrtmgp-kernels/CMakeLists.txt index 88160a37c..3ae1f49a6 100644 --- a/rrtmgp-kernels/CMakeLists.txt +++ b/rrtmgp-kernels/CMakeLists.txt @@ -68,11 +68,10 @@ if(BUILD_C_HEADERS) COMMENT "Ensure rrtmgpkernels_header is built before rrtmgpkernels can use its output" ) + # Ensure that rrtmgpkernels depends on rrtmgpkernels_header + add_dependencies(rrtmgpkernels rrtmgpkernels_header) if(KERNEL_MODE STREQUAL "extern") - # Ensure that rrtmgpkernels depends on rrtmgpkernels_header - add_dependencies(rrtmgpkernels rrtmgpkernels_header) - target_sources( rrtmgpkernels PRIVATE # cmake-format: sort diff --git a/rte-kernels/CMakeLists.txt b/rte-kernels/CMakeLists.txt index 61ffdad43..a66c38c6f 100644 --- a/rte-kernels/CMakeLists.txt +++ b/rte-kernels/CMakeLists.txt @@ -86,11 +86,10 @@ if(BUILD_C_HEADERS) COMMENT "Ensure rtekernels_header is built before rtekernels can use its output" ) + # Ensure that rtekernels depends on rtekernels_header + add_dependencies(rtekernels rtekernels_header) if(KERNEL_MODE STREQUAL "extern") - # Ensure that rtekernels depends on rtekernels_header - add_dependencies(rtekernels rtekernels_header) - target_sources( rtekernels PRIVATE # cmake-format: sort From 7980400cf00d50bae033ac6e076649b787660660 Mon Sep 17 00:00:00 2001 From: Alexander Soklev Date: Mon, 10 Feb 2025 11:40:34 +0200 Subject: [PATCH 3/6] Moved the install step for rrtmgp-header to the correct place --- rrtmgp-kernels/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rrtmgp-kernels/CMakeLists.txt b/rrtmgp-kernels/CMakeLists.txt index 3ae1f49a6..a59685a0e 100644 --- a/rrtmgp-kernels/CMakeLists.txt +++ b/rrtmgp-kernels/CMakeLists.txt @@ -77,9 +77,9 @@ if(BUILD_C_HEADERS) PRIVATE # cmake-format: sort ${RRTMGP_HEADER} ) - - install(FILES ${RRTMGP_HEADER} TYPE INCLUDE) endif() + + install(FILES ${RRTMGP_HEADER} TYPE INCLUDE) else() message(WARNING "No sources found for rrtmgpkernels!") endif() From 06f31e702e3b99a4f37e27b97f3e60318ecd2c49 Mon Sep 17 00:00:00 2001 From: Alexander Soklev Date: Mon, 10 Feb 2025 14:06:44 +0200 Subject: [PATCH 4/6] Removed cfloat.h from rte_types.h --- rte-kernels/api/rte_types.h.in | 1 - 1 file changed, 1 deletion(-) diff --git a/rte-kernels/api/rte_types.h.in b/rte-kernels/api/rte_types.h.in index 2daecff33..23b9035ea 100644 --- a/rte-kernels/api/rte_types.h.in +++ b/rte-kernels/api/rte_types.h.in @@ -17,7 +17,6 @@ This `.h` file defines C-compatible Boolean and floating-point types. */ #pragma once -#include // Ensure FLT_EPSILON and DBL_EPSILON are available #include // Define a C-compatible Boolean type From b1cc27f3f3369efbf9139cd07277911168ce826e Mon Sep 17 00:00:00 2001 From: Alexander Soklev Date: Mon, 10 Feb 2025 16:47:29 +0200 Subject: [PATCH 5/6] Fixed a bug where a binded subroutine was being skipped due to having the same prefix name --- cbind_generator.py | 12 +++++++++--- rte-kernels/mo_rte_solver_kernels.F90 | 12 ++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/cbind_generator.py b/cbind_generator.py index c59aca09e..f43c5e901 100644 --- a/cbind_generator.py +++ b/cbind_generator.py @@ -5,7 +5,7 @@ def fortran_to_c(fortran_code): subroutine_pattern = re.compile( - r"subroutine\s+(\w+)\s*" r"\((.*?)\)\s*&?\s*" r'bind\(C,\s*name="(.*?)"\)', + r"subroutine\s+(\w+)\s*" r"\((.*?)\)\s*&?\s*" r'bind\s*\(C,\s*name="(.*?)"\)', re.DOTALL | re.IGNORECASE, ) var_pattern = re.compile( @@ -89,6 +89,12 @@ def fortran_to_c(fortran_code): def extract_between(text, start_str, end_str): start = text.find(start_str) + endOfStart = start + len(start_str) + + # Error checking for function with same preffix-name + if start != -1 and not (text[endOfStart] == ' ' or text[endOfStart] == '('): + start = text.find(start_str, endOfStart) + if start == -1: return None end = text.find(end_str, start + len(start_str)) @@ -116,10 +122,10 @@ def extract_cbinds(fortran_code): ) if subroutine_code: - res = subroutine_code.find("bind(C, name=") + res = re.search(r'bind\s*\(\s*C\s*,\s*name\s*=\s*"', subroutine_code) # Skip subroutine if not binded - if res == -1: + if not res: continue else: print("Invalid subroutine declaration! exiting...") diff --git a/rte-kernels/mo_rte_solver_kernels.F90 b/rte-kernels/mo_rte_solver_kernels.F90 index 128dd29ec..582b27f4a 100644 --- a/rte-kernels/mo_rte_solver_kernels.F90 +++ b/rte-kernels/mo_rte_solver_kernels.F90 @@ -922,14 +922,14 @@ subroutine lw_source_2str(ncol, nlay, top_at_1, & integer, intent(in) :: ncol, nlay logical(wl), intent(in) :: top_at_1 real(wp), dimension(ncol ), intent(in) :: sfc_emis, sfc_src - real(wp), dimension(ncol, nlay), intent(in) :: lay_source, & ! Planck source at layer center - tau, & ! Optical depth (tau) - gamma1, gamma2,& ! Coupling coefficients - rdif, tdif ! Layer reflectance and transmittance + real(wp), dimension(ncol, nlay), intent(in) :: lay_source ! Planck source at layer center + real(wp), dimension(ncol, nlay), intent(in) :: tau ! Optical depth (tau) + real(wp), dimension(ncol, nlay), intent(in) :: gamma1, gamma2 ! Coupling coefficients + real(wp), dimension(ncol, nlay), intent(in) :: rdif, tdif ! Layer reflectance and transmittance real(wp), dimension(ncol, nlay+1), target, & - intent(in) :: lev_source ! Planck source at layer edges + intent(in) :: lev_source ! Planck source at layer edges real(wp), dimension(ncol, nlay), intent(out) :: source_dn, source_up - real(wp), dimension(ncol ), intent(out) :: source_sfc ! Source function for upward radation at surface + real(wp), dimension(ncol ), intent(out) :: source_sfc ! Source function for upward radation at surface integer :: icol, ilay real(wp) :: Z, Zup_top, Zup_bottom, Zdn_top, Zdn_bottom From 38515f542403cb86803dc557a58901f8ef5b6ad2 Mon Sep 17 00:00:00 2001 From: Alexander Soklev Date: Tue, 11 Feb 2025 12:23:02 +0200 Subject: [PATCH 6/6] formatting --- cbind_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cbind_generator.py b/cbind_generator.py index f43c5e901..70f9611fe 100644 --- a/cbind_generator.py +++ b/cbind_generator.py @@ -92,7 +92,7 @@ def extract_between(text, start_str, end_str): endOfStart = start + len(start_str) # Error checking for function with same preffix-name - if start != -1 and not (text[endOfStart] == ' ' or text[endOfStart] == '('): + if start != -1 and not (text[endOfStart] == " " or text[endOfStart] == "("): start = text.find(start_str, endOfStart) if start == -1: