@@ -213,6 +213,7 @@ module generic_WOMBATmid
213
213
meslmor, &
214
214
mesqmor, &
215
215
detlrem, &
216
+ bottom_thickness, &
216
217
detlrem_sed, &
217
218
wdetbio, &
218
219
wdetmax, &
@@ -1645,7 +1646,7 @@ subroutine generic_WOMBATmid_register_diag(diag_list)
1645
1646
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1646
1647
1647
1648
vardesc_temp = vardesc( &
1648
- ' seddep' , ' Depth of the sediment ' , ' h' , ' 1' , ' s' , ' m' , ' f' )
1649
+ ' seddep' , ' Depth of the bottom layer ' , ' h' , ' 1' , ' s' , ' m' , ' f' )
1649
1650
wombat% id_seddep = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1650
1651
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1651
1652
@@ -1655,52 +1656,52 @@ subroutine generic_WOMBATmid_register_diag(diag_list)
1655
1656
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1656
1657
1657
1658
vardesc_temp = vardesc( &
1658
- ' sedtemp' , ' Temperature at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' deg C' , ' f' )
1659
+ ' sedtemp' , ' Temperature in the bottom layer ' , ' h' , ' 1' , ' s' , ' deg C' , ' f' )
1659
1660
wombat% id_sedtemp = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1660
1661
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1661
1662
1662
1663
vardesc_temp = vardesc( &
1663
- ' sedsalt' , ' Salinity at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' psu' , ' f' )
1664
+ ' sedsalt' , ' Salinity in the bottom layer ' , ' h' , ' 1' , ' s' , ' psu' , ' f' )
1664
1665
wombat% id_sedsalt = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1665
1666
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1666
1667
1667
1668
vardesc_temp = vardesc( &
1668
- ' sedno3' , ' Nitrate at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1669
+ ' sedno3' , ' Nitrate concentration in the bottom layer ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1669
1670
wombat% id_sedno3 = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1670
1671
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1671
1672
1672
1673
vardesc_temp = vardesc( &
1673
- ' sednh4' , ' Ammonium at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1674
+ ' sednh4' , ' Ammonium concentration in the bottom layer ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1674
1675
wombat% id_sednh4 = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1675
1676
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1676
1677
1677
1678
vardesc_temp = vardesc( &
1678
- ' sedo2' , ' Oxygen at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1679
+ ' sedo2' , ' Oxygen concentration in the bottom layer ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1679
1680
wombat% id_sedo2 = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1680
1681
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1681
1682
1682
1683
vardesc_temp = vardesc( &
1683
- ' seddic' , ' Dissolved inorganic carbon at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1684
+ ' seddic' , ' Dissolved inorganic carbon concentration in the bottom layer ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1684
1685
wombat% id_seddic = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1685
1686
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1686
1687
1687
1688
vardesc_temp = vardesc( &
1688
- ' sedalk' , ' Alkalinity at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1689
+ ' sedalk' , ' Alkalinity concentration in the bottom layer ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1689
1690
wombat% id_sedalk = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1690
1691
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1691
1692
1692
1693
vardesc_temp = vardesc( &
1693
- ' sedhtotal' , ' H+ ions at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1694
+ ' sedhtotal' , ' H+ ion concentration in the bottom layer ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1694
1695
wombat% id_sedhtotal = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1695
1696
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1696
1697
1697
1698
vardesc_temp = vardesc( &
1698
- ' sedco3' , ' CO3 ions at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1699
+ ' sedco3' , ' CO3 ion concentration in the bottom layer ' , ' h' , ' 1' , ' s' , ' mol/kg' , ' f' )
1699
1700
wombat% id_sedco3 = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1700
1701
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1701
1702
1702
1703
vardesc_temp = vardesc( &
1703
- ' sedomega_cal' , ' Calcite saturation state at the deepest grid cell ' , ' h' , ' 1' , ' s' , ' ' , ' f' )
1704
+ ' sedomega_cal' , ' Calcite saturation state in the bottom layer ' , ' h' , ' 1' , ' s' , ' ' , ' f' )
1704
1705
wombat% id_sedomega_cal = register_diag_field(package_name, vardesc_temp% name, axes(1 :2 ), &
1705
1706
init_time, vardesc_temp% longname, vardesc_temp% units, missing_value= missing_value1)
1706
1707
@@ -2050,6 +2051,11 @@ subroutine user_add_params
2050
2051
!- ----------------------------------------------------------------------
2051
2052
call g_tracer_add_param(' wdetmax' , wombat% wdetmax, 45.0 / 86400.0 )
2052
2053
2054
+ ! Bottom thickness [m]
2055
+ !- ----------------------------------------------------------------------
2056
+ ! Thickness over which tracer values are integrated to define the bottom layer
2057
+ call g_tracer_add_param(' bottom_thickness' , wombat% bottom_thickness, 1.0 )
2058
+
2053
2059
! Detritus remineralisation rate constant in sediments [1/s]
2054
2060
!- ----------------------------------------------------------------------
2055
2061
! This would normally equal detlrem, but we set the default value to be
@@ -2743,7 +2749,7 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, &
2743
2749
real , dimension (:,ilb:,jlb:,:), intent (in ) :: opacity_band
2744
2750
2745
2751
integer :: isc, iec, jsc, jec, isd, ied, jsd, jed, nk, ntau, tn
2746
- integer :: i, j, k, n, nz
2752
+ integer :: i, j, k, n, nz, k_bot
2747
2753
real , dimension (:,:,:), pointer :: grid_tmask
2748
2754
integer , dimension (:,:), pointer :: grid_kmt
2749
2755
integer , dimension (:,:), allocatable :: kmeuph ! deepest level of euphotic zone
@@ -2789,6 +2795,7 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, &
2789
2795
real :: zoo_slmor, mes_slmor, epsmin
2790
2796
real :: hco3, diss_cal, diss_ara, diss_det
2791
2797
real :: avedetbury, avecaco3bury
2798
+ real :: dzt_bot, dzt_bot_os
2792
2799
real , dimension (:,:,:,:), allocatable :: n_pools, c_pools
2793
2800
logical :: used
2794
2801
@@ -4219,6 +4226,7 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, &
4219
4226
print * , " Nested timestep number =" , tn
4220
4227
print * , " "
4221
4228
print * , " Biological N budget (molN/kg) at two timesteps =" , n_pools(i,j,k,1 ), n_pools(i,j,k,2 )
4229
+ print * , " Difference in budget between timesteps =" , n_pools(i,j,k,2 ) - n_pools(i,j,k,1 )
4222
4230
print * , " "
4223
4231
print * , " NO3 (molNO3/kg) =" , wombat% f_no3(i,j,k)
4224
4232
print * , " NH4 (molNH4/kg) =" , wombat% f_nh4(i,j,k)
@@ -4256,6 +4264,7 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, &
4256
4264
print * , " Nested timestep number =" , tn
4257
4265
print * , " "
4258
4266
print * , " Biological C budget (molC/kg) at two timesteps =" , c_pools(i,j,k,1 ), c_pools(i,j,k,2 )
4267
+ print * , " Difference in budget between timesteps =" , c_pools(i,j,k,2 ) - c_pools(i,j,k,1 )
4259
4268
print * , " "
4260
4269
print * , " DIC (molC/kg) =" , wombat% f_dic(i,j,k)
4261
4270
print * , " ALK (molC/kg) =" , wombat% f_alk(i,j,k)
@@ -4432,28 +4441,71 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, &
4432
4441
call g_tracer_get_pointer(tracer_list, ' detfe_sediment' , ' field' , wombat% p_detfe_sediment) ! [mol/m2]
4433
4442
call g_tracer_get_pointer(tracer_list, ' caco3_sediment' , ' field' , wombat% p_caco3_sediment) ! [mol/m2]
4434
4443
4444
+ ! Get bottom conditions, including those that influence bottom fluxes. Bottom conditions are
4445
+ ! calculated over a layer defined by wombat%bottom_thickness (default 1 m). This is done because
4446
+ ! the bottom layers in MOM6 are usually "vanished" layers. This approach is based on what is done
4447
+ ! in COBALT v3.
4435
4448
do j = jsc,jec; do i = isc,iec;
4436
- k = grid_kmt(i,j)
4437
- if (k .gt. 0 ) then
4438
- ! Get bottom conditions: mask, PO4, temp, salt, DIC, Alk, H+ ion
4439
- wombat% seddep(i,j) = wombat% zw(i,j,k)
4449
+ if (grid_kmt(i,j).gt. 0 ) then
4450
+ k_bot = 0
4451
+ dzt_bot = 0.0
4452
+ do k = grid_kmt(i,j),1 ,- 1
4453
+ if (dzt_bot .lt. wombat% bottom_thickness) then
4454
+ k_bot = k
4455
+ dzt_bot = dzt_bot + dzt(i,j,k) ! [m]
4456
+ wombat% sedtemp(i,j) = wombat% sedtemp(i,j) + Temp(i,j,k) * dzt(i,j,k) ! [m*degC]
4457
+ wombat% sedsalt(i,j) = wombat% sedsalt(i,j) + Salt(i,j,k) * dzt(i,j,k) ! [m*psu]
4458
+ wombat% sedno3(i,j) = wombat% sedno3(i,j) + wombat% f_no3(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
4459
+ wombat% sednh4(i,j) = wombat% sednh4(i,j) + wombat% f_nh4(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
4460
+ wombat% sedo2(i,j) = wombat% sedo2(i,j) + wombat% f_o2(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
4461
+ wombat% seddic(i,j) = wombat% seddic(i,j) + wombat% f_dic(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
4462
+ wombat% sedalk(i,j) = wombat% sedalk(i,j) + wombat% f_alk(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
4463
+ wombat% sedhtotal(i,j) = wombat% sedhtotal(i,j) + wombat% htotal(i,j,k) * dzt(i,j,k) ! [m*mol/kg]
4464
+ endif
4465
+ enddo
4466
+ ! Subtract off overshoot
4467
+ dzt_bot_os = dzt_bot - wombat% bottom_thickness
4468
+ wombat% sedtemp(i,j) = wombat% sedtemp(i,j) - Temp(i,j,k_bot) * dzt_bot_os ! [m*degC]
4469
+ wombat% sedsalt(i,j) = wombat% sedsalt(i,j) - Salt(i,j,k_bot) * dzt_bot_os ! [m*psu]
4470
+ wombat% sedno3(i,j) = wombat% sedno3(i,j) - wombat% f_no3(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
4471
+ wombat% sednh4(i,j) = wombat% sednh4(i,j) - wombat% f_nh4(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
4472
+ wombat% sedo2(i,j) = wombat% sedo2(i,j) - wombat% f_o2(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
4473
+ wombat% seddic(i,j) = wombat% seddic(i,j) - wombat% f_dic(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
4474
+ wombat% sedalk(i,j) = wombat% sedalk(i,j) - wombat% f_alk(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
4475
+ wombat% sedhtotal(i,j) = wombat% sedhtotal(i,j) - wombat% htotal(i,j,k_bot) * dzt_bot_os ! [m*mol/kg]
4476
+ ! Convert to mol/kg
4477
+ wombat% sedtemp(i,j) = wombat% sedtemp(i,j) / wombat% bottom_thickness ! [degC]
4478
+ wombat% sedsalt(i,j) = wombat% sedsalt(i,j) / wombat% bottom_thickness ! [psu]
4479
+ wombat% sedno3(i,j) = wombat% sedno3(i,j) / wombat% bottom_thickness ! [mol/kg]
4480
+ wombat% sednh4(i,j) = wombat% sednh4(i,j) / wombat% bottom_thickness ! [mol/kg]
4481
+ wombat% sedo2(i,j) = wombat% sedo2(i,j) / wombat% bottom_thickness ! [mol/kg]
4482
+ wombat% seddic(i,j) = wombat% seddic(i,j) / wombat% bottom_thickness ! [mol/kg]
4483
+ wombat% sedalk(i,j) = wombat% sedalk(i,j) / wombat% bottom_thickness ! [mol/kg]
4484
+ wombat% sedhtotal(i,j) = wombat% sedhtotal(i,j) / wombat% bottom_thickness ! [mol/kg]
4485
+
4486
+ ! Set seddep as full depth minus half the bottom thickness and sedmask from bottom layer
4487
+ k = grid_kmt(i,j)
4488
+ wombat% seddep(i,j) = max (0.0 , wombat% zw(i,j,k) - (wombat% bottom_thickness / 2.0 ))
4440
4489
wombat% sedmask(i,j) = grid_tmask(i,j,k)
4441
- wombat% sedtemp(i,j) = Temp(i,j,k)
4442
- wombat% sedsalt(i,j) = Salt(i,j,k)
4443
- wombat% sedno3(i,j) = wombat% f_no3(i,j,k)
4444
- wombat% sednh4(i,j) = wombat% f_nh4(i,j,k)
4445
- wombat% sedo2(i,j) = wombat% f_o2(i,j,k)
4446
- wombat% seddic(i,j) = wombat% f_dic(i,j,k) + wombat% p_det_sediment(i,j,1 ) / wombat% Rho_0 ! [mol/kg]
4447
- wombat% sedalk(i,j) = wombat% f_alk(i,j,k)
4448
- wombat% sedhtotal(i,j) = wombat% htotal(i,j,k)
4490
+
4491
+ ! pjb: Sum the water column concentration of DIC and the organic carbon content of the
4492
+ ! sediment to approximate the interstitial (i.e., porewater) DIC concentration.
4493
+ ! We assume that the organic carbon content of the sediment (p_det_sediment) in mol/m2 is
4494
+ ! relevant over one meter, and therefore can be automatically converted to mol/m3 and then
4495
+ ! subsequently converted through the mol/kg using Rho_0. With this assumption these arrays
4496
+ ! can be added together.
4497
+ ! We add these arrays together to simulate the reducing conditions of organic-rich sediments,
4498
+ ! and to calculate a lower omega for calcite, which ensures greater rates of dissolution of
4499
+ ! CaCO3 within the sediment as organic matter accumulates.
4500
+ wombat% seddic(i,j) = wombat% seddic(i,j) + wombat% p_det_sediment(i,j,1 ) / wombat% Rho_0
4449
4501
endif
4450
4502
enddo ; enddo
4451
4503
4452
4504
call FMS_ocmip2_co2calc(CO2_dope_vec, wombat% sedmask(:,:), &
4453
4505
wombat% sedtemp(:,:), wombat% sedsalt(:,:), &
4454
4506
min (wombat% dic_max* mmol_m3_to_mol_kg, max (wombat% seddic(:,:), wombat% dic_min* mmol_m3_to_mol_kg)), &
4455
4507
max (wombat% sedno3(:,:) / 16 ., 1e-9 ), &
4456
- wombat% sio2(:,:), &
4508
+ wombat% sio2(:,:), & ! dts: This is currently constant, equal to wombat%sio2_surf
4457
4509
min (wombat% alk_max* mmol_m3_to_mol_kg, max (wombat% sedalk(:,:), wombat% alk_min* mmol_m3_to_mol_kg)), &
4458
4510
wombat% sedhtotal(:,:)* wombat% htotal_scale_lo, &
4459
4511
wombat% sedhtotal(:,:)* wombat% htotal_scale_hi, &
0 commit comments