Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add nonlinear loss to diags #479

Draft
wants to merge 5 commits into
base: development
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions defaults/diagnostics_latest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1863,12 +1863,36 @@ CISO_mui_to_co2star_((autotroph_sname)) :
vertical_grid : none
frequency : medium
operator : average
((zooplankton_sname))_loss_linear_zint_100m :
longname : ((zooplankton_lname)) Loss (linear component) Vertical Integral, 0-100m
units : mmol/m^3 cm/s
vertical_grid : none
frequency : never
operator : average
((zooplankton_sname))_loss_nonlinear_zint_100m :
longname : ((zooplankton_lname)) Loss (nonlinear component) Vertical Integral, 0-100m
units : mmol/m^3 cm/s
vertical_grid : none
frequency : medium
operator : average
((zooplankton_sname))_loss_zint_150m :
longname : ((zooplankton_lname)) Loss Vertical Integral, 0-150m
units : mmol/m^3 cm/s
vertical_grid : none
frequency : high
operator : average
((zooplankton_sname))_loss_linear_zint_150m :
longname : ((zooplankton_lname)) Loss (linear component) Vertical Integral, 0-150m
units : mmol/m^3 cm/s
vertical_grid : none
frequency : never
operator : average
((zooplankton_sname))_loss_nonlinear_zint_150m :
longname : ((zooplankton_lname)) Loss (nonlinear component) Vertical Integral, 0-150m
units : mmol/m^3 cm/s
vertical_grid : none
frequency : high
operator : average
((zooplankton_sname))_loss_poc_zint :
longname : ((zooplankton_lname)) Loss to POC Vertical Integral
units : mmol/m^3 cm/s
Expand Down Expand Up @@ -1960,6 +1984,20 @@ x_graze_((zooplankton_sname))_zint_100m :
truncate : true
frequency : never
operator : average
((zooplankton_sname))_loss_linear :
longname : ((zooplankton_lname)) Loss (linear component)
units : mmol/m^3/s
vertical_grid : layer_avg
truncate : true
frequency : never
operator : average
((zooplankton_sname))_loss_nonlinear :
longname : ((zooplankton_lname)) Loss (nonlinear component)
units : mmol/m^3/s
vertical_grid : layer_avg
truncate : true
frequency : never
operator : average
((zooplankton_sname))_loss_poc :
longname : ((zooplankton_lname)) Loss to POC
units : mmol/m^3/s
Expand Down
44 changes: 44 additions & 0 deletions defaults/json/diagnostics_latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,50 @@
"units": "mmol/m^3 cm/s",
"vertical_grid": "none"
},
"((zooplankton_sname))_loss_linear": {
"frequency": "never",
"longname": "((zooplankton_lname)) Loss (linear component)",
"operator": "average",
"truncate": true,
"units": "mmol/m^3/s",
"vertical_grid": "layer_avg"
},
"((zooplankton_sname))_loss_linear_zint_100m": {
"frequency": "never",
"longname": "((zooplankton_lname)) Loss (linear component) Vertical Integral, 0-100m",
"operator": "average",
"units": "mmol/m^3 cm/s",
"vertical_grid": "none"
},
"((zooplankton_sname))_loss_linear_zint_150m": {
"frequency": "never",
"longname": "((zooplankton_lname)) Loss (linear component) Vertical Integral, 0-150m",
"operator": "average",
"units": "mmol/m^3 cm/s",
"vertical_grid": "none"
},
"((zooplankton_sname))_loss_nonlinear": {
"frequency": "never",
"longname": "((zooplankton_lname)) Loss (nonlinear component)",
"operator": "average",
"truncate": true,
"units": "mmol/m^3/s",
"vertical_grid": "layer_avg"
},
"((zooplankton_sname))_loss_nonlinear_zint_100m": {
"frequency": "medium",
"longname": "((zooplankton_lname)) Loss (nonlinear component) Vertical Integral, 0-100m",
"operator": "average",
"units": "mmol/m^3 cm/s",
"vertical_grid": "none"
},
"((zooplankton_sname))_loss_nonlinear_zint_150m": {
"frequency": "high",
"longname": "((zooplankton_lname)) Loss (nonlinear component) Vertical Integral, 0-150m",
"operator": "average",
"units": "mmol/m^3 cm/s",
"vertical_grid": "none"
},
"((zooplankton_sname))_loss_poc": {
"frequency": "never",
"longname": "((zooplankton_lname)) Loss to POC",
Expand Down
96 changes: 96 additions & 0 deletions src/marbl_diagnostics_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1309,7 +1309,11 @@ subroutine marbl_diagnostics_init( &
if (.not.ind%lconstructed()) then
allocate(ind%zoo_loss_zint(zooplankton_cnt))
allocate(ind%zoo_loss_zint_100m(zooplankton_cnt))
allocate(ind%zoo_loss_linear_zint_100m(zooplankton_cnt))
allocate(ind%zoo_loss_nonlinear_zint_100m(zooplankton_cnt))
allocate(ind%zoo_loss_zint_150m(zooplankton_cnt))
allocate(ind%zoo_loss_linear_zint_150m(zooplankton_cnt))
allocate(ind%zoo_loss_nonlinear_zint_150m(zooplankton_cnt))
allocate(ind%zoo_loss_poc_zint(zooplankton_cnt))
allocate(ind%zoo_loss_poc_zint_100m(zooplankton_cnt))
allocate(ind%zoo_loss_doc_zint(zooplankton_cnt))
Expand Down Expand Up @@ -1350,6 +1354,30 @@ subroutine marbl_diagnostics_init( &
return
end if

lname = trim(zooplankton_settings(n)%lname) // ' Loss (linear component) Vertical Integral, 0-100m'
sname = trim(zooplankton_settings(n)%sname) // '_loss_linear_zint_100m'
units = 'mmol/m^3 cm/s'
vgrid = 'none'
truncate = .false.
call diags%add_diagnostic(lname, sname, units, vgrid, truncate, &
ind%zoo_loss_linear_zint_100m(n), marbl_status_log)
if (marbl_status_log%labort_marbl) then
call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname)
return
end if

lname = trim(zooplankton_settings(n)%lname) // ' Loss (nonlinear component) Vertical Integral, 0-100m'
sname = trim(zooplankton_settings(n)%sname) // '_loss_nonlinear_zint_100m'
units = 'mmol/m^3 cm/s'
vgrid = 'none'
truncate = .false.
call diags%add_diagnostic(lname, sname, units, vgrid, truncate, &
ind%zoo_loss_nonlinear_zint_100m(n), marbl_status_log)
if (marbl_status_log%labort_marbl) then
call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname)
return
end if

lname = trim(zooplankton_settings(n)%lname) // ' Loss Vertical Integral, 0-150m'
sname = trim(zooplankton_settings(n)%sname) // '_loss_zint_150m'
units = 'mmol/m^3 cm/s'
Expand All @@ -1362,6 +1390,30 @@ subroutine marbl_diagnostics_init( &
return
end if

lname = trim(zooplankton_settings(n)%lname) // ' Loss (linear component) Vertical Integral, 0-150m'
sname = trim(zooplankton_settings(n)%sname) // '_loss_linear_zint_150m'
units = 'mmol/m^3 cm/s'
vgrid = 'none'
truncate = .false.
call diags%add_diagnostic(lname, sname, units, vgrid, truncate, &
ind%zoo_loss_linear_zint_150m(n), marbl_status_log)
if (marbl_status_log%labort_marbl) then
call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname)
return
end if

lname = trim(zooplankton_settings(n)%lname) // ' Loss (nonlinear component) Vertical Integral, 0-150m'
sname = trim(zooplankton_settings(n)%sname) // '_loss_nonlinear_zint_150m'
units = 'mmol/m^3 cm/s'
vgrid = 'none'
truncate = .false.
call diags%add_diagnostic(lname, sname, units, vgrid, truncate, &
ind%zoo_loss_nonlinear_zint_150m(n), marbl_status_log)
if (marbl_status_log%labort_marbl) then
call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname)
return
end if

