@@ -27,10 +27,10 @@ module ocean_generic_mod
27
27
28
28
use field_manager_mod, only: fm_get_index,fm_string_len, fm_new_value
29
29
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
31
31
use generic_tracer, only: generic_tracer_end, generic_tracer_get_list, do_generic_tracer, generic_tracer_register
32
32
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
34
34
35
35
use g_tracer_utils, only: g_tracer_get_name,g_tracer_get_alias,g_tracer_set_values,g_tracer_get_common
36
36
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
51
51
public ocean_generic_sum_sfc
52
52
public ocean_generic_zero_sfc
53
53
public ocean_generic_sbc
54
+ public ocean_generic_sbc_adjust
54
55
public ocean_generic_init
55
56
public ocean_generic_flux_init
56
57
public ocean_generic_column_physics
@@ -336,9 +337,15 @@ subroutine ocean_generic_sbc(Ice_ocean_boundary_fluxes,Disd,Djsd, T_prog, runoff
336
337
character (len= fm_string_len) :: g_tracer_name
337
338
character (len= fm_string_len), parameter :: sub_name = ' update_generic_tracer_sbc'
338
339
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 .)
341
347
348
+ ! dts: Is this still needed here, since this is now also done in ocean_generic_sbc_adjust?
342
349
! Update T_prog fields from generic tracer fields
343
350
!
344
351
! Get the tracer list
@@ -394,6 +401,87 @@ subroutine ocean_generic_sbc(Ice_ocean_boundary_fluxes,Disd,Djsd, T_prog, runoff
394
401
enddo
395
402
end subroutine ocean_generic_sbc
396
403
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
+
397
485
! <SUBROUTINE NAME="ocean_generic_column_physics">
398
486
! <OVERVIEW>
399
487
! Column physics for generic tracers.
0 commit comments