Skip to content

Commit 6ec0812

Browse files
Integrate sed* tracers over configurable bottom thickness (#42)
Co-authored-by: Pearse J Buchanan <[email protected]>
1 parent 0524d7a commit 6ec0812

File tree

1 file changed

+68
-20
lines changed

1 file changed

+68
-20
lines changed

generic_tracers/generic_WOMBATlite.F90

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ module generic_WOMBATlite
165165
zoolmor, &
166166
zooqmor, &
167167
detlrem, &
168+
bottom_thickness, &
168169
detlrem_sed, &
169170
wdetbio, &
170171
wdetmax, &
@@ -1148,7 +1149,7 @@ subroutine generic_WOMBATlite_register_diag(diag_list)
11481149
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11491150

11501151
vardesc_temp = vardesc( &
1151-
'seddep', 'Depth of the sediment', 'h', '1', 's', 'm', 'f')
1152+
'seddep', 'Depth of the bottom layer', 'h', '1', 's', 'm', 'f')
11521153
wombat%id_seddep = register_diag_field(package_name, vardesc_temp%name, axes(1:2), &
11531154
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11541155

@@ -1158,42 +1159,42 @@ subroutine generic_WOMBATlite_register_diag(diag_list)
11581159
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11591160

11601161
vardesc_temp = vardesc( &
1161-
'sedtemp', 'Temperature at the deepest grid cell', 'h', '1', 's', 'deg C', 'f')
1162+
'sedtemp', 'Temperature in the bottom layer', 'h', '1', 's', 'deg C', 'f')
11621163
wombat%id_sedtemp = register_diag_field(package_name, vardesc_temp%name, axes(1:2), &
11631164
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11641165

11651166
vardesc_temp = vardesc( &
1166-
'sedsalt', 'Salinity at the deepest grid cell', 'h', '1', 's', 'psu', 'f')
1167+
'sedsalt', 'Salinity in the bottom layer', 'h', '1', 's', 'psu', 'f')
11671168
wombat%id_sedsalt = register_diag_field(package_name, vardesc_temp%name, axes(1:2), &
11681169
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11691170

11701171
vardesc_temp = vardesc( &
1171-
'sedno3', 'Nitrate at the deepest grid cell', 'h', '1', 's', 'mol/kg', 'f')
1172+
'sedno3', 'Nitrate concentration in the bottom layer', 'h', '1', 's', 'mol/kg', 'f')
11721173
wombat%id_sedno3 = register_diag_field(package_name, vardesc_temp%name, axes(1:2), &
11731174
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11741175

11751176
vardesc_temp = vardesc( &
1176-
'seddic', 'Dissolved inorganic carbon at the deepest grid cell', 'h', '1', 's', 'mol/kg', 'f')
1177+
'seddic', 'Dissolved inorganic carbon concentration in the bottom layer', 'h', '1', 's', 'mol/kg', 'f')
11771178
wombat%id_seddic = register_diag_field(package_name, vardesc_temp%name, axes(1:2), &
11781179
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11791180

11801181
vardesc_temp = vardesc( &
1181-
'sedalk', 'Alkalinity at the deepest grid cell', 'h', '1', 's', 'mol/kg', 'f')
1182+
'sedalk', 'Alkalinity concentration in the bottom layer', 'h', '1', 's', 'mol/kg', 'f')
11821183
wombat%id_sedalk = register_diag_field(package_name, vardesc_temp%name, axes(1:2), &
11831184
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11841185

11851186
vardesc_temp = vardesc( &
1186-
'sedhtotal', 'H+ ions at the deepest grid cell', 'h', '1', 's', 'mol/kg', 'f')
1187+
'sedhtotal', 'H+ ion concentration in the bottom layer', 'h', '1', 's', 'mol/kg', 'f')
11871188
wombat%id_sedhtotal = register_diag_field(package_name, vardesc_temp%name, axes(1:2), &
11881189
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11891190

11901191
vardesc_temp = vardesc( &
1191-
'sedco3', 'CO3 ions at the deepest grid cell', 'h', '1', 's', 'mol/kg', 'f')
1192+
'sedco3', 'CO3 ion concentration in the bottom layer', 'h', '1', 's', 'mol/kg', 'f')
11921193
wombat%id_sedco3 = register_diag_field(package_name, vardesc_temp%name, axes(1:2), &
11931194
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11941195

11951196
vardesc_temp = vardesc( &
1196-
'sedomega_cal', 'Calcite saturation state at the deepest grid cell', 'h', '1', 's', ' ', 'f')
1197+
'sedomega_cal', 'Calcite saturation state in the bottom layer', 'h', '1', 's', ' ', 'f')
11971198
wombat%id_sedomega_cal = register_diag_field(package_name, vardesc_temp%name, axes(1:2), &
11981199
init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1)
11991200

