From 614cb69ce9cb4c58d4009164a5af883ed9d889f1 Mon Sep 17 00:00:00 2001 From: "Pearse J. Buchanan" Date: Wed, 25 Feb 2026 09:13:40 +1100 Subject: [PATCH 1/3] Major update to WOMBAT-lite: * aesthetic changes to some diagnostics and code comments * zooplankton now explicitly dissolve sinking CaCO3 in their guts when consuming particulates * Fe chemistry now includes varying colloidal fraction and a light-dependent stability constant * phytoplankton uptake of iron now reduced under light limitation but not to the same extent as C uptake * zooplankton egestion, excretion and assimilation of C and Fe following Le Mezo & Galbraith 2021 * zooplankton prey items now normalized to dietary fractions (Gentleman et al., 2003) --- generic_tracers/generic_WOMBATlite.F90 | 449 +++++++++++++++---------- 1 file changed, 273 insertions(+), 176 deletions(-) diff --git a/generic_tracers/generic_WOMBATlite.F90 b/generic_tracers/generic_WOMBATlite.F90 index ebb5d74b..a8dd2e1b 100644 --- a/generic_tracers/generic_WOMBATlite.F90 +++ b/generic_tracers/generic_WOMBATlite.F90 @@ -160,8 +160,10 @@ module generic_WOMBATlite phymaxqf, & phylmor, & phyqmor, & - zooassi, & - zooexcr, & + zooCingest, & + zooCassim, & + zooFeingest, & + zooFeassim, & fgutdiss, & zookz, & zoogmax, & @@ -301,23 +303,26 @@ module generic_WOMBATlite phy_feupreg, & phy_fedoreg, & phygrow, & - phyresp, & - phymort, & + phymorl, & + phymorq, & zooeps, & zoograzphy, & zoograzdet, & - zooresp, & - zoomort, & + zoomorl, & + zoomorq, & zooexcrphy, & zooexcrdet, & - zooslopphy, & - zooslopdet, & + zooassiphy, & + zooassidet, & + zooegesphy, & + zooegesdet, & reminr, & detremi, & pic2poc, & dissratcal, & dissratara, & dissratpoc, & + zoodiss, & caldiss, & aradiss, & pocdiss, & @@ -378,23 +383,26 @@ module generic_WOMBATlite id_phy_feupreg = -1, & id_phy_fedoreg = -1, & id_phygrow = -1, & - id_phyresp = -1, & - id_phymort = -1, & + id_phymorl = -1, & + id_phymorq = -1, & id_zooeps = -1, & id_zoograzphy = -1, & id_zoograzdet = -1, & - id_zooresp = -1, & - id_zoomort = -1, & + id_zoomorl = -1, & + id_zoomorq = -1, & id_zooexcrphy = -1, & id_zooexcrdet = -1, & - id_zooslopphy = -1, & - id_zooslopdet = -1, & + id_zooassiphy = -1, & + id_zooassidet = -1, & + id_zooegesphy = -1, & + id_zooegesdet = -1, & id_reminr = -1, & id_detremi = -1, & id_pic2poc = -1, & id_dissratcal = -1, & id_dissratara = -1, & id_dissratpoc = -1, & + id_zoodiss = -1, & id_caldiss = -1, & id_aradiss = -1, & id_pocdiss = -1, & @@ -865,13 +873,13 @@ subroutine generic_WOMBATlite_register_diag(diag_list) init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) vardesc_temp = vardesc( & - 'phyresp', 'Respiration of phytoplankton', 'h', 'L', 's', 'molC/kg/s', 'f') - wombat%id_phyresp = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & + 'phymorl', 'Linear mortality of phytoplankton', 'h', 'L', 's', 'molC/kg/s', 'f') + wombat%id_phymorl = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) vardesc_temp = vardesc( & - 'phymort', 'Mortality of phytoplankton', 'h', 'L', 's', 'molC/kg/s', 'f') - wombat%id_phymort = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & + 'phymorq', 'Quadratic mortality of phytoplankton', 'h', 'L', 's', 'molC/kg/s', 'f') + wombat%id_phymorq = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) vardesc_temp = vardesc( & @@ -890,13 +898,13 @@ subroutine generic_WOMBATlite_register_diag(diag_list) init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) vardesc_temp = vardesc( & - 'zooresp', 'Respiration of zooplankton', 'h', 'L', 's', 'molC/kg/s', 'f') - wombat%id_zooresp = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & + 'zoomorl', 'Linear mortality of zooplankton', 'h', 'L', 's', 'molC/kg/s', 'f') + wombat%id_zoomorl = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) vardesc_temp = vardesc( & - 'zoomort', 'Mortality of zooplankton', 'h', 'L', 's', 'molC/kg/s', 'f') - wombat%id_zoomort = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & + 'zoomorq', 'Quadratic mortality of zooplankton', 'h', 'L', 's', 'molC/kg/s', 'f') + wombat%id_zoomorq = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) vardesc_temp = vardesc( & @@ -910,13 +918,23 @@ subroutine generic_WOMBATlite_register_diag(diag_list) init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) vardesc_temp = vardesc( & - 'zooslopphy', 'Sloppy feeding of zooplankton on phytoplankton', 'h', 'L', 's', 'molC/kg/s', 'f') - wombat%id_zooslopphy = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & + 'zooassiphy', 'Assimilation into biomass of zooplankton feeding on phytoplankton', 'h', 'L', 's', 'molC/kg/s', 'f') + wombat%id_zooassiphy = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) vardesc_temp = vardesc( & - 'zooslopdet', 'Sloppy feeding of zooplankton on detritus', 'h', 'L', 's', 'molC/kg/s', 'f') - wombat%id_zooslopdet = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & + 'zooassidet', 'Assimilation into biomass of zooplankton feeding on detritus', 'h', 'L', 's', 'molC/kg/s', 'f') + wombat%id_zooassidet = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & + init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) + + vardesc_temp = vardesc( & + 'zooegesphy', 'Egestion of zooplankton feeding on phytoplankton', 'h', 'L', 's', 'molC/kg/s', 'f') + wombat%id_zooegesphy = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & + init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) + + vardesc_temp = vardesc( & + 'zooegesdet', 'Egestion of zooplankton feeding on detritus', 'h', 'L', 's', 'molC/kg/s', 'f') + wombat%id_zooegesdet = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) vardesc_temp = vardesc( & @@ -949,6 +967,11 @@ subroutine generic_WOMBATlite_register_diag(diag_list) wombat%id_dissratpoc = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) + vardesc_temp = vardesc( & + 'zoodiss', 'Dissolution of CaCO3 due to zooplankton grazing', 'h', 'L', 's', 'molCaCO3/kg/s', 'f') + wombat%id_zoodiss = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & + init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) + vardesc_temp = vardesc( & 'caldiss', 'Dissolution of Calcite CaCO3', 'h', 'L', 's', 'molCaCO3/kg/s', 'f') wombat%id_caldiss = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & @@ -1200,13 +1223,21 @@ subroutine user_add_params !----------------------------------------------------------------------- call g_tracer_add_param('phybiot', wombat%phybiot, 0.6) - ! Zooplankton assimilation efficiency [1] + ! Zooplankton ingestion efficiency of prey carbon (the rest is egested) [1] + !----------------------------------------------------------------------- + call g_tracer_add_param('zooCingest', wombat%zooCingest, 0.8) + + ! Zooplankton assimilation of ingested prey carbon (the rest is excreted) [0-1] + !----------------------------------------------------------------------- + call g_tracer_add_param('zooCassim', wombat%zooCassim, 0.3) + + ! Zooplankton ingestion efficiency of prey carbon (the rest is egested) [1] !----------------------------------------------------------------------- - call g_tracer_add_param('zooassi', wombat%zooassi, 0.3) + call g_tracer_add_param('zooFeingest', wombat%zooFeingest, 0.2) - ! Zooplankton excretion of unassimilated prey [0-1] + ! Zooplankton assimilation of ingested prey carbon (the rest is excreted) [0-1] !----------------------------------------------------------------------- - call g_tracer_add_param('zooexcr', wombat%zooexcr, 0.75) + call g_tracer_add_param('zooFeassim', wombat%zooFeassim, 0.9) ! Zooplankton dissolution efficiency of CaCO3 within guts [1] !----------------------------------------------------------------------- @@ -1849,8 +1880,11 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & real, dimension(nbands) :: sw_pen real :: swpar real :: g_npz, g_peffect + real :: zooegesphyfe, zooegesdetfe + real :: zooassiphyfe, zooassidetfe + real :: zooexcrphyfe, zooexcrdetfe real :: biophy, biozoo, biodet, biono3, biofer, biocaco3 - real :: biophyfe, biophy1, zooprey + real :: biophyfe, biophy1, zooprefphy, zooprefdet, zooprey real :: fbc, zval real, parameter :: epsi = 1.0e-30 integer :: ichl @@ -1861,7 +1895,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & real, dimension(:), allocatable :: wsink, wsinkcal real, dimension(4,61) :: zbgr real, dimension(3) :: dbgr, cbgr - real :: ztemk, I_ztemk, fe_keq, fe_par, fe_sfe, fe_tfe, partic + real :: ztemk, I_ztemk, fe_keq, fe_sfe, partic real :: fesol1, fesol2, fesol3, fesol4, fesol5, hp, fe3sol real :: biof, biodoc, zno3, zfermin real :: phy_Fe2C, zoo_Fe2C, det_Fe2C @@ -2078,23 +2112,26 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & wombat%phy_feupreg(:,:,:) = 0.0 wombat%phy_fedoreg(:,:,:) = 0.0 wombat%phygrow(:,:,:) = 0.0 - wombat%phyresp(:,:,:) = 0.0 - wombat%phymort(:,:,:) = 0.0 + wombat%phymorl(:,:,:) = 0.0 + wombat%phymorq(:,:,:) = 0.0 wombat%zooeps(:,:,:) = 0.0 wombat%zoograzphy(:,:,:) = 0.0 wombat%zoograzdet(:,:,:) = 0.0 - wombat%zooresp(:,:,:) = 0.0 - wombat%zoomort(:,:,:) = 0.0 + wombat%zoomorl(:,:,:) = 0.0 + wombat%zoomorq(:,:,:) = 0.0 wombat%zooexcrphy(:,:,:) = 0.0 wombat%zooexcrdet(:,:,:) = 0.0 - wombat%zooslopphy(:,:,:) = 0.0 - wombat%zooslopdet(:,:,:) = 0.0 + wombat%zooassiphy(:,:,:) = 0.0 + wombat%zooassidet(:,:,:) = 0.0 + wombat%zooegesphy(:,:,:) = 0.0 + wombat%zooegesdet(:,:,:) = 0.0 wombat%reminr(:,:,:) = 0.0 wombat%detremi(:,:,:) = 0.0 wombat%pic2poc(:,:,:) = 0.0 wombat%dissratcal(:,:,:) = 0.0 wombat%dissratara(:,:,:) = 0.0 wombat%dissratpoc(:,:,:) = 0.0 + wombat%zoodiss(:,:,:) = 0.0 wombat%caldiss(:,:,:) = 0.0 wombat%aradiss(:,:,:) = 0.0 wombat%pocdiss(:,:,:) = 0.0 @@ -2187,17 +2224,18 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & ! 2. Nutrient limitation of phytoplankton ! ! 3. Temperature-dependence of heterotrophy ! ! 4. Light limitation of phytoplankton ! - ! 5. Growth of chlorophyll ! - ! 6. Phytoplankton uptake of iron ! - ! 7. Iron chemistry ! - ! 8. Mortality and remineralisation ! - ! 9. Zooplankton grazing ! - ! 10. CaCO3 calculations ! - ! 11. Tracer tendencies ! - ! 12. Check for conservation by ecosystem component ! - ! 13. Additional operations on tracers ! - ! 14. Sinking rate of particulates ! - ! 15. Sedimentary processes ! + ! 5. Realized growth of phytoplankton ! + ! 6. Growth of chlorophyll ! + ! 7. Phytoplankton uptake of iron ! + ! 8. Iron chemistry ! + ! 9. Mortality and remineralisation ! + ! 10. Zooplankton grazing, egestion, excretion and assimilation ! + ! 11. CaCO3 calculations ! + ! 12. Tracer tendencies ! + ! 13. Check for conservation by ecosystem component ! + ! 14. Additional operations on tracers ! + ! 15. Sinking rate of particulates ! + ! 16. Sedimentary processes ! ! ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -2395,10 +2433,21 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & ! 1. Initial slope of Photosynthesis-Irradiance curve ! 2. Light limitation - ! 3. Apply light and nutrient limitations to maximum growth rate phy_pisl = max(wombat%alphabio * phy_chlc, wombat%alphabio * wombat%phyminqc) wombat%phy_lpar(i,j,k) = (1. - exp(-phy_pisl * wombat%radbio(i,j,k))) + + + !-----------------------------------------------------------------------! + !-----------------------------------------------------------------------! + !-----------------------------------------------------------------------! + ! [Step 5] Realized growth rate of phytoplankton ! + !-----------------------------------------------------------------------! + !-----------------------------------------------------------------------! + !-----------------------------------------------------------------------! + + ! 1. Apply light and nutrient limitations to maximum growth rate + wombat%phy_mu(i,j,k) = wombat%phy_mumax(i,j,k) * wombat%phy_lpar(i,j,k) * & min(wombat%phy_lnit(i,j,k), wombat%phy_lfer(i,j,k)) @@ -2412,7 +2461,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 5] Growth of chlorophyll ! + ! [Step 6] Growth of chlorophyll ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -2439,14 +2488,14 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 6] Phytoplankton uptake of iron ! + ! [Step 7] Phytoplankton uptake of iron ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! ! 1. Maximum iron content of phytoplankton cell ! 2. Ensure that dFe uptake increases or decreases in response to cell quota - ! 3. Iron uptake of phytoplankton (reduced to 20% at night and when N is limiting) + ! 3. Iron uptake of phytoplankton (reduced 10-fold in darkness) phy_maxqfe = biophy * wombat%phymaxqf !mmol Fe / m3 wombat%phy_feupreg(i,j,k) = (4.0 - 4.5 * wombat%phy_lfer(i,j,k) / & @@ -2454,7 +2503,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & wombat%phy_fedoreg(i,j,k) = max(0.0, (1.0 - biophyfe/phy_maxqfe) / & abs(1.05 - biophyfe/phy_maxqfe) ) wombat%phy_dfeupt(i,j,k) = (wombat%phy_mumax(i,j,k) * wombat%phymaxqf * & - max(0.2, wombat%phy_lpar(i,j,k) * wombat%phy_lnit(i,j,k)) * & + max(0.01, wombat%phy_lpar(i,j,k))**0.5 * & biofer / (biofer + wombat%phy_kfe(i,j,k)) * & wombat%phy_feupreg(i,j,k) * & wombat%phy_fedoreg(i,j,k) * biophy) * mmol_m3_to_mol_kg @@ -2463,12 +2512,13 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 7] Iron chemistry (Aumont et al., 2015; GMD) ! + ! [Step 8] Iron chemistry (precipitation, scavenging & coagulation) ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! Estimate solubility of Fe3+ (free Fe) in solution using temperature, pH and salinity + ! Estimate solubility of Fe3+ (free Fe) in solution using temperature, + ! pH and salinity using the equations of Liu & Millero (2002) ztemk = max(5.0, Temp(i,j,k)) + 273.15 ! temperature in kelvin I_ztemk = 1.0 / ztemk zval = 19.924 * Salt(i,j,k) / ( 1000. - 1.005 * Salt(i,j,k)) @@ -2485,20 +2535,26 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & endif fe3sol = fesol1 * ( hp*hp*hp + fesol2*hp*hp + fesol3*hp + fesol4 + fesol5/hp ) *1e9 - ! Estimate total colloidal iron - ! ... for now, we assume that 50% of all dFe is colloidal, and we separate this from the - ! equilibrium fractionation between Fe' and Fe-L below - wombat%fecol(i,j,k) = wombat%fcolloid * biofer - - ! Determine equilibriuim fractionation of the remain dFe (non-colloidal fraction) into Fe' and L-Fe - fe_keq = 10.0**( 17.27 - 1565.7 * I_ztemk ) * 1e-9 ! Temperature reduces solubility - fe_par = 0.47587 * wombat%radbio(i,j,k) ! Light increases solubility. dts: 0.47587=4.77e-7*0.5/10.0**(-6.3) + ! Estimate total colloidal iron following Tagliabue et al. (2023). + ! Colloidal dFe is considered to be whatever exceeds the inorganic solubility + ! ceiling, although there is always a hard lower limit of 10% of total dFe. + wombat%fecol(i,j,k) = max(0.1 * biofer, biofer - fe3sol) + + ! Determine equilibriuim fractionation of the remaining dFe (non-colloidal) + ! between Fe' and ligand-bound iron (L-Fe). Below, temperature increases the + ! solubility constant (reducing free Fe) and light decreases the solubility + ! constant (increasing free Fe). The temperature-dependency comes from Volker + ! & Tagliabue (2015), while the light dependency is informed by Barbeau et al. + ! (2001) who saw a 0.7 log10 unit decrease in K in high light. + fe_keq = 1e-9 * 10.0**( (17.27 - 1565.7 * I_ztemk ) - 0.7 * & + wombat%radbio(i,j,k) / (wombat%radbio(i,j,k) + 10.0) ) fe_sfe = max(0.0, biofer - wombat%fecol(i,j,k)) - fe_tfe = (1.0 + fe_par) * fe_sfe - wombat%feIII(i,j,k) = ( -( 1. + wombat%ligand * fe_keq + fe_par - fe_sfe * fe_keq ) & - + SQRT( ( 1. + wombat%ligand * fe_keq + fe_par - fe_sfe * fe_keq )**2 & - + 4. * fe_tfe * fe_keq) ) / ( 2. * fe_keq + epsi ) + zval = 1.0 + wombat%ligand * fe_keq - fe_sfe * fe_keq + wombat%feIII(i,j,k) = ( -zval + SQRT( zval*zval + 4.0*fe_keq*fe_sfe ) ) & + / ( 2.*fe_keq + epsi ) + wombat%feIII(i,j,k) = max(0.0, min(wombat%feIII(i,j,k), fe_sfe) ) wombat%felig(i,j,k) = max(0.0, fe_sfe - wombat%feIII(i,j,k)) + ! Precipitation of Fe' (creation of nanoparticles) wombat%feprecip(i,j,k) = max(0.0, ( wombat%feIII(i,j,k) - fe3sol ) ) * wombat%knano_dfe/86400.0 @@ -2532,27 +2588,27 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 8] Mortality and remineralisation ! + ! [Step 9] Mortality and remineralisation ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! if (biophy>1e-3) then - wombat%phyresp(i,j,k) = wombat%phylmor * fbc * wombat%f_phy(i,j,k) ! [molC/kg/s] - wombat%phymort(i,j,k) = wombat%phyqmor / mmol_m3_to_mol_kg * wombat%f_phy(i,j,k) * wombat%f_phy(i,j,k) ! [molC/kg/s] + wombat%phymorl(i,j,k) = wombat%phylmor * fbc * wombat%f_phy(i,j,k) ! [molC/kg/s] + wombat%phymorq(i,j,k) = wombat%phyqmor / mmol_m3_to_mol_kg * wombat%f_phy(i,j,k) * wombat%f_phy(i,j,k) ! [molC/kg/s] else - wombat%phyresp(i,j,k) = 0.0 - wombat%phymort(i,j,k) = 0.0 + wombat%phymorl(i,j,k) = 0.0 + wombat%phymorq(i,j,k) = 0.0 endif if (biozoo>1e-3) then ! reduce linear mortality (respiration losses) of zooplankton when there is low biomass zoo_slmor = biozoo / (biozoo + wombat%zookz) - wombat%zooresp(i,j,k) = wombat%zoolmor * fbc * wombat%f_zoo(i,j,k) * zoo_slmor ! [molC/kg/s] - wombat%zoomort(i,j,k) = wombat%zooqmor / mmol_m3_to_mol_kg * wombat%f_zoo(i,j,k) * wombat%f_zoo(i,j,k) ! [molC/kg/s] + wombat%zoomorl(i,j,k) = wombat%zoolmor * fbc * wombat%f_zoo(i,j,k) * zoo_slmor ! [molC/kg/s] + wombat%zoomorq(i,j,k) = wombat%zooqmor / mmol_m3_to_mol_kg * wombat%f_zoo(i,j,k) * wombat%f_zoo(i,j,k) ! [molC/kg/s] else - wombat%zooresp(i,j,k) = 0.0 - wombat%zoomort(i,j,k) = 0.0 + wombat%zoomorl(i,j,k) = 0.0 + wombat%zoomorq(i,j,k) = 0.0 endif if (wombat%f_det(i,j,k) > epsi) then @@ -2565,37 +2621,52 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 9] Zooplankton grazing ! + ! [Step 10] Zooplankton grazing, egestion, excretion and assimilation ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - zooprey = wombat%zprefphy * biophy + wombat%zprefdet * biodet - ! Epsilon (prey capture rate coefficient) is made a function of - ! phytoplankton biomass (Fig 2 of Rohr et al., 2024; GRL) + ! Calculate the prey biomass from dietary fractions (Gentleman et al., 2003) + zooprefphy = wombat%zprefphy / (wombat%zprefphy + wombat%zprefdet) + zooprefdet = wombat%zprefdet / (wombat%zprefphy + wombat%zprefdet) + zooprey = (zooprefphy * biophy + zooprefdet * biodet) + ! Epsilon (prey capture rate coefficient) is made a function of phytoplankton + ! biomass (Fig 2 of Rohr et al., 2024; GRL) ! - scales towards lower values (mesozooplankton) as prey biomass increases g_peffect = exp(-zooprey * wombat%zooepsrat) wombat%zooeps(i,j,k) = wombat%zooepsmin + (wombat%zooepsmax - wombat%zooepsmin) * g_peffect g_npz = wombat%zoogmax * fbc * (wombat%zooeps(i,j,k) * zooprey*zooprey) / & (wombat%zoogmax * fbc + (wombat%zooeps(i,j,k) * zooprey*zooprey)) + ! We follow Le Mezo & Galbraith (2021) L&O - The fecal iron pump: ... + ! - egestion, assimilation and excretion of carbon and iron by zooplankton are calculated separately + ! - the idea is to enrich fecal pellets in iron compared to carbon + ! 1. zooplankton ingest C and Fe (the rest is egested) + ! 2. zooplankton assimilate the ingested C and Fe (the rest is excreted) if (zooprey>1e-3) then - wombat%zoograzphy(i,j,k) = g_npz * wombat%f_zoo(i,j,k) * (wombat%zprefphy*biophy)/zooprey ! [molC/kg/s] - wombat%zoograzdet(i,j,k) = g_npz * wombat%f_zoo(i,j,k) * (wombat%zprefdet*biodet)/zooprey ! [molC/kg/s] + wombat%zoograzphy(i,j,k) = g_npz * wombat%f_zoo(i,j,k) * (zooprefphy*biophy)/zooprey ! [molC/kg/s] + wombat%zoograzdet(i,j,k) = g_npz * wombat%f_zoo(i,j,k) * (zooprefdet*biodet)/zooprey ! [molC/kg/s] else wombat%zoograzphy(i,j,k) = 0.0 wombat%zoograzdet(i,j,k) = 0.0 endif - wombat%zooexcrphy(i,j,k) = wombat%zoograzphy(i,j,k) * (1.0 - wombat%zooassi)*wombat%zooexcr - wombat%zooexcrdet(i,j,k) = wombat%zoograzdet(i,j,k) * (1.0 - wombat%zooassi)*wombat%zooexcr - wombat%zooslopphy(i,j,k) = wombat%zoograzphy(i,j,k) * (1.0 - wombat%zooassi)*(1.0-wombat%zooexcr) - wombat%zooslopdet(i,j,k) = wombat%zoograzdet(i,j,k) * (1.0 - wombat%zooassi)*(1.0-wombat%zooexcr) - + wombat%zooegesphy(i,j,k) = wombat%zoograzphy(i,j,k) * (1.0-wombat%zooCingest) + wombat%zooegesdet(i,j,k) = wombat%zoograzdet(i,j,k) * (1.0-wombat%zooCingest) + wombat%zooassiphy(i,j,k) = wombat%zoograzphy(i,j,k) * wombat%zooCingest*wombat%zooCassim + wombat%zooassidet(i,j,k) = wombat%zoograzdet(i,j,k) * wombat%zooCingest*wombat%zooCassim + wombat%zooexcrphy(i,j,k) = wombat%zoograzphy(i,j,k) * wombat%zooCingest*(1.0-wombat%zooCassim) + wombat%zooexcrdet(i,j,k) = wombat%zoograzdet(i,j,k) * wombat%zooCingest*(1.0-wombat%zooCassim) + zooegesphyfe = wombat%zoograzphy(i,j,k) * phy_Fe2C * (1.0-wombat%zooFeingest) + zooegesdetfe = wombat%zoograzdet(i,j,k) * det_Fe2C * (1.0-wombat%zooFeingest) + zooassiphyfe = wombat%zoograzphy(i,j,k) * phy_Fe2C * wombat%zooFeingest*wombat%zooFeassim + zooassidetfe = wombat%zoograzdet(i,j,k) * det_Fe2C * wombat%zooFeingest*wombat%zooFeassim + zooexcrphyfe = wombat%zoograzphy(i,j,k) * phy_Fe2C * wombat%zooFeingest*(1.0-wombat%zooFeassim) + zooexcrdetfe = wombat%zoograzdet(i,j,k) * det_Fe2C * wombat%zooFeingest*(1.0-wombat%zooFeassim) !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 10] CaCO3 calculations ! + ! [Step 11] CaCO3 calculations ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -2610,7 +2681,8 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & hco3 / wombat%htotal(i,j,k))) * & (0.55 + 0.45 * tanh(Temp(i,j,k) - 4.0)) ) ! The dissolution rate is a function of omegas for calcite and aragonite, as well the - ! concentration of POC, following Kwon et al., 2024, Science Advances; Table S1 + ! concentration of POC, following Kwon et al., 2024, Science Advances; Table S1, and + ! we account for the dissolution due to zooplankton grazing on particulates wombat%dissratcal(i,j,k) = (wombat%disscal * max(0.0, 1.0 - wombat%omega_cal(i,j,k))**2.2) / 86400.0 wombat%dissratara(i,j,k) = (wombat%dissara * max(0.0, 1.0 - wombat%omega_ara(i,j,k))**1.5) / 86400.0 wombat%dissratpoc(i,j,k) = (wombat%dissdet * wombat%reminr(i,j,k) * biodet**2.0) @@ -2622,20 +2694,22 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & endif if (wombat%f_caco3(i,j,k) > epsi) then + wombat%zoodiss(i,j,k) = wombat%zoograzdet(i,j,k) * wombat%fgutdiss * biocaco3/biodet wombat%caldiss(i,j,k) = wombat%dissratcal(i,j,k) * wombat%f_caco3(i,j,k) ! [mol/kg/s] wombat%aradiss(i,j,k) = wombat%dissratara(i,j,k) * wombat%f_caco3(i,j,k) ! [mol/kg/s] wombat%pocdiss(i,j,k) = wombat%dissratpoc(i,j,k) * wombat%f_caco3(i,j,k) ! [mol/kg/s] else - wombat%caldiss(i,j,k) = 0.0 - wombat%aradiss(i,j,k) = 0.0 - wombat%pocdiss(i,j,k) = 0.0 + wombat%zoodiss(i,j,k) = 0.0 + wombat%caldiss(i,j,k) = 0.0 + wombat%aradiss(i,j,k) = 0.0 + wombat%pocdiss(i,j,k) = 0.0 endif !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 11] Tracer tendencies ! + ! [Step 12] Tracer tendencies ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -2644,34 +2718,34 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !---------------------------------------------------------------------- wombat%f_no3(i,j,k) = wombat%f_no3(i,j,k) + dtsb * 16./122. * ( & wombat%detremi(i,j,k) + & - wombat%zooresp(i,j,k) + & + wombat%zoomorl(i,j,k) + & wombat%zooexcrphy(i,j,k) + & wombat%zooexcrdet(i,j,k) + & - wombat%phyresp(i,j,k) - & + wombat%phymorl(i,j,k) - & wombat%phygrow(i,j,k) ) ! Phytoplankton equation ! [molC/kg] !----------------------------------------------------------------------- wombat%f_phy(i,j,k) = wombat%f_phy(i,j,k) + dtsb * ( & wombat%phygrow(i,j,k) - & - wombat%phyresp(i,j,k) - & - wombat%phymort(i,j,k) - & + wombat%phymorl(i,j,k) - & + wombat%phymorq(i,j,k) - & wombat%zoograzphy(i,j,k) ) ! Phytoplankton chlorophyll equation ! [molChl/kg] !----------------------------------------------------------------------- wombat%f_pchl(i,j,k) = wombat%f_pchl(i,j,k) + dtsb * ( & wombat%pchl_mu(i,j,k) - & - wombat%phyresp(i,j,k) * phy_chlc - & - wombat%phymort(i,j,k) * phy_chlc - & + wombat%phymorl(i,j,k) * phy_chlc - & + wombat%phymorq(i,j,k) * phy_chlc - & wombat%zoograzphy(i,j,k) * phy_chlc ) ! Phytoplankton iron equation ! [molFe/kg] !----------------------------------------------------------------------- wombat%f_phyfe(i,j,k) = wombat%f_phyfe(i,j,k) + dtsb * ( & wombat%phy_dfeupt(i,j,k) - & - wombat%phyresp(i,j,k) * phy_Fe2C - & - wombat%phymort(i,j,k) * phy_Fe2C - & + wombat%phymorl(i,j,k) * phy_Fe2C - & + wombat%phymorq(i,j,k) * phy_Fe2C - & wombat%zoograzphy(i,j,k) * phy_Fe2C ) ! Net primary productivity ! [molC/kg/s] @@ -2680,40 +2754,41 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & ! Zooplankton equation ! [molC/kg] !----------------------------------------------------------------------- wombat%f_zoo(i,j,k) = wombat%f_zoo(i,j,k) + dtsb * ( & - wombat%zooassi * wombat%zoograzphy(i,j,k) + & - wombat%zooassi * wombat%zoograzdet(i,j,k) - & - wombat%zooresp(i,j,k) - & - wombat%zoomort(i,j,k) ) + wombat%zooassiphy(i,j,k) + & + wombat%zooassidet(i,j,k) - & + wombat%zoomorl(i,j,k) - & + wombat%zoomorq(i,j,k) ) ! Zooplankton iron equation ! [molFe/kg] !----------------------------------------------------------------------- wombat%f_zoofe(i,j,k) = wombat%f_zoofe(i,j,k) + dtsb * ( & - wombat%zooassi * wombat%zoograzphy(i,j,k) * phy_Fe2C + & - wombat%zooassi * wombat%zoograzdet(i,j,k) * det_Fe2C - & - wombat%zooresp(i,j,k) * zoo_Fe2C - & - wombat%zoomort(i,j,k) * zoo_Fe2C ) + zooassiphyfe + & + zooassidetfe - & + wombat%zoomorl(i,j,k) * zoo_Fe2C - & + wombat%zoomorq(i,j,k) * zoo_Fe2C ) ! Estimate secondary productivity from zooplankton growth ! [molC/kg/s] wombat%zsp3d(i,j,k) = wombat%zsp3d(i,j,k) + dtsb * & - wombat%zooassi * (wombat%zoograzphy(i,j,k) + wombat%zoograzdet(i,j,k)) + wombat%zooCingest*wombat%zooCassim * & + (wombat%zoograzphy(i,j,k) + wombat%zoograzdet(i,j,k)) ! Detritus equation ! [molC/kg] !----------------------------------------------------------------------- wombat%f_det(i,j,k) = wombat%f_det(i,j,k) + dtsb * ( & - wombat%zooslopphy(i,j,k) + & - wombat%zooslopdet(i,j,k) + & - wombat%phymort(i,j,k) + & - wombat%zoomort(i,j,k) - & + wombat%zooegesphy(i,j,k) + & + wombat%zooegesdet(i,j,k) + & + wombat%phymorq(i,j,k) + & + wombat%zoomorq(i,j,k) - & wombat%zoograzdet(i,j,k) - & wombat%detremi(i,j,k) ) ! Detrital iron equation ! [molFe/kg] !----------------------------------------------------------------------- wombat%f_detfe(i,j,k) = wombat%f_detfe(i,j,k) + dtsb * ( & - wombat%zooslopphy(i,j,k) * phy_Fe2C + & - wombat%zooslopdet(i,j,k) * det_Fe2C + & - wombat%phymort(i,j,k) * phy_Fe2C + & - wombat%zoomort(i,j,k) * zoo_Fe2C - & + zooegesphyfe + & + zooegesdetfe + & + wombat%phymorq(i,j,k) * phy_Fe2C + & + wombat%zoomorq(i,j,k) * zoo_Fe2C - & wombat%zoograzdet(i,j,k) * det_Fe2C - & wombat%detremi(i,j,k) * det_Fe2C + & wombat%fescadet(i,j,k) + & @@ -2724,70 +2799,74 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & if (wombat%f_o2(i,j,k) > epsi) & wombat%f_o2(i,j,k) = wombat%f_o2(i,j,k) - 172./122. * dtsb * ( & wombat%detremi(i,j,k) + & - wombat%zooresp(i,j,k) + & + wombat%zoomorl(i,j,k) + & wombat%zooexcrphy(i,j,k) + & wombat%zooexcrdet(i,j,k) + & - wombat%phyresp(i,j,k) - & + wombat%phymorl(i,j,k) - & wombat%phygrow(i,j,k) ) ! Equation for CaCO3 ! [molCaCO3/kg] !----------------------------------------------------------------------- wombat%f_caco3(i,j,k) = wombat%f_caco3(i,j,k) + dtsb * ( & - wombat%zoograzphy(i,j,k) * (1. - wombat%fgutdiss) * wombat%pic2poc(i,j,k) + & - wombat%phymort(i,j,k) * wombat%pic2poc(i,j,k) + & - wombat%zoomort(i,j,k) * wombat%pic2poc(i,j,k) - & - wombat%caldiss(i,j,k) - wombat%aradiss(i,j,k) - wombat%pocdiss(i,j,k) ) + wombat%phymorq(i,j,k) * wombat%pic2poc(i,j,k) + & + wombat%zoomorq(i,j,k) * wombat%pic2poc(i,j,k) + & + wombat%zoograzphy(i,j,k) * (1. - wombat%fgutdiss) * wombat%pic2poc(i,j,k) - & + wombat%zoodiss(i,j,k) - wombat%caldiss(i,j,k) - & + wombat%aradiss(i,j,k) - wombat%pocdiss(i,j,k) ) ! Equation for DIC ! [molC/kg] !----------------------------------------------------------------------- wombat%f_dic(i,j,k) = wombat%f_dic(i,j,k) + dtsb * ( & wombat%detremi(i,j,k) + & - wombat%zooresp(i,j,k) + & + wombat%zoomorl(i,j,k) + & wombat%zooexcrphy(i,j,k) + & wombat%zooexcrdet(i,j,k) + & - wombat%phyresp(i,j,k) - & + wombat%phymorl(i,j,k) - & wombat%phygrow(i,j,k) - & wombat%zoograzphy(i,j,k) * (1.0-wombat%fgutdiss) * wombat%pic2poc(i,j,k) - & - wombat%phymort(i,j,k) * wombat%pic2poc(i,j,k) - & - wombat%zoomort(i,j,k) * wombat%pic2poc(i,j,k) + & - wombat%caldiss(i,j,k) + wombat%aradiss(i,j,k) + wombat%pocdiss(i,j,k) ) + wombat%phymorq(i,j,k) * wombat%pic2poc(i,j,k) - & + wombat%zoomorq(i,j,k) * wombat%pic2poc(i,j,k) + & + wombat%zoodiss(i,j,k) + wombat%caldiss(i,j,k) + & + wombat%aradiss(i,j,k) + wombat%pocdiss(i,j,k) ) ! Equation for DICr ! [molC/kg] !----------------------------------------------------------------------- wombat%f_dicr(i,j,k) = wombat%f_dicr(i,j,k) + dtsb * ( & wombat%detremi(i,j,k) + & - wombat%zooresp(i,j,k) + & + wombat%zoomorl(i,j,k) + & wombat%zooexcrphy(i,j,k) + & wombat%zooexcrdet(i,j,k) + & - wombat%phyresp(i,j,k) - & + wombat%phymorl(i,j,k) - & wombat%phygrow(i,j,k) - & wombat%zoograzphy(i,j,k) * (1.0-wombat%fgutdiss) * wombat%pic2poc(i,j,k) - & - wombat%phymort(i,j,k) * wombat%pic2poc(i,j,k) - & - wombat%zoomort(i,j,k) * wombat%pic2poc(i,j,k) + & - wombat%caldiss(i,j,k) + wombat%aradiss(i,j,k) + wombat%pocdiss(i,j,k) ) + wombat%phymorq(i,j,k) * wombat%pic2poc(i,j,k) - & + wombat%zoomorq(i,j,k) * wombat%pic2poc(i,j,k) + & + wombat%zoodiss(i,j,k) + wombat%caldiss(i,j,k) + & + wombat%aradiss(i,j,k) + wombat%pocdiss(i,j,k) ) ! Equation for ALK ! [molC/kg] !----------------------------------------------------------------------- wombat%f_alk(i,j,k) = wombat%f_alk(i,j,k) + dtsb * 16.0/122.0 * ( & wombat%phygrow(i,j,k) - & wombat%detremi(i,j,k) - & - wombat%zooresp(i,j,k) - & + wombat%zoomorl(i,j,k) - & wombat%zooexcrphy(i,j,k) - & wombat%zooexcrdet(i,j,k) - & - wombat%phyresp(i,j,k) ) + dtsb * 2.0 * ( & - wombat%caldiss(i,j,k) + wombat%aradiss(i,j,k) + wombat%pocdiss(i,j,k) - & + wombat%phymorl(i,j,k) ) + dtsb * 2.0 * ( & + wombat%zoodiss(i,j,k) + wombat%caldiss(i,j,k) + & + wombat%aradiss(i,j,k) + wombat%pocdiss(i,j,k) + & wombat%zoograzphy(i,j,k) * (1.0-wombat%fgutdiss) * wombat%pic2poc(i,j,k) - & - wombat%phymort(i,j,k) * wombat%pic2poc(i,j,k) - & - wombat%zoomort(i,j,k) * wombat%pic2poc(i,j,k) ) + wombat%phymorq(i,j,k) * wombat%pic2poc(i,j,k) - & + wombat%zoomorq(i,j,k) * wombat%pic2poc(i,j,k) ) ! Extra equation for iron ! [molFe/kg] !----------------------------------------------------------------------- wombat%f_fe(i,j,k) = wombat%f_fe(i,j,k) + dtsb * ( & wombat%detremi(i,j,k) * det_Fe2C + & - wombat%zooresp(i,j,k) * zoo_Fe2C + & - wombat%zooexcrphy(i,j,k) * phy_Fe2C + & - wombat%zooexcrdet(i,j,k) * det_Fe2C + & - wombat%phyresp(i,j,k) * phy_Fe2C - & + wombat%zoomorl(i,j,k) * zoo_Fe2C + & + zooexcrphyfe + & + zooexcrdetfe + & + wombat%phymorl(i,j,k) * phy_Fe2C - & wombat%phy_dfeupt(i,j,k) - & wombat%feprecip(i,j,k) - & wombat%fescaven(i,j,k) - & @@ -2796,10 +2875,10 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & ! Collect dFe sources and sinks for diagnostic output wombat%fesources(i,j,k) = wombat%fesources(i,j,k) + dtsb * ( & wombat%detremi(i,j,k) * det_Fe2C + & - wombat%zooresp(i,j,k) * zoo_Fe2C + & - wombat%zooexcrphy(i,j,k) * phy_Fe2C + & - wombat%zooexcrdet(i,j,k) * det_Fe2C + & - wombat%phyresp(i,j,k) * phy_Fe2C) + wombat%zoomorl(i,j,k) * zoo_Fe2C + & + zooexcrphyfe + & + zooexcrdetfe + & + wombat%phymorl(i,j,k) * phy_Fe2C) wombat%fesinks(i,j,k) = wombat%fesinks(i,j,k) + dtsb * ( & wombat%phy_dfeupt(i,j,k) + & wombat%feprecip(i,j,k) + & @@ -2810,7 +2889,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 12] Check for conservation of mass by ecosystem component ! + ! [Step 13] Check for conservation of mass by ecosystem component ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -2890,7 +2969,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 13] Additional operations on tracers ! + ! [Step 14] Additional operations on tracers ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -2931,7 +3010,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 14] Sinking of particulates ! + ! [Step 15] Sinking of particulates ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -2970,7 +3049,7 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 14] Sedimentary processes ! + ! [Step 16] Sedimentary processes ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -3229,12 +3308,12 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & used = g_send_data(wombat%id_phygrow, wombat%phygrow, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_phyresp > 0) & - used = g_send_data(wombat%id_phyresp, wombat%phyresp, model_time, & + if (wombat%id_phymorl > 0) & + used = g_send_data(wombat%id_phymorl, wombat%phymorl, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_phymort > 0) & - used = g_send_data(wombat%id_phymort, wombat%phymort, model_time, & + if (wombat%id_phymorq > 0) & + used = g_send_data(wombat%id_phymorq, wombat%phymorq, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) if (wombat%id_zooeps > 0) & @@ -3249,12 +3328,12 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & used = g_send_data(wombat%id_zoograzdet, wombat%zoograzdet, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_zooresp > 0) & - used = g_send_data(wombat%id_zooresp, wombat%zooresp, model_time, & + if (wombat%id_zoomorl > 0) & + used = g_send_data(wombat%id_zoomorl, wombat%zoomorl, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_zoomort > 0) & - used = g_send_data(wombat%id_zoomort, wombat%zoomort, model_time, & + if (wombat%id_zoomorq > 0) & + used = g_send_data(wombat%id_zoomorq, wombat%zoomorq, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) if (wombat%id_zooexcrphy > 0) & @@ -3265,12 +3344,20 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & used = g_send_data(wombat%id_zooexcrdet, wombat%zooexcrdet, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_zooslopphy > 0) & - used = g_send_data(wombat%id_zooslopphy, wombat%zooslopphy, model_time, & + if (wombat%id_zooassiphy > 0) & + used = g_send_data(wombat%id_zooassiphy, wombat%zooassiphy, model_time, & + rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) + + if (wombat%id_zooassidet > 0) & + used = g_send_data(wombat%id_zooassidet, wombat%zooassidet, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_zooslopdet > 0) & - used = g_send_data(wombat%id_zooslopdet, wombat%zooslopdet, model_time, & + if (wombat%id_zooegesphy > 0) & + used = g_send_data(wombat%id_zooegesphy, wombat%zooegesphy, model_time, & + rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) + + if (wombat%id_zooegesdet > 0) & + used = g_send_data(wombat%id_zooegesdet, wombat%zooegesdet, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) if (wombat%id_reminr > 0) & @@ -3297,6 +3384,10 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & used = g_send_data(wombat%id_dissratpoc, wombat%dissratpoc, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) + if (wombat%id_zoodiss > 0) & + used = g_send_data(wombat%id_zoodiss, wombat%zoodiss, model_time, & + rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) + if (wombat%id_caldiss > 0) & used = g_send_data(wombat%id_caldiss, wombat%caldiss, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) @@ -3680,23 +3771,26 @@ subroutine user_allocate_arrays allocate(wombat%phy_feupreg(isd:ied, jsd:jed, 1:nk)); wombat%phy_feupreg(:,:,:)=0.0 allocate(wombat%phy_fedoreg(isd:ied, jsd:jed, 1:nk)); wombat%phy_fedoreg(:,:,:)=0.0 allocate(wombat%phygrow(isd:ied, jsd:jed, 1:nk)); wombat%phygrow(:,:,:)=0.0 - allocate(wombat%phyresp(isd:ied, jsd:jed, 1:nk)); wombat%phyresp(:,:,:)=0.0 - allocate(wombat%phymort(isd:ied, jsd:jed, 1:nk)); wombat%phymort(:,:,:)=0.0 + allocate(wombat%phymorl(isd:ied, jsd:jed, 1:nk)); wombat%phymorl(:,:,:)=0.0 + allocate(wombat%phymorq(isd:ied, jsd:jed, 1:nk)); wombat%phymorq(:,:,:)=0.0 allocate(wombat%zooeps(isd:ied, jsd:jed, 1:nk)); wombat%zooeps(:,:,:)=0.0 allocate(wombat%zoograzphy(isd:ied, jsd:jed, 1:nk)); wombat%zoograzphy(:,:,:)=0.0 allocate(wombat%zoograzdet(isd:ied, jsd:jed, 1:nk)); wombat%zoograzdet(:,:,:)=0.0 - allocate(wombat%zooresp(isd:ied, jsd:jed, 1:nk)); wombat%zooresp(:,:,:)=0.0 - allocate(wombat%zoomort(isd:ied, jsd:jed, 1:nk)); wombat%zoomort(:,:,:)=0.0 + allocate(wombat%zoomorl(isd:ied, jsd:jed, 1:nk)); wombat%zoomorl(:,:,:)=0.0 + allocate(wombat%zoomorq(isd:ied, jsd:jed, 1:nk)); wombat%zoomorq(:,:,:)=0.0 allocate(wombat%zooexcrphy(isd:ied, jsd:jed, 1:nk)); wombat%zooexcrphy(:,:,:)=0.0 allocate(wombat%zooexcrdet(isd:ied, jsd:jed, 1:nk)); wombat%zooexcrdet(:,:,:)=0.0 - allocate(wombat%zooslopphy(isd:ied, jsd:jed, 1:nk)); wombat%zooslopphy(:,:,:)=0.0 - allocate(wombat%zooslopdet(isd:ied, jsd:jed, 1:nk)); wombat%zooslopdet(:,:,:)=0.0 + allocate(wombat%zooassiphy(isd:ied, jsd:jed, 1:nk)); wombat%zooassiphy(:,:,:)=0.0 + allocate(wombat%zooassidet(isd:ied, jsd:jed, 1:nk)); wombat%zooassidet(:,:,:)=0.0 + allocate(wombat%zooegesphy(isd:ied, jsd:jed, 1:nk)); wombat%zooegesphy(:,:,:)=0.0 + allocate(wombat%zooegesdet(isd:ied, jsd:jed, 1:nk)); wombat%zooegesdet(:,:,:)=0.0 allocate(wombat%reminr(isd:ied, jsd:jed, 1:nk)); wombat%reminr(:,:,:)=0.0 allocate(wombat%detremi(isd:ied, jsd:jed, 1:nk)); wombat%detremi(:,:,:)=0.0 allocate(wombat%pic2poc(isd:ied, jsd:jed, 1:nk)); wombat%pic2poc(:,:,:)=0.0 allocate(wombat%dissratcal(isd:ied, jsd:jed, 1:nk)); wombat%dissratcal(:,:,:)=0.0 allocate(wombat%dissratara(isd:ied, jsd:jed, 1:nk)); wombat%dissratara(:,:,:)=0.0 allocate(wombat%dissratpoc(isd:ied, jsd:jed, 1:nk)); wombat%dissratpoc(:,:,:)=0.0 + allocate(wombat%zoodiss(isd:ied, jsd:jed, 1:nk)); wombat%zoodiss(:,:,:)=0.0 allocate(wombat%caldiss(isd:ied, jsd:jed, 1:nk)); wombat%caldiss(:,:,:)=0.0 allocate(wombat%aradiss(isd:ied, jsd:jed, 1:nk)); wombat%aradiss(:,:,:)=0.0 allocate(wombat%pocdiss(isd:ied, jsd:jed, 1:nk)); wombat%pocdiss(:,:,:)=0.0 @@ -3801,22 +3895,25 @@ subroutine user_deallocate_arrays wombat%phy_feupreg, & wombat%phy_fedoreg, & wombat%phygrow, & - wombat%phyresp, & - wombat%phymort, & + wombat%phymorl, & + wombat%phymorq, & wombat%zoograzphy, & wombat%zoograzdet, & - wombat%zooresp, & - wombat%zoomort, & + wombat%zoomorl, & + wombat%zoomorq, & wombat%zooexcrphy, & wombat%zooexcrdet, & - wombat%zooslopphy, & - wombat%zooslopdet, & + wombat%zooassiphy, & + wombat%zooassidet, & + wombat%zooegesphy, & + wombat%zooegesdet, & wombat%reminr, & wombat%detremi, & wombat%pic2poc, & wombat%dissratcal, & wombat%dissratara, & wombat%dissratpoc, & + wombat%zoodiss, & wombat%caldiss, & wombat%aradiss, & wombat%pocdiss, & From 2205423803ecd534ca5d28c2c3b0713cf4d09924 Mon Sep 17 00:00:00 2001 From: "Pearse J. Buchanan" Date: Thu, 26 Feb 2026 13:36:05 +1100 Subject: [PATCH 2/3] Slight tweaks to WOMBATlite. Updates to functioning of WOMBATmid in line with documentation. More to come for WOMBATmid so might move to another branch. --- generic_tracers/generic_WOMBATlite.F90 | 18 +- generic_tracers/generic_WOMBATmid.F90 | 233 ++++++++++++------------- 2 files changed, 122 insertions(+), 129 deletions(-) diff --git a/generic_tracers/generic_WOMBATlite.F90 b/generic_tracers/generic_WOMBATlite.F90 index a8dd2e1b..bdc5c001 100644 --- a/generic_tracers/generic_WOMBATlite.F90 +++ b/generic_tracers/generic_WOMBATlite.F90 @@ -1346,9 +1346,15 @@ subroutine user_add_params !----------------------------------------------------------------------- call g_tracer_add_param('knano_dfe', wombat%knano_dfe, 0.1) - ! Scavenging of Fe` onto biogenic particles [(mmolC/m3)-1 d-1] + ! Scavenging of Fe` onto biogenic particles [(mmol/m3)-1 d-1] !----------------------------------------------------------------------- - call g_tracer_add_param('kscav_dfe', wombat%kscav_dfe, 0.05) + ! Ye et al., 2011 (Biogeosciences) find scavenging rates of 30 - 750 + ! (kg/m3)-1 day-1 in mesocosm experiments. Assuming that there are + ! 40,000 mmol C kg-1 (1 kg of pure carbon contains 83 mol and assuming + ! that half of marine organic particles are pure carbon by mass means + ! that roughly 40,000 mmol C kg-1), this translates to scavenging rates + ! of 0.001 to 0.02 (mmol mass particles / m3)-1 day-1. + call g_tracer_add_param('kscav_dfe', wombat%kscav_dfe, 0.01) ! Coagulation of dFe onto organic particles [(mmolC/m3)-1 d-1] !----------------------------------------------------------------------- @@ -2502,11 +2508,11 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & (wombat%phy_lfer(i,j,k) + 0.5) ) wombat%phy_fedoreg(i,j,k) = max(0.0, (1.0 - biophyfe/phy_maxqfe) / & abs(1.05 - biophyfe/phy_maxqfe) ) - wombat%phy_dfeupt(i,j,k) = (wombat%phy_mumax(i,j,k) * wombat%phymaxqf * & + wombat%phy_dfeupt(i,j,k) = (wombat%phy_mumax(i,j,k) * phy_maxqfe * & max(0.01, wombat%phy_lpar(i,j,k))**0.5 * & biofer / (biofer + wombat%phy_kfe(i,j,k)) * & wombat%phy_feupreg(i,j,k) * & - wombat%phy_fedoreg(i,j,k) * biophy) * mmol_m3_to_mol_kg + wombat%phy_fedoreg(i,j,k)) * mmol_m3_to_mol_kg !-----------------------------------------------------------------------! @@ -2560,9 +2566,9 @@ subroutine generic_WOMBATlite_update_from_source(tracer_list, Temp, Salt, & wombat%feprecip(i,j,k) = max(0.0, ( wombat%feIII(i,j,k) - fe3sol ) ) * wombat%knano_dfe/86400.0 ! Scavenging of Fe` onto biogenic particles - partic = (biodet + biocaco3) + partic = (biodet*2 + biocaco3*8.3) wombat%fescaven(i,j,k) = wombat%feIII(i,j,k) * (1e-7 + wombat%kscav_dfe * partic) / 86400.0 - wombat%fescadet(i,j,k) = wombat%fescaven(i,j,k) * biodet / (partic+epsi) + wombat%fescadet(i,j,k) = wombat%fescaven(i,j,k) * biodet*2 / (partic+epsi) ! Coagulation of colloidal Fe (umol/m3) to form sinking particles (mmol/m3) ! Following Tagliabue et al. (2023), make coagulation rate dependent on DOC and Phytoplankton biomass diff --git a/generic_tracers/generic_WOMBATmid.F90 b/generic_tracers/generic_WOMBATmid.F90 index 359b71a8..e865b9bd 100644 --- a/generic_tracers/generic_WOMBATmid.F90 +++ b/generic_tracers/generic_WOMBATmid.F90 @@ -205,7 +205,7 @@ module generic_WOMBATmid phykn, & phykf, & phyminqc, & - phyoptqc, & + phymaxqc, & phyoptqf, & phymaxqf, & phylmor, & @@ -214,7 +214,7 @@ module generic_WOMBATmid diakf, & diaks, & diaminqc, & - diaoptqc, & + diamaxqc, & diaoptqf, & diamaxqf, & diaminqs, & @@ -223,7 +223,7 @@ module generic_WOMBATmid diaVmaxs, & dialmor, & diaqmor, & - chlkWm2, & + chltau, & overflow, & trikf, & trichlc, & @@ -502,7 +502,6 @@ module generic_WOMBATmid phy_mumax, & phy_mu, & pchl_mu, & - pchl_lpar, & phy_kni, & phy_kfe, & phy_lpar, & @@ -514,7 +513,6 @@ module generic_WOMBATmid dia_mumax, & dia_mu, & dchl_mu, & - dchl_lpar, & dia_kni, & dia_kfe, & dia_ksi, & @@ -728,7 +726,6 @@ module generic_WOMBATmid id_phy_kni = -1, & id_phy_kfe = -1, & id_phy_lpar = -1, & - id_pchl_lpar = -1, & id_phy_lnit = -1, & id_phy_lnh4 = -1, & id_phy_lno3 = -1, & @@ -738,7 +735,6 @@ module generic_WOMBATmid id_dia_kfe = -1, & id_dia_ksi = -1, & id_dia_lpar = -1, & - id_dchl_lpar = -1, & id_dia_lnit = -1, & id_dia_lnh4 = -1, & id_dia_lno3 = -1, & @@ -1415,11 +1411,6 @@ subroutine generic_WOMBATmid_register_diag(diag_list) wombat%id_pchl_mu = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) - vardesc_temp = vardesc( & - 'pchl_lpar', 'Limitation of phytoplankton chlorophyll production by light', 'h', 'L', 's', '[0-1]', 'f') - wombat%id_pchl_lpar = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & - init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) - vardesc_temp = vardesc( & 'phy_lpar', 'Limitation of phytoplankton by light', 'h', 'L', 's', '[0-1]', 'f') wombat%id_phy_lpar = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & @@ -1475,11 +1466,6 @@ subroutine generic_WOMBATmid_register_diag(diag_list) wombat%id_dchl_mu = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) - vardesc_temp = vardesc( & - 'dchl_lpar', 'Limitation of microphytoplankton chlorophyll production by light', 'h', 'L', 's', '[0-1]', 'f') - wombat%id_dchl_lpar = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & - init_time, vardesc_temp%longname, vardesc_temp%units, missing_value=missing_value1) - vardesc_temp = vardesc( & 'dia_lpar', 'Limitation of microphytoplankton by light', 'h', 'L', 's', '[0-1]', 'f') wombat%id_dia_lpar = register_diag_field(package_name, vardesc_temp%name, axes(1:3), & @@ -2603,9 +2589,9 @@ subroutine user_add_params !----------------------------------------------------------------------- call g_tracer_add_param('phyminqc', wombat%phyminqc, 0.008) - ! Phytoplankton optimal quota of chlorophyll to carbon [mg/mg] + ! Phytoplankton maximum quota of chlorophyll to carbon [mg/mg] !----------------------------------------------------------------------- - call g_tracer_add_param('phyoptqc', wombat%phyoptqc, 0.040) + call g_tracer_add_param('phymaxqc', wombat%phymaxqc, 0.065) ! Phytoplankton optimal quota of iron to carbon [mol/mol] !----------------------------------------------------------------------- @@ -2642,9 +2628,9 @@ subroutine user_add_params !----------------------------------------------------------------------- call g_tracer_add_param('diaminqc', wombat%diaminqc, 0.004) - ! microphytoplankton optimal quota of chlorophyll to carbon [mg/mg] + ! microphytoplankton maximum quota of chlorophyll to carbon [mg/mg] !----------------------------------------------------------------------- - call g_tracer_add_param('diaoptqc', wombat%diaoptqc, 0.036) + call g_tracer_add_param('diamaxqc', wombat%diamaxqc, 0.060) ! microphytoplankton optimal quota of iron to carbon [mol/mol] !----------------------------------------------------------------------- @@ -2685,9 +2671,9 @@ subroutine user_add_params !----------------------------------------------------------------------- call g_tracer_add_param('diaqmor', wombat%diaqmor, 0.05/86400.0) - ! Chlorophyll darkness growth reduction half-saturation coefficient [W/m2] + ! Timescale of chlorophyll synthesis by phytoplankton [s] !----------------------------------------------------------------------- - call g_tracer_add_param('chlkWm2', wombat%chlkWm2, 5.0) + call g_tracer_add_param('chltau', wombat%chltau, 86400.0) ! Maximum fraction of NPP that can be routed to DOC exudation by phytoplankton [0-1] !----------------------------------------------------------------------- @@ -4028,13 +4014,10 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & real :: mass_det, mass_bdet, mass_caco3, mass_bsi, mass_small, mass_large real :: w1, w2, rho_small, rho_large real :: par_phy_mldsum, par_z_mldsum - real :: chl, ndet, carb, zchl, zval, sqrt_zval, phy_chlc, dia_chlc, phi + real :: chl, ndet, carb, zchl, zval, sqrt_zval, phy_chlc, dia_chlc real :: phy_limnh4, phy_limno3, phy_limdin real :: dia_limnh4, dia_limno3, dia_limdin - real :: phy_pisl, phy_pisl2 - real :: pchl_pisl, pchl_mumin, pchl_muopt - real :: dia_pisl, dia_pisl2 - real :: dchl_pisl, dchl_mumin, dchl_muopt + real :: phy_pisl, dia_pisl real :: zooegesbac1fe, zooegesbac2fe, zooegesaoafe, zooegesphyfe, zooegesdiafe, zooegesdetfe real :: zooassibac1fe, zooassibac2fe, zooassiaoafe, zooassiphyfe, zooassidiafe, zooassidetfe real :: zooexcrbac1fe, zooexcrbac2fe, zooexcraoafe, zooexcrphyfe, zooexcrdiafe, zooexcrdetfe @@ -4309,7 +4292,6 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & wombat%phy_kni(:,:,:) = 0.0 wombat%phy_kfe(:,:,:) = 0.0 wombat%phy_lpar(:,:,:) = 0.0 - wombat%pchl_lpar(:,:,:) = 0.0 wombat%phy_lnit(:,:,:) = 0.0 wombat%phy_lnh4(:,:,:) = 0.0 wombat%phy_lno3(:,:,:) = 0.0 @@ -4322,7 +4304,6 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & wombat%dia_kfe(:,:,:) = 0.0 wombat%dia_ksi(:,:,:) = 0.0 wombat%dia_lpar(:,:,:) = 0.0 - wombat%dchl_lpar(:,:,:) = 0.0 wombat%dia_lnit(:,:,:) = 0.0 wombat%dia_lnh4(:,:,:) = 0.0 wombat%dia_lno3(:,:,:) = 0.0 @@ -4623,20 +4604,21 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & ! 2. Nutrient limitation of phytoplankton ! ! 3. Temperature-dependence of heterotrophy ! ! 4. Light limitation of phytoplankton ! - ! 5. Growth of chlorophyll ! - ! 6. Phytoplankton uptake of iron ! - ! 7. Phytoplankton uptake of silicic acid ! - ! 8. Iron chemistry ! - ! 9. Silicic acid chemistry and dissolution ! - ! 10. Mortality scalings and grazing ! - ! 11. CaCO3 calculations ! - ! 12. Implicit nitrogen fixation ! - ! 13. Facultative heterotrophy calculations ! - ! 14. Chemoautotroph calculations ! - ! 15. Sources and sinks ! - ! 16. Tracer tendencies ! - ! 17. Check for conservation by ecosystem component ! - ! 18. Compute sinking rates of detrital pools ! + ! 5. Realized growth rate of phytoplankton ! + ! 6. Growth of chlorophyll ! + ! 7. Phytoplankton uptake of iron ! + ! 8. Phytoplankton uptake of silicic acid ! + ! 9. Iron chemistry (scavenging, coagulation, dissolution) ! + ! 10. Silicic acid chemistry and dissolution ! + ! 11. Mortality scalings and grazing ! + ! 12. CaCO3 calculations ! + ! 13. Implicit nitrogen fixation ! + ! 14. Facultative heterotrophy calculations ! + ! 15. Chemoautotroph calculations ! + ! 16. Sources and sinks ! + ! 17. Tracer tendencies ! + ! 18. Check for conservation by ecosystem component ! + ! 19. Compute sinking rates of detrital pools ! ! ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -4890,91 +4872,100 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! ! 1. initial slope of Photosynthesis-Irradiance curve - ! 2. Alter the slope to account for respiration and daylength limitation - ! 3. Light limitation - ! 4. Apply light and nutrient limitations to maximum growth rate - ! 5. Determine difference in light-limited and realized growth to get DOC exudation + ! 2. Light limitation !!!~~~ Phytoplankton ~~~!!! phy_pisl = max(wombat%alphabio_phy * phy_chlc, wombat%alphabio_phy * wombat%phyminqc) - phy_pisl2 = phy_pisl / ( (1. + wombat%phylmor*86400.0 * fbc) ) ! add daylength estimate here - wombat%phy_lpar(i,j,k) = (1. - exp(-phy_pisl2 * wombat%radbio(i,j,k))) - wombat%phy_mu(i,j,k) = wombat%phy_mumax(i,j,k) * wombat%phy_lpar(i,j,k) * & - min(wombat%phy_lnit(i,j,k), wombat%phy_lfer(i,j,k)) + wombat%phy_lpar(i,j,k) = (1. - exp(-phy_pisl * wombat%radbio(i,j,k))) + !!!~~~ Microphytoplankton ~~~!!! dia_pisl = max(wombat%alphabio_dia * dia_chlc, wombat%alphabio_dia * wombat%diaminqc) - dia_pisl2 = dia_pisl / ( (1. + wombat%dialmor*86400.0 * fbc) ) ! add daylength estimate here - wombat%dia_lpar(i,j,k) = (1. - exp(-dia_pisl2 * wombat%radbio(i,j,k))) - wombat%dia_mu(i,j,k) = wombat%dia_mumax(i,j,k) * wombat%dia_lpar(i,j,k) * & - min(wombat%dia_lnit(i,j,k), wombat%dia_lfer(i,j,k)) * wombat%dia_lsil(i,j,k) + wombat%dia_lpar(i,j,k) = (1. - exp(-dia_pisl * wombat%radbio(i,j,k))) + !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 5] Growth of chlorophyll ! + ! [Step 5] Realized growth rate of phytoplankton ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! 1. Light limitation of chlorophyll production - ! 2. minimum and optimal rates of chlorophyll growth - ! 3. Calculate mg Chl m-3 s-1 - - ! Reduced chlorophyll growth during extended periods of darkness - phi = wombat%radmld(i,j,1) / (wombat%radmld(i,j,1) + wombat%chlkWm2) + ! 1. Apply light and nutrient limitations to maximum growth rate + wombat%phy_mu(i,j,k) = wombat%phy_mumax(i,j,k) * wombat%phy_lpar(i,j,k) * & + min(wombat%phy_lnit(i,j,k), wombat%phy_lfer(i,j,k)) + wombat%dia_mu(i,j,k) = wombat%dia_mumax(i,j,k) * wombat%dia_lpar(i,j,k) * & + min(wombat%dia_lnit(i,j,k), wombat%dia_lfer(i,j,k)) * & + wombat%dia_lsil(i,j,k) - !!!~~~ Phytoplankton ~~~!!! - pchl_pisl = phy_pisl / ( wombat%phy_mumax(i,j,k) * 86400.0 * & - (1. - min(wombat%phy_lnit(i,j,k), wombat%phy_lfer(i,j,k))) + epsi ) - wombat%pchl_lpar(i,j,k) = (1. - exp(-pchl_pisl * wombat%radmld(i,j,k))) - pchl_mumin = wombat%phyminqc * wombat%phy_mu(i,j,k) * biophy * 12.0 ![mg/m3/s] - pchl_muopt = wombat%phyoptqc * wombat%phy_mu(i,j,k) * biophy * 12.0 ![mg/m3/s] - wombat%pchl_mu(i,j,k) = (pchl_muopt - pchl_mumin) * wombat%pchl_lpar(i,j,k) * & - min(wombat%phy_lnit(i,j,k), wombat%phy_lfer(i,j,k)) - if ( (phy_pisl * wombat%radmld(i,j,k)) > 0.0 ) then - wombat%pchl_mu(i,j,k) = phi * ( pchl_mumin + wombat%pchl_mu(i,j,k) / & - (phy_pisl * wombat%radmld(i,j,k)) ) + if ((wombat%f_nh4(i,j,k) + wombat%f_no3(i,j,k)) > epsi) then + wombat%phygrow(i,j,k) = wombat%phy_mu(i,j,k) * wombat%f_phy(i,j,k) ! [molC/kg/s] + wombat%diagrow(i,j,k) = wombat%dia_mu(i,j,k) * wombat%f_dia(i,j,k) ! [molC/kg/s] + else + wombat%phygrow(i,j,k) = 0.0 + wombat%diagrow(i,j,k) = 0.0 endif - wombat%pchl_mu(i,j,k) = wombat%pchl_mu(i,j,k) / 12.0 * mmol_m3_to_mol_kg ![mol/kg/s] + + + !-----------------------------------------------------------------------! + !-----------------------------------------------------------------------! + !-----------------------------------------------------------------------! + ! [Step 6] Growth of chlorophyll ! + !-----------------------------------------------------------------------! + !-----------------------------------------------------------------------! + !-----------------------------------------------------------------------! + + ! 1. Estimate the target Chl:C ratio required to support maximum growth + ! This is a direct approximation of Geider, MacIntyre & Kana (1997): + ! - Chl increased in response to low light (we use the mean of the MLD) + ! - Chl decreased in response to N and Fe limitation + ! 2. Ensure that a minimum chl:c ratio must be maintained by the cell + ! 3. Estimate the rate that chlorophyll is synthesized towards this optimal + ! Rates of chlorophyll synthesis are not instantaneous, and take hours to days + ! Here, we make chlorophyll synthesis respond on a timescale of chltau + + !!!~~~ Nanophytoplankton ~~~!!! + theta_opt = wombat%phymaxqc / (1.0 + & + ( wombat%alphabio_phy * wombat%radmld(i,j,k) * wombat%phymaxqc ) & + /( epsi + 2.0 * wombat%phy_mumax(i,j,k) * 86400.0 & + * max(0.01, min(wombat%phy_lnit(i,j,k), wombat%phy_lfer(i,j,k))) ) ) + theta_opt = max(wombat%phyminqc, theta_opt) + wombat%pchl_mu(i,j,k) = wombat%phy_mu(i,j,k) * wombat%f_pchl(i,j,k) & + + (theta_opt - phy_chlc) / wombat%chltau * wombat%f_phy(i,j,k) !!!~~~ Microphytoplankton ~~~!!! - dchl_pisl = dia_pisl / ( wombat%dia_mumax(i,j,k) * 86400.0 * & - (1. - min(wombat%dia_lnit(i,j,k), wombat%dia_lfer(i,j,k)) * wombat%dia_lsil(i,j,k)) + epsi ) - wombat%dchl_lpar(i,j,k) = (1. - exp(-dchl_pisl * wombat%radmld(i,j,k))) - dchl_mumin = wombat%diaminqc * wombat%dia_mu(i,j,k) * biodia * 12.0 ![mg/m3/s] - dchl_muopt = wombat%diaoptqc * wombat%dia_mu(i,j,k) * biodia * 12.0 ![mg/m3/s] - wombat%dchl_mu(i,j,k) = (dchl_muopt - dchl_mumin) * wombat%dchl_lpar(i,j,k) * & - min(wombat%dia_lnit(i,j,k), wombat%dia_lfer(i,j,k)) * wombat%dia_lsil(i,j,k) - if ( (dia_pisl * wombat%radmld(i,j,k)) > 0.0 ) then - wombat%dchl_mu(i,j,k) = phi * ( dchl_mumin + wombat%dchl_mu(i,j,k) / & - (dia_pisl * wombat%radmld(i,j,k)) ) - endif - wombat%dchl_mu(i,j,k) = wombat%dchl_mu(i,j,k) / 12.0 * mmol_m3_to_mol_kg ![mol/kg/s] + theta_opt = wombat%diamaxqc / (1.0 + & + ( wombat%alphabio_dia * wombat%radmld(i,j,k) * wombat%diamaxqc ) & + /( epsi + 2.0 * wombat%dia_mumax(i,j,k) * 86400.0 & + * max(0.01, min(wombat%dia_lnit(i,j,k), wombat%dia_lfer(i,j,k))) ) ) + theta_opt = max(wombat%diaminqc, theta_opt) + wombat%dchl_mu(i,j,k) = wombat%dia_mu(i,j,k) * wombat%f_dchl(i,j,k) & + + (theta_opt - dia_chlc) / wombat%chltau * wombat%f_dia(i,j,k) !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 6] Phytoplankton uptake of iron ! + ! [Step 7] Phytoplankton uptake of iron ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! ! 1. Maximum iron content of phytoplankton cell ! 2. Ensure that dFe uptake increases or decreases in response to cell quota - ! 3. Iron uptake of phytoplankton (reduced to 20% at night and when N is limiting) + ! 3. Iron uptake of phytoplankton (reduced 10-fold in darkness) - !!!~~~ Phytoplankton ~~~!!! + !!!~~~ Nano-phytoplankton ~~~!!! phy_maxqfe = biophy * wombat%phymaxqf !mmol Fe / m3 wombat%phy_feupreg(i,j,k) = (4.0 - 4.5 * wombat%phy_lfer(i,j,k) / & (wombat%phy_lfer(i,j,k) + 0.5) ) wombat%phy_fedoreg(i,j,k) = max(0.0, (1.0 - biophyfe/phy_maxqfe) / & abs(1.05 - biophyfe/phy_maxqfe) ) - wombat%phy_dfeupt(i,j,k) = (wombat%phy_mumax(i,j,k) * wombat%phymaxqf * & - max(0.2, wombat%phy_lpar(i,j,k) * wombat%phy_lnit(i,j,k)) * & + wombat%phy_dfeupt(i,j,k) = (wombat%phy_mumax(i,j,k) * phy_maxqfe * & + max(0.01, wombat%phy_lpar(i,j,k))**0.5 * & biofer / (biofer + wombat%phy_kfe(i,j,k)) * & wombat%phy_feupreg(i,j,k) * & - wombat%phy_fedoreg(i,j,k) * biophy) * mmol_m3_to_mol_kg + wombat%phy_fedoreg(i,j,k) ) * mmol_m3_to_mol_kg !!!~~~ Microphytoplankton ~~~!!! dia_maxqfe = biodia * wombat%diamaxqf !mmol Fe / m3 @@ -4982,8 +4973,8 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & (wombat%dia_lfer(i,j,k) + 0.5) ) wombat%dia_fedoreg(i,j,k) = max(0.0, (1.0 - biodiafe/dia_maxqfe) / & abs(1.05 - biodiafe/dia_maxqfe) ) - wombat%dia_dfeupt(i,j,k) = max(0.0, ( wombat%dia_mumax(i,j,k) * wombat%diamaxqf * biodia & - * max(0.2, wombat%dia_lpar(i,j,k) * wombat%dia_lnit(i,j,k)) & + wombat%dia_dfeupt(i,j,k) = max(0.0, ( wombat%dia_mumax(i,j,k) * dia_maxqfe & + * max(0.01, wombat%dia_lpar(i,j,k))**0.5 & * biofer / (biofer + wombat%dia_kfe(i,j,k)) & * wombat%dia_feupreg(i,j,k) & * wombat%dia_fedoreg(i,j,k))) * mmol_m3_to_mol_kg @@ -4992,7 +4983,7 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! - ! [Step 7] Phytoplankton uptake of silicic acid ! + ! [Step 8] Phytoplankton uptake of silicic acid ! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! !-----------------------------------------------------------------------! @@ -5017,15 +5008,16 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & * wombat%dia_sidoreg(i,j,k) )) * mmol_m3_to_mol_kg ! [molSi/kg/s] - !-------------------------------------------------------------------------------------! - !-------------------------------------------------------------------------------------! - !-------------------------------------------------------------------------------------! - ! [Step 8] Iron chemistry (Aumont et al., 2015 GMD & Tagliabue et al., 2023 Nature) ! - !-------------------------------------------------------------------------------------! - !-------------------------------------------------------------------------------------! - !-------------------------------------------------------------------------------------! + !------------------------------------------------------------------------! + !------------------------------------------------------------------------! + !------------------------------------------------------------------------! + ! [Step 9] Iron chemistry (scavenging, coagulation, dissolution) ! + !------------------------------------------------------------------------! + !------------------------------------------------------------------------! + !------------------------------------------------------------------------! - ! Estimate solubility of Fe3+ (free Fe) in solution using temperature, pH and salinity + ! Estimate solubility of Fe3+ (free Fe) in solution using temperature, + ! pH and salinity using the equations of Liu & Millero (2002) ztemk = max(5.0, Temp(i,j,k)) + 273.15 ! temperature in kelvin I_ztemk = 1.0 / ztemk zval = 19.924 * Salt(i,j,k) / ( 1000. - 1.005 * Salt(i,j,k)) @@ -5042,12 +5034,19 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & endif fe3sol = fesol1 * ( hp*hp*hp + fesol2*hp*hp + fesol3*hp + fesol4 + fesol5/hp ) *1e9 - ! Estimate total colloidal iron (variable, with a 10% of total dissolved Fe floor) + ! Estimate total colloidal iron following Tagliabue et al. (2023). + ! Colloidal dFe is considered to be whatever exceeds the inorganic solubility + ! ceiling, although there is always a hard lower limit of 10% of total dFe. wombat%fecol(i,j,k) = max(0.1*biofer, biofer - fe3sol) - ! Determine equilibriuim fractionation of the remaining dFe (non-colloidal fraction) into Fe' and L-Fe - fe_keq = 10.0**( 17.27 - 1565.7 * I_ztemk ) * 1e-9 ! Temperature reduces solubility - ! - Resolve for soluble Fe after accounting for colloidal fraction above + ! Determine equilibriuim fractionation of the remaining dFe (non-colloidal) + ! between Fe' and ligand-bound iron (L-Fe). Below, temperature increases the + ! solubility constant (reducing free Fe) and light decreases the solubility + ! constant (increasing free Fe). The temperature-dependency comes from Volker + ! & Tagliabue (2015), while the light dependency is informed by Barbeau et al. + ! (2001) who saw a 0.7 log10 unit decrease in K in high light. + fe_keq = 1e-9 * 10.0**( (17.27 - 1565.7 * I_ztemk ) - 0.7 * & + wombat%radbio(i,j,k) / (wombat%radbio(i,j,k) + 10.0) ) fe_sfe = max(0.0, biofer - wombat%fecol(i,j,k)) zval = 1.0 + wombat%ligand * fe_keq - fe_sfe * fe_keq wombat%feIII(i,j,k) = ( -zval + SQRT( zval*zval + 4.0*fe_keq*fe_sfe ) ) & @@ -5056,10 +5055,10 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & wombat%felig(i,j,k) = fe_sfe - wombat%feIII(i,j,k) ! Scavenging of Fe` onto biogenic particles - partic = (biodet + biobdet*(1.0+bdet_Si2C) + biocaco3) ! total particle concentration [mmol/m3] + partic = (biodet*2 + biobdet*2 + biobdetsi*2 + biocaco3*8.3) ! total particle concentration [mmol/m3] wombat%fescaven(i,j,k) = wombat%feIII(i,j,k) * (1e-7 + wombat%kscav_dfe * partic) / 86400.0 - wombat%fescaafe(i,j,k) = wombat%fescaven(i,j,k) * (biodet + biocaco3) / (partic+epsi) - wombat%fescabafe(i,j,k) = wombat%fescaven(i,j,k) * biobdet * (1.0+bdet_Si2C) / (partic+epsi) + wombat%fescaafe(i,j,k) = wombat%fescaven(i,j,k) * (biodet*2 + biocaco3*8.3) / (partic+epsi) + wombat%fescabafe(i,j,k) = wombat%fescaven(i,j,k) * (biobdet*2 * biobdetsi*2) / (partic+epsi) ! Coagulation of colloidal Fe (umol/m3) to form sinking particles (mmol/m3) ! Following Tagliabue et al. (2023), make coagulation rate dependent on DOC and Phytoplankton biomass @@ -7086,10 +7085,6 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & used = g_send_data(wombat%id_pchl_mu, wombat%pchl_mu, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_pchl_lpar > 0) & - used = g_send_data(wombat%id_pchl_lpar, wombat%pchl_lpar, model_time, & - rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_phy_kni > 0) & used = g_send_data(wombat%id_phy_kni, wombat%phy_kni, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) @@ -7134,10 +7129,6 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & used = g_send_data(wombat%id_dchl_mu, wombat%dchl_mu, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_dchl_lpar > 0) & - used = g_send_data(wombat%id_dchl_lpar, wombat%dchl_lpar, model_time, & - rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) - if (wombat%id_dia_kni > 0) & used = g_send_data(wombat%id_dia_kni, wombat%dia_kni, model_time, & rmask=grid_tmask, is_in=isc, js_in=jsc, ks_in=1, ie_in=iec, je_in=jec, ke_in=nk) @@ -8299,7 +8290,6 @@ subroutine user_allocate_arrays allocate(wombat%phy_mumax(isd:ied, jsd:jed, 1:nk)); wombat%phy_mumax(:,:,:)=0.0 allocate(wombat%phy_mu(isd:ied, jsd:jed, 1:nk)); wombat%phy_mu(:,:,:)=0.0 allocate(wombat%pchl_mu(isd:ied, jsd:jed, 1:nk)); wombat%pchl_mu(:,:,:)=0.0 - allocate(wombat%pchl_lpar(isd:ied, jsd:jed, 1:nk)); wombat%pchl_lpar(:,:,:)=0.0 allocate(wombat%phy_kni(isd:ied, jsd:jed, 1:nk)); wombat%phy_kni(:,:,:)=0.0 allocate(wombat%phy_kfe(isd:ied, jsd:jed, 1:nk)); wombat%phy_kfe(:,:,:)=0.0 allocate(wombat%phy_lpar(isd:ied, jsd:jed, 1:nk)); wombat%phy_lpar(:,:,:)=0.0 @@ -8311,7 +8301,6 @@ subroutine user_allocate_arrays allocate(wombat%dia_mumax(isd:ied, jsd:jed, 1:nk)); wombat%dia_mumax(:,:,:)=0.0 allocate(wombat%dia_mu(isd:ied, jsd:jed, 1:nk)); wombat%dia_mu(:,:,:)=0.0 allocate(wombat%dchl_mu(isd:ied, jsd:jed, 1:nk)); wombat%dchl_mu(:,:,:)=0.0 - allocate(wombat%dchl_lpar(isd:ied, jsd:jed, 1:nk)); wombat%dchl_lpar(:,:,:)=0.0 allocate(wombat%dia_kni(isd:ied, jsd:jed, 1:nk)); wombat%dia_kni(:,:,:)=0.0 allocate(wombat%dia_kfe(isd:ied, jsd:jed, 1:nk)); wombat%dia_kfe(:,:,:)=0.0 allocate(wombat%dia_ksi(isd:ied, jsd:jed, 1:nk)); wombat%dia_ksi(:,:,:)=0.0 @@ -8609,7 +8598,6 @@ subroutine user_deallocate_arrays wombat%phy_mumax, & wombat%phy_mu, & wombat%pchl_mu, & - wombat%pchl_lpar, & wombat%phy_kni, & wombat%phy_kfe, & wombat%phy_lpar, & @@ -8621,7 +8609,6 @@ subroutine user_deallocate_arrays wombat%dia_mumax, & wombat%dia_mu, & wombat%dchl_mu, & - wombat%dchl_lpar, & wombat%dia_kni, & wombat%dia_kfe, & wombat%dia_ksi, & From 593851798b71ec58132854dc292428ca537f3390 Mon Sep 17 00:00:00 2001 From: "Pearse J. Buchanan" Date: Thu, 26 Feb 2026 14:22:10 +1100 Subject: [PATCH 3/3] Declared variable "theta_opt" to WOMBATmid.F90 --- generic_tracers/generic_WOMBATmid.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/generic_tracers/generic_WOMBATmid.F90 b/generic_tracers/generic_WOMBATmid.F90 index e865b9bd..aba66bfc 100644 --- a/generic_tracers/generic_WOMBATmid.F90 +++ b/generic_tracers/generic_WOMBATmid.F90 @@ -4039,6 +4039,7 @@ subroutine generic_WOMBATmid_update_from_source(tracer_list, Temp, Salt, & real :: biof, zno3, zfermin, shear real :: phy_Fe2C, dia_Fe2C, zoo_Fe2C, mes_Fe2C, det_Fe2C, bdet_Fe2C real :: dom_N2C, dia_Si2C, bdet_Si2C + real :: theta_opt real :: phy_minqfe, phy_maxqfe real :: dia_minqfe, dia_maxqfe, dia_maxqsi real :: zoo_slmor, mes_slmor