lname = trim(zooplankton_settings(n)%lname) // ' Loss to POC Vertical Integral'
sname = trim(zooplankton_settings(n)%sname) // '_loss_poc_zint'
units = 'mmol/m^3 cm/s'
Expand Down Expand Up @@ -2854,6 +2906,8 @@ subroutine marbl_diagnostics_init( &
! Zooplankton 3D diags
if (.not.ind%lconstructed()) then
allocate(ind%zoo_loss(zooplankton_cnt))
allocate(ind%zoo_loss_linear(zooplankton_cnt))
allocate(ind%zoo_loss_nonlinear(zooplankton_cnt))
allocate(ind%zoo_loss_poc(zooplankton_cnt))
allocate(ind%zoo_loss_doc(zooplankton_cnt))
allocate(ind%zoo_graze(zooplankton_cnt))
Expand All @@ -2876,6 +2930,30 @@ subroutine marbl_diagnostics_init( &
return
end if

lname = trim(zooplankton_settings(n)%lname) // ' Loss (linear component)'
sname = trim(zooplankton_settings(n)%sname) // '_loss_linear'
units = 'mmol/m^3/s'
vgrid = 'layer_avg'
truncate = .not. lecovars_full_depth_tavg
call diags%add_diagnostic(lname, sname, units, vgrid, truncate, &
ind%zoo_loss_linear(n), marbl_status_log)
if (marbl_status_log%labort_marbl) then
call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname)
return
end if

lname = trim(zooplankton_settings(n)%lname) // ' Loss (nonlinear component)'
sname = trim(zooplankton_settings(n)%sname) // '_loss_nonlinear'
units = 'mmol/m^3/s'
vgrid = 'layer_avg'
truncate = .not. lecovars_full_depth_tavg
call diags%add_diagnostic(lname, sname, units, vgrid, truncate, &
ind%zoo_loss_nonlinear(n), marbl_status_log)
if (marbl_status_log%labort_marbl) then
call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname)
return
end if

