@@ -33,7 +33,7 @@ module g_tracer_utils
33
33
34
34
#ifdef _USE_MOM6_DIAG
35
35
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
37
37
use MOM_diag_mediator, only : g_diag_ctrl= >diag_ctrl
38
38
#else
39
39
use diag_manager_mod, only : register_diag_field_FMS= >register_diag_field
@@ -257,6 +257,7 @@ module g_tracer_utils
257
257
logical :: flux_drydep = .false. ! Is there a dry deposition?
258
258
logical :: flux_bottom = .false. ! Is there a flux through bottom?
259
259
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?
260
261
261
262
! Flux identifiers to be set by aof_set_coupler_flux()
262
263
integer :: flux_gas_ind = - 1
@@ -267,6 +268,10 @@ module g_tracer_utils
267
268
logical :: requires_restart = .true.
268
269
! Tracer source: filename, type, var name, units, record, gridfile
269
270
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.
270
275
integer :: src_var_record
271
276
logical :: requires_src_info = .false.
272
277
real :: src_var_unit_conversion = 1.0 ! This factor depends on the tracer. Ask Jasmin
@@ -372,6 +377,7 @@ module g_tracer_utils
372
377
public :: g_tracer_get_src_info
373
378
public :: g_register_diag_field
374
379
public :: g_send_data
380
+ public :: g_tracer_get_obc_segment_props
375
381
public :: fm_string_len
376
382
public :: is_root_pe
377
383
! <INTERFACE NAME="g_tracer_add_param">
@@ -938,6 +944,11 @@ subroutine g_tracer_add(node_ptr, package, name, longname, units, prog, const_i
938
944
call g_tracer_add_param(trim (g_tracer% name)// " _valid_min" , g_tracer% src_var_valid_min , - 99.0 )
939
945
call g_tracer_add_param(trim (g_tracer% name)// " _valid_max" , g_tracer% src_var_valid_max , + 1.0e64 )
940
946
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 )
941
952
942
953
! ===================================================================
943
954
! 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)
2005
2016
character (len=* ), intent (in ) :: name
2006
2017
character (len=* ), intent (in ) :: member
2007
2018
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
2009
2020
character (len= fm_string_len), parameter :: sub_name = ' g_tracer_get_string'
2010
2021
2011
2022
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)
2079
2090
case (' sc_no' )
2080
2091
g_tracer% sc_no = w0* g_tracer% sc_no + w1* array
2081
2092
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
2083
2103
case (' stf_gas' )
2084
2104
g_tracer% stf_gas= w0* g_tracer% stf_gas + w1* array
2085
2105
case (' deltap' )
@@ -2224,6 +2244,7 @@ subroutine g_tracer_set_real(g_tracer_list,name,member,value)
2224
2244
g_tracer% sc_no = value
2225
2245
case (' stf' )
2226
2246
g_tracer% stf = value
2247
+ g_tracer% runoff_added_to_stf = .false.
2227
2248
case (' stf_gas' )
2228
2249
g_tracer% stf_gas = value
2229
2250
case (' deltap' )
@@ -3760,6 +3781,30 @@ subroutine g_tracer_get_src_info(g_tracer_list,name,src_file, src_var_name, src_
3760
3781
3761
3782
end subroutine g_tracer_get_src_info
3762
3783
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
+
3763
3808
function g_register_diag_field (module_name , field_name , axes , init_time , &
3764
3809
long_name , units , missing_value , range , mask_variant , standard_name , &
3765
3810
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,
3885
3930
else
3886
3931
call g_tracer_get_diagCS(diag_CS_ptr)
3887
3932
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)
3889
3934
g_send_data_1d = .TRUE.
3890
3935
#else
3891
3936
g_send_data_1d = send_data_FMS(diag_field_id, field, time, is_in, mask, rmask, ie_in, weight, err_msg)
0 commit comments