@@ -1418,7 +1419,12 @@ subroutine user_add_params
14181419
! Detritus maximum sinking rate coefficient [m/s]
14191420
!-----------------------------------------------------------------------
14201421
call g_tracer_add_param('wdetmax', wombat%wdetmax, 36.0/86400.0)
1421-
1422+
1423+
! Bottom thickness [m]
1424+
!-----------------------------------------------------------------------
1425+
! Thickness over which tracer values are integrated to define the bottom layer
1426+
call g_tracer_add_param('bottom_thickness', wombat%bottom_thickness, 1.0)
1427+
14221428
! Detritus remineralisation rate constant in sediments [1/s]
14231429
!-----------------------------------------------------------------------
14241430
! This would normally equal detlrem, but we set the default value to be
@@ -2010,7 +2016,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
20102016
real, dimension(:,ilb:,jlb:,:), intent(in) :: opacity_band
20112017

20122018
integer :: isc, iec, jsc, jec, isd, ied, jsd, jed, nk, ntau, tn
2013-
integer :: i, j, k, n, nz
2019+
integer :: i, j, k, n, nz, k_bot
20142020
real, dimension(:,:,:), pointer :: grid_tmask
20152021
integer, dimension(:,:), pointer :: grid_kmt
20162022
integer, dimension(:,:), allocatable :: kmeuph ! deepest level of euphotic zone
@@ -2044,6 +2050,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
20442050
real :: zoo_slmor, epsmin
20452051
real :: hco3, diss_cal, diss_ara, diss_det
20462052
real :: avedetbury, avecaco3bury
2053+
real :: dzt_bot, dzt_bot_os
20472054
real, dimension(:,:,:,:), allocatable :: n_pools, c_pools
20482055
logical :: used
20492056

@@ -3006,6 +3013,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
30063013
print *, " Nested timestep number =", tn
30073014
print *, " "
30083015
print *, " Biological N budget (molN/kg) at two timesteps =", n_pools(i,j,k,1), n_pools(i,j,k,2)
3016+
print *, " Difference in budget between timesteps =", n_pools(i,j,k,2) - n_pools(i,j,k,1)
30093017
print *, " "
30103018
print *, " NO3 (molNO3/kg) =", wombat%f_no3(i,j,k)
30113019
print *, " PHY (molN/kg) =", wombat%f_phy(i,j,k) * 16.0 / 122.0
@@ -3030,6 +3038,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
30303038
print *, " Nested timestep number =", tn
30313039
print *, " "
30323040
print *, " Biological C budget (molC/kg) at two timesteps =", c_pools(i,j,k,1), c_pools(i,j,k,2)
3041+
print *, " Difference in budget between timesteps =", c_pools(i,j,k,2) - c_pools(i,j,k,1)
30333042
print *, " "
30343043
print *, " DIC (molC/kg) =", wombat%f_dic(i,j,k)
30353044
print *, " ALK (molC/kg) =", wombat%f_alk(i,j,k)
@@ -3188,26 +3197,65 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
31883197
call g_tracer_get_pointer(tracer_list, 'detfe_sediment', 'field', wombat%p_detfe_sediment) ! [mol/m2]
31893198
call g_tracer_get_pointer(tracer_list, 'caco3_sediment', 'field', wombat%p_caco3_sediment) ! [mol/m2]
31903199

