diff --git a/scripts/metavar.py b/scripts/metavar.py index 35878bc4..66784e2e 100755 --- a/scripts/metavar.py +++ b/scripts/metavar.py @@ -1677,12 +1677,37 @@ def add_variable(self, newvar, run_env, exists_ok=False, gen_unique=False, context=newvar.context) # end if # end if + # Check if local_name exists in Group. If applicable, Create new + # variable with unique name. There are two instances when new names are + # created: + # - Same used in different DDTs. + # - Different using the same in a Group. + # During the Group analyze phase, is True. lname = newvar.get_prop_value('local_name') lvar = self.find_local_name(lname) if lvar is not None: + # Check if is part of a different DDT than . + # The API uses the full variable references when calling the Group Caps, + # and . + # Within the context of a full reference, it is allowable for local_names + # to be the same in different data containers. + newvar_callstr = newvar.call_string(self) + lvar_callstr = lvar.call_string(self) + if newvar_callstr and lvar_callstr: + if newvar_callstr != lvar_callstr: + if not gen_unique: + exists_ok = True + # end if + # end if + # end if if gen_unique: new_lname = self.new_internal_variable_name(prefix=lname) newvar = newvar.clone(new_lname) + # Local_name needs to be the local_name for the new + # internal variable, otherwise multiple instances of the same + # local_name in the Group cap will all be overwritten with the + # same local_name + lname = new_lname elif not exists_ok: errstr = 'Invalid local_name: {} already registered{}' cstr = context_string(lvar.source.context, with_comma=True) diff --git a/scripts/suite_objects.py b/scripts/suite_objects.py index 4fac98b8..fb3a66c6 100755 --- a/scripts/suite_objects.py +++ b/scripts/suite_objects.py @@ -2273,7 +2273,7 @@ def manage_variable(self, newvar): ParseSource(_API_SOURCE_NAME, _API_LOCAL_VAR_NAME, newvar.context), self.run_env) - self.add_variable(local_var, self.run_env, exists_ok=True) + self.add_variable(local_var, self.run_env, exists_ok=True, gen_unique=True) # Finally, make sure all dimensions are accounted for emsg = self.add_variable_dimensions(local_var, _API_LOCAL_VAR_TYPES, adjust_intent=True, diff --git a/test/var_compatibility_test/effr_diag.F90 b/test/var_compatibility_test/effr_diag.F90 index 23993f5e..409ff2f9 100644 --- a/test/var_compatibility_test/effr_diag.F90 +++ b/test/var_compatibility_test/effr_diag.F90 @@ -36,9 +36,10 @@ end subroutine effr_diag_init !> \section arg_table_effr_diag_run Argument Table !! \htmlinclude arg_table_effr_diag_run.html !! - subroutine effr_diag_run( effrr_in, errmsg, errflg) + subroutine effr_diag_run( effrr_in, scalar_var, errmsg, errflg) real(kind_phys), intent(in) :: effrr_in(:,:) + integer, intent(in) :: scalar_var character(len=512), intent(out) :: errmsg integer, intent(out) :: errflg !---------------------------------------------------------------- @@ -49,6 +50,10 @@ subroutine effr_diag_run( effrr_in, errmsg, errflg) call cmp_effr_diag(effrr_in, effrr_min, effrr_max) + if (scalar_var .ne. 380) then + errmsg = 'ERROR: effr_diag_run(): scalar_var should be 380' + errflg = 1 + endif end subroutine effr_diag_run subroutine cmp_effr_diag(effr, effr_min, effr_max) diff --git a/test/var_compatibility_test/effr_diag.meta b/test/var_compatibility_test/effr_diag.meta index 1855fd89..9e0e4fc2 100644 --- a/test/var_compatibility_test/effr_diag.meta +++ b/test/var_compatibility_test/effr_diag.meta @@ -41,6 +41,13 @@ kind = kind_phys intent = in top_at_one = True +[ scalar_var ] + standard_name = scalar_variable_for_testing_c + long_name = unused scalar variable C + units = m + dimensions = () + type = integer + intent = in [ errmsg ] standard_name = ccpp_error_message long_name = Error message for error handling in CCPP diff --git a/test/var_compatibility_test/effr_post.F90 b/test/var_compatibility_test/effr_post.F90 index 17c63cc0..d42a574c 100644 --- a/test/var_compatibility_test/effr_post.F90 +++ b/test/var_compatibility_test/effr_post.F90 @@ -36,9 +36,10 @@ end subroutine effr_post_init !> \section arg_table_effr_post_run Argument Table !! \htmlinclude arg_table_effr_post_run.html !! - subroutine effr_post_run( effrr_inout, errmsg, errflg) + subroutine effr_post_run( effrr_inout, scalar_var, errmsg, errflg) real(kind_phys), intent(inout) :: effrr_inout(:,:) + real(kind_phys), intent(in) :: scalar_var character(len=512), intent(out) :: errmsg integer, intent(out) :: errflg !---------------------------------------------------------------- @@ -50,6 +51,11 @@ subroutine effr_post_run( effrr_inout, errmsg, errflg) ! Do some post-processing on effrr... effrr_inout(:,:) = effrr_inout(:,:)*1._kind_phys + if (scalar_var .ne. 1013.0) then + errmsg = 'ERROR: effr_post_run(): scalar_var should be 1013.0' + errflg = 1 + endif + end subroutine effr_post_run end module effr_post diff --git a/test/var_compatibility_test/effr_post.meta b/test/var_compatibility_test/effr_post.meta index fd1d554e..721582a6 100644 --- a/test/var_compatibility_test/effr_post.meta +++ b/test/var_compatibility_test/effr_post.meta @@ -40,6 +40,14 @@ type = real kind = kind_phys intent = inout +[ scalar_var ] + standard_name = scalar_variable_for_testing_b + long_name = unused scalar variable B + units = m + dimensions = () + type = real + kind = kind_phys + intent = in [ errmsg ] standard_name = ccpp_error_message long_name = Error message for error handling in CCPP diff --git a/test/var_compatibility_test/effr_pre.F90 b/test/var_compatibility_test/effr_pre.F90 index dcd3363a..51f1c373 100644 --- a/test/var_compatibility_test/effr_pre.F90 +++ b/test/var_compatibility_test/effr_pre.F90 @@ -35,9 +35,10 @@ end subroutine effr_pre_init !> \section arg_table_effr_pre_run Argument Table !! \htmlinclude arg_table_effr_pre_run.html !! - subroutine effr_pre_run( effrr_inout, errmsg, errflg) + subroutine effr_pre_run( effrr_inout, scalar_var, errmsg, errflg) real(kind_phys), intent(inout) :: effrr_inout(:,:) + real(kind_phys), intent(in) :: scalar_var character(len=512), intent(out) :: errmsg integer, intent(out) :: errflg !---------------------------------------------------------------- @@ -49,6 +50,11 @@ subroutine effr_pre_run( effrr_inout, errmsg, errflg) ! Do some pre-processing on effrr... effrr_inout(:,:) = effrr_inout(:,:)*1._kind_phys + if (scalar_var .ne. 273.15) then + errmsg = 'ERROR: effr_pre_run(): scalar_var should be 273.15' + errflg = 1 + endif + end subroutine effr_pre_run end module effr_pre diff --git a/test/var_compatibility_test/effr_pre.meta b/test/var_compatibility_test/effr_pre.meta index 2dc982e6..9c1fcf8e 100644 --- a/test/var_compatibility_test/effr_pre.meta +++ b/test/var_compatibility_test/effr_pre.meta @@ -40,6 +40,14 @@ type = real kind = kind_phys intent = inout +[ scalar_var ] + standard_name = scalar_variable_for_testing_a + long_name = unused scalar variable A + units = m + dimensions = () + type = real + kind = kind_phys + intent = in [ errmsg ] standard_name = ccpp_error_message long_name = Error message for error handling in CCPP diff --git a/test/var_compatibility_test/run_test b/test/var_compatibility_test/run_test index 26e33a3a..b2fa0f90 100755 --- a/test/var_compatibility_test/run_test +++ b/test/var_compatibility_test/run_test @@ -144,6 +144,9 @@ required_vars_var_compatibility="${required_vars_var_compatibility},horizontal_d 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},scalar_variable_for_testing" +required_vars_var_compatibility="${required_vars_var_compatibility},scalar_variable_for_testing_a" +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},vertical_layer_dimension" input_vars_var_compatibility="cloud_graupel_number_concentration" @@ -158,6 +161,9 @@ input_vars_var_compatibility="${input_vars_var_compatibility},horizontal_dimensi 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},scalar_variable_for_testing" +input_vars_var_compatibility="${input_vars_var_compatibility},scalar_variable_for_testing_a" +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},vertical_layer_dimension" output_vars_var_compatibility="ccpp_error_code,ccpp_error_message" diff --git a/test/var_compatibility_test/test_host.F90 b/test/var_compatibility_test/test_host.F90 index 721fc5f9..14b80a60 100644 --- a/test/var_compatibility_test/test_host.F90 +++ b/test/var_compatibility_test/test_host.F90 @@ -351,13 +351,16 @@ program test character(len=cs), target :: test_parts1(1) = (/ 'radiation ' /) - character(len=cm), target :: test_invars1(9) = (/ & + 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 ', & 'effective_radius_of_stratiform_cloud_graupel ', & 'cloud_graupel_number_concentration ', & 'scalar_variable_for_testing ', & + 'scalar_variable_for_testing_a ', & + 'scalar_variable_for_testing_b ', & + 'scalar_variable_for_testing_c ', & 'scheme_order_in_suite ', & 'flag_indicating_cloud_microphysics_has_graupel ', & 'flag_indicating_cloud_microphysics_has_ice '/) @@ -374,7 +377,7 @@ program test 'scheme_order_in_suite '/) - character(len=cm), target :: test_reqvars1(13) = (/ & + character(len=cm), target :: test_reqvars1(16) = (/ & 'ccpp_error_code ', & 'ccpp_error_message ', & 'effective_radius_of_stratiform_cloud_rain_particle ', & @@ -385,6 +388,9 @@ program test 'cloud_graupel_number_concentration ', & 'cloud_ice_number_concentration ', & 'scalar_variable_for_testing ', & + 'scalar_variable_for_testing_a ', & + 'scalar_variable_for_testing_b ', & + 'scalar_variable_for_testing_c ', & 'scheme_order_in_suite ', & 'flag_indicating_cloud_microphysics_has_graupel ', & 'flag_indicating_cloud_microphysics_has_ice '/) diff --git a/test/var_compatibility_test/test_host_data.F90 b/test/var_compatibility_test/test_host_data.F90 index b6552e68..6f351535 100644 --- a/test/var_compatibility_test/test_host_data.F90 +++ b/test/var_compatibility_test/test_host_data.F90 @@ -13,7 +13,11 @@ module test_host_data ncg, & ! number concentration of cloud graupel nci ! number concentration of cloud ice real(kind_phys) :: scalar_var + real(kind_phys) :: scalar_varA + real(kind_phys) :: scalar_varB + integer :: scalar_varC integer :: scheme_order + end type physics_state public allocate_physics_state diff --git a/test/var_compatibility_test/test_host_data.meta b/test/var_compatibility_test/test_host_data.meta index db9d8b16..ba4b2297 100644 --- a/test/var_compatibility_test/test_host_data.meta +++ b/test/var_compatibility_test/test_host_data.meta @@ -59,6 +59,26 @@ dimensions = () type = real kind = kind_phys +[scalar_varA] + standard_name = scalar_variable_for_testing_a + long_name = unused scalar variable A + units = m + dimensions = () + type = real + kind = kind_phys +[scalar_varB] + standard_name = scalar_variable_for_testing_b + long_name = unused scalar variable B + units = m + dimensions = () + type = real + kind = kind_phys +[scalar_varC] + standard_name = scalar_variable_for_testing_c + long_name = unused scalar variable C + units = m + dimensions = () + type = integer [scheme_order] standard_name = scheme_order_in_suite long_name = scheme order in suite definition file diff --git a/test/var_compatibility_test/test_host_mod.F90 b/test/var_compatibility_test/test_host_mod.F90 index ca1d2014..51e36a83 100644 --- a/test/var_compatibility_test/test_host_mod.F90 +++ b/test/var_compatibility_test/test_host_mod.F90 @@ -27,7 +27,10 @@ subroutine init_data() call allocate_physics_state(ncols, pver, phys_state, has_graupel, has_ice) phys_state%effrr = 1.0E-3 ! 1000 microns, in meter phys_state%effrl = 1.0E-4 ! 100 microns, in meter - phys_state%scalar_var = 1.0 ! in m + phys_state%scalar_var = 1.0 ! in m + phys_state%scalar_varA = 273.15 ! in K + phys_state%scalar_varB = 1013.0 ! in mb + phys_state%scalar_varC = 380 ! in ppmv effrs = 5.0E-4 ! 500 microns, in meter if (has_graupel) then phys_state%effrg = 2.5E-4 ! 250 microns, in meter diff --git a/test/var_compatibility_test/test_reports.py b/test/var_compatibility_test/test_reports.py index eb4a5a4b..47f8e33b 100755 --- a/test/var_compatibility_test/test_reports.py +++ b/test/var_compatibility_test/test_reports.py @@ -74,6 +74,9 @@ def usage(errmsg=None): "effective_radius_of_stratiform_cloud_graupel", "cloud_graupel_number_concentration", "scalar_variable_for_testing", + "scalar_variable_for_testing_a", + "scalar_variable_for_testing_b", + "scalar_variable_for_testing_c", "scheme_order_in_suite", "flag_indicating_cloud_microphysics_has_graupel", "flag_indicating_cloud_microphysics_has_ice"]