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/CMakeLists.txt b/test/var_compatibility_test/CMakeLists.txt index 34734c06..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 index c7986a6c..21a1a0ec 100644 --- a/test/var_compatibility_test/module_rad_ddt.F90 +++ b/test/var_compatibility_test/module_rad_ddt.F90 @@ -16,8 +16,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 4576c151..c4792547 100644 --- a/test/var_compatibility_test/module_rad_ddt.meta +++ b/test/var_compatibility_test/module_rad_ddt.meta @@ -29,12 +29,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 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 83a1f07e..fb70bde1 100755 --- a/test/var_compatibility_test/run_test +++ b/test/var_compatibility_test/run_test @@ -151,7 +151,8 @@ required_vars_var_compatibility="${required_vars_var_compatibility},scalar_varia required_vars_var_compatibility="${required_vars_var_compatibility},scalar_variable_for_testing_b" required_vars_var_compatibility="${required_vars_var_compatibility},scalar_variable_for_testing_c" 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},turbulent_kinetic_energy" required_vars_var_compatibility="${required_vars_var_compatibility},turbulent_kinetic_energy2" required_vars_var_compatibility="${required_vars_var_compatibility},vertical_layer_dimension" @@ -172,7 +173,8 @@ input_vars_var_compatibility="${input_vars_var_compatibility},scalar_variable_fo input_vars_var_compatibility="${input_vars_var_compatibility},scalar_variable_for_testing_b" input_vars_var_compatibility="${input_vars_var_compatibility},scalar_variable_for_testing_c" 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},turbulent_kinetic_energy" input_vars_var_compatibility="${input_vars_var_compatibility},turbulent_kinetic_energy2" input_vars_var_compatibility="${input_vars_var_compatibility},vertical_layer_dimension" @@ -185,7 +187,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" output_vars_var_compatibility="${output_vars_var_compatibility},turbulent_kinetic_energy" output_vars_var_compatibility="${output_vars_var_compatibility},turbulent_kinetic_energy2" diff --git a/test/var_compatibility_test/test_host.F90 b/test/var_compatibility_test/test_host.F90 index 65d06827..bbe7b373 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(17) = (/ & + character(len=cm), target :: test_invars1(18) = (/ & 'effective_radius_of_stratiform_cloud_rain_particle ', & 'effective_radius_of_stratiform_cloud_liquid_water_particle', & 'effective_radius_of_stratiform_cloud_snow_particle ', & @@ -367,10 +367,11 @@ program test 'num_subcycles_for_effr ', & '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(13) = (/ & + character(len=cm), target :: test_outvars1(14) = (/ & 'ccpp_error_code ', & 'ccpp_error_message ', & 'effective_radius_of_stratiform_cloud_ice_particle ', & @@ -380,12 +381,13 @@ program test 'cloud_ice_number_concentration ', & 'scalar_variable_for_testing ', & 'scheme_order_in_suite ', & + 'surface_downwelling_shortwave_radiation_flux ', & + 'surface_upwelling_shortwave_radiation_flux ', & 'turbulent_kinetic_energy ', & 'turbulent_kinetic_energy2 ', & - 'shortwave_radiation_fluxes ', & - 'longwave_radiation_fluxes '/) + 'longwave_radiation_fluxes '/) - character(len=cm), target :: test_reqvars1(21) = (/ & + character(len=cm), target :: test_reqvars1(22) = (/ & 'ccpp_error_code ', & 'ccpp_error_message ', & 'effective_radius_of_stratiform_cloud_rain_particle ', & @@ -405,7 +407,8 @@ program test 'num_subcycles_for_effr ', & '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 32b7821f..c46bbfff 100644 --- a/test/var_compatibility_test/test_host_data.F90 +++ b/test/var_compatibility_test/test_host_data.F90 @@ -16,11 +16,11 @@ module test_host_data effrg, & ! effective radius of cloud graupel 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 :: & + type(ty_rad_sw) :: & fluxSW ! Shortwave radiation fluxes - real(kind_phys) :: scalar_var real(kind_phys) :: scalar_varA real(kind_phys) :: scalar_varB real(kind_phys) :: tke, tke2 @@ -82,10 +82,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%sfc_up_sw(cols)) + + if (associated(state%fluxSW%sfc_down_sw)) then + nullify(state%fluxSW%sfc_down_sw) end if - allocate(state%fluxSW(cols)) + 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 b931a6c1..59a0fb4d 100644 --- a/test/var_compatibility_test/test_host_data.meta +++ b/test/var_compatibility_test/test_host_data.meta @@ -78,7 +78,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_host_mod.F90 b/test/var_compatibility_test/test_host_mod.F90 index 5cd4846a..efaeb368 100644 --- a/test/var_compatibility_test/test_host_mod.F90 +++ b/test/var_compatibility_test/test_host_mod.F90 @@ -54,6 +54,10 @@ logical function compare_data() real(kind_phys), parameter :: scalar_expected = 2.0E3 ! 2 km, in meter real(kind_phys), parameter :: tke_expected = 10.0 ! 10 J kg-1 real(kind_phys), parameter :: tolerance = 1.0E-6 ! used as scaling factor for expected value + real(kind_phys), parameter :: sfc_up_sw_expected = 100. ! W/m2 + real(kind_phys), parameter :: sfc_down_sw_expected = 400. ! W/m2 + real(kind_phys), parameter :: sfc_up_lw_expected = 300. ! W/m2 + real(kind_phys), parameter :: sfc_down_lw_expected = 50. ! W/m2 compare_data = .true. @@ -92,6 +96,31 @@ logical function compare_data() abs( phys_state%tke - tke_expected), ' > ', tolerance*tke_expected compare_data = .false. end if + + if (maxval(abs( phys_state%fluxSW%sfc_up_sw - sfc_up_sw_expected)) > tolerance*sfc_up_sw_expected) then + write(6, '(a,e16.7,a,e16.7)') 'Error: max diff of sfc_up_sw from expected value exceeds tolerance: ', & + abs( phys_state%fluxSW%sfc_up_sw - sfc_up_sw_expected), ' > ', tolerance*sfc_up_sw_expected + compare_data = .false. + end if + + if (maxval(abs( phys_state%fluxSW%sfc_down_sw - sfc_down_sw_expected)) > tolerance*sfc_down_sw_expected) then + write(6, '(a,e16.7,a,e16.7)') 'Error: max diff of sfc_down_sw from expected value exceeds tolerance: ', & + abs( phys_state%fluxSW%sfc_down_sw - sfc_down_sw_expected), ' > ', tolerance*sfc_down_sw_expected + compare_data = .false. + end if + + if (maxval(abs( phys_state%fluxLW%sfc_up_lw - sfc_up_lw_expected)) > tolerance*sfc_up_lw_expected) then + write(6, '(a,e16.7,a,e16.7)') 'Error: max diff of sfc_up_lw from expected value exceeds tolerance: ', & + abs( phys_state%fluxLW%sfc_up_lw - sfc_up_lw_expected), ' > ', tolerance*sfc_up_lw_expected + compare_data = .false. + end if + + if (maxval(abs( phys_state%fluxLW%sfc_down_lw - sfc_down_lw_expected)) > tolerance*sfc_down_lw_expected) then + write(6, '(a,e16.7,a,e16.7)') 'Error: max diff of sfc_down_lw from expected value exceeds tolerance: ', & + abs( phys_state%fluxLW%sfc_down_lw - sfc_down_lw_expected), ' > ', tolerance*sfc_down_lw_expected + compare_data = .false. + end if + end function compare_data end module test_host_mod diff --git a/test/var_compatibility_test/test_reports.py b/test/var_compatibility_test/test_reports.py index 03202a7b..4bf0d6bb 100755 --- a/test/var_compatibility_test/test_reports.py +++ b/test/var_compatibility_test/test_reports.py @@ -84,7 +84,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", "num_subcycles_for_effr"] _OUTPUT_VARS_VAR_ACTION = ["ccpp_error_code", "ccpp_error_message", @@ -97,7 +98,8 @@ def usage(errmsg=None): "turbulent_kinetic_energy2", "scalar_variable_for_testing", "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