Skip to content

Commit e44be60

Browse files
committed
Merge branch 'master' into tolerance_nml
2 parents 36ee7df + edbe781 commit e44be60

File tree

1 file changed

+49
-4
lines changed

1 file changed

+49
-4
lines changed

generic_tracers/generic_tracer_utils.F90

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)