Global Scalars¶
In some configurations, MARBL needs to know the value of some globally-averaged scalars.
Currently, the only example of such is setting ladjust_bury_coeff = .true.
to allow MARBL to recompute various burial coefficients.
These burial coefficients are used to Compute Interior Tracer Tendencies.
Note
In these configurations, the GCM must explicitly tell MARBL it can perform global operations during initialization otherwise MARBL will abort.
Subroutine on the Interface¶
This is the subroutine called prior to calling surface_flux_compute() or interior_tendency_compute().
If field_source == 'surface_flux'
then the subroutine returns without doing anything.
subroutine set_global_scalars(this, field_source)
use marbl_interior_tendency_mod, only : marbl_interior_tendency_adjust_bury_coeff
class(marbl_interface_class), intent(inout) :: this
character(len=*), intent(in) :: field_source ! 'interior_tendency' or 'surface_flux`'
if (field_source == 'interior_tendency') then
call marbl_interior_tendency_adjust_bury_coeff( &
marbl_particulate_share = this%particulate_share, &
glo_avg_rmean_interior_tendency = this%glo_avg_rmean_interior_tendency, &
glo_avg_rmean_surface_flux = this%glo_avg_rmean_surface_flux, &
glo_scalar_rmean_interior_tendency = this%glo_scalar_rmean_interior_tendency, &
glo_scalar_interior_tendency = this%glo_scalar_interior_tendency)
end if
end subroutine set_global_scalars
Global scalars for interior tendency¶
If field_source == 'interior_tendency'
then marbl_interior_tendency_adjust_bury_coeff()
is called.
If ladjust_bury_coeff == .false.
then this subroutine returns immediately.
For runs where MARBL is adjusting the burial coefficients, though, values in marbl_instance%particulate_share
as well as some global averages of running means are updated.
Note that there is an assumption that the marbl_glo_avg_mod
values have been updated by the GCM.
subroutine marbl_interior_tendency_adjust_bury_coeff(marbl_particulate_share, &
glo_avg_rmean_interior_tendency, glo_avg_rmean_surface_flux, &
glo_scalar_rmean_interior_tendency, glo_scalar_interior_tendency)
use marbl_glo_avg_mod, only : glo_avg_field_ind_interior_tendency_CaCO3_bury
use marbl_glo_avg_mod, only : glo_avg_field_ind_interior_tendency_POC_bury
use marbl_glo_avg_mod, only : glo_avg_field_ind_interior_tendency_POP_bury
use marbl_glo_avg_mod, only : glo_avg_field_ind_interior_tendency_bSi_bury
use marbl_glo_avg_mod, only : glo_avg_field_ind_interior_tendency_d_POC_bury_d_bury_coeff
use marbl_glo_avg_mod, only : glo_avg_field_ind_interior_tendency_d_POP_bury_d_bury_coeff
use marbl_glo_avg_mod, only : glo_avg_field_ind_interior_tendency_d_bSi_bury_d_bury_coeff
use marbl_glo_avg_mod, only : glo_avg_field_ind_surface_flux_C_input
use marbl_glo_avg_mod, only : glo_avg_field_ind_surface_flux_P_input
use marbl_glo_avg_mod, only : glo_avg_field_ind_surface_flux_Si_input
use marbl_glo_avg_mod, only : glo_scalar_ind_interior_tendency_POC_bury_coeff
use marbl_glo_avg_mod, only : glo_scalar_ind_interior_tendency_POP_bury_coeff
use marbl_glo_avg_mod, only : glo_scalar_ind_interior_tendency_bSi_bury_coeff
type (marbl_particulate_share_type), intent(inout) :: marbl_particulate_share
type (marbl_running_mean_0d_type) , intent(in) :: glo_avg_rmean_interior_tendency(:)
type (marbl_running_mean_0d_type) , intent(in) :: glo_avg_rmean_surface_flux(:)
type (marbl_running_mean_0d_type) , intent(in) :: glo_scalar_rmean_interior_tendency(:)
real (r8) , intent(inout) :: glo_scalar_interior_tendency(:)
!-----------------------------------------------------------------------
if (.not. ladjust_bury_coeff) return
associate( &
POC_bury_coeff => marbl_particulate_share%POC_bury_coeff, &
POP_bury_coeff => marbl_particulate_share%POP_bury_coeff, &
bSi_bury_coeff => marbl_particulate_share%bSi_bury_coeff, &
rmean_CaCO3_bury_avg => glo_avg_rmean_interior_tendency(glo_avg_field_ind_interior_tendency_CaCO3_bury)%rmean, &
rmean_POC_bury_avg => glo_avg_rmean_interior_tendency(glo_avg_field_ind_interior_tendency_POC_bury)%rmean, &
rmean_POP_bury_avg => glo_avg_rmean_interior_tendency(glo_avg_field_ind_interior_tendency_POP_bury)%rmean, &
rmean_bSi_bury_avg => glo_avg_rmean_interior_tendency(glo_avg_field_ind_interior_tendency_bSi_bury)%rmean, &
rmean_POC_bury_deriv_avg => &
glo_avg_rmean_interior_tendency(glo_avg_field_ind_interior_tendency_d_POC_bury_d_bury_coeff)%rmean, &
rmean_POP_bury_deriv_avg => &
glo_avg_rmean_interior_tendency(glo_avg_field_ind_interior_tendency_d_POP_bury_d_bury_coeff)%rmean, &
rmean_bSi_bury_deriv_avg => &
glo_avg_rmean_interior_tendency(glo_avg_field_ind_interior_tendency_d_bSi_bury_d_bury_coeff)%rmean, &
rmean_C_input_avg => glo_avg_rmean_surface_flux(glo_avg_field_ind_surface_flux_C_input)%rmean, &
rmean_P_input_avg => glo_avg_rmean_surface_flux(glo_avg_field_ind_surface_flux_P_input)%rmean, &
rmean_Si_input_avg => glo_avg_rmean_surface_flux(glo_avg_field_ind_surface_flux_Si_input)%rmean, &
rmean_POC_bury_coeff => &
glo_scalar_rmean_interior_tendency(glo_scalar_ind_interior_tendency_POC_bury_coeff)%rmean, &
rmean_POP_bury_coeff => &
glo_scalar_rmean_interior_tendency(glo_scalar_ind_interior_tendency_POP_bury_coeff)%rmean, &
rmean_bSi_bury_coeff => &
glo_scalar_rmean_interior_tendency(glo_scalar_ind_interior_tendency_bSi_bury_coeff)%rmean &
)
! Newton's method for POC_bury(coeff) + CaCO3_bury - C_input = 0
POC_bury_coeff = rmean_POC_bury_coeff &
- (rmean_POC_bury_avg + rmean_CaCO3_bury_avg - rmean_C_input_avg) &
/ rmean_POC_bury_deriv_avg
! Newton's method for POP_bury(coeff) - P_input = 0
POP_bury_coeff = rmean_POP_bury_coeff &
- (rmean_POP_bury_avg - rmean_P_input_avg) / rmean_POP_bury_deriv_avg
! Newton's method for bSi_bury(coeff) - Si_input = 0
bSi_bury_coeff = rmean_bSi_bury_coeff &
- (rmean_bSi_bury_avg - rmean_Si_input_avg) / rmean_bSi_bury_deriv_avg
! copy computed bury coefficients into output argument
glo_scalar_interior_tendency(glo_scalar_ind_interior_tendency_POC_bury_coeff) = POC_bury_coeff
glo_scalar_interior_tendency(glo_scalar_ind_interior_tendency_POP_bury_coeff) = POP_bury_coeff
glo_scalar_interior_tendency(glo_scalar_ind_interior_tendency_bSi_bury_coeff) = bSi_bury_coeff
end associate
end subroutine marbl_interior_tendency_adjust_bury_coeff