From 63f1bc7ff13cfae03d66c440c0746c729cd5b7ab Mon Sep 17 00:00:00 2001 From: Oliver Jahn Date: Mon, 28 Jul 2025 16:04:38 -0400 Subject: [PATCH] Add macromolecular growth parameterization --- pkg/darwin/DARWIN_DIAGS.h | 40 +++ pkg/darwin/DARWIN_OPTIONS.h | 13 +- pkg/darwin/DARWIN_PARAMS.h | 9 +- pkg/darwin/DARWIN_TRAITPARAMS.h | 68 ++++ pkg/darwin/DARWIN_TRAITS.h | 131 ++++++- pkg/darwin/darwin_check.F | 183 +++++++++- pkg/darwin/darwin_diagnostics_init.F | 197 +++++++++- pkg/darwin/darwin_forcing.F | 92 ++++- pkg/darwin/darwin_generate_allometric.F | 48 ++- pkg/darwin/darwin_init_chl.F | 2 +- pkg/darwin/darwin_plankton.F | 456 ++++++++++++++++++++++-- pkg/darwin/darwin_read_params.F | 6 +- pkg/darwin/darwin_read_traitparams.F | 68 ++++ pkg/darwin/darwin_read_traits.F | 74 ++++ pkg/darwin/darwin_tempfunc.F | 8 +- 15 files changed, 1344 insertions(+), 51 deletions(-) diff --git a/pkg/darwin/DARWIN_DIAGS.h b/pkg/darwin/DARWIN_DIAGS.h index 520da4337..157e3969d 100644 --- a/pkg/darwin/DARWIN_DIAGS.h +++ b/pkg/darwin/DARWIN_DIAGS.h @@ -46,6 +46,15 @@ C Contains indices into diagnostics array integer ifnut integer ifIph integer ifTph +# ifdef DARWIN_MACROMOLECULAR_GROWTH + integer iPChl, iVN, iVP + integer iCChl, iNChl, iNPho, iNSyn, iNPrn, iNRNA + integer iNDNA, iNSTO, iNEXC + integer iPRNA, iPDNA, iPTHY, iPCON, iPSTO, iPEXC + integer iFPHO, iFSTO, iFEXC, iY_RQ + integer iMODE, iFe_C, iexQc + integer ilimC, ilimL +# endif #endif #ifdef DARWIN_ALLOW_CSTORE integer iEX @@ -127,7 +136,38 @@ C Contains indices into diagnostics array PARAMETER(ifnut=ilimS+nplank) PARAMETER(ifIph=ifnut+nplank) PARAMETER(ifTph=ifIph+nplank) +# ifdef DARWIN_MACROMOLECULAR_GROWTH + PARAMETER(iPChl=ifTph+nplank) + PARAMETER(iVN= iPChl+nPhoto) + PARAMETER(iVP= iVN +nPhoto) + PARAMETER(iMODE=iVP +nPhoto) + PARAMETER(iFe_C=iMODE+nPhoto) + PARAMETER(iexQc=iFe_C+nPhoto) + PARAMETER(iCChl=iexQc+nPhoto) + PARAMETER(iNChl=iCChl+nPhoto) + PARAMETER(iNPho=iNChl+nPhoto) + PARAMETER(iNSyn=iNPho+nPhoto) + PARAMETER(iNPrn=iNSyn+nPhoto) + PARAMETER(iNRNA=iNPrn+nPhoto) + PARAMETER(iNDNA=iNRNA+nPhoto) + PARAMETER(iNSTO=iNDNA+nPhoto) + PARAMETER(iNEXC=iNSTO+nPhoto) + PARAMETER(iPRNA=iNEXC+nPhoto) + PARAMETER(iPDNA=iPRNA+nPhoto) + PARAMETER(iPTHY=iPDNA+nPhoto) + PARAMETER(iPCON=iPTHY+nPhoto) + PARAMETER(iPSTO=iPCON+nPhoto) + PARAMETER(iPEXC=iPSTO+nPhoto) + PARAMETER(iFPHO=iPEXC+nPhoto) + PARAMETER(iFSTO=iFPHO+nPhoto) + PARAMETER(iFEXC=iFSTO+nPhoto) + PARAMETER(iY_RQ=iFEXC+nPhoto) + PARAMETER(ilimC=iY_RQ+nPhoto) + PARAMETER(ilimL=ilimC+nPhoto) + PARAMETER(darwin_nDiag=ilimL+nPhoto-1) +# else PARAMETER(darwin_nDiag=ifTph+nplank-1) +# endif #else PARAMETER(iPCplank=iPPplank) PARAMETER(iGRplank=iPPplank) diff --git a/pkg/darwin/DARWIN_OPTIONS.h b/pkg/darwin/DARWIN_OPTIONS.h index 4dcb0fcb6..e509f7e70 100644 --- a/pkg/darwin/DARWIN_OPTIONS.h +++ b/pkg/darwin/DARWIN_OPTIONS.h @@ -51,11 +51,8 @@ C but will use solvesaphe dissociation coefficient options. C this needs to be defined for coupling to atmospheric model: #undef DARWIN_USE_PLOAD -C enable RADI sediment metamodel v1 -#undef DARWIN_ALLOW_RADIv1 - -C enable RADI sediment metamodel v2 -#undef DARWIN_ALLOW_RADIv2 +C enable macromolecular growth code; requires N, P and Fe quotas +#undef DARWIN_MACROMOLECULAR_GROWTH C optional bits @@ -84,6 +81,12 @@ C CDOM is in carbon units and follows POC C include code for reading nutrient runoff from files #undef DARWIN_NUTRIENT_RUNOFF +C enable RADI sediment metamodel v1 +#undef DARWIN_ALLOW_RADIv1 + +C enable RADI sediment metamodel v2 +#undef DARWIN_ALLOW_RADIv2 + C include diel vertical migration code #undef DARWIN_ALLOW_DVM diff --git a/pkg/darwin/DARWIN_PARAMS.h b/pkg/darwin/DARWIN_PARAMS.h index e48e41093..186c858f5 100644 --- a/pkg/darwin/DARWIN_PARAMS.h +++ b/pkg/darwin/DARWIN_PARAMS.h @@ -335,6 +335,7 @@ C tempnorm :: [] set temperature function (was 1.0) C TempAeArr :: [K] slope for pseudo-Arrhenius (TEMP_VERSION 2) C TemprefArr :: [K] reference temp for pseudo-Arrhenius (TEMP_VERSION 2) C TempCoeffArr :: [] pre-factor for pseudo-Arrhenius (TEMP_VERSION 2) +C TempAeArrMacromol :: [K] slope for pseudo-Arrhenius for macromolecular (TEMP_VERSION 2) C reminTempAe :: [1/K] temperature coefficient for remineralization (TEMP_VERSION 4) C mortTempAe :: [1/K] temperature coefficient for linear mortality (TEMP_VERSION 4) C mort2TempAe :: [1/K] temperature coefficient for quadr. mortality (TEMP_VERSION 4) @@ -377,6 +378,7 @@ C KPON :: [1/s] PON remineralization rate C KPOP :: [1/s] POP remineralization rate C KPOFe :: [1/s] POFe remineralization rate C KPOSi :: [1/s] POSi remineralization rate +C ksatO2remin :: [mmol O2/m3] half-saturation conc. of O2 for remineralization C C wC_sink :: [m/s] sinking velocity for POC C wN_sink :: [m/s] sinking velocity for PON @@ -432,7 +434,6 @@ C chl2nmax :: [mg Chl / mmol N] max Chl:N ratio for Chl synthesis C synthcost :: [mmol C / mmol N] cost of biosynthesis C inhib_graz :: [(mmol C m-3)-1] inverse decay scale for grazing inhibition C inhib_graz_exp :: [] exponent for grazing inhibition (0 to turn off inhibition) -C hillnumUptake :: [] exponent for limiting quota uptake in nutrient uptake C hillnumGraz :: [] exponent for limiting quota uptake in grazing C hollexp :: [] grazing exponential 1= "Holling 2", 2= "Holling 3" C phygrazmin :: [mmol C m-3] minimum total prey conc for grazing to occur @@ -464,6 +465,7 @@ C depthdenit :: [m] not implemented (depth for denitrific & TempAeArr, & TemprefArr, & TempCoeffArr, + & TempAeArrMacromol, & reminTempAe, & mortTempAe, & mort2TempAe, @@ -508,6 +510,7 @@ C depthdenit :: [m] not implemented (depth for denitrific & KPOP, & KPOFe, & KPOSi, + & ksatO2remin, & wC_sink, & wN_sink, & wP_sink, @@ -557,7 +560,6 @@ C depthdenit :: [m] not implemented (depth for denitrific & synthcost, & inhib_graz, & inhib_graz_exp, - & hillnumUptake, & hillnumGraz, & hollexp, & phygrazmin, @@ -584,6 +586,7 @@ C & yono2, _RL TempAeArr _RL TemprefArr _RL TempCoeffArr + _RL TempAeArrMacromol _RL reminTempAe _RL mortTempAe _RL mort2TempAe @@ -628,6 +631,7 @@ C & yono2, _RL KPOP _RL KPOFe _RL KPOSi + _RL ksatO2remin _RL wC_sink _RL wN_sink _RL wP_sink @@ -677,7 +681,6 @@ C & yono2, _RL synthcost _RL inhib_graz _RL inhib_graz_exp - _RL hillnumUptake _RL hillnumGraz _RL hollexp _RL phygrazmin diff --git a/pkg/darwin/DARWIN_TRAITPARAMS.h b/pkg/darwin/DARWIN_TRAITPARAMS.h index a9bcf38d5..143a2ff7e 100644 --- a/pkg/darwin/DARWIN_TRAITPARAMS.h +++ b/pkg/darwin/DARWIN_TRAITPARAMS.h @@ -352,6 +352,36 @@ C & a_grazTempExp2, & a_grazTempOptimum, & a_grazDecayPower, +#ifdef DARWIN_MACROMOLECULAR_GROWTH + & a_Y_CP_Plip, + & a_Y_CN_protein, + & a_Y_NC_chl, + & a_Y_CN_cyano, + & a_Y_PN_nucacid, + & a_Y_CN_DNA, + & a_Y_CN_RNA, + & a_Y_THY_P, + & a_Y_FeN_photo, + & a_ECo2Prod, + & a_maintConsum, + & a_VI_max, + & b_VI_max, + & a_A_I, + & a_QC_other, + & a_QC_pro_other, + & a_QP_other, + & a_QP_RNA_min, + & a_QC_DNA, + & a_QN_sto_max, + & b_QN_sto_max, + & a_Qp_max, + & b_Qp_max, + & a_Qfe_max, + & b_Qfe_max, + & a_A_pho, + & a_A_bio, + & a_AP_RNA, +#endif #ifdef DARWIN_ALLOW_GEIDER & a_mQyield, & a_chl2cmax, @@ -365,6 +395,10 @@ C & a_acclimtimescl_denom, & a_ksatPON, & a_ksatDON, + & a_hillnumDIN, + & a_hillnumPO4, + & a_hillnumFeT, + & a_hillnumSiO2, & a_grazemax, & a_grazemax_denom, & b_grazemax, @@ -497,6 +531,36 @@ C _RL a_grazTempExp2(nGroup) _RL a_grazTempOptimum(nGroup) _RL a_grazDecayPower(nGroup) +#ifdef DARWIN_MACROMOLECULAR_GROWTH + _RL a_Y_CP_Plip(nGroup) + _RL a_Y_CN_protein(nGroup) + _RL a_Y_NC_chl(nGroup) + _RL a_Y_CN_cyano(nGroup) + _RL a_Y_PN_nucacid(nGroup) + _RL a_Y_CN_DNA(nGroup) + _RL a_Y_CN_RNA(nGroup) + _RL a_Y_THY_P(nGroup) + _RL a_Y_FeN_photo(nGroup) + _RL a_ECo2Prod(nGroup) + _RL a_maintConsum(nGroup) + _RL a_VI_max(nGroup) + _RL b_VI_max(nGroup) + _RL a_A_I(nGroup) + _RL a_QC_other(nGroup) + _RL a_QC_pro_other(nGroup) + _RL a_QP_other(nGroup) + _RL a_QP_RNA_min(nGroup) + _RL a_QC_DNA(nGroup) + _RL a_QN_sto_max(nGroup) + _RL b_QN_sto_max(nGroup) + _RL a_Qp_max(nGroup) + _RL b_Qp_max(nGroup) + _RL a_Qfe_max(nGroup) + _RL b_Qfe_max(nGroup) + _RL a_A_pho(nGroup) + _RL a_A_bio(nGroup) + _RL a_AP_RNA(nGroup) +#endif #ifdef DARWIN_ALLOW_GEIDER _RL a_mQyield(nGroup) _RL a_chl2cmax(nGroup) @@ -510,6 +574,10 @@ C _RL a_acclimtimescl_denom(nGroup) _RL a_ksatPON(nGroup) _RL a_ksatDON(nGroup) + _RL a_hillnumDIN(nGroup) + _RL a_hillnumPO4(nGroup) + _RL a_hillnumFeT(nGroup) + _RL a_hillnumSiO2(nGroup) _RL a_grazemax(nGroup) _RL a_grazemax_denom(nGroup) _RL b_grazemax(nGroup) diff --git a/pkg/darwin/DARWIN_TRAITS.h b/pkg/darwin/DARWIN_TRAITS.h index fad5e4286..1119f748d 100644 --- a/pkg/darwin/DARWIN_TRAITS.h +++ b/pkg/darwin/DARWIN_TRAITS.h @@ -171,8 +171,46 @@ C ksatDVM :: [mmol C m^-3] half saturation for DVM mortality C ksatPARDVM :: [uEin m^-2 s^-1] half sat for light limitation for DVM C fracPARmort :: [] fraction of mortality from light-dependent mortality C ExportFracDVM :: [] fraction of light-dep mortality from DVM to POM - - +C +C- MACROMOLECULAR_GROWTH parameters +C Y_CP_Plip :: [molC molP^-1] C/P molar ratio of thylacoid membrane +C Y_CN_protein :: [molC molN^-1] C/N molar ratio in protein +C Y_NC_chl :: [molN molC^-1] N/C molar ratio in chlorophyll +C Y_CN_cyano :: [molC molN^-1] C/N molar ratio of cyanophycin +C Y_PN_nucacid :: [molP molN^-1] P/N molar ratio of RNA +C Y_CN_DNA :: [molC molN^-1] C/N molar ratio of DNA +C Y_CN_RNA :: [molC molN^-1] C/N molar ratio of RNA +C Y_THY_P :: [(molP)/(molC in chl)^-1] the stoichiometric ratio for cell phosphorus in thylakoid membrane to chlorophyll +C Y_FeN_photo :: [molFe mol N^-1] Fe/N ratio in photosystem iron +C ECo2Prod :: [dimensionless] CO2 production ratio +C maintConsum :: [s^-1] maintenance carbohydrate consumption +C VI_max :: [molC (molC in Chl)^-1 s^-1] carbon fixing rate +C A_I :: [umol^-1 m2 s] coefficient characterizing the absorption cross section +C QC_other :: [molC molC^-1] essential carbon (lipid membrane, etc.) +C QC_pro_other :: [molC molC^-1] +C QP_other :: [molP molC^-1] constant part of phosphorus +C QP_RNA_min :: [molP molC^-1] +C QC_DNA :: [molC molC^-1] constant part of DNA in carbon +C QN_pro_other :: [molN molC^-1] +C QN_RNA_min :: [molN molC^-1] constant part of RNA in nitrogen +C QC_RNA_min :: [molN molC^-1] constant part of RNA in carbon +C QN_DNA :: [molN molC^-1] DNA in nitrogen +C QP_DNA :: [molP molC^-1] DNA in phosphorous +C QN_sto_max :: [molN molC^-1] maximum nitrogen storage +C Qp_max :: [molP molC^-1] maximum phosphorus quota +C Qfe_max :: [molFe molC^-1] maximum iron quota +C A_pho :: [(molC)/(molC in chl)^-1] A constant of proportionalty +C A_bio :: [molC molC^-1 s] constant for variable part of biosynthesis protein +C AP_RNA :: [molP molC^-1 s] constant for Variable part of RNA +C AN_RNA :: [molN molN^-1 s] constant for Variable part of RNA +C A_thy :: [molC (molC in chl)^-1] +C Sf :: [unitless] enhancement of photosynthesis due to size +C QC_const :: [molC molC^-1] constant portion of the cell +C VI_min :: [molC (molC in Chl)^-1 s^-1] minimum photosynthesis rate +C QC_chlMax :: [molC molC^-1] maximum chlorophyll concentration at minimum light +C QnNoChl :: [molN molC^-1] minimum QN at zero growth rate +C QpNoChl :: [molP molC^-1] minimum QP at zero growth rate +C QfeNoChl :: [molFe molC^-1] minimum QFe at zero growth rate COMMON /DARWIN_TRAITS_r/ & Xmin, & amminhib, @@ -229,6 +267,10 @@ C ExportFracDVM :: [] fraction of light-dep mortality fro & ksatPO4, & ksatSiO2, & ksatFeT, + & hillnumDIN, + & hillnumPO4, + & hillnumFeT, + & hillnumSiO2, & kexcc, & kexcn, & kexcp, @@ -264,6 +306,46 @@ C ExportFracDVM :: [] fraction of light-dep mortality fro & ksatPARDVM, & fracPARmort, & ExportFracDVM +#ifdef DARWIN_MACROMOLECULAR_GROWTH + & ,Y_CN_protein, + & Y_CP_Plip, + & Y_NC_chl, + & Y_CN_cyano, + & Y_PN_nucacid, + & Y_CN_DNA, + & Y_CN_RNA, + & Y_THY_P, + & Y_FeN_photo, + & ECo2Prod, + & maintConsum, + & VI_max, + & A_I, + & QC_other, + & QC_pro_other, + & QP_other, + & QP_RNA_min, + & QC_DNA, + & QN_pro_other, + & QN_RNA_min, + & QC_RNA_min, + & QN_DNA, + & QP_DNA, + & QN_sto_max, + & Qp_max, + & Qfe_max, + & A_pho, + & A_bio, + & AP_RNA, + & AN_RNA, + & A_thy, + & Sf, + & VI_min, + & QC_chlMax, + & QnNoChl, + & QpNoChl, + & QfeNoChl, + & QC_const +#endif _RL Xmin(nplank) _RL amminhib(nplank) _RL acclimtimescl(nplank) @@ -319,6 +401,10 @@ C ExportFracDVM :: [] fraction of light-dep mortality fro _RL ksatPO4(nplank) _RL ksatSiO2(nplank) _RL ksatFeT(nplank) + _RL hillnumDIN(nplank) + _RL hillnumPO4(nplank) + _RL hillnumFeT(nplank) + _RL hillnumSiO2(nplank) _RL kexcc(nplank) _RL kexcn(nplank) _RL kexcp(nplank) @@ -354,7 +440,46 @@ C ExportFracDVM :: [] fraction of light-dep mortality fro _RL ksatPARDVM(nplank) _RL fracPARmort(nplank) _RL ExportFracDVM(nplank) - +#ifdef DARWIN_MACROMOLECULAR_GROWTH + _RL Y_CN_protein(nplank) + _RL Y_CP_Plip(nplank) + _RL Y_NC_chl(nplank) + _RL Y_CN_cyano(nplank) + _RL Y_PN_nucacid(nplank) + _RL Y_CN_DNA(nplank) + _RL Y_CN_RNA(nplank) + _RL Y_THY_P(nplank) + _RL Y_FeN_photo(nplank) + _RL ECo2Prod(nplank) + _RL maintConsum(nplank) + _RL VI_max(nplank) + _RL A_I(nplank) + _RL QC_other(nplank) + _RL QC_pro_other(nplank) + _RL QP_other(nplank) + _RL QP_RNA_min(nplank) + _RL QC_DNA(nplank) + _RL QN_pro_other(nplank) + _RL QN_RNA_min(nplank) + _RL QC_RNA_min(nplank) + _RL QN_DNA(nplank) + _RL QP_DNA(nplank) + _RL QN_sto_max(nplank) + _RL Qp_max(nplank) + _RL Qfe_max(nplank) + _RL A_pho(nplank) + _RL A_bio(nplank) + _RL AP_RNA(nplank) + _RL AN_RNA(nplank) + _RL A_thy(nplank) + _RL Sf(nplank) + _RL VI_min(nplank) + _RL QC_chlMax(nplank) + _RL QnNoChl(nplank) + _RL QpNoChl(nplank) + _RL QfeNoChl(nplank) + _RL QC_const(nplank) +#endif C-- COMMON /DARWIN_DEPENDENT_TRAITS_i/ Dependent and constant (not read-in) parameters C group :: which group this type belongs to diff --git a/pkg/darwin/darwin_check.F b/pkg/darwin/darwin_check.F index c95869a78..b377db32c 100644 --- a/pkg/darwin/darwin_check.F +++ b/pkg/darwin/darwin_check.F @@ -66,7 +66,7 @@ SUBROUTINE DARWIN_CHECK( myThid ) C msgBuf - Informational/error meesage buffer CHARACTER*(MAX_LEN_MBUF) msgBuf CHARACTER*80 gname - INTEGER j,jz,iPtr,oUnit,g,l + INTEGER j,iPtr,oUnit,g,l,errCount _RL dm CCOG[[[cog CCOGcog.out('\n'.join(''' @@ -426,6 +426,42 @@ SUBROUTINE DARWIN_CHECK( myThid ) ENDIF #endif + errCount = 0 +#ifdef DARWIN_MACROMOLECULAR_GROWTH +# ifndef DARWIN_ALLOW_NQUOTA + WRITE(msgBuf,'(2A)') 'DARWIN_CHECK: ERROR: ', + & 'DARWIN_MACROMOLECULAR_GROWTH requires DARWIN_ALLOW_NQUOTA' + CALL PRINT_ERROR( msgBuf , 1) + errCount = errCount + 1 +# endif +# ifndef DARWIN_ALLOW_PQUOTA + WRITE(msgBuf,'(2A)') 'DARWIN_CHECK: ERROR: ', + & 'DARWIN_MACROMOLECULAR_GROWTH requires DARWIN_ALLOW_PQUOTA' + CALL PRINT_ERROR( msgBuf , 1) + errCount = errCount + 1 +# endif +# ifndef DARWIN_ALLOW_FEQUOTA + WRITE(msgBuf,'(2A)') 'DARWIN_CHECK: ERROR: ', + & 'DARWIN_MACROMOLECULAR_GROWTH requires DARWIN_ALLOW_FEQUOTA' + CALL PRINT_ERROR( msgBuf , 1) + errCount = errCount + 1 +# endif +# ifdef DARWIN_ALLOW_SIQUOTA + WRITE(msgBuf,'(3A)') 'DARWIN_CHECK: ERROR: ', + & 'DARWIN_MACROMOLECULAR_GROWTH does not support ', + & 'DARWIN_ALLOW_SIQUOTA' + CALL PRINT_ERROR( msgBuf , 1) + errCount = errCount + 1 +# endif + IF (errCount .GT. 0) THEN + WRITE(msgBuf,'(A,I3,A)') + & 'DARWIN_CHECK: detected', errCount,' fatal error(s)' + CALL PRINT_ERROR( msgBuf, myThid ) + CALL ALL_PROC_DIE( 0 ) + STOP 'ABNORMAL END: S/R DARWIN_CHECK' + ENDIF +#endif + C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- Print settings of some CPP flags. @@ -1832,6 +1868,9 @@ SUBROUTINE DARWIN_CHECK( myThid ) CALL WRITE_0D_RL(TempCoeffArr,INDEX_NONE, &'TempCoeffArr =', &' /* pre-factor for pseudo-Arrhenius (TEMP_VERSION 2) */') + CALL WRITE_0D_RL(TempAeArrMacromol,INDEX_NONE, + &'TempAeArrMacromol =', + &' /* temp effect on protein biosyn (MACROMOL GROWTH) (K) */') CALL WRITE_0D_RL(reminTempAe,INDEX_NONE, &'reminTempAe =', &' /* temperature coefficient for remineralization (TEMP_VERSION 4) @@ -1965,6 +2004,9 @@ SUBROUTINE DARWIN_CHECK( myThid ) CALL WRITE_0D_RL(KPOSi,INDEX_NONE, &'KPOSi =', &' /* POSi remineralization rate (1/s) */') + CALL WRITE_0D_RL(ksatO2remin,INDEX_NONE, + &'ksatO2remin =', + &' /* O2 half saturation for remineralization (mmol O2 m^-3) */') CALL WRITE_0D_RL(wC_sink,INDEX_NONE, &'wC_sink =', &' /* sinking velocity for POC (m/s) */') @@ -2136,9 +2178,6 @@ SUBROUTINE DARWIN_CHECK( myThid ) &'inhib_graz_exp =', &' /* exponent for grazing inhibition (0 to turn off inhibition) */ &') - CALL WRITE_0D_RL(hillnumUptake,INDEX_NONE, - &'hillnumUptake =', - &' /* exponent for limiting quota uptake in nutrient uptake */') CALL WRITE_0D_RL(hillnumGraz,INDEX_NONE, &'hillnumGraz =', &' /* exponent for limiting quota uptake in grazing */') @@ -2479,6 +2518,18 @@ SUBROUTINE DARWIN_CHECK( myThid ) &'ksatFeT =', &' /* half-saturation conc. for iron uptake/limitation (mmol Fe m^- &3) */') + CALL WRITE_1D_RL(hillnumDIN,nphoto,INDEX_NONE, + &'hillnumDIN =', + &' /* exponent for limiting quota uptake in DIN uptake */') + CALL WRITE_1D_RL(hillnumPO4,nphoto,INDEX_NONE, + &'hillnumPO4 =', + &' /* exponent for limiting quota uptake in PO4 uptake */') + CALL WRITE_1D_RL(hillnumFeT,nphoto,INDEX_NONE, + &'hillnumFeT =', + &' /* exponent for limiting quota uptake in FeT uptake */') + CALL WRITE_1D_RL(hillnumSiO2,nphoto,INDEX_NONE, + &'hillnumSiO2 =', + &' /* exponent for limiting quota uptake in SiO2 uptake */') CALL WRITE_1D_RL(kexcc,nplank,INDEX_NONE, &'kexcc =', &' /* exudation rate for carbon (s^-1) */') @@ -2604,6 +2655,130 @@ SUBROUTINE DARWIN_CHECK( myThid ) &'normI =', &' /* normalization factor for non-Geider light curve */') #endif +#ifdef DARWIN_MACROMOLECULAR_GROWTH + CALL WRITE_1D_RL(Y_CP_Plip,nplank,INDEX_NONE, + &'Y_CP_Plip = ', + &' /* C/P molar ratio of PG: Phosphatidyl glycerol (molC molP^-1) * + &/') + CALL WRITE_1D_RL(Y_CN_protein,nplank,INDEX_NONE, + &'Y_CN_protein = ', + &' /* C/N molar ratio in protein (molC molN^-1) */') + CALL WRITE_1D_RL(Y_NC_chl,nplank,INDEX_NONE, + &'Y_NC_chl = ', + &' /* N/C molar ratio in chlorophyll (molN molC^-1) */') + CALL WRITE_1D_RL(Y_CN_cyano,nplank,INDEX_NONE, + &'Y_CN_cyano = ', + &' /* C/N molar ratio of cyanophycin (molC molN^-1) */') + CALL WRITE_1D_RL(Y_PN_nucacid,nplank,INDEX_NONE, + &'Y_PN_nucacid = ', + &' /* P/N molar ratio of RNA (molP molN^-1) */') + CALL WRITE_1D_RL(Y_CN_DNA,nplank,INDEX_NONE, + &'Y_CN_DNA = ', + &' /* C/N molar ratio of DNA (molC molN^-1) */') + CALL WRITE_1D_RL(Y_CN_RNA,nplank,INDEX_NONE, + &'Y_CN_RNA = ', + &' /* C/N molar ratio of RNA (molC molN^-1) */') + CALL WRITE_1D_RL(Y_THY_P,nplank,INDEX_NONE, + &'Y_THY_P = ', + &' /* the stoichiometric ratio for cell phosphorus in thylakoid mem + &brane to chlorophyll ((molP)/(molC in chl)^-1) */') + CALL WRITE_1D_RL(Y_FeN_photo,nplank,INDEX_NONE, + &'Y_FeN_photo = ', + &' /* Fe/N ratio in photosystem iron (molFe mol N^-1) */') + CALL WRITE_1D_RL(ECo2Prod,nplank,INDEX_NONE, + &'ECo2Prod = ', + &' /* CO2 production ratio (dimensionless) */') + CALL WRITE_1D_RL(maintConsum,nplank,INDEX_NONE, + &'maintConsum = ', + &' /* maintenance carbohydrate consumption (s^-1) */') + CALL WRITE_1D_RL(VI_max,nplank,INDEX_NONE, + &'VI_max = ', + &' /* carbon fixing rate (molC (molC in Chl)^-1 s^-1) */') + CALL WRITE_1D_RL(A_I,nplank,INDEX_NONE, + &'A_I = ', + &' /* coefficient characterizing the absorption cross section (umol + &^-1 m2 s) */') + CALL WRITE_1D_RL(QC_other,nplank,INDEX_NONE, + &'QC_other = ', + &' /* essential carbon (lipid membrane, etc.) (molC molC^-1) */') + CALL WRITE_1D_RL(QC_pro_other,nplank,INDEX_NONE, + &'QC_pro_other = ', + &' /* (molC molC^-1) */') + CALL WRITE_1D_RL(QP_other,nplank,INDEX_NONE, + &'QP_other = ', + &' /* constant part of phosphorus (molP molC^-1) */') + CALL WRITE_1D_RL(QP_RNA_min,nplank,INDEX_NONE, + &'QP_RNA_min = ', + &' /* (molP molC^-1) */') + CALL WRITE_1D_RL(QC_DNA,nplank,INDEX_NONE, + &'QC_DNA = ', + &' /* constant part of DNA in carbon (molC molC^-1) */') + CALL WRITE_1D_RL(QN_pro_other,nplank,INDEX_NONE, + &'QN_pro_other = ', + &' /* (molN molC^-1) */') + CALL WRITE_1D_RL(QN_RNA_min,nplank,INDEX_NONE, + &'QN_RNA_min = ', + &' /* constant part of RNA in nitrogen (molN molC^-1) */') + CALL WRITE_1D_RL(QC_RNA_min,nplank,INDEX_NONE, + &'QC_RNA_min = ', + &' /* constant part of RNA in carbon (molN molC^-1) */') + CALL WRITE_1D_RL(QN_DNA,nplank,INDEX_NONE, + &'QN_DNA = ', + &' /* DNA in nitrogen (molN molC^-1) */') + CALL WRITE_1D_RL(QP_DNA,nplank,INDEX_NONE, + &'QP_DNA = ', + &' /* DNA in phosphorous (molP molC^-1) */') + CALL WRITE_1D_RL(QN_sto_max,nplank,INDEX_NONE, + &'QN_sto_max = ', + &' /* maximum nitrogen storage (molN molC^-1) */') + CALL WRITE_1D_RL(Qp_max,nplank,INDEX_NONE, + &'Qp_max = ', + &' /* maximum phosphorus quota (molP molC^-1) */') + CALL WRITE_1D_RL(Qfe_max,nplank,INDEX_NONE, + &'Qfe_max = ', + &' /* maximum iron quota (molFe molC^-1) */') + CALL WRITE_1D_RL(A_pho,nplank,INDEX_NONE, + &'A_pho = ', + &' /* A constant of proportionalty ((molC)/(molC in chl)^-1) */') + CALL WRITE_1D_RL(A_bio,nplank,INDEX_NONE, + &'A_bio = ', + &' /* constant for variable part of biosynthesis protein (molC molC + &^-1 s) */') + CALL WRITE_1D_RL(AP_RNA,nplank,INDEX_NONE, + &'AP_RNA = ', + &' /* constant for Variable part of RNA (molP molC^-1 s) */') + CALL WRITE_1D_RL(AN_RNA,nplank,INDEX_NONE, + &'AN_RNA = ', + &' /* constant for Variable part of RNA (molN molN^-1 s) */') + CALL WRITE_1D_RL(A_thy,nplank,INDEX_NONE, + &'A_thy = ', + &' /* (molC (molC in chl)^-1) */') + CALL WRITE_1D_RL(Sf,nplank,INDEX_NONE, + &'Sf = ', + &' /* enhancement of photosynthesis due to size */') + CALL WRITE_1D_RL(VI_min,nplank,INDEX_NONE, + &'VI_min = ', + &' /* minimum photosynthesis rate (molC (molC in Chl)^-1 s^-1) */') + CALL WRITE_1D_RL(QC_chlMax,nplank,INDEX_NONE, + &'QC_chlMax = ', + &' /* maximum chlorophyll concentration at minimum light (molC molC + &^-1) */') + CALL WRITE_1D_RL(QnNoChl,nplank,INDEX_NONE, + &'QnNoChl = ', + &' /* minimum QN at zero growth rate (molN molC^-1) */') + CALL WRITE_1D_RL(QpNoChl,nplank,INDEX_NONE, + &'QpNoChl = ', + &' /* minimum QP at zero growth rate (molP molC^-1) */') + CALL WRITE_1D_RL(QfeNoChl,nplank,INDEX_NONE, + &'QfeNoChl = ', + &' /* minimum QFe at zero growth rate (molFe molC^-1) */') + CALL WRITE_1D_RL(QC_const,nplank,INDEX_NONE, + &'QC_const =', + &' /* constant portion of the cell (molC molC^-1) */') +#endif + +C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| +C-- Print dependent traits CALL WRITE_1D_RL(alpha_mean,nplank,INDEX_NONE, &'alpha_mean =', &' /* mean initial slope of light curve (over wavebands) (mmol C s- diff --git a/pkg/darwin/darwin_diagnostics_init.F b/pkg/darwin/darwin_diagnostics_init.F index 90cb7dbd2..75925d8eb 100644 --- a/pkg/darwin/darwin_diagnostics_init.F +++ b/pkg/darwin/darwin_diagnostics_init.F @@ -517,7 +517,202 @@ SUBROUTINE DARWIN_DIAGNOSTICS_INIT( myThid ) CALL DIAGNOSTICS_ADDTOLIST( diagNum, I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) ENDDO -#endif + +# ifdef DARWIN_MACROMOLECULAR_GROWTH + DO j = 1,nPhoto + WRITE(diagName,'(A,I4.4)')'PChl', j + WRITE(diagTitle,'(A,I4)')'Chl-spec carbohydrat fix rate plank ',j + diagUnits = 'mol C/mol Chl/s ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'VN', j + WRITE(diagTitle,'(A,I4)') + & 'Carbon-spec nitrogen uptake rate plank ',j + diagUnits = 'mmol N/mmol C/s ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'VP', j + WRITE(diagTitle,'(A,I4)') + & 'Carbon-spec phosphorus uptake rate plank ',j + diagUnits = 'mmol N/mmol C/s ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'MODE', j + WRITE(diagTitle,'(A,I4)')'Growth limitation enum plankton ',j + diagUnits = 'dimensionless ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'Fe_C', j + WRITE(diagTitle,'(A,I4)')'Fe/C plankton ',j + diagUnits = 'mol Fe/mol C ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'exQc', j + WRITE(diagTitle,'(A,I4)')'exQc plankton ',j + diagUnits = 's-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'CChl', j + WRITE(diagTitle,'(A,I4)')'C quota in Chlorophyll plankton ',j + diagUnits = 'molC molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'NChl', j + WRITE(diagTitle,'(A,I4)')'N quota in Chlorophyll plankton ',j + diagUnits = 'molN molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'NPho', j + WRITE(diagTitle,'(A,I4)')'N quota related to photosynth plank ',j + diagUnits = 'molN molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'NSyn', j + WRITE(diagTitle,'(A,I4)')'N quota related to biosynth plank ',j + diagUnits = 'molN molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'NPrn', j + WRITE(diagTitle,'(A,I4)')'N quota in proteins plankton ',j + diagUnits = 'molN molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'NRNA', j + WRITE(diagTitle,'(A,I4)')'N quota in RNA plankton ',j + diagUnits = 'molN molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'NDNA', j + WRITE(diagTitle,'(A,I4)')'N quota in DNA plankton ',j + diagUnits = 'molN molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'NSTO', j + WRITE(diagTitle,'(A,I4)')'N quota in QN_store plankton ',j + diagUnits = 'molN molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'NEXC', j + WRITE(diagTitle,'(A,I4)')'N quota in QN_excess plankton ',j + diagUnits = 'molN molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'PRNA', j + WRITE(diagTitle,'(A,I4)')'P quota in RNA plankton ',j + diagUnits = 'molP molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'PDNA', j + WRITE(diagTitle,'(A,I4)')'P quota in DNA plankton ',j + diagUnits = 'molP molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'PTHY', j + WRITE(diagTitle,'(A,I4)')'P quota in Thylakoid membrane plank ',j + diagUnits = 'molP molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'PCON', j + WRITE(diagTitle,'(A,I4)')'P quota a constant part plankton ',j + diagUnits = 'molP molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'PSTO', j + WRITE(diagTitle,'(A,I4)')'P quota in P storage plankton ',j + diagUnits = 'molP molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'PEXC', j + WRITE(diagTitle,'(A,I4)')'P quota in QP_excess plankton ',j + diagUnits = 'mol P molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'FPHO', j + WRITE(diagTitle,'(A,I4)')'Fe quota in Photosystem plankton ',j + diagUnits = 'mol Fe molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'FSTO', j + WRITE(diagTitle,'(A,I4)')'Fe quota in QFe_store plankton ',j + diagUnits = 'mol Fe molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'FEXC', j + WRITE(diagTitle,'(A,I4)')'Fe quota in QFe_excess plankton ',j + diagUnits = 'mol Fe molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'Y_RQ', j + WRITE(diagTitle,'(A,I4)')'O2:C ratio for respiration plankton ',j + diagUnits = 'mol O2 molC-1 ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'limC', j + WRITE(diagTitle,'(A,I4)')'C growth limitation plankton ',j + diagUnits = '[0/1] ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + + WRITE(diagName,'(A,I4.4)')'limL', j + WRITE(diagTitle,'(A,I4)')'Light growth limitation plankton ',j + diagUnits = '[0/1] ' + diagCode = 'SM P MR ' + CALL DIAGNOSTICS_ADDTOLIST( diagNum, + I diagName, diagCode, diagUnits, diagTitle, 0, myThid ) + ENDDO +# endif /* DARWIN_MACROMOLECULAR_GROWTH */ +#endif /* DARWIN_DIAG_PERTYPE */ #ifdef DARWIN_ALLOW_CSTORE #ifdef DARWIN_ALLOW_CSTORE_DIAGS diff --git a/pkg/darwin/darwin_forcing.F b/pkg/darwin/darwin_forcing.F index 7670fd2c4..25446be46 100644 --- a/pkg/darwin/darwin_forcing.F +++ b/pkg/darwin/darwin_forcing.F @@ -157,6 +157,7 @@ SUBROUTINE DARWIN_FORCING( Ptrdummy, _RL mortTempFunc _RL mort2TempFunc _RL uptakeTempFunc + _RL macromolTempFunc _RL omegaCl _RL tmp, tmpFac _RL sedFe(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) @@ -515,7 +516,7 @@ SUBROUTINE DARWIN_FORCING( Ptrdummy, IF (k .GE. kMinFeSed .AND. k .LE. kMaxFeSed) THEN #ifdef DARWIN_IRON_SED_SOURCE_VARIABLE # ifdef DARWIN_IRON_SED_SOURCE_POP -C mask is needed to make sure k-1 isn't an ice shelf +C mask is needed to make sure k-1 is not an ice shelf flx = fesedflux_pcm*wp_sink*R_CP_fesed* & MAX(0 _d 0, Ptracer(i,j,k-1,bi,bj,iPOP)) & *maskC(i,j,k-1,bi,bj) @@ -653,7 +654,7 @@ SUBROUTINE DARWIN_FORCING( Ptrdummy, CALL DARWIN_TEMPFUNC(Theta(i,j,k,bi,bj), & photoTempFunc, hetTempFunc, grazTempFunc, & reminTempFunc, mortTempFunc, mort2TempFunc, - & uptakeTempFunc, myThid) + & uptakeTempFunc, macromolTempFunc, myThid) DO iTr=1,nDarwin ptr(iTr) = Ptracer(i, j, k, bi, bj, iTr) gtr(iTr) = gPtr(i, j, k, iTr) @@ -675,7 +676,7 @@ SUBROUTINE DARWIN_FORCING( Ptrdummy, I grazTempFunc, I reminTempFunc, I mortTempFunc, mort2TempFunc, - I uptakeTempFunc, + I uptakeTempFunc, macromolTempFunc, I omegaCl, I k_debug, I subTime, myIter, myThid ) @@ -1371,6 +1372,91 @@ SUBROUTINE DARWIN_FORCING( Ptrdummy, CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,ilimS+iTr-1), & diagname,0,Nr,2,bi,bj,myThid) ENDDO +# ifdef DARWIN_MACROMOLECULAR_GROWTH + DO iTr=1,nPhoto + WRITE(diagname, '(A,I4.4)') 'PChl', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iPChl+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'VN', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iVN+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'VP', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iVP+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'MODE', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iMODE+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'Fe_C', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iFe_C+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'exQc', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iexQc+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'CChl', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iCChl+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'NChl', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iNChl+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'NPho', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iNPho+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'NSyn', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iNSyn+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'NPrn', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iNPrn+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'NRNA', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iNRNA+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'NDNA', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iNDNA+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'NSTO', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iNSTO+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'NEXC', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iNEXC+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'PRNA', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iPRNA+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'PDNA', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iPDNA+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'PTHY', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iPTHY+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'PCON', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iPCON+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'PSTO', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iPSTO+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'PEXC', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iPEXC+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'FPHO', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iFPHO+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'FSTO', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iFSTO+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'FEXC', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iFEXC+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'Y_RQ', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,iY_RQ+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'limC', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,ilimC+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + WRITE(diagname, '(A,I4.4)') 'limL', iTr + CALL DIAGNOSTICS_FILL(diags(1-OLx,1-OLy,1,ilimL+iTr-1),diagname, + & 0,Nr,2,bi,bj,myThid) + ENDDO +# endif #endif #ifdef DARWIN_ALLOW_CSTORE #ifdef DARWIN_ALLOW_CSTORE_DIAGS diff --git a/pkg/darwin/darwin_generate_allometric.F b/pkg/darwin/darwin_generate_allometric.F index d44b35ea6..576047a94 100644 --- a/pkg/darwin/darwin_generate_allometric.F +++ b/pkg/darwin/darwin_generate_allometric.F @@ -48,7 +48,6 @@ SUBROUTINE DARWIN_GENERATE_ALLOMETRIC( myThid ) _RL bmean, bbmean _RL bbbratiomeas, bbbratioac - C ====================================================================== C compute cell volumes in micrometer^3 C @@ -267,6 +266,11 @@ SUBROUTINE DARWIN_GENERATE_ALLOMETRIC( myThid ) fracPARmort(jp) = a_fracPARmort(g)*biovol(jp)**b_fracPARmort(g) ExportFracDVM(jp) = a_ExportFracDVM(g) + hillnumDIN(jp) = a_hillnumDIN(g) + hillnumPO4(jp) = a_hillnumPO4(g) + hillnumFeT(jp) = a_hillnumFeT(g) + hillnumSiO2(jp) = a_hillnumSiO2(g) + C respRate rate is given in terms of carbon content qcarbon(jp) = a_qcarbon(g) * biovol(jp)**b_qcarbon(g) respRate(jp) = a_respRate_c(g) @@ -374,14 +378,50 @@ SUBROUTINE DARWIN_GENERATE_ALLOMETRIC( myThid ) ksatDOP(jp) = ksatDON(jp)/R_NC(jp)*R_PC(jp) ksatDOFe(jp) = ksatDON(jp)/R_NC(jp)*R_FeC(jp) -#ifdef DARWIN_ALLOW_GEIDER +C ---------------------------------------------------------------------- +#ifdef DARWIN_MACROMOLECULAR_GROWTH + Y_CP_Plip(jp) = a_Y_CP_Plip(g) + Y_CN_protein(jp) = a_Y_CN_protein(g) + Y_NC_chl(jp) = a_Y_NC_chl(g) + Y_CN_cyano(jp) = a_Y_CN_cyano(g) + Y_PN_nucacid(jp) = a_Y_PN_nucacid(g) + Y_CN_DNA(jp) = a_Y_CN_DNA(g) + Y_CN_RNA(jp) = a_Y_CN_RNA(g) + Y_THY_P(jp) = a_Y_THY_P(g) + Y_FeN_photo(jp) = a_Y_FeN_photo(g) + + ECo2Prod(jp) = a_ECo2Prod(g) + maintConsum(jp) = a_maintConsum(g) + A_I(jp) = a_A_I(g) + A_pho(jp) = a_A_pho(g) + A_bio(jp) = a_A_bio(g) + + QC_other(jp) = a_QC_other(g) + QC_pro_other(jp) = a_QC_pro_other(g) + QP_other(jp) = a_QP_other(g) + QP_RNA_min(jp) = a_QP_RNA_min(g) + QC_DNA(jp) = a_QC_DNA(g) + AP_RNA(jp) = a_AP_RNA(g) + + VI_max(jp) = a_VI_max(g) * biovol(jp)**b_VI_max(g) + QN_sto_max(jp) = a_QN_sto_max(g) * biovol(jp)**b_QN_sto_max(g) + Qp_max(jp) = a_Qp_max(g) * biovol(jp)**b_Qp_max(g) + Qfe_max(jp) = a_Qfe_max(g) * biovol(jp)**b_Qfe_max(g) + + Sf(jp) = 1.0 _d 0 + +#else /* DARWIN_MACROMOLECULAR_GROWTH */ + +# ifdef DARWIN_ALLOW_GEIDER mQyield(jp) = a_mQyield(g) chl2cmax(jp) = a_chl2cmax(g) inhibGeider(jp) = a_inhibGeider(g) -#else +# else ksatPAR(jp) = a_ksatPAR(g) kinhPAR(jp) = a_kinhPAR(g) -#endif /* DARWIN_ALLOW_GEIDER */ +# endif /* DARWIN_ALLOW_GEIDER */ + +#endif /* DARWIN_MACROMOLECULAR_GROWTH */ #ifdef ALLOW_RADTRANS aptype(jp) = grp_aptype(g) diff --git a/pkg/darwin/darwin_init_chl.F b/pkg/darwin/darwin_init_chl.F index b2ed43e87..18d02d7bd 100644 --- a/pkg/darwin/darwin_init_chl.F +++ b/pkg/darwin/darwin_init_chl.F @@ -108,7 +108,7 @@ SUBROUTINE DARWIN_INIT_CHL( bi, bj, myTime, myIter, myThid ) #else /* not DARWIN_CHL_INIT_LEGACY */ -C compute PAR from current Chl +C compute PAR from current Chl C (usually initialized to 0 if darwin_chlInitBalanced) C do not fill diagnostics, C do not take ice into account for backwards compatibility diff --git a/pkg/darwin/darwin_plankton.F b/pkg/darwin/darwin_plankton.F index 11b1dd195..b7df2e91c 100644 --- a/pkg/darwin/darwin_plankton.F +++ b/pkg/darwin/darwin_plankton.F @@ -8,7 +8,8 @@ SUBROUTINE DARWIN_PLANKTON( U gTr, O chlout, diags, sumprey, I PAR, photoTempFunc, hetTempFunc, grazTempFunc, reminTempFunc, - I mortTempFunc, mort2TempFunc, uptakeTempFunc, + I mortTempFunc, mort2TempFunc, + I uptakeTempFunc, macromolTempFunc, I omegaCl, I k_debug,myTime,myIter,myThid) @@ -42,6 +43,7 @@ SUBROUTINE DARWIN_PLANKTON( _RL grazTempFunc(nplank) _RL mortTempFunc _RL mort2TempFunc + _RL macromolTempFunc _RL omegaCl _RL myTime INTEGER k_debug @@ -226,6 +228,99 @@ SUBROUTINE DARWIN_PLANKTON( _RL tmp +#ifdef DARWIN_MACROMOLECULAR_GROWTH + _RL mmX, mmQn, mmQp, mmQfe + _RL PChl + _RL QC_chl_D0 + _RL QC_chl_D1 + _RL QN_chl_D0 + _RL QN_chl_D1 + _RL QN_photo_D0 + _RL QN_photo_D1 + _RL QN_bio_D1 + _RL QN_pro_D0 + _RL QN_pro_D1 + _RL QN_rna_D1 + _RL QN_rna_D2 + _RL Qn_D0 + _RL Qn_D1 + _RL Qn_D2 + _RL Qn_exc + _RL QC_chl + _RL QN_chl + _RL QN_pro_photo + _RL QN_pro_bio + _RL QN_pro_tot + _RL QN_RNA + _RL QnExc + _RL exQn + _RL QC_thy_D0 + _RL QC_thy_D1 + _RL QC_pro_D0 + _RL QC_pro_D1 + _RL QC_rna_D1 + _RL QC_rna_D2 + _RL Qc_D0 + _RL Qc_D1 + _RL Qc_D2 + _RL Qc_exc +C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + _RL QP_thy_D0 + _RL QP_thy_D1 + _RL QP_rna_D1 + _RL QP_rna_D2 + _RL Qp_D0 + _RL Qp_D1 + _RL Qp_D2 + _RL PC_n + _RL Qp_exc + _RL PC_p + _RL QP_thy + _RL QP_RNA + _RL QN_essential + _RL QP_essential + _RL QN_max + _RL QC_essential + _RL PC_c + _RL QP_store + _RL QP_excess + _RL QN_store + _RL QN_excess + _RL QpExc + _RL exQp + _RL VN,VP,VFe,VSi +C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + _RL exQc +C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + _RL Qfe_D1 + _RL Qfe_D0 + _RL Qfe_exc + _RL PC_fe + _RL Qfe_pro_photo + _RL Qfe_essential + _RL Qfe_Store + _RL Qfe_excess + _RL exQfe + _RL QfeExc + _RL MODE + _RL limN + _RL limP + _RL limF + _RL limC + _RL limL +C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + _RL QC_chlN + _RL QC_chlP + _RL QC_chlF + _RL Scal_coeff + _RL QC_store + _RL RQ + _RL QN_DNA_actl + _RL QP_other_actl + _RL QP_DNA_actl +C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif /* DARWIN_MACROMOLECULAR_GROWTH */ + #ifdef DARWIN_ALLOW_CDOM _RL CDOM _RL reminPOC_CDOM @@ -472,6 +567,305 @@ SUBROUTINE DARWIN_PLANKTON( DO j = 1, nPhoto IF (isPhoto(j) .NE. 0) THEN +#ifdef DARWIN_MACROMOLECULAR_GROWTH + + IF (X(j) .GT. DARWIN_EPS) THEN + mmQn = Qn(j) + mmQp = Qp(j) + mmQfe = Qfe(j) + mmX = X(j) + ELSE + mmQn = 0 _d 0 + mmQp = 0 _d 0 + mmQfe = 0 _d 0 + mmX = 0 _d 0 + ENDIF + + limP = 0 _d 0 + limN = 0 _d 0 + limF = 0 _d 0 + limC = 0 _d 0 + limL = 0 _d 0 + +C set up Chl and N requirements as a function of growth rate PC +C then solve for PC + +C Carbohydrate fixation rate per chlorophyll +C (molC (mol C in chl s)-1) + PChl = Sf(j)*VI_max(j)*(1 - EXP(-A_I(j)*PARtot)) + +C Case 1: Enought light, growth rate is a function of macromol +C allocation + IF ( PChl .GT. VI_min(j) ) THEN + +C chlorophyll quota (mol C cell-1) +C Chl = ((1 _d 0 + E)*ls + m)/PChl +C where ls = D*Qc (molC s-1) Biomass synthesis rate + QC_chl_D0 = maintConsum(j)/PChl + QC_chl_D1 = (1 + ECo2Prod(j))/PChl + +C nitrogen pools in mol N (mol C)-1 + QN_chl_D0 = QC_chl_D0*Y_NC_chl(j) + QN_chl_D1 = QC_chl_D1*Y_NC_chl(j) + +C photosynthesis related protein + QN_photo_D0 = QC_chl_D0*A_pho(j)/Y_CN_protein(j) + QN_photo_D1 = QC_chl_D1*A_pho(j)/Y_CN_protein(j) + +C biosynthesis related protein + QN_bio_D1 = A_bio(j)/Y_CN_protein(j)/macromolTempFunc + +C total protein + QN_pro_D0 = QN_photo_D0 + QN_pro_other(j) + QN_pro_D1 = QN_photo_D1 + QN_bio_D1 + +C nitrogen in RNA + QN_rna_D1 = QN_pro_D0*AN_RNA(j)/macromolTempFunc + QN_rna_D2 = QN_pro_D1*AN_RNA(j)/macromolTempFunc + +C Total nitrogen + Qn_D0 = QN_chl_D0 + QN_pro_D0 + QN_RNA_min(j) + QN_DNA(j) + Qn_D1 = QN_chl_D1 + QN_pro_D1 + QN_rna_D1 + Qn_D2 = QN_rna_D2 + + +C Phosphate restriction on growth rate + QP_rna_D1 = QN_rna_D1*Y_PN_nucacid(j) + QP_rna_D2 = QN_rna_D2*Y_PN_nucacid(j) + QP_thy_D0 = QC_chl_D0*Y_THY_P(j) + QP_thy_D1 = QC_chl_D1*Y_THY_P(j) + + Qp_D0 = QP_thy_D0 + QP_RNA_min(j) + QP_DNA(j) + QP_other(j) + Qp_D1 = QP_thy_D1 + QP_rna_D1 + Qp_D2 = QP_rna_D2 + + +C Iron restriction on growth + Qfe_D0 = QN_photo_D0*Y_FeN_photo(j) + Qfe_D1 = QN_photo_D1*Y_FeN_photo(j) + + +C carbon restriction on growth rate + QC_thy_D0 = QP_thy_D0*Y_CP_Plip(j) + QC_thy_D1 = QP_thy_D1*Y_CP_Plip(j) + QC_pro_D0 = QN_pro_D0*Y_CN_protein(j) + QC_pro_D1 = QN_pro_D1*Y_CN_protein(j) + QC_rna_D1 = QN_rna_D1*Y_CN_RNA(j) + QC_rna_D2 = QN_rna_D2*Y_CN_RNA(j) + + Qc_D0 = QC_chl_D0 + QC_pro_D0 + QC_RNA_min(j) + QC_thy_D0 + & + QC_DNA(j) + QC_other(j) + Qc_D1 = QC_chl_D1 + QC_pro_D1 + QC_thy_D1 + QC_rna_D1 + Qc_D2 = QC_rna_D2 + + +C Determine what is limiting + Qn_exc = MAX(0 _d 0, mmQn - Qn_D0) + PC_n = 2*Qn_exc/(Qn_D1 + SQRT(Qn_D1*Qn_D1 + 4*Qn_D2*Qn_exc)) + Qp_exc = MAX(0 _d 0, mmQp - Qp_D0) + PC_p = 2*Qp_exc/(Qp_D1 + SQRT(Qp_D1*Qp_D1 + 4*Qp_D2*Qp_exc)) + Qfe_exc = MAX(0 _d 0, mmQfe - Qfe_D0) + PC_fe = Qfe_exc/Qfe_D1 + Qc_exc = MAX(0 _d 0, Qc(j) - Qc_D0) + PC_c = 2*Qc_exc/(Qc_D1 + SQRT(Qc_D1*Qc_D1 + 4*Qc_D2*Qc_exc)) + + PC = MIN(PC_n,PC_p,PC_fe,PC_c) + IF (PC_p.EQ.PC) THEN + MODE = 1 _d 0 + limP = 1 _d 0 + ELSEIF (PC_n.EQ.PC) THEN + MODE = 2 _d 0 + limN = 1 _d 0 + ELSEIF (PC_fe.EQ.PC) THEN + MODE = 3 _d 0 + limF = 1 _d 0 + ELSEIF (PC_c.EQ.PC) THEN + MODE = 4 _d 0 + limC = 1 _d 0 + ELSE + MODE = 0 _d 0 + ENDIF + + QC_chl = QC_chl_D0 + QC_chl_D1*PC + +C Case 2: Light limitation, growth rate is zero, QC_chl is +C calculated based on cellular mass balance + ELSE + MODE = 4 _d 0 + limL = 1 _d 0 + PC = 0. _d 0 + ENDIF + +C If growth rate is zero, recompute maximum QC_chl possible with +C given quotas + IF (PC .EQ. 0. _d 0) THEN + QC_chlN = (mmQn - QnNoChl(j)) + & /(Y_NC_chl(j) + A_pho(j)/Y_CN_protein(j)) + QC_chlP = (mmQp - QpNoChl(j))/Y_THY_P(j) + QC_chlF = (mmQfe - QfeNoChl(j)) + & /(A_pho(j)/Y_CN_protein(j)*Y_FeN_photo(j)) + QC_chl = MAX(0 _d 0, MIN(QC_chlN,QC_chlP,QC_chlF,QC_chlMax(j))) + ENDIF + +C convert to mg Chl m-3 + chlout(j) = 893.49 _d 0*X(j)*QC_chl/55 _d 0 + +C Calculate diagnostics and essentials + QN_chl = QC_chl*Y_NC_chl(j) + QN_pro_photo = QC_chl*A_pho(j)/Y_CN_protein(j) + QN_pro_bio = A_bio(j)/Y_CN_protein(j)*PC/macromolTempFunc + QN_pro_tot = QN_pro_other(j) + QN_pro_photo + QN_pro_bio + QN_RNA = QN_RNA_min(j) + & + QN_pro_tot*AN_RNA(j)*PC/macromolTempFunc + + QP_thy = QC_chl*Y_THY_P(j) + QP_RNA = QN_RNA*Y_PN_nucacid(j) + + Qfe_pro_photo = QN_pro_photo*Y_FeN_photo(j) + +C Case 3: if Qn, Qp are lower then the minimum requirement for Chl +C the remaining pools are scaled down to not exceed quotas + IF (QC_chl.EQ.0 _d 0) THEN + Scal_coeff = MIN(mmQp/QpNoChl(j),mmQn/QnNoChl(j),1 _d 0) + QN_RNA = QN_RNA_min(j)*Scal_coeff + QN_DNA_actl = QN_DNA(j)*Scal_coeff + QP_RNA = QP_RNA_min(j)*Scal_coeff + QP_DNA_actl = QP_DNA(j)*Scal_coeff +C excess N (if Qp.LT.QpNoChl) goes here + QN_pro_tot = MIN(mmQn - QN_RNA - QN_DNA_actl, QN_pro_other(j)) +C excess P (if Qn.LT.QnNoChl) goes here + QP_other_actl = MIN(mmQp - QP_RNA - QP_DNA_actl, QP_other(j)) + ELSE + QN_DNA_actl = QN_DNA(j) + QP_DNA_actl = QP_DNA(j) + QP_other_actl = QP_other(j) + ENDIF + +C total pools required for functioning (or scaled down) + QN_essential = QN_chl + QN_pro_tot + QN_RNA + QN_DNA_actl + QN_max = QN_essential + QN_sto_max(j) + QP_essential = QP_thy + QP_RNA + QP_DNA_actl + QP_other_actl + Qfe_essential = Qfe_pro_photo + QC_essential = QC_chl + QN_pro_tot*Y_CN_protein(j) + & + QP_thy*Y_CP_Plip(j) + QN_RNA*Y_CN_RNA(j) + & + QN_DNA_actl*Y_CN_DNA(j) + QC_other(j) + +C Storage calculation ----------------- + +C N quota above QN_essential is store, but not more than +C QN_sto_max(j) and make sure enough C for store + QN_store = MIN(mmQn - QN_essential, + & (Qc(j) - QC_essential)/Y_CN_cyano(j), + & QN_sto_max(j)) + QN_store = MAX(0 _d 0, QN_store) + QN_excess = MAX(0 _d 0, mmQn - QN_essential - QN_store) + +C P quota above QP_essential is store, but keep total P under +C Qp_max(j) + QP_store = MAX(0 _d 0, MIN(mmQp, Qp_max(j)) - QP_essential) + QP_excess = MAX(0 _d 0, mmQp - QP_essential - QP_store) + +C Fe quota above Qfe_essential is store, but keep total iron under +C Qfe_max(j) + Qfe_store = MAX(0 _d 0, MIN(mmQfe, Qfe_max(j)) - Qfe_essential) + Qfe_excess = MAX(0 _d 0, mmQfe - Qfe_essential - Qfe_store) + +C deduce carbon store + QC_store = MAX(0 _d 0, + & 1 _d 0 - QC_essential - QN_store*Y_CN_cyano(j)) + +C shlomit: new nutrient-uptake regulation terms: +C when store is full, phytoplankton reduce their nutrient-uptake: + +C Nitrogen: + IF ((QN_essential + QN_store) .GT. 0 _d 0) THEN + regQn = (1.1 _d 0*(QN_essential + QN_store) - mmQn)/ + & (0.1 _d 0*(QN_essential + QN_store)) + regQn = MAX(0 _d 0, MIN(1 _d 0, regQn)) + ELSE + regQn = 1 _d 0 + ENDIF + MM_NO3 = NO3/(NO3 + ksatNO3(j)) +C Carbon-specific NO3 uptake rate + VN = vmaxNO3(j)*MM_NO3*regQn*uptakeTempFunc + uptakeN = VN*mmX + uptakeNO3 = VN*mmX + uptakeNO2 = 0 _d 0 + uptakeNH4 = 0 _d 0 + +C Phosphorous: + IF ((QP_essential+QP_store) .GT. 0 _d 0) THEN + regQp = (1.1 _d 0*(QP_essential+QP_store) - mmQp)/ + & (0.1 _d 0*(QP_essential+QP_store)) + regQp = MAX(0 _d 0, MIN(1 _d 0, regQp)) + ELSE + regQp = 1 _d 0 + ENDIF + MM_PO4 = PO4/(PO4 + ksatPO4(j)) +C Carbon-specific PO4 uptake rate + VP = vmaxPO4(j)*MM_PO4*regQp*uptakeTempFunc + uptakePO4 = VP*mmX + +C Iron: + IF ((Qfe_essential + Qfe_Store) .GT. 0 _d 0) THEN + regQFe = (1.1 _d 0*(Qfe_essential + Qfe_Store) - mmQfe)/ + & (0.1 _d 0*(Qfe_essential + Qfe_Store)) + regQFe = MAX(0 _d 0, MIN(1 _d 0, regQFe)) + ELSE + regQFe = 1 _d 0 + ENDIF + MM_FeT = FeT/(FeT + ksatFeT(j)) +C Carbon-specific FeT uptake rate + Vfe = vmaxFeT(j)*MM_FeT*regQFe*uptakeTempFunc + uptakeFeT = Vfe*mmX + + exQc = 0 _d 0 + +C shlomit: Calclate the O2:C ratio + RQ = ( QN_pro_tot*Y_CN_protein(j))* 1.56 _d 0 + & + ( QC_other(j)/2 + QC_store/2) * 1.34 _d 0 + & + ( Y_CP_Plip(j) * QP_thy)* 1.30 _d 0 + & + ( QC_other(j)/2 + QC_store/2) * 1.0 _d 0 + & + ( QC_chl) * 1.39 _d 0 + & + ( QN_DNA_actl*Y_CN_DNA(j)) * 1.62 _d 0 + & + ( QN_RNA*Y_CN_RNA(j)) * 1.57 _d 0 + & + ( QN_store*Y_CN_cyano(j)) * 1.85 _d 0 + +# ifdef DARWIN_DIAG_PERTYPE + diags(iPChl+j-1) = PChl + diags(iVN +j-1) = VN + diags(iVP +j-1) = VP + diags(iMODE+j-1) = MODE + diags(iFe_C+j-1) = mmQfe + diags(iexQc+j-1) = exQc + diags(iCChl+j-1) = QC_chl + diags(iNChl+j-1) = QN_chl + diags(iNPho+j-1) = QN_pro_photo + diags(iNSyn+j-1) = QN_pro_bio + diags(iNPrn+j-1) = QN_pro_tot + diags(iNRNA+j-1) = QN_RNA + diags(iNDNA+j-1) = QN_DNA_actl + diags(iNSTO+j-1) = QN_store + diags(iNEXC+j-1) = QN_excess + diags(iPRNA+j-1) = QP_RNA + diags(iPDNA+j-1) = QP_DNA_actl + diags(iPTHY+j-1) = QP_thy + diags(iPCON+j-1) = QP_other_actl + diags(iPSTO+j-1) = QP_store + diags(iPEXC+j-1) = QP_excess + diags(iFPHO+j-1) = Qfe_pro_photo + diags(iFSTO+j-1) = Qfe_Store + diags(iFEXC+j-1) = Qfe_excess + diags(iY_RQ+j-1) = RQ + diags(ilimN+j-1) = limN + diags(ilimP+j-1) = limP + diags(ilimF+j-1) = limF + diags(ilimC+j-1) = limC + diags(ilimL+j-1) = limL +# endif + +#else /* DARWIN_MACROMOLECULAR_GROWTH */ + C==== Uptake and nutrient limitation =================================== C for quota elements, growth is limiteed by available quota, C for non-quota elements, by available nutrients in medium @@ -499,7 +893,7 @@ SUBROUTINE DARWIN_PLANKTON( #ifdef DARWIN_ALLOW_PQUOTA regQp = MAX(0 _d 0, MIN(1 _d 0, (Qpmax(j)-Qp(j))/ & (Qpmax(j)-Qpmin(j)) )) - regQp = regQp**hillnumUptake + regQp = regQp**hillnumPO4(j) C carbon-specific PO4 uptake rate uptakePO4 = vmaxPO4(j)*MM_PO4*regQp*uptakeTempFunc*X(j) c normalized Droop limitation @@ -528,7 +922,7 @@ SUBROUTINE DARWIN_PLANKTON( #ifdef DARWIN_ALLOW_SIQUOTA regQsi = MAX(0 _d 0, MIN(1 _d 0, (Qsimax(j) - Qsi(j))/ & (Qsimax(j) - Qsimin(j)) )) - regQsi = regQsi**hillnumUptake + regQsi = regQsi**hillnumSiO2(j) uptakeSiO2 = vmaxSiO2(j)*MM_SiO2*regQsi*uptakeTempFunc*X(j) c linear limitation limitsi = MAX(0 _d 0, MIN(1 _d 0, (Qsi(j) - Qsimin(j))/ @@ -555,7 +949,7 @@ SUBROUTINE DARWIN_PLANKTON( #ifdef DARWIN_ALLOW_FEQUOTA regQfe = MAX(0 _d 0, MIN(1 _d 0, (Qfemax(j)-Qfe(j))/ & (Qfemax(j)-Qfemin(j)) )) - regQfe = regQfe**hillnumUptake + regQfe = regQfe**hillnumFeT(j) uptakeFeT = vmaxFeT(j)*MM_FeT*regQfe*uptakeTempFunc*X(j) c normalized Droop limitation limitfe = MIN(1 _d 0, (1.0-Qfemin(j)/MAX(Qfemin(j), Qfe(j)))/ @@ -583,7 +977,7 @@ SUBROUTINE DARWIN_PLANKTON( MM_NO3 = NO3/(NO3 + ksatNO3(j))*inhibNH4 regQn = MAX(0 _d 0, MIN(1 _d 0, (Qnmax(j)-Qn(j))/ & (Qnmax(j)-Qnmin(j)) )) - regQn = regQn**hillnumUptake + regQn = regQn**hillnumDIN(j) uptakeNH4 = vmaxNH4(j)*MM_NH4*regQn*uptakeTempFunc*X(j) uptakeNO2 = vmaxNO2(j)*MM_NO2*regQn*uptakeTempFunc*X(j) uptakeNO3 = vmaxNO3(j)*MM_NO3*regQn*uptakeTempFunc*X(j) @@ -715,6 +1109,20 @@ SUBROUTINE DARWIN_PLANKTON( #endif /* DARWIN_ALLOW_GEIDER */ +#ifdef DARWIN_DIAG_PERTYPE +C which nutrient is limiting growth? + IF (limitnut==limitn) diags(ilimN+j-1) = 1 _d 0 + IF (limitnut==limitp) diags(ilimP+j-1) = 1 _d 0 + IF (limitnut==limitfe) diags(ilimF+j-1) = 1 _d 0 + IF (limitnut==limitsi) diags(ilimS+j-1) = 1 _d 0 +C factors that go into growth equation + diags(ifIph+j-1) = limitI + diags(ifTph+j-1) = photoTempFunc(j) + diags(ifnut+j-1) = limitnut +#endif + +#endif /* DARWIN_MACROMOLECULAR_GROWTH */ + photoSyn = PC*X(j) C==== Respiration ====================================================== @@ -827,15 +1235,6 @@ SUBROUTINE DARWIN_PLANKTON( #ifdef DARWIN_DIAG_PERTYPE diags(iPPplank+j-1) = diags(iPPplank+j-1) + uptakeDIC diags(iPCplank+j-1) = diags(iPCplank+j-1) + PC -C which nutrient is limiting growth? - IF (limitnut==limitn) diags(ilimN+j-1) = 1 _d 0 - IF (limitnut==limitp) diags(ilimP+j-1) = 1 _d 0 - IF (limitnut==limitfe) diags(ilimF+j-1) = 1 _d 0 - IF (limitnut==limitsi) diags(ilimS+j-1) = 1 _d 0 -C factors that go into growth equation - diags(ifIph+j-1) = limitI - diags(ifTph+j-1) = photoTempFunc(j) - diags(ifnut+j-1) = limitnut #endif IF (diazo(j) .GT. 0.0 _d 0) THEN diags(iNfix)=diags(iNfix)+uptakeN-uptakeNH4-uptakeNO2-uptakeNO3 @@ -862,6 +1261,10 @@ SUBROUTINE DARWIN_PLANKTON( C==== Apply phototrophy tendencies ===================================== gTr(ic+j-1)=gTr(ic+j-1) + growth +#ifdef DARWIN_MACROMOLECULAR_GROWTH + gTr(ic+j-1)=gTr(ic+j-1) - mmX*exQc + gTr(iDOC) = gTr(iDOC) + mmX*exQc +#endif #ifdef DARWIN_ALLOW_CSTORE gTr(ich+j-1)=gTr(ich+j-1) + storeC #endif @@ -1070,17 +1473,23 @@ SUBROUTINE DARWIN_PLANKTON( #else IF (.TRUE.) THEN #endif + IF (ksatO2remin .GT. 0 _d 0) THEN + tmp = O2/(O2 + ksatO2remin) + ELSE + tmp = 1 _d 0 + ENDIF C parameterized remineralization; want to set all K except KPOSi to zero C if running with bacteria - respDOC = reminTempFunc*KDOC *DOC - respDON = reminTempFunc*KDON *DON - respDOP = reminTempFunc*KDOP *DOP - respDOFe = reminTempFunc*KDOFe*DOFe - respPOC = reminTempFunc*KPOC *POC - respPON = reminTempFunc*KPON *PON - respPOP = reminTempFunc*KPOP *POP - respPOSi = reminTempFunc*KPOSi*POSi - respPOFe = reminTempFunc*KPOFe*POFe +C shlomit: add O2-dependece respiration + respDOC = reminTempFunc*KDOC *DOC*tmp + respDON = reminTempFunc*KDON *DON*tmp + respDOP = reminTempFunc*KDOP *DOP*tmp + respDOFe = reminTempFunc*KDOFe*DOFe*tmp + respPOC = reminTempFunc*KPOC *POC*tmp + respPON = reminTempFunc*KPON *PON*tmp + respPOP = reminTempFunc*KPOP *POP*tmp + respPOSi = reminTempFunc*KPOSi*POSi*tmp + respPOFe = reminTempFunc*KPOFe*POFe*tmp consumDOC = consumDOC + respDOC consumDON = consumDON + respDON @@ -1784,4 +2193,3 @@ SUBROUTINE DARWIN_PLANKTON( RETURN END SUBROUTINE - diff --git a/pkg/darwin/darwin_read_params.F b/pkg/darwin/darwin_read_params.F index cefc37433..1a86ea3b7 100644 --- a/pkg/darwin/darwin_read_params.F +++ b/pkg/darwin/darwin_read_params.F @@ -99,6 +99,7 @@ SUBROUTINE DARWIN_READ_PARAMS(iUnit,oUnit,myThid) & TempAeArr, & TemprefArr, & TempCoeffArr, + & TempAeArrMacromol, & reminTempAe, & mortTempAe, & mort2TempAe, @@ -143,6 +144,7 @@ SUBROUTINE DARWIN_READ_PARAMS(iUnit,oUnit,myThid) & KPON, & KPOFe, & KPOSi, + & ksatO2remin, & wC_sink, & wP_sink, & wN_sink, @@ -230,7 +232,6 @@ SUBROUTINE DARWIN_READ_PARAMS(iUnit,oUnit,myThid) & synthcost, & inhib_graz, & inhib_graz_exp, - & hillnumUptake, & hillnumGraz, & hollexp, & phygrazmin, @@ -452,6 +453,7 @@ SUBROUTINE DARWIN_READ_PARAMS(iUnit,oUnit,myThid) TempAeArr = -4000.0 _d 0 TemprefArr = 293.15 _d 0 TempCoeffArr = 0.5882 _d 0 + TempAeArrMacromol = -8420.0 _d 0 reminTempAe = 0.0438 _d 0 mortTempAe = 0.0438 _d 0 mort2TempAe = 0.0438 _d 0 @@ -498,6 +500,7 @@ SUBROUTINE DARWIN_READ_PARAMS(iUnit,oUnit,myThid) KPON = KPOC KPOFe = KPOC KPOSi = 1 _d 0/(300 _d 0*pday) + ksatO2remin = 0 _d 0 wC_sink = 10 _d 0/pday wP_sink = wC_sink wN_sink = wC_sink @@ -554,7 +557,6 @@ SUBROUTINE DARWIN_READ_PARAMS(iUnit,oUnit,myThid) synthcost = 0.0 _d 0 inhib_graz = 1.0 _d 0 inhib_graz_exp = 0.0 _d 0 - hillnumUptake = 1.0 _d 0 hillnumGraz = 1.0 _d 0 hollexp = 1.0 _d 0 phygrazmin = 120 _d -10 diff --git a/pkg/darwin/darwin_read_traitparams.F b/pkg/darwin/darwin_read_traitparams.F index 5a09a56ee..d1728d0ad 100644 --- a/pkg/darwin/darwin_read_traitparams.F +++ b/pkg/darwin/darwin_read_traitparams.F @@ -172,6 +172,36 @@ SUBROUTINE DARWIN_READ_TRAITPARAMS(iUnit,oUnit,myThid) & a_grazTempExp2, & a_grazTempOptimum, & a_grazDecayPower, +#ifdef DARWIN_MACROMOLECULAR_GROWTH + & a_Y_CP_Plip, + & a_Y_CN_protein, + & a_Y_NC_chl, + & a_Y_CN_cyano, + & a_Y_PN_nucacid, + & a_Y_CN_DNA, + & a_Y_CN_RNA, + & a_Y_THY_P, + & a_Y_FeN_photo, + & a_ECo2Prod, + & a_maintConsum, + & a_VI_max, + & b_VI_max, + & a_A_I, + & a_QC_other, + & a_QC_pro_other, + & a_QP_other, + & a_QP_RNA_min, + & a_QC_DNA, + & a_QN_sto_max, + & b_QN_sto_max, + & a_Qp_max, + & b_Qp_max, + & a_Qfe_max, + & b_Qfe_max, + & a_A_pho, + & a_A_bio, + & a_AP_RNA, +#endif #ifdef DARWIN_ALLOW_GEIDER & a_mQyield, & a_chl2cmax, @@ -185,6 +215,10 @@ SUBROUTINE DARWIN_READ_TRAITPARAMS(iUnit,oUnit,myThid) & a_acclimtimescl_denom, & a_ksatPON, & a_ksatDON, + & a_hillnumDIN, + & a_hillnumPO4, + & a_hillnumFeT, + & a_hillnumSiO2, & a_grazemax, & a_grazemax_denom, & b_grazemax, @@ -462,6 +496,36 @@ SUBROUTINE DARWIN_READ_TRAITPARAMS(iUnit,oUnit,myThid) a_grazTempExp2 = 0.001 _d 0 a_grazTempOptimum = 2. _d 0 a_grazDecayPower = 4. _d 0 +#ifdef DARWIN_MACROMOLECULAR_GROWTH + a_A_pho = 16.0 _d 0 + a_Y_THY_P = 0.028163 _d 0 + a_Y_CN_protein = 5.3 _d 0 /1.4 _d 0 + a_Y_FeN_photo = 0.00163 _d 0 + a_Y_NC_chl = 4.0 _d 0/55.0 _d 0 + a_Y_CN_cyano = 2.0 _d 0 + a_Y_PN_nucacid = 1. _d 0 /3.75 _d 0 + a_Y_CN_DNA = 9.75 _d 0 /3.75 _d 0 + a_Y_CN_RNA = 9.50 _d 0 /3.75 _d 0 + a_Y_CP_Plip = 40.0 _d 0 + a_ECo2Prod = 0.774 _d 0 + a_maintConsum = 0.393 _d 0/3600/24 + a_VI_max = 277 _d 0/3600/24 + b_VI_max = 0 _d 0 + a_A_I = 0.008633641 _d 0 + a_QC_other = 0.0182 _d 0 + a_QC_pro_other = 0.24 _d 0 + a_QP_other = 6.5344 _d -4 + a_QP_RNA_min = 2.23 _d -4 + a_QC_DNA = 9.41 _d -4 + a_QN_sto_max = 0.035 _d 0 + b_QN_sto_max = 0 _d 0 + a_Qp_max = 0.0052 _d 0 + b_Qp_max = 0 _d 0 + a_Qfe_max = 2.436 _d -4 + b_Qfe_max = 0 _d 0 + a_A_bio = 0.2711 _d 0*3600*24 + a_AP_RNA = 0.00423 _d 0*3600*24 +#endif #ifdef DARWIN_ALLOW_GEIDER a_mQyield = 75 _d -6 a_chl2cmax = .3 _d 0 @@ -475,6 +539,10 @@ SUBROUTINE DARWIN_READ_TRAITPARAMS(iUnit,oUnit,myThid) a_acclimtimescl_denom = 1 _d 0 a_ksatPON = 1 _d 0 a_ksatDON = 1 _d 0 + a_hillnumDIN = 1 _d 0 + a_hillnumPO4 = 1 _d 0 + a_hillnumFeT = 1 _d 0 + a_hillnumSiO2 = 1 _d 0 a_grazemax = 21.9 _d 0 / pday a_grazemax_denom = 1. _d 0 b_grazemax = -0.16 _d 0 diff --git a/pkg/darwin/darwin_read_traits.F b/pkg/darwin/darwin_read_traits.F index 0effd53be..54edb753f 100644 --- a/pkg/darwin/darwin_read_traits.F +++ b/pkg/darwin/darwin_read_traits.F @@ -99,6 +99,10 @@ SUBROUTINE DARWIN_READ_TRAITS(iUnit,oUnit,myThid) & ksatPO4, & ksatSiO2, & ksatFeT, + & hillnumDIN, + & hillnumPO4, + & hillnumFeT, + & hillnumSiO2, & kexcc, & kexcn, & kexcp, @@ -134,6 +138,33 @@ SUBROUTINE DARWIN_READ_TRAITS(iUnit,oUnit,myThid) & ksatPARDVM, & fracPARmort, & ExportFracDVM +#ifdef DARWIN_MACROMOLECULAR_GROWTH + & ,Y_CP_Plip, + & Y_CN_protein, + & Y_NC_chl, + & Y_CN_cyano, + & Y_PN_nucacid, + & Y_CN_DNA, + & Y_CN_RNA, + & Y_THY_P, + & Y_FeN_photo, + & ECo2Prod, + & maintConsum, + & VI_max, + & A_I, + & QC_other, + & QC_pro_other, + & QP_other, + & QP_RNA_min, + & QC_DNA, + & QN_sto_max, + & Qp_max, + & Qfe_max, + & A_pho, + & A_bio, + & AP_RNA, + & Sf +#endif NAMELIST/DARWIN_DEPENDENT_TRAITS/ #ifndef DARWIN_ALLOW_GEIDER @@ -149,6 +180,21 @@ SUBROUTINE DARWIN_READ_TRAITS(iUnit,oUnit,myThid) & biovol_bygroup, & alpha_mean, & chl2cmin +#ifdef DARWIN_MACROMOLECULAR_GROWTH + & ,QN_pro_other + & ,QN_RNA_min + & ,QC_RNA_min + & ,QN_DNA + & ,QP_DNA + & ,A_thy + & ,AN_RNA + & ,VI_min + & ,QC_chlMax + & ,QnNoChl + & ,QpNoChl + & ,QfeNoChl + & ,QC_const +#endif #ifdef ALLOW_RADTRANS @@ -251,6 +297,29 @@ SUBROUTINE DARWIN_READ_TRAITS(iUnit,oUnit,myThid) ENDDO #endif +#ifdef DARWIN_MACROMOLECULAR_GROWTH + DO jp = 1,nplank + QN_pro_other(jp) = QC_pro_other(jp)/Y_CN_protein(jp) + QN_RNA_min(jp) = QP_RNA_min(jp)/Y_PN_nucacid(jp) + QC_RNA_min(jp) = QN_RNA_min(jp)*Y_CN_RNA(jp) + QN_DNA(jp) = QC_DNA(jp)/Y_CN_DNA(jp) + QP_DNA(jp) = QN_DNA(jp)*Y_PN_nucacid(jp) + A_thy(jp) = Y_THY_P(jp)*Y_CP_Plip(jp) + AN_RNA(jp) = AP_RNA(jp)*Y_CN_protein(jp)/Y_PN_nucacid(jp) + + QC_const(jp) = QC_pro_other(jp) + QN_RNA_min(jp)*Y_CN_RNA(jp) + + & QC_DNA(jp) + QC_other(jp) + VI_min(jp) = maintConsum(jp)* + & (1. + A_thy(jp) + A_pho(jp))/(1 - QC_const(jp)) + QC_chlMax(jp) = maintConsum(jp)/VI_min(jp) + + QnNoChl(jp) = QN_DNA(jp) + QN_RNA_min(jp) + QN_pro_other(jp) + QpNoChl(jp) = QP_RNA_min(jp) + QN_DNA(jp)*Y_PN_nucacid(jp) + & + QP_other(jp) + QfeNoChl(jp) = 0.0 _d 0 + ENDDO +#endif + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C Checks CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC @@ -439,6 +508,11 @@ SUBROUTINE DARWIN_READ_TRAITS(iUnit,oUnit,myThid) ksatSiO2(jp) = DARWIN_UNUSED ksatFeT(jp) = DARWIN_UNUSED + hillnumDIN(jp) = DARWIN_UNUSED + hillnumPO4(jp) = DARWIN_UNUSED + hillnumFeT(jp) = DARWIN_UNUSED + hillnumSiO2(jp) = DARWIN_UNUSED + #ifdef DARWIN_ALLOW_GEIDER inhibGeider(jp) = DARWIN_UNUSED #else diff --git a/pkg/darwin/darwin_tempfunc.F b/pkg/darwin/darwin_tempfunc.F index c1f81822e..3c35ea333 100644 --- a/pkg/darwin/darwin_tempfunc.F +++ b/pkg/darwin/darwin_tempfunc.F @@ -8,7 +8,7 @@ SUBROUTINE DARWIN_TEMPFUNC( I Temp, O photoFun, hetFun, grazFun, O reminFun, mortFun, mort2Fun, - O uptakeFun, + O uptakeFun, macromolFun, I myThid) C !DESCRIPTION: ======================================================== @@ -42,6 +42,7 @@ SUBROUTINE DARWIN_TEMPFUNC( _RL mortFun _RL mort2Fun _RL uptakeFun + _RL macromolFun CEOP #ifdef ALLOW_DARWIN @@ -59,6 +60,7 @@ SUBROUTINE DARWIN_TEMPFUNC( mortFun = 1.0 _d 0 mort2Fun = 1.0 _d 0 uptakeFun = 1.0 _d 0 + macromolFun = 1.0 _d 0 #elif DARWIN_TEMP_VERSION == 1 @@ -89,6 +91,7 @@ SUBROUTINE DARWIN_TEMPFUNC( mortFun = 1.0 _d 0 mort2Fun = 1.0 _d 0 uptakeFun = 1.0 _d 0 + macromolFun = 1.0 _d 0 c ++++++++++++++ END VERSION 1 +++++++++++++++++++++++++++++++++++++++ #elif DARWIN_TEMP_VERSION == 2 @@ -129,6 +132,9 @@ SUBROUTINE DARWIN_TEMPFUNC( c mortFun = 1.0 _d 0 c mort2Fun = 1.0 _d 0 uptakeFun = 1.0 _d 0 + macromolFun = exp(TempAeArrMacromol*(1.0 _d 0/(Temp+Tkel) - + & 1.0 _d 0/(TemprefArr) ) ) + macromolFun = max(macromolFun , 1. _d -10) c ++++++++++++++ END VERSION 2 +++++++++++++++++++++++++++++++++++++++ #elif DARWIN_TEMP_VERSION == 3