Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
c135527
Work in progress
dustinswales Feb 3, 2025
03429da
Allow for module/source filename differences. Add test
dustinswales Feb 3, 2025
54f6f92
Merge branch 'develop' of https://github.com/NCAR/ccpp-framework into…
dustinswales Feb 3, 2025
690215f
Add logic to allow for module name to come from initialization. Doc t…
dustinswales Feb 3, 2025
8fef76a
Use DDT subfields as scheme dummy arguments. Add testing
dustinswales Feb 3, 2025
269bdf3
Merge branch 'develop' of https://github.com/NCAR/ccpp-framework into…
dustinswales Feb 11, 2025
c987241
Merge branch 'develop' of https://github.com/NCAR/ccpp-framework into…
dustinswales Feb 27, 2025
d7b03ef
Merge branch 'bugfix/allow_mod_filenames' of https://github.com/dusti…
dustinswales Feb 27, 2025
656fdfe
New implementation of differing module name
Feb 28, 2025
eeb16c2
Fix doctests
Feb 28, 2025
cfe5c8d
Fix unit test failure caused by previous error message cleanup
Feb 28, 2025
4a97ab5
Add scheme file with different module name as test
Feb 28, 2025
8349e0c
Allow host model DDTs to be inputs to schemes
Mar 17, 2025
e260dd5
Host model uses DDT defined in schemes.
Apr 13, 2025
f4e57b1
Uncomment and fix var_compatibility_test checks
Apr 13, 2025
6c2d326
Fix typo
Apr 21, 2025
15b779f
Revert changes in 637
dustinswales Apr 22, 2025
533f332
Merge branch 'source_module_ddt_fixes' of https://github.com/gold2718…
dustinswales Apr 22, 2025
15dd191
Fix some things in merge
dustinswales Apr 22, 2025
3122e81
Merge branch 'develop' of https://github.com/NCAR/ccpp-framework into…
dustinswales Apr 22, 2025
6f3d0ad
Merge branch 'develop' of https://github.com/NCAR/ccpp-framework into…
dustinswales May 22, 2025
aad7177
Add checks to compare LW/SW fluxes against expected values
dustinswales May 22, 2025
db20578
Merge branch 'develop' into bugfix/full_array_ref_in_host_cap
climbfuji May 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions scripts/ddt_library.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 <var> of type,
<ddt> to <var_dict>. Each field is added as a VarDDT.
If <parent>, add VarDDT recursively using parent.
Note: By default, it is an error to try to add a duplicate
field to <var_dict> (i.e., the field already exists in
<var_dict> or one of its parents). To simply skip duplicate
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion test/var_compatibility_test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions test/var_compatibility_test/module_rad_ddt.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions test/var_compatibility_test/module_rad_ddt.meta
Original file line number Diff line number Diff line change
Expand Up @@ -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
10 changes: 5 additions & 5 deletions test/var_compatibility_test/rad_sw.F90
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
module rad_sw
use ccpp_kinds, only: kind_phys
use mod_rad_ddt, only: ty_rad_sw

implicit none
private
Expand All @@ -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

Expand All @@ -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
Comment thread
dustinswales marked this conversation as resolved.
enddo

end subroutine rad_sw_run
Expand Down
18 changes: 12 additions & 6 deletions test/var_compatibility_test/rad_sw.meta
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down
9 changes: 6 additions & 3 deletions test/var_compatibility_test/run_test
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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"

Expand Down
17 changes: 10 additions & 7 deletions test/var_compatibility_test/test_host.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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 ', &
Expand All @@ -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 ', &
Expand All @@ -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 ', &
Expand All @@ -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)
Expand Down
15 changes: 10 additions & 5 deletions test/var_compatibility_test/test_host_data.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion test/var_compatibility_test/test_host_data.meta
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
29 changes: 29 additions & 0 deletions test/var_compatibility_test/test_host_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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
6 changes: 4 additions & 2 deletions test/var_compatibility_test/test_reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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
Expand Down