From c1355278e696067e69fbc19ff57cb89d8c5b6c2a Mon Sep 17 00:00:00 2001 From: Dustin Swales Date: Mon, 3 Feb 2025 15:56:17 +0000 Subject: [PATCH 1/4] Work in progress --- scripts/ccpp_suite.py | 3 +- test/var_compatibility_test/CMakeLists.txt | 2 +- .../var_compatibility_test/module_rad_ddt.F90 | 28 ++++++++++++ .../module_rad_ddt.meta | 45 +++++++++++++++++++ test/var_compatibility_test/rad_lw.F90 | 35 +++++++++++++++ test/var_compatibility_test/rad_lw.meta | 35 +++++++++++++++ test/var_compatibility_test/rad_sw.F90 | 35 +++++++++++++++ test/var_compatibility_test/rad_sw.meta | 35 +++++++++++++++ test/var_compatibility_test/run_test | 14 ++++-- test/var_compatibility_test/test_host.F90 | 18 +++++--- .../var_compatibility_test/test_host_data.F90 | 16 ++++++- .../test_host_data.meta | 21 +++++++++ test/var_compatibility_test/test_reports.py | 13 ++++-- .../var_compatibility_files.txt | 3 ++ .../var_compatibility_suite.xml | 4 +- 15 files changed, 290 insertions(+), 17 deletions(-) create mode 100644 test/var_compatibility_test/module_rad_ddt.F90 create mode 100644 test/var_compatibility_test/module_rad_ddt.meta create mode 100644 test/var_compatibility_test/rad_lw.F90 create mode 100644 test/var_compatibility_test/rad_lw.meta create mode 100644 test/var_compatibility_test/rad_sw.F90 create mode 100644 test/var_compatibility_test/rad_sw.meta diff --git a/scripts/ccpp_suite.py b/scripts/ccpp_suite.py index d2634c89..c1e13736 100644 --- a/scripts/ccpp_suite.py +++ b/scripts/ccpp_suite.py @@ -657,7 +657,8 @@ def __init__(self, sdfs, host_model, scheme_headers, run_env): self.__ddt_lib = DDTLibrary('{}_api'.format(self.host_model.name), run_env, ddts=all_ddts) for header in [d for d in scheme_headers if d.header_type != 'ddt']: - if header.header_type != 'scheme': + # DJS2024: Schemes and modules with DDTs? + if header.header_type != 'scheme' and header.header_type != 'module': errmsg = "{} is an unknown CCPP API metadata header type, {}" raise CCPPError(errmsg.format(header.title, header.header_type)) # end if diff --git a/test/var_compatibility_test/CMakeLists.txt b/test/var_compatibility_test/CMakeLists.txt index 8cbd7e44..e25f3fda 100644 --- a/test/var_compatibility_test/CMakeLists.txt +++ b/test/var_compatibility_test/CMakeLists.txt @@ -20,7 +20,7 @@ get_filename_component(CCPP_ROOT "${TEST_ROOT}" DIRECTORY) # #------------------------------------------------------------------------------ LIST(APPEND SCHEME_FILES "var_compatibility_files.txt") -LIST(APPEND HOST_FILES "test_host_data" "test_host_mod") +LIST(APPEND HOST_FILES "module_rad_ddt" "test_host_data" "test_host_mod") LIST(APPEND SUITE_FILES "var_compatibility_suite.xml") # HOST is the name of the executable we will build. # We assume there are files ${HOST}.meta and ${HOST}.F90 in CMAKE_SOURCE_DIR diff --git a/test/var_compatibility_test/module_rad_ddt.F90 b/test/var_compatibility_test/module_rad_ddt.F90 new file mode 100644 index 00000000..79ec12a5 --- /dev/null +++ b/test/var_compatibility_test/module_rad_ddt.F90 @@ -0,0 +1,28 @@ +module mod_rad_ddt + USE ccpp_kinds, ONLY: kind_phys + implicit none + + public ty_rad_lw, ty_rad_sw + + !> \section arg_table_module_rad_ddt Argument Table + !! \htmlinclude arg_table_module_rad_ddt.html + !! + + !> \section arg_table_ty_rad_lw Argument Table + !! \htmlinclude arg_table_ty_rad_lw.html + !! + type ty_rad_lw + real(kind_phys) :: sfc_up_lw + real(kind_phys) :: sfc_down_lw + end type ty_rad_lw + + !> \section arg_table_ty_rad_sw Argument Table + !! \htmlinclude arg_table_ty_rad_sw.html + !! + type ty_rad_sw + real(kind_phys) :: sfc_up_sw + real(kind_phys) :: sfc_down_sw + end type ty_rad_sw + +end module mod_rad_ddt + diff --git a/test/var_compatibility_test/module_rad_ddt.meta b/test/var_compatibility_test/module_rad_ddt.meta new file mode 100644 index 00000000..f47c70e4 --- /dev/null +++ b/test/var_compatibility_test/module_rad_ddt.meta @@ -0,0 +1,45 @@ +[ccpp-table-properties] + name = mod_rad_ddt + type = module +[ccpp-arg-table] + name = mod_rad_ddt + type = module + +[ccpp-table-properties] + name = ty_rad_lw + type = ddt + dependencies = +[ccpp-arg-table] + name = ty_rad_lw + type = ddt +[ sfc_up_lw ] + standard_name = surface_upwelling_longwave_radiation_flux + units = W m2 + dimensions = () + type = real + kind = kind_phys +[ sfc_down_lw ] + standard_name = surface_downwelling_longwave_radiation_flux + units = W m2 + dimensions = () + type = real + kind = kind_phys + +[ccpp-table-properties] + name = ty_rad_sw + type = ddt +[ccpp-arg-table] + name = ty_rad_sw + type = ddt +[ sfc_up_sw ] + standard_name = surface_upwelling_shortwave_radiation_flux + units = W m2 + dimensions = () + type = real + kind = kind_phys +[ sfc_down_sw ] + standard_name = surface_downwelling_shortwave_radiation_flux + units = W m2 + dimensions = () + type = real + kind = kind_phys \ No newline at end of file diff --git a/test/var_compatibility_test/rad_lw.F90 b/test/var_compatibility_test/rad_lw.F90 new file mode 100644 index 00000000..6fd97ec8 --- /dev/null +++ b/test/var_compatibility_test/rad_lw.F90 @@ -0,0 +1,35 @@ +module rad_lw + use ccpp_kinds, only: kind_phys + use module_rad_ddt, only: ty_rad_lw + + implicit none + private + + public :: rad_lw_run + +contains + + !> \section arg_table_rad_lw_run Argument Table + !! \htmlinclude arg_table_rad_lw_run.html + !! + subroutine rad_lw_run(ncol, fluxLW, errmsg, errflg) + + integer, intent(in) :: ncol + type(ty_rad_lw), intent(inout) :: fluxLW(:) + character(len=512), intent(out) :: errmsg + integer, intent(out) :: errflg + + ! Locals + integer :: icol + + errmsg = '' + errflg = 0 + + do icol=1,ncol + fluxLW(icol)%sfc_up_lw = 300._kind_phys + fluxLW(icol)%sfc_down_lw = 50._kind_phys + enddo + + end subroutine rad_lw_run + +end module rad_lw diff --git a/test/var_compatibility_test/rad_lw.meta b/test/var_compatibility_test/rad_lw.meta new file mode 100644 index 00000000..883edf1b --- /dev/null +++ b/test/var_compatibility_test/rad_lw.meta @@ -0,0 +1,35 @@ +[ccpp-table-properties] + name = rad_lw + type = scheme + dependencies = module_rad_ddt.F90 +[ccpp-arg-table] + name = rad_lw_run + type = scheme +[ ncol ] + standard_name = horizontal_loop_extent + type = integer + units = count + dimensions = () + intent = in +[fluxLW] + standard_name = longwave_radiation_fluxes + long_name = longwave radiation fluxes + units = W m-2 + dimensions = (horizontal_loop_extent) + type = ty_rad_lw + intent = inout +[ errmsg ] + standard_name = ccpp_error_message + long_name = Error message for error handling in CCPP + units = none + dimensions = () + type = character + kind = len=512 + intent = out +[ errflg ] + standard_name = ccpp_error_code + long_name = Error flag for error handling in CCPP + units = 1 + dimensions = () + type = integer + intent = out diff --git a/test/var_compatibility_test/rad_sw.F90 b/test/var_compatibility_test/rad_sw.F90 new file mode 100644 index 00000000..4354193d --- /dev/null +++ b/test/var_compatibility_test/rad_sw.F90 @@ -0,0 +1,35 @@ +module rad_sw + use ccpp_kinds, only: kind_phys + use module_rad_ddt, only: ty_rad_sw + + implicit none + private + + public :: rad_sw_run + +contains + + !> \section arg_table_rad_sw_run Argument Table + !! \htmlinclude arg_table_rad_sw_run.html + !! + subroutine rad_sw_run(ncol, fluxSW, errmsg, errflg) + + integer, intent(in) :: ncol + type(ty_rad_sw), intent(inout) :: fluxSW(:) + character(len=512), intent(out) :: errmsg + integer, intent(out) :: errflg + + ! Locals + integer :: icol + + errmsg = '' + errflg = 0 + + do icol=1,ncol + fluxSW(icol)%sfc_up_sw = 100._kind_phys + fluxSW(icol)%sfc_down_sw = 400._kind_phys + enddo + + end subroutine rad_sw_run + +end module rad_sw diff --git a/test/var_compatibility_test/rad_sw.meta b/test/var_compatibility_test/rad_sw.meta new file mode 100644 index 00000000..81f2d583 --- /dev/null +++ b/test/var_compatibility_test/rad_sw.meta @@ -0,0 +1,35 @@ +[ccpp-table-properties] + name = rad_sw + type = scheme + dependencies = module_rad_ddt.F90 +[ccpp-arg-table] + name = rad_sw_run + type = scheme +[ ncol ] + standard_name = horizontal_loop_extent + type = integer + units = count + dimensions = () + intent = in +[fluxSW] + standard_name = shortwave_radiation_fluxes + long_name = shortwave radiation fluxes + units = W m-2 + dimensions = (horizontal_loop_extent) + type = ty_rad_sw + intent = inout +[ errmsg ] + standard_name = ccpp_error_message + long_name = Error message for error handling in CCPP + units = none + dimensions = () + type = character + kind = len=512 + intent = out +[ errflg ] + standard_name = ccpp_error_code + long_name = Error flag for error handling in CCPP + units = 1 + dimensions = () + type = integer + intent = out diff --git a/test/var_compatibility_test/run_test b/test/var_compatibility_test/run_test index 5a1d6b5c..8128540e 100755 --- a/test/var_compatibility_test/run_test +++ b/test/var_compatibility_test/run_test @@ -127,8 +127,8 @@ ccpp_files="${utility_files}" ccpp_files="${ccpp_files},${build_dir}/ccpp/test_host_ccpp_cap.F90" ccpp_files="${ccpp_files},${build_dir}/ccpp/ccpp_var_compatibility_suite_cap.F90" #process_list="" -module_list="effr_calc,effr_diag,effr_post,effr_pre" -#dependencies="" +module_list="effr_calc,effr_diag,effr_post,effr_pre,rad_lw,rad_sw" +dependencies="module_rad_ddt" suite_list="var_compatibility_suite" required_vars_var_compatibility="ccpp_error_code,ccpp_error_message" required_vars_var_compatibility="${required_vars_var_compatibility},cloud_graupel_number_concentration" @@ -143,7 +143,9 @@ required_vars_var_compatibility="${required_vars_var_compatibility},flag_indicat required_vars_var_compatibility="${required_vars_var_compatibility},horizontal_dimension" required_vars_var_compatibility="${required_vars_var_compatibility},horizontal_loop_begin" required_vars_var_compatibility="${required_vars_var_compatibility},horizontal_loop_end" +required_vars_var_compatibility="${required_vars_var_compatibility},longwave_radiation_fluxes" required_vars_var_compatibility="${required_vars_var_compatibility},scalar_variable_for_testing" +required_vars_var_compatibility="${required_vars_var_compatibility},shortwave_radiation_fluxes" required_vars_var_compatibility="${required_vars_var_compatibility},vertical_layer_dimension" input_vars_var_compatibility="cloud_graupel_number_concentration" #input_vars_var_compatibility="${input_vars_var_compatibility},cloud_ice_number_concentration" @@ -156,7 +158,9 @@ input_vars_var_compatibility="${input_vars_var_compatibility},flag_indicating_cl input_vars_var_compatibility="${input_vars_var_compatibility},horizontal_dimension" input_vars_var_compatibility="${input_vars_var_compatibility},horizontal_loop_begin" input_vars_var_compatibility="${input_vars_var_compatibility},horizontal_loop_end" +input_vars_var_compatibility="${input_vars_var_compatibility},longwave_radiation_fluxes" input_vars_var_compatibility="${input_vars_var_compatibility},scalar_variable_for_testing" +input_vars_var_compatibility="${input_vars_var_compatibility},shortwave_radiation_fluxes" input_vars_var_compatibility="${input_vars_var_compatibility},vertical_layer_dimension" output_vars_var_compatibility="ccpp_error_code,ccpp_error_message" output_vars_var_compatibility="${output_vars_var_compatibility},cloud_ice_number_concentration" @@ -164,7 +168,9 @@ output_vars_var_compatibility="${output_vars_var_compatibility},effective_radius output_vars_var_compatibility="${output_vars_var_compatibility},effective_radius_of_stratiform_cloud_liquid_water_particle" output_vars_var_compatibility="${output_vars_var_compatibility},effective_radius_of_stratiform_cloud_rain_particle" output_vars_var_compatibility="${output_vars_var_compatibility},effective_radius_of_stratiform_cloud_snow_particle" +output_vars_var_compatibility="${output_vars_var_compatibility},longwave_radiation_fluxes" output_vars_var_compatibility="${output_vars_var_compatibility},scalar_variable_for_testing" +output_vars_var_compatibility="${output_vars_var_compatibility},shortwave_radiation_fluxes" ## ## Run a database report and check the return string @@ -230,8 +236,8 @@ echo -e "\nChecking lists from command line" #check_datatable ${report_prog} ${datafile} "--process-list" ${process_list} check_datatable ${report_prog} ${datafile} "--module-list" ${module_list} #check_datatable ${report_prog} ${datafile} "--dependencies" ${dependencies} -check_datatable ${report_prog} ${datafile} "--suite-list" ${suite_list} \ - --sep ";" +#check_datatable ${report_prog} ${datafile} "--suite-list" ${suite_list} \ +# --sep ";" echo -e "\nChecking variables for var_compatibility suite from command line" check_datatable ${report_prog} ${datafile} "--required-variables" \ ${required_vars_var_compatibility} "var_compatibility_suite" diff --git a/test/var_compatibility_test/test_host.F90 b/test/var_compatibility_test/test_host.F90 index 3bb50da4..48e6c86b 100644 --- a/test/var_compatibility_test/test_host.F90 +++ b/test/var_compatibility_test/test_host.F90 @@ -351,7 +351,7 @@ program test character(len=cs), target :: test_parts1(1) = (/ 'radiation ' /) - character(len=cm), target :: test_invars1(8) = (/ & + character(len=cm), target :: test_invars1(10) = (/ & 'effective_radius_of_stratiform_cloud_rain_particle ', & 'effective_radius_of_stratiform_cloud_liquid_water_particle', & 'effective_radius_of_stratiform_cloud_snow_particle ', & @@ -359,9 +359,11 @@ program test 'cloud_graupel_number_concentration ', & 'scalar_variable_for_testing ', & 'flag_indicating_cloud_microphysics_has_graupel ', & - 'flag_indicating_cloud_microphysics_has_ice '/) + 'flag_indicating_cloud_microphysics_has_ice ', & + 'shortwave_radiation_fluxes ', & + 'longwave_radiation_fluxes '/) - character(len=cm), target :: test_outvars1(8) = (/ & + character(len=cm), target :: test_outvars1(10) = (/ & 'ccpp_error_code ', & 'ccpp_error_message ', & 'effective_radius_of_stratiform_cloud_ice_particle ', & @@ -369,9 +371,11 @@ program test 'effective_radius_of_stratiform_cloud_rain_particle ', & 'effective_radius_of_stratiform_cloud_snow_particle ', & 'cloud_ice_number_concentration ', & - 'scalar_variable_for_testing ' /) + 'scalar_variable_for_testing ', & + 'shortwave_radiation_fluxes ', & + 'longwave_radiation_fluxes '/) - character(len=cm), target :: test_reqvars1(12) = (/ & + character(len=cm), target :: test_reqvars1(14) = (/ & 'ccpp_error_code ', & 'ccpp_error_message ', & 'effective_radius_of_stratiform_cloud_rain_particle ', & @@ -383,7 +387,9 @@ program test 'cloud_ice_number_concentration ', & 'scalar_variable_for_testing ', & 'flag_indicating_cloud_microphysics_has_graupel ', & - 'flag_indicating_cloud_microphysics_has_ice '/) + 'flag_indicating_cloud_microphysics_has_ice ', & + 'shortwave_radiation_fluxes ', & + 'longwave_radiation_fluxes '/) type(suite_info) :: test_suites(1) logical :: run_okay diff --git a/test/var_compatibility_test/test_host_data.F90 b/test/var_compatibility_test/test_host_data.F90 index 9d0ca306..9f9b2395 100644 --- a/test/var_compatibility_test/test_host_data.F90 +++ b/test/var_compatibility_test/test_host_data.F90 @@ -1,7 +1,7 @@ module test_host_data use ccpp_kinds, only: kind_phys - + use module_rad_ddt, only: ty_rad_lw, ty_rad_sw !> \section arg_table_physics_state Argument Table !! \htmlinclude arg_table_physics_state.html type physics_state @@ -13,6 +13,10 @@ module test_host_data ncg, & ! number concentration of cloud graupel nci ! number concentration of cloud ice real(kind_phys) :: scalar_var + type(ty_rad_lw), dimension(:), allocatable :: & + fluxLW ! Longwave radiation fluxes + type(ty_rad_sw), dimension(:), allocatable :: & + fluxSW ! Shortwave radiation fluxes end type physics_state public allocate_physics_state @@ -62,6 +66,16 @@ subroutine allocate_physics_state(cols, levels, state, has_graupel, has_ice) allocate(state%nci(cols, levels)) endif + if (allocated(state%fluxLW)) then + deallocate(state%fluxLW) + end if + allocate(state%fluxLW(cols)) + + if (allocated(state%fluxSW)) then + deallocate(state%fluxSW) + end if + allocate(state%fluxSW(cols)) + end subroutine allocate_physics_state end module test_host_data diff --git a/test/var_compatibility_test/test_host_data.meta b/test/var_compatibility_test/test_host_data.meta index d3bca89b..e14c9811 100644 --- a/test/var_compatibility_test/test_host_data.meta +++ b/test/var_compatibility_test/test_host_data.meta @@ -1,6 +1,7 @@ [ccpp-table-properties] name = physics_state type = ddt + dependencies = module_rad_ddt.F90 [ccpp-arg-table] name = physics_state type = ddt @@ -59,3 +60,23 @@ dimensions = () type = real kind = kind_phys +[fluxSW] + standard_name = shortwave_radiation_fluxes + long_name = shortwave radiation fluxes + units = W m-2 + dimensions = (horizontal_dimension) + type = ty_rad_sw +[fluxLW] + standard_name = longwave_radiation_fluxes + long_name = longwave radiation fluxes + units = W m-2 + dimensions = (horizontal_dimension) + type = ty_rad_lw + +[ccpp-table-properties] + name = test_host_data + type = module + dependencies = module_rad_ddt.F90 +[ccpp-arg-table] + name = test_host_data + type = module \ No newline at end of file diff --git a/test/var_compatibility_test/test_reports.py b/test/var_compatibility_test/test_reports.py index 6f10fc6d..91b0cefe 100755 --- a/test/var_compatibility_test/test_reports.py +++ b/test/var_compatibility_test/test_reports.py @@ -65,8 +65,9 @@ def usage(errmsg=None): _CCPP_FILES = _UTILITY_FILES + \ [os.path.join(_BUILD_DIR, "ccpp", "test_host_ccpp_cap.F90"), os.path.join(_BUILD_DIR, "ccpp", "ccpp_var_compatibility_suite_cap.F90")] -_MODULE_LIST = ["effr_calc", "effr_diag", "effr_post", "effr_pre"] +_MODULE_LIST = ["effr_calc", "effr_diag", "effr_post", "effr_pre", "rad_lw", "rad_sw"] _SUITE_LIST = ["var_compatibility_suite"] +_DEPENDENCIES = [ os.path.join(_TEST_DIR, "module_rad_ddt.F90")] _INPUT_VARS_VAR_ACTION = ["horizontal_loop_begin", "horizontal_loop_end", "horizontal_dimension", "vertical_layer_dimension", "effective_radius_of_stratiform_cloud_liquid_water_particle", "effective_radius_of_stratiform_cloud_rain_particle", @@ -75,14 +76,18 @@ def usage(errmsg=None): "cloud_graupel_number_concentration", "scalar_variable_for_testing", "flag_indicating_cloud_microphysics_has_graupel", - "flag_indicating_cloud_microphysics_has_ice"] + "flag_indicating_cloud_microphysics_has_ice", + "shortwave_radiation_fluxes", + "longwave_radiation_fluxes"] _OUTPUT_VARS_VAR_ACTION = ["ccpp_error_code", "ccpp_error_message", "effective_radius_of_stratiform_cloud_ice_particle", "effective_radius_of_stratiform_cloud_liquid_water_particle", "effective_radius_of_stratiform_cloud_snow_particle", "cloud_ice_number_concentration", "effective_radius_of_stratiform_cloud_rain_particle", - "scalar_variable_for_testing"] + "scalar_variable_for_testing", + "shortwave_radiation_fluxes", + "longwave_radiation_fluxes"] _REQUIRED_VARS_VAR_ACTION = _INPUT_VARS_VAR_ACTION + _OUTPUT_VARS_VAR_ACTION def fields_string(field_type, field_list, sep): @@ -148,6 +153,8 @@ def check_datatable(database, report_type, check_list, _MODULE_LIST) NUM_ERRORS += check_datatable(_DATABASE, DatatableReport("suite_list"), _SUITE_LIST) +NUM_ERRORS += check_datatable(_DATABASE, DatatableReport("dependencies"), + _DEPENDENCIES) print("\nChecking variables for var_compatibility suite from python") NUM_ERRORS += check_datatable(_DATABASE, DatatableReport("required_variables", value="var_compatibility_suite"), diff --git a/test/var_compatibility_test/var_compatibility_files.txt b/test/var_compatibility_test/var_compatibility_files.txt index 6d83c980..71df1054 100644 --- a/test/var_compatibility_test/var_compatibility_files.txt +++ b/test/var_compatibility_test/var_compatibility_files.txt @@ -1,4 +1,7 @@ +module_rad_ddt.meta effr_calc.meta effr_diag.meta effr_pre.meta effr_post.meta +rad_lw.meta +rad_sw.meta diff --git a/test/var_compatibility_test/var_compatibility_suite.xml b/test/var_compatibility_test/var_compatibility_suite.xml index 5956a8bd..de6ebfe5 100644 --- a/test/var_compatibility_test/var_compatibility_suite.xml +++ b/test/var_compatibility_test/var_compatibility_suite.xml @@ -4,7 +4,9 @@ effr_pre effr_calc - effr_post + effr_post effr_diag + rad_lw + rad_sw From 03429da17d210c9843806f40ecb75f4a9974f210 Mon Sep 17 00:00:00 2001 From: Dustin Swales Date: Mon, 3 Feb 2025 18:32:25 +0000 Subject: [PATCH 2/4] Allow for module/source filename differences. Add test --- scripts/metadata_table.py | 52 ++++++++++++++++++- .../var_compatibility_test/module_rad_ddt.F90 | 4 +- test/var_compatibility_test/rad_lw.F90 | 2 +- test/var_compatibility_test/rad_sw.F90 | 2 +- .../var_compatibility_test/test_host_data.F90 | 2 +- 5 files changed, 55 insertions(+), 7 deletions(-) diff --git a/scripts/metadata_table.py b/scripts/metadata_table.py index 942f8d81..fc001fd8 100755 --- a/scripts/metadata_table.py +++ b/scripts/metadata_table.py @@ -223,6 +223,51 @@ def parse_metadata_file(filename, known_ddts, run_env, skip_ddt_check=False): ######################################################################## +def find_module_name(filename): + """Find the module name from module header in """ + module_name = '' + if os.path.isfile(filename): + with open(filename, 'r') as infile: + fin_lines = infile.readlines() + # end with + num_lines = len(fin_lines) + context = ParseContext(linenum=1, filename=filename) + while context.line_num <= num_lines: + if MetadataTable.table_start(fin_lines[context.line_num - 1]): + found_start = False + while not found_start: + line = fin_lines[context.line_num].strip() + context.line_num += 1 + if line and (line[0] == '['): + found_start = True + elif line: + props = _parse_config_line(line, context) + for prop in props: + # Look for name property + key = prop[0].strip().lower() + value = prop[1].strip() + if key == 'name' : + name = value + if key == 'type' : + if (value == 'module') or (value == 'scheme'): + module_name = name + break + # end if + # end for + # end if + if context.line_num > num_lines: + break + # end if + # end while + else: + context.line_num += 1 + # end if + # end while + # end if + return module_name + +######################################################################## + def find_scheme_names(filename): """Find and return a list of all the physics scheme names in . A scheme is identified by its ccpp-table-properties name. @@ -813,8 +858,11 @@ def __init_from_file(self, table_name, table_type, known_ddts, run_env, skip_ddt if self.header_type == "ddt": known_ddts.append(self.title) # end if - # We need a default module if none was listed - if self.module is None: + # We need a default module if none was listed. + # DJS2024: First, try to find module_name from the metadata. Otherwise, + # use file name as module_name (default). + self.__module_name = find_module_name(self.__pobj.filename) + if (self.__module_name == ''): self.__module_name = self._default_module() # end if # Initialize our ParseSource parent diff --git a/test/var_compatibility_test/module_rad_ddt.F90 b/test/var_compatibility_test/module_rad_ddt.F90 index 79ec12a5..fd59da43 100644 --- a/test/var_compatibility_test/module_rad_ddt.F90 +++ b/test/var_compatibility_test/module_rad_ddt.F90 @@ -4,8 +4,8 @@ module mod_rad_ddt public ty_rad_lw, ty_rad_sw - !> \section arg_table_module_rad_ddt Argument Table - !! \htmlinclude arg_table_module_rad_ddt.html + !> \section arg_table_mod_rad_ddt Argument Table + !! \htmlinclude arg_table_mod_rad_ddt.html !! !> \section arg_table_ty_rad_lw Argument Table diff --git a/test/var_compatibility_test/rad_lw.F90 b/test/var_compatibility_test/rad_lw.F90 index 6fd97ec8..5859f8bf 100644 --- a/test/var_compatibility_test/rad_lw.F90 +++ b/test/var_compatibility_test/rad_lw.F90 @@ -1,6 +1,6 @@ module rad_lw use ccpp_kinds, only: kind_phys - use module_rad_ddt, only: ty_rad_lw + use mod_rad_ddt, only: ty_rad_lw implicit none private diff --git a/test/var_compatibility_test/rad_sw.F90 b/test/var_compatibility_test/rad_sw.F90 index 4354193d..a0f22af9 100644 --- a/test/var_compatibility_test/rad_sw.F90 +++ b/test/var_compatibility_test/rad_sw.F90 @@ -1,6 +1,6 @@ module rad_sw use ccpp_kinds, only: kind_phys - use module_rad_ddt, only: ty_rad_sw + use mod_rad_ddt, only: ty_rad_sw implicit none private diff --git a/test/var_compatibility_test/test_host_data.F90 b/test/var_compatibility_test/test_host_data.F90 index 9f9b2395..b204c92c 100644 --- a/test/var_compatibility_test/test_host_data.F90 +++ b/test/var_compatibility_test/test_host_data.F90 @@ -1,7 +1,7 @@ module test_host_data use ccpp_kinds, only: kind_phys - use module_rad_ddt, only: ty_rad_lw, ty_rad_sw + use mod_rad_ddt, only: ty_rad_lw, ty_rad_sw !> \section arg_table_physics_state Argument Table !! \htmlinclude arg_table_physics_state.html type physics_state From 690215ff2abca1133e2b1806e053e6658e930a0e Mon Sep 17 00:00:00 2001 From: Dustin Swales Date: Mon, 3 Feb 2025 20:49:25 +0000 Subject: [PATCH 3/4] Add logic to allow for module name to come from initialization. Doc tests passing --- scripts/metadata_table.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/metadata_table.py b/scripts/metadata_table.py index fc001fd8..6b7c0a79 100755 --- a/scripts/metadata_table.py +++ b/scripts/metadata_table.py @@ -859,11 +859,13 @@ def __init_from_file(self, table_name, table_type, known_ddts, run_env, skip_ddt known_ddts.append(self.title) # end if # We need a default module if none was listed. - # DJS2024: First, try to find module_name from the metadata. Otherwise, - # use file name as module_name (default). - self.__module_name = find_module_name(self.__pobj.filename) - if (self.__module_name == ''): - self.__module_name = self._default_module() + # DJS2024: If module_name not provided through initialization, try + # to find module_name from the metadata. Otherwise, use file name + # as module_name (default). + if (self.__module_name == None): + self.__module_name = find_module_name(self.__pobj.filename) + if (self.__module_name == ''): + self.__module_name = self._default_module() # end if # Initialize our ParseSource parent super().__init__(self.title, self.header_type, self.__pobj) From 8fef76a37d36e09e606fa6f4a7488cb6885ea6a0 Mon Sep 17 00:00:00 2001 From: Dustin Swales Date: Mon, 3 Feb 2025 23:47:24 +0000 Subject: [PATCH 4/4] Use DDT subfields as scheme dummy arguments. Add testing --- scripts/ddt_library.py | 11 ++++++++--- test/var_compatibility_test/module_rad_ddt.F90 | 4 ++-- .../var_compatibility_test/module_rad_ddt.meta | 4 ++-- test/var_compatibility_test/rad_sw.F90 | 10 +++++----- test/var_compatibility_test/rad_sw.meta | 18 ++++++++++++------ test/var_compatibility_test/run_test | 9 ++++++--- test/var_compatibility_test/test_host.F90 | 15 +++++++++------ test/var_compatibility_test/test_host_data.F90 | 13 +++++++++---- .../var_compatibility_test/test_host_data.meta | 2 +- test/var_compatibility_test/test_reports.py | 6 ++++-- 10 files changed, 58 insertions(+), 34 deletions(-) diff --git a/scripts/ddt_library.py b/scripts/ddt_library.py index 35425599..1c362108 100644 --- a/scripts/ddt_library.py +++ b/scripts/ddt_library.py @@ -252,9 +252,10 @@ def check_ddt_type(self, var, header, lname=None): # end if (no else needed) def collect_ddt_fields(self, var_dict, var, run_env, - ddt=None, skip_duplicates=False): + ddt=None, skip_duplicates=False, parent=None): """Add all the reachable fields from DDT variable of type, to . Each field is added as a VarDDT. + If , add VarDDT recursively using parent. Note: By default, it is an error to try to add a duplicate field to (i.e., the field already exists in or one of its parents). To simply skip duplicate @@ -272,12 +273,16 @@ def collect_ddt_fields(self, var_dict, var, run_env, # end if # end if for dvar in ddt.variable_list(): - subvar = VarDDT(dvar, var, self.run_env) + if parent is None: + subvar = VarDDT(dvar, var, self.run_env) + else: + subvar = VarDDT(VarDDT(dvar, var, self.run_env), parent, self.run_env) + # end if dvtype = dvar.get_prop_value('type') if (dvar.is_ddt()) and (dvtype in self): # If DDT in our library, we need to add sub-fields recursively. subddt = self[dvtype] - self.collect_ddt_fields(var_dict, subvar, run_env, ddt=subddt) + self.collect_ddt_fields(var_dict, dvar, run_env, parent=var, ddt=subddt) # end if # add_variable only checks the current dictionary. By default, # for a DDT, the variable also cannot be in our parent diff --git a/test/var_compatibility_test/module_rad_ddt.F90 b/test/var_compatibility_test/module_rad_ddt.F90 index fd59da43..2e8af9a9 100644 --- a/test/var_compatibility_test/module_rad_ddt.F90 +++ b/test/var_compatibility_test/module_rad_ddt.F90 @@ -20,8 +20,8 @@ module mod_rad_ddt !! \htmlinclude arg_table_ty_rad_sw.html !! type ty_rad_sw - real(kind_phys) :: sfc_up_sw - real(kind_phys) :: sfc_down_sw + real(kind_phys), pointer :: sfc_up_sw(:) => null() + real(kind_phys), pointer :: sfc_down_sw(:) => null() end type ty_rad_sw end module mod_rad_ddt diff --git a/test/var_compatibility_test/module_rad_ddt.meta b/test/var_compatibility_test/module_rad_ddt.meta index f47c70e4..ee9a0a24 100644 --- a/test/var_compatibility_test/module_rad_ddt.meta +++ b/test/var_compatibility_test/module_rad_ddt.meta @@ -34,12 +34,12 @@ [ sfc_up_sw ] standard_name = surface_upwelling_shortwave_radiation_flux units = W m2 - dimensions = () + dimensions = (horizontal_dimension) type = real kind = kind_phys [ sfc_down_sw ] standard_name = surface_downwelling_shortwave_radiation_flux units = W m2 - dimensions = () + dimensions = (horizontal_dimension) type = real kind = kind_phys \ No newline at end of file diff --git a/test/var_compatibility_test/rad_sw.F90 b/test/var_compatibility_test/rad_sw.F90 index a0f22af9..ddf35224 100644 --- a/test/var_compatibility_test/rad_sw.F90 +++ b/test/var_compatibility_test/rad_sw.F90 @@ -1,6 +1,5 @@ module rad_sw use ccpp_kinds, only: kind_phys - use mod_rad_ddt, only: ty_rad_sw implicit none private @@ -12,10 +11,11 @@ module rad_sw !> \section arg_table_rad_sw_run Argument Table !! \htmlinclude arg_table_rad_sw_run.html !! - subroutine rad_sw_run(ncol, fluxSW, errmsg, errflg) + subroutine rad_sw_run(ncol, sfc_up_sw, sfc_down_sw, errmsg, errflg) integer, intent(in) :: ncol - type(ty_rad_sw), intent(inout) :: fluxSW(:) + real(kind_phys), intent(inout) :: sfc_up_sw(:) + real(kind_phys), intent(inout) :: sfc_down_sw(:) character(len=512), intent(out) :: errmsg integer, intent(out) :: errflg @@ -26,8 +26,8 @@ subroutine rad_sw_run(ncol, fluxSW, errmsg, errflg) errflg = 0 do icol=1,ncol - fluxSW(icol)%sfc_up_sw = 100._kind_phys - fluxSW(icol)%sfc_down_sw = 400._kind_phys + sfc_up_sw(icol) = 100._kind_phys + sfc_down_sw(icol) = 400._kind_phys enddo end subroutine rad_sw_run diff --git a/test/var_compatibility_test/rad_sw.meta b/test/var_compatibility_test/rad_sw.meta index 81f2d583..d88b9acc 100644 --- a/test/var_compatibility_test/rad_sw.meta +++ b/test/var_compatibility_test/rad_sw.meta @@ -1,7 +1,6 @@ [ccpp-table-properties] name = rad_sw type = scheme - dependencies = module_rad_ddt.F90 [ccpp-arg-table] name = rad_sw_run type = scheme @@ -11,12 +10,19 @@ units = count dimensions = () intent = in -[fluxSW] - standard_name = shortwave_radiation_fluxes - long_name = shortwave radiation fluxes - units = W m-2 +[ sfc_up_sw ] + standard_name = surface_upwelling_shortwave_radiation_flux + units = W m2 dimensions = (horizontal_loop_extent) - type = ty_rad_sw + type = real + kind = kind_phys + intent = inout +[ sfc_down_sw ] + standard_name = surface_downwelling_shortwave_radiation_flux + units = W m2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys intent = inout [ errmsg ] standard_name = ccpp_error_message diff --git a/test/var_compatibility_test/run_test b/test/var_compatibility_test/run_test index b939ab0b..3b0f55dc 100755 --- a/test/var_compatibility_test/run_test +++ b/test/var_compatibility_test/run_test @@ -146,7 +146,8 @@ required_vars_var_compatibility="${required_vars_var_compatibility},horizontal_l required_vars_var_compatibility="${required_vars_var_compatibility},longwave_radiation_fluxes" required_vars_var_compatibility="${required_vars_var_compatibility},scalar_variable_for_testing" required_vars_var_compatibility="${required_vars_var_compatibility},scheme_order_in_suite" -required_vars_var_compatibility="${required_vars_var_compatibility},shortwave_radiation_fluxes" +required_vars_var_compatibility="${required_vars_var_compatibility},surface_downwelling_shortwave_radiation_flux" +required_vars_var_compatibility="${required_vars_var_compatibility},surface_upwelling_shortwave_radiation_flux" required_vars_var_compatibility="${required_vars_var_compatibility},vertical_layer_dimension" input_vars_var_compatibility="cloud_graupel_number_concentration" #input_vars_var_compatibility="${input_vars_var_compatibility},cloud_ice_number_concentration" @@ -162,7 +163,8 @@ input_vars_var_compatibility="${input_vars_var_compatibility},horizontal_loop_en input_vars_var_compatibility="${input_vars_var_compatibility},longwave_radiation_fluxes" input_vars_var_compatibility="${input_vars_var_compatibility},scalar_variable_for_testing" input_vars_var_compatibility="${input_vars_var_compatibility},scheme_order_in_suite" -input_vars_var_compatibility="${input_vars_var_compatibility},shortwave_radiation_fluxes" +input_vars_var_compatibility="${input_vars_var_compatibility},surface_downwelling_shortwave_radiation_flux" +input_vars_var_compatibility="${input_vars_var_compatibility},surface_upwelling_shortwave_radiation_flux" input_vars_var_compatibility="${input_vars_var_compatibility},vertical_layer_dimension" output_vars_var_compatibility="ccpp_error_code,ccpp_error_message" output_vars_var_compatibility="${output_vars_var_compatibility},cloud_ice_number_concentration" @@ -173,7 +175,8 @@ output_vars_var_compatibility="${output_vars_var_compatibility},effective_radius output_vars_var_compatibility="${output_vars_var_compatibility},longwave_radiation_fluxes" output_vars_var_compatibility="${output_vars_var_compatibility},scalar_variable_for_testing" output_vars_var_compatibility="${output_vars_var_compatibility},scheme_order_in_suite" -output_vars_var_compatibility="${output_vars_var_compatibility},shortwave_radiation_fluxes" +output_vars_var_compatibility="${output_vars_var_compatibility},surface_downwelling_shortwave_radiation_flux" +output_vars_var_compatibility="${output_vars_var_compatibility},surface_upwelling_shortwave_radiation_flux" ## ## Run a database report and check the return string diff --git a/test/var_compatibility_test/test_host.F90 b/test/var_compatibility_test/test_host.F90 index b66b39df..15c20a52 100644 --- a/test/var_compatibility_test/test_host.F90 +++ b/test/var_compatibility_test/test_host.F90 @@ -351,7 +351,7 @@ program test character(len=cs), target :: test_parts1(1) = (/ 'radiation ' /) - character(len=cm), target :: test_invars1(11) = (/ & + character(len=cm), target :: test_invars1(12) = (/ & 'effective_radius_of_stratiform_cloud_rain_particle ', & 'effective_radius_of_stratiform_cloud_liquid_water_particle', & 'effective_radius_of_stratiform_cloud_snow_particle ', & @@ -361,10 +361,11 @@ program test 'scheme_order_in_suite ', & 'flag_indicating_cloud_microphysics_has_graupel ', & 'flag_indicating_cloud_microphysics_has_ice ', & - 'shortwave_radiation_fluxes ', & + 'surface_downwelling_shortwave_radiation_flux ', & + 'surface_upwelling_shortwave_radiation_flux ', & 'longwave_radiation_fluxes '/) - character(len=cm), target :: test_outvars1(11) = (/ & + character(len=cm), target :: test_outvars1(12) = (/ & 'ccpp_error_code ', & 'ccpp_error_message ', & 'effective_radius_of_stratiform_cloud_ice_particle ', & @@ -374,10 +375,11 @@ program test 'cloud_ice_number_concentration ', & 'scalar_variable_for_testing ', & 'scheme_order_in_suite ', & - 'shortwave_radiation_fluxes ', & + 'surface_downwelling_shortwave_radiation_flux ', & + 'surface_upwelling_shortwave_radiation_flux ', & 'longwave_radiation_fluxes '/) - character(len=cm), target :: test_reqvars1(15) = (/ & + character(len=cm), target :: test_reqvars1(16) = (/ & 'ccpp_error_code ', & 'ccpp_error_message ', & 'effective_radius_of_stratiform_cloud_rain_particle ', & @@ -391,7 +393,8 @@ program test 'scheme_order_in_suite ', & 'flag_indicating_cloud_microphysics_has_graupel ', & 'flag_indicating_cloud_microphysics_has_ice ', & - 'shortwave_radiation_fluxes ', & + 'surface_downwelling_shortwave_radiation_flux ', & + 'surface_upwelling_shortwave_radiation_flux ', & 'longwave_radiation_fluxes '/) type(suite_info) :: test_suites(1) diff --git a/test/var_compatibility_test/test_host_data.F90 b/test/var_compatibility_test/test_host_data.F90 index 26f72467..41772e58 100644 --- a/test/var_compatibility_test/test_host_data.F90 +++ b/test/var_compatibility_test/test_host_data.F90 @@ -15,7 +15,7 @@ module test_host_data real(kind_phys) :: scalar_var type(ty_rad_lw), dimension(:), allocatable :: & fluxLW ! Longwave radiation fluxes - type(ty_rad_sw), dimension(:), allocatable :: & + type(ty_rad_sw) :: & fluxSW ! Shortwave radiation fluxes integer :: scheme_order end type physics_state @@ -73,10 +73,15 @@ subroutine allocate_physics_state(cols, levels, state, has_graupel, has_ice) end if allocate(state%fluxLW(cols)) - if (allocated(state%fluxSW)) then - deallocate(state%fluxSW) + if (associated(state%fluxSW%sfc_up_sw)) then + nullify(state%fluxSW%sfc_up_sw) end if - allocate(state%fluxSW(cols)) + allocate(state%fluxSW%sfc_up_sw(cols)) + + if (associated(state%fluxSW%sfc_down_sw)) then + nullify(state%fluxSW%sfc_down_sw) + end if + allocate(state%fluxSW%sfc_down_sw(cols)) ! Initialize scheme counter. state%scheme_order = 1 diff --git a/test/var_compatibility_test/test_host_data.meta b/test/var_compatibility_test/test_host_data.meta index 8fb76e0e..1c8172b4 100644 --- a/test/var_compatibility_test/test_host_data.meta +++ b/test/var_compatibility_test/test_host_data.meta @@ -64,7 +64,7 @@ standard_name = shortwave_radiation_fluxes long_name = shortwave radiation fluxes units = W m-2 - dimensions = (horizontal_dimension) + dimensions = () type = ty_rad_sw [fluxLW] standard_name = longwave_radiation_fluxes diff --git a/test/var_compatibility_test/test_reports.py b/test/var_compatibility_test/test_reports.py index 9a260af5..c7555df0 100755 --- a/test/var_compatibility_test/test_reports.py +++ b/test/var_compatibility_test/test_reports.py @@ -78,7 +78,8 @@ def usage(errmsg=None): "scheme_order_in_suite", "flag_indicating_cloud_microphysics_has_graupel", "flag_indicating_cloud_microphysics_has_ice", - "shortwave_radiation_fluxes", + "surface_downwelling_shortwave_radiation_flux", + "surface_upwelling_shortwave_radiation_flux", "longwave_radiation_fluxes"] _OUTPUT_VARS_VAR_ACTION = ["ccpp_error_code", "ccpp_error_message", "effective_radius_of_stratiform_cloud_ice_particle", @@ -87,7 +88,8 @@ def usage(errmsg=None): "cloud_ice_number_concentration", "effective_radius_of_stratiform_cloud_rain_particle", "scalar_variable_for_testing", - "shortwave_radiation_fluxes", + "surface_downwelling_shortwave_radiation_flux", + "surface_upwelling_shortwave_radiation_flux", "longwave_radiation_fluxes", "scheme_order_in_suite"] _REQUIRED_VARS_VAR_ACTION = _INPUT_VARS_VAR_ACTION + _OUTPUT_VARS_VAR_ACTION