@@ -165,6 +165,7 @@ module generic_WOMBATlite
165
165
zoolmor, &
166
166
zooqmor, &
167
167
detlrem, &
168
+ bottom_thickness, &
168
169
detlrem_sed, &
169
170
wdetbio, &
170
171
wdetmax, &
@@ -1148,7 +1149,7 @@ subroutine generic_WOMBATlite_register_diag(diag_list)
1148
1149
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1149
1150
1150
1151
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' )
1152
1153
wombat% id_seddep = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1153
1154
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1154
1155
@@ -1158,42 +1159,42 @@ subroutine generic_WOMBATlite_register_diag(diag_list)
1158
1159
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1159
1160
1160
1161
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' )
1162
1163
wombat% id_sedtemp = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1163
1164
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1164
1165
1165
1166
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' )
1167
1168
wombat% id_sedsalt = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1168
1169
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1169
1170
1170
1171
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' )
1172
1173
wombat% id_sedno3 = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1173
1174
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1174
1175
1175
1176
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' )
1177
1178
wombat% id_seddic = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1178
1179
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1179
1180
1180
1181
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' )
1182
1183
wombat% id_sedalk = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1183
1184
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1184
1185
1185
1186
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' )
1187
1188
wombat% id_sedhtotal = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1188
1189
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1189
1190
1190
1191
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' )
1192
1193
wombat% id_sedco3 = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1193
1194
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1194
1195
1195
1196
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' )
1197
1198
wombat% id_sedomega_cal = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1198
1199
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1199
1200
@@ -1418,7 +1419,12 @@ subroutine user_add_params
1418
1419
! Detritus maximum sinking rate coefficient [m/s]
1419
1420
!- ----------------------------------------------------------------------
1420
1421
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
+
1422
1428
! Detritus remineralisation rate constant in sediments [1/s]
1423
1429
!- ----------------------------------------------------------------------
1424
1430
! 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, &
2010
2016
real , dimension (:,ilb:,jlb:,:), intent (in ) :: opacity_band
2011
2017
2012
2018
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
2014
2020
real , dimension (:,:,:), pointer :: grid_tmask
2015
2021
integer , dimension (:,:), pointer :: grid_kmt
2016
2022
integer , dimension (:,:), allocatable :: kmeuph ! deepest level of euphotic zone
@@ -2044,6 +2050,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
2044
2050
real :: zoo_slmor, epsmin
2045
2051
real :: hco3, diss_cal, diss_ara, diss_det
2046
2052
real :: avedetbury, avecaco3bury
2053
+ real :: dzt_bot, dzt_bot_os
2047
2054
real , dimension (:,:,:,:), allocatable :: n_pools, c_pools
2048
2055
logical :: used
2049
2056
@@ -3006,6 +3013,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
3006
3013
print * , " Nested timestep number =" , tn
3007
3014
print * , " "
3008
3015
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 )
3009
3017
print * , " "
3010
3018
print * , " NO3 (molNO3/kg) =" , wombat% f_no3(i,j,k)
3011
3019
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, &
3030
3038
print * , " Nested timestep number =" , tn
3031
3039
print * , " "
3032
3040
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 )
3033
3042
print * , " "
3034
3043
print * , " DIC (molC/kg) =" , wombat% f_dic(i,j,k)
3035
3044
print * , " ALK (molC/kg) =" , wombat% f_alk(i,j,k)
@@ -3188,26 +3197,65 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, &
3188
3197
call g_tracer_get_pointer(tracer_list, ' detfe_sediment' , ' field' , wombat% p_detfe_sediment) ! [mol/m2]
3189
3198
call g_tracer_get_pointer(tracer_list, ' caco3_sediment' , ' field' , wombat% p_caco3_sediment) ! [mol/m2]
3190
3199
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.
3191
3204
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
3192
3236
k = grid_kmt(i,j)
3193
3237
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 ))
3196
3239
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)
3203
3240
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
3204
3252
enddo ; enddo
3205
3253
3206
3254
call FMS_ocmip2_co2calc(CO2_dope_vec, wombat% sedmask(:,:), &
3207
3255
wombat% sedtemp(:,:), wombat% sedsalt(:,:), &
3208
3256
min (wombat% dic_max* mmol_m3_to_mol_kg, max (wombat% seddic(:,:), wombat% dic_min* mmol_m3_to_mol_kg)), &
3209
3257
max (wombat% sedno3(:,:) / 16 ., 1e-9 ), &
3210
- wombat% sio2(:,:), &
3258
+ wombat% sio2(:,:), & ! dts: This is currently constant, equal to wombat%sio2_surf
3211
3259
min (wombat% alk_max* mmol_m3_to_mol_kg, max (wombat% sedalk(:,:), wombat% alk_min* mmol_m3_to_mol_kg)), &
3212
3260
wombat% sedhtotal(:,:)* wombat% htotal_scale_lo, &
3213
3261
wombat% sedhtotal(:,:)* wombat% htotal_scale_hi, &
0 commit comments