3200+
! Get bottom conditions, including those that influence bottom fluxes. Bottom conditions are
3201+
! calculated over a layer defined by wombat%bottom_thickness (default 1 m). This is done because
3202+
! the bottom layers in MOM6 are usually "vanished" layers. This approach is based on what is done
3203+
! in COBALT v3.
31913204
do j = jsc,jec; do i = isc,iec;
3205+
k_bot = 0
3206+
dzt_bot = 0.0
3207+
do k = grid_kmt(i,j),1,-1
3208+
if (dzt_bot .lt. wombat%bottom_thickness) then
3209+
k_bot = k
3210+
dzt_bot = dzt_bot + dzt(i,j,k) ! [m]
3211+
wombat%sedtemp(i,j) = wombat%sedtemp(i,j) + Temp(i,j,k) * dzt(i,j,k) ! [m*degC]
3212+
wombat%sedsalt(i,j) = wombat%sedsalt(i,j) + Salt(i,j,k) * dzt(i,j,k) ! [m*psu]
3213+
wombat%sedno3(i,j) = wombat%sedno3(i,j) + wombat%f_no3(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
3214+
wombat%seddic(i,j) = wombat%seddic(i,j) + wombat%f_dic(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
3215+
wombat%sedalk(i,j) = wombat%sedalk(i,j) + wombat%f_alk(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
3216+
wombat%sedhtotal(i,j) = wombat%sedhtotal(i,j) + wombat%htotal(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
3217+
endif
3218+
enddo
3219+
! Subtract off overshoot
3220+
dzt_bot_os = dzt_bot - wombat%bottom_thickness
3221+
wombat%sedtemp(i,j) = wombat%sedtemp(i,j) - Temp(i,j,k_bot) * dzt_bot_os ! [m*degC]
3222+
wombat%sedsalt(i,j) = wombat%sedsalt(i,j) - Salt(i,j,k_bot) * dzt_bot_os ! [m*psu]
3223+
wombat%sedno3(i,j) = wombat%sedno3(i,j) - wombat%f_no3(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
3224+
wombat%seddic(i,j) = wombat%seddic(i,j) - wombat%f_dic(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
3225+
wombat%sedalk(i,j) = wombat%sedalk(i,j) - wombat%f_alk(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
3226+
wombat%sedhtotal(i,j) = wombat%sedhtotal(i,j) - wombat%htotal(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
3227+
! Convert to mol/kg
3228+
wombat%sedtemp(i,j) = wombat%sedtemp(i,j) / wombat%bottom_thickness ! [degC]
3229+
wombat%sedsalt(i,j) = wombat%sedsalt(i,j) / wombat%bottom_thickness ! [psu]
3230+
wombat%sedno3(i,j) = wombat%sedno3(i,j) / wombat%bottom_thickness ! [mol/kg]
3231+
wombat%seddic(i,j) = wombat%seddic(i,j) / wombat%bottom_thickness ! [mol/kg]
3232+
wombat%sedalk(i,j) = wombat%sedalk(i,j) / wombat%bottom_thickness ! [mol/kg]
3233+
wombat%sedhtotal(i,j) = wombat%sedhtotal(i,j) / wombat%bottom_thickness ! [mol/kg]
3234+
3235+
! Set seddep as full depth minus half the bottom thickness and sedmask from bottom layer
31923236
k = grid_kmt(i,j)
31933237
if (k .gt. 0) then
3194-
! Get bottom conditions: mask, PO4, temp, salt, DIC, Alk, H+ ion
3195-
wombat%seddep(i,j) = wombat%zw(i,j,k)
3238+
wombat%seddep(i,j) = max(0.0, wombat%zw(i,j,k) - (wombat%bottom_thickness / 2.0))
31963239
wombat%sedmask(i,j) = grid_tmask(i,j,k)
3197-
wombat%sedtemp(i,j) = Temp(i,j,k)
3198-
wombat%sedsalt(i,j) = Salt(i,j,k)
3199-
wombat%sedno3(i,j) = wombat%f_no3(i,j,k)
3200-
wombat%seddic(i,j) = wombat%f_dic(i,j,k) + wombat%p_det_sediment(i,j,1) / wombat%Rho_0 ![mol/kg]
3201-
wombat%sedalk(i,j) = wombat%f_alk(i,j,k)
3202-
wombat%sedhtotal(i,j) = wombat%htotal(i,j,k)
32033240
endif
3241+
3242+
! pjb: Sum the water column concentration of DIC and the organic carbon content of the
3243+
! sediment to approximate the interstitial (i.e., porewater) DIC concentration.
3244+
! We assume that the organic carbon content of the sediment (p_det_sediment) in mol/m2 is
3245+
! relevant over one meter, and therefore can be automatically converted to mol/m3 and then
3246+
! subsequently converted through the mol/kg using Rho_0. With this assumption these arrays
3247+
! can be added together.
3248+
! We add these arrays together to simulate the reducing conditions of organic-rich sediments,
3249+
! and to calculate a lower omega for calcite, which ensures greater rates of dissolution of
3250+
! CaCO3 within the sediment as organic matter accumulates.
3251+
wombat%seddic(i,j) = wombat%seddic(i,j) + wombat%p_det_sediment(i,j,1) / wombat%Rho_0
32043252
enddo; enddo
32053253

32063254
call FMS_ocmip2_co2calc(CO2_dope_vec, wombat%sedmask(:,:), &
32073255
wombat%sedtemp(:,:), wombat%sedsalt(:,:), &
32083256
min(wombat%dic_max*mmol_m3_to_mol_kg, max(wombat%seddic(:,:), wombat%dic_min*mmol_m3_to_mol_kg)), &
32093257
max(wombat%sedno3(:,:) / 16., 1e-9), &
3210-
wombat%sio2(:,:), &
3258+
wombat%sio2(:,:), & ! dts: This is currently constant, equal to wombat%sio2_surf
32113259
min(wombat%alk_max*mmol_m3_to_mol_kg, max(wombat%sedalk(:,:), wombat%alk_min*mmol_m3_to_mol_kg)), &
32123260
wombat%sedhtotal(:,:)*wombat%htotal_scale_lo, &
32133261
wombat%sedhtotal(:,:)*wombat%htotal_scale_hi, &

0 commit comments

Comments
 (0)