@@ -33,7 +33,7 @@ module g_tracer_utils
3333
3434#ifdef _USE_MOM6_DIAG
3535 use MOM_diag_mediator, only : register_diag_field_MOM= >register_diag_field
36- use MOM_diag_mediator, only : post_data_MOM= >post_data, post_data_1d_k
36+ use MOM_diag_mediator, only : post_data_MOM= >post_data
3737 use MOM_diag_mediator, only : g_diag_ctrl= >diag_ctrl
3838#else
3939 use diag_manager_mod, only : register_diag_field_FMS= >register_diag_field
@@ -257,6 +257,7 @@ module g_tracer_utils
257257 logical :: flux_drydep = .false. ! Is there a dry deposition?
258258 logical :: flux_bottom = .false. ! Is there a flux through bottom?
259259 logical :: has_btm_reservoir = .false. ! Is there a flux bottom reservoir?
260+ logical :: runoff_added_to_stf = .false. ! Has flux in from runoff been added to stf?
260261
261262 ! Flux identifiers to be set by aof_set_coupler_flux()
262263 integer :: flux_gas_ind = - 1
@@ -267,6 +268,10 @@ module g_tracer_utils
267268 logical :: requires_restart = .true.
268269 ! Tracer source: filename, type, var name, units, record, gridfile
269270 character (len= fm_string_len) :: src_file, src_var_name, src_var_unit, src_var_gridspec
271+ character (len= fm_string_len) :: obc_src_file_name,obc_src_field_name
272+ real :: obc_lfac_in = 1 .
273+ real :: obc_lfac_out= 1 .
274+ logical :: obc_has = .true.
270275 integer :: src_var_record
271276 logical :: requires_src_info = .false.
272277 real :: src_var_unit_conversion = 1.0 ! This factor depends on the tracer. Ask Jasmin
@@ -372,6 +377,7 @@ module g_tracer_utils
372377 public :: g_tracer_get_src_info
373378 public :: g_register_diag_field
374379 public :: g_send_data
380+ public :: g_tracer_get_obc_segment_props
375381 public :: fm_string_len
376382 public :: is_root_pe
377383 ! <INTERFACE NAME="g_tracer_add_param">
@@ -938,6 +944,11 @@ subroutine g_tracer_add(node_ptr, package, name, longname, units, prog, const_i
938944 call g_tracer_add_param(trim (g_tracer% name)// " _valid_min" , g_tracer% src_var_valid_min , - 99.0 )
939945 call g_tracer_add_param(trim (g_tracer% name)// " _valid_max" , g_tracer% src_var_valid_max , + 1.0e64 )
940946 call g_tracer_add_param(trim (g_tracer% name)// " _requires_restart" , g_tracer% requires_restart , .true. )
947+ call g_tracer_add_param(trim (g_tracer% name)// " _obc_has" ,g_tracer% obc_has , .true. )
948+ call g_tracer_add_param(trim (g_tracer% name)// " _obc_src_file_name" ,g_tracer% obc_src_file_name , ' obgc_obc.nc' )
949+ call g_tracer_add_param(trim (g_tracer% name)// " _obc_src_field_name" ,g_tracer% obc_src_field_name,trim (g_tracer% name))
950+ call g_tracer_add_param(trim (g_tracer% name)// " _obc_lfac_in" ,g_tracer% obc_lfac_in , 1.0 )
951+ call g_tracer_add_param(trim (g_tracer% name)// " _obc_lfac_out" ,g_tracer% obc_lfac_out, 1.0 )
941952
942953 ! ===================================================================
943954 ! Reversed Linked List implementation! Make this new node to be the head of the list.
@@ -2005,7 +2016,7 @@ subroutine g_tracer_get_string(g_tracer_list,name,member,string)
20052016 character (len=* ), intent (in ) :: name
20062017 character (len=* ), intent (in ) :: member
20072018 type (g_tracer_type), pointer :: g_tracer_list, g_tracer
2008- character (len= fm_string_len ), intent (out ) :: string
2019+ character (len=* ), intent (out ) :: string
20092020 character (len= fm_string_len), parameter :: sub_name = ' g_tracer_get_string'
20102021
20112022 if (.NOT. associated (g_tracer_list)) call mpp_error(FATAL, trim (sub_name)// &
@@ -2079,7 +2090,16 @@ subroutine g_tracer_set_2D(g_tracer_list,name,member,array,isd,jsd,weight)
20792090 case (' sc_no' )
20802091 g_tracer% sc_no = w0* g_tracer% sc_no + w1* array
20812092 case (' stf' )
2082- g_tracer% stf = w0* g_tracer% stf + w1* array
2093+ ! Check for edge case where the new value is a weighted combination of old and new values
2094+ ! and the old value had runoff added to it later. In this case, the result would be
2095+ ! invalid if the new value did not also have runoff added to it (which is not known).
2096+ if (w1 < 1 .and. g_tracer% runoff_added_to_stf) then
2097+ call mpp_error(FATAL, trim (sub_name)// &
2098+ " : Cannot set stf to a weighted combination of values with and without runoff." )
2099+ else
2100+ g_tracer% stf = w0* g_tracer% stf + w1* array
2101+ g_tracer% runoff_added_to_stf = .false.
2102+ endif
20832103 case (' stf_gas' )
20842104 g_tracer% stf_gas= w0* g_tracer% stf_gas + w1* array
20852105 case (' deltap' )
@@ -2224,6 +2244,7 @@ subroutine g_tracer_set_real(g_tracer_list,name,member,value)
22242244 g_tracer% sc_no = value
22252245 case (' stf' )
22262246 g_tracer% stf = value
2247+ g_tracer% runoff_added_to_stf = .false.
22272248 case (' stf_gas' )
22282249 g_tracer% stf_gas = value
22292250 case (' deltap' )
@@ -3760,6 +3781,30 @@ subroutine g_tracer_get_src_info(g_tracer_list,name,src_file, src_var_name, src_
37603781
37613782 end subroutine g_tracer_get_src_info
37623783
3784+ subroutine g_tracer_get_obc_segment_props (g_tracer_list , name , obc_has , src_file , src_var_name ,lfac_in ,lfac_out )
3785+ type (g_tracer_type), pointer :: g_tracer_list,g_tracer
3786+ character (len=* ), intent (in ) :: name
3787+ logical , intent (out ):: obc_has ! <.true. if This tracer has OBC
3788+ character (len=* ),optional ,intent (out ):: src_file, src_var_name ! <OBC source file and variable in file
3789+ real , optional ,intent (out ):: lfac_in,lfac_out ! <OBC reservoir inverse lengthscale factor
3790+ character (len= fm_string_len), parameter :: sub_name = ' g_tracer_get_obc_segment_props'
3791+
3792+ if (.NOT. associated (g_tracer_list)) call mpp_error(FATAL, trim (sub_name)// &
3793+ " : No tracer in the list." )
3794+
3795+ g_tracer = > g_tracer_list ! Local pointer. Do not change the input pointer!
3796+ ! Find the node which has name=name
3797+ call g_tracer_find(g_tracer,name)
3798+ if (.NOT. associated (g_tracer)) call mpp_error(FATAL, trim (sub_name)// &
3799+ " : No tracer in the list with name=" // trim (name))
3800+
3801+ obc_has = g_tracer% obc_has
3802+ if (present (src_file)) src_file = g_tracer% obc_src_file_name
3803+ if (present (src_var_name)) src_var_name = g_tracer% obc_src_field_name
3804+ if (present (lfac_in)) lfac_in = g_tracer% obc_lfac_in
3805+ if (present (lfac_out)) lfac_out = g_tracer% obc_lfac_out
3806+ end subroutine g_tracer_get_obc_segment_props
3807+
37633808 function g_register_diag_field (module_name , field_name , axes , init_time , &
37643809 long_name , units , missing_value , range , mask_variant , standard_name , &
37653810 verbose , do_not_log , err_msg , interp_method , tile_count , cmor_field_name , &
@@ -3885,7 +3930,7 @@ LOGICAL FUNCTION g_send_data_1d(diag_field_id, field, time, is_in, mask, rmask,
38853930 else
38863931 call g_tracer_get_diagCS(diag_CS_ptr)
38873932 endif
3888- call post_data_1d_k (diag_field_id, field, diag_CS_ptr)
3933+ call post_data_MOM (diag_field_id, field, diag_CS_ptr)
38893934 g_send_data_1d = .TRUE.
38903935#else
38913936 g_send_data_1d = send_data_FMS(diag_field_id, field, time, is_in, mask, rmask, ie_in, weight, err_msg)
0 commit comments