Skip to content

Commit 78d2245

Browse files
committed
Allow passing salt flux restoring/correction to generic tracers
1 parent 59e0aad commit 78d2245

File tree

5 files changed

+215
-7
lines changed

5 files changed

+215
-7
lines changed

src/mom5/ocean_bgc/ocean_generic_tracer.F90

+92-4
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ module ocean_generic_mod
2727

2828
use field_manager_mod, only: fm_get_index,fm_string_len, fm_new_value
2929
use generic_tracer, only: generic_tracer_init, generic_tracer_source, generic_tracer_update_from_bottom
30-
use generic_tracer, only: generic_tracer_coupler_get, generic_tracer_coupler_set, generic_tracer_register_diag
30+
use generic_tracer, only: generic_tracer_coupler_accumulate, generic_tracer_coupler_set, generic_tracer_register_diag
3131
use generic_tracer, only: generic_tracer_end, generic_tracer_get_list, do_generic_tracer, generic_tracer_register
3232
use generic_tracer, only: generic_tracer_coupler_zero, generic_tracer_vertdiff_G, generic_tracer_vertdiff_M
33-
use generic_tracer, only: generic_tracer_diag
33+
use generic_tracer, only: generic_tracer_diag, generic_tracer_update_from_coupler
3434

3535
use g_tracer_utils, only: g_tracer_get_name,g_tracer_get_alias,g_tracer_set_values,g_tracer_get_common
3636
use g_tracer_utils, only: g_tracer_get_next,g_tracer_type,g_tracer_is_prog,g_tracer_flux_init
@@ -51,6 +51,7 @@ module ocean_generic_mod
5151
public ocean_generic_sum_sfc
5252
public ocean_generic_zero_sfc
5353
public ocean_generic_sbc
54+
public ocean_generic_sbc_adjust
5455
public ocean_generic_init
5556
public ocean_generic_flux_init
5657
public ocean_generic_column_physics
@@ -336,9 +337,15 @@ subroutine ocean_generic_sbc(Ice_ocean_boundary_fluxes,Disd,Djsd, T_prog, runoff
336337
character(len=fm_string_len) :: g_tracer_name
337338
character(len=fm_string_len), parameter :: sub_name = 'update_generic_tracer_sbc'
338339

339-
!Extract the tracer surface fields from coupler
340-
call generic_tracer_coupler_get(Ice_ocean_boundary_fluxes)
340+
!Extract the tracer surface fields from coupler
341+
! dts: change to use generic_tracer_coupler_accumulate with a weight of 1. for consistency
342+
! with MOM6. Note this means that the generic_?_update_from_coupler method is no longer
343+
! called here. Instead this will be called later in ocean_generic_sbc_adjust when flux
344+
! adjustments are available
345+
! call generic_tracer_coupler_get(Ice_ocean_boundary_fluxes)
346+
call generic_tracer_coupler_accumulate(Ice_ocean_boundary_fluxes, 1.)
341347

348+
! dts: Is this still needed here, since this is now also done in ocean_generic_sbc_adjust?
342349
!Update T_prog fields from generic tracer fields
343350
!
344351
!Get the tracer list
@@ -394,6 +401,87 @@ subroutine ocean_generic_sbc(Ice_ocean_boundary_fluxes,Disd,Djsd, T_prog, runoff
394401
enddo
395402
end subroutine ocean_generic_sbc
396403

404+
! <SUBROUTINE NAME="ocean_generic_sbc_adjust">
405+
! <OVERVIEW>
406+
! Adjust tracer surface boundary conditions
407+
! </OVERVIEW>
408+
! <DESCRIPTION>
409+
! This subroutine applies any adjustments to the generic tracers surface boundary conditions,
410+
! for example, adjustment of surface tracer fluxes due to salinity restoring.
411+
! </DESCRIPTION>
412+
! <TEMPLATE>
413+
! call ocean_generic_sbc_adjust(Ice_ocean_boundary_fluxes,Disd,Djsd, T_prog )
414+
! </TEMPLATE>
415+
! </SUBROUTINE>
416+
subroutine ocean_generic_sbc_adjust(Disd, Djsd, T_prog, salt_flux_added, runoff)
417+
integer, intent(in) :: Disd, Djsd
418+
type(ocean_prog_tracer_type), dimension(:), intent(inout) :: T_prog
419+
real, intent(in), dimension(Disd:,Djsd:) :: salt_flux_added
420+
real, intent(in), dimension(Disd:,Djsd:) :: runoff
421+
422+
type(g_tracer_type), pointer :: g_tracer_list,g_tracer,g_tracer_next
423+
integer :: g_tracer_index
424+
character(len=fm_string_len) :: g_tracer_name
425+
character(len=fm_string_len), parameter :: sub_name = 'ocean_generic_sbc_adjust'
426+
427+
! Adjust tracer fields via the generic_?_update_from_coupler method
428+
call generic_tracer_update_from_coupler(Disd, Djsd, salt_flux_added)
429+
430+
!Update T_prog fields from generic tracer fields
431+
!
432+
!Get the tracer list
433+
call generic_tracer_get_list(g_tracer_list)
434+
if(.NOT. associated(g_tracer_list)) call mpp_error(FATAL, trim(sub_name)//&
435+
": No tracer in the list.")
436+
!For each tracer name get its T_prog index and get its flux fields
437+
g_tracer=>g_tracer_list
438+
do
439+
if(g_tracer_is_prog(g_tracer)) then
440+
call g_tracer_get_alias(g_tracer,g_tracer_name)
441+
g_tracer_index = fm_get_index(trim('/ocean_mod/prog_tracers/'//g_tracer_name))
442+
if (g_tracer_index .le. 0) &
443+
call mpp_error(FATAL,trim(sub_name) // ' Could not get the index for '//g_tracer_name)
444+
445+
if (_ALLOCATED(g_tracer%stf) )&
446+
call g_tracer_get_values(g_tracer,g_tracer_name,'stf', T_prog(g_tracer_index)%stf, Disd,Djsd)
447+
448+
if (_ALLOCATED(g_tracer%btf) )&
449+
call g_tracer_get_values(g_tracer,g_tracer_name,'btf', T_prog(g_tracer_index)%btf, Disd,Djsd)
450+
451+
!If the tracer has runoff fill in the T_prog(n)%trunoff and T_prog(n)%runoff_tracer_flux
452+
if(_ALLOCATED(g_tracer%trunoff)) then
453+
!Fill in T_prog(n)%trunoff
454+
455+
call g_tracer_get_values(g_tracer,g_tracer_name,'trunoff',T_prog(g_tracer_index)%trunoff,Disd,Djsd)
456+
457+
!Fill in T_prog(n)%runoff_tracer_flux
458+
T_prog(g_tracer_index)%runoff_tracer_flux = T_prog(g_tracer_index)%trunoff * runoff
459+
460+
!Set g_tracer%runoff_tracer_flux
461+
call g_tracer_set_values(g_tracer,g_tracer_name,'runoff_tracer_flux',T_prog(g_tracer_index)%runoff_tracer_flux,Disd,Djsd)
462+
!
463+
!Fill in T_prog(n)%triver in MOM
464+
!Note: This is done so that MOM can apply the river fluxes through setting either
465+
! the runoff and calving fluxes (when discharge_combine_runoff_calve=.false.)
466+
! or
467+
! the total river concentration (when discharge_combine_runoff_calve=.true.)
468+
!
469+
!Assume zero calving flux for the generic tracers.
470+
!T_prog(g_tracer_index)%tcalving = 0 !MOM default
471+
T_prog(g_tracer_index)%triver = T_prog(g_tracer_index)%trunoff
472+
473+
endif
474+
475+
endif
476+
477+
!traverse the linked list till hit NULL
478+
call g_tracer_get_next(g_tracer, g_tracer_next)
479+
if(.NOT. associated(g_tracer_next)) exit
480+
g_tracer=>g_tracer_next
481+
482+
enddo
483+
end subroutine ocean_generic_sbc_adjust
484+
397485
! <SUBROUTINE NAME="ocean_generic_column_physics">
398486
! <OVERVIEW>
399487
! Column physics for generic tracers.

src/mom5/ocean_core/ocean_model.F90

+1-1
Original file line numberDiff line numberDiff line change
@@ -1605,7 +1605,7 @@ subroutine update_ocean_model(Ice_ocean_boundary, Ocean_state, Ocean_sfc, &
16051605
! compute "flux adjustments" (e.g., surface tracer restoring, flux correction)
16061606
call mpp_clock_begin(id_flux_adjust)
16071607
call flux_adjust(Time, T_diag(1:num_diag_tracers), Dens, Ext_mode, &
1608-
T_prog(1:num_prog_tracers), Velocity, river, melt, pme)
1608+
T_prog(1:num_prog_tracers), Velocity, river, melt, pme, runoff)
16091609

16101610
call mpp_clock_end(id_flux_adjust)
16111611

src/mom5/ocean_core/ocean_sbc.F90

+6-2
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ module ocean_sbc_mod
522522
use ocean_parameters_mod, only: MOM_BGRID, MOM_CGRID
523523
use ocean_riverspread_mod, only: spread_river_horz
524524
use ocean_tempsalt_mod, only: pottemp_from_contemp
525-
use ocean_tpm_mod, only: ocean_tpm_sum_sfc, ocean_tpm_avg_sfc, ocean_tpm_sbc
525+
use ocean_tpm_mod, only: ocean_tpm_sum_sfc, ocean_tpm_avg_sfc, ocean_tpm_sbc, ocean_tpm_sbc_adjust
526526
use ocean_tpm_mod, only: ocean_tpm_zero_sfc, ocean_tpm_sfc_end
527527
use ocean_types_mod, only: ocean_grid_type, ocean_domain_type, ocean_public_type
528528
use ocean_types_mod, only: ocean_time_type, ocean_thickness_type
@@ -4466,7 +4466,7 @@ end subroutine get_ocean_sbc
44664466
! </DESCRIPTION>
44674467
!
44684468

4469-
subroutine flux_adjust(Time, T_diag, Dens, Ext_mode, T_prog, Velocity, river, melt, pme)
4469+
subroutine flux_adjust(Time, T_diag, Dens, Ext_mode, T_prog, Velocity, river, melt, pme, runoff)
44704470
#if defined(ACCESS_CM) || defined(ACCESS_OM)
44714471

44724472
use auscom_ice_parameters_mod, only : use_ioaice, aice_cutoff
@@ -4482,6 +4482,7 @@ subroutine flux_adjust(Time, T_diag, Dens, Ext_mode, T_prog, Velocity, river, me
44824482
real, dimension(isd:,jsd:), intent(in) :: river
44834483
real, dimension(isd:,jsd:), intent(in) :: melt
44844484
real, dimension(isd:,jsd:), intent(inout) :: pme
4485+
real, dimension(isd:,jsd:), intent(inout) :: runoff
44854486

44864487
real, dimension(isd:ied,jsd:jed) :: open_ocean_mask
44874488
real, dimension(isd:ied,jsd:jed) :: pme_restore, flx_restore
@@ -4766,6 +4767,9 @@ subroutine flux_adjust(Time, T_diag, Dens, Ext_mode, T_prog, Velocity, river, me
47664767

47674768
endif ! endif for if (id_correction(index_salt) > 0 )
47684769

4770+
! apply adjustments to tracer surface boundary conditions due to salt restoring/correction
4771+
4772+
call ocean_tpm_sbc_adjust(Dom, T_prog, flx_restore(:,:)+flx_correct(:,:), runoff)
47694773

47704774
! diagnostics for salinity or pme restoring and correction
47714775

src/mom5/ocean_tracers/ocean_tpm.F90

+54
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ module ocean_tpm_mod !{
4646
! this functionality may be moved into a new, generalized
4747
! boundary condition manager.
4848
!
49+
! ocean_tpm_sbc_adjust: Calls specified routines to adjust
50+
! surface boundary condition, e.g. due to virtual fluxes
51+
! that arise from salinity restoring
52+
!
4953
! ocean_tpm_bbc: Calls specified routines to handle bottom
5054
! coundary condition calculations.
5155
!
@@ -221,6 +225,7 @@ module ocean_tpm_mod !{
221225
use ocean_generic_mod, only: ocean_generic_sum_sfc
222226
use ocean_generic_mod, only: ocean_generic_zero_sfc
223227
use ocean_generic_mod, only: ocean_generic_sbc
228+
use ocean_generic_mod, only: ocean_generic_sbc_adjust
224229
use ocean_generic_mod, only: ocean_generic_init
225230
use ocean_generic_mod, only: ocean_generic_column_physics
226231
use ocean_generic_mod, only: ocean_generic_end
@@ -267,6 +272,7 @@ module ocean_tpm_mod !{
267272
public ocean_tpm_init
268273
public ocean_tpm_flux_init
269274
public ocean_tpm_sbc
275+
public ocean_tpm_sbc_adjust
270276
public ocean_tpm_source
271277
public ocean_tpm_start
272278
public ocean_tpm_tracer
@@ -1336,6 +1342,54 @@ subroutine ocean_tpm_sbc(Domain, Grid, T_prog, Time, Ice_ocean_boundary_fluxes,
13361342
end subroutine ocean_tpm_sbc !}
13371343
! </SUBROUTINE> NAME="ocean_tpm_sbc"
13381344

1345+
!#######################################################################
1346+
! <SUBROUTINE NAME="ocean_tpm_sbc_adjust">
1347+
!
1348+
! <DESCRIPTION>
1349+
! call subroutines to adjust surface boundary condition, e.g. due to
1350+
! virtual fluxes that arise from salinity restoring
1351+
! </DESCRIPTION>
1352+
!
1353+
1354+
subroutine ocean_tpm_sbc_adjust(Domain, T_prog, salt_flux_added, runoff)
1355+
1356+
1357+
implicit none
1358+
1359+
!
1360+
!-----------------------------------------------------------------------
1361+
! Arguments
1362+
!-----------------------------------------------------------------------
1363+
!
1364+
1365+
type(ocean_domain_type), intent(in) :: Domain
1366+
type(ocean_prog_tracer_type), dimension(:), intent(inout) :: T_prog
1367+
real, dimension(Domain%isd:,Domain%jsd:), intent(in) :: salt_flux_added
1368+
real, dimension(Domain%isd:,Domain%jsd:), intent(in) :: runoff
1369+
1370+
!
1371+
!-----------------------------------------------------------------------
1372+
! local parameters
1373+
!-----------------------------------------------------------------------
1374+
!
1375+
1376+
!
1377+
!-----------------------------------------------------------------------
1378+
! local variables
1379+
!-----------------------------------------------------------------------
1380+
!
1381+
1382+
1383+
#ifdef USE_OCEAN_BGC
1384+
1385+
if (do_generic_tracer) call ocean_generic_sbc_adjust(Domain%isd, Domain%jsd, T_prog, salt_flux_added, runoff)
1386+
1387+
#endif
1388+
1389+
return
1390+
1391+
end subroutine ocean_tpm_sbc_adjust !}
1392+
! </SUBROUTINE> NAME="ocean_tpm_sbc_adjust"
13391393

13401394
!#######################################################################
13411395
! <SUBROUTINE NAME="ocean_tpm_init">

src/ocean_shared/generic_tracers/generic_tracer.F90

+62
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ module generic_tracer
8686
public generic_tracer_source
8787
public generic_tracer_diag
8888
public generic_tracer_update_from_bottom
89+
public generic_tracer_update_from_coupler
8990
public generic_tracer_coupler_get
91+
public generic_tracer_coupler_accumulate
9092
public generic_tracer_coupler_set
9193
public generic_tracer_coupler_zero
9294
public generic_tracer_end
@@ -304,6 +306,28 @@ subroutine generic_tracer_coupler_get(IOB_struc)
304306

305307
end subroutine generic_tracer_coupler_get
306308

309+
! <SUBROUTINE NAME="generic_tracer_coupler_accumulate">
310+
! <OVERVIEW>
311+
! Accumulate the boundary values (%stf and %triver) from coupler fluxes
312+
! </OVERVIEW>
313+
! <DESCRIPTION>
314+
! This subroutine accumulates coupler values for those generic tracers that have flux
315+
! exchange with atmosphere. This routine simply wraps g_tracer_coupler_get for MOM5,
316+
! but the API is provided here for consistency with https://github.com/NOAA-GFDL/ocean_BGC
317+
! </DESCRIPTION>
318+
! <TEMPLATE>
319+
! call generic_tracer_coupler_accumulate(Ice_ocean_boundary_fluxes, weight)
320+
! </TEMPLATE>
321+
! </SUBROUTINE>
322+
subroutine generic_tracer_coupler_accumulate(IOB_struc, weight)
323+
type(coupler_2d_bc_type), intent(in) :: IOB_struc
324+
real, intent(in) :: weight
325+
326+
!All generic tracers
327+
!Update tracer boundary values (%stf and %triver) from coupler fluxes foreach tracer in the prog_tracer_list
328+
call g_tracer_coupler_get(tracer_list, IOB_struc)
329+
330+
end subroutine generic_tracer_coupler_accumulate
307331

308332
! <SUBROUTINE NAME="generic_tracer_diag">
309333
! <OVERVIEW>
@@ -481,6 +505,44 @@ subroutine generic_tracer_update_from_bottom(dt, tau, model_time)
481505

482506
end subroutine generic_tracer_update_from_bottom
483507

508+
! <SUBROUTINE NAME="generic_tracer_update_from_coupler">
509+
! <OVERVIEW>
510+
! Modify the values obtained from the coupler
511+
! </OVERVIEW>
512+
! <DESCRIPTION>
513+
! Calls the corresponding generic_X_update_from_coupler routine for each package X.
514+
! </DESCRIPTION>
515+
! <TEMPLATE>
516+
! call generic_tracer_update_from_coupler(ilb, jlb, salt_flux_added)
517+
! </TEMPLATE>
518+
! <IN NAME="ilb,jlb" TYPE="integer">
519+
! Lower bounds of x and y extents of input arrays on data domain
520+
! </IN>
521+
! <IN NAME="salt_flux_added" TYPE="real, dimension(ilb:,jlb:), optional">
522+
! Surface salt flux into ocean from restoring or flux adjustment [g/m^2/sec]
523+
! </IN>
524+
! </SUBROUTINE>
525+
526+
subroutine generic_tracer_update_from_coupler(ilb, jlb, salt_flux_added)
527+
integer, intent(in) :: ilb, jlb
528+
real, dimension(ilb:,jlb:), intent(in) :: salt_flux_added
529+
530+
character(len=fm_string_len), parameter :: sub_name = 'generic_tracer_update_from_coupler'
531+
532+
!Specific tracers
533+
! if(do_generic_CFC) call generic_CFC_update_from_coupler(tracer_list) !Nothing to do
534+
535+
if(do_generic_TOPAZ) call generic_TOPAZ_update_from_coupler(tracer_list)
536+
537+
if(do_generic_BLING) call generic_BLING_update_from_coupler(tracer_list)
538+
539+
if(do_generic_miniBLING) call generic_miniBLING_update_from_coupler(tracer_list)
540+
541+
if(do_generic_COBALT) call generic_COBALT_update_from_coupler(tracer_list)
542+
543+
return
544+
545+
end subroutine generic_tracer_update_from_coupler
484546

485547
! <SUBROUTINE NAME="generic_tracer_vertdiff_G">
486548
! <OVERVIEW>

0 commit comments

Comments
 (0)