lname = trim(zooplankton_settings(n)%lname) // ' Loss to POC'
sname = trim(zooplankton_settings(n)%sname) // '_loss_poc'
units = 'mmol/m^3/s'
Expand Down Expand Up @@ -3924,6 +4002,8 @@ subroutine store_diagnostics_zooplankton(marbl_domain, &

do n = 1, zooplankton_cnt
diags(ind%zoo_loss(n))%field_3d(:, 1) = zooplankton_derived_terms%zoo_loss(n,:)
diags(ind%zoo_loss_linear(n))%field_3d(:, 1) = zooplankton_derived_terms%zoo_loss_linear(n,:)
diags(ind%zoo_loss_nonlinear(n))%field_3d(:, 1) = zooplankton_derived_terms%zoo_loss_nonlinear(n,:)
diags(ind%zoo_loss_poc(n))%field_3d(:, 1) = zooplankton_derived_terms%zoo_loss_poc(n,:)
diags(ind%zoo_loss_doc(n))%field_3d(:, 1) = zooplankton_derived_terms%zoo_loss_doc(n,:)
diags(ind%zoo_graze(n))%field_3d(:, 1) = zooplankton_derived_terms%zoo_graze(n,:)
Expand All @@ -3942,10 +4022,26 @@ subroutine store_diagnostics_zooplankton(marbl_domain, &
delta_z, kmt, full_depth_integral=diags(ind%zoo_loss_zint(n))%field_2d(1), &
near_surface_integral=diags(ind%zoo_loss_zint_100m(n))%field_2d(1))

call marbl_diagnostics_share_compute_vertical_integrals(diags(ind%zoo_loss_linear(n))%field_3d(:, 1), &
delta_z, kmt, near_surface_integral=diags(ind%zoo_loss_linear_zint_100m(n))%field_2d(1), &
shallow_depth=diags(ind%zoo_loss_zint_100m(n))%field_2d(1))

call marbl_diagnostics_share_compute_vertical_integrals(diags(ind%zoo_loss_nonlinear(n))%field_3d(:, 1), &
delta_z, kmt, near_surface_integral=diags(ind%zoo_loss_nonlinear_zint_100m(n))%field_2d(1), &
shallow_depth=diags(ind%zoo_loss_zint_100m(n))%field_2d(1))

call marbl_diagnostics_share_compute_vertical_integrals(diags(ind%zoo_loss(n))%field_3d(:, 1), &
delta_z, kmt, near_surface_integral=diags(ind%zoo_loss_zint_150m(n))%field_2d(1), &
shallow_depth=150.0e2_r8)

call marbl_diagnostics_share_compute_vertical_integrals(diags(ind%zoo_loss_linear(n))%field_3d(:, 1), &
delta_z, kmt, near_surface_integral=diags(ind%zoo_loss_linear_zint_150m(n))%field_2d(1), &
shallow_depth=150.0e2_r8)

call marbl_diagnostics_share_compute_vertical_integrals(diags(ind%zoo_loss_nonlinear(n))%field_3d(:, 1), &
delta_z, kmt, near_surface_integral=diags(ind%zoo_loss_nonlinear_zint_150m(n))%field_2d(1), &
shallow_depth=150.0e2_r8)

call marbl_diagnostics_share_compute_vertical_integrals(diags(ind%zoo_loss_poc(n))%field_3d(:, 1), &
delta_z, kmt, full_depth_integral=diags(ind%zoo_loss_poc_zint(n))%field_2d(1), &
near_surface_integral=diags(ind%zoo_loss_poc_zint_100m(n))%field_2d(1))
Expand Down
16 changes: 16 additions & 0 deletions src/marbl_interface_private_types.F90
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ module marbl_interface_private_types
real(r8), allocatable :: zoo_graze_doc(:,:) ! grazing of zooplankton routed to doc (mmol C/m^3/sec)
real(r8), allocatable :: zoo_graze_dic(:,:) ! grazing of zooplankton routed to dic (mmol C/m^3/sec)
real(r8), allocatable :: zoo_loss(:,:) ! mortality & higher trophic grazing on zooplankton (mmol C/m^3/sec)
real(r8), allocatable :: zoo_loss_linear(:,:) ! linear component of zoo_loss (mmol C/m^3/sec)
real(r8), allocatable :: zoo_loss_nonlinear(:,:) ! nonlinear component of zoo_loss (mmol C/m^3/sec)
real(r8), allocatable :: zoo_loss_poc(:,:) ! zoo_loss routed to poc (mmol C/m^3/sec)
real(r8), allocatable :: zoo_loss_doc(:,:) ! zoo_loss routed to doc (mmol C/m^3/sec)
real(r8), allocatable :: zoo_loss_dic(:,:) ! zoo_loss routed to dic (mmol C/m^3/sec)
Expand Down Expand Up @@ -565,7 +567,11 @@ module marbl_interface_private_types
! Zooplankton 2D diags
integer(int_kind), allocatable :: zoo_loss_zint(:)
integer(int_kind), allocatable :: zoo_loss_zint_100m(:)
integer(int_kind), allocatable :: zoo_loss_linear_zint_100m(:)
integer(int_kind), allocatable :: zoo_loss_nonlinear_zint_100m(:)
integer(int_kind), allocatable :: zoo_loss_zint_150m(:)
integer(int_kind), allocatable :: zoo_loss_linear_zint_150m(:)
integer(int_kind), allocatable :: zoo_loss_nonlinear_zint_150m(:)
integer(int_kind), allocatable :: zoo_loss_poc_zint(:)
integer(int_kind), allocatable :: zoo_loss_poc_zint_100m(:)
integer(int_kind), allocatable :: zoo_loss_doc_zint(:)
Expand Down Expand Up @@ -696,6 +702,8 @@ module marbl_interface_private_types

! Zooplankton 3D diags
integer(int_kind), allocatable :: zoo_loss(:)
integer(int_kind), allocatable :: zoo_loss_linear(:)
integer(int_kind), allocatable :: zoo_loss_nonlinear(:)
integer(int_kind), allocatable :: zoo_loss_poc(:)
integer(int_kind), allocatable :: zoo_loss_doc(:)
integer(int_kind), allocatable :: zoo_graze(:)
Expand Down Expand Up @@ -1210,6 +1218,8 @@ subroutine zooplankton_derived_terms_constructor(self, zooplankton_cnt, km)
allocate(self%zoo_graze_doc(zooplankton_cnt, km))
allocate(self%zoo_graze_dic(zooplankton_cnt, km))
allocate(self%zoo_loss(zooplankton_cnt, km))
allocate(self%zoo_loss_linear(zooplankton_cnt, km))
allocate(self%zoo_loss_nonlinear(zooplankton_cnt, km))
allocate(self%zoo_loss_poc(zooplankton_cnt, km))
allocate(self%zoo_loss_doc(zooplankton_cnt, km))
allocate(self%zoo_loss_dic(zooplankton_cnt, km))
Expand All @@ -1232,6 +1242,8 @@ subroutine zooplankton_derived_terms_destructor(self)
deallocate(self%zoo_graze_doc)
deallocate(self%zoo_graze_dic)
deallocate(self%zoo_loss)
deallocate(self%zoo_loss_linear)
deallocate(self%zoo_loss_nonlinear)
deallocate(self%zoo_loss_poc)
deallocate(self%zoo_loss_doc)
deallocate(self%zoo_loss_dic)
Expand Down Expand Up @@ -1934,7 +1946,11 @@ subroutine interior_diag_ind_destructor(this)
deallocate(this%auto_agg_zint_100m)
deallocate(this%zoo_loss_zint)
deallocate(this%zoo_loss_zint_100m)
deallocate(this%zoo_loss_linear_zint_100m)
deallocate(this%zoo_loss_nonlinear_zint_100m)
deallocate(this%zoo_loss_zint_150m)
deallocate(this%zoo_loss_linear_zint_150m)
deallocate(this%zoo_loss_nonlinear_zint_150m)
deallocate(this%zoo_loss_poc_zint)
deallocate(this%zoo_loss_poc_zint_100m)
deallocate(this%zoo_loss_doc_zint)
Expand Down
15 changes: 10 additions & 5 deletions src/marbl_interior_tendency_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1749,9 +1749,11 @@ subroutine compute_Zprime(km, zt, zooC, Tfunc_zoo, zooplankton_derived_terms)
real(r8) :: C_loss_thres(km)
!-----------------------------------------------------------------------

associate( &
Zprime => zooplankton_derived_terms%Zprime(:,:), & !(zooplankton_cnt)
zoo_loss => zooplankton_derived_terms%zoo_loss(:,:) & !(zooplankton_cnt) output
associate( &
Zprime => zooplankton_derived_terms%Zprime(:,:), & !(zooplankton_cnt)
zoo_loss_linear => zooplankton_derived_terms%zoo_loss_linear(:,:), & !(zooplankton_cnt) output
zoo_loss_nonlinear => zooplankton_derived_terms%zoo_loss_nonlinear(:,:), & !(zooplankton_cnt) output
zoo_loss => zooplankton_derived_terms%zoo_loss(:,:) & !(zooplankton_cnt) output
)

! calculate the loss threshold interpolation factor
Expand All @@ -1761,8 +1763,11 @@ subroutine compute_Zprime(km, zt, zooC, Tfunc_zoo, zooplankton_derived_terms)
C_loss_thres(:) = f_loss_thres(:) * zooplankton_settings(zoo_ind)%loss_thres
Zprime(zoo_ind,:) = max(zooC(zoo_ind,:) - C_loss_thres, c0)

zoo_loss(zoo_ind,:) = (zooplankton_settings(zoo_ind)%z_mort2_0 * Zprime(zoo_ind,:)**zoo_mort2_exp &
+ zooplankton_settings(zoo_ind)%z_mort_0 * Zprime(zoo_ind,:)) * Tfunc_zoo(zoo_ind,:)
zoo_loss_linear(zoo_ind,:) = zooplankton_settings(zoo_ind)%z_mort_0 * Zprime(zoo_ind,:) &
* Tfunc_zoo(zoo_ind,:)
zoo_loss_nonlinear(zoo_ind,:) = zooplankton_settings(zoo_ind)%z_mort2_0 * Zprime(zoo_ind,:)**zoo_mort2_exp &
* Tfunc_zoo(zoo_ind,:)
zoo_loss(zoo_ind,:) = zoo_loss_linear(zoo_ind,:) + zoo_loss_nonlinear(zoo_ind,:)
end do

end associate
Expand Down