diff --git a/cfgs/GYRE_PISCES/EXPREF/file_def_nemo.xml b/cfgs/GYRE_PISCES/EXPREF/file_def_nemo.xml index 57144055d7774e652660e39313bf7036a4573a88..d78a5f7957ae4224dcaf0fbb16a43861e55bea18 100644 --- a/cfgs/GYRE_PISCES/EXPREF/file_def_nemo.xml +++ b/cfgs/GYRE_PISCES/EXPREF/file_def_nemo.xml @@ -50,12 +50,16 @@ </file> <file id="file5" name_suffix="_ptrc_T" description="lobster sms variables" > - <field field_ref="DET" /> - <field field_ref="ZOO" /> + <field field_ref="DIC" /> + <field field_ref="Alkalini" /> + <field field_ref="O2" /> + <field field_ref="POC" /> <field field_ref="PHY" /> + <field field_ref="ZOO" /> + <field field_ref="DOC" /> + <field field_ref="THETANANO"/> <field field_ref="NO3" /> - <field field_ref="NH4" /> - <field field_ref="DOM" /> + <field field_ref="Fer" /> </file> </file_group> @@ -69,27 +73,25 @@ <file_group id="1y" output_freq="1y" output_level="10" enabled=".TRUE."> <!-- real yearly files --> <file id="file6" name_suffix="_diad_T" description="additional lobster diagnostics" > - <field field_ref="FNO3PHY" /> - <field field_ref="FNH4PHY" /> - <field field_ref="FNH4NO3" /> - <field field_ref="TNO3PHY" /> - <field field_ref="TNH4PHY" /> - <field field_ref="TPHYDOM" /> - <field field_ref="TPHYNH4" /> - <field field_ref="TPHYZOO" /> - <field field_ref="TPHYDET" /> - <field field_ref="TDETZOO" /> - <field field_ref="TDETSED" /> - <field field_ref="TZOODET" /> - <field field_ref="TZOOBOD" /> - <field field_ref="TZOONH4" /> - <field field_ref="TZOODOM" /> - <field field_ref="TNH4NO3" /> - <field field_ref="TDOMNH4" /> - <field field_ref="TDETNH4" /> - <field field_ref="TPHYTOT" /> - <field field_ref="TZOOTOT" /> - <field field_ref="SEDPOC" /> + <field field_ref="PH" /> + <field field_ref="CO3" /> + <field field_ref="CO3sat" /> + <field field_ref="PAR" /> + <field field_ref="PPPHYN" /> + <field field_ref="xfracal" /> + <field field_ref="GRAZ1" /> + <field field_ref="EPC100" /> + <field field_ref="Cflx" /> + <field field_ref="Oflx" /> + <field field_ref="Kg" /> + <field field_ref="Dpco2" /> + <field field_ref="Dpo2" /> + <field field_ref="Heup" /> + <field field_ref="Nfix" /> + <field field_ref="MuN" /> + <field field_ref="LNnut" /> + <field field_ref="LNlight" /> + <field field_ref="Sdenit" /> </file> </file_group> diff --git a/cfgs/GYRE_PISCES/EXPREF/namelist_pisces_cfg b/cfgs/GYRE_PISCES/EXPREF/namelist_pisces_cfg index fcd9539235055d3858aa0376f12b20658f61e636..ab1538f17da39d0b41ebfb66829eb71e40c8bc25 100644 --- a/cfgs/GYRE_PISCES/EXPREF/namelist_pisces_cfg +++ b/cfgs/GYRE_PISCES/EXPREF/namelist_pisces_cfg @@ -1,20 +1,9 @@ -!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -!! PISCES (key_pisces) reference namelist (see below for key_pisces_reduced) -!! 1 - air-sea exchange (nampisext) -!! 2 - biological parameters (nampisbio) -!! 3 - parameters for nutrient limitations (nampislim) -!! 4 - parameters for phytoplankton (nampisprod,nampismort) -!! 5 - parameters for zooplankton (nampismes,nampiszoo) -!! 6 - parameters for remineralization (nampisrem) -!! 7 - parameters for calcite chemistry (nampiscal) -!! 8 - parameters for inputs deposition (nampissed) -!! 11 - Damping (nampisdmp) -!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> !----------------------------------------------------------------------- &nampismod ! Model used !----------------------------------------------------------------------- - ln_p4z = .false. - ln_p2z = .true. + ln_p2z = .true. ! PISCES SIMPLIFIED model used + ln_p4z = .false. ! PISCES model used + ln_p5z = .false. ! PISCES QUOTA model used / !----------------------------------------------------------------------- &nampisext ! air-sea exchange @@ -29,11 +18,11 @@ !----------------------------------------------------------------------- / !----------------------------------------------------------------------- -&namp4zice ! parameters for nutrient limitations for PISCES std - ln_p4z +&namp4zlim ! parameters for nutrient limitations for PISCES std - ln_p4z !----------------------------------------------------------------------- / !----------------------------------------------------------------------- -&namp5zice ! parameters for nutrient limitations PISCES QUOTA - ln_p5z +&namp5zlim ! parameters for nutrient limitations PISCES QUOTA - ln_p5z !----------------------------------------------------------------------- / !----------------------------------------------------------------------- @@ -87,71 +76,30 @@ !----------------------------------------------------------------------- &nampispoc ! parameters for organic particles !----------------------------------------------------------------------- + jcpoc = 5 ! Number of lability classes / !----------------------------------------------------------------------- &nampiscal ! parameters for Calcite chemistry !----------------------------------------------------------------------- / !----------------------------------------------------------------------- -&nampissbc ! parameters for inputs deposition +&nampisbc ! parameters for inputs deposition !----------------------------------------------------------------------- / !----------------------------------------------------------------------- -&nampislig ! Namelist parameters for ligands, nampislig -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&nampisice ! Prescribed sea ice tracers -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&nampisdmp ! Damping -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&nampismass ! Mass conservation -!----------------------------------------------------------------------- -/ -!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -!! PISCES reduced (key_pisces_reduced, ex LOBSTER) : namelists -!! 1 - biological parameters for phytoplankton (namlobphy) -!! 2 - biological parameters for nutrients (namlobnut) -!! 3 - biological parameters for zooplankton (namlobzoo) -!! 4 - biological parameters for detritus (namlobdet) -!! 5 - biological parameters for DOM (namlobdom) -!! 6 - parameters from aphotic layers to sediment (namlobsed) -!! 7 - general coefficients (namlobrat) -!! 8 - optical parameters (namlobopt) -!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -!----------------------------------------------------------------------- -&namlobphy ! biological parameters for phytoplankton +&nampissed ! parameters for sediments mobilization !----------------------------------------------------------------------- / !----------------------------------------------------------------------- -&namlobnut ! biological parameters for nutrients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobzoo ! biological parameters for zooplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdet ! biological parameters for detritus -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdom ! biological parameters for DOM -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobsed ! parameters from aphotic layers to sediment +&nampislig ! Namelist parameters for ligands, nampislig !----------------------------------------------------------------------- / !----------------------------------------------------------------------- -&namlobrat ! general coefficients +&nampisice ! Prescribed sea ice tracers !----------------------------------------------------------------------- / !----------------------------------------------------------------------- -&namlobopt ! optical parameters +&nampisdmp ! Damping !----------------------------------------------------------------------- + nn_pisdmp = 4320 ! Frequency of Relaxation / diff --git a/cfgs/GYRE_PISCES/EXPREF/namelist_top_cfg b/cfgs/GYRE_PISCES/EXPREF/namelist_top_cfg index ac338b5aff696eda7e98f5dd63d91643eceb9be9..8edacc35286fa958a816bf459a27215fe3e99968 100644 --- a/cfgs/GYRE_PISCES/EXPREF/namelist_top_cfg +++ b/cfgs/GYRE_PISCES/EXPREF/namelist_top_cfg @@ -1,29 +1,36 @@ !!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -!! NEMO/TOP : Configuration namelist : used to overwrite defaults values defined in SHARED/namelist_top_ref +!! NEMO/TOP1 : Configuration namelist : used to overwrite defaults values defined in SHARED/namelist_top_ref !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> !----------------------------------------------------------------------- &namtrc_run ! run information !----------------------------------------------------------------------- + ln_top_euler = .true. / !----------------------------------------------------------------------- &namtrc ! tracers definition !----------------------------------------------------------------------- - jp_bgc = 6 - ! + jp_bgc = 9 +! ln_pisces = .true. + ln_my_trc = .false. ln_age = .false. ln_cfc11 = .false. ln_cfc12 = .false. ln_c14 = .false. - ln_my_trc = .false. - !_____________!__________!________________________________!______________!________________! - ! ! name ! title of the field ! units ! init from file ! - sn_tracer(1) = 'DET' , 'Detritus ' , 'mmole-N/m3' , .false. - sn_tracer(2) = 'ZOO' , 'Zooplankton concentration ' , 'mmole-N/m3' , .false. - sn_tracer(3) = 'PHY' , 'Phytoplankton concentration' , 'mmole-N/m3' , .false. - sn_tracer(4) = 'NO3' , 'Nitrate concentration ' , 'mmole-N/m3' , .false. - sn_tracer(5) = 'NH4' , 'Ammonium concentration ' , 'mmole-N/m3' , .false. - sn_tracer(6) = 'DOM' , 'Dissolved organic matter ' , 'mmole-N/m3' , .false. +! + ln_trcdta = .false. ! Initialisation from data input file (T) or not (F) + ln_trcbc = .false. ! Enables Boundary conditions +! ! ! ! ! ! +! ! name ! title of the field ! units ! init ! sbc ! cbc ! obc ! ais + sn_tracer(1) = 'DIC ' , 'Dissolved inorganic Concentration ', 'mol-C/L' , .true. , .false., .true. , .false. , .false. + sn_tracer(2) = 'Alkalini' , 'Total Alkalinity Concentration ', 'eq/L ' , .true. , .false., .true. , .false. , .false. + sn_tracer(3) = 'O2 ' , 'Dissolved Oxygen Concentration ', 'mol-C/L' , .true. , .false., .false., .false. , .false. + sn_tracer(4) = 'POC ' , 'Small organic carbon Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(5) = 'PHY ' , 'Nanophytoplankton Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(6) = 'ZOO ' , 'Microzooplankton Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(7) = 'DOC ' , 'Dissolved organic Concentration ', 'mol-C/L' , .true. , .false., .true. , .false. , .false. + sn_tracer(8) = 'NO3 ' , 'Nitrates Concentration ', 'mol-C/L' , .true. , .true. , .true. , .false. , .false. + sn_tracer(9) = 'Fer ' , 'Dissolved Iron Concentration ', 'mol-C/L' , .true. , .true. , .true. , .false. , .true. / !----------------------------------------------------------------------- &namage ! AGE @@ -32,13 +39,15 @@ !----------------------------------------------------------------------- &namtrc_dta ! Initialisation from data input file !----------------------------------------------------------------------- +! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! +! ! ! (if <0 months) ! name ! (logical) ! (T/F) ! 'monthly' ! filename ! pairing ! filename ! / !----------------------------------------------------------------------- &namtrc_adv ! advection scheme for passive tracer (default: NO selection) !----------------------------------------------------------------------- - ln_trcadv_fct = .true. ! FCT scheme - nn_fct_h = 2 ! =2/4, horizontal 2nd / 4th order - nn_fct_v = 2 ! =2/4, vertical 2nd / COMPACT 4th order + ln_trcadv_fct = .true. ! FCT scheme + nn_fct_h = 2 ! =2/4, horizontal 2nd / 4th order + nn_fct_v = 2 ! =2/4, vertical 2nd / COMPACT 4th order / !----------------------------------------------------------------------- &namtrc_ldf ! lateral diffusion scheme for passive tracer (default: NO selection) @@ -48,10 +57,13 @@ !----------------------------------------------------------------------- &namtrc_rad ! treatment of negative concentrations !----------------------------------------------------------------------- - ln_trcrad = .false. ! artificially correct negative concentrations (T) or not (F) / !----------------------------------------------------------------------- -&namtrc_dmp ! passive tracer newtonian damping (ln_trcdmp=T) +&namtrc_snk ! sedimentation of particles +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_dmp ! passive tracer newtonian damping !----------------------------------------------------------------------- / !----------------------------------------------------------------------- @@ -65,8 +77,14 @@ !---------------------------------------------------------------------- &namtrc_bc ! data for boundary conditions !----------------------------------------------------------------------- +! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! +! ! ! (if <0 months) ! name ! (logical) ! (T/F) ! 'monthly' ! filename ! pairing ! filename ! / !---------------------------------------------------------------------- &namtrc_bdy ! Setup of tracer boundary conditions !----------------------------------------------------------------------- / +!----------------------------------------------------------------------- +&namtrc_ais ! Representation of Antarctic Ice Sheet tracers supply +!----------------------------------------------------------------------- +/ diff --git a/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_pisces_cfg b/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_pisces_cfg index f67b07c4201e8ffed4eec3f2454fe6077d89f1c4..fc9c8ab4f4caef2a09e72765d8ebb6c2bd32bf1c 100644 --- a/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_pisces_cfg +++ b/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_pisces_cfg @@ -1,6 +1,9 @@ !----------------------------------------------------------------------- &nampismod ! Model used !----------------------------------------------------------------------- + ln_p2z = .false. ! PISCES SIMPLIFIED model used + ln_p4z = .true. ! PISCES model used + ln_p5z = .false. ! PISCES QUOTA model used / !----------------------------------------------------------------------- &nampisext ! air-sea exchange @@ -107,35 +110,3 @@ &nampismass ! Mass conservation !----------------------------------------------------------------------- / -!----------------------------------------------------------------------- -&namlobphy ! biological parameters for phytoplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobnut ! biological parameters for nutrients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobzoo ! biological parameters for zooplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdet ! biological parameters for detritus -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdom ! biological parameters for DOM -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobsed ! parameters from aphotic layers to sediment -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobrat ! general coefficients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobopt ! optical parameters -!----------------------------------------------------------------------- -/ diff --git a/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_pisces_cfg b/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_pisces_cfg index c888c78677af394365dd9138855c664196294080..439aa4cc58b8c3707da6bfdbb809f2b036efe67d 100644 --- a/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_pisces_cfg +++ b/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_pisces_cfg @@ -1,6 +1,9 @@ !----------------------------------------------------------------------- &nampismod ! Model used !----------------------------------------------------------------------- + ln_p2z = .false. ! PISCES SIMPLIFIED model used + ln_p4z = .true. ! PISCES model used + ln_p5z = .false. ! PISCES QUOTA model used / !----------------------------------------------------------------------- &nampisext ! air-sea exchange @@ -108,35 +111,3 @@ &nampismass ! Mass conservation !----------------------------------------------------------------------- / -!----------------------------------------------------------------------- -&namlobphy ! biological parameters for phytoplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobnut ! biological parameters for nutrients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobzoo ! biological parameters for zooplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdet ! biological parameters for detritus -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdom ! biological parameters for DOM -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobsed ! parameters from aphotic layers to sediment -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobrat ! general coefficients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobopt ! optical parameters -!----------------------------------------------------------------------- -/ diff --git a/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_top_cfg_p2z b/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_top_cfg_p2z new file mode 100644 index 0000000000000000000000000000000000000000..e11a6d2fcf7dd962eb8e0ea023762026f068df5e --- /dev/null +++ b/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_top_cfg_p2z @@ -0,0 +1,118 @@ +!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +!! NEMO/TOP1 : Configuration namelist : used to overwrite defaults values defined in SHARED/namelist_top_ref +!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +!----------------------------------------------------------------------- +&namtrc_run ! run information +!----------------------------------------------------------------------- + ln_top_euler = .true. +/ +!----------------------------------------------------------------------- +&namtrc ! tracers definition +!----------------------------------------------------------------------- + jp_bgc = 9 +! + ln_pisces = .true. + ln_my_trc = .false. + ln_age = .false. + ln_cfc11 = .false. + ln_cfc12 = .false. + ln_c14 = .false. +! + ln_trcdta = .true. ! Initialisation from data input file (T) or not (F) + ln_trcbc = .true. ! Enables Boundary conditions +! ! ! ! ! ! +! ! name ! title of the field ! units ! init ! sbc ! cbc ! obc ! ais + sn_tracer(1) = 'DIC ' , 'Dissolved inorganic Concentration ', 'mol-C/L' , .true. , .false., .true. , .false. , .false. + sn_tracer(2) = 'Alkalini' , 'Total Alkalinity Concentration ', 'eq/L ' , .true. , .false., .true. , .false. , .false. + sn_tracer(3) = 'O2 ' , 'Dissolved Oxygen Concentration ', 'mol-C/L' , .true. , .false., .false., .false. , .false. + sn_tracer(4) = 'POC ' , 'Small organic carbon Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(5) = 'PHY ' , 'Nanophytoplankton Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(6) = 'ZOO ' , 'Microzooplankton Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(7) = 'DOC ' , 'Dissolved organic Concentration ', 'mol-C/L' , .true. , .false., .true. , .false. , .false. + sn_tracer(8) = 'NO3 ' , 'Nitrates Concentration ', 'mol-C/L' , .true. , .true. , .true. , .false. , .false. + sn_tracer(9) = 'Fer ' , 'Dissolved Iron Concentration ', 'mol-C/L' , .true. , .true. , .true. , .false. , .true. +/ +!----------------------------------------------------------------------- +&namage ! AGE +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_dta ! Initialisation from data input file +!----------------------------------------------------------------------- +! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! +! ! ! (if <0 months) ! name ! (logical) ! (T/F) ! 'monthly' ! filename ! pairing ! filename ! + sn_trcdta(1) = 'data_DIC_nomask.nc', -12 , 'PiDIC' , .false. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(2) = 'data_ALK_nomask.nc', -12 , 'TALK' , .false. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(3) = 'data_OXY_nomask.nc', -1 , 'O2' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(7) = 'data_DOC_nomask.nc', -1 , 'DOC' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(8) = 'data_FER_nomask.nc', -1 , 'Fer' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(9) = 'data_NO3_nomask.nc', -1 , 'NO3' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + rn_trfac(1) = 1.028e-06 ! multiplicative factor + rn_trfac(2) = 1.028e-06 ! - - - - + rn_trfac(3) = 44.6e-06 ! - - - - + rn_trfac(7) = 1.0e-06 ! - - - - + rn_trfac(8) = 7.3125e-06 ! - - - - + rn_trfac(9) = 1.0e-06 ! - - - - +/ +!----------------------------------------------------------------------- +&namtrc_adv ! advection scheme for passive tracer (default: NO selection) +!----------------------------------------------------------------------- + ln_trcadv_mus = .true. ! MUSCL scheme + ln_mus_ups = .false. ! use upstream scheme near river mouths +/ +!----------------------------------------------------------------------- +&namtrc_ldf ! lateral diffusion scheme for passive tracer (default: NO selection) +!----------------------------------------------------------------------- + ln_trcldf_tra = .true. ! use active tracer setting +/ +!----------------------------------------------------------------------- +&namtrc_rad ! treatment of negative concentrations +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_snk ! sedimentation of particles +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_dmp ! passive tracer newtonian damping +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_ice ! Representation of sea ice growth & melt effects +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_trd ! diagnostics on tracer trends ('key_trdtrc') +!---------------------------------------------------------------------- +/ +!---------------------------------------------------------------------- +&namtrc_bc ! data for boundary conditions +!----------------------------------------------------------------------- +! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! +! ! ! (if <0 months) ! name ! (logical) ! (T/F) ! 'monthly' ! filename ! pairing ! filename ! + sn_trcsbc(8) = 'ndeposition.orca', -12 , 'ndep' , .false. , .true. , 'yearly' , '' , '' , '' + sn_trcsbc(9) = 'dust.orca.new' , -1 , 'dustfer' , .true. , .true. , 'yearly' , '' , '' , '' + rn_trsfac(8) = 5.2232143e-01 ! ( From kgN m-2 s-1 to molC l-1 ====> zfact = 7.3125/14 ) + rn_trsfac(9) = 6.2667860e-04 ! ( 0.035 / 55.85 ) + rn_sbc_time = 1. ! Time scaling factor for SBC and CBC data (seconds in a day) + ! + sn_trccbc(1) = 'river.orca' , 120 , 'riverdic' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(2) = 'river.orca' , 120 , 'riverdic' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(7) = 'river.orca' , 120 , 'riverdoc' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(8) = 'river.orca' , 120 , 'riverdin' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(9) = 'river.orca' , 120 , 'riverdic' , .true. , .true. , 'yearly' , '' , '' , '' + rn_trcfac(1) = 8.333333e+01 ! ( data in Mg/m2/yr : 1e3/12/ryyss) + rn_trcfac(2) = 8.333333e+01 ! ( 1e3 /12 ) + rn_trcfac(7) = 8.333333e+01 ! ( 1e3 / 12 + rn_trcfac(8) = 5.223214e+02 ! ( 1e3 / 14 * 7.3125 ) + rn_trcfac(9) = 4.166667e-03 ! ( 1e3 / 12 * 5e-5 ) + rn_cbc_time = 3.1536e+7 ! Time scaling factor for CBC data (seconds in a year) +/ +!---------------------------------------------------------------------- +&namtrc_bdy ! Setup of tracer boundary conditions +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_ais ! Representation of Antarctic Ice Sheet tracers supply +!----------------------------------------------------------------------- +/ diff --git a/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_top_cfg_p5z b/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_top_cfg_p5z new file mode 100644 index 0000000000000000000000000000000000000000..848e98cfce884a05ec1e844ca503fd9f04663554 --- /dev/null +++ b/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_top_cfg_p5z @@ -0,0 +1,169 @@ +!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +!! NEMO/TOP1 : Configuration namelist : used to overwrite defaults values defined in SHARED/namelist_top_ref +!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +!----------------------------------------------------------------------- +&namtrc_run ! run information +!----------------------------------------------------------------------- + ln_top_euler = .true. +/ +!----------------------------------------------------------------------- +&namtrc ! tracers definition +!----------------------------------------------------------------------- + jp_bgc = 40 +! + ln_pisces = .true. + ln_my_trc = .false. + ln_age = .false. + ln_cfc11 = .false. + ln_cfc12 = .false. + ln_c14 = .false. +! + ln_trcdta = .true. ! Initialisation from data input file (T) or not (F) + ln_trcbc = .true. ! Enables Boundary conditions +! ! ! ! ! ! +! ! name ! title of the field ! units ! init ! sbc ! cbc ! obc ! ais + sn_tracer(1) = 'DIC ' , 'Dissolved inorganic Concentration ', 'mol-C/L' , .true. , .false., .true. , .false. , .false. + sn_tracer(2) = 'Alkalini' , 'Total Alkalinity Concentration ', 'eq/L ' , .true. , .false., .true. , .false. , .false. + sn_tracer(3) = 'O2 ' , 'Dissolved Oxygen Concentration ', 'mol-C/L' , .true. , .false., .false., .false. , .false. + sn_tracer(4) = 'CaCO3 ' , 'Calcite Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(5) = 'PO4 ' , 'Phosphate Concentration ', 'mol-C/L' , .true. , .true. , .true. , .false. , .false. + sn_tracer(6) = 'POC ' , 'Small organic carbon Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(7) = 'Si ' , 'Silicate Concentration ', 'mol-C/L' , .true. , .true. , .true. , .false. , .false. + sn_tracer(8) = 'PHY ' , 'Nanophytoplankton Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(9) = 'ZOO ' , 'Microzooplankton Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(10) = 'DOC ' , 'Dissolved organic Concentration ', 'mol-C/L' , .true. , .false., .true. , .false. , .false. + sn_tracer(11) = 'PHY2 ' , 'Diatoms Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(12) = 'ZOO2 ' , 'Mesozooplankton Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(13) = 'DSi ' , 'Diatoms Silicate Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(14) = 'Fer ' , 'Dissolved Iron Concentration ', 'mol-C/L' , .true. , .true. , .true. , .false. , .true. + sn_tracer(15) = 'BFe ' , 'Big iron particles Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(16) = 'GOC ' , 'Big organic carbon Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(17) = 'SFe ' , 'Small iron particles Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(18) = 'DFe ' , 'Diatoms iron Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(19) = 'GSi ' , 'Sinking biogenic Silicate Concentration', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(20) = 'NFe ' , 'Nano iron Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(21) = 'NCHL ' , 'Nano chlorophyl Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(22) = 'DCHL ' , 'Diatoms chlorophyl Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(23) = 'NO3 ' , 'Nitrates Concentration ', 'mol-C/L' , .true. , .true. , .true. , .false. , .false. + sn_tracer(24) = 'NH4 ' , 'Ammonium Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(25) = 'DON ' , 'Dissolved Organic N Concentration ', 'mol-C/L' , .true. , .false., .true. , .false. , .false. + sn_tracer(26) = 'DOP ' , 'Dissolved organic P Concentration ', 'mol-C/L' , .true. , .false., .true. , .false. , .false. + sn_tracer(27) = 'PON ' , 'Small PON Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(28) = 'POP ' , 'Small POP Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(29) = 'PHYN ' , 'PHYN Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(30) = 'PHYP ' , 'PHYP Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(31) = 'DIAN ' , 'DIAN Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(32) = 'DIAP ' , 'DIAP Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(33) = 'PIC ' , 'PICO Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(34) = 'PICN ' , 'PICO N Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(35) = 'PICP ' , 'PICO P Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(36) = 'PFe ' , 'PICO Fe Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(37) = 'PCHL ' , 'PICO Chl Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(38) = 'GON ' , 'Big PON Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(39) = 'GOP ' , 'Big POP Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false. + sn_tracer(40) = 'LGW ' , 'Weak ligands Concentration ', 'mol-C/L' , .false. , .false., .false., .false. , .false +/ +!----------------------------------------------------------------------- +&namage ! AGE +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_dta ! Initialisation from data input file +!----------------------------------------------------------------------- +! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! +! ! ! (if <0 months) ! name ! (logical) ! (T/F) ! 'monthly' ! filename ! pairing ! filename ! + sn_trcdta(1) = 'data_DIC_nomask.nc', -12 , 'PiDIC' , .false. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(2) = 'data_ALK_nomask.nc', -12 , 'TALK' , .false. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(3) = 'data_OXY_nomask.nc', -1 , 'O2' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(5) = 'data_PO4_nomask.nc', -1 , 'PO4' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(7) = 'data_SIL_nomask.nc', -1 , 'Si' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(10) = 'data_DOC_nomask.nc', -1 , 'DOC' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(14) = 'data_FER_nomask.nc', -1 , 'Fer' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(23) = 'data_NO3_nomask.nc', -1 , 'NO3' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(25) = 'data_DOC_nomask.nc', -1 , 'DOC' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + sn_trcdta(26) = 'data_DOC_nomask.nc', -1 , 'DOC' , .true. , .true. , 'yearly' , 'weights_3D_r360x180_bilin.nc' , '' , '' + rn_trfac(1) = 1.028e-06 ! multiplicative factor + rn_trfac(2) = 1.028e-06 ! - - - - + rn_trfac(3) = 44.6e-06 ! - - - - + rn_trfac(5) = 117.0e-06 ! - - - - + rn_trfac(7) = 1.0e-06 ! - - - - + rn_trfac(10) = 1.0e-06 ! - - - - + rn_trfac(14) = 1.0e-06 ! - - - - + rn_trfac(23) = 7.3125e-06 ! - - - - + rn_trfac(25) = 1.0e-06 ! - - - - + rn_trfac(26) = 1.0e-06 ! - - - - +/ +!----------------------------------------------------------------------- +&namtrc_adv ! advection scheme for passive tracer (default: NO selection) +!----------------------------------------------------------------------- + ln_trcadv_mus = .true. ! MUSCL scheme + ln_mus_ups = .false. ! use upstream scheme near river mouths +/ +!----------------------------------------------------------------------- +&namtrc_ldf ! lateral diffusion scheme for passive tracer (default: NO selection) +!----------------------------------------------------------------------- + ln_trcldf_tra = .true. ! use active tracer setting +/ +!----------------------------------------------------------------------- +&namtrc_rad ! treatment of negative concentrations +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_snk ! sedimentation of particles +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_dmp ! passive tracer newtonian damping +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_ice ! Representation of sea ice growth & melt effects +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_trd ! diagnostics on tracer trends ('key_trdtrc') +!---------------------------------------------------------------------- +/ +!---------------------------------------------------------------------- +&namtrc_bc ! data for boundary conditions +!----------------------------------------------------------------------- +! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! +! ! ! (if <0 months) ! name ! (logical) ! (T/F) ! 'monthly' ! filename ! pairing ! filename ! + sn_trcsbc(5) = 'dust.orca.new' , -1 , 'dustpo4' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trcsbc(7) = 'dust.orca.new' , -1 , 'dustsi' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trcsbc(14) = 'dust.orca.new' , -1 , 'dustfer' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trcsbc(23) = 'ndeposition.orca', -12 , 'ndep' , .false. , .true. , 'yearly' , '' , '' , '' + rn_trsfac(5) = 3.774194e-02 ! ( 1E-3 / 31. * 117 ) + rn_trsfac(7) = 9.572954e-03 ! ( 8.8 / 28.1 ) + rn_trsfac(14) = 6.2667860e-04 ! ( 0.035 / 55.85 ) + rn_trsfac(23) = 5.2232143e-01 ! ( From kgN m-2 s-1 to molC l-1 ====> zfact = 7.3125/14 ) + rn_sbc_time = 1. ! Time scaling factor for SBC and CBC data (seconds in a day) + ! + sn_trccbc(1) = 'river.orca' , 120 , 'riverdic' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(2) = 'river.orca' , 120 , 'riverdic' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(5) = 'river.orca' , 120 , 'riverdip' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(7) = 'river.orca' , 120 , 'riverdsi' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(10) = 'river.orca' , 120 , 'riverdoc' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(14) = 'river.orca' , 120 , 'riverdic' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(23) = 'river.orca' , 120 , 'riverdin' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(25) = 'river.orca' , 120 , 'riverdon' , .true. , .true. , 'yearly' , '' , '' , '' + sn_trccbc(26) = 'river.orca' , 120 , 'riverdop' , .true. , .true. , 'yearly' , '' , '' , '' + rn_trcfac(1) = 8.333333e+01 ! ( data in Mg/m2/yr : 1e3/12/ryyss) + rn_trcfac(2) = 8.333333e+01 ! ( 1e3 /12 ) + rn_trcfac(5) = 3.774193e+03 ! ( 1e3 / 31. * 117 ) + rn_trcfac(7) = 3.558719e+01 ! ( 1e3 / 28.1 ) + rn_trcfac(10) = 8.333333e+01 ! ( 1e3 / 12 + rn_trcfac(14) = 4.166667e-03 ! ( 1e3 / 12 * 5e-5 ) + rn_trcfac(23) = 5.223214e+02 ! ( 1e3 / 14 * 7.3125 ) + rn_trcfac(25) = 8.333333e+01 ! ( 1e3 / 12 ) + rn_trcfac(26) = 8.333333e+01 ! ( 1e3 / 12 ) + rn_cbc_time = 3.1536e+7 ! Time scaling factor for CBC data (seconds in a year) +/ +!---------------------------------------------------------------------- +&namtrc_bdy ! Setup of tracer boundary conditions +!----------------------------------------------------------------------- +/ +!----------------------------------------------------------------------- +&namtrc_ais ! Representation of Antarctic Ice Sheet tracers supply +!----------------------------------------------------------------------- +/ diff --git a/cfgs/SHARED/field_def_nemo-pisces.xml b/cfgs/SHARED/field_def_nemo-pisces.xml index a24903779d7c1565d18919c54835c1c2162d33d5..193e986bf37c549700081307e78c5febea97b6f7 100644 --- a/cfgs/SHARED/field_def_nemo-pisces.xml +++ b/cfgs/SHARED/field_def_nemo-pisces.xml @@ -105,12 +105,6 @@ <field id="LGW" long_name="Weak ligands concentration" unit="mmol/m3" /> <field id="LGW_e3t" long_name="LGW * e3t" unit="mmol/m2" > LGW * e3t </field > - <!-- PISCES light : variables available with ln_p2z --> - <field id="DET" long_name="Detritus" unit="mmol-N/m3" /> - <field id="DET_e3t" long_name="DET * e3t" unit="mmol-N/m2" > DET * e3t </field > - <field id="DOM" long_name="Dissolved Organic Matter" unit="mmol-N/m3" /> - <field id="DOM_e3t" long_name="DOM * e3t" unit="mmol-N/m2" > DOM * e3t </field > - </field_group> <!-- SEDIMENT variables on T sediment grid --> @@ -184,6 +178,9 @@ <field id="PPNEWN" long_name="New Primary production of nanophyto" unit="molC/m3/s" grid_ref="grid_T_3D_inner" /> <field id="PPNEWP" long_name="New Primary production of picophyto" unit="molC/m3/s" grid_ref="grid_T_3D_inner" /> <field id="PPNEWD" long_name="New Primary production of diatoms" unit="molC/m3/s" grid_ref="grid_T_3D_inner" /> + <field id="GPPHYN" long_name="Gross Primary production of nanophyto" unit="molC/m3/s" grid_ref="grid_T_3D_inner" /> + <field id="GPPHYP" long_name="Gross Primary production of picophyto" unit="molC/m3/s" grid_ref="grid_T_3D_inner" /> + <field id="GPPHYD" long_name="Gross Primary production of diatoms" unit="molC/m3/s" grid_ref="grid_T_3D_inner" /> <field id="PBSi" long_name="Primary production of Si diatoms" unit="molC/m3/s" grid_ref="grid_T_3D_inner" /> <field id="PFeN" long_name="Primary production of nano iron" unit="molC/m3/s" grid_ref="grid_T_3D_inner" /> <field id="PFeP" long_name="Primary production of pico iron" unit="molC/m3/s" grid_ref="grid_T_3D_inner" /> @@ -216,6 +213,7 @@ <field id="SIZEN" long_name="Mean relative size of nanophyto." unit="-" grid_ref="grid_T_3D_inner" /> <field id="SIZEP" long_name="Mean relative size of picophyto." unit="-" grid_ref="grid_T_3D_inner" /> <field id="SIZED" long_name="Mean relative size of diatoms" unit="-" grid_ref="grid_T_3D_inner" /> + <field id="THETANANO" long_name="Diagnostic Chl:C ratio" unit="mgChl/mgC" grid_ref="grid_T_3D_inner" /> <field id="RASSD" long_name="Size of the protein machinery (Diat.)" unit="-" grid_ref="grid_T_3D_inner" /> <field id="RASSN" long_name="Size of the protein machinery (Nano.)" unit="-" grid_ref="grid_T_3D_inner" /> <field id="RASSP" long_name="Size of the protein machinery (Pico.)" unit="-" grid_ref="grid_T_3D_inner" /> @@ -299,28 +297,6 @@ <field id="INTPBFE" long_name="Vertically integrated of biogenic iron production" field_ref="TPBFE_e3t" unit="mol/m2/s" grid_ref="grid_T_vsum" detect_missing_value="true" /> <field id="INTPBSI" long_name="Vertically integrated of biogenic Si production" field_ref="PBSi_e3t" unit="mol/m2/s" grid_ref="grid_T_vsum" detect_missing_value="true" /> - <!-- PISCES light : variables available with key_pisces_reduced --> - <field id="FNO3PHY" long_name="FNO3PHY" unit="" grid_ref="grid_T_3D_inner" /> - <field id="FNH4PHY" long_name="FNH4PHY" unit="" grid_ref="grid_T_3D_inner" /> - <field id="FNH4NO3" long_name="FNH4NO3" unit="" grid_ref="grid_T_3D_inner" /> - <field id="TNO3PHY" long_name="TNO3PHY" unit="" /> - <field id="TNH4PHY" long_name="TNH4PHY" unit="" /> - <field id="TPHYDOM" long_name="TPHYDOM" unit="" /> - <field id="TPHYNH4" long_name="TPHYNH4" unit="" /> - <field id="TPHYZOO" long_name="TPHYZOO" unit="" /> - <field id="TPHYDET" long_name="TPHYDET" unit="" /> - <field id="TDETZOO" long_name="TDETZOO" unit="" /> - <field id="TZOODET" long_name="TZOODET" unit="" /> - <field id="TZOOBOD" long_name="TZOOBOD" unit="" /> - <field id="TZOONH4" long_name="TZOONH4" unit="" /> - <field id="TZOODOM" long_name="TZOODOM" unit="" /> - <field id="TNH4NO3" long_name="TNH4NO3" unit="" /> - <field id="TDOMNH4" long_name="TDOMNH4" unit="" /> - <field id="TDETNH4" long_name="TDETNH4" unit="" /> - <field id="TPHYTOT" long_name="TPHYTOT" unit="" /> - <field id="TZOOTOT" long_name="TZOOTOT" unit="" /> - <field id="SEDPOC" long_name="SEDPOC" unit="" /> - <field id="TDETSED" long_name="TDETSED" unit="" /> </field_group> <field_group id="tracer_scalar" grid_ref="grid_scalar" > diff --git a/cfgs/SHARED/namelist_pisces_ref b/cfgs/SHARED/namelist_pisces_ref index 10aff870eab7ba858ad399fb796d591282357b67..f2f0a229a89c6c3711f2b9cc06a16166ed17d6c5 100644 --- a/cfgs/SHARED/namelist_pisces_ref +++ b/cfgs/SHARED/namelist_pisces_ref @@ -13,8 +13,8 @@ &nampismod ! Model used !----------------------------------------------------------------------- ln_p2z = .false. ! LOBSTER model used - ln_p4z = .true. ! PISCES model used - ln_p5z = .false. ! PISCES QUOTA model used + ln_p4z = .true. ! PISCES model used + ln_p5z = .false. ! PISCES QUOTA model used ln_ligand = .false. ! Enable organic ligands ln_sediment = .false. ! Enable sediment module / @@ -44,7 +44,7 @@ &nampisbio ! biological parameters !----------------------------------------------------------------------- nrdttrc = 1 ! time step frequency for biology - wsbio = 2. ! POC sinking speed + wsbio = 2. ! POC sinking speed xkmort = 1.E-7 ! half saturation constant for mortality feratz = 10.E-6 ! Fe/C in zooplankton feratm = 15.E-6 ! Fe/C in mesozooplankton @@ -56,8 +56,21 @@ ldocz = 1.E-4 ! Zoo ligand production per unit doc lthet = 1.0 ! Proportional loss of ligands due to Fe uptake ! ! ln_p5z enabled - no3rat3 = 0.151 ! N/C ratio in zooplankton - po4rat3 = 0.00943 ! P/C ratio in zooplankton + no3rat3 = 0.1367 ! N/C ratio in zooplankton + po4rat3 = 0.00855 ! P/C ratio in zooplankton +/ +!----------------------------------------------------------------------- +&namp2zlim ! parameters for nutrient limitations for PISCES reduced - ln_p2z +!----------------------------------------------------------------------- + concnno3 = 1.e-6 ! Nitrate half saturation of nanophytoplankton + concnfer = 1E-10 ! Iron half saturation for phyto + concbno3 = 3.E-7 ! Nitrate half saturation for DOC remin. + concbfe = 3.E-11 ! Iron half-saturation for DOC remin. + xsizephy = 2.E-6 ! Minimum size criteria for phyto + xsizern = 10.0 ! Size ratio for nanophytoplankton + xkdoc = 417.E-6 ! half-saturation constant of DOC remineralization + caco3r = 0.07 ! mean rain ratio + oxymin = 1.E-6 ! Half-saturation constant for anoxia / !----------------------------------------------------------------------- &namp4zlim ! parameters for nutrient limitations for PISCES std - ln_p4z @@ -66,8 +79,8 @@ concdno3 = 3.E-6 ! Nitrate half saturation for diatoms concnnh4 = 1.E-6 ! NH4 half saturation for phyto concdnh4 = 3.E-6 ! NH4 half saturation for diatoms - concnfer = 1.7E-9 ! Iron half saturation for phyto - concdfer = 5.E-9 ! Iron half saturation for diatoms + concnfer = 1.5E-9 ! Iron half saturation for phyto + concdfer = 4.5E-9 ! Iron half saturation for diatoms concbfe = 3.E-11 ! Iron half-saturation for DOC remin. concbnh4 = 3.E-7 ! NH4 half saturation for DOC remin. concbno3 = 3.E-7 ! Nitrate half saturation for DOC remin. @@ -82,6 +95,7 @@ qdfelim = 10.E-6 ! Optimal quota of diatoms caco3r = 0.2 ! mean rain ratio oxymin = 1.E-6 ! Half-saturation constant for anoxia + ratchl = 10.0 ! C associated with Chlorophyll / !----------------------------------------------------------------------- &namp5zlim ! parameters for nutrient limitations PISCES QUOTA - ln_p5z @@ -92,16 +106,16 @@ concnnh4 = 2E-6 ! NH4 half saturation for phyto concpnh4 = 7E-7 ! NH4 half saturation for picophytoplankton concdnh4 = 3E-6 ! NH4 half saturation for diatoms - concnpo4 = 2E-6 ! PO4 half saturation for phyto - concppo4 = 7E-7 ! PO4 half saturation for picophytoplankton - concdpo4 = 3E-6 ! PO4 half saturation for diatoms + concnpo4 = 6E-6 ! PO4 half saturation for phyto + concppo4 = 2E-6 ! PO4 half saturation for picophytoplankton + concdpo4 = 9E-6 ! PO4 half saturation for diatoms concnfer = 3E-9 ! Iron half saturation for phyto concpfer = 1E-9 ! Iron half saturation for picophytoplankton concdfer = 4.5E-9 ! Iron half saturation for diatoms concbfe = 3E-11 ! Half-saturation for Fe limitation of Bacteria - concbnh4 = 4.E-7 ! NH4 half saturation for phyto - concbno3 = 4.E-7 ! Phosphate half saturation for diatoms - concbpo4 = 4.E-7 ! Phosphate half saturation for bacteria + concbnh4 = 3.E-7 ! NH4 half saturation for phyto + concbno3 = 3.E-7 ! Phosphate half saturation for diatoms + concbpo4 = 3.E-7 ! Phosphate half saturation for bacteria xsizedia = 1.E-6 ! Minimum size criteria for diatoms xsizephy = 1.E-6 ! Minimum size criteria for phyto xsizepic = 5.E-7 ! Minimum size criteria for picophyto @@ -111,27 +125,28 @@ xksi1 = 8.E-6 ! half saturation constant for Si uptake xksi2 = 20E-6 ! half saturation constant for Si/C xkdoc = 417.E-6 ! half-saturation constant of DOC remineralization - caco3r = 0.3 ! mean rain ratio + caco3r = 0.4 ! mean rain ratio oxymin = 1.E-6 ! Half-saturation constant for anoxia + ratchl = 10.0 ! C associated with Chlorophyll / !----------------------------------------------------------------------- &namp5zquota ! parameters for nutrient limitations PISCES quota - ln_p5z !----------------------------------------------------------------------- - qfnopt = 12.E-6 ! Optimal Fe quota of nanophyto - qfpopt = 12.E-6 ! Optimal Fe quota of picophyto - qfdopt = 12.E-6 ! Optimal quota of diatoms - qnnmin = 0.61 ! Minimal N quota for nano - qnnmax = 1.25 ! Maximal N quota for nano + qfnopt = 10.E-6 ! Optimal Fe quota of nanophyto + qfpopt = 10.E-6 ! Optimal Fe quota of picophyto + qfdopt = 10.E-6 ! Optimal quota of diatoms + qnnmin = 0.69 ! Minimal N quota for nano + qnnmax = 1.35 ! Maximal N quota for nano qpnmin = 0.24 ! Minimal P quota for nano - qpnmax = 1.35 ! Maximal P quota for nano - qnpmin = 1.02 ! Minimal N quota for pico - qnpmax = 1.39 ! Maximal N quota for pico - qppmin = 0.19 ! Minimal P quota for pico - qppmax = 1.15 ! Maximal P quota for pico - qndmin = 0.51 ! Minimal N quota for diatoms - qndmax = 1.25 ! Maximal N quota for diatoms + qpnmax = 1.3 ! Maximal P quota for nano + qnpmin = 0.9 ! Minimal N quota for pico + qnpmax = 1.35 ! Maximal N quota for pico + qppmin = 0.2 ! Minimal P quota for pico + qppmax = 1.1 ! Maximal P quota for pico + qndmin = 0.63 ! Minimal N quota for diatoms + qndmax = 1.35 ! Maximal N quota for diatoms qpdmin = 0.24 ! Minimal P quota for diatoms - qpdmax = 1.525 ! Maximal P quota for diatoms + qpdmax = 1.67 ! Maximal P quota for diatoms qfnmax = 60E-6 ! Maximal Fe quota for nano qfpmax = 60E-6 ! Maximal Fe quota for pico qfdmax = 60E-6 ! Maximal Fe quota for diatoms @@ -148,17 +163,23 @@ ln_p4z_dcyc = .false. ! Diurnal cycle in PISCES / !----------------------------------------------------------------------- +&namp2zprod ! parameters for phytoplankton growth for PISCES reduced - ln_p2z +!----------------------------------------------------------------------- + pislopen = 4. ! P-I slope + excretn = 0.05 ! excretion ratio of phytoplankton + bresp = 0.03 ! Basal respiration rate + chlcnm = 0.033 ! Maximum Chl/C in nanophytoplankton + chlcmin = 0.0025 ! Minimum Chl/c in phytoplankton +/ +!----------------------------------------------------------------------- &namp4zprod ! parameters for phytoplankton growth for PISCES std - ln_p4z !----------------------------------------------------------------------- - pislopen = 2. ! P-I slope - pisloped = 2. ! P-I slope for diatoms - xadap = 0. ! Adaptation factor to low light + pislopen = 3. ! P-I slope + pisloped = 3. ! P-I slope for diatoms excretn = 0.05 ! excretion ratio of phytoplankton excretd = 0.05 ! excretion ratio of diatoms - bresp = 0.033 ! Basal respiration rate - chlcnm = 0.033 ! Maximum Chl/C in nanophytoplankton - chlcdm = 0.05 ! Maximum Chl/C in diatoms - chlcmin = 0.003 ! Minimum Chl/c in phytoplankton + bresp = 0.03 ! Basal respiration rate + chlcmin = 0.0025 ! Minimum Chl/c in phytoplankton fecnm = 60E-6 ! Maximum Fe/C in nanophytoplankton fecdm = 60E-6 ! Maximum Fe/C in diatoms grosip = 0.13 ! mean Si/C ratio @@ -172,13 +193,15 @@ excretn = 0.05 ! excretion ratio of phytoplankton excretp = 0.05 ! excretion ratio of picophytoplankton excretd = 0.05 ! excretion ratio of diatoms - xadap = 0. ! Adaptation factor to low light - bresp = 0.02 ! Basal respiration rate - thetannm = 0.3 ! Maximum Chl/N in nanophytoplankton - thetanpm = 0.3 ! Maximum Chl/N in picophytoplankton - thetandm = 0.4 ! Maximum Chl/N in diatoms - chlcmin = 0.003 ! Minimum Chl/c in phytoplankton - grosip = 0.12 ! mean Si/C ratio + bresp = 0.03 ! Basal respiration rate + chlcmin = 0.0025 ! Minimum Chl/c in phytoplankton + grosip = 0.11 ! mean Si/C ratio +/ +!----------------------------------------------------------------------- +&namp2zmort ! parameters for phytoplankton sinks for PISCES std - ln_p2z +!----------------------------------------------------------------------- + wchln = 0.02 ! quadratic mortality of phytoplankton + mpratn = 0.01 ! phytoplankton mortality rate / !----------------------------------------------------------------------- &namp4zmort ! parameters for phytoplankton sinks for PISCES std - ln_p4z @@ -209,15 +232,17 @@ xpref2n = 0.3 ! mesozoo preference for nanophyto. xpref2z = 1. ! mesozoo preference for microzoo. xpref2c = 0.3 ! mesozoo preference for poc + xpref2m = 0.0 ! mesozoo preference for meso xthresh2zoo = 1E-8 ! zoo feeding threshold for mesozooplankton xthresh2dia = 1E-8 ! diatoms feeding threshold for mesozooplankton xthresh2phy = 1E-8 ! nanophyto feeding threshold for mesozooplankton xthresh2poc = 1E-8 ! poc feeding threshold for mesozooplankton + xthresh2mes = 1E-8 ! meso feeding threshold for mesozooplankton xthresh2 = 3E-7 ! Food threshold for grazing xkgraz2 = 20.E-6 ! half saturation constant for meso grazing epsher2 = 0.4 ! Efficicency of Mesozoo growth epsher2min = 0.4 ! Minimum efficiency of mesozoo growth - sigma2 = 0.6 ! Fraction of mesozoo excretion as DOM + sigma2 = 0.5 ! Fraction of mesozoo excretion as DOM unass2 = 0.3 ! non assimilated fraction of P by mesozoo grazflux = 3.e3 ! flux-feeding rate xsigma2 = 0.5 ! Predation window size @@ -232,7 +257,8 @@ grazrat2 = 0.5 ! maximal mesozoo grazing rate bmetexc2 = .true. ! Metabolic use of excess carbon resrat2 = 0.005 ! exsudation rate of mesozooplankton - mzrat2 = 0.01 ! mesozooplankton mortality rate + lmzrat2 = 0.005 ! Linear mortality rate of mesozooplankton + mzrat2 = 0.015 ! mesozooplankton mortality rate xpref2d = 1. ! meso preference for diatoms xpref2n = 0.3 ! meso preference for nano xpref2z = 1. ! meso preference for zoo @@ -248,7 +274,7 @@ epsher2 = 0.5 ! Efficicency of Mesozoo growth epsher2min = 0.5 ! Minimum efficiency of mesozoo growth ssigma2 = 0.5 ! Fraction excreted as semi-labile DOM - srespir2 = 0.2 ! Active respiration + srespir2 = 0.15 ! Active respiration unass2c = 0.3 ! non assimilated fraction of C by mesozoo unass2n = 0.3 ! non assimilated fraction of N by mesozoo unass2p = 0.3 ! non assimilated fraction of P by mesozoo @@ -259,23 +285,45 @@ xfracmig = 0.25 ! Fraction of mesozooplankton performing DVM / !----------------------------------------------------------------------- +&namp2zzoo ! parameters for microzooplankton for PISCES reduced - ln_p2z +!----------------------------------------------------------------------- + part = 0.75 ! part of calcite not dissolved in microzoo guts + grazrat = 2.0 ! maximal zoo grazing rate + resrat = 0.02 ! Linear mortality rate of zooplankton + mzrat = 0.02 ! zooplankton mortality rate + xprefc = 0.15 ! Microzoo preference for POM + xprefn = 1. ! Microzoo preference for Nanophyto + xprefz = 0.0 ! Microzoo preference for Microzoo + xthreshphy = 1.E-8 ! Nanophyto feeding threshold for microzooplankton + xthreshpoc = 1.E-8 ! POC feeding threshold for microzooplankton + xthreshzoo = 1.E-8 ! Microzoo feeding threshold for microzooplankton + xthresh = 3.E-7 ! Food threshold for feeding + xkgraz = 20.E-6 ! half sturation constant for grazing + epsher = 0.4 ! Efficiency of microzoo growth + epshermin = 0.4 ! Minimum efficiency of microzoo growth + sigma1 = 0.6 ! Fraction of microzoo excretion as DOM + unass = 0.3 ! non assimilated fraction of phyto by zoo +/ +!----------------------------------------------------------------------- &namp4zzoo ! parameters for microzooplankton for PISCES std - ln_p4z !----------------------------------------------------------------------- part = 0.75 ! part of calcite not dissolved in microzoo guts grazrat = 2.0 ! maximal zoo grazing rate resrat = 0.02 ! Linear mortality rate of zooplankton mzrat = 0.005 ! zooplankton mortality rate - xprefc = 0.15 ! Microzoo preference for POM - xprefn = 1. ! Microzoo preference for Nanophyto - xprefd = 0.8 ! Microzoo preference for Diatoms + xprefc = 0.15 ! Microzoo preference for POM + xprefn = 1.0 ! Microzoo preference for Nanophyto + xprefd = 1.0 ! Microzoo preference for Diatoms + xprefz = 0.0 ! Microzoo preference for Microzoo xthreshdia = 1.E-8 ! Diatoms feeding threshold for microzooplankton xthreshphy = 1.E-8 ! Nanophyto feeding threshold for microzooplankton xthreshpoc = 1.E-8 ! POC feeding threshold for microzooplankton + xthreshzoo = 1.E-8 ! Microzoo feeding threshold for microzooplankton xthresh = 3.E-7 ! Food threshold for feeding xkgraz = 20.E-6 ! half sturation constant for grazing - epsher = 0.4 ! Efficiency of microzoo growth - epshermin = 0.4 ! Minimum efficiency of microzoo growth - sigma1 = 0.6 ! Fraction of microzoo excretion as DOM + epsher = 0.4 ! Efficiency of microzoo growth + epshermin = 0.4 ! Minimum efficiency of microzoo growth + sigma1 = 0.5 ! Fraction of microzoo excretion as DOM unass = 0.3 ! non assimilated fraction of phyto by zoo xsigma = 0.5 ! Predation window size xsigmadel = 1.0 ! Predation window size scaling @@ -287,11 +335,12 @@ grazrat = 2.0 ! maximal zoo grazing rate bmetexc = .true. ! Metabolic use of excess carbon resrat = 0.02 ! exsudation rate of zooplankton + lmzrat = 0.02 ! Linear mortality rate of zooplankton mzrat = 0.005 ! zooplankton mortality rate xprefc = 0.15 ! Microzoo preference for POM xprefn = 1.0 ! Microzoo preference for Nanophyto xprefp = 1.0 ! Microzoo preference for picophyto - xprefd = 1.0 ! Microzoo preference for Diatoms + xprefd = 0.9 ! Microzoo preference for Diatoms xprefz = 0. ! Microzoo preference for microzooplankton xthreshdia = 1.E-8 ! Diatoms feeding threshold for microzooplankton xthreshphy = 1.E-8 ! Nanophyto feeding threshold for microzooplankton @@ -303,7 +352,7 @@ epsher = 0.5 ! Efficiency of microzoo growth epshermin = 0.5 ! Minimum efficiency of microzoo growth ssigma = 0.5 ! Fraction excreted as semi-labile DOM - srespir = 0.2 ! Active respiration + srespir = 0.15 ! Active respiration unassc = 0.3 ! non assimilated fraction of C by zoo unassn = 0.3 ! non assimilated fraction of N by zoo unassp = 0.3 ! non assimilated fraction of P by zoo @@ -327,23 +376,22 @@ xsirem = 0.003 ! remineralization rate of Si xsiremlab = 0.03 ! fast remineralization rate of Si xsilab = 0.5 ! Fraction of labile biogenic silica - feratb = 60.E-6 ! Fe/C quota in bacteria - xkferb = 4E-10 ! Half-saturation constant for bacteria Fe/C + feratb = 40.E-6 ! Fe/C quota in bacteria + xkferb = 3E-10 ! Half-saturation constant for bacteria Fe/C ! ! ln_p5z xremikc = 0.4 ! remineralization rate of DOC xremikn = 0.4 ! remineralization rate of DON - xremikp = 0.5 ! remineralization rate of DOP + xremikp = 0.4 ! remineralization rate of DOP / !----------------------------------------------------------------------- &nampispoc ! parameters for organic particles !----------------------------------------------------------------------- - xremip = 0.035 ! remineralisation rate of POC jcpoc = 15 ! Number of lability classes rshape = 1.0 ! Shape of the gamma function ! ! ln_p5z - xremipc = 0.028 ! remineralisation rate of POC - xremipn = 0.03 ! remineralisation rate of PON - xremipp = 0.035 ! remineralisation rate of POP + xremipc = 0.035 ! remineralisation rate of POC + xremipn = 0.032 ! remineralisation rate of PON + xremipp = 0.032 ! remineralisation rate of POP / !----------------------------------------------------------------------- &nampiscal ! parameters for Calcite chemistry @@ -444,83 +492,3 @@ !----------------------------------------------------------------------- ln_check_mass = .false. ! Check mass conservation / -!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -!! PISCES reduced (key_pisces_reduced, ex LOBSTER) : namelists -!! 1 - biological parameters for phytoplankton (namlobphy) -!! 2 - biological parameters for nutrients (namlobnut) -!! 3 - biological parameters for zooplankton (namlobzoo) -!! 4 - biological parameters for detritus (namlobdet) -!! 5 - biological parameters for DOM (namlobdom) -!! 6 - parameters from aphotic layers to sediment (namlobsed) -!! 7 - general coefficients (namlobrat) -!! 8 - optical parameters (namlobopt) -!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -!----------------------------------------------------------------------- -&namlobphy ! biological parameters for phytoplankton -!----------------------------------------------------------------------- - tmumax = 1.21e-5 ! maximal phytoplankton growth rate [s-1] - rgamma = 0.05 ! phytoplankton exudation fraction [%] - fphylab = 0.75 ! NH4 fraction of phytoplankton exsudation - tmminp = 5.8e-7 ! minimal phytoplancton mortality rate [0.05/86400 s-1=20 days] - aki = 33. ! light photosynthesis half saturation constant[W/m2] -/ -!----------------------------------------------------------------------- -&namlobnut ! biological parameters for nutrients -!----------------------------------------------------------------------- - akno3 = 0.7 ! nitrate limitation half-saturation value [mmol/m3] - aknh4 = 0.001 ! ammonium limitation half-saturation value [mmol/m3] - taunn = 5.80e-7 ! nitrification rate [s-1] - psinut = 3. ! inhibition of nitrate uptake by ammonium -/ -!----------------------------------------------------------------------- -&namlobzoo ! biological parameters for zooplankton -!----------------------------------------------------------------------- - rppz = 0.8 ! zooplankton nominal preference for phytoplancton food [%] - taus = 9.26E-6 ! specific zooplankton maximal grazing rate [s-1] -! ! 0.75/86400 s-1=8.680555E-6 1/86400 = 1.15e-5 - aks = 1. ! half-saturation constant for total zooplankton grazing [mmolN.m-3] - rpnaz = 0.3 ! non-assimilated phytoplankton by zooplancton [%] - rdnaz = 0.3 ! non-assimilated detritus by zooplankton [%] - tauzn = 8.1e-7 ! zooplancton specific excretion rate [0.1/86400 s-1=10 days] - fzoolab = 0.5 ! NH4 fraction of zooplankton excretion - fdbod = 0.5 ! zooplankton mortality fraction that goes to detritus - tmminz = 2.31e-6 ! minimal zooplankton mortality rate [(mmolN/m3)-1 d-1] -/ -!----------------------------------------------------------------------- -&namlobdet ! biological parameters for detritus -!----------------------------------------------------------------------- - taudn = 5.80e-7 ! detritus breakdown rate [0.1/86400 s-1=10 days] - fdetlab = 0. ! NH4 fraction of detritus dissolution -/ -!----------------------------------------------------------------------- -&namlobdom ! biological parameters for DOM -!----------------------------------------------------------------------- - taudomn = 6.43e-8 ! DOM breakdown rate [s-1] -! ! slow remineralization rate of semi-labile dom to nh4 (1 month) -/ -!----------------------------------------------------------------------- -&namlobsed ! parameters from aphotic layers to sediment -!----------------------------------------------------------------------- - sedlam = 3.86e-7 ! time coefficient of POC remineralization in sediments [s-1] - sedlostpoc = 0. ! mass of POC lost in sediments - vsed = 3.47e-5 ! detritus sedimentation speed [m/s] - xhr = -0.858 ! coeff for martin''s remineralisation profile -/ -!----------------------------------------------------------------------- -&namlobrat ! general coefficients -!----------------------------------------------------------------------- - rcchl = 60. ! Carbone/Chlorophyl ratio [mgC.mgChla-1] - redf = 6.56 ! redfield ratio (C:N) for phyto - reddom = 6.56 ! redfield ratio (C:N) for DOM -/ -!----------------------------------------------------------------------- -&namlobopt ! optical parameters -!----------------------------------------------------------------------- - xkg0 = 0.0232 ! green absorption coefficient of water - xkr0 = 0.225 ! red absorption coefficent of water - xkgp = 0.074 ! green absorption coefficient of chl - xkrp = 0.037 ! red absorption coefficient of chl - xlg = 0.674 ! green chl exposant for absorption - xlr = 0.629 ! red chl exposant for absorption - rpig = 0.7 ! chla/chla+pheo ratio -/ diff --git a/src/TOP/PISCES/P2Z/p2zbio.F90 b/src/TOP/PISCES/P2Z/p2zbio.F90 deleted file mode 100644 index 4100534f899bafbc79999a5531bc38bcd0f3594b..0000000000000000000000000000000000000000 --- a/src/TOP/PISCES/P2Z/p2zbio.F90 +++ /dev/null @@ -1,474 +0,0 @@ -MODULE p2zbio - !!====================================================================== - !! *** MODULE p2zbio *** - !! TOP : LOBSTER - !!====================================================================== - !! History : - ! 1999-07 (M. Levy) Original code - !! - ! 2000-12 (E. Kestenare) assign a parameter to name individual tracers - !! - ! 2001-03 (M. Levy) LNO3 + dia2d - !! 2.0 ! 2007-12 (C. Deltel, G. Madec) F90 - !!---------------------------------------------------------------------- - !! p2z_bio : - !!---------------------------------------------------------------------- - USE oce_trc ! - USE trc ! - USE sms_pisces ! - USE p2zopt ! - USE trd_oce ! - USE trdtrc ! - ! - USE lbclnk ! - USE prtctl ! Print control for debbuging - USE iom ! - - IMPLICIT NONE - PRIVATE - - PUBLIC p2z_bio ! called in ??? - PUBLIC p2z_bio_init ! called in ??? - - REAL(wp) :: tmumax ! maximal phytoplankton growth rate [s-1] - REAL(wp) :: rgamma ! phytoplankton exudation fraction [%] - REAL(wp) :: fphylab ! NH4 fraction of phytoplankton exsudation - REAL(wp) :: tmminp ! minimal phytoplancton mortality rate [0.05/86400 s-1=20 days] - REAL(wp) :: aki ! light photosynthesis half saturation constant[W/m2] - ! - REAL(wp) :: akno3 ! nitrate limitation half-saturation value [mmol/m3] - REAL(wp) :: aknh4 ! ammonium limitation half-saturation value [mmol/m3] - REAL(wp) :: taunn ! nitrification rate [s-1] - REAL(wp) :: psinut ! inhibition of nitrate uptake by ammonium - ! - REAL(wp) :: taudn ! detritus breakdown rate [0.1/86400 s-1=10 days] - REAL(wp) :: fdetlab ! NH4 fraction of detritus dissolution - ! - REAL(wp) :: taudomn ! DOM breakdown rate [s-1] - ! ! slow remineralization rate of semi-labile dom to nh4 (1 month) - ! - REAL(wp) :: rppz ! ivlev coeff for zoo mortality - REAL(wp) :: taus ! specific zooplankton maximal grazing rate [s-1] - ! ! 0.75/86400 s-1=8.680555E-6 1/86400 = 1.15e-5 - REAL(wp) :: aks ! half-saturation constant for total zooplankton grazing [mmolN.m-3] - REAL(wp) :: rpnaz ! non-assimilated phytoplankton by zooplancton [%] - REAL(wp) :: rdnaz ! non-assimilated detritus by zooplankton [%] - REAL(wp) :: tauzn ! zooplancton specific excretion rate [0.1/86400 s-1=10 days] - REAL(wp) :: tmminz ! minimal zooplankton mortality rate [(mmolN/m3)-1 d-1] - REAL(wp) :: fzoolab ! NH4 fraction of zooplankton excretion - REAL(wp) :: fdbod ! zooplankton mortality fraction that goes to detritus - - !! * Substitutions -# include "do_loop_substitute.h90" -# include "domzgr_substitute.h90" - !!---------------------------------------------------------------------- - !! NEMO/TOP 4.0 , NEMO Consortium (2018) - !! $Id: p2zbio.F90 14433 2021-02-11 08:06:49Z smasson $ - !! Software governed by the CeCILL license (see ./LICENSE) - !!---------------------------------------------------------------------- -CONTAINS - - SUBROUTINE p2z_bio( kt, Kmm, Krhs ) - !!--------------------------------------------------------------------- - !! *** ROUTINE p2z_bio *** - !! - !! ** Purpose : compute the now trend due to biogeochemical processes - !! and add it to the general trend of passive tracers equations - !! - !! ** Method : each now biological flux is calculated in function of now - !! concentrations of tracers. - !! depending on the tracer, these fluxes are sources or sinks. - !! the total of the sources and sinks for each tracer - !! is added to the general trend. - !! - !! tr(Krhs) = tr(Krhs) + zf...tr(Krhs) - zftra... - !! | | - !! | | - !! source sink - !! - !!--------------------------------------------------------------------- - INTEGER, INTENT( in ) :: kt ! ocean time-step index - INTEGER, INTENT( in ) :: Kmm, Krhs ! time level indices - ! - INTEGER :: ji, jj, jk, jl - REAL(wp) :: zdet, zzoo, zphy, zno3, znh4, zdom ! now concentrations - REAL(wp) :: zlno3, zlnh4, zle, zlt ! limitation terms for phyto - REAL(wp) :: zno3phy, znh4phy, zphynh4, zphydom - REAL(wp) :: zphydet, zphyzoo, zdetzoo - REAL(wp) :: zzoonh4, zzoodom, zzoodet, zdetnh4, zdetdom - REAL(wp) :: znh4no3, zdomnh4, zppz, zpdz, zpppz, zppdz, zfood - REAL(wp) :: zfilpz, zfildz, zphya, zzooa, zno3a - REAL(wp) :: znh4a, zdeta, zdoma, zzoobod, zboddet, zdomaju - REAL(wp) :: ze3t - REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw2d - REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: zw3d - CHARACTER (len=25) :: charout - !!--------------------------------------------------------------------- - ! - IF( ln_timing ) CALL timing_start('p2z_bio') - ! - - IF( kt == nittrc000 ) THEN - IF(lwp) WRITE(numout,*) - IF(lwp) WRITE(numout,*) ' p2z_bio: LOBSTER bio-model' - IF(lwp) WRITE(numout,*) ' ~~~~~~~' - ENDIF - - IF( lk_iomput ) THEN - ALLOCATE( zw3d(A2D(0),jpk,3) ) ; zw3d(:,:,jpk,:) = 0._wp - ALLOCATE( zw2d(A2D(0),17) ) ; zw2d(:,:,:) = 0._wp - ENDIF - ! - xksi(:,:) = 0.e0 ! zooplakton closure ( fbod) - - ! ! -------------------------- ! - DO_3D( 0, 0, 0, 0, 1, jpkbm1 ) ! Upper ocean (bio-layers) ! - ! ! -------------------------- ! - ! trophic variables( det, zoo, phy, no3, nh4, dom) - ! ------------------------------------------------ - - ! negative trophic variables DO not contribute to the fluxes - zdet = MAX( 0.e0, tr(ji,jj,jk,jpdet,Kmm) ) - zzoo = MAX( 0.e0, tr(ji,jj,jk,jpzoo,Kmm) ) - zphy = MAX( 0.e0, tr(ji,jj,jk,jpphy,Kmm) ) - zno3 = MAX( 0.e0, tr(ji,jj,jk,jpno3,Kmm) ) - znh4 = MAX( 0.e0, tr(ji,jj,jk,jpnh4,Kmm) ) - zdom = MAX( 0.e0, tr(ji,jj,jk,jpdom,Kmm) ) - - ! Limitations - zlt = 1. - zle = 1. - EXP( -etot(ji,jj,jk) / aki / zlt ) - ! psinut,akno3,aknh4 added by asklod AS Kremeur 2005-03 - zlno3 = zno3 * EXP( -psinut * znh4 ) / ( akno3 + zno3 ) - zlnh4 = znh4 / (znh4+aknh4) - - ! sinks and sources - ! phytoplankton production and exsudation - zno3phy = tmumax * zle * zlt * zlno3 * zphy - znh4phy = tmumax * zle * zlt * zlnh4 * zphy - - ! fphylab added by asklod AS Kremeur 2005-03 - zphydom = rgamma * (1 - fphylab) * (zno3phy + znh4phy) - zphynh4 = rgamma * fphylab * (zno3phy + znh4phy) - ! zooplankton production - ! preferences - zppz = rppz - zpdz = 1. - rppz - zpppz = ( zppz * zphy ) / ( ( zppz * zphy + zpdz * zdet ) + 1.e-13 ) - zppdz = ( zpdz * zdet ) / ( ( zppz * zphy + zpdz * zdet ) + 1.e-13 ) - zfood = zpppz * zphy + zppdz * zdet - ! filtration - zfilpz = taus * zpppz / (aks + zfood) - zfildz = taus * zppdz / (aks + zfood) - ! grazing - zphyzoo = zfilpz * zphy * zzoo - zdetzoo = zfildz * zdet * zzoo - - ! fecal pellets production - zzoodet = rpnaz * zphyzoo + rdnaz * zdetzoo - - ! zooplankton liquide excretion - zzoonh4 = tauzn * fzoolab * zzoo - zzoodom = tauzn * (1 - fzoolab) * zzoo - - ! mortality - ! phytoplankton mortality - zphydet = tmminp * zphy - - ! zooplankton mortality - ! closure : flux grazing is redistributed below level jpkbio - zzoobod = tmminz * zzoo * zzoo - xksi(ji,jj) = xksi(ji,jj) + (1-fdbod) * zzoobod * e3t(ji,jj,jk,Kmm) - zboddet = fdbod * zzoobod - - ! detritus and dom breakdown - zdetnh4 = taudn * fdetlab * zdet - zdetdom = taudn * (1 - fdetlab) * zdet - - zdomnh4 = taudomn * zdom - - ! flux added to express how the excess of nitrogen from - ! PHY, ZOO and DET to DOM goes directly to NH4 (flux of ajustment) - zdomaju = (1 - redf/reddom) * (zphydom + zzoodom + zdetdom) - - ! Nitrification - znh4no3 = taunn * znh4 - - ! determination of trends - ! total trend for each biological tracer - zphya = zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet - zzooa = zphyzoo + zdetzoo - zzoodet - zzoodom - zzoonh4 - zzoobod - zno3a = - zno3phy + znh4no3 - znh4a = - znh4phy - znh4no3 + zphynh4 + zzoonh4 + zdomnh4 + zdetnh4 + zdomaju - zdeta = zphydet + zzoodet - zdetzoo - zdetnh4 - zdetdom + zboddet - zdoma = zphydom + zzoodom + zdetdom - zdomnh4 - zdomaju - - ! tracer flux at totox-point added to the general trend - tr(ji,jj,jk,jpdet,Krhs) = tr(ji,jj,jk,jpdet,Krhs) + zdeta - tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) + zzooa - tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) + zphya - tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) + zno3a - tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + znh4a - tr(ji,jj,jk,jpdom,Krhs) = tr(ji,jj,jk,jpdom,Krhs) + zdoma - - IF( lk_iomput ) THEN - ! convert fluxes in per day - ze3t = e3t(ji,jj,jk,Kmm) * 86400._wp - zw2d(ji,jj,1) = zw2d(ji,jj,1) + zno3phy * ze3t - zw2d(ji,jj,2) = zw2d(ji,jj,2) + znh4phy * ze3t - zw2d(ji,jj,3) = zw2d(ji,jj,3) + zphydom * ze3t - zw2d(ji,jj,4) = zw2d(ji,jj,4) + zphynh4 * ze3t - zw2d(ji,jj,5) = zw2d(ji,jj,5) + zphyzoo * ze3t - zw2d(ji,jj,6) = zw2d(ji,jj,6) + zphydet * ze3t - zw2d(ji,jj,7) = zw2d(ji,jj,7) + zdetzoo * ze3t - zw2d(ji,jj,8) = zw2d(ji,jj,8) + zzoodet * ze3t - zw2d(ji,jj,9) = zw2d(ji,jj,9) + zzoobod * ze3t - zw2d(ji,jj,10) = zw2d(ji,jj,10) + zzoonh4 * ze3t - zw2d(ji,jj,11) = zw2d(ji,jj,11) + zzoodom * ze3t - zw2d(ji,jj,12) = zw2d(ji,jj,12) + znh4no3 * ze3t - zw2d(ji,jj,13) = zw2d(ji,jj,13) + zdomnh4 * ze3t - zw2d(ji,jj,14) = zw2d(ji,jj,14) + zdetnh4 * ze3t - zw2d(ji,jj,15) = zw2d(ji,jj,15) + ( zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet ) * ze3t - zw2d(ji,jj,16) = zw2d(ji,jj,16) + ( zphyzoo + zdetzoo - zzoodet - zzoobod - zzoonh4 - zzoodom ) * ze3t - zw2d(ji,jj,17) = zw2d(ji,jj,17) + zdetdom * ze3t - ! - zw3d(ji,jj,jk,1) = zno3phy * 86400 - zw3d(ji,jj,jk,2) = znh4phy * 86400 - zw3d(ji,jj,jk,3) = znh4no3 * 86400 - ! - ENDIF - END_3D - - ! ! -------------------------- ! - DO_3D( 0, 0, 0, 0, jpkb, jpkm1 ) ! Upper ocean (bio-layers) ! - ! ! -------------------------- ! - ! remineralisation of all quantities towards nitrate - - ! trophic variables( det, zoo, phy, no3, nh4, dom) - ! negative trophic variables DO not contribute to the fluxes - zdet = MAX( 0.e0, tr(ji,jj,jk,jpdet,Kmm) ) - zzoo = MAX( 0.e0, tr(ji,jj,jk,jpzoo,Kmm) ) - zphy = MAX( 0.e0, tr(ji,jj,jk,jpphy,Kmm) ) - zno3 = MAX( 0.e0, tr(ji,jj,jk,jpno3,Kmm) ) - znh4 = MAX( 0.e0, tr(ji,jj,jk,jpnh4,Kmm) ) - zdom = MAX( 0.e0, tr(ji,jj,jk,jpdom,Kmm) ) - - ! Limitations - zlt = 0.e0 - zle = 0.e0 - zlno3 = 0.e0 - zlnh4 = 0.e0 - - ! sinks and sources - ! phytoplankton production and exsudation - zno3phy = 0.e0 - znh4phy = 0.e0 - zphydom = 0.e0 - zphynh4 = 0.e0 - - ! zooplankton production - zphyzoo = 0.e0 ! grazing - zdetzoo = 0.e0 - - zzoodet = 0.e0 ! fecal pellets production - - zzoonh4 = tauzn * fzoolab * zzoo ! zooplankton liquide excretion - zzoodom = tauzn * (1 - fzoolab) * zzoo - - ! mortality - zphydet = tmminp * zphy ! phytoplankton mortality - - zzoobod = 0.e0 ! zooplankton mortality - zboddet = 0.e0 ! closure : flux fbod is redistributed below level jpkbio - - ! detritus and dom breakdown - zdetnh4 = taudn * fdetlab * zdet - zdetdom = taudn * (1 - fdetlab) * zdet - - zdomnh4 = taudomn * zdom - zdomaju = (1 - redf/reddom) * (zphydom + zzoodom + zdetdom) - - ! Nitrification - znh4no3 = taunn * znh4 - - - ! determination of trends - ! total trend for each biological tracer - zphya = zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet - zzooa = zphyzoo + zdetzoo - zzoodet - zzoodom - zzoonh4 - zzoobod - zno3a = - zno3phy + znh4no3 - znh4a = - znh4phy - znh4no3 + zphynh4 + zzoonh4 + zdomnh4 + zdetnh4 + zdomaju - zdeta = zphydet + zzoodet - zdetzoo - zdetnh4 - zdetdom + zboddet - zdoma = zphydom + zzoodom + zdetdom - zdomnh4 - zdomaju - - ! tracer flux at totox-point added to the general trend - tr(ji,jj,jk,jpdet,Krhs) = tr(ji,jj,jk,jpdet,Krhs) + zdeta - tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) + zzooa - tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) + zphya - tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) + zno3a - tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + znh4a - tr(ji,jj,jk,jpdom,Krhs) = tr(ji,jj,jk,jpdom,Krhs) + zdoma - ! - IF( lk_iomput ) THEN ! convert fluxes in per day - ze3t = e3t(ji,jj,jk,Kmm) * 86400._wp - zw2d(ji,jj,1) = zw2d(ji,jj,1) + zno3phy * ze3t - zw2d(ji,jj,2) = zw2d(ji,jj,2) + znh4phy * ze3t - zw2d(ji,jj,3) = zw2d(ji,jj,3) + zphydom * ze3t - zw2d(ji,jj,4) = zw2d(ji,jj,4) + zphynh4 * ze3t - zw2d(ji,jj,5) = zw2d(ji,jj,5) + zphyzoo * ze3t - zw2d(ji,jj,6) = zw2d(ji,jj,6) + zphydet * ze3t - zw2d(ji,jj,7) = zw2d(ji,jj,7) + zdetzoo * ze3t - zw2d(ji,jj,8) = zw2d(ji,jj,8) + zzoodet * ze3t - zw2d(ji,jj,9) = zw2d(ji,jj,9) + zzoobod * ze3t - zw2d(ji,jj,10) = zw2d(ji,jj,10) + zzoonh4 * ze3t - zw2d(ji,jj,11) = zw2d(ji,jj,11) + zzoodom * ze3t - zw2d(ji,jj,12) = zw2d(ji,jj,12) + znh4no3 * ze3t - zw2d(ji,jj,13) = zw2d(ji,jj,13) + zdomnh4 * ze3t - zw2d(ji,jj,14) = zw2d(ji,jj,14) + zdetnh4 * ze3t - zw2d(ji,jj,15) = zw2d(ji,jj,15) + ( zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet ) * ze3t - zw2d(ji,jj,16) = zw2d(ji,jj,16) + ( zphyzoo + zdetzoo - zzoodet - zzoobod - zzoonh4 - zzoodom ) * ze3t - zw2d(ji,jj,17) = zw2d(ji,jj,17) + zdetdom * ze3t - ! - zw3d(ji,jj,jk,1) = zno3phy * 86400._wp - zw3d(ji,jj,jk,2) = znh4phy * 86400._wp - zw3d(ji,jj,jk,3) = znh4no3 * 86400._wp - ! - ENDIF - END_3D - ! - IF( lk_iomput ) THEN - ! Save diagnostics - CALL iom_put( "TNO3PHY", zw2d(:,:,1) ) - CALL iom_put( "TNH4PHY", zw2d(:,:,2) ) - CALL iom_put( "TPHYDOM", zw2d(:,:,3) ) - CALL iom_put( "TPHYNH4", zw2d(:,:,4) ) - CALL iom_put( "TPHYZOO", zw2d(:,:,5) ) - CALL iom_put( "TPHYDET", zw2d(:,:,6) ) - CALL iom_put( "TDETZOO", zw2d(:,:,7) ) - CALL iom_put( "TZOODET", zw2d(:,:,8) ) - CALL iom_put( "TZOOBOD", zw2d(:,:,9) ) - CALL iom_put( "TZOONH4", zw2d(:,:,10) ) - CALL iom_put( "TZOODOM", zw2d(:,:,11) ) - CALL iom_put( "TNH4NO3", zw2d(:,:,12) ) - CALL iom_put( "TDOMNH4", zw2d(:,:,13) ) - CALL iom_put( "TDETNH4", zw2d(:,:,14) ) - CALL iom_put( "TPHYTOT", zw2d(:,:,15) ) - CALL iom_put( "TZOOTOT", zw2d(:,:,16) ) - ! - CALL iom_put( "FNO3PHY", zw3d(:,:,:,1) ) - CALL iom_put( "FNH4PHY", zw3d(:,:,:,2) ) - CALL iom_put( "FNH4NO3", zw3d(:,:,:,3) ) - ! - DEALLOCATE( zw2d, zw3d ) - ! - ENDIF - - IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) - WRITE(charout, FMT="('bio')") - CALL prt_ctl_info( charout, cdcomp = 'top' ) - CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) - ENDIF - ! - IF( ln_timing ) CALL timing_stop('p2z_bio') - ! - END SUBROUTINE p2z_bio - - - SUBROUTINE p2z_bio_init - !!---------------------------------------------------------------------- - !! *** ROUTINE p2z_bio_init *** - !! - !! ** Purpose : biological parameters - !! - !! ** Method : Read namelist and check the parameters - !! - !!---------------------------------------------------------------------- - INTEGER :: ios ! Local integer - !! - NAMELIST/namlobphy/ tmumax, rgamma, fphylab, tmminp, aki - NAMELIST/namlobnut/ akno3, aknh4, taunn, psinut - NAMELIST/namlobzoo/ rppz, taus, aks, rpnaz, rdnaz, tauzn, fzoolab, fdbod, tmminz - NAMELIST/namlobdet/ taudn, fdetlab - NAMELIST/namlobdom/ taudomn - !!---------------------------------------------------------------------- - ! - IF(lwp) WRITE(numout,*) - IF(lwp) WRITE(numout,*) ' p2z_bio_init : LOBSTER bio-model initialization' - IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~' - ! - READ ( numnatp_ref, namlobphy, IOSTAT = ios, ERR = 901) -901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobphy in reference namelist' ) - READ ( numnatp_cfg, namlobphy, IOSTAT = ios, ERR = 902 ) -902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namlobphy in configuration namelist' ) - IF(lwm) WRITE ( numonp, namlobphy ) - ! - IF(lwp) THEN - WRITE(numout,*) ' Namelist namlobphy' - WRITE(numout,*) ' phyto max growth rate tmumax =', 86400 * tmumax, ' d' - WRITE(numout,*) ' phytoplankton exudation fraction rgamma =', rgamma - WRITE(numout,*) ' NH4 fraction of phytoplankton exsudation fphylab =', fphylab - WRITE(numout,*) ' minimal phyto mortality rate tmminp =', 86400 * tmminp - WRITE(numout,*) ' light hlaf saturation constant aki =', aki - ENDIF - - READ ( numnatp_ref, namlobnut, IOSTAT = ios, ERR = 903) -903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobnut in reference namelist' ) - READ ( numnatp_cfg, namlobnut, IOSTAT = ios, ERR = 904 ) -904 IF( ios > 0 ) CALL ctl_nam ( ios , 'namlobnut in configuration namelist' ) - IF(lwm) WRITE ( numonp, namlobnut ) - - IF(lwp) THEN - WRITE(numout,*) - WRITE(numout,*) ' Namelist namlobnut' - WRITE(numout,*) ' half-saturation nutrient for no3 uptake akno3 =', akno3 - WRITE(numout,*) ' half-saturation nutrient for nh4 uptake aknh4 =', aknh4 - WRITE(numout,*) ' nitrification rate taunn =', taunn - WRITE(numout,*) ' inhibition of no3 uptake by nh4 psinut =', psinut - ENDIF - - READ ( numnatp_ref, namlobzoo, IOSTAT = ios, ERR = 905) -905 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobzoo in reference namelist' ) - READ ( numnatp_cfg, namlobzoo, IOSTAT = ios, ERR = 906 ) -906 IF( ios > 0 ) CALL ctl_nam ( ios , 'namlobzoo in configuration namelist' ) - IF(lwm) WRITE ( numonp, namlobzoo ) - - IF(lwp) THEN - WRITE(numout,*) - WRITE(numout,*) ' Namelist namlobzoo' - WRITE(numout,*) ' zoo preference for phyto rppz =', rppz - WRITE(numout,*) ' maximal zoo grazing rate taus =', 86400 * taus, ' d' - WRITE(numout,*) ' half saturation constant for zoo food aks =', aks - WRITE(numout,*) ' non-assimilated phyto by zoo rpnaz =', rpnaz - WRITE(numout,*) ' non-assimilated detritus by zoo rdnaz =', rdnaz - WRITE(numout,*) ' zoo specific excretion rate tauzn =', 86400 * tauzn - WRITE(numout,*) ' minimal zoo mortality rate tmminz =', 86400 * tmminz - WRITE(numout,*) ' NH4 fraction of zooplankton excretion fzoolab =', fzoolab - WRITE(numout,*) ' Zooplankton mortality fraction that goes to detritus fdbod =', fdbod - ENDIF - - READ ( numnatp_ref, namlobdet, IOSTAT = ios, ERR = 907) -907 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobdet in reference namelist' ) - READ ( numnatp_cfg, namlobdet, IOSTAT = ios, ERR = 908 ) -908 IF( ios > 0 ) CALL ctl_nam ( ios , 'namlobdet in configuration namelist' ) - IF(lwm) WRITE ( numonp, namlobdet ) - - IF(lwp) THEN - WRITE(numout,*) - WRITE(numout,*) ' Namelist namlobdet' - WRITE(numout,*) ' detrital breakdown rate taudn =', 86400 * taudn , ' d' - WRITE(numout,*) ' NH4 fraction of detritus dissolution fdetlab =', fdetlab - ENDIF - - READ ( numnatp_ref, namlobdom, IOSTAT = ios, ERR = 909) -909 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobdom in reference namelist' ) - READ ( numnatp_cfg, namlobdom, IOSTAT = ios, ERR = 910 ) -910 IF( ios > 0 ) CALL ctl_nam ( ios , 'namlobdom in configuration namelist' ) - IF(lwm) WRITE ( numonp, namlobdom ) - - IF(lwp) THEN - WRITE(numout,*) - WRITE(numout,*) ' Namelist namlobdom' - WRITE(numout,*) ' DOM breakdown rate taudomn =', 86400 * taudn , ' d' - ENDIF - ! - END SUBROUTINE p2z_bio_init - - !!====================================================================== -END MODULE p2zbio diff --git a/src/TOP/PISCES/P2Z/p2zexp.F90 b/src/TOP/PISCES/P2Z/p2zexp.F90 deleted file mode 100644 index 71ed7709e6751cff80e933e9508211dc38062736..0000000000000000000000000000000000000000 --- a/src/TOP/PISCES/P2Z/p2zexp.F90 +++ /dev/null @@ -1,239 +0,0 @@ -MODULE p2zexp - !!====================================================================== - !! *** MODULE p2zsed *** - !! TOP : LOBSTER Compute loss of organic matter in the sediments - !!====================================================================== - !! History : - ! 1999 (O. Aumont, C. Le Quere) original code - !! - ! 2001-05 (O. Aumont, E. Kestenare) add sediment computations - !! 1.0 ! 2005-06 (A.-S. Kremeur) new temporal integration for sedpoc - !! 2.0 ! 2007-12 (C. Deltel, G. Madec) F90 - !! 3.5 ! 2012-03 (C. Ethe) Merge PISCES-LOBSTER - !!---------------------------------------------------------------------- - !! p2z_exp : Compute loss of organic matter in the sediments - !!---------------------------------------------------------------------- - USE oce_trc ! - USE trc - USE sms_pisces - USE p2zsed - USE lbclnk - USE prtctl ! Print control for debbuging - USE trd_oce - USE trdtrc - USE iom - - IMPLICIT NONE - PRIVATE - - PUBLIC p2z_exp - PUBLIC p2z_exp_init - PUBLIC p2z_exp_alloc - - ! - REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dminl !: fraction of sinking POC released in sediments - REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: dmin3 !: fraction of sinking POC released at each level - REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: sedpocb !: mass of POC in sediments - REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: sedpocn !: mass of POC in sediments - REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: cmask !: Coastal mask area - REAL(wp) :: areacot !: surface coastal area - - !! * Substitutions -# include "do_loop_substitute.h90" -# include "domzgr_substitute.h90" - !!---------------------------------------------------------------------- - !! NEMO/TOP 4.0 , NEMO Consortium (2018) - !! $Id: p2zexp.F90 15090 2021-07-06 14:25:18Z cetlod $ - !! Software governed by the CeCILL license (see ./LICENSE) - !!---------------------------------------------------------------------- -CONTAINS - - SUBROUTINE p2z_exp( kt, Kmm, Krhs ) - !!--------------------------------------------------------------------- - !! *** ROUTINE p2z_exp *** - !! - !! ** Purpose : MODELS EXPORT OF BIOGENIC MATTER (POC ''SOFT - !! TISSUE'') AND ITS DISTRIBUTION IN WATER COLUMN - !! - !! ** Method : - IN THE SURFACE LAYER POC IS PRODUCED ACCORDING TO - !! NURTRIENTS AVAILABLE AND GROWTH CONDITIONS. NUTRIENT UPTAKE - !! KINETICS FOLLOW MICHAELIS-MENTON FORMULATION. - !! THE TOTAL PARTICLE AMOUNT PRODUCED, IS DISTRIBUTED IN THE WATER - !! COLUMN BELOW THE SURFACE LAYER. - !!--------------------------------------------------------------------- - !! - INTEGER, INTENT( in ) :: kt ! ocean time-step index - INTEGER, INTENT( in ) :: Kmm, Krhs ! time level indices - !! - INTEGER :: ji, jj, jk, jl, ikt - REAL(wp) :: zgeolpoc, zfact, zwork, ze3t, zsedpocd, zmaskt - REAL(wp), DIMENSION(A2D(0)) :: zsedpoca - CHARACTER (len=25) :: charout - !!--------------------------------------------------------------------- - ! - IF( ln_timing ) CALL timing_start('p2z_exp') - ! - IF( kt == nittrc000 ) CALL p2z_exp_init( Kmm ) - - zsedpoca(:,:) = 0. - - - ! VERTICAL DISTRIBUTION OF NEWLY PRODUCED BIOGENIC - ! POC IN THE WATER COLUMN - ! (PARTS OF NEWLY FORMED MATTER REMAINING IN THE DIFFERENT - ! LAYERS IS DETERMINED BY DMIN3 DEFINED IN sms_p2z.F90 - ! ---------------------------------------------------------------------- - DO_3D( 0, 0, 0, 0, 1, jpkm1 ) - ze3t = 1. / e3t(ji,jj,jk,Kmm) - tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) + ze3t * dmin3(ji,jj,jk) * xksi(ji,jj) - END_3D - - ! Find the last level of the water column - ! Compute fluxes due to sinking particles (slow) - - - zgeolpoc = 0.e0 ! Initialization - ! Release of nutrients from the "simple" sediment - DO_2D( 0, 0, 0, 0 ) - ikt = mbkt(ji,jj) - tr(ji,jj,ikt,jpno3,Krhs) = tr(ji,jj,ikt,jpno3,Krhs) + sedlam * sedpocn(ji,jj) / e3t(ji,jj,ikt,Kmm) - ! Deposition of organic matter in the sediment - zwork = vsed * tr(ji,jj,ikt,jpdet,Kmm) - zsedpoca(ji,jj) = ( zwork + dminl(ji,jj) * xksi(ji,jj) & - & - sedlam * sedpocn(ji,jj) - sedlostpoc * sedpocn(ji,jj) ) * rn_Dt - zgeolpoc = zgeolpoc + sedlostpoc * sedpocn(ji,jj) * e1e2t(ji,jj) - END_2D - - DO_2D( 0, 0, 0, 0 ) - tr(ji,jj,1,jpno3,Krhs) = tr(ji,jj,1,jpno3,Krhs) + zgeolpoc * cmask(ji,jj) / areacot / e3t(ji,jj,1,Kmm) - END_2D - -! CALL lbc_lnk( 'p2zexp', sedpocn, 'T', 1.0_wp ) - - ! Oa & Ek: diagnostics depending on jpdia2d ! left as example - IF( lk_iomput ) CALL iom_put( "SEDPOC" , sedpocn ) - - - ! Time filter and swap of arrays - ! ------------------------------ - IF( l_1st_euler ) THEN ! Euler time-stepping at first time-step - ! ! (only swap) - sedpocn(:,:) = zsedpoca(:,:) - ! - ELSE - ! - DO_2D( 0, 0, 0, 0 ) - zsedpocd = zsedpoca(ji,jj) - 2. * sedpocn(ji,jj) + sedpocb(ji,jj) ! time laplacian on tracers - sedpocb(ji,jj) = sedpocn(ji,jj) + rn_atfp * zsedpocd ! sedpocb <-- filtered sedpocn - sedpocn(ji,jj) = zsedpoca(ji,jj) ! sedpocn <-- sedpoca - END_2D - ! - ENDIF - ! - IF( lrst_trc ) THEN - IF(lwp) WRITE(numout,*) - IF(lwp) WRITE(numout,*) 'p2z_exp : POC in sediment fields written in ocean restart file ', & - & 'at it= ', kt,' date= ', ndastp - IF(lwp) WRITE(numout,*) '~~~~' - CALL iom_rstput( kt, nitrst, numrtw, 'SEDB'//ctrcnm(jpdet), sedpocb(:,:) ) - CALL iom_rstput( kt, nitrst, numrtw, 'SEDN'//ctrcnm(jpdet), sedpocn(:,:) ) - ENDIF - ! - IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) - WRITE(charout, FMT="('exp')") - CALL prt_ctl_info( charout, cdcomp = 'top' ) - CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) - ENDIF - ! - IF( ln_timing ) CALL timing_stop('p2z_exp') - ! - END SUBROUTINE p2z_exp - - - SUBROUTINE p2z_exp_init( Kmm ) - !!---------------------------------------------------------------------- - !! *** ROUTINE p4z_exp_init *** - !! ** purpose : specific initialisation for export - !!---------------------------------------------------------------------- - INTEGER, INTENT(in) :: Kmm ! time level index - INTEGER :: ji, jj, jk - REAL(wp) :: zmaskt, zfluo, zfluu - REAL(wp), DIMENSION(A2D(0) ) :: zrro, zarea - REAL(wp), DIMENSION(A2D(0),jpk) :: zdm0 - !!--------------------------------------------------------------------- - ! - IF(lwp) THEN - WRITE(numout,*) - WRITE(numout,*) ' p2z_exp: LOBSTER export' - WRITE(numout,*) ' ~~~~~~~' - WRITE(numout,*) ' compute remineralisation-damping arrays for tracers' - ENDIF - ! - - ! Calculate vertical distribution of newly formed biogenic poc - ! in the water column in the case of max. possible bottom depth - ! ------------------------------------------------------------ - zdm0(:,:,:) = 0._wp - zrro(:,:) = 1._wp - DO_3D( 0, 0, 0, 0, jpkb, jpkm1 ) - zfluo = ( gdepw(ji,jj,jk ,Kmm) / gdepw(ji,jj,jpkb,Kmm) )**xhr - zfluu = ( gdepw(ji,jj,jk+1,Kmm) / gdepw(ji,jj,jpkb,Kmm) )**xhr - IF( zfluo.GT.1. ) zfluo = 1._wp - zdm0(ji,jj,jk) = zfluo - zfluu - IF( jk <= jpkb-1 ) zdm0(ji,jj,jk) = 0._wp - zrro(ji,jj) = zrro(ji,jj) - zdm0(ji,jj,jk) - END_3D - ! - zdm0(:,:,jpk) = zrro(:,:) - - ! Calculate vertical distribution of newly formed biogenic poc - ! in the water column with realistic topography (first "dry" layer - ! contains total fraction, which has passed to the upper layers) - ! ---------------------------------------------------------------------- - dminl(:,:) = 0._wp - dmin3(:,:,:) = zdm0 - DO_3D( 0, 0, 0, 0, 1, jpk ) - IF( tmask(ji,jj,jk) == 0._wp ) THEN - dminl(ji,jj) = dminl(ji,jj) + dmin3(ji,jj,jk) - dmin3(ji,jj,jk) = 0._wp - ENDIF - END_3D - - DO_2D( 0, 0, 0, 0 ) - IF( tmask(ji,jj,1) == 0 ) dmin3(ji,jj,1) = 0._wp - END_2D - - ! Coastal mask - cmask(:,:) = 0._wp - DO_2D( 0, 0, 0, 0 ) - IF( tmask(ji,jj,1) /= 0. ) THEN - zmaskt = tmask(ji+1,jj,1) * tmask(ji-1,jj,1) * tmask(ji,jj+1,1) * tmask(ji,jj-1,1) - IF( zmaskt == 0. ) cmask(ji,jj) = 1._wp - END IF - END_2D -! CALL lbc_lnk( 'p2zexp', cmask , 'T', 1.0_wp ) ! lateral boundary conditions on cmask (sign unchanged) - DO_2D( 0, 0, 0, 0 ) - zarea(ji,jj) = e1e2t(ji,jj) * cmask(ji,jj) - END_2D - areacot = glob_sum( 'p2zexp', zarea(:,:) ) - ! - IF( ln_rsttr ) THEN - CALL iom_get( numrtr, jpdom_auto, 'SEDB'//ctrcnm(jpdet), sedpocb(:,:) ) - CALL iom_get( numrtr, jpdom_auto, 'SEDN'//ctrcnm(jpdet), sedpocn(:,:) ) - ELSE - sedpocb(:,:) = 0._wp - sedpocn(:,:) = 0._wp - ENDIF - ! - END SUBROUTINE p2z_exp_init - - INTEGER FUNCTION p2z_exp_alloc() - !!---------------------------------------------------------------------- - !! *** ROUTINE p2z_exp_alloc *** - !!---------------------------------------------------------------------- - ALLOCATE( cmask(A2D(0)) , dminl(A2D(0)) , dmin3(A2D(0),jpk), & - & sedpocb(A2D(0)) , sedpocn(A2D(0)), STAT=p2z_exp_alloc ) - IF( p2z_exp_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p2z_exp_alloc : failed to allocate arrays.' ) - ! - END FUNCTION p2z_exp_alloc - - !!====================================================================== -END MODULE p2zexp diff --git a/src/TOP/PISCES/P2Z/p2zopt.F90 b/src/TOP/PISCES/P2Z/p2zopt.F90 deleted file mode 100644 index 4c8268dea0cdb4abbb1f51f1c3eb7e95ddeaa49d..0000000000000000000000000000000000000000 --- a/src/TOP/PISCES/P2Z/p2zopt.F90 +++ /dev/null @@ -1,195 +0,0 @@ -MODULE p2zopt - !!====================================================================== - !! *** MODULE p2zopt *** - !! TOP : LOBSTER Compute the light availability in the water column - !!====================================================================== - !! History : - ! 1995-05 (M. Levy) Original code - !! - ! 1999-09 (J.-M. Andre, M. Levy) - !! - ! 1999-11 (C. Menkes, M.-A. Foujols) itabe initial - !! - ! 2000-02 (M.A. Foujols) change x**y par exp(y*log(x)) - !! NEMO 2.0 ! 2007-12 (C. Deltel, G. Madec) F90 - !! 3.2 ! 2009-04 (C. Ethe, G. Madec) minor optimisation + style - !!---------------------------------------------------------------------- - - !!---------------------------------------------------------------------- - !! p2z_opt : Compute the light availability in the water column - !!---------------------------------------------------------------------- - USE oce_trc ! - USE trc - USE sms_pisces - USE prtctl ! Print control for debbuging - - IMPLICIT NONE - PRIVATE - - PUBLIC p2z_opt ! - PUBLIC p2z_opt_init ! - - REAL(wp), PUBLIC :: xkr0 !: water coefficient absorption in red - REAL(wp), PUBLIC :: xkg0 !: water coefficient absorption in green - REAL(wp), PUBLIC :: xkrp !: pigment coefficient absorption in red - REAL(wp), PUBLIC :: xkgp !: pigment coefficient absorption in green - REAL(wp), PUBLIC :: xlr !: exposant for pigment absorption in red - REAL(wp), PUBLIC :: xlg !: exposant for pigment absorption in green - REAL(wp), PUBLIC :: rpig !: chla/chla+phea ratio - ! - REAL(wp), PUBLIC :: rcchl ! Carbone/Chlorophyl ratio [mgC.mgChla-1] - REAL(wp), PUBLIC :: redf ! redfield ratio (C:N) for phyto - REAL(wp), PUBLIC :: reddom ! redfield ratio (C:N) for DOM - - !! * Substitutions -# include "do_loop_substitute.h90" -# include "domzgr_substitute.h90" - !!---------------------------------------------------------------------- - !! NEMO/TOP 4.0 , NEMO Consortium (2018) - !! $Id: p2zopt.F90 15090 2021-07-06 14:25:18Z cetlod $ - !! Software governed by the CeCILL license (see ./LICENSE) - !!---------------------------------------------------------------------- -CONTAINS - - SUBROUTINE p2z_opt( kt, Kmm ) - !!--------------------------------------------------------------------- - !! *** ROUTINE p2z_opt *** - !! - !! ** Purpose : computes the light propagation in the water column - !! and the euphotic layer depth - !! - !! ** Method : local par is computed in w layers using light propagation - !! mean par in t layers are computed by integration - !! -!!gm please remplace the '???' by true comments - !! ** Action : etot ??? - !! neln ??? - !!--------------------------------------------------------------------- - !! - INTEGER, INTENT( in ) :: kt ! index of the time stepping - INTEGER, INTENT( in ) :: Kmm ! time level index - !! - INTEGER :: ji, jj, jk ! dummy loop indices - CHARACTER (len=25) :: charout ! temporary character - REAL(wp) :: zpig ! log of the total pigment - REAL(wp) :: zkr, zkg ! total absorption coefficient in red and green - REAL(wp) :: zcoef ! temporary scalar - REAL(wp), DIMENSION(A2D(0) ) :: zpar100, zpar0m - REAL(wp), DIMENSION(A2D(0),jpk) :: zparr, zparg - !!--------------------------------------------------------------------- - ! - IF( ln_timing ) CALL timing_start('p2z_opt') - ! - - IF( kt == nittrc000 ) THEN - IF(lwp) WRITE(numout,*) - IF(lwp) WRITE(numout,*) ' p2z_opt : LOBSTER optic-model' - IF(lwp) WRITE(numout,*) ' ~~~~~~~ ' - ENDIF - - ! ! surface irradiance - ! ! ------------------ - IF( ln_dm2dc ) THEN - DO_2D( 0, 0, 0, 0 ) - zpar0m(ji,jj) = qsr_mean(ji,jj) * 0.43 - END_2D - ELSE - DO_2D( 0, 0, 0, 0 ) - zpar0m(ji,jj) = qsr(ji,jj) * 0.43 - END_2D - ENDIF - zpar100(:,:) = zpar0m(:,:) * 0.01 - zparr (:,:,1) = zpar0m(:,:) * 0.5 - zparg (:,:,1) = zpar0m(:,:) * 0.5 - - ! ! Photosynthetically Available Radiation (PAR) - zcoef = 12 * redf / rcchl / rpig ! -------------------------------------- - DO_3D( 0, 0, 0, 0, 2, jpk ) - zpig = LOG( MAX( TINY(0.), tr(ji,jj,jk-1,jpphy,Kmm) ) * zcoef ) - zkr = xkr0 + xkrp * EXP( xlr * zpig ) - zkg = xkg0 + xkgp * EXP( xlg * zpig ) - zparr(ji,jj,jk) = zparr(ji,jj,jk-1) * EXP( -zkr * e3t(ji,jj,jk-1,Kmm) ) - zparg(ji,jj,jk) = zparg(ji,jj,jk-1) * EXP( -zkg * e3t(ji,jj,jk-1,Kmm) ) - END_3D - DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! mean par at t-levels - zpig = LOG( MAX( TINY(0.), tr(ji,jj,jk,jpphy,Kmm) ) * zcoef ) - zkr = xkr0 + xkrp * EXP( xlr * zpig ) - zkg = xkg0 + xkgp * EXP( xlg * zpig ) - zparr(ji,jj,jk) = zparr(ji,jj,jk) / ( zkr * e3t(ji,jj,jk,Kmm) ) * ( 1 - EXP( -zkr * e3t(ji,jj,jk,Kmm) ) ) - zparg(ji,jj,jk) = zparg(ji,jj,jk) / ( zkg * e3t(ji,jj,jk,Kmm) ) * ( 1 - EXP( -zkg * e3t(ji,jj,jk,Kmm) ) ) - etot (ji,jj,jk) = MAX( zparr(ji,jj,jk) + zparg(ji,jj,jk), 1.e-15 ) - END_3D - - ! ! Euphotic layer - ! ! -------------- - neln(:,:) = 1 ! euphotic layer level - DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! (i.e. 1rst T-level strictly below EL bottom) - IF( etot(ji,jj,jk) >= zpar100(ji,jj) ) neln(ji,jj) = jk + 1 - END_3D - ! ! Euphotic layer depth - DO_2D( 0, 0, 0, 0 ) - heup(ji,jj) = gdepw(ji,jj,neln(ji,jj),Kmm) - END_2D - - - IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) - WRITE(charout, FMT="('opt')") - CALL prt_ctl_info( charout, cdcomp = 'top' ) - CALL prt_ctl( tab4d_1=tr(:,:,:,:,Kmm), mask1=tmask, clinfo=ctrcnm ) - ENDIF - ! - IF( ln_timing ) CALL timing_stop('p2z_opt') - ! - END SUBROUTINE p2z_opt - - - SUBROUTINE p2z_opt_init - !!---------------------------------------------------------------------- - !! *** ROUTINE p2z_opt_init *** - !! - !! ** Purpose : optical parameters - !! - !! ** Method : Read the namlobopt namelist and check the parameters - !! - !!---------------------------------------------------------------------- - INTEGER :: ios ! Local integer - !! - NAMELIST/namlobopt/ xkg0, xkr0, xkgp, xkrp, xlg, xlr, rpig - NAMELIST/namlobrat/ rcchl, redf, reddom - !!---------------------------------------------------------------------- - - READ ( numnatp_ref, namlobopt, IOSTAT = ios, ERR = 901) -901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobopt in reference namelist' ) - - READ ( numnatp_cfg, namlobopt, IOSTAT = ios, ERR = 902 ) -902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namlobopt in configuration namelist' ) - IF(lwm) WRITE ( numonp, namlobopt ) - - IF(lwp) THEN - WRITE(numout,*) - WRITE(numout,*) ' Namelist namlobopt' - WRITE(numout,*) ' green water absorption coeff xkg0 = ', xkg0 - WRITE(numout,*) ' red water absorption coeff xkr0 = ', xkr0 - WRITE(numout,*) ' pigment red absorption coeff xkrp = ', xkrp - WRITE(numout,*) ' pigment green absorption coeff xkgp = ', xkgp - WRITE(numout,*) ' green chl exposant xlg = ', xlg - WRITE(numout,*) ' red chl exposant xlr = ', xlr - WRITE(numout,*) ' chla/chla+phea ratio rpig = ', rpig - WRITE(numout,*) ' ' - ENDIF - ! - READ ( numnatp_ref, namlobrat, IOSTAT = ios, ERR = 903) -903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobrat in reference namelist' ) - - READ ( numnatp_cfg, namlobrat, IOSTAT = ios, ERR = 904 ) -904 IF( ios > 0 ) CALL ctl_nam ( ios , 'namlobrat in configuration namelist' ) - IF(lwm) WRITE ( numonp, namlobrat ) - - IF(lwp) THEN - WRITE(numout,*) ' Namelist namlobrat' - WRITE(numout,*) ' carbone/chlorophyl ratio rcchl = ', rcchl - WRITE(numout,*) ' redfield ratio c:n for phyto redf =', redf - WRITE(numout,*) ' redfield ratio c:n for DOM reddom =', reddom - WRITE(numout,*) ' ' - ENDIF - ! - END SUBROUTINE p2z_opt_init - - !!====================================================================== -END MODULE p2zopt diff --git a/src/TOP/PISCES/P2Z/p2zsed.F90 b/src/TOP/PISCES/P2Z/p2zsed.F90 deleted file mode 100644 index 50d7e76964333e2daf8bad5bf48c2832f138cca0..0000000000000000000000000000000000000000 --- a/src/TOP/PISCES/P2Z/p2zsed.F90 +++ /dev/null @@ -1,157 +0,0 @@ -MODULE p2zsed - !!====================================================================== - !! *** MODULE p2zsed *** - !! TOP : PISCES Compute loss of organic matter in the sediments - !!====================================================================== - !! History : - ! 1995-06 (M. Levy) original code - !! - ! 2000-12 (E. Kestenare) clean up - !! 2.0 ! 2007-12 (C. Deltel, G. Madec) F90 + simplifications - !!---------------------------------------------------------------------- - !! p2z_sed : Compute loss of organic matter in the sediments - !!---------------------------------------------------------------------- - USE oce_trc ! - USE trd_oce ! - USE trdtrc ! - USE trc ! - USE sms_pisces ! - ! - USE lbclnk ! - USE iom ! - USE prtctl ! Print control for debbuging - - IMPLICIT NONE - PRIVATE - - PUBLIC p2z_sed ! called in ??? - PUBLIC p2z_sed_init ! called in ??? - - REAL(wp), PUBLIC :: sedlam !: time coefficient of POC remineralization in sediments - REAL(wp), PUBLIC :: sedlostpoc !: mass of POC lost in sediments - REAL(wp), PUBLIC :: vsed !: detritus sedimentation speed [m/s] - REAL(wp), PUBLIC :: xhr !: coeff for martin''s remineralisation profile - - !! * Substitutions -# include "do_loop_substitute.h90" -# include "domzgr_substitute.h90" - !!---------------------------------------------------------------------- - !! NEMO/TOP 4.0 , NEMO Consortium (2018) - !! $Id: p2zsed.F90 15090 2021-07-06 14:25:18Z cetlod $ - !! Software governed by the CeCILL license (see ./LICENSE) - !!---------------------------------------------------------------------- -CONTAINS - - SUBROUTINE p2z_sed( kt, Kmm, Krhs ) - !!--------------------------------------------------------------------- - !! *** ROUTINE p2z_sed *** - !! - !! ** Purpose : compute the now trend due to the vertical sedimentation of - !! detritus and add it to the general trend of detritus equations - !! - !! ** Method : this ROUTINE compute not exactly the advection but the - !! transport term, i.e. dz(wt) and dz(ws)., dz(wtr) - !! using an upstream scheme - !! the now vertical advection of tracers is given by: - !! dz(tr(:,:,:,:,Kmm) ww) = 1/bt dk+1( e1t e2t vsed (tr(:,:,:,:,Kmm)) ) - !! add this trend now to the general trend of tracer (ta,sa,tr(:,:,:,:,Krhs)): - !! tr(:,:,:,:,Krhs) = tr(:,:,:,:,Krhs) + dz(tr(:,:,:,:,Kmm) ww) - !! - !! IF 'key_diabio' is defined, the now vertical advection - !! trend of passive tracers is saved for futher diagnostics. - !!--------------------------------------------------------------------- - INTEGER, INTENT( in ) :: kt ! ocean time-step index - INTEGER, INTENT( in ) :: Kmm, Krhs ! time level indices - ! - INTEGER :: ji, jj, jk - CHARACTER (len=25) :: charout - REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zw2d - REAL(wp), DIMENSION(A2D(0),jpk) :: zwork - REAL(wp) :: ztra - !!--------------------------------------------------------------------- - ! - IF( ln_timing ) CALL timing_start('p2z_sed') - ! - IF( kt == nittrc000 ) THEN - IF(lwp) WRITE(numout,*) - IF(lwp) WRITE(numout,*) ' p2z_sed: LOBSTER sedimentation' - IF(lwp) WRITE(numout,*) ' ~~~~~~~' - ENDIF - - ! sedimentation of detritus : upstream scheme - ! -------------------------------------------- - - ! for detritus sedimentation only - jpdet - zwork(:,:,1 ) = 0.e0 ! surface value set to zero - zwork(:,:,jpk) = 0.e0 ! bottom value set to zero - - ! tracer flux at w-point: we use -vsed (downward flux) with simplification : no e1*e2 - DO_3D( 0, 0, 0, 0, 2, jpkm1 ) - zwork(ji,jj,jk) = -vsed * tr(ji,jj,jk-1,jpdet,Kmm) - END_3D - - ! tracer flux divergence at t-point added to the general trend - DO_3D( 0, 0, 0, 0, 1, jpkm1 ) - ztra = - ( zwork(ji,jj,jk) - zwork(ji,jj,jk+1) ) / e3t(ji,jj,jk,Kmm) - tr(ji,jj,jk,jpdet,Krhs) = tr(ji,jj,jk,jpdet,Krhs) + ztra - END_3D - - IF( lk_iomput ) THEN - IF( iom_use( "TDETSED" ) ) THEN - ALLOCATE( zw2d(A2D(0)) ) - DO_2D( 0, 0, 0, 0 ) - zw2d(ji,jj) = - ( zwork(ji,jj,1) - zwork(ji,jj,2) ) * 86400._wp - END_2D - DO jk = 2, jpkm1 - DO_2D( 0, 0, 0, 0 ) - zw2d(ji,jj) = zw2d(ji,jj) - ( zwork(ji,jj,jk) - zwork(ji,jj,jk+1) ) * 86400._wp - END_2D - END DO - CALL iom_put( "TDETSED", zw2d ) - DEALLOCATE( zw2d ) - ENDIF - ENDIF - ! - - IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) - WRITE(charout, FMT="('sed')") - CALL prt_ctl_info( charout, cdcomp = 'top' ) - CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) - ENDIF - ! - IF( ln_timing ) CALL timing_stop('p2z_sed') - ! - END SUBROUTINE p2z_sed - - - SUBROUTINE p2z_sed_init - !!---------------------------------------------------------------------- - !! *** ROUTINE p2z_sed_init *** - !! - !! ** Purpose : Parameters from aphotic layers to sediment - !! - !! ** Method : Read the namlobsed namelist and check the parameters - !! - !!---------------------------------------------------------------------- - INTEGER :: ios ! Local integer - !! - NAMELIST/namlobsed/ sedlam, sedlostpoc, vsed, xhr - !!---------------------------------------------------------------------- - ! - READ ( numnatp_ref, namlobsed, IOSTAT = ios, ERR = 901) -901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlosed in reference namelist' ) - READ ( numnatp_cfg, namlobsed, IOSTAT = ios, ERR = 902 ) -902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namlobsed in configuration namelist' ) - IF(lwm) WRITE ( numonp, namlobsed ) - ! - IF(lwp) THEN - WRITE(numout,*) ' Namelist namlobsed' - WRITE(numout,*) ' time coeff of POC in sediments sedlam =', sedlam - WRITE(numout,*) ' Sediment geol loss for POC sedlostpoc=', sedlostpoc - WRITE(numout,*) ' detritus sedimentation speed vsed =', 86400 * vsed , ' d' - WRITE(numout,*) ' coeff for martin''s remineralistion xhr =', xhr - WRITE(numout,*) ' ' - ENDIF - ! - END SUBROUTINE p2z_sed_init - - !!====================================================================== -END MODULE p2zsed diff --git a/src/TOP/PISCES/P2Z/p2zsms.F90 b/src/TOP/PISCES/P2Z/p2zsms.F90 deleted file mode 100644 index ed0fc90ebe838dab5678304c38950f828ce5d327..0000000000000000000000000000000000000000 --- a/src/TOP/PISCES/P2Z/p2zsms.F90 +++ /dev/null @@ -1,71 +0,0 @@ -MODULE p2zsms - !!====================================================================== - !! *** MODULE p2zsms *** - !! TOP : Time loop of LOBSTER model - !!====================================================================== - !! History : 1.0 ! M. Levy - !! 2.0 ! 2007-12 (C. Ethe, G. Madec) revised architecture - !!---------------------------------------------------------------------- - - !!---------------------------------------------------------------------- - !! p2zsms : Time loop of passive tracers sms - !!---------------------------------------------------------------------- - USE oce_trc ! - USE trc - USE sms_pisces - USE p2zbio - USE p2zopt - USE p2zsed - USE p2zexp - USE trd_oce - USE trdtrc_oce - USE trdtrc - USE trdmxl_trc - - IMPLICIT NONE - PRIVATE - - PUBLIC p2z_sms ! called in p2zsms.F90 - - !!---------------------------------------------------------------------- - !! NEMO/TOP 4.0 , NEMO Consortium (2018) - !! $Id: p2zsms.F90 12377 2020-02-12 14:39:06Z acc $ - !! Software governed by the CeCILL license (see ./LICENSE) - !!---------------------------------------------------------------------- -CONTAINS - - SUBROUTINE p2z_sms( kt, Kmm, Krhs ) - !!--------------------------------------------------------------------- - !! *** ROUTINE p2z_sms *** - !! - !! ** Purpose : Managment of the call to Biological sources and sinks - !! routines of LOBSTER bio-model - !! - !! ** Method : - ??? - !! -------------------------------------------------------------------- - INTEGER, INTENT( in ) :: kt ! ocean time-step index - INTEGER, INTENT( in ) :: Kmm, Krhs ! ocean time level index - ! - INTEGER :: jn ! dummy loop index - !! -------------------------------------------------------------------- - ! - IF( ln_timing ) CALL timing_start('p2z_sms') - ! - CALL p2z_opt( kt, Kmm ) ! optical model - CALL p2z_bio( kt, Kmm, Krhs ) ! biological model - CALL p2z_sed( kt, Kmm, Krhs ) ! sedimentation model - CALL p2z_exp( kt, Kmm, Krhs ) ! export - ! - IF( l_trdtrc ) THEN - DO jn = jp_pcs0, jp_pcs1 - CALL trd_trc( tr(:,:,:,jn,Krhs), jn, jptra_sms, kt, Kmm ) ! save trends - END DO - END IF - ! - IF ( lwm .AND. kt == nittrc000 ) CALL FLUSH ( numonp ) ! flush output namelist PISCES - IF( ln_timing ) CALL timing_stop('p2z_sms') - ! - END SUBROUTINE p2z_sms - - !!====================================================================== -END MODULE p2zsms diff --git a/src/TOP/PISCES/P4Z/p2zlim.F90 b/src/TOP/PISCES/P4Z/p2zlim.F90 new file mode 100644 index 0000000000000000000000000000000000000000..091070d0d9347dc582f0484f04a91ca52b7b5a41 --- /dev/null +++ b/src/TOP/PISCES/P4Z/p2zlim.F90 @@ -0,0 +1,257 @@ +MODULE p2zlim + !!====================================================================== + !! *** MODULE p2zlim *** + !! TOP : Computes the nutrient limitation terms of phytoplankton + !!====================================================================== + !! History : 1.0 ! 2004 (O. Aumont) Original code + !! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90 + !! 3.4 ! 2011-04 (O. Aumont, C. Ethe) Limitation for iron modelled in quota + !!---------------------------------------------------------------------- + !! p2z_lim : Compute the nutrients limitation terms + !! p2z_lim_init : Read the namelist + !!---------------------------------------------------------------------- + USE oce_trc ! Shared ocean-passive tracers variables + USE trc ! Tracers defined + USE sms_pisces ! PISCES variables + USE iom ! I/O manager + + IMPLICIT NONE + PRIVATE + + PUBLIC p2z_lim ! called in p4zbio.F90 + PUBLIC p2z_lim_init ! called in trcsms_pisces.F90 + PUBLIC p2z_lim_alloc ! called in trcini_pisces.F90 + + !! * Shared module variables + REAL(wp), PUBLIC :: concnno3 !: NO3, PO4 half saturation + REAL(wp), PUBLIC :: concbno3 !: NO3 half saturation for bacteria + REAL(wp), PUBLIC :: concnfer !: Iron half saturation for nanophyto + REAL(wp), PUBLIC :: xsizephy !: Minimum size criteria for nanophyto + REAL(wp), PUBLIC :: xsizern !: Size ratio for nanophytoplankton + REAL(wp), PUBLIC :: xkdoc !: 2nd half-sat. of DOC remineralization + REAL(wp), PUBLIC :: concbfe !: Fe half saturation for bacteria + REAL(wp), PUBLIC :: caco3r !: mean rainratio + + !!* Phytoplankton limitation terms + REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanono3 !: Nanophyto limitation by NO3 + REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimphy !: Nutrient limitation term of nanophytoplankton + REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimbac !: Bacterial limitation term + REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimbacl !: Bacterial limitation term + REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimnfe !: Nanophyto limitation by Iron + + LOGICAL :: l_dia_nut_lim, l_dia_size_lim, l_dia_fracal + + !! * Substitutions +# include "do_loop_substitute.h90" + !!---------------------------------------------------------------------- + !! NEMO/TOP 4.0 , NEMO Consortium (2018) + !! $Id: p2zlim.F90 10069 2018-08-28 14:12:24Z nicolasmartin $ + !! Software governed by the CeCILL license (see ./LICENSE) + !!---------------------------------------------------------------------- +CONTAINS + + SUBROUTINE p2z_lim( kt, knt, Kbb, Kmm ) + !!--------------------------------------------------------------------- + !! *** ROUTINE p2z_lim *** + !! + !! ** Purpose : Compute the co-limitations by the various nutrients + !! for the unique phytoplankton species + !! + !! ** Method : - Limitation is computed according to Monod formalism + !!--------------------------------------------------------------------- + INTEGER, INTENT(in) :: kt, knt + INTEGER, INTENT(in) :: Kbb, Kmm ! time level indices + ! + INTEGER :: ji, jj, jk + REAL(wp) :: zcoef, zconc0n, zconcnf, zlim1, zlim2, zlim3 + REAL(wp) :: zbiron, ztem1, ztem2, zetot1, zetot2, zsize + REAL(wp) :: zferlim, zno3 + REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d + !!--------------------------------------------------------------------- + ! + IF( ln_timing ) CALL timing_start('p2z_lim') + ! + IF( kt == nittrc000 ) THEN + l_dia_nut_lim = iom_use( "LNnut" ) + l_dia_size_lim = iom_use( "SIZEN" ) + l_dia_fracal = iom_use( "xfracal" ) + ENDIF + ! + sizena(:,:,:) = 1.0 + ! + DO_3D( 0, 0, 0, 0, 1, jpkm1) + + ! Tuning of the iron concentration to a minimum level that is set to the detection limit + !------------------------------------- + zno3 = tr(ji,jj,jk,jpno3,Kbb) / 40.e-6 + zferlim = MAX( 5e-11 * zno3 * zno3, 2e-11 ) + zferlim = MIN( zferlim, 5e-11 ) + tr(ji,jj,jk,jpfer,Kbb) = MAX( tr(ji,jj,jk,jpfer,Kbb), zferlim ) + + ! Computation of a variable Ks for NO3 on phyto taking into account + ! that increasing biomass is made of generally bigger cells + ! The allometric relationship is classical. + !------------------------------------------------ + zsize = sizen(ji,jj,jk)**0.81 + zconc0n = concnno3 * zsize + zconcnf = concnfer * zsize + + ! Nanophytoplankton + zbiron = ( 75.0 * ( 1.0 - plig(ji,jj,jk) ) + plig(ji,jj,jk) ) * biron(ji,jj,jk) + + ! Michaelis-Menten Limitation term by nutrients of + ! heterotrophic bacteria + ! ------------------------------------------------- + zlim1 = tr(ji,jj,jk,jpno3,Kbb) / ( concbno3 + tr(ji,jj,jk,jpno3,Kbb) ) + zlim2 = zbiron / ( concbfe + zbiron ) + zlim3 = tr(ji,jj,jk,jpdoc,Kbb) / ( xkdoc + tr(ji,jj,jk,jpdoc,Kbb) ) + + ! Xlimbac is used for DOC solubilization whereas xlimbacl + ! is used for all the other bacterial-dependent terms + ! ------------------------------------------------------- + xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2) + xlimbac (ji,jj,jk) = xlimbacl(ji,jj,jk) * zlim3 + + ! Michaelis-Menten Limitation term by nutrients: Nanophyto + ! Optimal parameterization by Smith and Pahlow series of + ! papers is used. Optimal allocation is supposed independant + ! for all nutrients. + ! -------------------------------------------------------- + + ! Limitation of nanophytoplankton growth + xnanono3(ji,jj,jk) = tr(ji,jj,jk,jpno3,Kbb) / ( zconc0n + tr(ji,jj,jk,jpno3,Kbb) ) + xlimnfe (ji,jj,jk) = zbiron / ( zbiron + zconcnf ) + xlimphy (ji,jj,jk) = MIN( xlimnfe(ji,jj,jk), xnanono3(ji,jj,jk) ) + END_3D + + ! Size estimation of phytoplankton based on total biomass + ! Assumes that larger biomass implies addition of larger cells + ! ------------------------------------------------------------ + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zcoef = tr(ji,jj,jk,jpphy,Kbb) - MIN(xsizephy, tr(ji,jj,jk,jpphy,Kbb) ) + sizena(ji,jj,jk) = 1. + ( xsizern -1.0 ) * zcoef / ( xsizephy + zcoef ) + END_3D + + + ! Compute the fraction of nanophytoplankton that is made of calcifiers + ! This is a purely adhoc formulation described in Aumont et al. (2015) + ! This fraction depends on nutrient limitation, light, temperature + ! -------------------------------------------------------------------- + DO_3D( 0, 0, 0, 0, 1, jpkm1) + ztem1 = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) + 1.8) + ztem2 = ts(ji,jj,jk,jp_tem,Kmm) - 10. + zetot1 = MAX( 0., etot_ndcy(ji,jj,jk) - 1.) / ( 4. + etot_ndcy(ji,jj,jk) ) + zetot2 = 30. / ( 30.0 + etot_ndcy(ji,jj,jk) ) + + xfracal(ji,jj,jk) = caco3r * xlimphy(ji,jj,jk) & + & * ztem1 / ( 0.1 + ztem1 ) & + & * MAX( 1., tr(ji,jj,jk,jpphy,Kbb) / xsizephy ) & + & * zetot1 * zetot2 & + & * ( 1. + EXP(-ztem2 * ztem2 / 25. ) ) & + & * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) ) + xfracal(ji,jj,jk) = MIN( 0.8 , xfracal(ji,jj,jk) ) + xfracal(ji,jj,jk) = MAX( 0.02, xfracal(ji,jj,jk) ) + END_3D + ! + IF( lk_iomput .AND. knt == nrdttrc ) THEN ! save output diagnostics + ! + IF( l_dia_fracal ) THEN ! fraction of calcifiers + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + zw3d(A2D(0),1:jpkm1) = xfracal(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) + CALL iom_put( "xfracal", zw3d) + DEALLOCATE( zw3d ) + ENDIF + ! + IF( l_dia_nut_lim ) THEN ! Nutrient limitation term + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + zw3d(A2D(0),1:jpkm1) = xlimphy(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) + CALL iom_put( "LNnut", zw3d) + DEALLOCATE( zw3d ) + ENDIF + ! + IF( l_dia_size_lim ) THEN ! Size limitation term + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + zw3d(A2D(0),1:jpkm1) = sizen(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) + CALL iom_put( "SIZEN", zw3d) + DEALLOCATE( zw3d ) + ENDIF + ! + ENDIF + ! + IF( ln_timing ) CALL timing_stop('p2z_lim') + ! + END SUBROUTINE p2z_lim + + + SUBROUTINE p2z_lim_init + !!---------------------------------------------------------------------- + !! *** ROUTINE p2z_lim_init *** + !! + !! ** Purpose : Initialization of the nutrient limitation parameters + !! + !! ** Method : Read the namp2zlim namelist and check the parameters + !! called at the first timestep (nittrc000) + !! + !! ** input : Namelist namp2zlim + !! + !!---------------------------------------------------------------------- + INTEGER :: ios ! Local integer + + ! Namelist block + NAMELIST/namp2zlim/ concnno3, concbno3, concnfer, xsizephy, xsizern, & + & concbfe, xkdoc, caco3r, oxymin + !!---------------------------------------------------------------------- + ! + IF(lwp) THEN + WRITE(numout,*) + WRITE(numout,*) 'p2z_lim_init : initialization of nutrient limitations' + WRITE(numout,*) '~~~~~~~~~~~~' + ENDIF + ! + READ ( numnatp_ref, namp2zlim, IOSTAT = ios, ERR = 901) +901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp2zlim in reference namelist' ) + READ ( numnatp_cfg, namp2zlim, IOSTAT = ios, ERR = 902 ) +902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namp2zlim in configuration namelist' ) + IF(lwm) WRITE( numonp, namp2zlim ) + + ! + IF(lwp) THEN ! control print + WRITE(numout,*) ' Namelist : namp2zlim' + WRITE(numout,*) ' mean rainratio caco3r = ', caco3r + WRITE(numout,*) ' NO3 half saturation of phyto concnno3 = ', concnno3 + WRITE(numout,*) ' Iron half saturation for nanophyto concnfer = ', concnfer + WRITE(numout,*) ' Fe half saturation for bacteria concbfe = ', concbfe + WRITE(numout,*) ' half-sat. of DOC remineralization xkdoc = ', xkdoc + WRITE(numout,*) ' size ratio for phytoplankton xsizern = ', xsizern + WRITE(numout,*) ' NO3 half saturation of bacteria concbno3 = ', concbno3 + WRITE(numout,*) ' Minimum size criteria for phyto xsizephy = ', xsizephy + WRITE(numout,*) ' halk saturation constant for anoxia oxymin =' , oxymin + ENDIF + ! + xfracal (:,:,jpk) = 0._wp + xlimphy (:,:,jpk) = 0._wp + ! + END SUBROUTINE p2z_lim_init + + + INTEGER FUNCTION p2z_lim_alloc() + !!---------------------------------------------------------------------- + !! *** ROUTINE p5z_lim_alloc *** + !! + ! Allocation of the arrays used in this module + !!---------------------------------------------------------------------- + USE lib_mpp , ONLY: ctl_stop + !!---------------------------------------------------------------------- + + !* Biological arrays for phytoplankton growth + ALLOCATE( xnanono3(A2D(0),jpk), xlimphy (A2D(0),jpk), & + & xlimnfe (A2D(0),jpk), xlimbac (A2D(0),jpk), & + & xlimbacl(A2D(0),jpk), STAT=p2z_lim_alloc ) + + ! + IF( p2z_lim_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p2z_lim_alloc : failed to allocate arrays.' ) + ! + END FUNCTION p2z_lim_alloc + + !!====================================================================== +END MODULE p2zlim diff --git a/src/TOP/PISCES/P4Z/p2zmicro.F90 b/src/TOP/PISCES/P4Z/p2zmicro.F90 new file mode 100644 index 0000000000000000000000000000000000000000..280a9733db59ffa7d230dd342ba260f6e9fd8104 --- /dev/null +++ b/src/TOP/PISCES/P4Z/p2zmicro.F90 @@ -0,0 +1,306 @@ +MODULE p2zmicro + !!====================================================================== + !! *** MODULE p2zmicro *** + !! TOP : REDUCED PISCES Compute the sources/sinks for microzooplankton + !!====================================================================== + !! History : 1.0 ! 2004 (O. Aumont) Original code + !! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90 + !! 3.4 ! 2011-06 (O. Aumont, C. Ethe) Quota model for iron + !!---------------------------------------------------------------------- + !! p2z_micro : Compute the sources/sinks for microzooplankton + !! p2z_micro_init : Initialize and read the appropriate namelist + !!---------------------------------------------------------------------- + USE oce_trc ! shared variables between ocean and passive tracers + USE trc ! passive tracers common variables + USE sms_pisces ! PISCES Source Minus Sink variables + USE p2zprod ! production + USE p4zsink ! sedimentation of particles + USE iom ! I/O manager + USE prtctl ! print control for debugging + + IMPLICIT NONE + PRIVATE + + !! * Shared module variables + PUBLIC p2z_micro ! called in p2zbio.F90 + PUBLIC p2z_micro_init ! called in trcsms_pisces.F90 + + REAL(wp), PUBLIC :: part !: part of calcite not dissolved in microzoo guts + REAL(wp), PUBLIC :: xprefc !: microzoo preference for POC + REAL(wp), PUBLIC :: xprefn !: microzoo preference for nanophyto + REAL(wp), PUBLIC :: xprefz !: microzoo preference for microzooplankton + REAL(wp), PUBLIC :: xthreshphy !: nanophyto threshold for microzooplankton + REAL(wp), PUBLIC :: xthreshpoc !: poc threshold for microzooplankton + REAL(wp), PUBLIC :: xthreshzoo !: microzoo threshold for microzooplankton + REAL(wp), PUBLIC :: xthresh !: feeding threshold for microzooplankton + REAL(wp), PUBLIC :: resrat !: exsudation rate of microzooplankton + REAL(wp), PUBLIC :: mzrat !: microzooplankton mortality rate + REAL(wp), PUBLIC :: grazrat !: maximal microzoo grazing rate + REAL(wp), PUBLIC :: xkgraz !: Half-saturation constant of assimilation + REAL(wp), PUBLIC :: unass !: Non-assimilated part of food + REAL(wp), PUBLIC :: sigma1 !: Fraction of microzoo excretion as DOM + REAL(wp), PUBLIC :: epsher !: growth efficiency for grazing 1 + REAL(wp), PUBLIC :: epshermin !: minimum growth efficiency for grazing 1 + + LOGICAL :: l_dia_graz1, l_dia_lprodz + + !! * Substitutions +# include "do_loop_substitute.h90" + !!---------------------------------------------------------------------- + !! NEMO/TOP 4.0 , NEMO Consortium (2018) + !! $Id: p2zmicro.F90 15459 2021-10-29 08:19:18Z cetlod $ + !! Software governed by the CeCILL license (see ./LICENSE) + !!---------------------------------------------------------------------- +CONTAINS + + SUBROUTINE p2z_micro( kt, knt, Kbb, Krhs ) + !!--------------------------------------------------------------------- + !! *** ROUTINE p2z_micro *** + !! + !! ** Purpose : Compute the sources/sinks for microzooplankton + !! This includes ingestion and assimilation, flux feeding + !! and mortality. We use a passive prey switching + !! parameterization. + !! All living compartments smaller than microzooplankton + !! are potential preys of microzooplankton + !! + !! ** Method : - ??? + !!--------------------------------------------------------------------- + INTEGER, INTENT(in) :: kt ! ocean time step + INTEGER, INTENT(in) :: knt ! ??? + INTEGER, INTENT(in) :: Kbb, Krhs ! time level indices + ! + INTEGER :: ji, jj, jk + REAL(wp) :: zcompaz , zcompaph, zcompapoc + REAL(wp) :: zgraze, zdenom, zfact, zfood, zfoodlim, zbeta + REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgrarsig, zgraztotc, zgraztotn + REAL(wp) :: zgrarem, zgrapoc, zprcaca, zmortz + REAL(wp) :: zrespz, ztortz, zgrasratn + REAL(wp) :: zgraznc, zgrazz, zgrazpoc + REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmptot, zproport, zproport2 + REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zgrazing + CHARACTER (len=25) :: charout + + !!--------------------------------------------------------------------- + ! + IF( ln_timing ) CALL timing_start('p2z_micro') + ! + IF( kt == nittrc000 ) THEN + l_dia_graz1 = iom_use( "GRAZ1" ) + ENDIF + IF( l_dia_graz1 ) THEN + ALLOCATE( zgrazing(A2D(0),jpk) ) + ENDIF + ! + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - 1.e-9 ), 0.e0 ) + zfact = xstep * tgfunc2(ji,jj,jk) * zcompaz + + ! Proportion of diatoms that are within the size range + ! accessible to microzooplankton. + zproport = MAX(sizen(ji,jj,jk)/3.0,1.0)**(-0.48)*(1.0 - (sizen(ji,jj,jk)**2.0 - 1.0) / 160.0) + zproport2 = MIN(1.0, ( wsbio2 - wsbio3(ji,jj,jk) ) / ( wsbio2 - wsbio ) ) + + ! linear mortality of mesozooplankton + ! A michaelis menten modulation term is used to avoid extinction of + ! microzooplankton at very low food concentrations. Mortality is + ! enhanced in low O2 waters + ! ----------------------------------------------------------------- + zrespz = resrat * zfact * ( tr(ji,jj,jk,jpzoo,Kbb) / ( xkmort + tr(ji,jj,jk,jpzoo,Kbb) ) & + & + 3. * nitrfac(ji,jj,jk) ) + + ! Zooplankton quadratic mortality. A square function has been selected with + ! to mimic predation and disease (density dependent mortality). It also tends + ! to stabilise the model + ! ------------------------------------------------------------------------- + ztortz = mzrat * 1.e6 * zfact * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) + zmortz = ztortz + zrespz + + ! Computation of the abundance of the preys + ! A threshold can be specified in the namelist + ! Diatoms have a specific treatment. WHen concentrations + ! exceed a certain value, diatoms are suppposed to be too + ! big for microzooplankton. + ! -------------------------------------------------------- + zcompaph = zproport * MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthreshphy ), 0.e0 ) + zcompapoc = zproport2 * MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthreshpoc ), 0.e0 ) + zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthreshzoo ), 0.e0 ) + + ! Microzooplankton grazing + ! The total amount of food is the sum of all preys accessible to mesozooplankton + ! multiplied by their food preference + ! A threshold can be specified in the namelist (xthresh). However, when food + ! concentration is close to this threshold, it is decreased to avoid the + ! accumulation of food in the mesozoopelagic domain + ! ------------------------------------------------------------------------------- + zfood = xprefn * zcompaph + xprefc * zcompapoc + xprefz * zcompaz + zfoodlim = MAX( 0. , zfood - min(xthresh,0.5*zfood) ) + zdenom = zfoodlim / ( xkgraz + zfoodlim ) + zgraze = grazrat * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) + + ! An active switching parameterization is used here. + ! We don't use the KTW parameterization proposed by + ! Vallina et al. because it tends to produce too steady biomass + ! composition and the variance of Chl is too low as it grazes + ! too strongly on winning organisms. We use a generalized + ! switching parameterization proposed by Morozov and + ! Petrovskii (2013) + ! ------------------------------------------------------------ + ! The width of the selection window is increased when preys + ! have low abundance, .i.e. zooplankton become less specific + ! to avoid starvation. + ! ---------------------------------------------------------- + ztmp1 = xprefn * zcompaph**2 + ztmp2 = xprefc * zcompapoc**2 + ztmp3 = xprefz * zcompaz**2 + ztmptot = ztmp1 + ztmp2 + ztmp3 + rtrn + ztmp1 = ztmp1 / ztmptot + ztmp2 = ztmp2 / ztmptot + ztmp3 = ztmp3 / ztmptot + + ! Ingestion terms on the different preys of microzooplankton + zgraznc = zgraze * ztmp1 * zdenom ! Nanophytoplankton + zgrazpoc = zgraze * ztmp2 * zdenom ! POC + zgrazz = zgraze * ztmp3 * zdenom ! Microzoo + + ! Ingestion terms on the iron content of the different preys + ! Total ingestion rate in C, Fe, N units + zgraztotc = zgraznc + zgrazpoc + zgrazz + IF( l_dia_graz1 ) zgrazing(ji,jj,jk) = zgraztotc + zgraztotn = zgraznc * quotan(ji,jj,jk) + zgrazpoc + zgrazz + + ! Stoichiometruc ratios of the food ingested by zooplanton + ! -------------------------------------------------------- + zgrasratn = ( zgraztotn + rtrn ) / ( zgraztotc + rtrn ) + + ! Microzooplankton efficiency. + ! We adopt a formulation proposed by Mitra et al. (2007) + ! The gross growth efficiency is controled by the most limiting nutrient. + ! Growth is also further decreased when the food quality is poor. This is currently + ! hard coded : it can be decreased by up to 50% (zepsherq) + ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and + ! Fulton, 2012) + ! ----------------------------------------------------------------------------- + zepshert = MIN( 1., zgrasratn ) + zbeta = MAX(0., (epsher - epshermin) ) + ! Food quantity deprivation of the GGE + zepsherf = epshermin + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) + ! Food quality deprivation of the GGE + zepsherq = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) + ! Actual GGE of microzooplankton + zepsherv = zepsherf * zepshert * zepsherq + ! Excretion of C, N, P + zgrarem = zgraztotc * ( 1. - zepsherv - unass ) + ( 1. - epsher - unass ) / ( 1. - epsher ) * ztortz + ! Egestion of C, N, P + zgrapoc = zgraztotc * unass + unass / ( 1. - epsher ) * ztortz + zrespz + + ! Update of the TRA arrays + ! ------------------------ + ! Fraction of excretion as inorganic nutrients and DIC + zgrarsig = zgrarem * sigma1 + tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) + zgrarsig + tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgrarem - zgrarsig + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgrarem * feratz + ! + tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - (o2ut + o2nit) * zgrarsig + tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarsig + tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - rno3 * zgrarsig + ! Update the arrays TRA which contain the biological sources and sinks + ! -------------------------------------------------------------------- + tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zmortz + zepsherv * zgraztotc - zgrazz + tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc + tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zgrapoc - zgrazpoc + prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zgrapoc + conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc + ! + ! Calcite remineralization due to zooplankton activity + ! part of the ingested calcite is not dissolving in the acidic gut + ! ---------------------------------------------------------------- + zprcaca = xfracal(ji,jj,jk) * zgraznc + prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca * part ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) + ! + zprcaca = part * zprcaca + tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zprcaca + tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * zprcaca + END_3D + ! + IF( lk_iomput .AND. knt == nrdttrc ) THEN + ! + IF( l_dia_graz1 ) THEN ! Total grazing of phyto by zooplankton + zgrazing(A2D(0),jpk) = 0._wp + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zgrazing(ji,jj,jk) = zgrazing(ji,jj,jk) * 1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in mol/m2/s + END_3D + CALL iom_put( "GRAZ1" , zgrazing ) + DEALLOCATE( zgrazing ) + ENDIF + ! + ENDIF + ! + IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) + WRITE(charout, FMT="('micro')") + CALL prt_ctl_info( charout, cdcomp = 'top' ) + CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) + ENDIF + ! + IF( ln_timing ) CALL timing_stop('p2z_micro') + ! + END SUBROUTINE p2z_micro + + + SUBROUTINE p2z_micro_init + !!---------------------------------------------------------------------- + !! *** ROUTINE p2z_micro_init *** + !! + !! ** Purpose : Initialization of microzooplankton parameters + !! + !! ** Method : Read the namp2zzoo namelist and check the parameters + !! called at the first timestep (nittrc000) + !! + !! ** input : Namelist namp2zzoo + !! + !!---------------------------------------------------------------------- + INTEGER :: ios ! Local integer + ! + NAMELIST/namp2zzoo/ part, grazrat, resrat, mzrat, xprefn, xprefc, & + & xprefz, xthreshphy, xthreshpoc, xthreshzoo, & + & xthresh, xkgraz, epsher, epshermin, sigma1, unass + !!---------------------------------------------------------------------- + ! + IF(lwp) THEN + WRITE(numout,*) + WRITE(numout,*) 'p2z_micro_init : Initialization of microzooplankton parameters' + WRITE(numout,*) '~~~~~~~~~~~~~~' + ENDIF + ! + READ ( numnatp_ref, namp2zzoo, IOSTAT = ios, ERR = 901) +901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp2zzoo in reference namelist' ) + + READ ( numnatp_cfg, namp2zzoo, IOSTAT = ios, ERR = 902 ) +902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namp2zzoo in configuration namelist' ) + IF(lwm) WRITE( numonp, namp2zzoo ) + ! + IF(lwp) THEN ! control print + WRITE(numout,*) ' Namelist : namp2zzoo' + WRITE(numout,*) ' part of calcite not dissolved in microzoo guts part =', part + WRITE(numout,*) ' microzoo preference for POC xprefc =', xprefc + WRITE(numout,*) ' microzoo preference for nano xprefn =', xprefn + WRITE(numout,*) ' microzoo preference for microzooplankton xprefz =', xprefz + WRITE(numout,*) ' nanophyto feeding threshold for microzoo xthreshphy =', xthreshphy + WRITE(numout,*) ' poc feeding threshold for microzoo xthreshpoc =', xthreshpoc + WRITE(numout,*) ' microzoo feeding threshold for microzoo xthreshzoo =', xthreshzoo + WRITE(numout,*) ' feeding threshold for microzooplankton xthresh =', xthresh + WRITE(numout,*) ' exsudation rate of microzooplankton resrat =', resrat + WRITE(numout,*) ' microzooplankton mortality rate mzrat =', mzrat + WRITE(numout,*) ' maximal microzoo grazing rate grazrat =', grazrat + WRITE(numout,*) ' non assimilated fraction of P by microzoo unass =', unass + WRITE(numout,*) ' Efficicency of microzoo growth epsher =', epsher + WRITE(numout,*) ' Minimum efficicency of microzoo growth epshermin =', epshermin + WRITE(numout,*) ' Fraction of microzoo excretion as DOM sigma1 =', sigma1 + WRITE(numout,*) ' half saturation constant for grazing 1 xkgraz =', xkgraz + ENDIF + ! + END SUBROUTINE p2z_micro_init + + !!====================================================================== +END MODULE p2zmicro diff --git a/src/TOP/PISCES/P4Z/p2zmort.F90 b/src/TOP/PISCES/P4Z/p2zmort.F90 new file mode 100644 index 0000000000000000000000000000000000000000..7579498a093778def113c6cf6285c3c27dbe0637 --- /dev/null +++ b/src/TOP/PISCES/P4Z/p2zmort.F90 @@ -0,0 +1,140 @@ +MODULE p2zmort + !!====================================================================== + !! *** MODULE p2zmort *** + !! TOP : PISCES Compute the mortality terms for phytoplankton + !!====================================================================== + !! History : 1.0 ! 2002 (O. Aumont) Original code + !! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90 + !!---------------------------------------------------------------------- + !! p4z_mort : Compute the mortality terms for phytoplankton + !! p4z_mort_init : Initialize the mortality params for phytoplankton + !!---------------------------------------------------------------------- + USE oce_trc ! shared variables between ocean and passive tracers + USE trc ! passive tracers common variables + USE sms_pisces ! PISCES Source Minus Sink variables + USE p2zlim ! Phytoplankton limitation terms + USE prtctl ! print control for debugging + + IMPLICIT NONE + PRIVATE + + PUBLIC p2z_mort ! Called from p4zbio.F90 + PUBLIC p2z_mort_init ! Called from trcini_pisces.F90 + + REAL(wp), PUBLIC :: wchln !: Quadratic mortality rate of nanophytoplankton + REAL(wp), PUBLIC :: mpratn !: Linear mortality rate of nanophytoplankton + + !! * Substitutions +# include "do_loop_substitute.h90" + !!---------------------------------------------------------------------- + !! NEMO/TOP 4.0 , NEMO Consortium (2018) + !! $Id: p4zmort.F90 15459 2021-10-29 08:19:18Z cetlod $ + !! Software governed by the CeCILL license (see ./LICENSE) + !!---------------------------------------------------------------------- +CONTAINS + + SUBROUTINE p2z_mort( kt, Kbb, Krhs ) + !!--------------------------------------------------------------------- + !! *** ROUTINE p4z_mort_nano *** + !! + !! ** Purpose : Compute the mortality terms for nanophytoplankton + !! + !! ** Method : Both quadratic and simili linear mortality terms + !!--------------------------------------------------------------------- + INTEGER, INTENT(in) :: kt ! ocean time step + INTEGER, INTENT(in) :: Kbb, Krhs ! time level indices + !!--------------------------------------------------------------------- + ! + INTEGER :: ji, jj, jk + REAL(wp) :: zcompaph, zprcaca + REAL(wp) :: ztortp , zrespp , zmortp, zlim1, zlim2 + CHARACTER (len=25) :: charout + !!--------------------------------------------------------------------- + ! + IF( ln_timing ) CALL timing_start('p2z_mort') + ! + prodcal(:,:,:) = 0._wp ! calcite production variable set to zero + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - 1e-9 ), 0.e0 ) + + ! Quadratic mortality of nano due to aggregation during + ! blooms (Doney et al. 1996) + ! ----------------------------------------------------- + zlim2 = xlimphy(ji,jj,jk) * xlimphy(ji,jj,jk) + zlim1 = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) * tr(ji,jj,jk,jpphy,Kbb) + zrespp = wchln * 1.e6 * xstep * zlim1 * xdiss(ji,jj,jk) * zcompaph + + ! Phytoplankton linear mortality + ! A michaelis-menten like term is introduced to avoid + ! extinction of nanophyto in highly limited areas + ! ---------------------------------------------------- + ztortp = mpratn * xstep * zcompaph / ( xkmort + tr(ji,jj,jk,jpphy,Kbb) ) * tr(ji,jj,jk,jpphy,Kbb) + + zmortp = zrespp + ztortp + + ! Update the arrays TRA which contains the biological sources and sinks + tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zmortp + + ! Production PIC particles due to mortality + zprcaca = xfracal(ji,jj,jk) * zmortp + prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) + + ! POC associated with the shell is supposed to be routed to + ! big particles because of the ballasting effect + tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zprcaca + tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * zprcaca + tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zmortp + prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortp + ! + END_3D + ! + IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) + WRITE(charout, FMT="('nano')") + CALL prt_ctl_info( charout, cdcomp = 'top' ) + CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) + ENDIF + ! + IF( ln_timing ) CALL timing_stop('p2z_mort') + ! + END SUBROUTINE p2z_mort + + SUBROUTINE p2z_mort_init + !!---------------------------------------------------------------------- + !! *** ROUTINE p2z_mort_init *** + !! + !! ** Purpose : Initialization of phytoplankton parameters + !! + !! ** Method : Read the namp4zmort namelist and check the parameters + !! called at the first timestep + !! + !! ** input : Namelist namp2zmort + !! + !!---------------------------------------------------------------------- + INTEGER :: ios ! Local integer + ! + NAMELIST/namp2zmort/ wchln, mpratn + !!---------------------------------------------------------------------- + ! + IF(lwp) THEN + WRITE(numout,*) + WRITE(numout,*) 'p2z_mort_init : Initialization of phytoplankton mortality parameters' + WRITE(numout,*) '~~~~~~~~~~~~~' + ENDIF + ! + READ ( numnatp_ref, namp2zmort, IOSTAT = ios, ERR = 901) +901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp4zmort in reference namelist' ) + + READ ( numnatp_cfg, namp2zmort, IOSTAT = ios, ERR = 902 ) +902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namp4zmort in configuration namelist' ) + IF(lwm) WRITE( numonp, namp2zmort ) + ! + IF(lwp) THEN ! control print + WRITE(numout,*) ' Namelist : namp4zmort' + WRITE(numout,*) ' quadratic mortality of phytoplankton wchln =', wchln + WRITE(numout,*) ' phytoplankton mortality rate mpratn =', mpratn + ENDIF + ! + END SUBROUTINE p2z_mort_init + + !!====================================================================== +END MODULE p2zmort diff --git a/src/TOP/PISCES/P4Z/p2zprod.F90 b/src/TOP/PISCES/P4Z/p2zprod.F90 new file mode 100644 index 0000000000000000000000000000000000000000..53ac064f301ea2c00eeac030595efe60d0f350ba --- /dev/null +++ b/src/TOP/PISCES/P4Z/p2zprod.F90 @@ -0,0 +1,320 @@ +MODULE p2zprod + !!====================================================================== + !! *** MODULE p2zprod *** + !! TOP : Growth Rate of phytoplankton + !!====================================================================== + !! History : 1.0 ! 2004 (O. Aumont) Original code + !! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90 + !! 3.4 ! 2011-05 (O. Aumont, C. Ethe) New parameterization of light limitation + !!---------------------------------------------------------------------- + !! p2z_prod : Compute the growth Rate of the two phytoplanktons groups + !! p2z_prod_init : Initialization of the parameters for growth + !! p2z_prod_alloc : Allocate variables for growth + !!---------------------------------------------------------------------- + USE oce_trc ! shared variables between ocean and passive tracers + USE trc ! passive tracers common variables + USE sms_pisces ! PISCES Source Minus Sink variables + USE p2zlim ! Co-limitations of differents nutrients + USE prtctl ! print control for debugging + USE iom ! I/O manager + + IMPLICIT NONE + PRIVATE + + PUBLIC p2z_prod ! called in p4zbio.F90 + PUBLIC p2z_prod_init ! called in trcsms_pisces.F90 + PUBLIC p2z_prod_alloc ! called in trcini_pisces.F90 + + REAL(wp), PUBLIC :: pislopen !: P-I slope of nanophytoplankton + REAL(wp), PUBLIC :: xadap !: Adaptation factor to low light + REAL(wp), PUBLIC :: excretn !: Excretion ratio of nanophyto + REAL(wp), PUBLIC :: bresp !: Basal respiration rate + REAL(wp), PUBLIC :: chlcnm !: Maximum Chl/C ratio of nano + REAL(wp), PUBLIC :: chlcmin !: Minimum Chl/C ratio of phytoplankton + + REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: quotan !: proxy of N quota in Nanophyto + + REAL(wp) :: r1_rday ! 1 / rday + REAL(wp) :: texcretn ! 1 - excretn + + LOGICAL :: l_dia_ppphy + LOGICAL :: l_dia_mu, l_dia_light, l_dia_lprod + !! * Substitutions +# include "do_loop_substitute.h90" +# include "domzgr_substitute.h90" + !!---------------------------------------------------------------------- + !! NEMO/TOP 4.0 , NEMO Consortium (2018) + !! $Id: p2zprod.F90 15459 2021-10-29 08:19:18Z cetlod $ + !! Software governed by the CeCILL license (see ./LICENSE) + !!---------------------------------------------------------------------- +CONTAINS + + SUBROUTINE p2z_prod( kt , knt, Kbb, Kmm, Krhs ) + !!--------------------------------------------------------------------- + !! *** ROUTINE p2z_prod *** + !! + !! ** Purpose : Computes phytoplankton production depending on + !! light, temperature and nutrient availability + !! Computes also the chlorophyll content + !!--------------------------------------------------------------------- + INTEGER, INTENT(in) :: kt, knt ! + INTEGER, INTENT(in) :: Kbb, Kmm, Krhs ! time level indices + ! + INTEGER :: ji, jj, jk + REAL(wp) :: znanotot, zpislopen, zfact + REAL(wp) :: zlimfac, zsizetmp, zprodfer, zprprod + REAL(wp) :: zprod, zval, zmxl_fac + CHARACTER (len=25) :: charout + REAL(wp), DIMENSION(A2D(0),jpk) :: zprmax, zmxl + REAL(wp), DIMENSION(A2D(0),jpk) :: zprbio, zprchln + REAL(wp), DIMENSION(A2D(0),jpk) :: zprorcan + REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d + !!--------------------------------------------------------------------- + ! + IF( ln_timing ) CALL timing_start('p2z_prod') + ! + IF( kt == nittrc000 ) THEN + l_dia_ppphy = iom_use( "PPPHYN" ) .OR. iom_use( "TPP" ) + l_dia_mu = iom_use( "Mumax" ) .OR. iom_use( "MuN" ) + l_dia_light = iom_use( "LNlight") + ENDIF + + ! Initialize the local arrays + zprorcan(:,:,:) = 0._wp + zprbio (:,:,:) = 0._wp + zmxl (:,:,:) = 0._wp + + ! Computation of the maximimum production. Based on a Q10 description + ! of the thermal dependency. Parameters are taken from Bissinger et al. (2008) + zprmax(:,:,:) = 0.65_wp * r1_rday * tgfunc(:,:,:) + + ! Intermittency is supposed to have a similar effect on production as + ! day length (Shatwell et al., 2012). The correcting factor is zmxl_fac. + ! zmxl_chl is the fractional day length and is used to compute the mean + ! PAR during daytime. The effect of mixing is computed using the + ! absolute light level definition of the euphotic zone + ! ------------------------------------------------------------------------- + IF ( ln_p4z_dcyc ) THEN ! Diurnal cycle in PISCES + DO_3D( 0, 0, 0, 0, 1, jpkm1) + IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + zval = 24.0 + IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN + zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) + ENDIF + zmxl(ji,jj,jk) = zval + ENDIF + END_3D + ELSE ! No diurnal cycle in PISCES + DO_3D( 0, 0, 0, 0, 1, jpkm1) + IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + zval = MAX( 1., strn(ji,jj) ) + IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN + zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) + ENDIF + zmxl(ji,jj,jk) = zval + ENDIF + END_3D + ENDIF + + ! The formulation proposed by Geider et al. (1997) has been modified + ! to exclude the effect of nutrient limitation and temperature in the PI + ! curve following Vichi et al. (2007) + ! ----------------------------------------------------------------------- + DO_3D( 0, 0, 0, 0, 1, jpkm1) + IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) ) + zprprod = zprmax(ji,jj,jk) * zmxl_fac + ! + ! The initial slope of the PI curve can be increased for nano + ! to account for photadaptation, for instance in the DCM + ! This parameterization is adhoc and should be either + ! improved or removed in future versions of the model + ! Nanophytoplankton + ! Computation of production function for Carbon + ! Actual light levels are used here + ! ---------------------------------------------- + zpislopen = pislopen * thetanano(ji,jj,jk) / ( zprprod * rday * xlimphy(ji,jj,jk) + rtrn ) + zprchln(ji,jj,jk) = zprprod * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) ) + zprbio(ji,jj,jk) = zprprod * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) ) ) + ENDIF + END_3D + + ! Computation of a proxy of the N/C quota from nutrient limitation + ! and light limitation. Steady state is assumed to allow the computation + ! ---------------------------------------------------------------------- +! thetanano(:,:,:) = chlcnm + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zval = xnanono3(ji,jj,jk) * zprmax(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn ) + quotan(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval ) + + ! Diagnostic Chl/C ratio according to Geider et al. (1997) + ! -------------------------------------------------------- + zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) ) + thetanano(ji,jj,jk) = chlcnm / ( 1.0 + pislopen * chlcnm * enanom(ji,jj,jk) & + & / ( 2.0 * zprmax(ji,jj,jk) * zmxl_fac * xlimphy(ji,jj,jk) * rday + rtrn ) ) + thetanano(ji,jj,jk) = MAX( chlcmin, thetanano(ji,jj,jk) ) + END_3D + + ! Sea-ice effect on production + ! No production is assumed below sea ice + ! -------------------------------------- + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) + END_3D + + ! Computation of the various production and nutrient uptake terms + ! --------------------------------------------------------------- + DO_3D( 0, 0, 0, 0, 1, jpkm1) + IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + ! production terms for nanophyto. (C) + zprorcan(ji,jj,jk) = zprbio(ji,jj,jk) * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2 + ! + ! Size computation + ! Size is made a function of the limitation of of phytoplankton growth + ! Strongly limited cells are supposed to be smaller. sizena is the + ! size at time step t+1 and is thus updated at the end of the + ! current time step + ! -------------------------------------------------------------------- + zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmax(ji,jj,jk) + rtrn ) + zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) + sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) ) + ENDIF + END_3D + + ! Update the arrays TRA which contain the biological sources and sinks + DO_3D( 0, 0, 0, 0, 1, jpkm1) + IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + zprodfer = zprorcan(ji,jj,jk) * feratz * texcretn + ! + tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zprorcan(ji,jj,jk) + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprorcan(ji,jj,jk) * feratz * texcretn + consfe3(ji,jj,jk) = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) & + & * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2 + ! + tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) + zprorcan(ji,jj,jk) * texcretn + tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + excretn * zprorcan(ji,jj,jk) + tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + ( o2ut + o2nit ) * zprorcan(ji,jj,jk) + ! + tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zprorcan(ji,jj,jk) + tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zprorcan(ji,jj,jk) + ENDIF + END_3D + + ! Total primary production per year + IF( l_dia_ppphy .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc ) ) THEN + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = zprorcan(ji,jj,jk) * cvol(ji,jj,jk) + END_3D + tpp = glob_sum( 'p2zprod', zw3d ) + DEALLOCATE ( zw3d ) + ENDIF + + IF( lk_iomput .AND. knt == nrdttrc ) THEN + ! + ! Diagnostic Chl:C ratio + CALL iom_put( "THETANANO", thetanano(:,:,:) ) + IF( l_dia_ppphy ) THEN + zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + ! primary production by nanophyto + zw3d(A2D(0),1:jpkm1) = zprorcan(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) + CALL iom_put( "PPPHYN", zw3d ) + ! total primary production + zw3d(A2D(0),1:jpkm1) = zprorcan(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) + CALL iom_put( "TPP", zw3d ) + CALL iom_put( "tintpp" , tpp * zfact ) ! global total integrated primary production molC/s + DEALLOCATE ( zw3d ) + ENDIF + ! + IF( l_dia_mu ) THEN + zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + zw3d(A2D(0),1:jpkm1) = zprmax(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) + CALL iom_put( "Mumax", zw3d ) + ! Realized growth rate for nanophyto + zw3d(A2D(0),1:jpkm1) = zprbio(A2D(0),1:jpkm1) * xlimphy(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) + CALL iom_put( "MuN", zw3d ) + DEALLOCATE ( zw3d ) + ENDIF + ! + IF( l_dia_light ) THEN + zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + ! light limitation term for nano + zw3d(A2D(0),1:jpkm1) = zprbio(A2D(0),1:jpkm1) / ( zprmax(A2D(0),1:jpkm1) + rtrn ) * tmask(A2D(0),1:jpkm1) + CALL iom_put( "LNlight", zw3d ) + DEALLOCATE ( zw3d ) + ENDIF + ! + ENDIF + + IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) + WRITE(charout, FMT="('prod')") + CALL prt_ctl_info( charout, cdcomp = 'top' ) + CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) + ENDIF + ! + IF( ln_timing ) CALL timing_stop('p2z_prod') + ! + END SUBROUTINE p2z_prod + + + SUBROUTINE p2z_prod_init + !!---------------------------------------------------------------------- + !! *** ROUTINE p2z_prod_init *** + !! + !! ** Purpose : Initialization of phytoplankton production parameters + !! + !! ** Method : Read the namp2zprod namelist and check the parameters + !! called at the first timestep (nittrc000) + !! + !! ** input : Namelist namp2zprod + !!---------------------------------------------------------------------- + INTEGER :: ios ! Local integer + ! + ! Namelist block + NAMELIST/namp2zprod/ pislopen, bresp, excretn, & + & chlcnm, chlcmin + !!---------------------------------------------------------------------- + ! + IF(lwp) THEN ! control print + WRITE(numout,*) + WRITE(numout,*) 'p2z_prod_init : phytoplankton growth' + WRITE(numout,*) '~~~~~~~~~~~~~' + ENDIF + ! + READ ( numnatp_ref, namp2zprod, IOSTAT = ios, ERR = 901) +901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp2zprod in reference namelist' ) + + READ ( numnatp_cfg, namp2zprod, IOSTAT = ios, ERR = 902 ) +902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namp2zprod in configuration namelist' ) + IF(lwm) WRITE( numonp, namp2zprod ) + + IF(lwp) THEN ! control print + WRITE(numout,*) ' Namelist : namp2zprod' + WRITE(numout,*) ' P-I slope pislopen =', pislopen + WRITE(numout,*) ' excretion ratio of nanophytoplankton excretn =', excretn + WRITE(numout,*) ' basal respiration in phytoplankton bresp =', bresp + WRITE(numout,*) ' Maximum Chl/C in phytoplankton chlcmin =', chlcmin + WRITE(numout,*) ' Minimum Chl/C in nanophytoplankton chlcnm =', chlcnm + ENDIF + ! + r1_rday = 1._wp / rday + texcretn = 1._wp - excretn + tpp = 0._wp + ! + END SUBROUTINE p2z_prod_init + + INTEGER FUNCTION p2z_prod_alloc() + !!---------------------------------------------------------------------- + !! *** ROUTINE p2z_prod_alloc *** + !!---------------------------------------------------------------------- + ALLOCATE( quotan(A2D(0),jpk), STAT = p2z_prod_alloc ) + ! + IF( p2z_prod_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p2z_prod_alloc : failed to allocate arrays.' ) + ! + END FUNCTION p2z_prod_alloc + + !!====================================================================== +END MODULE p2zprod diff --git a/src/TOP/PISCES/P4Z/p4zagg.F90 b/src/TOP/PISCES/P4Z/p4zagg.F90 index 9c16b164791712b8966b24c246bd03e943facb70..13a5cef0178b457281c8a31305fce3117dfeb692 100644 --- a/src/TOP/PISCES/P4Z/p4zagg.F90 +++ b/src/TOP/PISCES/P4Z/p4zagg.F90 @@ -57,7 +57,7 @@ CONTAINS REAL(wp) :: zaggpoc , zaggfe, zaggdoc, zaggdoc2, zaggdoc3 REAL(wp) :: zaggpon , zaggdon, zaggdon2, zaggdon3 REAL(wp) :: zaggpop, zaggdop, zaggdop2, zaggdop3 - REAL(wp) :: zaggtmp, zfact, zmax + REAL(wp) :: zaggtmp, zfact CHARACTER (len=25) :: charout !!--------------------------------------------------------------------- ! @@ -122,18 +122,18 @@ CONTAINS zfact = xstep * xdiss(ji,jj,jk) ! Part I : Coagulation dependent on turbulence ! The stickiness has been assumed to be 0.1 - zaggtmp = 25.9 * zfact * tr(ji,jj,jk,jppoc,Kbb) + zaggtmp = 12.5 * zfact * tr(ji,jj,jk,jppoc,Kbb) zaggpoc1 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb) - zaggtmp = 4452. * zfact * tr(ji,jj,jk,jpgoc,Kbb) + zaggtmp = 169.7 * zfact * tr(ji,jj,jk,jpgoc,Kbb) zaggpoc2 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb) ! Part II : Differential settling ! The stickiness has been assumed to be 0.1 ! Aggregation of small into large particles - zaggtmp = 47.1 * xstep * tr(ji,jj,jk,jpgoc,Kbb) + zaggtmp = 8.63 * xstep * tr(ji,jj,jk,jpgoc,Kbb) zaggpoc3 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb) - zaggtmp = 3.3 * xstep * tr(ji,jj,jk,jppoc,Kbb) + zaggtmp = 132.8 * xstep * tr(ji,jj,jk,jppoc,Kbb) zaggpoc4 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb) zaggpoc = zaggpoc1 + zaggpoc2 + zaggpoc3 + zaggpoc4 @@ -146,8 +146,8 @@ CONTAINS ! 2nd term is shear aggregation of DOC-POC ! 3rd term is differential settling of DOC-POC ! 1/3 of DOC is supposed to experience aggregation (HMW) - zaggtmp = ( ( 0.37 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 20.5 * tr(ji,jj,jk,jppoc,Kbb) ) * zfact & - & + 0.15 * xstep * tr(ji,jj,jk,jppoc,Kbb) ) + zaggtmp = ( ( 12.0 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 9.05 * tr(ji,jj,jk,jppoc,Kbb) ) * zfact & + & + 2.49 * xstep * tr(ji,jj,jk,jppoc,Kbb) ) zaggdoc = zaggtmp * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) zaggdon = zaggtmp * 0.3 * tr(ji,jj,jk,jpdon,Kbb) zaggdop = zaggtmp * 0.3 * tr(ji,jj,jk,jpdop,Kbb) @@ -156,19 +156,18 @@ CONTAINS ! 1st term is shear aggregation ! 2nd term is differential settling ! 1/3 of DOC is supposed to experience aggregation (HMW) - zaggtmp = 655.4 * zfact * tr(ji,jj,jk,jpgoc,Kbb) + zaggtmp = ( 1.94 * zfact + 1.37 * xstep ) * tr(ji,jj,jk,jpgoc,Kbb) zaggdoc2 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) zaggdon2 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdon,Kbb) zaggdop2 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdop,Kbb) ! tranfer of DOC to POC due to brownian motion ! 1/3 of DOC is supposed to experience aggregation (HMW) - zaggtmp = ( 260.2 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 418.5 * tr(ji,jj,jk,jppoc,Kbb) ) * xstep + zaggtmp = ( 127.8 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 725.7 * tr(ji,jj,jk,jppoc,Kbb) ) * xstep zaggdoc3 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) zaggdon3 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdon,Kbb) zaggdop3 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdop,Kbb) - ! Update the trends tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zaggpoc + zaggdoc + zaggdoc3 tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zaggpon + zaggdon + zaggdon3 diff --git a/src/TOP/PISCES/P4Z/p4zbc.F90 b/src/TOP/PISCES/P4Z/p4zbc.F90 index c05ae9a10d4ad3891846c094efcf35d81dce094a..ed2f909d808d5229957d0ea94dbca2310cada3ed 100644 --- a/src/TOP/PISCES/P4Z/p4zbc.F90 +++ b/src/TOP/PISCES/P4Z/p4zbc.F90 @@ -120,24 +120,25 @@ CONTAINS ENDIF + IF( .NOT. ln_p2z ) THEN ! Atmospheric input of PO4 dissolves in the water column - IF ( ln_trc_sbc(jppo4) ) THEN - DO_3D( 0, 0, 0, 0, 2, jpkm1 ) - zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) - ! - tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zdustdep * 1.e-3 / mMass_P - END_3D - ENDIF + IF ( ln_trc_sbc(jppo4) ) THEN + DO_3D( 0, 0, 0, 0, 2, jpkm1 ) + zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) + ! + tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zdustdep * 1.e-3 / mMass_P + END_3D + ENDIF - ! Atmospheric input of Si dissolves in the water column - IF ( ln_trc_sbc(jpsil) ) THEN - DO_3D( 0, 0, 0, 0, 2, jpkm1 ) - zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) - ! - tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) + zdustdep * 0.269 / mMass_Si - END_3D + ! Atmospheric input of Si dissolves in the water column + IF ( ln_trc_sbc(jpsil) ) THEN + DO_3D( 0, 0, 0, 0, 2, jpkm1 ) + zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) + ! + tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) + zdustdep * 0.269 / mMass_Si + END_3D + ENDIF ENDIF - ! IF( lk_iomput ) THEN ! dust concentration at surface @@ -172,12 +173,14 @@ CONTAINS tr(ji,jj,1,jptal,Krhs) = tr(ji,jj,1,jptal,Krhs) - rno3 * zndep * rfact END_2D ENDIF - IF( ln_trc_sbc(jpnh4) ) THEN - jl = n_trc_indsbc(jpnh4) - DO_2D( 0, 0, 0, 0 ) - zndep = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(ji,jj,1) / e3t(ji,jj,1,Kmm) / rn_sbc_time - tr(ji,jj,1,jptal,Krhs) = tr(ji,jj,1,jptal,Krhs) + rno3 * zndep * rfact - END_2D + IF( .NOT. ln_p2z ) THEN + IF( ln_trc_sbc(jpnh4) ) THEN + jl = n_trc_indsbc(jpnh4) + DO_2D( 0, 0, 0, 0 ) + zndep = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(ji,jj,1) / e3t(ji,jj,1,Kmm) / rn_sbc_time + tr(ji,jj,1,jptal,Krhs) = tr(ji,jj,1,jptal,Krhs) + rno3 * zndep * rfact + END_2D + ENDIF ENDIF ENDIF ! @@ -281,8 +284,8 @@ CONTAINS INTEGER :: ierr, ierr1, ierr2, ierr3 INTEGER :: ios ! Local integer output status for namelist read INTEGER :: ik50 ! last level where depth less than 50 m - REAL(wp) :: zexpide, zdenitide, zmaskt, zsurfc, zsurfp,ze3t, ze3t2, zcslp - REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zriver, zcmask + REAL(wp) :: zexpide, zdenitide, zmaskt, zsurfc, zsurfp, ze3t, ze3t2, zcslp + REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zcmask ! CHARACTER(len=100) :: cn_dir ! Root directory for location of ssr files TYPE(FLD_N) :: sn_dust, sn_ironsed, sn_hydrofe ! informations about the fields to be read @@ -328,12 +331,17 @@ CONTAINS IF( ln_hydrofe ) THEN WRITE(numout,*) ' Fe to 3He ratio assumed for vent iron supply hratio = ', hratio ENDIF - END IF + ENDIF - ll_bc = ( ln_trcbc .AND. lltrcbc ) .OR. ln_hydrofe .OR. ln_ironsed .OR. ln_ironice - ll_dust = ln_trc_sbc(jpfer) .OR. ln_trc_sbc(jppo4) .OR. ln_trc_sbc(jpsil) .OR. ln_sediment - ll_ndepo = ln_trc_sbc(jpno3) .OR. ln_trc_sbc(jpnh4) - ll_river = ln_trc_cbc(jpno3) + ll_river = ln_trc_cbc(jpno3) + IF( ln_p2z ) THEN + ll_dust = ln_trc_sbc(jpfer) + ll_ndepo = ln_trc_sbc(jpno3) + ELSE + ll_dust = ln_trc_sbc(jpfer) .OR. ln_trc_sbc(jppo4) .OR. ln_trc_sbc(jpsil) .OR. ln_sediment + ll_ndepo = ln_trc_sbc(jpno3) .OR. ln_trc_sbc(jpnh4) + ENDIF + ll_bc = ( ln_trcbc .AND. lltrcbc ) .OR. ln_hydrofe .OR. ln_ironsed .OR. ln_ironice ! dust input from the atmosphere ! ------------------------------ diff --git a/src/TOP/PISCES/P4Z/p4zbio.F90 b/src/TOP/PISCES/P4Z/p4zbio.F90 index 65f61f4f90552a637b0f6c8f53b2058bc9b708fa..7d2d289e4f29a288ce877ed153f72188951c4c49 100644 --- a/src/TOP/PISCES/P4Z/p4zbio.F90 +++ b/src/TOP/PISCES/P4Z/p4zbio.F90 @@ -16,6 +16,10 @@ MODULE p4zbio USE sms_pisces ! PISCES Source Minus Sink variables USE p4zsink ! vertical flux of particulate matter due to sinking USE p4zopt ! optical model + USE p2zlim ! Co-limitations by nutrient (REDUCED) + USE p2zprod ! Growth rate of phytoplankton (REDUCED) + USE p2zmicro ! Sources and sinks of microzooplankton (REDUCED) + USE p2zmort ! Mortality terms for phytoplankton (REDUCED) USE p4zlim ! Co-limitations of differents nutrients USE p4zprod ! Growth rate of the 2 phyto groups USE p4zmort ! Mortality terms for phytoplankton @@ -80,7 +84,12 @@ CONTAINS CALL p4z_sink ( kt, knt, Kbb, Kmm, Krhs ) ! vertical flux of particulate organic matter CALL p4z_fechem ( kt, knt, Kbb, Kmm, Krhs ) ! Iron chemistry/scavenging ! - IF( ln_p4z ) THEN ! PISCES standard + IF( ln_p2z ) THEN ! PISCES reduced + CALL p2z_lim ( kt, knt, Kbb, Kmm ) ! co-limitations by the various nutrients + CALL p2z_prod ( kt, knt, Kbb, Kmm, Krhs ) ! phytoplankton growth rate over the global ocean. + CALL p2z_mort ( kt, Kbb, Krhs ) ! phytoplankton mortality + CALL p2z_micro( kt, knt, Kbb, Krhs ) ! microzooplankton + ELSE IF( ln_p4z ) THEN ! PISCES standard ! Phytoplankton only sources/sinks terms CALL p4z_lim ( kt, knt, Kbb, Kmm ) ! co-limitations by the various nutrients CALL p4z_prod ( kt, knt, Kbb, Kmm, Krhs ) ! phytoplankton growth rate over the global ocean. @@ -100,8 +109,12 @@ CONTAINS CALL p5z_meso ( kt, knt, Kbb, Kmm, Krhs ) ! mesozooplankton ENDIF ! - CALL p4z_agg ( kt, knt, Kbb, Krhs ) ! Aggregation of particles - CALL p4z_rem ( kt, knt, Kbb, Kmm, Krhs ) ! remineralization terms of organic matter+scavenging of Fe + IF( ln_p2z ) THEN + CALL p2z_rem ( kt, knt, Kbb, Kmm, Krhs ) ! remineralization terms of organic matter+scavenging of Fe + ELSE + CALL p4z_agg ( kt, knt, Kbb, Krhs ) ! Aggregation of particles + CALL p4z_rem ( kt, knt, Kbb, Kmm, Krhs ) ! remineralization terms of organic matter+scavenging of Fe + ENDIF CALL p4z_poc ( kt, knt, Kbb, Kmm, Krhs ) ! Remineralization of organic particles ! ! Ligand production. ln_ligand should be set .true. to activate @@ -109,10 +122,12 @@ CONTAINS & CALL p4z_ligand( kt, knt, Kbb, Krhs ) ! Update of the size of the different phytoplankton groups - sized(:,:,:) = MAX(1.0, sizeda(:,:,:) ) sizen(:,:,:) = MAX(1.0, sizena(:,:,:) ) - IF (ln_p5z) THEN - sizep(:,:,:) = MAX(1.0, sizepa(:,:,:) ) + IF( .NOT. ln_p2z ) THEN + sized(:,:,:) = MAX(1.0, sizeda(:,:,:) ) + IF (ln_p5z) THEN + sizep(:,:,:) = MAX(1.0, sizepa(:,:,:) ) + ENDIF ENDIF ! ! IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) diff --git a/src/TOP/PISCES/P4Z/p4zche.F90 b/src/TOP/PISCES/P4Z/p4zche.F90 index 8d9f68fe00e0bced44695e0264ace39e8bebd288..33507f817da519b31faa13d7b0a5959e7c212809 100644 --- a/src/TOP/PISCES/P4Z/p4zche.F90 +++ b/src/TOP/PISCES/P4Z/p4zche.F90 @@ -427,9 +427,8 @@ CONTAINS sulfat(ji,jj,jk) = zst fluorid(ji,jj,jk) = zft - ! Iron and SIO3 saturation concentration from ... - sio3eq(ji,jj,jk) = EXP( LOG( 10.) * ( 6.44 - 968. / ztkel ) ) * 1.e-6 fekeq (ji,jj,jk) = 10**( 17.27 - 1565.7 / ztkel ) + ! Liu and Millero (1999) only valid 5 - 50 degC ztkel1 = MAX( 5. , tempis(ji,jj,jk) ) + 273.16 fesol(ji,jj,jk,1) = 10**(-13.486 - 0.1856* zis**0.5 + 0.3073*zis + 5254.0/ztkel1) @@ -438,6 +437,15 @@ CONTAINS fesol(ji,jj,jk,4) = 10**(-0.2965 - 0.7881*zis**0.5 - 4086.0/ztkel1 ) fesol(ji,jj,jk,5) = 10**(4.4466 - 0.8505*zis**0.5 - 7980.0/ztkel1 ) END_3D + ! Iron and SIO3 saturation concentration from ... + IF( .NOT. ln_p2z) THEN + DO_3D( 0, 0, 0, 0, 1, jpk ) + ! SET ABSOLUTE TEMPERATURE + ztkel = tempis(ji,jj,jk) + 273.15 + sio3eq(ji,jj,jk) = EXP( LOG( 10.) * ( 6.44 - 968. / ztkel ) ) * 1.e-6 + ! + END_3D + ENDIF ! IF( ln_timing ) CALL timing_stop('p4z_che') ! @@ -522,13 +530,23 @@ CONTAINS INTEGER :: ji, jj, jk REAL(wp) :: zrhd - DO_3D( 0, 0, 0, 0, 1, jpk ) - zrhd = 1._wp / ( rhd(ji,jj,jk) + 1. ) - p_alknw_inf(ji,jj,jk) = -tr(ji,jj,jk,jppo4,Kbb) * zrhd - sulfat(ji,jj,jk) & - & - fluorid(ji,jj,jk) - p_alknw_sup(ji,jj,jk) = (2. * tr(ji,jj,jk,jpdic,Kbb) + 2. * tr(ji,jj,jk,jppo4,Kbb) + tr(ji,jj,jk,jpsil,Kbb) ) & - & * zrhd + borat(ji,jj,jk) - END_3D + IF( ln_p2z ) THEN + DO_3D( 0, 0, 0, 0, 1, jpk ) + zrhd = 1._wp / ( rhd(ji,jj,jk) + 1. ) + p_alknw_inf(ji,jj,jk) = -2.174E-6 * zrhd - sulfat(ji,jj,jk) & + & - fluorid(ji,jj,jk) + p_alknw_sup(ji,jj,jk) = (2. * tr(ji,jj,jk,jpdic,Kbb) + 2. * 2.174E-6 & + & + 90.33E-6 ) * zrhd + borat(ji,jj,jk) + END_3D + ELSE + DO_3D( 0, 0, 0, 0, 1, jpk ) + zrhd = 1._wp / ( rhd(ji,jj,jk) + 1. ) + p_alknw_inf(ji,jj,jk) = -tr(ji,jj,jk,jppo4,Kbb) * zrhd * po4r - sulfat(ji,jj,jk) & + & - fluorid(ji,jj,jk) + p_alknw_sup(ji,jj,jk) = (2. * tr(ji,jj,jk,jpdic,Kbb) + 2. * tr(ji,jj,jk,jppo4,Kbb) * po4r & + & + tr(ji,jj,jk,jpsil,Kbb) ) * zrhd + borat(ji,jj,jk) + END_3D + ENDIF END SUBROUTINE anw_infsup @@ -607,13 +625,18 @@ CONTAINS p_alktot = tr(ji,jj,jk,jptal,Kbb) * zrhd zdic = tr(ji,jj,jk,jpdic,Kbb) * zrhd zbot = borat(ji,jj,jk) - zpt = tr(ji,jj,jk,jppo4,Kbb) * zrhd * po4r - zsit = tr(ji,jj,jk,jpsil,Kbb) * zrhd zst = sulfat (ji,jj,jk) zft = fluorid(ji,jj,jk) aphscale = 1. + sulfat(ji,jj,jk)/aks3(ji,jj,jk) zh = zhi(ji,jj,jk) zh_prev = zh + IF( ln_p2z ) THEN + zsit = 90.33E-6 * zrhd + zpt = 2.174E-6 * zrhd + ELSE + zpt = tr(ji,jj,jk,jppo4,Kbb) * zrhd * po4r + zsit = tr(ji,jj,jk,jpsil,Kbb) * zrhd + ENDIF ! H2CO3 - HCO3 - CO3 : n=2, m=0 znumer_dic = 2.*ak13(ji,jj,jk)*ak23(ji,jj,jk) + zh*ak13(ji,jj,jk) @@ -796,12 +819,12 @@ CONTAINS !!---------------------------------------------------------------------- !! *** ROUTINE p4z_che_alloc *** !!---------------------------------------------------------------------- - INTEGER :: ierr(3) ! Local variables + INTEGER :: ierr(4) ! Local variables !!---------------------------------------------------------------------- ierr(:) = 0 - ALLOCATE( sio3eq(A2D(0),jpk), fekeq(A2D(0),jpk), chemc(A2D(0),3), chemo2(A2D(0),jpk), STAT=ierr(1) ) + ALLOCATE( fekeq(A2D(0),jpk), chemc(A2D(0),3), chemo2(A2D(0),jpk), STAT=ierr(1) ) ALLOCATE( akb3(A2D(0),jpk) , tempis(A2D(0),jpk), & & akw3(A2D(0),jpk) , borat (A2D(0),jpk) , & @@ -812,6 +835,7 @@ CONTAINS & salinprac(A2D(0),jpk), STAT=ierr(2) ) ALLOCATE( fesol(A2D(0),jpk,5), STAT=ierr(3) ) + IF( .NOT. ln_p2z ) ALLOCATE( sio3eq(A2D(0),jpk), STAT=ierr(4) ) !* Variable for chemistry of the CO2 cycle p4z_che_alloc = MAXVAL( ierr ) diff --git a/src/TOP/PISCES/P4Z/p4zfechem.F90 b/src/TOP/PISCES/P4Z/p4zfechem.F90 index 2e05446d88970f7fd86247538b54ac8a789340a6..0d4090a91bde56fda46a57d2df7515a11d894fc2 100644 --- a/src/TOP/PISCES/P4Z/p4zfechem.F90 +++ b/src/TOP/PISCES/P4Z/p4zfechem.F90 @@ -79,12 +79,12 @@ CONTAINS ! Parameterization from Pham and Ito (2018) ! ------------------------------------------------- DO_3D( 0, 0, 0, 0, 1, jpkm1) - xfecolagg(ji,jj,jk) = ligand * 1E9 + MAX(0., chemo2(ji,jj,jk) - tr(ji,jj,jk,jpoxy,Kbb) ) / 400.E-6 + xfecolagg(ji,jj,jk) = ligand * 1E9 + 0.01 * MAX(0., (chemo2(ji,jj,jk) - tr(ji,jj,jk,jpoxy,Kbb) ) * 1E6 )**0.8 END_3D ! IF( ln_ligvar ) THEN DO_3D( 0, 0, 0, 0, 1, jpkm1) - ztotlig(ji,jj,jk) = 0.09 * 0.667 * tr(ji,jj,jk,jpdoc,Kbb) * 1E6 + xfecolagg(ji,jj,jk) + ztotlig(ji,jj,jk) = 0.07 * 0.667 * (tr(ji,jj,jk,jpdoc,Kbb) * 1E6 )**0.8 + xfecolagg(ji,jj,jk) ztotlig(ji,jj,jk) = MIN( ztotlig(ji,jj,jk), 10. ) END_3D ELSE @@ -169,13 +169,6 @@ CONTAINS ! This occurs in anoxic waters only zprecipno3 = 2.0 * 130.0 * tr(ji,jj,jk,jpno3,Kbb) * nitrfac(ji,jj,jk) * xstep * zFe3(ji,jj,jk) ! - ztrc = ( tr(ji,jj,jk,jppoc,Kbb) + tr(ji,jj,jk,jpgoc,Kbb) + tr(ji,jj,jk,jpcal,Kbb) + tr(ji,jj,jk,jpgsi,Kbb) ) * 1.e6 - ztrc = MAX( rtrn, ztrc ) - IF( ll_dust ) zdust = dust(ji,jj) / ( wdust / rday ) * tmask(ji,jj,jk) - zxlam = MAX( 1.E-3, (1. - EXP(-2 * tr(ji,jj,jk,jpoxy,Kbb) / 100.E-6 ) )) - zlam1b = 3.e-5 + ( xlamdust * zdust + xlam1 * ztrc ) * zxlam - zscave = zFe3(ji,jj,jk) * zlam1b * xstep - ! Compute the coagulation of colloidal iron. This parameterization ! could be thought as an equivalent of colloidal pumping. ! It requires certainly some more work as it is very poorly constrained. @@ -184,36 +177,53 @@ CONTAINS & + ( 2.49 * tr(ji,jj,jk,jppoc,Kbb) ) & & + ( 127.8 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 725.7 * tr(ji,jj,jk,jppoc,Kbb) ) zaggdfea = zlam1a * xstep * zfecoll(ji,jj,jk) - ! - zlam1b = ( 1.94 * xdiss(ji,jj,jk) + 1.37 ) * tr(ji,jj,jk,jpgoc,Kbb) - zaggdfeb = zlam1b * xstep * zfecoll(ji,jj,jk) - xcoagfe(ji,jj,jk) = zlam1a + zlam1b ! - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zscave - zaggdfea - zaggdfeb & - & - ( zprecip + zprecipno3 ) + IF( ll_dust ) zdust = dust(ji,jj) / ( wdust / rday ) * tmask(ji,jj,jk) + zxlam = MAX( 1.E-3, (1. - EXP(-2 * tr(ji,jj,jk,jpoxy,Kbb) / 100.E-6 ) )) - tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc - tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc + IF( ln_p2z ) THEN + ztrc = tr(ji,jj,jk,jppoc,Kbb) * 1e6 + ELSE + ztrc = ( tr(ji,jj,jk,jppoc,Kbb) + tr(ji,jj,jk,jpgoc,Kbb) + tr(ji,jj,jk,jpcal,Kbb) + tr(ji,jj,jk,jpgsi,Kbb) ) * 1.e6 + ENDIF + ztrc = MAX( rtrn, ztrc ) + zlam1b = 3.e-5 + ( xlamdust * zdust + xlam1 * ztrc ) * zxlam + zscave = zFe3(ji,jj,jk) * zlam1b * xstep + ! + IF( ln_p2z ) THEN + zaggdfeb = 0._wp + xcoagfe(ji,jj,jk) = zlam1a + ELSE + zlam1b = ( 1.94 * xdiss(ji,jj,jk) + 1.37 ) * tr(ji,jj,jk,jpgoc,Kbb) + zaggdfeb = zlam1b * xstep * zfecoll(ji,jj,jk) + xcoagfe(ji,jj,jk) = zlam1a + zlam1b + ! + tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc + tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc + ! + ! Precipitated iron is supposed to be permanently lost. + ! Scavenged iron is supposed to be released back to seawater + ! when POM is solubilized. This is highly uncertain as probably + ! a significant part of it may be rescavenged back onto + ! the particles. An efficiency factor is applied that is read + ! in the namelist. + ! See for instance Tagliabue et al. (2019). + ! Aggregated FeL is considered as biogenic Fe as it + ! probably remains complexed when the particle is solubilized. + ! ------------------------------------------------------------- + tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zaggdfea + tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zaggdfeb + ! + ENDIF + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zscave - zaggdfea - zaggdfeb & + & - ( zprecip + zprecipno3 ) - ! Precipitated iron is supposed to be permanently lost. - ! Scavenged iron is supposed to be released back to seawater - ! when POM is solubilized. This is highly uncertain as probably - ! a significant part of it may be rescavenged back onto - ! the particles. An efficiency factor is applied that is read - ! in the namelist. - ! See for instance Tagliabue et al. (2019). - ! Aggregated FeL is considered as biogenic Fe as it - ! probably remains complexed when the particle is solubilized. - ! ------------------------------------------------------------- - tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zaggdfea - tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zaggdfeb - ! - IF( l_dia_fechem ) THEN - zscav3d(ji,jj,jk) = zscave - zcoll3d(ji,jj,jk) = zaggdfea + zaggdfeb - zfeprecip(ji,jj,jk) = zprecip + zprecipno3 - ENDIF + IF( l_dia_fechem ) THEN + zscav3d(ji,jj,jk) = zscave + zcoll3d(ji,jj,jk) = zaggdfea + zaggdfeb + zfeprecip(ji,jj,jk) = zprecip + zprecipno3 + ENDIF ! END_3D ! diff --git a/src/TOP/PISCES/P4Z/p4zint.F90 b/src/TOP/PISCES/P4Z/p4zint.F90 index c0243fc4c3446046d6544f3fcf29de78d0f99c8a..c77472a8759c9ec7a885163d0601f5890f3e34a8 100644 --- a/src/TOP/PISCES/P4Z/p4zint.F90 +++ b/src/TOP/PISCES/P4Z/p4zint.F90 @@ -52,30 +52,31 @@ CONTAINS END_3D - ! Computation of the silicon dependant half saturation constant for silica uptake - ! This is based on an old study by Pondaven et al. (1998) - ! -------------------------------------------------------------------------------- - DO_2D( 0, 0, 0, 0 ) - zvar = tr(ji,jj,1,jpsil,Kbb) * tr(ji,jj,1,jpsil,Kbb) - xksimax(ji,jj) = MAX( xksimax(ji,jj), ( 1.+ 7.* zvar / ( xksilim * xksilim + zvar ) ) * 1e-6 ) - END_2D - ! - ! At the end of each year, the half saturation constant for silica is - ! updated as this is based on the highest concentration reached over - ! the year - ! ------------------------------------------------------------------- - IF( nday_year == nyear_len(1) ) THEN - xksi (:,:) = xksimax(:,:) - xksimax(:,:) = 0._wp + IF( ln_p4z .OR. ln_p5z ) THEN + ! Computation of the silicon dependant half saturation constant for silica uptake + ! This is based on an old study by Pondaven et al. (1998) + ! -------------------------------------------------------------------------------- + DO_2D( 0, 0, 0, 0 ) + zvar = tr(ji,jj,1,jpsil,Kbb) * tr(ji,jj,1,jpsil,Kbb) + xksimax(ji,jj) = MAX( xksimax(ji,jj), ( 1.+ 7.* zvar / ( xksilim * xksilim + zvar ) ) * 1e-6 ) + END_2D + ! + ! At the end of each year, the half saturation constant for silica is + ! updated as this is based on the highest concentration reached over + ! the year + ! ------------------------------------------------------------------- + IF( nday_year == nyear_len(1) ) THEN + xksi (:,:) = xksimax(:,:) + xksimax(:,:) = 0._wp + ENDIF ENDIF - ! - ! compute the day length depending on latitude and the day - ! Astronomical parameterization taken from HAMOCC3 + ! + ! compute the day length depending on latitude and the day + ! Astronomical parameterization taken from HAMOCC3 zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp ) zcodel = ASIN( SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp ) ) ! day length in hours -! strn(:,:) = 0. DO_2D( 0, 0, 0, 0 ) zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad ) zargu = MAX( -1., MIN( 1., zargu ) ) diff --git a/src/TOP/PISCES/P4Z/p4zlim.F90 b/src/TOP/PISCES/P4Z/p4zlim.F90 index d388955fb93955e90ba22509528b639817db1222..84f3bcfa04c3aa406d71f9e3cbf1b2fdee3028b9 100644 --- a/src/TOP/PISCES/P4Z/p4zlim.F90 +++ b/src/TOP/PISCES/P4Z/p4zlim.F90 @@ -13,6 +13,7 @@ MODULE p4zlim USE oce_trc ! Shared ocean-passive tracers variables USE trc ! Tracers defined USE sms_pisces ! PISCES variables + USE p2zlim ! Reduced PISCES nutrient limitation USE iom ! I/O manager IMPLICIT NONE @@ -23,40 +24,28 @@ MODULE p4zlim PUBLIC p4z_lim_alloc ! called in trcini_pisces.F90 !! * Shared module variables - REAL(wp), PUBLIC :: concnno3 !: NO3, PO4 half saturation REAL(wp), PUBLIC :: concdno3 !: Phosphate half saturation for diatoms REAL(wp), PUBLIC :: concnnh4 !: NH4 half saturation for nanophyto REAL(wp), PUBLIC :: concdnh4 !: NH4 half saturation for diatoms - REAL(wp), PUBLIC :: concnfer !: Iron half saturation for nanophyto REAL(wp), PUBLIC :: concdfer !: Iron half saturation for diatoms - REAL(wp), PUBLIC :: concbno3 !: NO3 half saturation for bacteria REAL(wp), PUBLIC :: concbnh4 !: NH4 half saturation for bacteria REAL(wp), PUBLIC :: xsizedia !: Minimum size criteria for diatoms - REAL(wp), PUBLIC :: xsizephy !: Minimum size criteria for nanophyto - REAL(wp), PUBLIC :: xsizern !: Size ratio for nanophytoplankton REAL(wp), PUBLIC :: xsizerd !: Size ratio for diatoms REAL(wp), PUBLIC :: xksi1 !: half saturation constant for Si uptake REAL(wp), PUBLIC :: xksi2 !: half saturation constant for Si/C - REAL(wp), PUBLIC :: xkdoc !: 2nd half-sat. of DOC remineralization - REAL(wp), PUBLIC :: concbfe !: Fe half saturation for bacteria REAL(wp), PUBLIC :: qnfelim !: optimal Fe quota for nanophyto REAL(wp), PUBLIC :: qdfelim !: optimal Fe quota for diatoms - REAL(wp), PUBLIC :: caco3r !: mean rainratio + REAL(wp), PUBLIC :: ratchl !: C associated with Chlorophyll !!* Phytoplankton limitation terms - REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanono3 !: Nanophyto limitation by NO3 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xdiatno3 !: Diatoms limitation by NO3 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanonh4 !: Nanophyto limitation by NH4 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xdiatnh4 !: Diatoms limitation by NH4 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanopo4 !: Nanophyto limitation by PO4 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xdiatpo4 !: Diatoms limitation by PO4 - REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimphy !: Nutrient limitation term of nanophytoplankton REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimdia !: Nutrient limitation term of diatoms - REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimnfe !: Nanophyto limitation by Iron REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimdfe !: Diatoms limitation by iron REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimsi !: Diatoms limitation by Si - REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimbac !: Bacterial limitation term - REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimbacl !: Bacterial limitation term REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: concdfe !: Limitation of diatoms uptake of Fe REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: concnfe !: Limitation of Nano uptake of Fe REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanofer !: Limitation of Fe uptake by nanophyto @@ -252,7 +241,7 @@ CONTAINS xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 ) & & * ztem1 / ( 0.1 + ztem1 ) & - & * MAX( 1., tr(ji,jj,jk,jpphy,Kbb) * 1.e6 / 2. ) & + & * MAX( 1., tr(ji,jj,jk,jpphy,Kbb) / xsizephy ) & & * zetot1 * zetot2 & & * ( 1. + EXP(-ztem2 * ztem2 / 25. ) ) & & * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) ) @@ -260,18 +249,6 @@ CONTAINS xfracal(ji,jj,jk) = MAX( 0.02, xfracal(ji,jj,jk) ) END_3D ! - DO_3D( 0, 0, 0, 0, 1, jpkm1) - ! denitrification factor computed from O2 levels - nitrfac(ji,jj,jk) = MAX( 0.e0, 0.4 * ( 6.e-6 - tr(ji,jj,jk,jpoxy,Kbb) ) & - & / ( oxymin + tr(ji,jj,jk,jpoxy,Kbb) ) ) - nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) ) - ! - ! denitrification factor computed from NO3 levels - nitrfac2(ji,jj,jk) = MAX( 0.e0, ( 1.E-6 - tr(ji,jj,jk,jpno3,Kbb) ) & - & / ( 1.E-6 + tr(ji,jj,jk,jpno3,Kbb) ) ) - nitrfac2(ji,jj,jk) = MIN( 1., nitrfac2(ji,jj,jk) ) - END_3D - ! IF( lk_iomput .AND. knt == nrdttrc ) THEN ! save output diagnostics ! IF( l_dia_fracal ) THEN ! fraction of calcifiers @@ -332,7 +309,7 @@ CONTAINS ! Namelist block NAMELIST/namp4zlim/ concnno3, concdno3, concnnh4, concdnh4, concnfer, concdfer, concbfe, & & concbno3, concbnh4, xsizedia, xsizephy, xsizern, xsizerd, & - & xksi1, xksi2, xkdoc, qnfelim, qdfelim, caco3r, oxymin + & xksi1, xksi2, xkdoc, qnfelim, qdfelim, caco3r, oxymin, ratchl !!---------------------------------------------------------------------- ! IF(lwp) THEN @@ -351,6 +328,7 @@ CONTAINS IF(lwp) THEN ! control print WRITE(numout,*) ' Namelist : namp4zlim' WRITE(numout,*) ' mean rainratio caco3r = ', caco3r + WRITE(numout,*) ' C associated with Chlorophyll ratchl = ', ratchl WRITE(numout,*) ' NO3 half saturation of nanophyto concnno3 = ', concnno3 WRITE(numout,*) ' NO3 half saturation of diatoms concdno3 = ', concdno3 WRITE(numout,*) ' NH4 half saturation for phyto concnnh4 = ', concnnh4 @@ -367,13 +345,11 @@ CONTAINS WRITE(numout,*) ' Minimum size criteria for diatoms xsizedia = ', xsizedia WRITE(numout,*) ' Minimum size criteria for nanophyto xsizephy = ', xsizephy WRITE(numout,*) ' Fe half saturation for bacteria concbfe = ', concbfe - WRITE(numout,*) ' halk saturation constant for anoxia oxymin =' , oxymin + WRITE(numout,*) ' halk saturation constant for anoxia oxymin =' , oxymin WRITE(numout,*) ' optimal Fe quota for nano. qnfelim = ', qnfelim WRITE(numout,*) ' Optimal Fe quota for diatoms qdfelim = ', qdfelim ENDIF ! - nitrfac (:,:,jpk) = 0._wp - nitrfac2(:,:,jpk) = 0._wp xfracal (:,:,jpk) = 0._wp xlimphy (:,:,jpk) = 0._wp xlimdia (:,:,jpk) = 0._wp @@ -393,13 +369,11 @@ CONTAINS !!---------------------------------------------------------------------- !* Biological arrays for phytoplankton growth - ALLOCATE( xnanono3(A2D(0),jpk), xdiatno3(A2D(0),jpk), & + ALLOCATE( xdiatno3(A2D(0),jpk), & & xnanonh4(A2D(0),jpk), xdiatnh4(A2D(0),jpk), & & xnanopo4(A2D(0),jpk), xdiatpo4(A2D(0),jpk), & & xnanofer(A2D(0),jpk), xdiatfer(A2D(0),jpk), & - & xlimphy (A2D(0),jpk), xlimdia (A2D(0),jpk), & - & xlimnfe (A2D(0),jpk), xlimdfe (A2D(0),jpk), & - & xlimbac (A2D(0),jpk), xlimbacl(A2D(0),jpk), & + & xlimdia (A2D(0),jpk), xlimdfe (A2D(0),jpk), & & concnfe (A2D(0),jpk), concdfe (A2D(0),jpk), & & xqfuncfecn(A2D(0),jpk), xqfuncfecd(A2D(0),jpk), & & xlimsi (A2D(0),jpk), STAT=p4z_lim_alloc ) diff --git a/src/TOP/PISCES/P4Z/p4zlys.F90 b/src/TOP/PISCES/P4Z/p4zlys.F90 index 61db35c30dcab30254202d2bd1b12ce82b438ed9..7745ec2433afa14b5ccc6f226cf4f4161bf21a79 100644 --- a/src/TOP/PISCES/P4Z/p4zlys.F90 +++ b/src/TOP/PISCES/P4Z/p4zlys.F90 @@ -20,12 +20,14 @@ MODULE p4zlys USE trc ! passive tracers common variables USE sms_pisces ! PISCES Source Minus Sink variables USE p4zche ! Chemical model + USE p4zsink ! sinking of particles USE prtctl ! print control for debugging USE iom ! I/O manager IMPLICIT NONE PRIVATE + PUBLIC p2z_lys ! called in trcsms_pisces.F90 PUBLIC p4z_lys ! called in trcsms_pisces.F90 PUBLIC p4z_lys_init ! called in trcsms_pisces.F90 @@ -42,6 +44,7 @@ MODULE p4zlys !! * Substitutions # include "do_loop_substitute.h90" +# include "domzgr_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/TOP 4.0 , NEMO Consortium (2018) !! $Id: p4zlys.F90 15532 2021-11-24 11:47:32Z techene $ @@ -50,6 +53,169 @@ MODULE p4zlys CONTAINS + SUBROUTINE p2z_lys( kt, knt, Kbb, Kmm, Krhs ) + !!--------------------------------------------------------------------- + !! *** ROUTINE p2z_lys *** + !! + !! ** Purpose : CALCULATES DEGREE OF CACO3 SATURATION IN THE WATER + !! COLUMN, DISSOLUTION/PRECIPITATION OF CACO3 AND LOSS + !! OF CACO3 TO THE CACO3 SEDIMENT POOL. + !! + !! ** Method : - ??? + !!--------------------------------------------------------------------- + INTEGER, INTENT(in) :: kt, knt ! ocean time step and ??? + INTEGER, INTENT(in) :: Kbb, Kmm, Krhs ! time level indices + ! + INTEGER :: ji, jj, jk, jn + REAL(wp) :: zdispot, zrhd, zcalcon, zdepexp, zdissol + REAL(wp) :: zomegaca, zexcess, zexcess0, zkd, zwsbio + CHARACTER (len=25) :: charout + REAL(wp), DIMENSION(A2D(0),jpk) :: zhinit, zhi, zco3, zcaco3, ztra + REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d + !!--------------------------------------------------------------------- + ! + IF( ln_timing ) CALL timing_start('p2z_lys') + ! + IF( kt == nittrc000 ) & + & l_dia = iom_use( "PH" ) .OR. iom_use( "CO3" ) .OR. iom_use( "CO3sat" ) .OR. iom_use( "DCAL" ) .OR. iom_use( "PCAL" ) + ! + IF( l_dia ) THEN !* Save ta and sa trends + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = tr(ji,jj,jk,jpdic,Krhs) ! we be used to compute DCAL if needed + END_3D + ENDIF + ! + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zhinit(ji,jj,jk) = hi(ji,jj,jk) / ( rhd(ji,jj,jk) + 1._wp ) + END_3D + ! + ! ------------------------------------------- + ! COMPUTE [CO3--] and [H+] CONCENTRATIONS + ! ------------------------------------------- + + CALL solve_at_general( zhinit, zhi, Kbb ) + + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zco3(ji,jj,jk) = tr(ji,jj,jk,jpdic,Kbb) * ak13(ji,jj,jk) * ak23(ji,jj,jk) / (zhi(ji,jj,jk)**2 & + & + ak13(ji,jj,jk) * zhi(ji,jj,jk) + ak13(ji,jj,jk) * ak23(ji,jj,jk) + rtrn ) + hi (ji,jj,jk) = zhi(ji,jj,jk) * ( rhd(ji,jj,jk) + 1._wp ) + END_3D + + ! --------------------------------------------------------- + ! CALCULATE DEGREE OF CACO3 SATURATION AND CORRESPONDING + ! DISSOLOUTION AND PRECIPITATION OF CACO3 (BE AWARE OF + ! MGCO3) + ! --------------------------------------------------------- + + DO_3D( 0, 0, 0, 0, 1, jpkm1) + + ! DEVIATION OF [CO3--] FROM SATURATION VALUE + ! Salinity dependance in zomegaca and divide by rhd to have good units + zcalcon = calcon * ( salinprac(ji,jj,jk) / 35._wp ) + zrhd = rhd(ji,jj,jk) + 1._wp + zomegaca = ( zcalcon * zco3(ji,jj,jk) ) / ( aksp(ji,jj,jk) * zrhd + rtrn ) + + ! SET DEGREE OF UNDER-/SUPERSATURATION + excess(ji,jj,jk) = 1._wp - zomegaca + zexcess0 = MAX( 0., excess(ji,jj,jk) ) + + IF( zomegaca < 0.8 ) THEN + zexcess = zexcess0**nca + ! AMOUNT CACO3 THAT RE-ENTERS SOLUTION + zdispot = kdca * zexcess + ELSE + zkd = kdca * 0.2**(nca - 0.2) + zexcess = zexcess0**0.2 + zdispot = zkd * zexcess + ENDIF + + ! CHANGE OF [CO3--] , [ALK], PARTICULATE [CACO3], + ! AND [SUM(CO2)] DUE TO CACO3 DISSOLUTION/PRECIPITATION + ztra(ji,jj,jk) = zdispot / rmtss ! calcite dissolution + ! + END_3D + ! + DO_2D( 0, 0, 0, 0 ) + zcaco3(ji,jj,1) = prodcal(ji,jj,1) * rfact2r / ( wsbio4(ji,jj,1) / e3t(ji,jj,1,Kmm) / rday + ztra(ji,jj,1) ) + END_2D + + DO_3D( 0, 0, 0, 0, 2, jpkm1) + zdissol = 0.0 + zwsbio = wsbio4(ji,jj,jk) / rday + IF ( tmask(ji,jj,1) == 1. ) THEN + IF ( ztra(ji,jj,jk) == 0.0 ) THEN + zcaco3(ji,jj,jk) = zcaco3(ji,jj,jk-1) + prodcal(ji,jj,jk) * rfact2r / zwsbio * e3t(ji,jj,jk,Kmm) + ELSE + zdepexp = exp( - ztra(ji,jj,jk) * e3t(ji,jj,jk,Kmm) / zwsbio ) + zcaco3(ji,jj,jk) = prodcal(ji,jj,jk) * rfact2r / ztra(ji,jj,jk) & + & * (1.0 - zdepexp ) + zcaco3(ji,jj,jk-1) * zdepexp + zdissol = prodcal(ji,jj,jk) * e3t(ji,jj,jk,Kmm) + prodcal(ji,jj,jk) & + & * zwsbio / ztra(ji,jj,jk) * ( zdepexp - 1.0 ) & + & + zwsbio * zcaco3(ji,jj,jk-1) * ( 1.0 - zdepexp ) * rfact2 + zdissol = zdissol / e3t(ji,jj,jk,Kmm) + ENDIF + tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zdissol + tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + 2.0 * zdissol + ENDIF + END_3D + DO_2D( 0, 0, 0, 0 ) + sinkcalb(ji,jj) = wsbio4(ji,jj,mbkt(ji,jj)) * zcaco3(ji,jj,mbkt(ji,jj)) * rfact2 / rday + END_2D + ! + IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) + WRITE(charout, FMT="('lys ')") + CALL prt_ctl_info( charout, cdcomp = 'top' ) + CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) + ENDIF + ! + IF( l_dia .AND. knt == nrdttrc ) THEN + IF( iom_use ( "PCAL" ) ) THEN ! Calcite production + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = prodcal(ji,jj,jk) * 1.e+3 * rfact2r * tmask(ji,jj,jk) + END_3D + CALL iom_put( "PCAL", zw3d ) + ENDIF + IF( iom_use( "DCAL" ) ) THEN ! calcite dissolution + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpdic,Krhs) - zw3d(ji,jj,jk) ) * 1.e+3 * rfact2r * tmask(ji,jj,jk) + END_3D + CALL iom_put( "DCAL", zw3d ) + ENDIF + IF( iom_use ( "EPCAL100" ) .OR. iom_use ( "EXPCAL" ) ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = wsbio4(ji,jj,jk) * zcaco3(ji,jj,jk) * 1.e+3 / rday * tmask(ji,jj,jk) + END_3D + CALL iom_put( "EPCAL100", zw3d(:,:,ik100) ) ! Export of calcite at 100m + CALL iom_put( "EXPCAL" , zw3d ) ! Export of calcite in the water column + ENDIF + IF( iom_use( "PH" ) ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = -1. * LOG10( MAX( hi(ji,jj,jk), rtrn ) ) * tmask(ji,jj,jk) + END_3D + CALL iom_put( "PH" , zw3d ) + ENDIF + IF( iom_use( "CO3" ) ) THEN ! bicarbonate + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = zco3(ji,jj,jk) * 1.e+3 * tmask(ji,jj,jk) + END_3D + CALL iom_put( "CO3", zw3d ) + ENDIF + IF( iom_use( "CO3sat" ) ) THEN ! calcite saturation + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zrhd = rhd(ji,jj,jk) + 1._wp + zw3d(ji,jj,jk) = aksp(ji,jj,jk) * zrhd / ( calcon * ( salinprac(ji,jj,jk) / 35._wp ) + rtrn ) & + & * 1.e+3 * tmask(ji,jj,jk) + END_3D + CALL iom_put( "CO3sat", zw3d ) + ENDIF + DEALLOCATE( zw3d ) + ENDIF + ! + IF( ln_timing ) CALL timing_stop('p2z_lys') + ! + END SUBROUTINE p2z_lys + SUBROUTINE p4z_lys( kt, knt, Kbb, Krhs ) !!--------------------------------------------------------------------- !! *** ROUTINE p4z_lys *** @@ -74,7 +240,7 @@ CONTAINS IF( ln_timing ) CALL timing_start('p4z_lys') ! IF( kt == nittrc000 ) & - & l_dia = iom_use( "PH" ) .OR. iom_use( "CO3" ) .OR. iom_use( "CO3sat" ) .OR. iom_use( "DCAL" ) + & l_dia = iom_use( "PH" ) .OR. iom_use( "CO3" ) .OR. iom_use( "CO3sat" ) .OR. iom_use( "DCAL" ) .OR. iom_use( "PCAL" ) IF( l_dia ) THEN !* Save ta and sa trends ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp @@ -122,8 +288,8 @@ CONTAINS ! AMOUNT CACO3 THAT RE-ENTERS SOLUTION zdispot = kdca * zexcess * tr(ji,jj,jk,jpcal,Kbb) ELSE - zkd = kdca * 0.2**(nca - 0.11) - zexcess = zexcess0**0.11 + zkd = kdca * 0.2**(nca - 0.2) + zexcess = zexcess0**0.2 zdispot = zkd * zexcess * tr(ji,jj,jk,jpcal,Kbb) ENDIF @@ -138,6 +304,12 @@ CONTAINS ! IF( l_dia .AND. knt == nrdttrc ) THEN + IF( iom_use ( "PCAL" ) ) THEN ! Calcite production + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = prodcal(ji,jj,jk) * 1.e+3 * rfact2r * tmask(ji,jj,jk) + END_3D + CALL iom_put( "PCAL", zw3d ) + ENDIF IF( iom_use( "DCAL" ) ) THEN ! calcite dissolution DO_3D( 0, 0, 0, 0, 1, jpkm1) zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpdic,Krhs) - zw3d(ji,jj,jk) ) * 1.e+3 * rfact2r * tmask(ji,jj,jk) diff --git a/src/TOP/PISCES/P4Z/p4zmeso.F90 b/src/TOP/PISCES/P4Z/p4zmeso.F90 index d13609af7b0a9933c43c3e72e6f838ad3149dc82..35160bcb028761530c6ca459acccb397d63bcb62 100644 --- a/src/TOP/PISCES/P4Z/p4zmeso.F90 +++ b/src/TOP/PISCES/P4Z/p4zmeso.F90 @@ -31,10 +31,12 @@ MODULE p4zmeso REAL(wp), PUBLIC :: xpref2n !: mesozoo preference for nanophyto REAL(wp), PUBLIC :: xpref2z !: mesozoo preference for microzooplankton REAL(wp), PUBLIC :: xpref2c !: mesozoo preference for POC + REAL(wp), PUBLIC :: xpref2m !: mesozoo preference for mesozoo REAL(wp), PUBLIC :: xthresh2zoo !: zoo feeding threshold for mesozooplankton REAL(wp), PUBLIC :: xthresh2dia !: diatoms feeding threshold for mesozooplankton REAL(wp), PUBLIC :: xthresh2phy !: nanophyto feeding threshold for mesozooplankton REAL(wp), PUBLIC :: xthresh2poc !: poc feeding threshold for mesozooplankton + REAL(wp), PUBLIC :: xthresh2mes !: mesozoo feeding threshold for mesozooplankton REAL(wp), PUBLIC :: xthresh2 !: feeding threshold for mesozooplankton REAL(wp), PUBLIC :: resrat2 !: exsudation rate of mesozooplankton REAL(wp), PUBLIC :: mzrat2 !: microzooplankton mortality rate @@ -81,14 +83,14 @@ CONTAINS INTEGER, INTENT(in) :: Kbb, kmm, Krhs ! time level indices ! INTEGER :: ji, jj, jk, jkt - REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam - REAL(wp) :: zgraze2 , zdenom, zdenom2, zfact , zfood, zfoodlim, zproport, zbeta + REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam, zcompames + REAL(wp) :: zgraze2, zdenom, zfact, zfood, zfoodlim, zproport, zbeta REAL(wp) :: zmortzgoc, zfrac, zfracfe, zratio, zratio2, zfracal, zgrazcal REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgraztotc, zgraztotn, zgraztotf REAL(wp) :: zmigreltime, zprcaca, zmortz, zgrasratf, zgrasratn REAL(wp) :: zrespz, ztortz, zgrazdc, zgrazz, zgrazpof, zgraznc, zgrazpoc, zgraznf, zgrazdf - REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg, zrum, zcodel, zargu, zval, zdep - REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmp4, ztmptot, zmigthick + REAL(wp) :: zgrazm, zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg, zdep + REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot, zmigthick CHARACTER (len=25) :: charout REAL(wp), DIMENSION(A2D(0),jpk) :: zgrarem, zgraref, zgrapoc, zgrapof, zgrabsi REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigrem, zgramigref, zgramigpoc, zgramigpof @@ -143,19 +145,13 @@ CONTAINS ! ------------------------------------------------------------------------- ztortz = mzrat2 * 1.e6 * zfact * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk) ) ! - ! Computation of the abundance of the preys ! A threshold can be specified in the namelist ! -------------------------------------------- zcompadi = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthresh2dia ), 0.e0 ) zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthresh2zoo ), 0.e0 ) zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthresh2poc ), 0.e0 ) - - ! Size effect of nanophytoplankton on grazing : the smaller it is, the less prone - ! it is to predation by mesozooplankton. We use a quota dependant parameterization - ! as a low quota indicates oligotrophic conditions which are charatcerized by - ! small cells - ! ------------------------------------------------------------------------------- + zcompames = MAX( ( tr(ji,jj,jk,jpmes,Kbb) - xthresh2mes ), 0.e0 ) zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthresh2phy ), 0.e0 ) ! Mesozooplankton grazing @@ -165,13 +161,12 @@ CONTAINS ! concentration is close to this threshold, it is decreased to avoid the ! accumulation of food in the mesozoopelagic domain ! ------------------------------------------------------------------------------- - zfood = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc + zfood = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc & + & + xpref2m * zcompames zfoodlim = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) ) zdenom = zfoodlim / ( xkgraz2 + zfoodlim ) - zdenom2 = zdenom / ( zfood + rtrn ) zgraze2 = grazrat2 * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk)) - ! An active switching parameterization is used here. ! We don't use the KTW parameterization proposed by ! Vallina et al. because it tends to produce too steady biomass @@ -190,22 +185,25 @@ CONTAINS ! to be close enough to have potential interference ! ----------------------------------------------------------- zdiffdn = exp( -ABS(log(1.67 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2 ) - ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / ( 1.0 + zdiffdn ) - ztmp2 = xpref2c * zcompapoc**2 - ztmp3 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) / ( 1.0 + zdiffdn ) - ztmp4 = xpref2z * zcompaz**2 - ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + rtrn + ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) + ztmp2 = xpref2m * zcompames**2 + ztmp3 = xpref2c * zcompapoc**2 + ztmp4 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) + ztmp5 = xpref2z * zcompaz**2 + ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + ztmp5 + rtrn ztmp1 = ztmp1 / ztmptot ztmp2 = ztmp2 / ztmptot ztmp3 = ztmp3 / ztmptot ztmp4 = ztmp4 / ztmptot + ztmp5 = ztmp5 / ztmptot ! Mesozooplankton regular grazing on the different preys ! ------------------------------------------------------ - zgrazdc = zgraze2 * ztmp3 * zdenom ! diatoms + zgrazdc = zgraze2 * ztmp4 * zdenom ! diatoms zgraznc = zgraze2 * ztmp1 * zdenom ! nanophytoplankton - zgrazpoc = zgraze2 * ztmp2 * zdenom ! small POC - zgrazz = zgraze2 * ztmp4 * zdenom ! microzooplankton + zgrazpoc = zgraze2 * ztmp3 * zdenom ! small POC + zgrazz = zgraze2 * ztmp5 * zdenom ! microzooplankton + zgrazm = zgraze2 * ztmp2 * zdenom ! Ingestion rates of the Fe content of the different preys zgraznf = zgraznc * tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn) @@ -224,14 +222,12 @@ CONTAINS & * (1. - nitrfac(ji,jj,jk)) zgrazfffp = zgrazffep * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn) ! - zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg + zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg ! Compute the proportion of filter feeders. It is assumed steady state. - ! --------------------------------------------------------------------- - zproport = 0._wp - IF( gdepw(ji,jj,jk+1,Kmm) > MAX(hmld(ji,jj), heup_01(ji,jj) ) ) THEN - zproport = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) - ENDIF + ! --------------------------------------------------------------------- + zproport = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) + zproport = zproport**2 ! Compute fractionation of aggregates. It is assumed that ! diatoms based aggregates are more prone to fractionation @@ -257,18 +253,23 @@ CONTAINS zgraznc = (1.0 - zproport) * zgraznc zgrazz = (1.0 - zproport) * zgrazz zgrazpoc = (1.0 - zproport) * zgrazpoc + zgrazm = (1.0 - zproport) * zgrazm zgrazdf = (1.0 - zproport) * zgrazdf zgraznf = (1.0 - zproport) * zgraznf zgrazpof = (1.0 - zproport) * zgrazpof - ! Total ingestion rates in C, N, Fe - zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg ! grazing by mesozooplankton + zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazm + zgrazffep + zgrazffeg ! grazing by mesozooplankton IF( l_dia_graz2 ) zgrazing2(ji,jj,jk) = zgraztotc zgraztotn = zgrazdc * quotad(ji,jj,jk) + zgrazz + zgraznc * quotan(ji,jj,jk) & - & + zgrazpoc + zgrazffep + zgrazffeg - zgraztotf = zgrazdf + zgraznf + zgrazz * feratz + zgrazpof + zgrazfffp + zgrazfffg + & + zgrazm + zgrazpoc + zgrazffep + zgrazffeg + zgraztotf = zgrazdf + zgraznf + zgrazz * feratz + zgrazpof + zgrazfffp + zgrazfffg + zgrazm * feratm + + ! Stoichiometruc ratios of the food ingested by zooplanton + ! -------------------------------------------------------- + zgrasratf = ( zgraztotf + rtrn )/ ( zgraztotc + rtrn ) + zgrasratn = ( zgraztotn + rtrn )/ ( zgraztotc + rtrn ) ! Mesozooplankton efficiency. ! We adopt a formulation proposed by Mitra et al. (2007) @@ -278,13 +279,10 @@ CONTAINS ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and ! Fulton, 2012) ! ----------------------------------------------------------------------------------- - - zgrasratf = ( zgraztotf + rtrn )/ ( zgraztotc + rtrn ) - zgrasratn = ( zgraztotn + rtrn )/ ( zgraztotc + rtrn ) zepshert = MIN( 1., zgrasratn, zgrasratf / feratm) zbeta = MAX(0., (epsher2 - epsher2min) ) ! Food quantity deprivation of GGE - zepsherf = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) + zepsherf = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) ! Food quality deprivation of GGE zepsherq = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) ! Actual GGE @@ -297,7 +295,7 @@ CONTAINS ! according to a infinite chain of predators (ANderson et al., 2013) zmortzgoc = unass2 / ( 1. - epsher2 ) * ztortz + zrespz - tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) - zmortz + zepsherv * zgraztotc + tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) - zmortz + zepsherv * zgraztotc - zgrazm tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zgrazz tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc @@ -422,16 +420,6 @@ CONTAINS ! ! Write the output IF( lk_iomput .AND. knt == nrdttrc ) THEN - ! - IF( iom_use ( "PCAL" ) ) THEN ! Calcite production - ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp - DO_3D( 0, 0, 0, 0, 1, jpkm1) - zw3d(ji,jj,jk) = prodcal(ji,jj,jk) * 1.e+3 * rfact2r * tmask(ji,jj,jk) - END_3D - CALL iom_put( "PCAL", zw3d ) - DEALLOCATE( zw3d ) - ENDIF - ! ! IF( l_dia_graz2 ) THEN ! Total grazing of phyto by zooplankton zgrazing2(A2D(0),jpk) = 0._wp @@ -488,7 +476,7 @@ CONTAINS INTEGER :: ios ! Local integer ! NAMELIST/namp4zmes/ part2, grazrat2, resrat2, mzrat2, xpref2n, xpref2d, xpref2z, & - & xpref2c, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & + & xpref2c, xpref2m, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, xthresh2mes, & & xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux, ln_dvm_meso, & & xsigma2, xsigma2del, xfracmig !!---------------------------------------------------------------------- @@ -513,10 +501,12 @@ CONTAINS WRITE(numout,*) ' mesozoo preference for diatoms xpref2d =', xpref2d WRITE(numout,*) ' mesozoo preference for zoo xpref2z =', xpref2z WRITE(numout,*) ' mesozoo preference for poc xpref2c =', xpref2c + WRITE(numout,*) ' mesozoo preference for mesozoo xpref2m = ', xpref2m WRITE(numout,*) ' microzoo feeding threshold for mesozoo xthresh2zoo =', xthresh2zoo WRITE(numout,*) ' diatoms feeding threshold for mesozoo xthresh2dia =', xthresh2dia WRITE(numout,*) ' nanophyto feeding threshold for mesozoo xthresh2phy =', xthresh2phy WRITE(numout,*) ' poc feeding threshold for mesozoo xthresh2poc =', xthresh2poc + WRITE(numout,*) ' mesozoo feeding threshold for mesozoo xthresh2mes = ', xthresh2mes WRITE(numout,*) ' feeding threshold for mesozooplankton xthresh2 =', xthresh2 WRITE(numout,*) ' exsudation rate of mesozooplankton resrat2 =', resrat2 WRITE(numout,*) ' mesozooplankton mortality rate mzrat2 =', mzrat2 diff --git a/src/TOP/PISCES/P4Z/p4zmicro.F90 b/src/TOP/PISCES/P4Z/p4zmicro.F90 index a18a41e354263d91c56b7975815781a2d21240b9..d480cb1aa12179306d751e209faef35879f2e7a8 100644 --- a/src/TOP/PISCES/P4Z/p4zmicro.F90 +++ b/src/TOP/PISCES/P4Z/p4zmicro.F90 @@ -13,7 +13,6 @@ MODULE p4zmicro USE oce_trc ! shared variables between ocean and passive tracers USE trc ! passive tracers common variables USE sms_pisces ! PISCES Source Minus Sink variables - USE p4zlim ! Co-limitations USE p4zprod ! production USE iom ! I/O manager USE prtctl ! print control for debugging @@ -29,9 +28,11 @@ MODULE p4zmicro REAL(wp), PUBLIC :: xprefc !: microzoo preference for POC REAL(wp), PUBLIC :: xprefn !: microzoo preference for nanophyto REAL(wp), PUBLIC :: xprefd !: microzoo preference for diatoms + REAL(wp), PUBLIC :: xprefz !: microzoo preference for microzooplankton REAL(wp), PUBLIC :: xthreshdia !: diatoms feeding threshold for microzooplankton REAL(wp), PUBLIC :: xthreshphy !: nanophyto threshold for microzooplankton REAL(wp), PUBLIC :: xthreshpoc !: poc threshold for microzooplankton + REAL(wp), PUBLIC :: xthreshzoo !: microzoo threshold for microzooplankton REAL(wp), PUBLIC :: xthresh !: feeding threshold for microzooplankton REAL(wp), PUBLIC :: resrat !: exsudation rate of microzooplankton REAL(wp), PUBLIC :: mzrat !: microzooplankton mortality rate @@ -74,12 +75,12 @@ CONTAINS ! INTEGER :: ji, jj, jk REAL(wp) :: zcompadi, zcompaz , zcompaph, zcompapoc - REAL(wp) :: zgraze , zdenom, zdenom2, zfact, zfood, zfoodlim, zbeta + REAL(wp) :: zgraze, zdenom, zfact, zfood, zfoodlim, zbeta REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgrarsig, zgraztotc, zgraztotn, zgraztotf REAL(wp) :: zgrarem, zgrafer, zgrapoc, zprcaca, zmortz REAL(wp) :: zrespz, ztortz, zgrasratf, zgrasratn - REAL(wp) :: zgraznc, zgrazpoc, zgrazdc, zgrazpof, zgrazdf, zgraznf - REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmptot, zproport + REAL(wp) :: zgraznc, zgrazz, zgrazpoc, zgrazdc, zgrazpof, zgrazdf, zgraznf + REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmp4, ztmptot, zproport REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zgrazing, zfezoo, zzligprod CHARACTER (len=25) :: charout @@ -114,21 +115,22 @@ CONTAINS ! Proportion of diatoms that are within the size range ! accessible to microzooplankton. - zproport = min(1.0, exp(-1.1 * MAX(0., ( sized(ji,jj,jk) - 1.8 ))**0.8 )) + zproport = sized(ji,jj,jk)**(-0.48) * ( 1.0 - ( sized(ji,jj,jk)**1.6 - 1.0 ) / 14.0 ) ! linear mortality of mesozooplankton ! A michaelis menten modulation term is used to avoid extinction of ! microzooplankton at very low food concentrations. Mortality is ! enhanced in low O2 waters ! ----------------------------------------------------------------- - zrespz = resrat * zfact * tr(ji,jj,jk,jpzoo,Kbb) / ( xkmort + tr(ji,jj,jk,jpzoo,Kbb) ) & - & + resrat * zfact * 3. * nitrfac(ji,jj,jk) + zrespz = resrat * zfact * ( tr(ji,jj,jk,jpzoo,Kbb) / ( xkmort + tr(ji,jj,jk,jpzoo,Kbb) ) & + & + 3. * nitrfac(ji,jj,jk) ) ! Zooplankton quadratic mortality. A square function has been selected with ! to mimic predation and disease (density dependent mortality). It also tends ! to stabilise the model ! ------------------------------------------------------------------------- ztortz = mzrat * 1.e6 * zfact * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) + zmortz = ztortz + zrespz ! Computation of the abundance of the preys ! A threshold can be specified in the namelist @@ -139,6 +141,7 @@ CONTAINS zcompadi = zproport * MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthreshdia ), 0.e0 ) zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthreshphy ), 0.e0 ) zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthreshpoc ), 0.e0 ) + zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthreshzoo ), 0.e0 ) ! Microzooplankton grazing ! The total amount of food is the sum of all preys accessible to mesozooplankton @@ -147,10 +150,9 @@ CONTAINS ! concentration is close to this threshold, it is decreased to avoid the ! accumulation of food in the mesozoopelagic domain ! ------------------------------------------------------------------------------- - zfood = xprefn * zcompaph + xprefc * zcompapoc + xprefd * zcompadi - zfoodlim = MAX( 0. , zfood - min(xthresh,0.5*zfood) ) + zfood = xprefn * zcompaph + xprefc * zcompapoc + xprefd * zcompadi + xprefz * zcompaz + zfoodlim = MAX( 0. , zfood - MIN(xthresh,0.5*zfood) ) zdenom = zfoodlim / ( xkgraz + zfoodlim ) - zdenom2 = zdenom / ( zfood + rtrn ) zgraze = grazrat * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) ! An active switching parameterization is used here. @@ -167,19 +169,22 @@ CONTAINS ! ---------------------------------------------------------- zsigma = 1.0 - zdenom**2/(0.05**2+zdenom**2) zsigma = xsigma + xsigmadel * zsigma - zdiffdn = exp( -ABS(log(1.67 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2) - ztmp1 = xprefn * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / ( 1.0 + zdiffdn ) - ztmp2 = xprefd * zcompadi * ( zdiffdn * zcompaph + zcompadi ) / ( 1.0 + zdiffdn ) + zdiffdn = EXP( -ABS(LOG(1.67 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2) + ztmp1 = xprefn * zcompaph * ( zcompaph + zdiffdn * zcompadi ) + ztmp2 = xprefd * zcompadi * ( zdiffdn * zcompaph + zcompadi ) ztmp3 = xprefc * zcompapoc**2 - ztmptot = ztmp1 + ztmp2 + ztmp3 + rtrn + ztmp4 = xprefz * zcompaz**2 + ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + rtrn ztmp1 = ztmp1 / ztmptot ztmp2 = ztmp2 / ztmptot ztmp3 = ztmp3 / ztmptot + ztmp4 = ztmp4 / ztmptot ! Ingestion terms on the different preys of microzooplankton zgraznc = zgraze * ztmp1 * zdenom ! Nanophytoplankton zgrazdc = zgraze * ztmp2 * zdenom ! Diatoms zgrazpoc = zgraze * ztmp3 * zdenom ! POC + zgrazz = zgraze * ztmp4 * zdenom ! Microzoo ! Ingestion terms on the iron content of the different preys zgraznf = zgraznc * tr(ji,jj,jk,jpnfe,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn) @@ -187,11 +192,16 @@ CONTAINS zgrazdf = zgrazdc * tr(ji,jj,jk,jpdfe,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn) ! ! Total ingestion rate in C, Fe, N units - zgraztotc = zgraznc + zgrazpoc + zgrazdc ! grazing by microzooplankton + zgraztotc = zgraznc + zgrazpoc + zgrazdc + zgrazz IF( l_dia_graz1 ) zgrazing(ji,jj,jk) = zgraztotc - zgraztotf = zgraznf + zgrazdf + zgrazpof - zgraztotn = zgraznc * quotan(ji,jj,jk) + zgrazpoc + zgrazdc * quotad(ji,jj,jk) + zgraztotf = zgraznf + zgrazdf + zgrazpof + zgrazz * feratz + zgraztotn = zgraznc * quotan(ji,jj,jk) + zgrazpoc + zgrazdc * quotad(ji,jj,jk) + zgrazz + + ! Stoichiometruc ratios of the food ingested by zooplanton + ! -------------------------------------------------------- + zgrasratf = ( zgraztotf + rtrn ) / ( zgraztotc + rtrn ) + zgrasratn = ( zgraztotn + rtrn ) / ( zgraztotc + rtrn ) ! Microzooplankton efficiency. ! We adopt a formulation proposed by Mitra et al. (2007) @@ -201,11 +211,8 @@ CONTAINS ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and ! Fulton, 2012) ! ----------------------------------------------------------------------------- - - zgrasratf = ( zgraztotf + rtrn ) / ( zgraztotc + rtrn ) - zgrasratn = ( zgraztotn + rtrn ) / ( zgraztotc + rtrn ) zepshert = MIN( 1., zgrasratn, zgrasratf / feratz) - zbeta = MAX(0., (epsher - epshermin) ) + zbeta = MAX(0., (epsher - epshermin) ) ! Food quantity deprivation of the GGE zepsherf = epshermin + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) ! Food quality deprivation of the GGE @@ -219,7 +226,6 @@ CONTAINS ! Egestion of C, N, P zgrapoc = zgraztotc * unass - ! Update of the TRA arrays ! ------------------------ ! Fraction of excretion as inorganic nutrients and DIC @@ -241,8 +247,7 @@ CONTAINS tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgrarsig ! Update the arrays TRA which contain the biological sources and sinks ! -------------------------------------------------------------------- - zmortz = ztortz + zrespz - tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zmortz + zepsherv * zgraztotc + tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zmortz + zepsherv * zgraztotc - zgrazz tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) - zgraznc * tr(ji,jj,jk,jpnch,Kbb)/(tr(ji,jj,jk,jpphy,Kbb)+rtrn) @@ -328,7 +333,7 @@ CONTAINS INTEGER :: ios ! Local integer ! NAMELIST/namp4zzoo/ part, grazrat, resrat, mzrat, xprefn, xprefc, & - & xprefd, xthreshdia, xthreshphy, xthreshpoc, & + & xprefd, xprefz, xthreshdia, xthreshphy, xthreshpoc, xthreshzoo, & & xthresh, xkgraz, epsher, epshermin, sigma1, unass, & & xsigma, xsigmadel !!---------------------------------------------------------------------- @@ -352,9 +357,11 @@ CONTAINS WRITE(numout,*) ' microzoo preference for POC xprefc =', xprefc WRITE(numout,*) ' microzoo preference for nano xprefn =', xprefn WRITE(numout,*) ' microzoo preference for diatoms xprefd =', xprefd + WRITE(numout,*) ' microzoo preference for microzooplankton xprefz =', xprefz WRITE(numout,*) ' diatoms feeding threshold for microzoo xthreshdia =', xthreshdia WRITE(numout,*) ' nanophyto feeding threshold for microzoo xthreshphy =', xthreshphy WRITE(numout,*) ' poc feeding threshold for microzoo xthreshpoc =', xthreshpoc + WRITE(numout,*) ' microzoo feeding threshold for microzoo xthreshzoo =', xthreshzoo WRITE(numout,*) ' feeding threshold for microzooplankton xthresh =', xthresh WRITE(numout,*) ' exsudation rate of microzooplankton resrat =', resrat WRITE(numout,*) ' microzooplankton mortality rate mzrat =', mzrat diff --git a/src/TOP/PISCES/P4Z/p4zmort.F90 b/src/TOP/PISCES/P4Z/p4zmort.F90 index 3c3903e748d7ef659c834daf32842ee664dceac2..f90213ce8d36d007f255350c0d5d96160b894e70 100644 --- a/src/TOP/PISCES/P4Z/p4zmort.F90 +++ b/src/TOP/PISCES/P4Z/p4zmort.F90 @@ -13,6 +13,7 @@ MODULE p4zmort USE trc ! passive tracers common variables USE sms_pisces ! PISCES Source Minus Sink variables USE p4zprod ! Primary productivity + USE p2zlim ! Phytoplankton limitation terms USE p4zlim ! Phytoplankton limitation terms USE prtctl ! print control for debugging diff --git a/src/TOP/PISCES/P4Z/p4zopt.F90 b/src/TOP/PISCES/P4Z/p4zopt.F90 index 8ff01e2ce7be882b02c7d689b7c3e9a2d4156b68..961f6775481db1d73c82b9d3628d58234e833a82 100644 --- a/src/TOP/PISCES/P4Z/p4zopt.F90 +++ b/src/TOP/PISCES/P4Z/p4zopt.F90 @@ -65,8 +65,8 @@ CONTAINS INTEGER :: irgb REAL(wp) :: zchl REAL(wp) :: zc0 , zc1 , zc2, zc3, z1_dep - REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zetmp5 - REAL(wp), DIMENSION(A2D(0) ) :: zdepmoy, zetmp1, zetmp2, zetmp3, zetmp4 + REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zetmp4 + REAL(wp), DIMENSION(A2D(0) ) :: zdepmoy, zetmp1, zetmp2, zetmp3 REAL(wp), DIMENSION(A2D(0) ) :: zqsr100, zqsr_corr REAL(wp), DIMENSION(A2D(0),jpk) :: zpar, ze0, ze1, ze2, ze3 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d @@ -82,12 +82,6 @@ CONTAINS IF( knt == 1 .AND. ln_varpar ) CALL p4z_opt_sbc( kt ) - ! Initialisation of variables used to compute PAR - ! ----------------------------------------------- -! ze1(:,:,:) = 0._wp -! ze2(:,:,:) = 0._wp -! ze3(:,:,:) = 0._wp - ! ! Attenuation coef. function of Chlorophyll and wavelength (Red-Green-Blue) ! Thus the light penetration scheme is based on a decomposition of PAR @@ -98,8 +92,12 @@ CONTAINS ! Computation of the light attenuation parameters based on a ! look-up table DO_3D( 0, 0, 0, 0, 1, jpkm1) - zchl = ( tr(ji,jj,jk,jpnch,Kbb) + tr(ji,jj,jk,jpdch,Kbb) + rtrn ) * 1.e6 - IF( ln_p5z ) zchl = zchl + tr(ji,jj,jk,jppch,Kbb) * 1.e6 + IF( ln_p2z ) THEN + zchl = ( tr(ji,jj,jk,jpphy,Kbb) * 12.0 * thetanano(ji,jj,jk) + rtrn ) * 1.e6 + ELSE + zchl = ( tr(ji,jj,jk,jpnch,Kbb) + tr(ji,jj,jk,jpdch,Kbb) + rtrn ) * 1.e6 + IF( ln_p5z ) zchl = zchl + tr(ji,jj,jk,jppch,Kbb) * 1.e6 + ENDIF zchl = MIN( 10. , MAX( 0.05, zchl ) ) irgb = NINT( 41 + 20.* LOG10( zchl ) + rtrn ) ! @@ -153,12 +151,16 @@ CONTAINS DO_3D( 0, 0, 0, 0, 1, nksr ) etot (ji,jj,jk) = ze1(ji,jj,jk) + ze2(ji,jj,jk) + ze3(ji,jj,jk) enano(ji,jj,jk) = 1.85 * ze1(ji,jj,jk) + 0.69 * ze2(ji,jj,jk) + 0.46 * ze3(ji,jj,jk) - ediat(ji,jj,jk) = 1.62 * ze1(ji,jj,jk) + 0.74 * ze2(ji,jj,jk) + 0.63 * ze3(ji,jj,jk) END_3D - IF( ln_p5z ) THEN + IF( .NOT. ln_p2z ) THEN DO_3D( 0, 0, 0, 0, 1, nksr ) - epico(ji,jj,jk) = 1.94 * ze1(ji,jj,jk) + 0.66 * ze2(ji,jj,jk) + 0.4 * ze3(ji,jj,jk) + ediat(ji,jj,jk) = 1.62 * ze1(ji,jj,jk) + 0.74 * ze2(ji,jj,jk) + 0.63 * ze3(ji,jj,jk) END_3D + IF( ln_p5z ) THEN + DO_3D( 0, 0, 0, 0, 1, nksr ) + epico(ji,jj,jk) = 1.94 * ze1(ji,jj,jk) + 0.66 * ze2(ji,jj,jk) + 0.4 * ze3(ji,jj,jk) + END_3D + ENDIF ENDIF ELSE ! No diurnal cycle in PISCES @@ -182,12 +184,16 @@ CONTAINS DO_3D( 0, 0, 0, 0, 1, nksr ) etot_ndcy(ji,jj,jk) = ze1(ji,jj,jk) + ze2(ji,jj,jk) + ze3(ji,jj,jk) enano (ji,jj,jk) = 1.85 * ze1(ji,jj,jk) + 0.69 * ze2(ji,jj,jk) + 0.46 * ze3(ji,jj,jk) - ediat (ji,jj,jk) = 1.62 * ze1(ji,jj,jk) + 0.74 * ze2(ji,jj,jk) + 0.63 * ze3(ji,jj,jk) END_3D - IF( ln_p5z ) THEN + IF( .NOT. ln_p2z ) THEN DO_3D( 0, 0, 0, 0, 1, nksr ) - epico(ji,jj,jk) = 1.94 * ze1(ji,jj,jk) + 0.66 * ze2(ji,jj,jk) + 0.4 * ze3(ji,jj,jk) + ediat(ji,jj,jk) = 1.62 * ze1(ji,jj,jk) + 0.74 * ze2(ji,jj,jk) + 0.63 * ze3(ji,jj,jk) END_3D + IF( ln_p5z ) THEN + DO_3D( 0, 0, 0, 0, 1, nksr ) + epico(ji,jj,jk) = 1.94 * ze1(ji,jj,jk) + 0.66 * ze2(ji,jj,jk) + 0.4 * ze3(ji,jj,jk) + END_3D + ENDIF ENDIF ! ! SW over the ice free zone of the grid cell. This assumes that @@ -227,12 +233,16 @@ CONTAINS DO_3D( 0, 0, 0, 0, 1, nksr ) etot (ji,jj,jk) = ze1(ji,jj,jk) + ze2(ji,jj,jk) + ze3(ji,jj,jk) enano(ji,jj,jk) = 1.85 * ze1(ji,jj,jk) + 0.69 * ze2(ji,jj,jk) + 0.46 * ze3(ji,jj,jk) - ediat(ji,jj,jk) = 1.62 * ze1(ji,jj,jk) + 0.74 * ze2(ji,jj,jk) + 0.63 * ze3(ji,jj,jk) END_3D - IF( ln_p5z ) THEN + IF( .NOT. ln_p2z ) THEN DO_3D( 0, 0, 0, 0, 1, nksr ) - epico(ji,jj,jk) = 1.94 * ze1(ji,jj,jk) + 0.66 * ze2(ji,jj,jk) + 0.4 * ze3(ji,jj,jk) ! Picophytoplankton (PISCES-QUOTA) + ediat(ji,jj,jk) = 1.62 * ze1(ji,jj,jk) + 0.74 * ze2(ji,jj,jk) + 0.63 * ze3(ji,jj,jk) END_3D + IF( ln_p5z ) THEN + DO_3D( 0, 0, 0, 0, 1, nksr ) + epico(ji,jj,jk) = 1.94 * ze1(ji,jj,jk) + 0.66 * ze2(ji,jj,jk) + 0.4 * ze3(ji,jj,jk) + END_3D + ENDIF ENDIF etot_ndcy(:,:,:) = etot(:,:,:) ENDIF @@ -307,32 +317,48 @@ CONTAINS ! groups based on their absorption characteristics. zdepmoy(:,:) = 0.e0 zetmp3 (:,:) = 0.e0 - zetmp4 (:,:) = 0.e0 ! DO_3D( 0, 0, 0, 0, 1, nksr) IF( gdepw(ji,jj,jk+1,Kmm) <= MIN(hmld(ji,jj), heup_01(ji,jj)) ) THEN zetmp3 (ji,jj) = zetmp3 (ji,jj) + enano (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Nanophytoplankton - zetmp4 (ji,jj) = zetmp4 (ji,jj) + ediat (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Diatoms zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t(ji,jj,jk,Kmm) ENDIF END_3D enanom(:,:,:) = enano(:,:,:) - ediatm(:,:,:) = ediat(:,:,:) ! DO_3D( 0, 0, 0, 0, 1, nksr) IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN z1_dep = 1. / ( zdepmoy(ji,jj) + rtrn ) enanom(ji,jj,jk) = zetmp3(ji,jj) * z1_dep - ediatm(ji,jj,jk) = zetmp4(ji,jj) * z1_dep ENDIF END_3D ! + IF( .NOT. ln_p2z ) THEN + ! Diatoms when using PISCES-operational or PISCES-QUOTA + ALLOCATE( zetmp4(A2D(0)) ) ; zetmp4 (:,:) = 0.e0 + ! + DO_3D( 0, 0, 0, 0, 1, nksr) + IF( gdepw(ji,jj,jk+1,Kmm) <= MIN(hmld(ji,jj), heup_01(ji,jj)) ) THEN + zetmp4 (ji,jj) = zetmp4 (ji,jj) + ediat (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Diatoms + ENDIF + END_3D + ! + ediatm(:,:,:) = ediat(:,:,:) + ! + DO_3D( 0, 0, 0, 0, 1, nksr) + IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN + z1_dep = 1. / ( zdepmoy(ji,jj) + rtrn ) + ediatm(ji,jj,jk) = zetmp4(ji,jj) * z1_dep + ENDIF + END_3D + DEALLOCATE( zetmp4 ) + ENDIF IF( ln_p5z ) THEN ! Picophytoplankton when using PISCES-QUOTA - ALLOCATE( zetmp5(A2D(0)) ) ; zetmp5 (:,:) = 0.e0 + ALLOCATE( zetmp4(A2D(0)) ) ; zetmp4 (:,:) = 0.e0 DO_3D( 0, 0, 0, 0, 1, nksr) IF( gdepw(ji,jj,jk+1,Kmm) <= MIN(hmld(ji,jj), heup_01(ji,jj)) ) THEN - zetmp5(ji,jj) = zetmp5 (ji,jj) + epico(ji,jj,jk) * e3t(ji,jj,jk,Kmm) + zetmp4(ji,jj) = zetmp4 (ji,jj) + epico(ji,jj,jk) * e3t(ji,jj,jk,Kmm) ENDIF END_3D ! @@ -341,10 +367,10 @@ CONTAINS DO_3D( 0, 0, 0, 0, 1, nksr) IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN z1_dep = 1. / ( zdepmoy(ji,jj) + rtrn ) - epicom(ji,jj,jk) = zetmp5(ji,jj) * z1_dep + epicom(ji,jj,jk) = zetmp4(ji,jj) * z1_dep ENDIF END_3D - DEALLOCATE( zetmp5 ) + DEALLOCATE( zetmp4 ) ENDIF ! IF( lk_iomput .AND. knt == nrdttrc ) THEN @@ -537,9 +563,9 @@ CONTAINS etot (:,:,:) = 0._wp etot_ndcy(:,:,:) = 0._wp enano (:,:,:) = 0._wp - ediat (:,:,:) = 0._wp - IF( ln_p5z ) epico (:,:,:) = 0._wp - IF( ln_qsr_bio ) etot3 (:,:,:) = 0._wp + IF( .NOT. ln_p2z) ediat (:,:,:) = 0._wp + IF( ln_p5z ) epico (:,:,:) = 0._wp + IF( ln_qsr_bio ) etot3 (:,:,:) = 0._wp ! END SUBROUTINE p4z_opt_init diff --git a/src/TOP/PISCES/P4Z/p4zpoc.F90 b/src/TOP/PISCES/P4Z/p4zpoc.F90 index 823d416a856829fef852d7616d780b6d50aeaf6c..59863b3174600d53c6d68d278917ed08a4d3b7a3 100644 --- a/src/TOP/PISCES/P4Z/p4zpoc.F90 +++ b/src/TOP/PISCES/P4Z/p4zpoc.F90 @@ -28,7 +28,6 @@ MODULE p4zpoc PUBLIC alngam ! PUBLIC gamain ! - REAL(wp), PUBLIC :: xremip !: remineralisation rate of DOC REAL(wp), PUBLIC :: xremipc !: remineralisation rate of DOC REAL(wp), PUBLIC :: xremipn !: remineralisation rate of DON REAL(wp), PUBLIC :: xremipp !: remineralisation rate of DOP @@ -71,7 +70,7 @@ CONTAINS ! INTEGER :: ji, jj, jk, jn REAL(wp) :: zremip, zremig, zdep, zorem, zorem2, zofer - REAL(wp) :: zopon, zopop, zopoc, zopoc2, zopon2, zopop2 + REAL(wp) :: zopon, zopop, zopon2, zopop2 REAL(wp) :: zsizek, zsizek1, alphat, remint, zpoc, zremipart REAL(wp) :: zofer2, zofer3 CHARACTER (len=25) :: charout @@ -86,184 +85,173 @@ CONTAINS IF( kt == nittrc000 ) & & l_dia_remin_part = iom_use( "REMINP" ) .OR. iom_use( "REMING" ) .OR. iom_use( "REMINF" ) ! - IF( l_dia_remin_part ) THEN + IF( l_dia_remin_part ) THEN ALLOCATE( zfolimi (A2D(0),jpk) ) ; zfolimi (A2D(0),jpk) = 0._wp DO_3D( 0, 0, 0, 0, 1, jpkm1) zfolimi (ji,jj,jk) = tr(ji,jj,jk,jpfer,Krhs) END_3D - ENDIF - ! Initialisation of temporary arrays - IF( ln_p4z ) THEN ; ztremint(:,:,:) = xremip - ELSE ; ztremint(:,:,:) = xremipc ! ln_p5z ENDIF + + ! Initialisation of temporary arrays + ztremint(:,:,:) = xremipc + orem (:,:,jpk) = 0. zorem3(:,:,:) = 0. - orem (:,:,:) = 0. ! Initialisation of the lability distributions that are set to ! the distribution of newly produced organic particles DO jn = 1, jcpoc - alphag(:,:,:,jn) = alphan(jn) alphap(:,:,:,jn) = alphan(jn) + alphag(:,:,:,jn) = alphan(jn) END DO - ! Lability parameterization. This is the big particles part (GOC) - ! This lability parameterization is always active. However, if only one - ! lability class is specified in the namelist, this is equivalent to - ! a standard parameterisation with a constant lability - ! ----------------------------------------------------------------------- - DO_3D( 0, 0, 0, 0, 2, jpkm1) - IF (tmask(ji,jj,jk) == 1.) THEN - zdep = hmld(ji,jj) - ! - ! In the case of GOC, lability is constant in the mixed layer - ! It is computed only below the mixed layer depth - ! ------------------------------------------------------------ - ! - IF( gdept(ji,jj,jk,Kmm) > zdep ) THEN - alphat = 0. - remint = 0. - ! - zsizek1 = e3t(ji,jj,jk-1,Kmm) / 2. / (wsbio4(ji,jj,jk-1) + rtrn) * tgfunc(ji,jj,jk-1) - zsizek = e3t(ji,jj,jk,Kmm) / 2. / (wsbio4(ji,jj,jk) + rtrn) * tgfunc(ji,jj,jk) - ! - IF ( gdept(ji,jj,jk-1,Kmm) <= zdep ) THEN - ! - ! The first level just below the mixed layer needs a - ! specific treatment because lability is supposed constant - ! everywhere within the mixed layer. This means that - ! change in lability in the bottom part of the previous cell - ! should not be computed - ! ---------------------------------------------------------- + IF( .NOT. ln_p2z) THEN + ! Lability parameterization. This is the big particles part (GOC) + ! This lability parameterization is always active. However, if only one + ! lability class is specified in the namelist, this is equivalent to + ! a standard parameterisation with a constant lability + ! ----------------------------------------------------------------------- + DO_3D( 0, 0, 0, 0, 2, jpkm1) + IF (tmask(ji,jj,jk) == 1.) THEN + zdep = hmld(ji,jj) ! - ! POC concentration is computed using the lagrangian - ! framework. It is only used for the lability param - zpoc = tr(ji,jj,jk-1,jpgoc,Kbb) + consgoc(ji,jj,jk) * rday / rfact2 & - & * e3t(ji,jj,jk,Kmm) / 2. / (wsbio4(ji,jj,jk) + rtrn) - zpoc = MAX(0., zpoc) + ! In the case of GOC, lability is constant in the mixed layer + ! It is computed only below the mixed layer depth + ! ------------------------------------------------------------ ! - DO jn = 1, jcpoc + IF( gdept(ji,jj,jk,Kmm) > zdep ) THEN + alphat = 0. + remint = 0. ! - ! Lagrangian based algorithm. The fraction of each - ! lability class is computed starting from the previous - ! level - ! ----------------------------------------------------- + zsizek1 = e3t(ji,jj,jk-1,Kmm) / 2. / (wsbio4(ji,jj,jk-1) + rtrn) * tgfunc(ji,jj,jk-1) + zsizek = e3t(ji,jj,jk,Kmm) / 2. / (wsbio4(ji,jj,jk) + rtrn) * tgfunc(ji,jj,jk) ! - ! the concentration of each lability class is calculated - ! as the sum of the different sources and sinks - ! Please note that production of new GOC experiences - ! degradation - alphag(ji,jj,jk,jn) = alphag(ji,jj,jk-1,jn) * exp( -reminp(jn) * zsizek ) * zpoc & - & + prodgoc(ji,jj,jk) * alphan(jn) / tgfunc(ji,jj,jk) / reminp(jn) & - & * ( 1. - exp( -reminp(jn) * zsizek ) ) * rday / rfact2 - alphat = alphat + alphag(ji,jj,jk,jn) - remint = remint + alphag(ji,jj,jk,jn) * reminp(jn) - END DO - ELSE - ! - ! standard algorithm in the rest of the water column - ! See the comments in the previous block. - ! --------------------------------------------------- - ! - zpoc = tr(ji,jj,jk-1,jpgoc,Kbb) + consgoc(ji,jj,jk-1) * rday / rfact2 & - & * e3t(ji,jj,jk-1,Kmm) / 2. / (wsbio4(ji,jj,jk-1) + rtrn) + consgoc(ji,jj,jk) & - & * rday / rfact2 * e3t(ji,jj,jk,Kmm) / 2. / (wsbio4(ji,jj,jk) + rtrn) - zpoc = max(0., zpoc) - ! - DO jn = 1, jcpoc - alphag(ji,jj,jk,jn) = alphag(ji,jj,jk-1,jn) * exp( -reminp(jn) * ( zsizek & - & + zsizek1 ) ) * zpoc + ( prodgoc(ji,jj,jk-1) / tgfunc(ji,jj,jk-1) * ( 1. & - & - exp( -reminp(jn) * zsizek1 ) ) * exp( -reminp(jn) * zsizek ) + prodgoc(ji,jj,jk) & - & / tgfunc(ji,jj,jk) * ( 1. - exp( -reminp(jn) * zsizek ) ) ) * rday / rfact2 / reminp(jn) * alphan(jn) - alphat = alphat + alphag(ji,jj,jk,jn) - remint = remint + alphag(ji,jj,jk,jn) * reminp(jn) - END DO - ENDIF - ! - DO jn = 1, jcpoc - ! The contribution of each lability class at the current - ! level is computed - alphag(ji,jj,jk,jn) = alphag(ji,jj,jk,jn) / ( alphat + rtrn) - END DO - ! Computation of the mean remineralisation rate - ztremint(ji,jj,jk) = MAX(0., remint / ( alphat + rtrn) ) - ! - ENDIF + IF ( gdept(ji,jj,jk-1,Kmm) <= zdep ) THEN + ! + ! The first level just below the mixed layer needs a + ! specific treatment because lability is supposed constant + ! everywhere within the mixed layer. This means that + ! change in lability in the bottom part of the previous cell + ! should not be computed + ! ---------------------------------------------------------- + ! + ! POC concentration is computed using the lagrangian + ! framework. It is only used for the lability param + zpoc = tr(ji,jj,jk-1,jpgoc,Kbb) + consgoc(ji,jj,jk) * rday / rfact2 & + & * e3t(ji,jj,jk,Kmm) / 2. / (wsbio4(ji,jj,jk) + rtrn) + zpoc = MAX(0., zpoc) + ! + DO jn = 1, jcpoc + ! + ! Lagrangian based algorithm. The fraction of each + ! lability class is computed starting from the previous + ! level + ! ----------------------------------------------------- + ! + ! the concentration of each lability class is calculated + ! as the sum of the different sources and sinks + ! Please note that production of new GOC experiences + ! degradation + alphag(ji,jj,jk,jn) = alphag(ji,jj,jk-1,jn) * exp( -reminp(jn) * zsizek ) * zpoc & + & + prodgoc(ji,jj,jk) * alphan(jn) / tgfunc(ji,jj,jk) / reminp(jn) & + & * ( 1. - exp( -reminp(jn) * zsizek ) ) * rday / rfact2 + alphat = alphat + alphag(ji,jj,jk,jn) + remint = remint + alphag(ji,jj,jk,jn) * reminp(jn) + END DO + ELSE + ! + ! standard algorithm in the rest of the water column + ! See the comments in the previous block. + ! --------------------------------------------------- + ! + zpoc = tr(ji,jj,jk-1,jpgoc,Kbb) + consgoc(ji,jj,jk-1) * rday / rfact2 & + & * e3t(ji,jj,jk-1,Kmm) / 2. / (wsbio4(ji,jj,jk-1) + rtrn) + consgoc(ji,jj,jk) & + & * rday / rfact2 * e3t(ji,jj,jk,Kmm) / 2. / (wsbio4(ji,jj,jk) + rtrn) + zpoc = max(0., zpoc) + ! + DO jn = 1, jcpoc + alphag(ji,jj,jk,jn) = alphag(ji,jj,jk-1,jn) * exp( -reminp(jn) * ( zsizek & + & + zsizek1 ) ) * zpoc + ( prodgoc(ji,jj,jk-1) / tgfunc(ji,jj,jk-1) * ( 1. & + & - exp( -reminp(jn) * zsizek1 ) ) * exp( -reminp(jn) * zsizek ) + prodgoc(ji,jj,jk) & + & / tgfunc(ji,jj,jk) * ( 1. - exp( -reminp(jn) * zsizek ) ) ) * rday / rfact2 / reminp(jn) * alphan(jn) + alphat = alphat + alphag(ji,jj,jk,jn) + remint = remint + alphag(ji,jj,jk,jn) * reminp(jn) + END DO + ENDIF + ! + DO jn = 1, jcpoc + ! The contribution of each lability class at the current + ! level is computed + alphag(ji,jj,jk,jn) = alphag(ji,jj,jk,jn) / ( alphat + rtrn) + END DO + ! Computation of the mean remineralisation rate + ztremint(ji,jj,jk) = MAX(0., remint / ( alphat + rtrn) ) + ! + ENDIF + ENDIF + END_3D + ! + IF( l_dia_remin_part ) THEN + ALLOCATE( zremigoc(A2D(0),jpk) ) ; zremigoc(A2D(0),jpk) = 0._wp + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zremigoc(ji,jj,jk) = tr(ji,jj,jk,jpdoc,Krhs) + END_3D ENDIF - END_3D - ! - IF( l_dia_remin_part ) THEN - ALLOCATE( zremigoc(A2D(0),jpk) ) ; zremigoc(A2D(0),jpk) = 0._wp + ! + ! The standard PISCES part DO_3D( 0, 0, 0, 0, 1, jpkm1) - zremigoc(ji,jj,jk) = tr(ji,jj,jk,jpdoc,Krhs) + ! POC degradation by bacterial activity. It is a function + ! of the mean lability and of temperature. This also includes + ! shrinking of particles due to the bacterial activity + ! ----------------------------------------------------------- + zremipart = MIN( xremipc, ztremint(ji,jj,jk) ) + zremig = zremipart * xstep * tgfunc(ji,jj,jk) + zorem2 = zremig * tr(ji,jj,jk,jpgoc,Kbb) + orem(ji,jj,jk) = zorem2 + zorem3(ji,jj,jk) = zremig * solgoc * tr(ji,jj,jk,jpgoc,Kbb) + zofer2 = zremig * tr(ji,jj,jk,jpbfe,Kbb) + + ! update of the TRA arrays + tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zorem3(ji,jj,jk) + tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zorem2 - zorem3(ji,jj,jk) + tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + solgoc * zofer2 + tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - (1.0 + solgoc) * zofer2 + tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zorem2 + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zofer2 END_3D - ENDIF - ! - IF( ln_p4z ) THEN - ! The standard PISCES part - DO_3D( 0, 0, 0, 0, 1, jpkm1) - ! POC degradation by bacterial activity. It is a function - ! of the mean lability and of temperature. This also includes - ! shrinking of particles due to the bacterial activity - ! ----------------------------------------------------------- - zremipart = MIN( xremip, ztremint(ji,jj,jk) ) - zremig = zremipart * xstep * tgfunc(ji,jj,jk) - zorem2 = zremig * tr(ji,jj,jk,jpgoc,Kbb) - orem(ji,jj,jk) = zorem2 - zorem3(ji,jj,jk) = zremig * solgoc * tr(ji,jj,jk,jpgoc,Kbb) - zofer2 = zremig * tr(ji,jj,jk,jpbfe,Kbb) - zofer3 = zremig * solgoc * tr(ji,jj,jk,jpbfe,Kbb) - - ! update of the TRA arrays - tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zorem3(ji,jj,jk) - tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zorem2 - zorem3(ji,jj,jk) - tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zofer3 - tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zofer2 - zofer3 - tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zorem2 - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zofer2 - END_3D - ELSE - DO_3D( 0, 0, 0, 0, 1, jpkm1) - ! POC degradation by bacterial activity. It is a function - ! of the mean lability and of temperature. This also includes - ! shrinking of particles due to the bacterial activity - ! -------------------------------------------------------- - zremipart = MIN( xremipc, ztremint(ji,jj,jk) ) - zremig = zremipart * xstep * tgfunc(ji,jj,jk) - zopoc2 = zremig * tr(ji,jj,jk,jpgoc,Kbb) - orem(ji,jj,jk) = zopoc2 - zorem3(ji,jj,jk) = zremig * solgoc * tr(ji,jj,jk,jpgoc,Kbb) - zopon2 = xremipn / xremipc * zremig * tr(ji,jj,jk,jpgon,Kbb) - zopop2 = xremipp / xremipc * zremig * tr(ji,jj,jk,jpgop,Kbb) - zofer2 = xremipn / xremipc * zremig * tr(ji,jj,jk,jpbfe,Kbb) - - ! update of the TRA arrays - tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zorem3(ji,jj,jk) - tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + solgoc * zopon2 - tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + solgoc * zopop2 - tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + solgoc * zofer2 - tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zopoc2 - tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zopon2 - tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zopop2 - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zofer2 - tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zopoc2 - zorem3(ji,jj,jk) - tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) - zopon2 * (1. + solgoc) - tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) - zopop2 * (1. + solgoc) - tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zofer2 * (1. + solgoc) - END_3D - ENDIF - IF( l_dia_remin_part ) THEN - DO_3D( 0, 0, 0, 0, 1, jpkm1) - zremigoc(ji,jj,jk) = ( tr(ji,jj,jk,jpdoc,Krhs) - zremigoc(ji,jj,jk) ) / & - ( xstep * tgfunc(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) * tmask(ji,jj,jk) ! =zremipart - END_3D - ENDIF + IF ( ln_p5z ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1) + ! POC degradation by bacterial activity. It is a function + ! of the mean lability and of temperature. This also includes + ! shrinking of particles due to the bacterial activity + ! -------------------------------------------------------- + zremipart = MIN( xremipc, ztremint(ji,jj,jk) ) + zremig = zremipart * xstep * tgfunc(ji,jj,jk) + zopon2 = xremipn / xremipc * zremig * tr(ji,jj,jk,jpgon,Kbb) + zopop2 = xremipp / xremipc * zremig * tr(ji,jj,jk,jpgop,Kbb) + + ! update of the TRA arrays + tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + solgoc * zopon2 + tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + solgoc * zopop2 + tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zopon2 + tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zopop2 + tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) - zopon2 * (1. + solgoc) + tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) - zopop2 * (1. + solgoc) + END_3D + ENDIF + IF( l_dia_remin_part ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zremigoc(ji,jj,jk) = ( tr(ji,jj,jk,jpdoc,Krhs) - zremigoc(ji,jj,jk) ) / & + & ( xstep * tgfunc(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) * tmask(ji,jj,jk) ! =zremipart + END_3D + ENDIF - IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) - WRITE(charout, FMT="('poc1')") - CALL prt_ctl_info( charout, cdcomp = 'top' ) - CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) - ENDIF + IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) + WRITE(charout, FMT="('poc1')") + CALL prt_ctl_info( charout, cdcomp = 'top' ) + CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) + ENDIF + ENDIF ! Lability parameterization for the small OM particles. This param ! is based on the same theoretical background as the big particles. ! However, because of its low sinking speed, lability is not supposed @@ -273,6 +261,7 @@ CONTAINS totprod (:,:) = 0. totthick(:,:) = 0. totcons (:,:) = 0. + ztremint(:,:,:) = xremipc ! intregrated production and consumption of POC in the mixed layer ! ---------------------------------------------------------------- @@ -396,63 +385,82 @@ CONTAINS zremipoc(ji,jj,jk) = tr(ji,jj,jk,jpdoc,Krhs) END_3D ENDIF - IF( ln_p4z ) THEN - DO_3D( 0, 0, 0, 0, 1, jpkm1) - IF (tmask(ji,jj,jk) == 1.) THEN - ! POC disaggregation by turbulence and bacterial activity.It is a function - ! of the mean lability and of temperature - ! -------------------------------------------------------- - zremipart = MIN( xremip, ztremint(ji,jj,jk) ) - zremip = zremipart * xstep * tgfunc(ji,jj,jk) - zorem = zremip * tr(ji,jj,jk,jppoc,Kbb) - zofer = zremip * tr(ji,jj,jk,jpsfe,Kbb) + DO_3D( 0, 0, 0, 0, 1, jpkm1) + ! POC disaggregation by turbulence and bacterial activity.It is a function + ! of the mean lability and of temperature + ! -------------------------------------------------------- + zremipart = MIN( xremipc, ztremint(ji,jj,jk) ) + zremip = zremipart * xstep * tgfunc(ji,jj,jk) + zorem = zremip * tr(ji,jj,jk,jppoc,Kbb) - ! Update of the TRA arrays - tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zorem - orem(ji,jj,jk) = orem(ji,jj,jk) + zorem - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zofer - tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zorem - tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zofer - ENDIF - END_3D + ! Update of the TRA arrays + tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zorem + tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zorem + END_3D + IF( ln_p2z ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1) + ! POC disaggregation by turbulence and bacterial activity.It is a function + ! of the mean lability and of temperature + ! -------------------------------------------------------- + zremipart = MIN( xremipc, ztremint(ji,jj,jk) ) + zremip = zremipart * xstep * tgfunc(ji,jj,jk) + zorem = zremip * tr(ji,jj,jk,jppoc,Kbb) + orem(ji,jj,jk) = zorem + ! Update of the TRA arrays + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zorem * feratz + END_3D ELSE - DO_3D( 0, 0, 0, 0, 1, jpkm1) - ! POC disaggregation by turbulence and bacterial activity.It is a function - ! of the mean lability and of temperature - !-------------------------------------------------------- - zremipart = MIN( xremipc, ztremint(ji,jj,jk) ) - zremip = zremipart * xstep * tgfunc(ji,jj,jk) - zopoc = zremip * tr(ji,jj,jk,jppoc,Kbb) - orem(ji,jj,jk) = orem(ji,jj,jk) + zopoc - zopon = xremipn / xremipc * zremip * tr(ji,jj,jk,jppon,Kbb) - zopop = xremipp / xremipc * zremip * tr(ji,jj,jk,jppop,Kbb) - zofer = xremipn / xremipc * zremip * tr(ji,jj,jk,jpsfe,Kbb) - - ! Update of the TRA arrays - tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zopoc - tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zopon - tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) - zopop - tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zofer - tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zopoc - tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zopon - tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zopop - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zofer - END_3D + DO_3D( 0, 0, 0, 0, 1, jpkm1) + ! POC disaggregation by turbulence and bacterial activity.It is a function + ! of the mean lability and of temperature + ! -------------------------------------------------------- + zremipart = MIN( xremipc, ztremint(ji,jj,jk) ) + zremip = zremipart * xstep * tgfunc(ji,jj,jk) + zorem = zremip * tr(ji,jj,jk,jppoc,Kbb) + orem(ji,jj,jk) = orem(ji,jj,jk) + zorem + zofer = zremip * tr(ji,jj,jk,jpsfe,Kbb) + + ! Update of the TRA arrays + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zofer + tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zofer + END_3D + ENDIF + IF ( ln_p5z ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1) + ! POC disaggregation by turbulence and bacterial activity.It is a function + ! of the mean lability and of temperature + !-------------------------------------------------------- + zremipart = MIN( xremipc, ztremint(ji,jj,jk) ) + zremip = zremipart * xstep * tgfunc(ji,jj,jk) + zopon = xremipn / xremipc * zremip * tr(ji,jj,jk,jppon,Kbb) + zopop = xremipp / xremipc * zremip * tr(ji,jj,jk,jppop,Kbb) + + ! Update of the TRA arrays + tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zopon + tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) - zopop + tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zopon + tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zopop + END_3D ENDIF IF( l_dia_remin_part ) THEN DO_3D( 0, 0, 0, 0, 1, jpkm1) zremipoc(ji,jj,jk) = ( tr(ji,jj,jk,jpdoc,Krhs) - zremipoc(ji,jj,jk) ) / & ( xstep * tgfunc(ji,jj,jk) * tr(ji,jj,jk,jppoc,Kbb) + rtrn ) * tmask(ji,jj,jk) + END_3D + DO_3D( 0, 0, 0, 0, 1, jpkm1) zfolimi (ji,jj,jk) = ( tr(ji,jj,jk,jpfer,Krhs) - zfolimi (ji,jj,jk) ) * tmask(ji,jj,jk) END_3D ENDIF IF( lk_iomput .AND. knt == nrdttrc ) THEN IF( l_dia_remin_part ) THEN - CALL iom_put( "REMINP", zremipoc ) ! Remineralisation rate of small particles - CALL iom_put( "REMING", zremigoc ) ! Remineralisation rate of large particles - CALL iom_put( "REMINF", zfolimi * 1.e+9 * 1.e3 * rfact2r ) ! Remineralisation of biogenic particulate iron - DEALLOCATE ( zremipoc, zremigoc, zfolimi ) + CALL iom_put( "REMINP", zremipoc ) ! Remineralisation rate of small particles + IF( .NOT. ln_p2z ) THEN + CALL iom_put( "REMING", zremigoc ) ! Remineralisation rate of large particles + DEALLOCATE ( zremigoc ) + ENDIF + CALL iom_put( "REMINF", zfolimi * 1.e+9 * 1.e3 * rfact2r ) ! Remineralisation of biogenic particulate iron + DEALLOCATE ( zremipoc, zfolimi ) ENDIF ENDIF @@ -483,7 +491,7 @@ CONTAINS INTEGER :: ios, ifault ! Local integer REAL(wp):: remindelta, reminup, remindown !! - NAMELIST/nampispoc/ xremip , jcpoc , rshape, & + NAMELIST/nampispoc/ jcpoc , rshape, & & xremipc, xremipn, xremipp !!---------------------------------------------------------------------- ! @@ -501,10 +509,8 @@ CONTAINS IF(lwp) THEN ! control print WRITE(numout,*) ' Namelist : nampispoc' - IF( ln_p4z ) THEN - WRITE(numout,*) ' remineralisation rate of POC xremip =', xremip - ELSE - WRITE(numout,*) ' remineralisation rate of POC xremipc =', xremipc + WRITE(numout,*) ' remineralisation rate of POC xremipc =', xremipc + IF( ln_p5z ) THEN WRITE(numout,*) ' remineralisation rate of PON xremipn =', xremipn WRITE(numout,*) ' remineralisation rate of POP xremipp =', xremipp ENDIF @@ -528,22 +534,22 @@ CONTAINS ! --------------------------------------------------------------------- ! alphan(1) = gamain(reminup, rshape, ifault) - reminp(1) = gamain(reminup, rshape+1.0, ifault) * xremip / alphan(1) + reminp(1) = gamain(reminup, rshape+1.0, ifault) * xremipc / alphan(1) DO jn = 2, jcpoc-1 reminup = 1./ 400. * EXP( REAL(jn, wp) * remindelta) remindown = 1. / 400. * EXP( REAL(jn-1, wp) * remindelta) alphan(jn) = gamain(reminup, rshape, ifault) - gamain(remindown, rshape, ifault) reminp(jn) = gamain(reminup, rshape+1.0, ifault) - gamain(remindown, rshape+1.0, ifault) - reminp(jn) = reminp(jn) * xremip / alphan(jn) + reminp(jn) = reminp(jn) * xremipc / alphan(jn) END DO remindown = 1. / 400. * EXP( REAL(jcpoc-1, wp) * remindelta) alphan(jcpoc) = 1.0 - gamain(remindown, rshape, ifault) reminp(jcpoc) = 1.0 - gamain(remindown, rshape+1.0, ifault) - reminp(jcpoc) = reminp(jcpoc) * xremip / alphan(jcpoc) + reminp(jcpoc) = reminp(jcpoc) * xremipc / alphan(jcpoc) ELSE ! Only one lability class is used alphan(jcpoc) = 1. - reminp(jcpoc) = xremip + reminp(jcpoc) = xremipc ENDIF DO jn = 1, jcpoc diff --git a/src/TOP/PISCES/P4Z/p4zprod.F90 b/src/TOP/PISCES/P4Z/p4zprod.F90 index 6a89fb6a0cc7f4acee4169a3db544176e4db8168..0844472945dbe2f71d79940d68159cce74670e37 100644 --- a/src/TOP/PISCES/P4Z/p4zprod.F90 +++ b/src/TOP/PISCES/P4Z/p4zprod.F90 @@ -14,6 +14,7 @@ MODULE p4zprod USE oce_trc ! shared variables between ocean and passive tracers USE trc ! passive tracers common variables USE sms_pisces ! PISCES Source Minus Sink variables + USE p2zlim ! Co-limitations of different nutrients USE p4zlim ! Co-limitations of differents nutrients USE prtctl ! print control for debugging USE iom ! I/O manager @@ -27,12 +28,9 @@ MODULE p4zprod REAL(wp), PUBLIC :: pislopen !: P-I slope of nanophytoplankton REAL(wp), PUBLIC :: pisloped !: P-I slope of diatoms - REAL(wp), PUBLIC :: xadap !: Adaptation factor to low light REAL(wp), PUBLIC :: excretn !: Excretion ratio of nanophyto REAL(wp), PUBLIC :: excretd !: Excretion ratio of diatoms REAL(wp), PUBLIC :: bresp !: Basal respiration rate - REAL(wp), PUBLIC :: chlcnm !: Maximum Chl/C ratio of nano - REAL(wp), PUBLIC :: chlcdm !: Maximum Chl/C ratio of diatoms REAL(wp), PUBLIC :: chlcmin !: Minimum Chl/C ratio of phytoplankton REAL(wp), PUBLIC :: fecnm !: Maximum Fe/C ratio of nano REAL(wp), PUBLIC :: fecdm !: Maximum Fe/C ratio of diatoms @@ -71,10 +69,10 @@ CONTAINS INTEGER, INTENT(in) :: Kbb, Kmm, Krhs ! time level indices ! INTEGER :: ji, jj, jk - REAL(wp) :: zsilfac, znanotot, zdiattot, zconctemp, zconctemp2 - REAL(wp) :: zratio, zmax, zsilim, ztn, zadap, zlim, zsiborn + REAL(wp) :: zsilfac, znanotot, zdiattot + REAL(wp) :: zratio, zmax, zsilim, zlim, zsiborn REAL(wp) :: zpptot, zpnewtot, zpregtot, zprochln, zprochld - REAL(wp) :: zproddoc, zprodsil, zprodfer, zprodlig + REAL(wp) :: zproddoc, zprodsil, zprodfer, zprodlig, zprod1 REAL(wp) :: zpislopen, zpisloped, zfact REAL(wp) :: zratiosi, zmaxsi, zlimfac, zsizetmp, zfecnm, zfecdm REAL(wp) :: zprod, zval, zmxl_fac, zmxl_chl, zpronewn, zpronewd @@ -119,8 +117,9 @@ CONTAINS IF ( ln_p4z_dcyc ) THEN ! Diurnal cycle in PISCES DO_3D( 0, 0, 0, 0, 1, jpkm1) IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + zval = 24.0 IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN - zval = MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) + zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) ENDIF zmxl(ji,jj,jk) = zval ENDIF @@ -137,24 +136,16 @@ CONTAINS END_3D ENDIF - DO_3D( 0, 0, 0, 0, 1, jpkm1) - IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN - zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) ) - zprbio(ji,jj,jk) = zprmax(ji,jj,jk) * zmxl_fac - zprdia(ji,jj,jk) = zprmax(ji,jj,jk) * zmxl_fac - ENDIF - END_3D - ! The formulation proposed by Geider et al. (1997) has been modified ! to exclude the effect of nutrient limitation and temperature in the PI ! curve following Vichi et al. (2007) ! ----------------------------------------------------------------------- DO_3D( 0, 0, 0, 0, 1, jpkm1) IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN - ztn = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) - 15. ) - zadap = xadap * ztn / ( 2.+ ztn ) - zconctemp = MAX( 0.e0 , tr(ji,jj,jk,jpdia,Kbb) - xsizedia ) - zconctemp2 = tr(ji,jj,jk,jpdia,Kbb) - zconctemp + zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) ) + zmxl_chl = zmxl(ji,jj,jk) / 24. + zprbio(ji,jj,jk) = zprmax(ji,jj,jk) * zmxl_fac + zprdia(ji,jj,jk) = zprmax(ji,jj,jk) * zmxl_fac ! ! The initial slope of the PI curve can be increased for nano ! to account for photadaptation, for instance in the DCM @@ -162,35 +153,32 @@ CONTAINS ! improved or removed in future versions of the model ! Nanophytoplankton - zpislopeadn(ji,jj,jk) = pislopen * ( 1.+ zadap * EXP( -0.25 * enano(ji,jj,jk) ) ) & - & * tr(ji,jj,jk,jpnch,Kbb) /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn) + zpislopeadn(ji,jj,jk) = pislopen * tr(ji,jj,jk,jpnch,Kbb) & + & /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn) ! Diatoms - zpislopeadd(ji,jj,jk) = (pislopen * zconctemp2 + pisloped * zconctemp) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) & - & * tr(ji,jj,jk,jpdch,Kbb) /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn) - ! - ! Computation of production function for Carbon - ! Actual light levels are used here - ! ---------------------------------------------- - zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) ) - zmxl_chl = zmxl(ji,jj,jk) / 24. - ! - zpislopen = zpislopeadn(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) & - & * zmxl_fac * rday + rtrn) - zpisloped = zpislopeadd(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) & - & * zmxl_fac * rday + rtrn) - zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) ) ) - zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) ) ) - - ! Computation of production function for Chlorophyll - ! Mean light level in the mixed layer (when appropriate) - ! is used here (acclimation is in general slower than - ! the characteristic time scales of vertical mixing) - ! ------------------------------------------------------ - zpislopen = zpislopeadn(ji,jj,jk) / ( zprmax(ji,jj,jk) * zmxl_chl * rday + rtrn ) - zpisloped = zpislopeadd(ji,jj,jk) / ( zprmax(ji,jj,jk) * zmxl_chl * rday + rtrn ) - zprchln(ji,jj,jk) = zprmax(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) ) - zprchld(ji,jj,jk) = zprmax(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) ) + zpislopeadd(ji,jj,jk) = pisloped * tr(ji,jj,jk,jpdch,Kbb) & + & /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn) + ! + ! Computation of production function for Carbon + ! Actual light levels are used here + ! ---------------------------------------------- + zpislopen = zpislopeadn(ji,jj,jk) / ( zprmax(ji,jj,jk) * xlimphy(ji,jj,jk) & + & * zmxl_fac * rday + rtrn) + zpisloped = zpislopeadd(ji,jj,jk) / ( zprmax(ji,jj,jk) * xlimdia(ji,jj,jk) & + & * zmxl_fac * rday + rtrn) + zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) ) ) + zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) ) ) + + ! Computation of production function for Chlorophyll + ! Mean light level in the mixed layer (when appropriate) + ! is used here (acclimation is in general slower than + ! the characteristic time scales of vertical mixing) + ! ------------------------------------------------------ + zpislopen = zpislopen * zmxl_fac / ( zmxl_chl + rtrn ) + zpisloped = zpisloped * zmxl_fac / ( zmxl_chl + rtrn ) + zprchln(ji,jj,jk) = ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) ) + zprchld(ji,jj,jk) = ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) ) ENDIF END_3D @@ -259,7 +247,7 @@ CONTAINS ! size at time step t+1 and is thus updated at the end of the ! current time step ! -------------------------------------------------------------------- - zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmax(ji,jj,jk) + rtrn ) + zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) ) @@ -277,14 +265,13 @@ CONTAINS ! production terms of diatoms (C) zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * tr(ji,jj,jk,jpdia,Kbb) * rfact2 - ! Size computation ! Size is made a function of the limitation of of phytoplankton growth ! Strongly limited cells are supposed to be smaller. sizeda is ! size at time step t+1 and is thus updated at the end of the ! current time step. ! -------------------------------------------------------------------- - zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) / ( zprmax(ji,jj,jk) + rtrn ) + zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) ) @@ -310,21 +297,25 @@ CONTAINS zmxl_chl = zmxl(ji,jj,jk) / 24. ! production terms for nanophyto. ( chlorophyll ) znanotot = enanom(ji,jj,jk) / ( zmxl_chl + rtrn ) - zprod = rday * zprorcan(ji,jj,jk) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk) - zprochln = chlcmin * 12. * zprorcan (ji,jj,jk) - zprochln = zprochln + (chlcnm - chlcmin) * 12. * zprod / & - & ( zpislopeadn(ji,jj,jk) * znanotot +rtrn) + zprod1 = zprorcan(ji,jj,jk) * texcretn / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) + zprod = zprod1 / ratchl * ( pislopen * znanotot / ( zprmax(ji,jj,jk) * rday ) & + & * ( 1.0 - zprchln(ji,jj,jk) ) * MAX(0.0, (1.0 - ratchl * tr(ji,jj,jk,jpnch,Kbb) & + & / ( 12. * tr(ji,jj,jk,jpphy,Kbb) + rtrn ) / (xlimphy(ji,jj,jk) + rtrn ) ) ) & + & - ratchl * zprchln(ji,jj,jk) ) + zprod1 + zprochln = MAX(zprod * tr(ji,jj,jk,jpnch,Kbb) , chlcmin * 12 * zprorcan(ji,jj,jk) ) ! production terms for diatoms ( chlorophyll ) zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl + rtrn ) - zprod = rday * zprorcad(ji,jj,jk) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) - zprochld = chlcmin * 12. * zprorcad(ji,jj,jk) - zprochld = zprochld + (chlcdm - chlcmin) * 12. * zprod / & - & ( zpislopeadd(ji,jj,jk) * zdiattot +rtrn ) + zprod1 = zprorcad(ji,jj,jk) * texcretd / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) + zprod = zprod1 / ratchl * ( pisloped * zdiattot / ( zprmax(ji,jj,jk) * rday ) & + & * ( 1.0 - zprchld(ji,jj,jk) ) * MAX(0.0, (1.0 - ratchl * tr(ji,jj,jk,jpdch,Kbb) & + & / ( 12. * tr(ji,jj,jk,jpdia,Kbb) + rtrn ) / (xlimdia(ji,jj,jk) + rtrn ) ) ) & + & - ratchl * zprchld(ji,jj,jk) ) + zprod1 + zprochld = MAX(zprod * tr(ji,jj,jk,jpdch,Kbb) , chlcmin * 12 * zprorcad(ji,jj,jk) ) ! Update the arrays TRA which contain the Chla sources and sinks - tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln * texcretn - tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) + zprochld * texcretd + tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln + tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) + zprochld ENDIF END_3D @@ -522,8 +513,8 @@ CONTAINS INTEGER :: ios ! Local integer ! ! Namelist block - NAMELIST/namp4zprod/ pislopen, pisloped, xadap, bresp, excretn, excretd, & - & chlcnm, chlcdm, chlcmin, fecnm, fecdm, grosip + NAMELIST/namp4zprod/ pislopen, pisloped, bresp, excretn, excretd, & + & chlcmin, fecnm, fecdm, grosip !!---------------------------------------------------------------------- ! IF(lwp) THEN ! control print @@ -543,14 +534,11 @@ CONTAINS WRITE(numout,*) ' Namelist : namp4zprod' WRITE(numout,*) ' mean Si/C ratio grosip =', grosip WRITE(numout,*) ' P-I slope pislopen =', pislopen - WRITE(numout,*) ' Acclimation factor to low light xadap =', xadap WRITE(numout,*) ' excretion ratio of nanophytoplankton excretn =', excretn WRITE(numout,*) ' excretion ratio of diatoms excretd =', excretd WRITE(numout,*) ' basal respiration in phytoplankton bresp =', bresp WRITE(numout,*) ' Maximum Chl/C in phytoplankton chlcmin =', chlcmin WRITE(numout,*) ' P-I slope for diatoms pisloped =', pisloped - WRITE(numout,*) ' Minimum Chl/C in nanophytoplankton chlcnm =', chlcnm - WRITE(numout,*) ' Minimum Chl/C in diatoms chlcdm =', chlcdm WRITE(numout,*) ' Maximum Fe/C in nanophytoplankton fecnm =', fecnm WRITE(numout,*) ' Minimum Fe/C in diatoms fecdm =', fecdm ENDIF diff --git a/src/TOP/PISCES/P4Z/p4zrem.F90 b/src/TOP/PISCES/P4Z/p4zrem.F90 index e63e5eec167f6d872b86ead61ae7568eaa21e87c..386a85e4293e3826bac82c48f57ba5762a3dbd7d 100644 --- a/src/TOP/PISCES/P4Z/p4zrem.F90 +++ b/src/TOP/PISCES/P4Z/p4zrem.F90 @@ -18,6 +18,7 @@ MODULE p4zrem USE sms_pisces ! PISCES Source Minus Sink variables USE p4zche ! chemical model USE p4zprod ! Growth rate of the 2 phyto groups + USE p2zlim ! Nutrient limitation terms USE p4zlim ! Nutrient limitation terms USE prtctl ! print control for debugging USE iom ! I/O manager @@ -27,6 +28,7 @@ MODULE p4zrem PRIVATE PUBLIC p4z_rem ! called in p4zbio.F90 + PUBLIC p2z_rem PUBLIC p4z_rem_init ! called in trcini_pisces.F90 PUBLIC p4z_rem_alloc ! called in trcini_pisces.F90 @@ -54,6 +56,137 @@ MODULE p4zrem !!---------------------------------------------------------------------- CONTAINS + SUBROUTINE p2z_rem( kt, knt, Kbb, Kmm, Krhs ) + !!--------------------------------------------------------------------- + !! *** ROUTINE p2z_rem *** + !! + !! ** Purpose : Compute remineralization/dissolution of organic compounds + !! Computes also nitrification of ammonium + !! The solubilization/remineralization of POC is treated + !! in p4zpoc.F90. The dissolution of calcite is processed + !! in p4zlys.F90. + !! + !! ** Method : - Bacterial biomass is computed implicitely based on a + !! parameterization developed from an explicit modeling + !! of PISCES in an alternative version + !!--------------------------------------------------------------------- + INTEGER, INTENT(in) :: kt, knt ! ocean time step + INTEGER, INTENT(in) :: Kbb, Kmm, Krhs ! time level indices + ! + INTEGER :: ji, jj, jk + REAL(wp) :: zremik, zremikc, zfact + REAL(wp) :: zdep, zdepmin, zfactdep + REAL(wp) :: zammonic, zoxyremc, zolimic + CHARACTER (len=25) :: charout + REAL(wp), DIMENSION(A2D(0),jpk) :: zdepbac + REAL(wp), DIMENSION(A2D(0) ) :: ztempbac + REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d, zolimi + !!--------------------------------------------------------------------- + ! + IF( ln_timing ) CALL timing_start('p2z_rem') + ! + IF( kt == nittrc000 ) THEN + l_dia_remin = iom_use( "REMIN" ) + l_dia_denit = iom_use( "DENIT" ) + l_dia_bact = iom_use( "BACT" ) + ENDIF + IF( l_dia_remin ) THEN + ALLOCATE( zolimi(A2D(0),jpk) ) ; zolimi(A2D(0),jpk) = 0._wp + DO_3D( 0, 0, 0, 0, 1, jpk) + zolimi(ji,jj,jk) = tr(ji,jj,jk,jpoxy,Krhs) + END_3D + ENDIF + + ! Computation of the mean bacterial concentration + ! this parameterization has been deduced from a model version + ! that was modeling explicitely bacteria. This is a very old parame + ! that will be very soon updated based on results from a much more + ! recent version of PISCES with bacteria. + ! ---------------------------------------------------------------- + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zdep = MAX( hmld(ji,jj), heup_01(ji,jj), gdept(ji,jj,1,Kmm) ) + IF ( gdept(ji,jj,jk,Kmm) <= zdep ) THEN + zdepbac(ji,jj,jk) = 0.6 * ( MAX(0.0, tr(ji,jj,jk,jpzoo,Kbb) ) * 1.0E6 )**0.6 * 1.E-6 + ztempbac(ji,jj) = zdepbac(ji,jj,jk) + ELSE + zdepmin = MIN( 1., zdep / gdept(ji,jj,jk,Kmm) ) + zdepbac(ji,jj,jk) = zdepmin**0.683 * ztempbac(ji,jj) + ENDIF + END_3D + + DO_3D( 0, 0, 0, 0, 1, jpkm1) + ! DOC ammonification. Depends on depth, phytoplankton biomass + ! and a limitation term which is supposed to be a parameterization of the bacterial activity. + ! -------------------------------------------------------------------------- + zremik = xstep / 1.e-6 * xlimbac(ji,jj,jk) * zdepbac(ji,jj,jk) + zremik = MAX( zremik, 2.74e-4 * xstep / xremikc ) + zremikc = xremikc * zremik + ! Ammonification in oxic waters with oxygen consumption + ! ----------------------------------------------------- + zolimic = zremikc * ( 1.- nitrfac(ji,jj,jk) ) * tr(ji,jj,jk,jpdoc,Kbb) + zolimic = MAX(0., MIN( ( tr(ji,jj,jk,jpoxy,Kbb) - rtrn ) / o2ut, zolimic ) ) + + ! Ammonification in suboxic waters with denitrification + ! ----------------------------------------------------- + zammonic = zremikc * nitrfac(ji,jj,jk) * tr(ji,jj,jk,jpdoc,Kbb) + denitr(ji,jj,jk) = zammonic * ( 1. - nitrfac2(ji,jj,jk) ) + denitr(ji,jj,jk) = MAX(0., MIN( ( tr(ji,jj,jk,jpno3,Kbb) - rtrn ) / rdenit, denitr(ji,jj,jk) ) ) + + ! Ammonification in waters depleted in O2 and NO3 based on + ! other redox processes + ! -------------------------------------------------------- + zoxyremc = MAX(0., zammonic - denitr(ji,jj,jk) ) + + ! Update of the the trends arrays + tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - denitr (ji,jj,jk) * rdenit + tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) - ( zolimic + denitr(ji,jj,jk) + zoxyremc ) + tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - zolimic * (o2ut + o2nit) + tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zolimic + denitr(ji,jj,jk) + zoxyremc + tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) + zolimic + denitr(ji,jj,jk) + zoxyremc + tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - rno3 * ( zolimic + zoxyremc - ( rdenit - 1.) * denitr(ji,jj,jk) ) + END_3D + + IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) + WRITE(charout, FMT="('rem1')") + CALL prt_ctl_info( charout, cdcomp = 'top' ) + CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) + ENDIF + + IF( lk_iomput .AND. knt == nrdttrc ) THEN + ! + IF( l_dia_remin ) THEN ! Remineralisation rate + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zolimi(ji,jj,jk) = ( zolimi(ji,jj,jk) - tr(ji,jj,jk,jpoxy,Krhs) ) / o2ut & + & * rfact2r * tmask(ji,jj,jk) ! + END_3D + CALL iom_put( "REMIN", zolimi ) + DEALLOCATE( zolimi ) + ENDIF + ! + IF( l_dia_bact ) THEN ! Bacterial biomass + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = zdepbac(ji,jj,jk) * 1.E6 * tmask(ji,jj,jk) + END_3D + CALL iom_put( "BACT", zw3d ) + DEALLOCATE( zw3d ) + ENDIF + ! + IF( l_dia_denit ) THEN ! Denitrification + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = denitr(ji,jj,jk) * 1E+3 * rfact2r * rno3 * tmask(ji,jj,jk) + END_3D + CALL iom_put( "DENIT", zw3d ) + DEALLOCATE( zw3d ) + ENDIF + ! + ENDIF + ! + IF( ln_timing ) CALL timing_stop('p2z_rem') + ! + END SUBROUTINE p2z_rem + SUBROUTINE p4z_rem( kt, knt, Kbb, Kmm, Krhs ) !!--------------------------------------------------------------------- !! *** ROUTINE p4z_rem *** @@ -113,11 +246,10 @@ CONTAINS ! recent version of PISCES with bacteria. ! ---------------------------------------------------------------- DO_3D( 0, 0, 0, 0, 1, jpkm1) - zdep = MAX( hmld(ji,jj), heup_01(ji,jj) ) - IF ( gdept(ji,jj,jk,Kmm) < zdep ) THEN + zdep = MAX( hmld(ji,jj), heup_01(ji,jj), gdept(ji,jj,1,Kmm) ) + IF ( gdept(ji,jj,jk,Kmm) <= zdep ) THEN zdepbac(ji,jj,jk) = 0.6 * ( MAX(0.0, tr(ji,jj,jk,jpzoo,Kbb) + tr(ji,jj,jk,jpmes,Kbb) ) * 1.0E6 )**0.6 * 1.E-6 ztempbac(ji,jj) = zdepbac(ji,jj,jk) -! IF( gdept(ji,jj,jk,Kmm) >= zdep ) THEN ELSE zdepmin = MIN( 1., zdep / gdept(ji,jj,jk,Kmm) ) zdepbac(ji,jj,jk) = zdepmin**0.683 * ztempbac(ji,jj) @@ -194,17 +326,16 @@ CONTAINS IF( gdept(ji,jj,jk,Kmm) >= zdep ) THEN zdepmin = MIN( 1., zdep / gdept(ji,jj,jk,Kmm) ) zdepeff = 0.3_wp * zdepmin**0.6 -! zdepeff = 0.3_wp * zdepmin**0.3 ELSE - zdepeff = 0.3_wp + zdepeff = 0.3_wp ENDIF ! Bacterial uptake of iron. No iron is available in DOC. So ! Bacteries are obliged to take up iron from the water. Some ! studies (especially at Papa) have shown this uptake to be significant ! ---------------------------------------------------------- - zbactfer = feratb * 0.6_wp * xstep * tgfunc(ji,jj,jk) * xlimbacl(ji,jj,jk) * tr(ji,jj,jk,jpfer,Kbb) & - & / ( xkferb + tr(ji,jj,jk,jpfer,Kbb) ) * zdepeff * zdepbac(ji,jj,jk) + zbactfer = feratb * 0.6_wp * xstep * tgfunc(ji,jj,jk) * xlimbacl(ji,jj,jk) * biron(ji,jj,jk) & + & / ( xkferb + biron(ji,jj,jk) ) * zdepeff * zdepbac(ji,jj,jk) ! Only the transfer of iron from its dissolved form to particles ! is treated here. The GGE of bacteria supposed to be equal to @@ -336,19 +467,20 @@ CONTAINS IF(lwp) THEN ! control print WRITE(numout,*) ' Namelist parameters for remineralization, nampisrem' - IF( ln_p4z ) THEN - WRITE(numout,*) ' remineralization rate of DOC xremikc =', xremikc - ELSE + WRITE(numout,*) ' remineralization rate of DOC xremikc =', xremikc + IF( ln_p5z ) THEN WRITE(numout,*) ' remineralization rate of DOC xremikc =', xremikc WRITE(numout,*) ' remineralization rate of DON xremikn =', xremikn WRITE(numout,*) ' remineralization rate of DOP xremikp =', xremikp ENDIF - WRITE(numout,*) ' remineralization rate of Si xsirem =', xsirem - WRITE(numout,*) ' fast remineralization rate of Si xsiremlab =', xsiremlab - WRITE(numout,*) ' fraction of labile biogenic silica xsilab =', xsilab - WRITE(numout,*) ' NH4 nitrification rate nitrif =', nitrif - WRITE(numout,*) ' Bacterial Fe/C ratio feratb =', feratb - WRITE(numout,*) ' Half-saturation constant for bact. Fe/C xkferb =', xkferb + IF( ln_p5z .OR. ln_p4z ) THEN + WRITE(numout,*) ' remineralization rate of Si xsirem =', xsirem + WRITE(numout,*) ' fast remineralization rate of Si xsiremlab =', xsiremlab + WRITE(numout,*) ' fraction of labile biogenic silica xsilab =', xsilab + WRITE(numout,*) ' NH4 nitrification rate nitrif =', nitrif + WRITE(numout,*) ' Bacterial Fe/C ratio feratb =', feratb + WRITE(numout,*) ' Half-saturation constant for bact. Fe/C xkferb =', xkferb + ENDIF ENDIF ! denitr(:,:,:) = 0._wp diff --git a/src/TOP/PISCES/P4Z/p4zsed.F90 b/src/TOP/PISCES/P4Z/p4zsed.F90 index 45d5dafba939d609e8ea8258c62e5aba83f4368a..9eab5f19b2d90806d508ac37e70db8d27823b932 100644 --- a/src/TOP/PISCES/P4Z/p4zsed.F90 +++ b/src/TOP/PISCES/P4Z/p4zsed.F90 @@ -13,6 +13,7 @@ MODULE p4zsed USE oce_trc ! shared variables between ocean and passive tracers USE trc ! passive tracers common variables USE sms_pisces ! PISCES Source Minus Sink variables + USE p2zlim ! Co-limitations of differents nutrients USE p4zlim ! Co-limitations of differents nutrients USE p4zint ! interpolation and computation of various fields USE p4zsink ! Sinking fluxes @@ -63,17 +64,17 @@ CONTAINS INTEGER, INTENT(in) :: kt, knt ! ocean time step INTEGER, INTENT(in) :: Kbb, Kmm, Krhs ! time level indices INTEGER :: ji, jj, jk, ikt - REAL(wp) :: zbureff, zrivsil + REAL(wp) :: zbureff REAL(wp) :: zlim, zfact, zfactcal REAL(wp) :: zo2, zno3, zflx, zpdenit, z1pdenit, zolimit - REAL(wp) :: zsiloss, zcaloss, zdep + REAL(wp) :: zsiloss, zsiloss2, zcaloss, zdep REAL(wp) :: zwstpoc, zwstpon, zwstpop REAL(wp) :: ztrfer, ztrpo4s, ztrdp, zwdust, zmudia, ztemp - REAL(wp) :: zsoufer, zlight, ztrpo4, ztrdop + REAL(wp) :: zsoufer, zlight, ztrpo4, ztrdop, zratpo4 REAL(wp) :: xdiano3, xdianh4 ! CHARACTER (len=25) :: charout - REAL(wp), DIMENSION(A2D(0)) :: zdenit2d, zrivno3, zrivalk + REAL(wp), DIMENSION(A2D(0)) :: zdenit2d, zrivno3, zrivalk, zrivsil REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d !!--------------------------------------------------------------------- ! @@ -84,7 +85,6 @@ CONTAINS l_dia_sdenit = iom_use( "Sdenit" ) l_dia_sed = .NOT.lk_sed .AND. ( iom_use( "SedC" ) .OR. iom_use( "SedCal" ) .OR. iom_use( "SedSi" ) ) ENDIF - ! zdenit2d(:,:) = 0.e0 zrivno3 (:,:) = 0.e0 @@ -107,7 +107,7 @@ CONTAINS zdenit2d(ji,jj) = 10.0**( zdenit2d(ji,jj) ) ! zflx = sinkpocb(ji,jj) / xstep * 1E6 - zbureff = 0.013 + 0.53 * zflx**2 / ( 7.0 + zflx )**2 + zbureff = 0.013 + 0.53 * zflx**2 / ( 7.0 + zflx )**2 * MIN(gdepw(ji,jj,ikt+1,Kmm) / 1000.00, 1.0) zrivno3(ji,jj) = 1. - zbureff ENDIF END_2D @@ -119,13 +119,10 @@ CONTAINS ! ------------------------------------------------------ ! IF( .NOT.lk_sed ) THEN - zrivsil = 1._wp - sedsilfrac DO_2D( 0, 0, 0, 0 ) ikt = mbkt(ji,jj) zdep = 1._wp / e3t(ji,jj,ikt,Kmm) - zsiloss = sinksilb(ji,jj) * zdep zcaloss = sinkcalb(ji,jj) * zdep - tr(ji,jj,ikt,jpsil,Krhs) = tr(ji,jj,ikt,jpsil,Krhs) + zsiloss * zrivsil ! zfactcal = MAX(-0.1, MIN( excess(ji,jj,ikt), 0.2 ) ) zfactcal = 0.3 + 0.7 * MIN( 1., (0.1 + zfactcal) / ( 0.5 - zfactcal ) ) @@ -133,27 +130,54 @@ CONTAINS tr(ji,jj,ikt,jptal,Krhs) = tr(ji,jj,ikt,jptal,Krhs) + zcaloss * zrivalk(ji,jj) * 2.0 tr(ji,jj,ikt,jpdic,Krhs) = tr(ji,jj,ikt,jpdic,Krhs) + zcaloss * zrivalk(ji,jj) END_2D + + IF( .NOT. ln_p2z ) THEN + DO_2D( 0, 0, 0, 0 ) + ikt = mbkt(ji,jj) + zdep = 1._wp / e3t(ji,jj,ikt,Kmm) + zsiloss = sinksilb(ji,jj) * zdep + zsiloss2 = sinksilb(ji,jj) / xstep * 365.0 * 1E3 * 1E-4 * 1E6 + zrivsil(ji,jj) = 1.0 - sedsilfrac * zsiloss2 / ( 15.0 + zsiloss2 ) + tr(ji,jj,ikt,jpsil,Krhs) = tr(ji,jj,ikt,jpsil,Krhs) + zsiloss * zrivsil(ji,jj) + END_2D + ENDIF ENDIF ! ! The 0.5 factor in zpdenit is to avoid negative NO3 concentration after ! denitrification in the sediments. Not very clever, but simpliest option. IF( .NOT.lk_sed ) THEN - DO_2D( 0, 0, 0, 0 ) - ikt = mbkt(ji,jj) - zwstpoc = sinkpocb(ji,jj) / e3t(ji,jj,ikt,Kmm) - zpdenit = MIN( 0.5 * ( tr(ji,jj,ikt,jpno3,Kbb) - rtrn ) / rdenit, zdenit2d(ji,jj) * zwstpoc * zrivno3(ji,jj) ) - z1pdenit = zwstpoc * zrivno3(ji,jj) - zpdenit - zolimit = MIN( ( tr(ji,jj,ikt,jpoxy,Kbb) - rtrn ) / o2ut, z1pdenit * ( 1.- nitrfac(ji,jj,ikt) ) ) - tr(ji,jj,ikt,jpdoc,Krhs) = tr(ji,jj,ikt,jpdoc,Krhs) + z1pdenit - zolimit - tr(ji,jj,ikt,jppo4,Krhs) = tr(ji,jj,ikt,jppo4,Krhs) + zpdenit + zolimit - tr(ji,jj,ikt,jpnh4,Krhs) = tr(ji,jj,ikt,jpnh4,Krhs) + zpdenit + zolimit - tr(ji,jj,ikt,jpno3,Krhs) = tr(ji,jj,ikt,jpno3,Krhs) - rdenit * zpdenit - tr(ji,jj,ikt,jpoxy,Krhs) = tr(ji,jj,ikt,jpoxy,Krhs) - zolimit * o2ut - tr(ji,jj,ikt,jptal,Krhs) = tr(ji,jj,ikt,jptal,Krhs) + rno3 * (zolimit + (1.+rdenit) * zpdenit ) - tr(ji,jj,ikt,jpdic,Krhs) = tr(ji,jj,ikt,jpdic,Krhs) + zpdenit + zolimit - sdenit(ji,jj) = rdenit * zpdenit * e3t(ji,jj,ikt,Kmm) - END_2D + IF( ln_p2z ) THEN + DO_2D( 0, 0, 0, 0 ) + ikt = mbkt(ji,jj) + zwstpoc = sinkpocb(ji,jj) / e3t(ji,jj,ikt,Kmm) + zpdenit = MIN( 0.5 * ( tr(ji,jj,ikt,jpno3,Kbb) - rtrn ) / rdenit, zdenit2d(ji,jj) * zwstpoc * zrivno3(ji,jj) ) + z1pdenit = zwstpoc * zrivno3(ji,jj) - zpdenit + zolimit = MIN( ( tr(ji,jj,ikt,jpoxy,Kbb) - rtrn ) / (o2ut + o2nit), z1pdenit * ( 1.- nitrfac(ji,jj,ikt) ) ) + tr(ji,jj,ikt,jpdoc,Krhs) = tr(ji,jj,ikt,jpdoc,Krhs) + z1pdenit - zolimit + tr(ji,jj,ikt,jpno3,Krhs) = tr(ji,jj,ikt,jpno3,Krhs) + zpdenit + zolimit - rdenit * zpdenit + tr(ji,jj,ikt,jpoxy,Krhs) = tr(ji,jj,ikt,jpoxy,Krhs) - zolimit * (o2ut + o2nit) + tr(ji,jj,ikt,jptal,Krhs) = tr(ji,jj,ikt,jptal,Krhs) - rno3 * (zolimit + (1.-rdenit) * zpdenit ) + tr(ji,jj,ikt,jpdic,Krhs) = tr(ji,jj,ikt,jpdic,Krhs) + zpdenit + zolimit + sdenit(ji,jj) = rdenit * zpdenit * e3t(ji,jj,ikt,Kmm) + END_2D + ELSE + DO_2D( 0, 0, 0, 0 ) + ikt = mbkt(ji,jj) + zwstpoc = sinkpocb(ji,jj) / e3t(ji,jj,ikt,Kmm) + zpdenit = MIN( 0.5 * ( tr(ji,jj,ikt,jpno3,Kbb) - rtrn ) / rdenit, zdenit2d(ji,jj) * zwstpoc * zrivno3(ji,jj) ) + z1pdenit = zwstpoc * zrivno3(ji,jj) - zpdenit + zolimit = MIN( ( tr(ji,jj,ikt,jpoxy,Kbb) - rtrn ) / o2ut, z1pdenit * ( 1.- nitrfac(ji,jj,ikt) ) ) + tr(ji,jj,ikt,jpdoc,Krhs) = tr(ji,jj,ikt,jpdoc,Krhs) + z1pdenit - zolimit + tr(ji,jj,ikt,jppo4,Krhs) = tr(ji,jj,ikt,jppo4,Krhs) + zpdenit + zolimit + tr(ji,jj,ikt,jpnh4,Krhs) = tr(ji,jj,ikt,jpnh4,Krhs) + zpdenit + zolimit + tr(ji,jj,ikt,jpno3,Krhs) = tr(ji,jj,ikt,jpno3,Krhs) - rdenit * zpdenit + tr(ji,jj,ikt,jpoxy,Krhs) = tr(ji,jj,ikt,jpoxy,Krhs) - zolimit * o2ut + tr(ji,jj,ikt,jptal,Krhs) = tr(ji,jj,ikt,jptal,Krhs) + rno3 * (zolimit + (1.+rdenit) * zpdenit ) + tr(ji,jj,ikt,jpdic,Krhs) = tr(ji,jj,ikt,jpdic,Krhs) + zpdenit + zolimit + sdenit(ji,jj) = rdenit * zpdenit * e3t(ji,jj,ikt,Kmm) + END_2D + ENDIF IF( ln_p5z ) THEN DO_2D( 0, 0, 0, 0 ) ikt = mbkt(ji,jj) @@ -175,84 +199,86 @@ CONTAINS ! Small source iron from particulate inorganic iron !----------------------------------- ! - IF( ln_p4z ) THEN + IF( ln_p2z ) THEN DO_3D( 0, 0, 0, 0, 1, jpkm1) ! ! Potential nitrogen fixation dependant on temperature and iron - zlight = ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) ) + zlight = ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) ) zsoufer = zlight * 2E-11 / ( 2E-11 + biron(ji,jj,jk) ) ! ztemp = ts(ji,jj,jk,jp_tem,Kmm) zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) / rno3 ! Potential nitrogen fixation dependant on temperature and iron - xdianh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concnnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) - xdiano3 = tr(ji,jj,jk,jpno3,Kbb) / ( concnno3 + tr(ji,jj,jk,jpno3,Kbb) ) * (1. - xdianh4) - zlim = ( 1.- xdiano3 - xdianh4 ) + xdiano3 = tr(ji,jj,jk,jpno3,Kbb) / ( concnno3 + tr(ji,jj,jk,jpno3,Kbb) ) + zlim = 1.- xdiano3 IF( zlim <= 0.1 ) zlim = 0.01 - zfact = zlim * rfact2 - ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) ) - ztrpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) ) - nitrpot(ji,jj,jk) = zmudia * r1_rday * zfact * MIN( ztrfer, ztrpo4 ) * zlight + zfact = zlim * rfact2 + ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) ) + nitrpot(ji,jj,jk) = zmudia * r1_rday * zfact * ztrfer * zlight ! ! Nitrogen change due to nitrogen fixation ! ---------------------------------------- zfact = nitrpot(ji,jj,jk) * nitrfix - tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zfact / 3.0 - tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zfact / 3.0 - tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zfact * 2.0 / 3.0 - tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zfact * 2.0 / 3.0 + tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) + zfact / 3.0 + tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - rno3 * zfact / 3.0 + tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zfact * 2.0 / 3.0 tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zfact * 1.0 / 3.0 - tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zfact * 1.0 / 3.0 * 2.0 / 3.0 - tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zfact * 1.0 / 3.0 * 1.0 / 3.0 - tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + ( o2ut + o2nit ) * zfact * 2.0 / 3.0 + o2nit * zfact / 3.0 - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - 30E-6 * zfact * 1.0 / 3.0 - tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 2.0 / 3.0 - tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 1.0 / 3.0 - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer * rfact2 / rday - tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + concdnh4 / ( concdnh4 + tr(ji,jj,jk,jppo4,Kbb) ) & - & * 0.001 * tr(ji,jj,jk,jpdoc,Kbb) * xstep + tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zfact * 1.0 / 3.0 + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zfact * 1.0 / 3.0 * feratz + tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + ( o2ut + o2nit ) * zfact + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.005 * 4E-10 * zsoufer * rfact2 / rday END_3D - ELSE ! p5z + ELSE DO_3D( 0, 0, 0, 0, 1, jpkm1) + ! ! Potential nitrogen fixation dependant on temperature and iron zlight = ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) ) zsoufer = zlight * 2E-11 / ( 2E-11 + biron(ji,jj,jk) ) ! - ! ! Potential nitrogen fixation dependant on temperature and iron ztemp = ts(ji,jj,jk,jp_tem,Kmm) - zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) * 7.625 + zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) / rno3 ! Potential nitrogen fixation dependant on temperature and iron xdianh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concnnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) xdiano3 = tr(ji,jj,jk,jpno3,Kbb) / ( concnno3 + tr(ji,jj,jk,jpno3,Kbb) ) * (1. - xdianh4) - zlim = ( 1.- xdiano3 - xdianh4 ) + zlim = ( 1.- xdiano3 - xdianh4 ) IF( zlim <= 0.1 ) zlim = 0.01 - zfact = zlim * rfact2 - ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) ) - ztrpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) ) - ztrdop = tr(ji,jj,jk,jpdop,Kbb) / ( 1E-6 + tr(ji,jj,jk,jpdop,Kbb) ) * (1. - ztrpo4) - nitrpot(ji,jj,jk) = zmudia * r1_rday * zfact * MIN( ztrfer, ztrpo4 + ztrdop ) * zlight - + zfact = zlim * rfact2 + ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) ) + ztrpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) ) + IF (ln_p5z) THEN + ztrdop = tr(ji,jj,jk,jpdop,Kbb) / ( 10E-6 + tr(ji,jj,jk,jpdop,Kbb) ) * (1. - ztrpo4) + ztrpo4 = ztrpo4 + ztrdop + rtrn + zratpo4 = (ztrpo4 - ztrdop) / (ztrpo4 + rtrn) + ENDIF + nitrpot(ji,jj,jk) = zmudia * r1_rday * zfact * MIN( ztrfer, ztrpo4 ) * zlight + ! ! Nitrogen change due to nitrogen fixation ! ---------------------------------------- zfact = nitrpot(ji,jj,jk) * nitrfix tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zfact / 3.0 tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zfact / 3.0 tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zfact * 2.0 / 3.0 - tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - 16.0 / 46.0 * zfact * ( 1.0 - 1.0 / 3.0 ) & - & * ztrpo4 / (ztrpo4 + ztrdop + rtrn) - tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zfact * 1.0 / 3.0 tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zfact * 1.0 / 3.0 - tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + 16.0 / 46.0 * zfact / 3.0 & - & - 16.0 / 46.0 * zfact * ztrdop / ( ztrpo4 + ztrdop + rtrn) tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zfact * 1.0 / 3.0 * 2.0 / 3.0 - tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + zfact * 1.0 / 3.0 * 2.0 /3.0 - tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + 16.0 / 46.0 * zfact * 1.0 / 3.0 * 2.0 /3.0 tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zfact * 1.0 / 3.0 * 1.0 / 3.0 - tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) + zfact * 1.0 / 3.0 * 1.0 /3.0 - tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + 16.0 / 46.0 * zfact * 1.0 / 3.0 * 1.0 /3.0 tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + ( o2ut + o2nit ) * zfact * 2.0 / 3.0 + o2nit * zfact / 3.0 - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - 30E-6 * zfact * 1.0 / 3.0 + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - 30E-6 * zfact * 1.0 / 3.0 tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 2.0 / 3.0 tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 1.0 / 3.0 - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer * rfact2 / rday + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.003 * 4E-10 * zsoufer * rfact2 / rday + IF ( ln_p4z) THEN + tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zfact * 2.0 / 3.0 + tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + concdnh4 / ( concdnh4 + tr(ji,jj,jk,jppo4,Kbb) ) & + & * 0.001 * tr(ji,jj,jk,jpdoc,Kbb) * xstep + ELSE + tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - 16.0 / 46.0 * zfact * 2.0 / 3.0 & + & * zratpo4 + tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zfact * 1.0 / 3.0 + tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + 16.0 / 46.0 * zfact / 3.0 & + & - 16.0 / 46.0 * zfact * 2.0 / 3.0 * (1.0 - zratpo4) + tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + zfact * 1.0 / 3.0 * 2.0 /3.0 + tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + 16.0 / 46.0 * zfact * 1.0 / 3.0 * 2.0 /3.0 + tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) + zfact * 1.0 / 3.0 * 1.0 /3.0 + tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + 16.0 / 46.0 * zfact * 1.0 / 3.0 * 1.0 /3.0 + ENDIF END_3D ENDIF @@ -269,8 +295,10 @@ CONTAINS IF( l_dia_sed ) THEN zfact = 1.e+3 * rfact2r ! conversion from molC/l/kt to molC/m3/s CALL iom_put( "SedCal", ( 1.0 - zrivalk(:,:) ) * sinkcalb(:,:) * zfact ) - CALL iom_put( "SedSi" , ( 1.0 - zrivsil ) * sinksilb(:,:) * zfact ) CALL iom_put( "SedC" , ( 1.0 - zrivno3(:,:) ) * sinkpocb(:,:) * zfact ) + IF( .NOT. ln_p2z ) THEN + CALL iom_put( "SedSi" , ( 1.0 - zrivsil(:,:) ) * sinksilb(:,:) * zfact ) + ENDIF ENDIF ! IF( l_dia_sdenit ) THEN @@ -321,7 +349,9 @@ CONTAINS WRITE(numout,*) ' Namelist : nampissed ' WRITE(numout,*) ' nitrogen fixation rate nitrfix = ', nitrfix WRITE(numout,*) ' nitrogen fixation sensitivty to light diazolight = ', diazolight - WRITE(numout,*) ' Fe half-saturation cste for diazotrophs concfediaz = ', concfediaz + IF( .NOT. ln_p2z ) THEN + WRITE(numout,*) ' Fe half-saturation cste for diazotrophs concfediaz = ', concfediaz + ENDIF ENDIF ! r1_rday = 1. / rday @@ -331,8 +361,6 @@ CONTAINS ! lk_sed = ln_sediment .AND. ln_sed_2way ! -! nitrpot(:,:,jpk) = 0._wp ! define last level for iom_put - ! END SUBROUTINE p4z_sed_init INTEGER FUNCTION p4z_sed_alloc() diff --git a/src/TOP/PISCES/P4Z/p4zsink.F90 b/src/TOP/PISCES/P4Z/p4zsink.F90 index e794e8a7d9dea887fd70324a228d821a42e44085..e0151b52f7c0771bf8402bfc7e3a1feee7e1a61b 100644 --- a/src/TOP/PISCES/P4Z/p4zsink.F90 +++ b/src/TOP/PISCES/P4Z/p4zsink.F90 @@ -36,8 +36,8 @@ MODULE p4zsink REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sinksilb !: BSi sinking fluxes at bottom REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sinkponb !: POC sinking fluxes at bottom REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sinkpopb !: POC sinking fluxes at bottom + INTEGER, PUBLIC, SAVE :: ik100 - INTEGER :: ik100 REAL(wp) :: xfact LOGICAL :: l_dia_sink, l_diag @@ -88,8 +88,6 @@ CONTAINS ! --------------------------------------- prodpoc(:,:,:) = 0. conspoc(:,:,:) = 0. - prodgoc(:,:,:) = 0. - consgoc(:,:,:) = 0. ! Sinking speeds of big detritus is increased with depth as shown ! by data and from the coagulation theory. This is controled by @@ -105,62 +103,86 @@ CONTAINS END_3D ! Sinking speed of the small particles is always constant - wsbio3(:,:,:) = wsbio + ! except in PISCES reduced + IF( ln_p2z ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zmax = MAX( heup_01(ji,jj), hmld(ji,jj) ) + zfact = MAX( 0., gdepw(ji,jj,jk+1,Kmm) - zmax ) * tgfunc(ji,jj,jk) * ( 0.03 / wsbio2 - 0.015/ wsbio) + zfact = MIN(3.0, EXP(-zfact) ) + wsbio3(ji,jj,jk) = ( wsbio + wsbio2 * ( sizen(ji,jj,1) - 1.0 ) * 0.05 * zfact ) & + & / ( 1.0 + ( sizen(ji,jj,1) - 1.0 ) * 0.05 * zfact ) + END_3D + ELSE + wsbio3(:,:,:) = wsbio + ENDIF ! Compute the sedimentation term using trc_sink for all the sinking particles ! --------------------------------------------------------------------------- - zsinking(:,:,:) = 0.e0 - ! CALL trc_sink( kt, Kbb, Kmm, wsbio3, zsinking , jppoc, rfact2 ) DO_2D( 0, 0, 0, 0 ) sinkpocb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1) END_2D IF( l_diag ) THEN - ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),:) = 0._wp + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),:) = 0._wp zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) ENDIF - ! - CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpgoc, rfact2 ) - DO_2D( 0, 0, 0, 0 ) - sinkpocb(ji,jj) = sinkpocb(ji,jj) + zsinking(ji,jj,mbkt(ji,jj)+1) - END_2D + + + IF( .NOT. ln_p2z ) THEN + prodgoc(:,:,:) = 0. + consgoc(:,:,:) = 0. + + ! Compute the sedimentation term using trc_sink for all the sinking particles + ! --------------------------------------------------------------------------- + CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpgoc, rfact2 ) + DO_2D( 0, 0, 0, 0 ) + sinkpocb(ji,jj) = sinkpocb(ji,jj) + zsinking(ji,jj,mbkt(ji,jj)+1) + END_2D + IF( l_diag ) THEN + zw3d(A2D(0),1:jpkm1) = zw3d(A2D(0),1:jpkm1) + zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) + ENDIF + ENDIF + IF( l_diag ) THEN - zw3d(A2D(0),1:jpkm1) = zw3d(A2D(0),1:jpkm1) + zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) t_oce_co2_exp = glob_sum( 'p4zsink', zw3d(A2D(0),ik100) * e1e2t(A2D(0)) * tmask(A2D(0),1) ) CALL iom_put( "EPC100", zw3d(:,:,ik100) ) ! Export of carbon at 100m CALL iom_put( "EXPC" , zw3d ) ! Export of carbon in the water column CALL iom_put( "tcexp", t_oce_co2_exp ) ! Total cabon exort ENDIF ! - CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpgsi, rfact2 ) - DO_2D( 0, 0, 0, 0 ) - sinksilb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1) - END_2D - IF( l_diag ) THEN - zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) - CALL iom_put( "EPSI100", zw3d(:,:,ik100) ) ! Export of Silicate at 100m - CALL iom_put( "EXPSI" , zw3d ) ! Export of Silicate in the water column - ENDIF - ! - CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpcal, rfact2 ) - DO_2D( 0, 0, 0, 0 ) - sinkcalb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1) - END_2D - IF( l_diag ) THEN - zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) - CALL iom_put( "EPCAL100", zw3d(:,:,ik100) ) ! Export of calcite at 100m - CALL iom_put( "EXPCAL" , zw3d ) ! Export of calcite in the water column - ENDIF - ! - CALL trc_sink( kt, Kbb, Kmm, wsbio3, zsinking, jpsfe, rfact2 ) - IF( l_diag ) THEN - zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) - ENDIF - CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpbfe, rfact2 ) - IF( l_diag ) THEN - zw3d(A2D(0),1:jpkm1) = zw3d(A2D(0),1:jpkm1) + zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) - CALL iom_put( "EPFE100", zw3d(:,:,ik100) ) ! Export of iron at 100m - CALL iom_put( "EXPFE" , zw3d ) ! Export of iron in the water column + IF( .NOT. ln_p2z ) THEN + + zsinking(:,:,:) = 0.e0 + CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpcal, rfact2 ) + DO_2D( 0, 0, 0, 0 ) + sinkcalb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1) + END_2D + IF( l_diag ) THEN + zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) + CALL iom_put( "EPCAL100", zw3d(:,:,ik100) ) ! Export of calcite at 100m + CALL iom_put( "EXPCAL" , zw3d ) ! Export of calcite in the water column + ENDIF + + CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpgsi, rfact2 ) + DO_2D( 0, 0, 0, 0 ) + sinksilb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1) + END_2D + IF( l_diag ) THEN + zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) + CALL iom_put( "EPSI100", zw3d(:,:,ik100) ) ! Export of Silicate at 100m + CALL iom_put( "EXPSI" , zw3d ) ! Export of Silicate in the water column + ENDIF + ! + CALL trc_sink( kt, Kbb, Kmm, wsbio3, zsinking, jpsfe, rfact2 ) + IF( l_diag ) THEN + zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) + ENDIF + CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpbfe, rfact2 ) + IF( l_diag ) THEN + zw3d(A2D(0),1:jpkm1) = zw3d(A2D(0),1:jpkm1) + zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1) + CALL iom_put( "EPFE100", zw3d(:,:,ik100) ) ! Export of iron at 100m + CALL iom_put( "EXPFE" , zw3d ) ! Export of iron in the water column + ENDIF ENDIF ! ! PISCES-QUOTA part @@ -227,15 +249,18 @@ CONTAINS !!---------------------------------------------------------------------- !! *** ROUTINE p4z_sink_alloc *** !!---------------------------------------------------------------------- - INTEGER :: ierr(2) + INTEGER :: ierr(3) !!---------------------------------------------------------------------- ! ierr(:) = 0 ! - ALLOCATE( sinkpocb(A2D(0)), sinkcalb(A2D(0)), sinksilb(A2D(0)), STAT=ierr(1) ) + ALLOCATE( sinkpocb(A2D(0)), sinkcalb(A2D(0)), STAT=ierr(1) ) ! - IF( ln_p5z ) ALLOCATE( sinkponb(A2D(0)), sinkpopb(A2D(0)), STAT=ierr(2) ) - + IF( .NOT. ln_p2z ) THEN + ALLOCATE( sinksilb(A2D(0)), STAT=ierr(2) ) + ! + IF( ln_p5z ) ALLOCATE( sinkponb(A2D(0)), sinkpopb(A2D(0)), STAT=ierr(3) ) + ENDIF ! p4z_sink_alloc = MAXVAL( ierr ) IF( p4z_sink_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_sink_alloc : failed to allocate arrays.' ) diff --git a/src/TOP/PISCES/P4Z/p4zsms.F90 b/src/TOP/PISCES/P4Z/p4zsms.F90 index 000eacc408197a5d3c3a17907d66e29a16a14380..18527c6b365f21e419112c274af7ac9bca4bbfd3 100644 --- a/src/TOP/PISCES/P4Z/p4zsms.F90 +++ b/src/TOP/PISCES/P4Z/p4zsms.F90 @@ -119,7 +119,11 @@ CONTAINS DO jnt = 1, nrdttrc ! Potential time splitting if requested ! CALL p4z_bio( kt, jnt, Kbb, Kmm, Krhs ) ! Biology - CALL p4z_lys( kt, jnt, Kbb, Krhs ) ! Compute CaCO3 saturation + IF( ln_p2z ) THEN + CALL p2z_lys( kt, jnt, Kbb, Kmm, Krhs ) ! Compute CaCO3 saturation + ELSE + CALL p4z_lys( kt, jnt, Kbb, Krhs ) ! Compute CaCO3 saturation + ENDIF CALL p4z_sed( kt, jnt, Kbb, Kmm, Krhs ) ! Surface and Bottom boundary conditions CALL p4z_flx( kt, jnt, Kbb, Kmm, Krhs ) ! Compute surface fluxes ! @@ -149,59 +153,75 @@ CONTAINS IF( iom_use( 'INTdtAlk' ) .OR. iom_use( 'INTdtDIC' ) .OR. iom_use( 'INTdtFer' ) .OR. & & iom_use( 'INTdtDIN' ) .OR. iom_use( 'INTdtDIP' ) .OR. iom_use( 'INTdtSil' ) ) THEN ! - ALLOCATE( zw3d(A2D(0),jpk), zw2d(A2D(0)) ) - DO_3D( 0, 0, 0, 0, 1, jpkm1) - zw3d(ji,jj,jk) = xnegtr(ji,jj,jk) * xfact * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) - END_3D - ! - zw2d(:,:) = 0. - DO jk = 1, jpkm1 - DO_2D( 0, 0, 0, 0 ) - zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * tr(ji,jj,jk,jptal,Krhs) - END_2D - ENDDO - CALL iom_put( 'INTdtAlk', zw2d ) - ! - zw2d(:,:) = 0. - DO jk = 1, jpkm1 - DO_2D( 0, 0, 0, 0 ) - zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * tr(ji,jj,jk,jpdic,Krhs) - END_2D - ENDDO - CALL iom_put( 'INTdtDIC', zw2d ) - ! - zw2d(:,:) = 0. - DO jk = 1, jpkm1 - DO_2D( 0, 0, 0, 0 ) - zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * rno3 * ( tr(ji,jj,jk,jpno3,Krhs) + tr(ji,jj,jk,jpnh4,Krhs) ) - END_2D - ENDDO - CALL iom_put( 'INTdtDIN', zw2d ) + ALLOCATE( zw3d(A2D(0),jpk), zw2d(A2D(0)) ) + ENDIF + IF ( iom_use( 'INTdtAlk' ) ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1) + zw3d(ji,jj,jk) = xnegtr(ji,jj,jk) * xfact * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) + END_3D + ! + zw2d(:,:) = 0. + DO jk = 1, jpkm1 + DO_2D( 0, 0, 0, 0 ) + zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * tr(ji,jj,jk,jptal,Krhs) + END_2D + ENDDO + CALL iom_put( 'INTdtAlk', zw2d ) + ENDIF ! - zw2d(:,:) = 0. - DO jk = 1, jpkm1 - DO_2D( 0, 0, 0, 0 ) - zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * po4r * tr(ji,jj,jk,jppo4,Krhs) - END_2D - ENDDO - CALL iom_put( 'INTdtDIP', zw2d ) + IF ( iom_use( 'INTdtDIC' ) ) THEN + zw2d(:,:) = 0. + DO jk = 1, jpkm1 + DO_2D( 0, 0, 0, 0 ) + zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * tr(ji,jj,jk,jpdic,Krhs) + END_2D + ENDDO + CALL iom_put( 'INTdtDIC', zw2d ) + ENDIF ! - zw2d(:,:) = 0. - DO jk = 1, jpkm1 - DO_2D( 0, 0, 0, 0 ) - zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * tr(ji,jj,jk,jpfer,Krhs) - END_2D - ENDDO - CALL iom_put( 'INTdtFer', zw2d ) + IF ( iom_use( 'INTdtDIN' ) ) THEN + zw2d(:,:) = 0. + DO jk = 1, jpkm1 + DO_2D( 0, 0, 0, 0 ) + zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * rno3 * ( tr(ji,jj,jk,jpno3,Krhs) + tr(ji,jj,jk,jpnh4,Krhs) ) + END_2D + ENDDO + CALL iom_put( 'INTdtDIN', zw2d ) + ENDIF ! - zw2d(:,:) = 0. - DO jk = 1, jpkm1 - DO_2D( 0, 0, 0, 0 ) - zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * tr(ji,jj,jk,jpsil,Krhs) - END_2D - ENDDO - CALL iom_put( 'INTdtSil', zw2d ) + IF ( iom_use( 'INTdtDIP' ) .AND. .NOT.ln_p2z ) THEN + zw2d(:,:) = 0. + DO jk = 1, jpkm1 + DO_2D( 0, 0, 0, 0 ) + zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * po4r * tr(ji,jj,jk,jppo4,Krhs) + END_2D + ENDDO + CALL iom_put( 'INTdtDIP', zw2d ) + ENDIF + ! + IF ( iom_use( 'INTdtFer' ) ) THEN + zw2d(:,:) = 0. + DO jk = 1, jpkm1 + DO_2D( 0, 0, 0, 0 ) + zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * tr(ji,jj,jk,jpfer,Krhs) + END_2D + ENDDO + CALL iom_put( 'INTdtFer', zw2d ) + ENDIF ! + IF ( iom_use( 'INTdtSil' ) .AND. .NOT.ln_p2z ) THEN + zw2d(:,:) = 0. + DO jk = 1, jpkm1 + DO_2D( 0, 0, 0, 0 ) + zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * tr(ji,jj,jk,jpsil,Krhs) + END_2D + ENDDO + CALL iom_put( 'INTdtSil', zw2d ) + ! + ENDIF + + IF( iom_use( 'INTdtAlk' ) .OR. iom_use( 'INTdtDIC' ) .OR. iom_use( 'INTdtFer' ) .OR. & + & iom_use( 'INTdtDIN' ) .OR. iom_use( 'INTdtDIP' ) .OR. iom_use( 'INTdtSil' ) ) THEN DEALLOCATE( zw3d, zw2d ) ENDIF ! @@ -224,7 +244,6 @@ CONTAINS DO jn = jp_pcs0, jp_pcs1 tr(:,:,:,jn,Krhs) = ( tr(:,:,:,jn,Kbb) - ztrbbio(:,:,:,jn) ) * rfactr tr(:,:,:,jn,Kbb ) = ztrbbio(:,:,:,jn) - ztrbbio(:,:,:,jn) = 0._wp END DO ! ! @@ -286,16 +305,16 @@ CONTAINS WRITE(numout,*) ' P/C in zooplankton po4rat3 =', po4rat3 ENDIF WRITE(numout,*) ' Fe/C in microzooplankton feratz =', feratz - WRITE(numout,*) ' Fe/C in microzooplankton feratz =', feratm + IF( .NOT. ln_p2z ) THEN + WRITE(numout,*) ' Fe/C in mesozooplankton feratm =', feratm + ENDIF WRITE(numout,*) ' Big particles sinking speed wsbio2 =', wsbio2 WRITE(numout,*) ' Big particles maximum sinking speed wsbio2max =', wsbio2max WRITE(numout,*) ' Big particles sinking speed length scale wsbio2scale =', wsbio2scale IF( ln_ligand ) THEN - IF( ln_p4z ) THEN - WRITE(numout,*) ' Phyto ligand production per unit doc ldocp =', ldocp - WRITE(numout,*) ' Zoo ligand production per unit doc ldocz =', ldocz - WRITE(numout,*) ' Proportional loss of ligands due to Fe uptake lthet =', lthet - ENDIF + WRITE(numout,*) ' Phyto ligand production per unit doc ldocp =', ldocp + WRITE(numout,*) ' Zoo ligand production per unit doc ldocz =', ldocz + WRITE(numout,*) ' Proportional loss of ligands due to Fe uptake lthet =', lthet ENDIF ENDIF @@ -358,13 +377,24 @@ CONTAINS CALL p4z_che( Kbb, Kmm ) ! initialize the chemical constants CALL ahini_for_at( hi, Kbb ) ENDIF - CALL iom_get( numrtr, jpdom_auto, 'Silicalim', xksi(:,:) ) - ! Read the Si half saturation constant and the maximum Silica concentration - IF( iom_varid( numrtr, 'Silicamax', ldstop = .FALSE. ) > 0 ) THEN - CALL iom_get( numrtr, jpdom_auto, 'Silicamax' , xksimax(:,:) ) - ELSE - xksimax(:,:) = xksi(:,:) + IF( ln_p2z ) THEN + IF( iom_varid( numrtr, 'Thetanano', ldstop = .FALSE. ) > 0 ) THEN + CALL iom_get( numrtr, jpdom_auto, 'Thetanano' , thetanano(:,:,:) ) + ELSE + thetanano(:,:,:) = 1.0 / 55.0 + ENDIF + ENDIF + + IF( .NOT. ln_p2z ) THEN + CALL iom_get( numrtr, jpdom_auto, 'Silicalim', xksi(:,:) ) + + ! Read the Si half saturation constant and the maximum Silica concentration + IF( iom_varid( numrtr, 'Silicamax', ldstop = .FALSE. ) > 0 ) THEN + CALL iom_get( numrtr, jpdom_auto, 'Silicamax' , xksimax(:,:) ) + ELSE + xksimax(:,:) = xksi(:,:) + ENDIF ENDIF ! Read the Fe3 consumption term by phytoplankton @@ -374,7 +404,6 @@ CONTAINS consfe3(:,:,:) = 0._wp ENDIF - ! Read the cumulative total flux. If not in the restart file, it is set to 0 IF( iom_varid( numrtr, 'tcflxcum', ldstop = .FALSE. ) > 0 ) THEN ! cumulative total flux of carbon CALL iom_get( numrtr, 'tcflxcum' , t_oce_co2_flx_cum ) @@ -383,12 +412,6 @@ CONTAINS ENDIF ! ! PISCES size proxy - IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN - CALL iom_get( numrtr, jpdom_auto, 'sized' , sized(:,:,:) ) - sized(:,:,:) = MAX( 1.0, sized(:,:,:) ) - ELSE - sized(:,:,:) = 1. - ENDIF ! IF( iom_varid( numrtr, 'sizen', ldstop = .FALSE. ) > 0 ) THEN CALL iom_get( numrtr, jpdom_auto, 'sizen' , sizen(:,:,:) ) @@ -397,6 +420,15 @@ CONTAINS sizen(:,:,:) = 1. ENDIF + IF( ln_p4z .OR. ln_p5z ) THEN + IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN + CALL iom_get( numrtr, jpdom_auto, 'sized' , sized(:,:,:) ) + sized(:,:,:) = MAX( 1.0, sized(:,:,:) ) + ELSE + sized(:,:,:) = 1. + ENDIF + ENDIF + ! PISCES-QUOTA specific part IF( ln_p5z ) THEN ! Read the size of the different phytoplankton groups @@ -417,13 +449,18 @@ CONTAINS IF(lwp) WRITE(numout,*) '~~~~~~~' ENDIF CALL iom_rstput( kt, nitrst, numrtw, 'PH', hi(:,:,:) ) - CALL iom_rstput( kt, nitrst, numrtw, 'Silicalim', xksi(:,:) ) - CALL iom_rstput( kt, nitrst, numrtw, 'Silicamax', xksimax(:,:) ) - CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum ) - CALL iom_rstput( kt, nitrst, numrtw, 'Consfe3', consfe3(:,:,:) ) ! Si max concentration - CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum ) ! Cumulative CO2 flux CALL iom_rstput( kt, nitrst, numrtw, 'sizen', sizen(:,:,:) ) ! Size of nanophytoplankton - CALL iom_rstput( kt, nitrst, numrtw, 'sized', sized(:,:,:) ) ! Size of diatoms + CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum ) + IF( ln_p2z ) THEN + CALL iom_rstput( kt, nitrst, numrtw, 'Thetanano' , thetanano(:,:,:) ) + ENDIF + + IF ( ln_p4z .OR. ln_p5z ) THEN + CALL iom_rstput( kt, nitrst, numrtw, 'Silicalim', xksi(:,:) ) + CALL iom_rstput( kt, nitrst, numrtw, 'Silicamax', xksimax(:,:) ) + CALL iom_rstput( kt, nitrst, numrtw, 'Consfe3', consfe3(:,:,:) ) ! Si max concentration + CALL iom_rstput( kt, nitrst, numrtw, 'sized', sized(:,:,:) ) ! Size of diatoms + ENDIF IF( ln_p5z ) CALL iom_rstput( kt, nitrst, numrtw, 'sizep', sizep(:,:,:) ) ! Size of picophytoplankton ENDIF ! @@ -463,54 +500,60 @@ CONTAINS zarea = 1._wp / glob_sum( 'p4zsms', cvol(:,:,:) ) * 1e6 zalksumn = glob_sum( 'p4zsms', tr(:,:,:,jptal,Kmm) * cvol(:,:,:) ) * zarea - zpo4sumn = glob_sum( 'p4zsms', tr(:,:,:,jppo4,Kmm) * cvol(:,:,:) ) * zarea * po4r zno3sumn = glob_sum( 'p4zsms', tr(:,:,:,jpno3,Kmm) * cvol(:,:,:) ) * zarea * rno3 - zsilsumn = glob_sum( 'p4zsms', tr(:,:,:,jpsil,Kmm) * cvol(:,:,:) ) * zarea ! Correct the trn mean content of alkalinity IF(lwp) WRITE(numout,*) ' TALKN mean : ', zalksumn tr(:,:,:,jptal,Kmm) = tr(:,:,:,jptal,Kmm) * alkmean / zalksumn - ! Correct the trn mean content of PO4 - IF(lwp) WRITE(numout,*) ' PO4N mean : ', zpo4sumn - tr(:,:,:,jppo4,Kmm) = tr(:,:,:,jppo4,Kmm) * po4mean / zpo4sumn - ! Correct the trn mean content of NO3 IF(lwp) WRITE(numout,*) ' NO3N mean : ', zno3sumn tr(:,:,:,jpno3,Kmm) = tr(:,:,:,jpno3,Kmm) * no3mean / zno3sumn - ! Correct the trn mean content of SiO3 - IF(lwp) WRITE(numout,*) ' SiO3N mean : ', zsilsumn - tr(:,:,:,jpsil,Kmm) = MIN( 400.e-6,tr(:,:,:,jpsil,Kmm) * silmean / zsilsumn ) + IF ( ln_p4z .OR. ln_p5z ) THEN + zpo4sumn = glob_sum( 'p4zsms', tr(:,:,:,jppo4,Kmm) * cvol(:,:,:) ) * zarea * po4r + zsilsumn = glob_sum( 'p4zsms', tr(:,:,:,jpsil,Kmm) * cvol(:,:,:) ) * zarea + + ! Correct the trn mean content of PO4 + IF(lwp) WRITE(numout,*) ' PO4N mean : ', zpo4sumn + tr(:,:,:,jppo4,Kmm) = tr(:,:,:,jppo4,Kmm) * po4mean / zpo4sumn + + ! Correct the trn mean content of SiO3 + IF(lwp) WRITE(numout,*) ' SiO3N mean : ', zsilsumn + tr(:,:,:,jpsil,Kmm) = MIN( 400.e-6,tr(:,:,:,jpsil,Kmm) * silmean / zsilsumn ) + ENDIF ! ! IF( .NOT. ln_top_euler ) THEN zalksumb = glob_sum( 'p4zsms', tr(:,:,:,jptal,Kbb) * cvol(:,:,:) ) * zarea - zpo4sumb = glob_sum( 'p4zsms', tr(:,:,:,jppo4,Kbb) * cvol(:,:,:) ) * zarea * po4r zno3sumb = glob_sum( 'p4zsms', tr(:,:,:,jpno3,Kbb) * cvol(:,:,:) ) * zarea * rno3 - zsilsumb = glob_sum( 'p4zsms', tr(:,:,:,jpsil,Kbb) * cvol(:,:,:) ) * zarea IF(lwp) WRITE(numout,*) ' ' ! Correct the trb mean content of alkalinity IF(lwp) WRITE(numout,*) ' TALKB mean : ', zalksumb tr(:,:,:,jptal,Kbb) = tr(:,:,:,jptal,Kbb) * alkmean / zalksumb - ! Correct the trb mean content of PO4 - IF(lwp) WRITE(numout,*) ' PO4B mean : ', zpo4sumb - tr(:,:,:,jppo4,Kbb) = tr(:,:,:,jppo4,Kbb) * po4mean / zpo4sumb - ! Correct the trb mean content of NO3 IF(lwp) WRITE(numout,*) ' NO3B mean : ', zno3sumb tr(:,:,:,jpno3,Kbb) = tr(:,:,:,jpno3,Kbb) * no3mean / zno3sumb - ! Correct the trb mean content of SiO3 - IF(lwp) WRITE(numout,*) ' SiO3B mean : ', zsilsumb - tr(:,:,:,jpsil,Kbb) = MIN( 400.e-6,tr(:,:,:,jpsil,Kbb) * silmean / zsilsumb ) - ENDIF - ENDIF - ! + IF ( ln_p4z .OR. ln_p5z ) THEN + zpo4sumb = glob_sum( 'p4zsms', tr(:,:,:,jppo4,Kbb) * cvol(:,:,:) ) * zarea * po4r + zsilsumb = glob_sum( 'p4zsms', tr(:,:,:,jpsil,Kbb) * cvol(:,:,:) ) * zarea + + ! Correct the trb mean content of PO4 + IF(lwp) WRITE(numout,*) ' PO4B mean : ', zpo4sumb + tr(:,:,:,jppo4,Kbb) = tr(:,:,:,jppo4,Kbb) * po4mean / zpo4sumb + + ! Correct the trb mean content of SiO3 + IF(lwp) WRITE(numout,*) ' SiO3B mean : ', zsilsumb + tr(:,:,:,jpsil,Kbb) = MIN( 400.e-6,tr(:,:,:,jpsil,Kbb) * silmean / zsilsumb ) + ENDIF + ENDIF + ENDIF + ! ENDIF - ! + ! END SUBROUTINE p4z_dmp @@ -546,8 +589,14 @@ CONTAINS ! Compute the budget of NO3 IF( iom_use( "pno3tot" ) .OR. ( ln_check_mass .AND. kt == nitend ) ) THEN - ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp - IF( ln_p4z ) THEN + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + IF( ln_p2z ) THEN + DO_3D( 0, 0, 0, 0, 1, jpk) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpno3,Kmm) + tr(ji,jj,jk,jpphy,Kmm) & + & + tr(ji,jj,jk,jppoc,Kmm) + tr(ji,jj,jk,jpdoc,Kmm) & + & + tr(ji,jj,jk,jpzoo,Kmm) ) * cvol(ji,jj,jk) + END_3D + ELSE IF( ln_p4z ) THEN DO_3D( 0, 0, 0, 0, 1, jpk) zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpno3,Kmm) + tr(ji,jj,jk,jpnh4,Kmm) & & + tr(ji,jj,jk,jpphy,Kmm) + tr(ji,jj,jk,jpdia,Kmm) & @@ -568,50 +617,87 @@ CONTAINS CALL iom_put( "pno3tot", no3budget ) DEALLOCATE( zw3d ) ENDIF + IF( .NOT. ln_p2z ) THEN ! ! Compute the budget of PO4 - IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend ) ) THEN + IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend ) ) THEN + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + IF( ln_p4z ) THEN + DO_3D( 0, 0, 0, 0, 1, jpk) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jppo4,Kmm) & + & + tr(ji,jj,jk,jpphy,Kmm) + tr(ji,jj,jk,jpdia,Kmm) & + & + tr(ji,jj,jk,jppoc,Kmm) + tr(ji,jj,jk,jpgoc,Kmm) + tr(ji,jj,jk,jpdoc,Kmm) & + & + tr(ji,jj,jk,jpzoo,Kmm) + tr(ji,jj,jk,jpmes,Kmm) ) * cvol(ji,jj,jk) + END_3D + ELSE + DO_3D( 0, 0, 0, 0, 1, jpk) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jppo4,Kmm) + tr(ji,jj,jk,jppph,Kmm) & + & + tr(ji,jj,jk,jppdi,Kmm) + tr(ji,jj,jk,jpppi,Kmm) & + & + tr(ji,jj,jk,jppop,Kmm) + tr(ji,jj,jk,jpgop,Kmm) + tr(ji,jj,jk,jpdop,Kmm) & + & + ( tr(ji,jj,jk,jpzoo,Kmm) + tr(ji,jj,jk,jpmes,Kmm) ) * po4rat3 ) * cvol(ji,jj,jk) + END_3D + ENDIF + ! + po4budget = glob_sum( 'p4zsms', zw3d(:,:,:) ) + po4budget = po4budget / areatot + CALL iom_put( "ppo4tot", po4budget ) + DEALLOCATE( zw3d ) + ENDIF + ! + ! Compute the budget of SiO3 + IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend ) ) THEN + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + DO_3D( 0, 0, 0, 0, 1, jpk) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpsil,Kmm) + tr(ji,jj,jk,jpgsi,Kmm) + tr(ji,jj,jk,jpdsi,Kmm) ) * cvol(ji,jj,jk) + END_3D + ! + silbudget = glob_sum( 'p4zsms', zw3d(:,:,:) ) + silbudget = silbudget / areatot + CALL iom_put( "psiltot", silbudget ) + DEALLOCATE( zw3d ) + ENDIF + ENDIF + ! Compute the budget of Iron + IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend ) ) THEN ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp - IF( ln_p4z ) THEN + IF( ln_p2z ) THEN DO_3D( 0, 0, 0, 0, 1, jpk) - zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jppo4,Kmm) & - & + tr(ji,jj,jk,jpphy,Kmm) + tr(ji,jj,jk,jpdia,Kmm) & - & + tr(ji,jj,jk,jppoc,Kmm) + tr(ji,jj,jk,jpgoc,Kmm) + tr(ji,jj,jk,jpdoc,Kmm) & - & + tr(ji,jj,jk,jpzoo,Kmm) + tr(ji,jj,jk,jpmes,Kmm) ) * cvol(ji,jj,jk) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpfer,Kmm) + tr(ji,jj,jk,jpphy,Kmm) * feratz & + & + tr(ji,jj,jk,jppoc,Kmm) *feratz & + & + tr(ji,jj,jk,jpzoo,Kmm) * feratz ) * cvol(ji,jj,jk) + END_3D + ELSE IF( ln_p4z ) THEN + DO_3D( 0, 0, 0, 0, 1, jpk) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpfer,Kmm) + tr(ji,jj,jk,jpnfe,Kmm) + tr(ji,jj,jk,jpdfe,Kmm) & + & + tr(ji,jj,jk,jpbfe,Kmm) + tr(ji,jj,jk,jpsfe,Kmm) & + & + tr(ji,jj,jk,jpzoo,Kmm) * feratz + tr(ji,jj,jk,jpmes,Kmm) * feratm ) * cvol(ji,jj,jk) END_3D ELSE DO_3D( 0, 0, 0, 0, 1, jpk) - zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jppo4,Kmm) + tr(ji,jj,jk,jppph,Kmm) & - & + tr(ji,jj,jk,jppdi,Kmm) + tr(ji,jj,jk,jpppi,Kmm) & - & + tr(ji,jj,jk,jppop,Kmm) + tr(ji,jj,jk,jpgop,Kmm) + tr(ji,jj,jk,jpdop,Kmm) & - & + ( tr(ji,jj,jk,jpzoo,Kmm) + tr(ji,jj,jk,jpmes,Kmm) ) * po4rat3 ) * cvol(ji,jj,jk) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpfer,Kmm) + tr(ji,jj,jk,jpnfe,Kmm) + tr(ji,jj,jk,jpdfe,Kmm) & + & + tr(ji,jj,jk,jppfe,Kmm) + tr(ji,jj,jk,jpbfe,Kmm) + tr(ji,jj,jk,jpsfe,Kmm) & + & + tr(ji,jj,jk,jpzoo,Kmm) * feratz + tr(ji,jj,jk,jpmes,Kmm) * feratm ) * cvol(ji,jj,jk) END_3D - ENDIF - ! - po4budget = glob_sum( 'p4zsms', zw3d(:,:,:) ) - po4budget = po4budget / areatot - CALL iom_put( "ppo4tot", po4budget ) - DEALLOCATE( zw3d ) - ENDIF - ! - ! Compute the budget of SiO3 - IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend ) ) THEN - ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp - DO_3D( 0, 0, 0, 0, 1, jpk) - zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpsil,Kmm) + tr(ji,jj,jk,jpgsi,Kmm) + tr(ji,jj,jk,jpdsi,Kmm) ) * cvol(ji,jj,jk) - END_3D + ENDIF ! - silbudget = glob_sum( 'p4zsms', zw3d(:,:,:) ) - silbudget = silbudget / areatot - CALL iom_put( "psiltot", silbudget ) + ferbudget = glob_sum( 'p4zsms', zw3d(:,:,:) ) + ferbudget = ferbudget / areatot + CALL iom_put( "pfertot", ferbudget ) DEALLOCATE( zw3d ) ENDIF ! IF( iom_use( "palktot" ) .OR. ( ln_check_mass .AND. kt == nitend ) ) THEN ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp - DO_3D( 0, 0, 0, 0, 1, jpk) - zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpno3,Kmm) * rno3 + tr(ji,jj,jk,jptal,Kmm) + tr(ji,jj,jk,jpcal,Kmm) * 2. ) * cvol(ji,jj,jk) - END_3D + IF( ln_p2z ) THEN + DO_3D( 0, 0, 0, 0, 1, jpk) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpno3,Kmm) * rno3 + tr(ji,jj,jk,jptal,Kmm) ) * cvol(ji,jj,jk) + END_3D + ELSE + DO_3D( 0, 0, 0, 0, 1, jpk) + zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpno3,Kmm) * rno3 + tr(ji,jj,jk,jptal,Kmm) & + & + tr(ji,jj,jk,jpcal,Kmm) * 2. - tr(ji,jj,jk,jpnh4,Kmm) * rno3 ) * cvol(ji,jj,jk) + END_3D + ENDIF ! alkbudget = glob_sum( 'p4zsms', zw3d(:,:,:) ) ! alkbudget = alkbudget / areatot @@ -619,21 +705,6 @@ CONTAINS DEALLOCATE( zw3d ) ENDIF ! - ! Compute the budget of Iron - IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend ) ) THEN - ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp - DO_3D( 0, 0, 0, 0, 1, jpk) - zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpfer,Kmm) + tr(ji,jj,jk,jpnfe,Kmm) + tr(ji,jj,jk,jpdfe,Kmm) & - & + tr(ji,jj,jk,jpbfe,Kmm) + tr(ji,jj,jk,jpsfe,Kmm) & - & + tr(ji,jj,jk,jpzoo,Kmm) * feratz + tr(ji,jj,jk,jpmes,Kmm) * feratm ) * cvol(ji,jj,jk) - END_3D - ! - ferbudget = glob_sum( 'p4zsms', zw3d(:,:,:) ) - ferbudget = ferbudget / areatot - CALL iom_put( "pfertot", ferbudget ) - DEALLOCATE( zw3d ) - ENDIF - ! ! Global budget of N SMS : denitrification in the water column and in the sediment ! nitrogen fixation by the diazotrophs ! -------------------------------------------------------------------------------- @@ -663,9 +734,11 @@ CONTAINS IF( lwp ) WRITE(numco2,9000) ndastp, t_atm_co2_flx, t_oce_co2_flx, tpp, t_oce_co2_exp IF( lwp ) WRITE(numnut,9100) ndastp, alkbudget * 1.e+06, & & no3budget * rno3 * 1.e+06, & - & po4budget * po4r * 1.e+06, & - & silbudget * 1.e+06, & & ferbudget * 1.e+09 + IF( ln_p4z .OR. ln_p5z ) THEN + IF( lwp ) WRITE(numnut,9101) ndastp, po4budget * po4r * 1.e+06, & + & silbudget * 1.e+06 + ENDIF ! IF( lwp ) WRITE(numnit,9200) ndastp, znitrpottot * xfact2 , & & zrdenittot * xfact2 , & @@ -673,7 +746,8 @@ CONTAINS ENDIF ! 9000 FORMAT(i8,f10.5,e18.10,f10.5,f10.5) - 9100 FORMAT(i8,5e18.10) + 9100 FORMAT(i8,3e18.10) + 9101 FORMAT(i8,2e18.10) 9200 FORMAT(i8,3f10.5) ! END SUBROUTINE p4z_chk_mass diff --git a/src/TOP/PISCES/P4Z/p5zlim.F90 b/src/TOP/PISCES/P4Z/p5zlim.F90 index dfaa8c68402e642de8d293c07391ecc60b4f3f41..00cdd20f0858bde6b541f75a8535f38ad9c4ca4e 100644 --- a/src/TOP/PISCES/P4Z/p5zlim.F90 +++ b/src/TOP/PISCES/P4Z/p5zlim.F90 @@ -14,6 +14,7 @@ MODULE p5zlim !!---------------------------------------------------------------------- USE oce_trc ! Shared ocean-passive tracers variables USE trc ! Tracers defined + USE p2zlim ! Nutrient limitation USE p4zlim ! Nutrient limitation USE sms_pisces ! PISCES variables USE iom ! I/O manager @@ -135,9 +136,9 @@ CONTAINS REAL(wp) :: zconc0p, zconc0pnh4, zconc0ppo4, zconcpfe, zconcnfe, zconcdfe REAL(wp) :: fanano, fananop, fananof, fadiat, fadiatp, fadiatf REAL(wp) :: fapico, fapicop, fapicof, zlimpo4, zlimdop - REAL(wp) :: zrpho, zrass, zcoef, zfuptk, zratchl, ztrn, ztrp + REAL(wp) :: zrpho, zrass, zcoef, zfuptk, ztrn, ztrp REAL(wp) :: zfvn, zfvp, zfvf, zsizen, zsizep, zsized, znanochl, zpicochl, zdiatchl - REAL(wp) :: zqfemn, zqfemp, zqfemd, zbactno3, zbactnh4, zbiron + REAL(wp) :: zqfemn, zqfemp, zqfemd, zbiron REAL(wp) :: znutlimtot, zlimno3, zlimnh4, zlim1f, zsizetmp REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d !!--------------------------------------------------------------------- @@ -152,7 +153,6 @@ CONTAINS l_dia_fracal = iom_use( "xfracal" ) ENDIF ! - zratchl = 6.0 sizena(:,:,:) = 0.0 ; sizepa(:,:,:) = 0.0 ; sizeda(:,:,:) = 0.0 ! DO_3D( 0, 0, 0, 0, 1, jpkm1) @@ -194,12 +194,17 @@ CONTAINS ! Allometric variations of the minimum and maximum quotas ! From Talmy et al. (2014) and Maranon et al. (2013) ! ------------------------------------------------------- - xqnnmin(ji,jj,jk) = qnnmin * sizen(ji,jj,jk)**(-0.36) + xqnnmin(ji,jj,jk) = qnnmin * sizen(ji,jj,jk)**(-0.18) xqnnmax(ji,jj,jk) = qnnmax - xqndmin(ji,jj,jk) = qndmin * sized(ji,jj,jk)**(-0.36) + xqndmin(ji,jj,jk) = qndmin * sized(ji,jj,jk)**(-0.18) xqndmax(ji,jj,jk) = qndmax - xqnpmin(ji,jj,jk) = qnpmin * sizep(ji,jj,jk)**(-0.36) + xqnpmin(ji,jj,jk) = qnpmin * sizep(ji,jj,jk)**(-0.18) xqnpmax(ji,jj,jk) = qnpmax + ! + ! Michaelis-Menten Limitation term for nutrients Small flagellates + ! ----------------------------------------------- + ztrn = tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) + ztrp = tr(ji,jj,jk,jppo4,Kbb) + tr(ji,jj,jk,jpdop,Kbb) / 200.0 ! Computation of the optimal allocation parameters ! Based on the different papers by Pahlow et al., and Smith et al. @@ -207,28 +212,25 @@ CONTAINS zbiron = ( 75.0 * ( 1.0 - plig(ji,jj,jk) ) + plig(ji,jj,jk) ) * biron(ji,jj,jk) ! Nanophytoplankton - znutlim = MAX( tr(ji,jj,jk,jpnh4,Kbb) / zconc0nnh4, & - & tr(ji,jj,jk,jpno3,Kbb) / zconc0n) + znutlim = ztrn / zconc0n fanano = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) - znutlim = tr(ji,jj,jk,jppo4,Kbb) / zconc0npo4 + znutlim = ztrp / zconc0npo4 fananop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) znutlim = zbiron / zconcnfe fananof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) ! Picophytoplankton - znutlim = MAX( tr(ji,jj,jk,jpnh4,Kbb) / zconc0pnh4, & - & tr(ji,jj,jk,jpno3,Kbb) / zconc0p) + znutlim = ztrn / zconc0p fapico = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) - znutlim = tr(ji,jj,jk,jppo4,Kbb) / zconc0ppo4 + znutlim = ztrp / zconc0npo4 fapicop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) znutlim = zbiron / zconcpfe fapicof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) ! Diatoms - znutlim = MAX( tr(ji,jj,jk,jpnh4,Kbb) / zconc1dnh4, & - & tr(ji,jj,jk,jpno3,Kbb) / zconc1d ) + znutlim = ztrn / zconc1d fadiat = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) - znutlim = tr(ji,jj,jk,jppo4,Kbb) / zconc0dpo4 + znutlim = ztrp / zconc0dpo4 fadiatp = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) znutlim = zbiron / zconcdfe fadiatf = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) @@ -237,14 +239,9 @@ CONTAINS ! Michaelis-Menten Limitation term by nutrients of ! heterotrophic bacteria ! ------------------------------------------------------------- - zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concbnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) - zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( concbno3 + tr(ji,jj,jk,jpno3,Kbb) ) - znutlimtot = ( tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) ) & + zlim1 = ( tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) ) & & / ( concbno3 + tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) ) - zbactnh4 = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) - zbactno3 = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) ! - zlim1 = zbactno3 + zbactnh4 zlim2 = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + concbpo4) zlim3 = biron(ji,jj,jk) / ( concbfe + biron(ji,jj,jk) ) zlim4 = tr(ji,jj,jk,jpdoc,Kbb) / ( xkdoc + tr(ji,jj,jk,jpdoc,Kbb) ) @@ -255,11 +252,6 @@ CONTAINS xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) xlimbac (ji,jj,jk) = xlimbacl(ji,jj,jk) * zlim4 ! - ! Michaelis-Menten Limitation term for nutrients Small flagellates - ! ----------------------------------------------- - ztrn = tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) - ztrp = tr(ji,jj,jk,jppo4,Kbb) + tr(ji,jj,jk,jpdop,Kbb) - ! ! Limitation of N based nutrients uptake (NO3 and NH4) zfalim = (1.-fanano) / fanano zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc0n + tr(ji,jj,jk,jpnh4,Kbb) ) @@ -290,15 +282,13 @@ CONTAINS zration = tr(ji,jj,jk,jpnph,Kbb) * z1_trnphy zration = MIN(xqnnmax(ji,jj,jk), MAX( xqnnmin(ji,jj,jk), zration )) fvnuptk(ji,jj,jk) = 2.5 * xpsiuptk * xqnnmin(ji,jj,jk) / (zration + rtrn) & - & * MAX(0., (1. - zratchl * znanochl / 12. ) ) + & * MAX(0., (1. - ratchl * znanochl / 12. ) ) ! - zlim1 = max(0., (zration - xqnnmin(ji,jj,jk) ) & - & / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk) & - & / (zration + rtrn) + zlim1 = (zration - xqnnmin(ji,jj,jk) ) / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) + ! The value of the optimal quota in the formulation below ! has been found by solving a non linear equation - zlim1f = max(0., ( 1.13 - xqnnmin(ji,jj,jk) ) & - & / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk) + zlim1f = ( 1.13 - xqnnmin(ji,jj,jk) ) / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) zlim3 = MAX( 0.,( zratiof - zqfemn ) / qfnopt ) ! computation of the various limitation terms of nanophyto ! growth and PP @@ -338,15 +328,13 @@ CONTAINS zration = tr(ji,jj,jk,jpnpi,Kbb) * z1_trnpic zration = MIN(xqnpmax(ji,jj,jk), MAX( xqnpmin(ji,jj,jk), zration )) fvpuptk(ji,jj,jk) = 2.5 * xpsiuptk * xqnpmin(ji,jj,jk) / (zration + rtrn) & - & * MAX(0., (1. - zratchl * zpicochl / 12. ) ) + & * MAX(0., (1. - ratchl * zpicochl / 12. ) ) ! - zlim1 = max(0., (zration - xqnpmin(ji,jj,jk) ) & - & / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk) & - & / (zration + rtrn) + zlim1 = (zration - xqnpmin(ji,jj,jk) ) / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) + ! The value of the optimal quota in the formulation below ! has been found by solving a non linear equation - zlim1f = max(0., (1.29 - xqnpmin(ji,jj,jk) ) & - & / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk) + zlim1f = (1.13 - xqnpmin(ji,jj,jk) ) / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) zlim3 = MAX( 0.,( zratiof - zqfemp ) / qfpopt ) ! computation of the various limitation terms of picophyto @@ -355,8 +343,6 @@ CONTAINS xlimpic (ji,jj,jk) = MIN( 1., zlim1, zlim3 ) xlimnpp (ji,jj,jk) = MIN( 1., zlim1 ) xlimpics(ji,jj,jk) = MIN( 1., zlim1/( zlim1f + rtrn ), zlim3 ) - - ! ! Michaelis-Menten Limitation term for nutrients Diatoms ! ------------------------------------------------------ @@ -391,16 +377,12 @@ CONTAINS zration = tr(ji,jj,jk,jpndi,Kbb) * z1_trndia zration = MIN(xqndmax(ji,jj,jk), MAX( xqndmin(ji,jj,jk), zration )) fvduptk(ji,jj,jk) = 2.5 * xpsiuptk * xqndmin(ji,jj,jk) / (zration + rtrn) & - & * MAX(0., (1. - zratchl * zdiatchl / 12. ) ) + & * MAX(0., (1. - ratchl * zdiatchl / 12. ) ) ! - zlim1 = max(0., (zration - xqndmin(ji,jj,jk) ) & - & / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) ) & - & * xqndmax(ji,jj,jk) / (zration + rtrn) + zlim1 = (zration - xqndmin(ji,jj,jk) ) / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) ! The value of the optimal quota in the formulation below ! has been found by solving a non linear equation - zlim1f = max(0., (1.13 - xqndmin(ji,jj,jk) ) & - & / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) ) & - & * xqndmax(ji,jj,jk) + zlim1f = (1.13 - xqndmin(ji,jj,jk) ) / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) zlim3 = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi(ji,jj) ) zlim4 = MAX( 0., ( zratiof - zqfemd ) / qfdopt ) ! computation of the various limitation terms of diatoms @@ -419,6 +401,7 @@ CONTAINS ! phytoplankton (see Daines et al., 2013). ! -------------------------------------------------------------------------------------------------- DO_3D( 0, 0, 0, 0, 1, jpkm1) + ztrp = tr(ji,jj,jk,jppo4,Kbb) + tr(ji,jj,jk,jpdop,Kbb) / 200.0 ! Size estimation of nanophytoplankton based on total biomass ! Assumes that larger biomass implies addition of larger cells ! ------------------------------------------------------------ @@ -429,10 +412,10 @@ CONTAINS zfuptk = 0.2 + 0.12 / ( 3.0 * sizen(ji,jj,jk) + rtrn ) ! Computed from Inomura et al. (2020) using Pavlova Lutheri zrpho = 11.55 * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn ) - zrass = MAX(0.62/4., ( 1. - zrpho - zfuptk ) * xlimnpn(ji,jj,jk) ) - xqpnmin(ji,jj,jk) = ( 0.0 + 0.0078 + 0.62/4. * 0.0783 ) * 16. + zrass = 0.62 * (0.15 + 0.85 * ( 1. - zrpho - zfuptk ) * xlimnpn(ji,jj,jk) ) + xqpnmin(ji,jj,jk) = ( 0.0078 + 0.62 * 0.15 * 0.0783 ) * 16. xqpnmax(ji,jj,jk) = ( zrpho * 0.0089 + zrass * 0.0783 ) * 16. - xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) + (0.033 + 0.0078 ) * 16. + xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) + ( 0.0078 + 0.022 ) * 16. + 3500 * ztrp xqpnmax(ji,jj,jk) = MIN( qpnmax, xqpnmax(ji,jj,jk) ) ! Size estimation of picophytoplankton based on total biomass @@ -443,13 +426,13 @@ CONTAINS ! N/P ratio of picophytoplankton ! ------------------------------ - zfuptk = 0.2 + 0.12 / ( 0.8 * sizep(ji,jj,jk) + rtrn ) + zfuptk = 0.2 + 0.12 / ( 0.7 * sizep(ji,jj,jk) + rtrn ) ! Computed from Inomura et al. (2020) using a synechococcus zrpho = 13.4 * tr(ji,jj,jk,jppch,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) * 12. + rtrn ) - zrass = MAX(0.4/4., ( 1. - zrpho - zfuptk ) * xlimnpp(ji,jj,jk) ) - xqppmin(ji,jj,jk) = ( (0.0 + 0.0078 ) + 0.4/4. * 0.0517 ) * 16. + zrass = 0.4 * ( 0.15 + 0.85 * ( 1. - zrpho - zfuptk ) * xlimnpp(ji,jj,jk) ) + xqppmin(ji,jj,jk) = ( 0.0078 + 0.4/4. * 0.0517 ) * 16. xqppmax(ji,jj,jk) = ( zrpho * 0.0076 + zrass * 0.0517 ) * 16. - xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) + (0.033 + 0.0078 ) * 16 + xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) + ( 0.0078 + 0.022 ) * 16. + 1500 * ztrp xqppmax(ji,jj,jk) = MIN( qppmax, xqppmax(ji,jj,jk) ) ! Size estimation of diatoms based on total biomass @@ -462,10 +445,10 @@ CONTAINS zfuptk = 0.2 + 0.12 / ( 5.0 * sized(ji,jj,jk) + rtrn ) ! Computed from Inomura et al. (2020) using a synechococcus zrpho = 8.08 * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpndi,Kbb) * 12. + rtrn ) - zrass = MAX(0.66/4., ( 1. - zrpho - zfuptk ) * xlimnpd(ji,jj,jk) ) - xqpdmin(ji,jj,jk) = ( ( 0.0 + 0.0078 ) + 0.66/4. * 0.0783 ) * 16. + zrass = 0.66 * ( 0.15 + 0.85 * ( 1. - zrpho - zfuptk ) * xlimnpd(ji,jj,jk) ) + xqpdmin(ji,jj,jk) = ( 0.0078 + 0.66/4. * 0.0783 ) * 16. xqpdmax(ji,jj,jk) = ( zrpho * 0.0135 + zrass * 0.0783 ) * 16. - xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) + ( 0.0078 + 0.033 ) * 16. + xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) + ( 0.0078 + 0.022 ) * 16. + 5000 * ztrp xqpdmax(ji,jj,jk) = MIN(qpdmax, xqpdmax(ji,jj,jk) ) END_3D @@ -474,29 +457,17 @@ CONTAINS ! This fraction depends on nutrient limitation, light, temperature ! -------------------------------------------------------------------- DO_3D( 0, 0, 0, 0, 1, jpkm1) - zlim1 = tr(ji,jj,jk,jpnh4,Kbb) / ( tr(ji,jj,jk,jpnh4,Kbb) + concnnh4 ) + tr(ji,jj,jk,jpno3,Kbb) & - & / ( tr(ji,jj,jk,jpno3,Kbb) + concnno3 ) * ( 1.0 - tr(ji,jj,jk,jpnh4,Kbb) & - & / ( tr(ji,jj,jk,jpnh4,Kbb) + concnnh4 ) ) - zlim2 = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + concnpo4 ) - zlim3 = tr(ji,jj,jk,jpfer,Kbb) / ( tr(ji,jj,jk,jpfer,Kbb) + 6.E-11 ) ztem1 = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) + 1.8 ) ztem2 = ts(ji,jj,jk,jp_tem,Kmm) - 10. zetot1 = MAX( 0., etot_ndcy(ji,jj,jk) - 1.) / ( 4. + etot_ndcy(ji,jj,jk) ) * 30. / ( 30. + etot_ndcy(ji,jj,jk) ) - xfracal(ji,jj,jk) = caco3r * xlimphy(ji,jj,jk) & - & * ztem1 / ( 0.1 + ztem1 ) * MAX( 1., tr(ji,jj,jk,jpphy,Kbb)*1E6 ) & + xfracal(ji,jj,jk) = caco3r * xlimphy(ji,jj,jk) * ztem1 / ( 0.1 + ztem1 ) & + & * MAX( 1., tr(ji,jj,jk,jpphy,Kbb) / xsizephy ) & & * ( 1. + EXP(-ztem2 * ztem2 / 25. ) ) & & * zetot1 * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) ) xfracal(ji,jj,jk) = MAX( 0.02, MIN( 0.8 , xfracal(ji,jj,jk) ) ) END_3D ! - DO_3D( 0, 0, 0, 0, 1, jpkm1) - ! denitrification factor computed from O2 levels - nitrfac(ji,jj,jk) = MAX( 0.e0, 0.4 * ( 6.e-6 - tr(ji,jj,jk,jpoxy,Kbb) ) & - & / ( oxymin + tr(ji,jj,jk,jpoxy,Kbb) ) ) - nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) ) - END_3D - ! IF( lk_iomput .AND. knt == nrdttrc ) THEN ! save output diagnostics ! IF( l_dia_fracal ) THEN ! fraction of calcifiers @@ -587,7 +558,7 @@ CONTAINS & concnfer, concpfer, concdfer, concbfe, concnpo4, concppo4, & & concdpo4, concbno3, concbnh4, concbpo4, xsizedia, xsizepic, & & xsizephy, xsizern, xsizerp, xsizerd, xksi1, xksi2, xkdoc, & - & caco3r, oxymin + & caco3r, oxymin, ratchl ! NAMELIST/namp5zquota/ qnnmin, qnnmax, qpnmin, qpnmax, qnpmin, qnpmax, qppmin, & & qppmax, qndmin, qndmax, qpdmin, qpdmax, qfnmax, qfpmax, qfdmax, & @@ -606,6 +577,7 @@ CONTAINS WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp5zlim' WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' WRITE(numout,*) ' mean rainratio caco3r = ', caco3r + WRITE(numout,*) ' C associated with Chlorophyll ratchl = ', ratchl WRITE(numout,*) ' NO3 half saturation of nanophyto concnno3 = ', concnno3 WRITE(numout,*) ' NO3 half saturation of picophyto concpno3 = ', concpno3 WRITE(numout,*) ' NO3 half saturation of diatoms concdno3 = ', concdno3 @@ -669,7 +641,6 @@ CONTAINS xpsinh4 = 1.8 * rno3 xpsiuptk = 1.0 / 6.625 ! - nitrfac(:,:,jpk) = 0._wp xfracal(:,:,jpk) = 0._wp xlimphy(:,:,jpk) = 0._wp xlimpic(:,:,jpk) = 0._wp diff --git a/src/TOP/PISCES/P4Z/p5zmeso.F90 b/src/TOP/PISCES/P4Z/p5zmeso.F90 index 9e0bf8a6c21da3646a50fb312762cbc1a427db25..f0afae601cc2926d10662209ad77fce2b2d3b06b 100644 --- a/src/TOP/PISCES/P4Z/p5zmeso.F90 +++ b/src/TOP/PISCES/P4Z/p5zmeso.F90 @@ -39,6 +39,7 @@ MODULE p5zmeso REAL(wp), PUBLIC :: xthresh2mes !: mesozoo feeding threshold for mesozooplankton REAL(wp), PUBLIC :: xthresh2 !: feeding threshold for mesozooplankton REAL(wp), PUBLIC :: resrat2 !: exsudation rate of mesozooplankton + REAL(wp), PUBLIC :: lmzrat2 !: linear microzooplankton mortality rate REAL(wp), PUBLIC :: mzrat2 !: microzooplankton mortality rate REAL(wp), PUBLIC :: grazrat2 !: maximal mesozoo grazing rate REAL(wp), PUBLIC :: xkgraz2 !: Half-saturation constant of assimilation @@ -94,7 +95,7 @@ CONTAINS REAL(wp) :: zgraztotc, zgraztotn, zgraztotp, zgraztotf, zbasresn, zbasresp, zbasresf REAL(wp) :: zgradoct, zgradont, zgrareft, zgradopt REAL(wp) :: zprcaca, zmortz, zexcess - REAL(wp) :: zbeta, zrespz, ztortz, zgrasratp, zgrasratn, zgrasratf + REAL(wp) :: zbeta, zrespz, ztortz, zltortz, zgrasratp, zgrasratn, zgrasratf REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot REAL(wp) :: zgrazdc, zgrazz, zgrazm, zgrazpof, zgrazcal, zfracal REAL(wp) :: zgraznc, zgrazpoc, zgrazpon, zgrazpop, zgraznf, zgrazdf @@ -106,10 +107,10 @@ CONTAINS REAL(wp) :: zrfact2, zmetexcess, zsigma, zdiffdn REAL(wp), DIMENSION(A2D(0),jpk) :: zgrarem, zgraref, zgrapoc, zgrapof REAL(wp), DIMENSION(A2D(0),jpk) :: zgrarep, zgraren, zgrapon, zgrapop - REAL(wp), DIMENSION(A2D(0),jpk) :: zgradoc, zgradon, zgradop + REAL(wp), DIMENSION(A2D(0),jpk) :: zgradoc, zgradon, zgradop, zgrabsi REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigrem, zgramigref, zgramigpoc, zgramigpof REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigrep, zgramigren, zgramigpop, zgramigpon - REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigdoc, zgramigdop, zgramigdon + REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigdoc, zgramigdop, zgramigdon, zgramigbsi REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zgrazing2, zfezoo2, zzligprod2, zw3d !!--------------------------------------------------------------------- @@ -164,14 +165,21 @@ CONTAINS ! A michaelis menten modulation term is used to avoid extinction of ! mesozooplankton at very low food concentrations ! ----------------------------------------------------------------- - zrespz = resrat2 * zfact * ( tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) ) & - & + 3. * nitrfac(ji,jj,jk) ) + zrespz = resrat2 * zfact * tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) ) + + ! linear mortality of mesozooplankton + ! A michaelis menten modulation term is used to avoid extinction of + ! mesozooplankton at very low food concentrations + ! ----------------------------------------------------------------- + zltortz = lmzrat2 * zfact * ( tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) ) & + & + 3. * nitrfac(ji,jj,jk) ) ! Zooplankton quadratic mortality. A square function has been selected with ! to mimic predation and disease (density dependent mortality). It also tends ! to stabilise the model ! ------------------------------------------------------------------------- ztortz = mzrat2 * 1.e6 * zfact * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk)) + zmortz = ztortz + zltortz ! Computation of the abundance of the preys ! A threshold can be specified in the namelist @@ -207,16 +215,16 @@ CONTAINS ! have low abundance, .i.e. zooplankton become less specific ! to avoid starvation. ! ---------------------------------------------------------- - zsigma = 1.0 - zdenom**3/(0.1**3+zdenom**3) + zsigma = 1.0 - zdenom**3/(0.05**3+zdenom**3) zsigma = xsigma2 + xsigma2del * zsigma ! Nanophytoplankton and diatoms are the only preys considered ! to be close enough to have potential interference ! ----------------------------------------------------------- zdiffdn = exp( -ABS(log(3.0 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2 ) - ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / (1.0 + zdiffdn) + ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) ztmp2 = xpref2m * zcompames**2 ztmp3 = xpref2c * zcompapoc**2 - ztmp4 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) / (1.0 + zdiffdn) + ztmp4 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) ztmp5 = xpref2z * zcompaz**2 ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + ztmp5 + rtrn ztmp1 = ztmp1 / ztmptot @@ -261,11 +269,10 @@ CONTAINS zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg ! Compute the proportion of filter feeders. It is assumed steady state. - ! --------------------------------------------------------------------- + ! --------------------------------------------------------------------- zproport = 0._wp - IF( gdepw(ji,jj,jk+1,Kmm) > MAX(hmld(ji,jj), heup_01(ji,jj) ) ) THEN - zproport = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) - ENDIF + zproport = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) + zproport = zproport**2 ! Compute fractionation of aggregates. It is assumed that ! diatoms based aggregates are more prone to fractionation @@ -330,7 +337,7 @@ CONTAINS ! Excess carbon in the food is used preferentially ! when bmetexc2 is set to .true. ! ----------------------------------------------- - zexcess = zgraztotc * zepsherf * (1.0 - zepshert) * zmetexcess + zexcess = zgraztotc * zepsherq * zepsherf * (1.0 - zepshert) * zmetexcess zbasresb = MAX(0., zrespz - zexcess) zbasresi = zexcess + MIN(0., zrespz - zexcess) zrespirc = srespir2 * zepsherv * zgraztotc + zbasresb @@ -351,28 +358,28 @@ CONTAINS zgradont = (1. - unass2n) * zgraztotn - zepsherv * no3rat3 * zgraztotc - zbasresn zgradopt = (1. - unass2p) * zgraztotp - zepsherv * po4rat3 * zgraztotc - zbasresp zgrareft = (1. - unass2c) * zgraztotf - zepsherv * feratm * zgraztotc - zbasresf - ztmp1 = (1. - epsher2 - unass2c) /( 1. - epsher2 ) * ztortz + ztmp1 = (1. - epsher2 - unass2c) /( 1. - epsher2 ) * zmortz - zgradoc(ji,jj,jk) = (zgradoct + ztmp1) * ssigma2 - zgradon(ji,jj,jk) = (zgradont + no3rat3 * ztmp1) * ssigma2 - zgradop(ji,jj,jk) = (zgradopt + po4rat3 * ztmp1) * ssigma2 + zgradoc(ji,jj,jk) = (zgradoct + ztmp1) * (1.0 - ssigma2) + zgradon(ji,jj,jk) = (zgradont + no3rat3 * ztmp1) * (1.0 - ssigma2) + zgradop(ji,jj,jk) = (zgradopt + po4rat3 * ztmp1) * (1.0 - ssigma2) ! Since only semilabile DOM is represented in PISCES ! part of DOM is in fact labile and is then released ! as dissolved inorganic compounds (ssigma2) ! -------------------------------------------------- - zgrarem(ji,jj,jk) = ( zgradoct + ztmp1 ) * (1.0 - ssigma2) - zgraren(ji,jj,jk) = ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2) - zgrarep(ji,jj,jk) = ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2) + zgrarem(ji,jj,jk) = ( zgradoct + ztmp1 ) * ssigma2 + zgraren(ji,jj,jk) = ( zgradont + no3rat3 * ztmp1 ) * ssigma2 + zgrarep(ji,jj,jk) = ( zgradopt + po4rat3 * ztmp1 ) * ssigma2 zgraref(ji,jj,jk) = zgrareft + feratm * ztmp1 ! Defecation as a result of non assimilated products ! -------------------------------------------------- - zgrapoc(ji,jj,jk) = zgraztotc * unass2c + unass2c / ( 1. - epsher2 ) * ztortz - zgrapon(ji,jj,jk) = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - epsher2 ) * ztortz - zgrapop(ji,jj,jk) = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - epsher2 ) * ztortz - zgrapof(ji,jj,jk) = zgraztotf * unass2c + feratm * unass2c / ( 1. - epsher2 ) * ztortz + zgrapoc(ji,jj,jk) = zgraztotc * unass2c + unass2c / ( 1. - epsher2 ) * zmortz + zgrapon(ji,jj,jk) = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - epsher2 ) * zmortz + zgrapop(ji,jj,jk) = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - epsher2 ) * zmortz + zgrapof(ji,jj,jk) = zgraztotf * unass2c + feratm * unass2c / ( 1. - epsher2 ) * zmortz ! Addition of respiration to the release of inorganic nutrients ! ------------------------------------------------------------- @@ -386,7 +393,7 @@ CONTAINS ! sinks ! -------------------------------------------------------------- tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) + zepsherv * zgraztotc - zrespirc & - & - ztortz - zgrazm + & - zmortz - zgrazm tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) - zgrazdn tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) - zgrazdp @@ -399,7 +406,7 @@ CONTAINS tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) - zgraznc * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) - zgrazdc * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zgrazdc * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) - tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrazdc * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) + zgrabsi(ji,jj,jk) = zgrazdc * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zgrazpoc - zgrazffep + zfracc prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfracc @@ -435,13 +442,13 @@ CONTAINS IF( ln_dvm_meso ) THEN ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) ) ALLOCATE( zgramigrep(jpi,jpj), zgramigren(jpi,jpj), zgramigpop(jpi,jpj), zgramigpon(jpi,jpj) ) - ALLOCATE( zgramigdoc(jpi,jpj), zgramigdon(jpi,jpj), zgramigdop(jpi,jpj) ) + ALLOCATE( zgramigdoc(jpi,jpj), zgramigdon(jpi,jpj), zgramigdop(jpi,jpj), zgramigbsi(jpi,jpj) ) zgramigrem(:,:) = 0.0 ; zgramigref(:,:) = 0.0 zgramigrep(:,:) = 0.0 ; zgramigren(:,:) = 0.0 zgramigpoc(:,:) = 0.0 ; zgramigpof(:,:) = 0.0 zgramigpop(:,:) = 0.0 ; zgramigpon(:,:) = 0.0 zgramigdoc(:,:) = 0.0 ; zgramigdon(:,:) = 0.0 - zgramigdop(:,:) = 0.0 + zgramigdop(:,:) = 0.0 ; zgramigbsi(:,:) = 0.0 ! Compute the amount of materials that will go into vertical migration ! This fraction is sumed over the euphotic zone and is removed from @@ -462,6 +469,7 @@ CONTAINS zgramigdoc(ji,jj) = zgramigdoc(ji,jj) + xfracmig * zgradoc(ji,jj,jk) * zmigthick zgramigdop(ji,jj) = zgramigdop(ji,jj) + xfracmig * zgradop(ji,jj,jk) * zmigthick zgramigdon(ji,jj) = zgramigdon(ji,jj) + xfracmig * zgradon(ji,jj,jk) * zmigthick + zgramigbsi(ji,jj) = zgramigbsi(ji,jj) + xfracmig * zgrabsi(ji,jj,jk) * zmigthick zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) @@ -474,6 +482,7 @@ CONTAINS zgradoc(ji,jj,jk) = zgradoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) zgradop(ji,jj,jk) = zgradop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) zgradon(ji,jj,jk) = zgradon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) + zgrabsi(ji,jj,jk) = zgrabsi(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) ENDIF END_3D @@ -495,6 +504,7 @@ CONTAINS zgradoc(ji,jj,jkt) = zgradoc(ji,jj,jkt) + zgramigdoc(ji,jj) * zdep zgradop(ji,jj,jkt) = zgradop(ji,jj,jkt) + zgramigdop(ji,jj) * zdep zgradon(ji,jj,jkt) = zgradon(ji,jj,jkt) + zgramigdon(ji,jj) * zdep + zgrabsi(ji,jj,jkt) = zgrabsi(ji,jj,jkt) + zgramigbsi(ji,jj) * zdep ENDIF END_2D ! @@ -502,7 +512,7 @@ CONTAINS ! ------------------------------ DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof ) DEALLOCATE( zgramigrep, zgramigren, zgramigpop, zgramigpon ) - DEALLOCATE( zgramigdoc, zgramigdon, zgramigdop ) + DEALLOCATE( zgramigdoc, zgramigdon, zgramigdop, zgramigbsi ) ! End of the ln_dvm_meso part ENDIF @@ -522,7 +532,7 @@ CONTAINS tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zgradop(ji,jj,jk) tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem(ji,jj,jk) tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref(ji,jj,jk) - zfezoo2(ji,jj,jk) = zgraref(ji,jj,jk) + IF( l_dia_fezoo2 ) zfezoo2(ji,jj,jk) = zgraref(ji,jj,jk) tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem(ji,jj,jk) tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgraren(ji,jj,jk) tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zgrapoc(ji,jj,jk) @@ -530,6 +540,7 @@ CONTAINS tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) + zgrapon(ji,jj,jk) tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + zgrapop(ji,jj,jk) tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zgrapof(ji,jj,jk) + tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrabsi(ji,jj,jk) END_3D ! ! Write the output @@ -600,7 +611,7 @@ CONTAINS !!---------------------------------------------------------------------- INTEGER :: ios ! Local integer output status for namelist read !! - NAMELIST/namp5zmes/part2, bmetexc2, grazrat2, resrat2, mzrat2, xpref2c, xpref2n, xpref2z, & + NAMELIST/namp5zmes/part2, bmetexc2, grazrat2, resrat2, lmzrat2, mzrat2, xpref2c, xpref2n, xpref2z, & & xpref2m, xpref2d, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & & xthresh2mes, xthresh2, xkgraz2, epsher2, epsher2min, ssigma2, unass2c, & & unass2n, unass2p, srespir2, xsigma2, xsigma2del, grazflux, ln_dvm_meso, xfracmig @@ -630,6 +641,7 @@ CONTAINS WRITE(numout,*) ' mesozoo feeding threshold for mesozoo xthresh2mes = ', xthresh2mes WRITE(numout,*) ' feeding threshold for mesozooplankton xthresh2 = ', xthresh2 WRITE(numout,*) ' exsudation rate of mesozooplankton resrat2 = ', resrat2 + WRITE(numout,*) ' linear mesozooplankton mortality rate lmzrat2 = ', lmzrat2 WRITE(numout,*) ' mesozooplankton mortality rate mzrat2 = ', mzrat2 WRITE(numout,*) ' maximal mesozoo grazing rate grazrat2 = ', grazrat2 WRITE(numout,*) ' mesozoo flux feeding rate grazflux = ', grazflux diff --git a/src/TOP/PISCES/P4Z/p5zmicro.F90 b/src/TOP/PISCES/P4Z/p5zmicro.F90 index d70b3ff467e7968481b132ff606cb50cee82daa0..ae1cd5c73c85e83b4baf165d512e133f66a6bc89 100644 --- a/src/TOP/PISCES/P4Z/p5zmicro.F90 +++ b/src/TOP/PISCES/P4Z/p5zmicro.F90 @@ -14,8 +14,6 @@ MODULE p5zmicro USE oce_trc ! shared variables between ocean and passive tracers USE trc ! passive tracers common variables USE sms_pisces ! PISCES Source Minus Sink variables - USE p4zlim ! PISCES nutrient limitation term of PISCES std - USE p5zlim ! Phytoplankton limitation terms USE iom ! I/O manager USE prtctl ! print control for debugging @@ -39,6 +37,7 @@ MODULE p5zmicro REAL(wp), PUBLIC :: xthreshpoc !: poc threshold for microzooplankton REAL(wp), PUBLIC :: xthresh !: feeding threshold for microzooplankton REAL(wp), PUBLIC :: resrat !: exsudation rate of microzooplankton + REAL(wp), PUBLIC :: lmzrat !: linear microzooplankton mortality rate REAL(wp), PUBLIC :: mzrat !: microzooplankton mortality rate REAL(wp), PUBLIC :: grazrat !: maximal microzoo grazing rate REAL(wp), PUBLIC :: xkgraz !: Half-saturation constant of assimilation @@ -86,7 +85,7 @@ CONTAINS REAL(wp) :: zgradoc, zgradon, zgradop, zgraref, zgradoct, zgradont, zgradopt, zgrareft REAL(wp) :: zexcess, zgraren, zgrarep, zgrarem REAL(wp) :: zgrapoc, zgrapon, zgrapop, zgrapof, zprcaca, zmortz - REAL(wp) :: zrespz, ztortz, zgrasratf, zgrasratn, zgrasratp + REAL(wp) :: zrespz, zltortz, ztortz, zgrasratf, zgrasratn, zgrasratp REAL(wp) :: zgraznc, zgraznn, zgraznp, zgrazpoc, zgrazpon, zgrazpop, zgrazpof REAL(wp) :: zgrazdc, zgrazdn, zgrazdp, zgrazdf, zgraznf, zgrazz REAL(wp) :: zgrazpc, zgrazpn, zgrazpp, zgrazpf, zbeta, zrfact2, zmetexcess @@ -127,18 +126,21 @@ CONTAINS zfact = xstep * tgfunc2(ji,jj,jk) * zcompaz ! Proportion of nano and diatoms that are within the size range ! accessible to microzooplankton. - zproport = min(sized(ji,jj,jk),1.8)**(-0.48)*min(1.0, exp(-1.1 * MAX(0., ( sized(ji,jj,jk) - 1.8 ))**0.8 )) - zproport2 = sizen(ji,jj,jk)**(-0.48) - zproport2 = 1.0 + zproport = sized(ji,jj,jk)**(-0.48) * (1.0 - (sized(ji,jj,jk)**1.6 - 1.0) / 14.0) + zproport2 = sizen(ji,jj,jk)**(-0.48) * (1.0 - (sizen(ji,jj,jk)**3.0 - 1.0) / 100.0) ! linear mortality of mesozooplankton ! A michaelis menten modulation term is used to avoid extinction of ! microzooplankton at very low food concentrations. Mortality is ! enhanced in low O2 waters ! ----------------------------------------------------------------- - ! Michaelis-Menten mortality rates of microzooplankton + ! Michaelis-Menten respiration rates of microzooplankton ! ----------------------------------------------------- - zrespz = resrat * zfact * ( tr(ji,jj,jk,jpzoo,Kbb) / ( xkmort + tr(ji,jj,jk,jpzoo,Kbb) ) & + zrespz = resrat * zfact * tr(ji,jj,jk,jpzoo,Kbb) / ( xkmort + tr(ji,jj,jk,jpzoo,Kbb) ) + + ! Michaelis-Menten linear mortality rate of microzooplankton + ! ---------------------------------------------------------- + zltortz = lmzrat * zfact * ( tr(ji,jj,jk,jpzoo,Kbb) / ( xkmort + tr(ji,jj,jk,jpzoo,Kbb) ) & & + 3. * nitrfac(ji,jj,jk) ) ! Zooplankton quadratic mortality. A square function has been selected with @@ -146,6 +148,7 @@ CONTAINS ! to stabilise the model ! ------------------------------------------------------------------------- ztortz = mzrat * 1.e6 * zfact * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) + zmortz = ztortz + zltortz ! Computation of the abundance of the preys ! A threshold can be specified in the namelist @@ -183,15 +186,15 @@ CONTAINS ! have low abundance, .i.e. zooplankton become less specific ! to avoid starvation. ! ---------------------------------------------------------- - zsigma = 1.0 - zdenom**3/(0.1**3+zdenom**3) + zsigma = 1.0 - zdenom**3/(0.05**3+zdenom**3) zsigma = xsigma + xsigmadel * zsigma zdiffpn = exp( -ABS(log(0.7 * sizep(ji,jj,jk) / (3.0 * sizen(ji,jj,jk) + rtrn )) )**2 / zsigma**2 ) zdiffdn = exp( -ABS(log(3.0 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2) zdiffdp = exp( -ABS(log(0.7 * sizep(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2) - ztmp1 = xprefn * zcompaph * ( zcompaph + zdiffdn * zcompadi + zdiffpn * zcompapi ) / ( 1.0 + zdiffdn + zdiffpn ) - ztmp2 = xprefp * zcompapi * ( zcompapi + zdiffpn * zcompaph + zdiffdp * zcompadi ) / ( 1.0 + zdiffpn + zdiffdp ) + ztmp1 = xprefn * zcompaph * ( zcompaph + zdiffdn * zcompadi + zdiffpn * zcompapi ) + ztmp2 = xprefp * zcompapi * ( zcompapi + zdiffpn * zcompaph + zdiffdp * zcompadi ) ztmp3 = xprefc * zcompapoc**2 - ztmp4 = xprefd * zcompadi * ( zdiffdp * zcompapi + zdiffdn * zcompaph + zcompadi ) / ( 1.0 + zdiffdn + zdiffdp ) + ztmp4 = xprefd * zcompadi * ( zdiffdp * zcompapi + zdiffdn * zcompaph + zcompadi ) ztmp5 = xprefz * zcompaz**2 ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + ztmp5 + rtrn ztmp1 = ztmp1 / ztmptot @@ -264,7 +267,7 @@ CONTAINS ! Excess carbon in the food is used preferentially ! when activated by zmetexcess ! ------------------------------------------------ - zexcess = zgraztotc * zepsherf * (1.0 - zepshert) * zmetexcess + zexcess = zgraztotc * zepsherq * zepsherf * (1.0 - zepshert) * zmetexcess zbasresb = MAX(0., zrespz - zexcess) zbasresi = zexcess + MIN(0., zrespz - zexcess) zrespirc = srespir * zepsherv * zgraztotc + zbasresb @@ -290,12 +293,12 @@ CONTAINS ! part of DOM is in fact labile and is then released ! as dissolved inorganic compounds (ssigma) ! -------------------------------------------------- - zgradoc = zgradoct * ssigma - zgradon = zgradont * ssigma - zgradop = zgradopt * ssigma - zgrarem = (1.0 - ssigma) * zgradoct - zgraren = (1.0 - ssigma) * zgradont - zgrarep = (1.0 - ssigma) * zgradopt + zgradoc = (1.0 - ssigma) * zgradoct + zgradon = (1.0 - ssigma) * zgradont + zgradop = (1.0 - ssigma) * zgradopt + zgrarem = ssigma * zgradoct + zgraren = ssigma * zgradont + zgrarep = ssigma * zgradopt zgraref = zgrareft ! Defecation as a result of non assimilated products @@ -326,7 +329,7 @@ CONTAINS tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zgradop tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref - tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) + zepsherv * zgraztotc - zrespirc - ztortz - zgrazz + tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) + zepsherv * zgraztotc - zrespirc - zmortz - zgrazz tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) - zgraznn tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) - zgraznp @@ -344,12 +347,12 @@ CONTAINS tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgraznf tr(ji,jj,jk,jppfe,Krhs) = tr(ji,jj,jk,jppfe,Krhs) - zgrazpf tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazdf - tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + ztortz + zgrapoc - zgrazpoc - prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + ztortz + zgrapoc + tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zmortz + zgrapoc - zgrazpoc + prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortz + zgrapoc conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + no3rat3 * ztortz + zgrapon - zgrazpon - tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + po4rat3 * ztortz + zgrapop - zgrazpop - tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + feratz * ztortz + zgrapof - zgrazpof + tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + no3rat3 * zmortz + zgrapon - zgrazpon + tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + po4rat3 * zmortz + zgrapop - zgrazpop + tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + feratz * zmortz + zgrapof - zgrazpof ! ! calcite production zprcaca = xfracal(ji,jj,jk) * zgraznc @@ -419,7 +422,7 @@ CONTAINS !!---------------------------------------------------------------------- INTEGER :: ios ! Local integer !! - NAMELIST/namp5zzoo/ part, grazrat, bmetexc, resrat, mzrat, xprefc, xprefn, & + NAMELIST/namp5zzoo/ part, grazrat, bmetexc, resrat, lmzrat, mzrat, xprefc, xprefn, & & xprefp, xprefd, xprefz, xthreshdia, xthreshphy, & & xthreshpic, xthreshpoc, xthreshzoo, xthresh, xkgraz, & & epsher, epshermin, ssigma, srespir, unassc, unassn, unassp, & @@ -450,6 +453,7 @@ CONTAINS WRITE(numout,*) ' microzoo feeding threshold for microzoo xthreshzoo =', xthreshzoo WRITE(numout,*) ' feeding threshold for microzooplankton xthresh =', xthresh WRITE(numout,*) ' exsudation rate of microzooplankton resrat =', resrat + WRITE(numout,*) ' linear microzooplankton mortality rate lmzrat =', lmzrat WRITE(numout,*) ' microzooplankton mortality rate mzrat =', mzrat WRITE(numout,*) ' maximal microzoo grazing rate grazrat =', grazrat WRITE(numout,*) ' C egested fraction of fodd by microzoo unassc =', unassc diff --git a/src/TOP/PISCES/P4Z/p5zmort.F90 b/src/TOP/PISCES/P4Z/p5zmort.F90 index 4fb33dac3f590cf33e27a9ab99ab84683dcc35a5..90682d2cb3d8b21e78710f9b7bc30d84b673f20d 100644 --- a/src/TOP/PISCES/P4Z/p5zmort.F90 +++ b/src/TOP/PISCES/P4Z/p5zmort.F90 @@ -13,6 +13,7 @@ MODULE p5zmort USE oce_trc ! shared variables between ocean and passive tracers USE trc ! passive tracers common variables USE sms_pisces ! PISCES Source Minus Sink variables + USE p2zlim USE p4zlim ! Phytoplankton limitation terms (p4z) USE p5zlim ! Phytoplankton limitation terms (p5z) USE prtctl ! print control for debugging @@ -79,7 +80,7 @@ CONTAINS ! IF( ln_timing ) CALL timing_start('p5z_mort_nano') ! - prodcal(:,:,:) = 0. !: calcite production variable set to zero + prodcal(:,:,:) = 0._wp ! calcite production variable set to zero DO_3D( 0, 0, 0, 0, 1, jpkm1) zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - 1e-9 ), 0.e0 ) @@ -207,7 +208,7 @@ CONTAINS INTEGER, INTENT(in) :: Kbb, Krhs ! time level indices INTEGER :: ji, jj, jk REAL(wp) :: zfactfe,zfactsi,zfactch, zfactn, zfactp, zcompadi - REAL(wp) :: zrespp2, ztortp2, zmortp2 + REAL(wp) :: zrespp, ztortp, zmortp REAL(wp) :: zlim2, zlim1 CHARACTER (len=25) :: charout !!--------------------------------------------------------------------- @@ -227,14 +228,14 @@ CONTAINS ! ------------------------------- zlim2 = xlimdia(ji,jj,jk) * xlimdia(ji,jj,jk) zlim1 = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) - zrespp2 = 1.e6 * xstep * wchld * zlim1 * xdiss(ji,jj,jk) * zcompadi * tr(ji,jj,jk,jpdia,Kbb) + zrespp = 1.e6 * xstep * wchld * zlim1 * xdiss(ji,jj,jk) * zcompadi * tr(ji,jj,jk,jpdia,Kbb) ! Phytoplankton linear mortality ! A michaelis-menten like term is introduced to avoid ! extinction of diatoms in highly limited areas ! --------------------------------------------------- - ztortp2 = mpratd * xstep * zcompadi * tr(ji,jj,jk,jpdia,Kbb) / ( xkmort + tr(ji,jj,jk,jpdia,Kbb) ) - zmortp2 = zrespp2 + ztortp2 + ztortp = mpratd * xstep * zcompadi * tr(ji,jj,jk,jpdia,Kbb) / ( xkmort + tr(ji,jj,jk,jpdia,Kbb) ) + zmortp = zrespp + ztortp ! Update the arrays tr(:,:,:,:,Krhs) which contains the biological sources and sinks ! --------------------------------------------------------------------- @@ -243,23 +244,23 @@ CONTAINS zfactch = tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) zfactfe = tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) zfactsi = tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) - tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zmortp2 - tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) - zmortp2 * zfactn - tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) - zmortp2 * zfactp - tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) - zmortp2 * zfactch - tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zmortp2 * zfactfe - tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zmortp2 * zfactsi - tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zmortp2 * zfactsi - tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zrespp2 - tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) + zrespp2 * zfactn - tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + zrespp2 * zfactp - tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zrespp2 * zfactfe - tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + ztortp2 - tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + ztortp2 * zfactn - tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + ztortp2 * zfactp - tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + ztortp2 * zfactfe - prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + ztortp2 - prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zrespp2 + tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zmortp + tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) - zmortp * zfactn + tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) - zmortp * zfactp + tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) - zmortp * zfactch + tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zmortp * zfactfe + tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zmortp * zfactsi + tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zmortp * zfactsi + tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zrespp + tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) + zrespp * zfactn + tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + zrespp * zfactp + tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zrespp * zfactfe + tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + ztortp + tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + ztortp * zfactn + tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + ztortp * zfactp + tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + ztortp * zfactfe + prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + ztortp + prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zrespp END_3D ! diff --git a/src/TOP/PISCES/P4Z/p5zprod.F90 b/src/TOP/PISCES/P4Z/p5zprod.F90 index 0888dfc072dcef329d69404c2cdd60ac5909f09a..ddefe58ae254b5c6b9e990e5e2587d0aa3d4aa88 100644 --- a/src/TOP/PISCES/P4Z/p5zprod.F90 +++ b/src/TOP/PISCES/P4Z/p5zprod.F90 @@ -16,6 +16,7 @@ MODULE p5zprod USE oce_trc ! shared variables between ocean and passive tracers USE trc ! passive tracers common variables USE sms_pisces ! PISCES Source Minus Sink variables + USE p2zlim USE p4zlim USE p5zlim ! Co-limitations of differents nutrients USE prtctl ! print control for debugging @@ -31,14 +32,10 @@ MODULE p5zprod REAL(wp), PUBLIC :: pislopen !: P-I slope of nanophytoplankton REAL(wp), PUBLIC :: pislopep !: P-I slope of picophytoplankton REAL(wp), PUBLIC :: pisloped !: P-I slope of diatoms - REAL(wp), PUBLIC :: xadap !: Adaptation factor to low light REAL(wp), PUBLIC :: excretn !: Excretion ratio of nanophyto REAL(wp), PUBLIC :: excretp !: Excretion ratio of picophyto REAL(wp), PUBLIC :: excretd !: Excretion ratio of diatoms REAL(wp), PUBLIC :: bresp !: Basal respiration rate - REAL(wp), PUBLIC :: thetanpm !: Maximum Chl/N ratio of picophyto - REAL(wp), PUBLIC :: thetannm !: Maximum Chl/N ratio of nanophyto - REAL(wp), PUBLIC :: thetandm !: Maximum Chl/N ratio of diatoms REAL(wp), PUBLIC :: chlcmin !: Minimum Chl/C ratio of phytoplankton REAL(wp), PUBLIC :: grosip !: Mean Si/C ratio of diatoms @@ -50,7 +47,7 @@ MODULE p5zprod REAL(wp) :: xq10_p !: q10 coef for pico = 1. + xpsino3 * qnpmax REAL(wp) :: xq10_d !: q10 coef for diat = 1. + xpsino3 * qndmax - LOGICAL :: l_dia_ppphy, l_dia_ppnew, l_dia_ppbfe, l_dia_ppbsi + LOGICAL :: l_dia_ppphy, l_dia_gpphy, l_dia_ppnew, l_dia_ppbfe, l_dia_ppbsi LOGICAL :: l_dia_mu, l_dia_light, l_dia_lprod !! * Substitutions @@ -77,18 +74,18 @@ CONTAINS INTEGER, INTENT(in) :: Kbb, Kmm, Krhs ! time level indices ! INTEGER :: ji, jj, jk - REAL(wp) :: zsilfac, znanotot, zpicotot, zdiattot, zconctemp, zconctemp2 - REAL(wp) :: zration, zratiop, zratiof, zmax, ztn, zadap + REAL(wp) :: zsilfac, znanotot, zpicotot, zdiattot + REAL(wp) :: zration, zratiop, zratiof, zmax REAL(wp) :: zprofmax, zratio REAL(wp) :: zpronewn, zpronewp, zpronewd REAL(wp) :: zproregn, zproregp, zproregd REAL(wp) :: zpropo4n, zpropo4p, zpropo4d REAL(wp) :: zprodopn, zprodopp, zprodopd - REAL(wp) :: zlim, zsilfac2, zsiborn, zprod, zprontot, zproptot, zprodtot - REAL(wp) :: zproddoc, zproddon, zproddop, zprodsil, zprodfer, zprodlig, zresptot + REAL(wp) :: zlim, zsiborn, zprod, zprod1, zprontot, zproptot, zprodtot + REAL(wp) :: zproddoc, zproddon, zproddop, zprodsil, zprodfer, zprodlig REAL(wp) :: zprnutmax, zprochln, zprochld, zprochlp REAL(wp) :: zpislopen, zpislopep, zpisloped - REAL(wp) :: zval, zpptot, zpnewtot, zpregtot + REAL(wp) :: zval, zpo4tot, zpptot, zpnewtot, zpregtot REAL(wp) :: zmxl_chl, zmxl_fac REAL(wp) :: zqfpmax, zqfnmax, zqfdmax REAL(wp) :: zfact, zrfact2, zmaxsi, zratiosi, zsizetmp, zlimfac, zsilim @@ -100,7 +97,6 @@ CONTAINS REAL(wp), DIMENSION(A2D(0),jpk) :: zprofed, zprofep, zprofen REAL(wp), DIMENSION(A2D(0),jpk) :: zpronmaxn, zpronmaxp,zpronmaxd REAL(wp), DIMENSION(A2D(0),jpk) :: zpropmaxn, zpropmaxp,zpropmaxd -! REAL(wp), DIMENSION(A2D(0),jpk) :: zrespn, zrespp, zrespd REAL(wp), DIMENSION(A2D(0),jpk) :: zprmaxn, zprmaxd, zprmaxp, zmxl REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d !!--------------------------------------------------------------------- @@ -109,6 +105,7 @@ CONTAINS ! IF( kt == nittrc000 ) THEN l_dia_ppphy = iom_use( "PPPHYN" ) .OR. iom_use( "PPPHYD" ) .OR. iom_use( "PPPHYP" ) .OR. iom_use( "TPP" ) + l_dia_gpphy = iom_use( "GPPHYN" ) .OR. iom_use( "GPPHYD" ) .OR. iom_use( "GPPHYP" ) l_dia_ppnew = iom_use( "PPNEWN" ) .OR. iom_use( "PPNEWD" ) .OR. iom_use( "PPNEWP" ) .OR. iom_use( "TPNEW") l_dia_ppbfe = iom_use( "PFeN" ) .OR. iom_use( "PFeD" ) .OR. iom_use( "PFeP" ) .OR. iom_use( "TPBFE") l_dia_ppbsi = iom_use( "PBSi" ) @@ -125,14 +122,12 @@ CONTAINS zpropmaxn(:,:,:) = 0._wp ; zpropmaxp(:,:,:) = 0._wp ; zpropmaxd(:,:,:) = 0._wp zmxl (:,:,:) = 0._wp ; zysopt (:,:,:) = 0._wp -! zrespn (:,:,:) = 0._wp ; zrespp (:,:,:) = 0._wp ; zrespd (:,:,:) = 0._wp - ! Computation of the optimal production rates and nutrient uptake ! rates. Based on a Q10 description of the thermal dependency. - zprnut (:,:,:) = 0.8_wp * r1_rday * tgfunc(:,:,:) - zprmaxn(:,:,:) = 0.8_wp * xq10_n * r1_rday * tgfunc(:,:,:) - zprmaxd(:,:,:) = 0.8_wp * xq10_d * r1_rday * tgfunc(:,:,:) - zprmaxp(:,:,:) = 0.6_wp * xq10_p * r1_rday * tgfunc(:,:,:) + zprnut (:,:,:) = 0.65_wp * r1_rday * tgfunc(:,:,:) + zprmaxn(:,:,:) = 0.65_wp * xq10_n * r1_rday * tgfunc(:,:,:) + zprmaxd(:,:,:) = 0.65_wp * xq10_d * r1_rday * tgfunc(:,:,:) + zprmaxp(:,:,:) = 0.50_wp * xq10_p * r1_rday * tgfunc(:,:,:) ! Impact of the day duration and light intermittency on phytoplankton growth ! Intermittency is supposed to have a similar effect on production as @@ -145,8 +140,9 @@ CONTAINS IF ( ln_p4z_dcyc ) THEN ! Diurnal cycle in PISCES DO_3D( 0, 0, 0, 0, 1, jpkm1) IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + zval = 24.0 IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN - zval = MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) + zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) ENDIF zmxl(ji,jj,jk) = zval ENDIF @@ -164,30 +160,25 @@ CONTAINS ENDIF + ! Computation of the P-I slope for nanos, picos and diatoms + ! The formulation proposed by Geider et al. (1997) has been used. DO_3D( 0, 0, 0, 0, 1, jpkm1) IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN - zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) ) + zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) ) + zmxl_chl = zmxl(ji,jj,jk) / 24. zprbio(ji,jj,jk) = zprmaxn(ji,jj,jk) * zmxl_fac zprdia(ji,jj,jk) = zprmaxd(ji,jj,jk) * zmxl_fac zprpic(ji,jj,jk) = zprmaxp(ji,jj,jk) * zmxl_fac - ENDIF - END_3D + zprnut(ji,jj,jk) = zprnut (ji,jj,jk) * zmxl_fac - ! Computation of the P-I slope for nanos, picos and diatoms - ! The formulation proposed by Geider et al. (1997) has been used. - DO_3D( 0, 0, 0, 0, 1, jpkm1) - IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN ! Computation of the P-I slope for nanos and diatoms - ztn = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) - 15. ) - zadap = xadap * ztn / ( 2.+ ztn ) - ! ! Nanophytoplankton zpislopeadn(ji,jj,jk) = pislopen * tr(ji,jj,jk,jpnch,Kbb) & & /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn) ! Picophytoplankton - zpislopeadp(ji,jj,jk) = pislopep * ( 1. + zadap * EXP( -0.25 * epico(ji,jj,jk) ) ) & - & * tr(ji,jj,jk,jppch,Kbb) /( tr(ji,jj,jk,jppic,Kbb) * 12. + rtrn) + zpislopeadp(ji,jj,jk) = pislopep * tr(ji,jj,jk,jppch,Kbb) & + & /( tr(ji,jj,jk,jppic,Kbb) * 12. + rtrn) ! Diatoms zpislopeadd(ji,jj,jk) = pisloped * tr(ji,jj,jk,jpdch,Kbb) & @@ -200,12 +191,9 @@ CONTAINS ! Computation of production function for Carbon ! Actual light levels are used here ! --------------------------------------------- - zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) ) - zmxl_chl = zmxl(ji,jj,jk) / 24. - ! - zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) / zmxl_fac ) ) - zprpic(ji,jj,jk) = zprpic(ji,jj,jk) * ( 1.- EXP( -zpislopep * epico(ji,jj,jk) / zmxl_fac ) ) - zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) / zmxl_fac ) ) + zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) ) ) + zprpic(ji,jj,jk) = zprpic(ji,jj,jk) * ( 1.- EXP( -zpislopep * epico(ji,jj,jk) ) ) + zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) ) ) ! Computation of production function for Chlorophyll ! Mean light level in the mixed layer (when appropriate) @@ -216,9 +204,9 @@ CONTAINS zpisloped = zpisloped * zmxl_fac / ( zmxl_chl + rtrn ) zpislopep = zpislopep * zmxl_fac / ( zmxl_chl + rtrn ) ! - zprchln(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) ) - zprchlp(ji,jj,jk) = zprmaxp(ji,jj,jk) * ( 1.- EXP( -zpislopep * epicom(ji,jj,jk) ) ) - zprchld(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) ) + zprchln(ji,jj,jk) = ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) ) + zprchlp(ji,jj,jk) = ( 1.- EXP( -zpislopep * epicom(ji,jj,jk) ) ) + zprchld(ji,jj,jk) = ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) ) ENDIF END_3D @@ -229,40 +217,43 @@ CONTAINS ! ------------------------ ! Si/C increases with iron stress and silicate availability (zsilfac) ! Si/C is arbitrariliy increased for very high Si concentrations - ! to mimic the very high ratios observed in the Southern Ocean (zsilfac2) + ! to mimic the very high ratios observed in the Southern Ocean (zsilfac) ! A parameterization derived from Flynn (2003) is used for the control ! when Si is not limiting which is similar to the parameterisation ! proposed by Gurney and Davidson (1999). ! ----------------------------------------------------------------------- zlim = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi1 ) - zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) + zsilim = MIN(1.0, xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprnut(ji,jj,jk) + rtrn ) ) zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) IF (gphit(ji,jj) < -30 ) THEN - zsilfac2 = 1. + 1. * zsiborn / ( zsiborn + xksi2**3 ) + zsilfac = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 ) ELSE - zsilfac2 = 1. + zsilfac = 1. + 1. * zsiborn / ( zsiborn + xksi2**3 ) ENDIF - zratiosi = 1.0 - tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) / ( zsilfac2 * grosip * 3.0 + rtrn ) + zratiosi = 1.0 - tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) * zsilfac * grosip * 3.0 + rtrn ) zratiosi = MAX(0., MIN(1.0, zratiosi) ) zmaxsi = (1.0 + 0.1**4) * zratiosi**4 / ( zratiosi**4 + 0.1**4 ) IF ( xlimsi(ji,jj,jk) /= xlimdia(ji,jj,jk) ) THEN - zysopt(ji,jj,jk) = zlim * zsilfac2 * grosip * 1.0 * zmaxsi + zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zmaxsi ELSE - zysopt(ji,jj,jk) = zlim * zsilfac2 * grosip * 1.0 * zsilim**0.7 * zmaxsi + zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zsilim**0.7 * zmaxsi ENDIF ENDIF END_3D - ! Sea-ice effect on production + ! Sea-ice effect on production ! No production is assumed below sea ice - ! -------------------------------------- + ! -------------------------------------- DO_3D( 0, 0, 0, 0, 1, jpkm1) - zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) - zprpic(ji,jj,jk) = zprpic(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) - zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) - zprnut(ji,jj,jk) = zprnut(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) + IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * (1.0 - fr_i(ji,jj) ) + zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * (1.0 - fr_i(ji,jj) ) + zprpic(ji,jj,jk) = zprpic(ji,jj,jk) * (1.0 - fr_i(ji,jj) ) + zprnut(ji,jj,jk) = zprnut(ji,jj,jk) * (1.0 - fr_i(ji,jj) ) + ENDIF END_3D + ! Computation of the various production and uptake terms of nanophytoplankton ! Interactions between N and P are modeled according to the Chain Model ! of Pahlow et al. (2009). Iron uptake is modeled following traditional @@ -281,7 +272,7 @@ CONTAINS ! size at time step t+1 and is thus updated at the end of the ! current time step ! -------------------------------------------------------------------- - zlimfac = xlimphys(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn ) + zlimfac = xlimphys(ji,jj,jk) * zprchln(ji,jj,jk) zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) sizena(ji,jj,jk) = MIN(xsizern, MAX( sizena(ji,jj,jk), zsizetmp ) ) ! Maximum potential uptake rate @@ -294,11 +285,11 @@ CONTAINS zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) zpronmaxn(ji,jj,jk) = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpnmin(ji,jj,jk) ) & & / ( xqpnmax(ji,jj,jk) - xqpnmin(ji,jj,jk) + rtrn ), xlimnfe(ji,jj,jk) ) ) - zpronmaxn(ji,jj,jk) = zpronmaxn(ji,jj,jk) * xqnnmin(ji,jj,jk) / qnnmin + ! Uptake of phosphorus and DOP zratio = 1.0 - MIN( 1., zratiop / (xqpnmax(ji,jj,jk) + rtrn) ) zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) - zpropmaxn(ji,jj,jk) = zprnutmax * zmax * xlimnfe(ji,jj,jk) + zpropmaxn(ji,jj,jk) = 2.0 * zprnutmax * zmax * xlimnfe(ji,jj,jk) ! Uptake of iron zqfnmax = xqfuncfecn(ji,jj,jk) + ( qfnmax - xqfuncfecn(ji,jj,jk) ) * xlimnpn(ji,jj,jk) zratio = 1.0 - MIN( 1., zratiof / zqfnmax ) @@ -328,7 +319,7 @@ CONTAINS ! size at time step t+1 and is thus updated at the end of the ! current time step ! -------------------------------------------------------------------- - zlimfac = zprchlp(ji,jj,jk) * xlimpics(ji,jj,jk) / ( zprmaxp(ji,jj,jk) + rtrn ) + zlimfac = zprchlp(ji,jj,jk) * xlimpics(ji,jj,jk) zsizetmp = 1.0 + 1.3 * ( xsizerp - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) sizepa(ji,jj,jk) = min(xsizerp, max( sizepa(ji,jj,jk), zsizetmp ) ) ! Maximum potential uptake rate of nutrients @@ -341,11 +332,11 @@ CONTAINS zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) ) zpronmaxp(ji,jj,jk) = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqppmin(ji,jj,jk) ) & & / ( xqppmax(ji,jj,jk) - xqppmin(ji,jj,jk) + rtrn ), xlimpfe(ji,jj,jk) ) ) - zpronmaxp(ji,jj,jk) = zpronmaxp(ji,jj,jk) * xqnpmin(ji,jj,jk) / qnnmin + ! Uptake of phosphorus zratio = 1.0 - MIN( 1., zratiop / (xqppmax(ji,jj,jk) + rtrn) ) zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) - zpropmaxp(ji,jj,jk) = zprnutmax * zmax * xlimpfe(ji,jj,jk) + zpropmaxp(ji,jj,jk) = 2.0 * zprnutmax * zmax * xlimpfe(ji,jj,jk) ! Uptake of iron zqfpmax = xqfuncfecp(ji,jj,jk) + ( qfpmax - xqfuncfecp(ji,jj,jk) ) * xlimnpp(ji,jj,jk) zratio = 1.0 - MIN( 1., zratiof / zqfpmax ) @@ -375,7 +366,7 @@ CONTAINS ! size at time step t+1 and is thus updated at the end of the ! current time step. ! -------------------------------------------------------------------- - zlimfac = zprchld(ji,jj,jk) * xlimdias(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) + zlimfac = zprchld(ji,jj,jk) * xlimdias(ji,jj,jk) zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) ) ! Maximum potential uptake rate of nutrients @@ -388,11 +379,11 @@ CONTAINS zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) zpronmaxd(ji,jj,jk) = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpdmin(ji,jj,jk) ) & & / ( xqpdmax(ji,jj,jk) - xqpdmin(ji,jj,jk) + rtrn ), xlimdfe(ji,jj,jk) ) ) - zpronmaxd(ji,jj,jk) = zpronmaxd(ji,jj,jk) * xqndmin(ji,jj,jk) / qnnmin + ! Uptake of phosphorus zratio = 1.0 - MIN( 1., zratiop / (xqpdmax(ji,jj,jk) + rtrn) ) zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) ) - zpropmaxd(ji,jj,jk) = zprnutmax * zmax * xlimdfe(ji,jj,jk) + zpropmaxd(ji,jj,jk) = 2.0 * zprnutmax * zmax * xlimdfe(ji,jj,jk) ! Uptake of iron zqfdmax = xqfuncfecd(ji,jj,jk) + ( qfdmax - xqfuncfecd(ji,jj,jk) ) * xlimnpd(ji,jj,jk) zratio = 1.0 - MIN( 1., zratiof / zqfdmax ) @@ -404,7 +395,7 @@ CONTAINS ENDIF END_3D - ! Production of Chlorophyll. The formulation proposed by Geider et al. + ! Production of Chlorophyll. The formulation proposed by Pahlow and Oschlies ! is adopted here. ! -------------------------------------------------------------------- DO_3D( 0, 0, 0, 0, 1, jpkm1) @@ -414,129 +405,139 @@ CONTAINS zpronewn = zpronmaxn(ji,jj,jk) * xnanono3(ji,jj,jk) zproregn = zpronmaxn(ji,jj,jk) * xnanonh4(ji,jj,jk) znanotot = enanom(ji,jj,jk) / ( zmxl_chl + rtrn ) - zprod = rday * (zpronewn + zproregn) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk) - zprochln = thetannm * zprod / ( zpislopeadn(ji,jj,jk) * znanotot + rtrn ) - zprochln = MAX(zprochln, chlcmin * 12. * zprorcan (ji,jj,jk) ) + zprod1 = ( zprorcan(ji,jj,jk) * texcretn - xpsinh4 * zproregn & + & - xpsino3 * zpronewn ) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) + zprod = zprod1 / ratchl * ( pislopen * znanotot / ( zprmaxn(ji,jj,jk) * rday ) & + & * ( 1.0 - zprchln(ji,jj,jk) ) * MAX(0.0, (1.0 - ratchl * tr(ji,jj,jk,jpnch,Kbb) & + & / ( 12. * tr(ji,jj,jk,jpphy,Kbb) + rtrn ) / (xlimphy(ji,jj,jk) + rtrn ) ) ) & + & - ratchl * zprchln(ji,jj,jk) ) + zprod1 + zprochln = MAX(zprod * tr(ji,jj,jk,jpnch,Kbb) , chlcmin * 12 * zprorcan(ji,jj,jk) ) ! production terms for picophyto. ( chlorophyll ) - zpronewp = zpronmaxp(ji,jj,jk) * xpicono3(ji,jj,jk) + zpronewp = zpronmaxp(ji,jj,jk) * xpicono3(ji,jj,jk) zproregp = zpronmaxp(ji,jj,jk) * xpiconh4(ji,jj,jk) zpicotot = epicom(ji,jj,jk) / ( zmxl_chl + rtrn ) - zprod = rday * (zpronewp + zproregp) * zprchlp(ji,jj,jk) * xlimpic(ji,jj,jk) - zprochlp = thetanpm * zprod / ( zpislopeadp(ji,jj,jk) * zpicotot + rtrn ) - zprochlp = MAX(zprochlp, chlcmin * 12. * zprorcap(ji,jj,jk) ) + zprod1 = ( zprorcap(ji,jj,jk) * texcretp - xpsinh4 * zproregp & + & - xpsino3 * zpronewp ) / ( tr(ji,jj,jk,jppic,Kbb) + rtrn ) + zprod = zprod1 / ratchl * ( pislopep * zpicotot / ( zprmaxp(ji,jj,jk) * rday ) & + & * ( 1.0 - zprchlp(ji,jj,jk) ) * MAX(0.0, (1.0 - ratchl * tr(ji,jj,jk,jppch,Kbb) & + & / ( 12. * tr(ji,jj,jk,jppic,Kbb) + rtrn ) / (xlimpic(ji,jj,jk) + rtrn ) ) ) & + & - ratchl * zprchlp(ji,jj,jk) ) + zprod1 + zprochlp = MAX(zprod * tr(ji,jj,jk,jppch,Kbb) , chlcmin * 12 * zprorcap(ji,jj,jk) ) ! production terms for diatoms ( chlorophyll ) zpronewd = zpronmaxd(ji,jj,jk) * xdiatno3(ji,jj,jk) zproregd = zpronmaxd(ji,jj,jk) * xdiatnh4(ji,jj,jk) zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl + rtrn ) - zprod = rday * (zpronewd + zproregd) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) - zprochld = thetandm * zprod / ( zpislopeadd(ji,jj,jk) * zdiattot + rtrn ) - zprochld = MAX(zprochld, chlcmin * 12. * zprorcad(ji,jj,jk) ) + zprod1 = ( zprorcad(ji,jj,jk) * texcretd - xpsinh4 * zproregd & + & - xpsino3 * zpronewd ) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) + zprod = zprod1 / ratchl * ( pisloped * zdiattot / ( zprmaxd(ji,jj,jk) * rday ) & + & * ( 1.0 - zprchld(ji,jj,jk) ) * MAX(0.0, (1.0 - ratchl * tr(ji,jj,jk,jpdch,Kbb) & + & / ( 12. * tr(ji,jj,jk,jpdia,Kbb) + rtrn ) / (xlimdia(ji,jj,jk) + rtrn ) ) ) & + & - ratchl * zprchld(ji,jj,jk) ) + zprod1 + zprochld = MAX(zprod * tr(ji,jj,jk,jpdch,Kbb) , chlcmin * 12 * zprorcad(ji,jj,jk) ) ! Update the arrays TRA which contain the Chla sources and sinks - tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln * texcretn - tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) + zprochld * texcretd - tr(ji,jj,jk,jppch,Krhs) = tr(ji,jj,jk,jppch,Krhs) + zprochlp * texcretp + tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln + tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) + zprochld + tr(ji,jj,jk,jppch,Krhs) = tr(ji,jj,jk,jppch,Krhs) + zprochlp ENDIF END_3D ! Update the arrays TRA which contain the biological sources and sinks DO_3D( 0, 0, 0, 0, 1, jpkm1) - zpronewn = zpronmaxn(ji,jj,jk) * xnanono3(ji,jj,jk) - zpronewp = zpronmaxp(ji,jj,jk) * xpicono3(ji,jj,jk) - zpronewd = zpronmaxd(ji,jj,jk) * xdiatno3(ji,jj,jk) - ! - zproregn = zpronmaxn(ji,jj,jk) * xnanonh4(ji,jj,jk) - zproregp = zpronmaxp(ji,jj,jk) * xpiconh4(ji,jj,jk) - zproregd = zpronmaxd(ji,jj,jk) * xdiatnh4(ji,jj,jk) - ! - zpropo4n = zpropmaxn(ji,jj,jk) * xnanopo4(ji,jj,jk) - zpropo4p = zpropmaxp(ji,jj,jk) * xpicopo4(ji,jj,jk) - zpropo4d = zpropmaxd(ji,jj,jk) * xdiatpo4(ji,jj,jk) - ! - zprodopn = zpropmaxn(ji,jj,jk) * xnanodop(ji,jj,jk) - zprodopp = zpropmaxp(ji,jj,jk) * xpicodop(ji,jj,jk) - zprodopd = zpropmaxd(ji,jj,jk) * xdiatdop(ji,jj,jk) - ! - zpptot = zpropo4n + zpropo4d + zpropo4p - zpnewtot = zpronewn + zpronewd + zpronewp - zpregtot = zproregn + zproregd + zproregp - - zprontot = zpronewn + zproregn - zproptot = zpronewp + zproregp - zprodtot = zpronewd + zproregd - ! - zproddoc = excretd * zprorcad(ji,jj,jk) & - & + excretn * zprorcan(ji,jj,jk) & - & + excretp * zprorcap(ji,jj,jk) - ! - zproddop = excretd * zpropo4d - texcretd * zprodopd & - & + excretn * zpropo4n - texcretn * zprodopn & - & + excretp * zpropo4p - texcretp * zprodopp - - zproddon = excretd * zprodtot + excretn * zprontot + excretp * zproptot - - zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) -! CE : zrespn/d/p ???? -! zresptot = zrespn(ji,jj,jk) + zrespp(ji,jj,jk) + zrespd(ji,jj,jk) - zresptot = 0._wp - ! - tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpptot - tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot - tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot - ! - tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) & - & + zprorcan(ji,jj,jk) * texcretn & - & - xpsino3 * zpronewn & - & - xpsinh4 * zproregn -! & - zrespn(ji,jj,jk) - - tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) + zprontot * texcretn - tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) + ( zpropo4n + zprodopn ) * texcretn - tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk) * texcretn - - ! - tr(ji,jj,jk,jppic,Krhs) = tr(ji,jj,jk,jppic,Krhs) & - & + zprorcap(ji,jj,jk) * texcretp & - & - xpsino3 * zpronewp & - & - xpsinh4 * zproregp -! & - zrespp(ji,jj,jk) - - tr(ji,jj,jk,jpnpi,Krhs) = tr(ji,jj,jk,jpnpi,Krhs) + zproptot * texcretp - tr(ji,jj,jk,jpppi,Krhs) = tr(ji,jj,jk,jpppi,Krhs) + ( zpropo4p + zprodopp ) * texcretp - tr(ji,jj,jk,jppfe,Krhs) = tr(ji,jj,jk,jppfe,Krhs) + zprofep(ji,jj,jk) * texcretp - - ! - tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) & - & + zprorcad(ji,jj,jk) * texcretd & - & - xpsino3 * zpronewd & - & - xpsinh4 * zproregd -! & - zrespd(ji,jj,jk) - - ! - zprodsil = zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb) - ! - tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) + zprodtot * texcretd - tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) + ( zpropo4d + zprodopd ) * texcretd - tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk) * texcretd - tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprodsil - tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc - tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zproddon - tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zproddop + IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + zpronewn = zpronmaxn(ji,jj,jk) * xnanono3(ji,jj,jk) + zpronewp = zpronmaxp(ji,jj,jk) * xpicono3(ji,jj,jk) + zpronewd = zpronmaxd(ji,jj,jk) * xdiatno3(ji,jj,jk) + ! + zproregn = zpronmaxn(ji,jj,jk) * xnanonh4(ji,jj,jk) + zproregp = zpronmaxp(ji,jj,jk) * xpiconh4(ji,jj,jk) + zproregd = zpronmaxd(ji,jj,jk) * xdiatnh4(ji,jj,jk) + ! + zpropo4n = zpropmaxn(ji,jj,jk) * xnanopo4(ji,jj,jk) + zpropo4p = zpropmaxp(ji,jj,jk) * xpicopo4(ji,jj,jk) + zpropo4d = zpropmaxd(ji,jj,jk) * xdiatpo4(ji,jj,jk) + ! + zprodopn = zpropmaxn(ji,jj,jk) * xnanodop(ji,jj,jk) + zprodopp = zpropmaxp(ji,jj,jk) * xpicodop(ji,jj,jk) + zprodopd = zpropmaxd(ji,jj,jk) * xdiatdop(ji,jj,jk) + ! + zpo4tot = zpropo4n + zpropo4d + zpropo4p + zpnewtot = zpronewn + zpronewd + zpronewp + zpregtot = zproregn + zproregd + zproregp + ! + zpptot = zprorcap(ji,jj,jk) + zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk) + + zprontot = zpronewn + zproregn + zproptot = zpronewp + zproregp + zprodtot = zpronewd + zproregd + ! + zproddoc = excretd * zprorcad(ji,jj,jk) & + & + excretn * zprorcan(ji,jj,jk) & + & + excretp * zprorcap(ji,jj,jk) + ! + zproddop = excretd * zpropo4d - texcretd * zprodopd & + & + excretn * zpropo4n - texcretn * zprodopn & + & + excretp * zpropo4p - texcretp * zprodopp + + zproddon = excretd * zprodtot + excretn * zprontot + excretp * zproptot + + zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) + ! + tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpo4tot + tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot + tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot + ! + tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) & + & + zprorcan(ji,jj,jk) * texcretn & + & - xpsino3 * zpronewn & + & - xpsinh4 * zproregn + + tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) + zprontot * texcretn + tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) + ( zpropo4n + zprodopn ) * texcretn + tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk) * texcretn + + ! + tr(ji,jj,jk,jppic,Krhs) = tr(ji,jj,jk,jppic,Krhs) & + & + zprorcap(ji,jj,jk) * texcretp & + & - xpsino3 * zpronewp & + & - xpsinh4 * zproregp + + tr(ji,jj,jk,jpnpi,Krhs) = tr(ji,jj,jk,jpnpi,Krhs) + zproptot * texcretp + tr(ji,jj,jk,jpppi,Krhs) = tr(ji,jj,jk,jpppi,Krhs) + ( zpropo4p + zprodopp ) * texcretp + tr(ji,jj,jk,jppfe,Krhs) = tr(ji,jj,jk,jppfe,Krhs) + zprofep(ji,jj,jk) * texcretp + + ! + tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) & + & + zprorcad(ji,jj,jk) * texcretd & + & - xpsino3 * zpronewd & + & - xpsinh4 * zproregd + + ! + zprodsil = zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb) + ! + tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) + zprodtot * texcretd + tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) + ( zpropo4d + zprodopd ) * texcretd + tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk) * texcretd + tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprodsil + tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc + tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zproddon + tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zproddop - tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) & - & + o2ut * zpregtot + ( o2ut + o2nit ) * zpnewtot - o2ut * zresptot + tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) & + & + o2ut * zpregtot + ( o2ut + o2nit ) * zpnewtot - tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer - consfe3(ji,jj,jk) = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) & - & * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2 - tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - zprodsil + tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer + consfe3(ji,jj,jk) = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) & + & * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2 + tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - zprodsil - tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot & - & + xpsino3 * zpronewn + xpsinh4 * zproregn & - & + xpsino3 * zpronewp + xpsinh4 * zproregp & - & + xpsino3 * zpronewd + xpsinh4 * zproregd + tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot & + & + xpsino3 * zpronewn + xpsinh4 * zproregn & + & + xpsino3 * zpronewp + xpsinh4 * zproregp & + & + xpsino3 * zpronewd + xpsinh4 * zproregd - tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot ) - ! + tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot ) + ! + ENDIF END_3D ! Production and uptake of ligands by phytoplankton. This part is activated @@ -546,11 +547,13 @@ CONTAINS ! ------------------------------------------------------------------------- IF( ln_ligand ) THEN DO_3D( 0, 0, 0, 0, 1, jpkm1) - zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) + excretp * zprorcap(ji,jj,jk) - zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) - zprodlig = plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet - ! - tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zproddoc * ldocp - zprodfer * zprodlig + IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN + zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) + excretp * zprorcap(ji,jj,jk) + zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) + zprodlig = plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet + ! + tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zproddoc * ldocp - zprodfer * zprodlig + ENDIF END_3D ENDIF @@ -559,7 +562,11 @@ CONTAINS IF( l_dia_ppphy .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc ) ) THEN ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp DO_3D( 0, 0, 0, 0, 1, jpkm1) - zw3d(ji,jj,jk) = ( zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk) + zprorcap(ji,jj,jk) ) * cvol(ji,jj,jk) + zw3d(ji,jj,jk) = ( zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk) + zprorcap(ji,jj,jk) & + & - zpronmaxn(ji,jj,jk) * ( xpsino3 * xnanono3(ji,jj,jk) + xpsinh4 * xnanonh4(ji,jj,jk) ) & + & - zpronmaxd(ji,jj,jk) * ( xpsino3 * xdiatno3(ji,jj,jk) + xpsinh4 * xdiatnh4(ji,jj,jk) ) & + & - zpronmaxp(ji,jj,jk) * ( xpsino3 * xpicono3(ji,jj,jk) + xpsinh4 * xpiconh4(ji,jj,jk) ) ) & + & * cvol(ji,jj,jk) END_3D tpp = glob_sum( 'p5zprod', zw3d ) DEALLOCATE ( zw3d ) @@ -571,22 +578,46 @@ CONTAINS zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp ! primary production by nanophyto - zw3d(A2D(0),1:jpkm1) = zprorcan(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) + zw3d(A2D(0),1:jpkm1) = (zprorcan(A2D(0),1:jpkm1) - xpsinh4 * zpronmaxn(A2D(0),1:jpkm1) * xnanonh4(A2D(0),1:jpkm1) & + & - xpsino3 * zpronmaxn(A2D(0),1:jpkm1) * xnanono3(A2D(0),1:jpkm1) ) & + & * zfact * tmask(A2D(0),1:jpkm1) CALL iom_put( "PPPHYN", zw3d ) - ! primary production by diatomes - zw3d(A2D(0),1:jpkm1) = zprorcad(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) + ! primary production by diatoms + zw3d(A2D(0),1:jpkm1) = (zprorcad(A2D(0),1:jpkm1) - xpsinh4 * zpronmaxd(A2D(0),1:jpkm1) * xdiatnh4(A2D(0),1:jpkm1) & + & - xpsino3 * zpronmaxd(A2D(0),1:jpkm1) * xdiatno3(A2D(0),1:jpkm1) ) & + & * zfact * tmask(A2D(0),1:jpkm1) CALL iom_put( "PPPHYD", zw3d ) ! primary production by pico - zw3d(A2D(0),1:jpkm1) = zprorcap(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) + zw3d(A2D(0),1:jpkm1) = (zprorcap(A2D(0),1:jpkm1) - xpsinh4 * zpronmaxp(A2D(0),1:jpkm1) * xpiconh4(A2D(0),1:jpkm1) & + & - xpsino3 * zpronmaxp(A2D(0),1:jpkm1) * xpicono3(A2D(0),1:jpkm1) ) & + & * zfact * tmask(A2D(0),1:jpkm1) CALL iom_put( "PPPHYP", zw3d ) ! total primary production - zw3d(A2D(0),1:jpkm1) = ( zprorcan(A2D(0),1:jpkm1) + zprorcad(A2D(0),1:jpkm1) + zprorcap(A2D(0),1:jpkm1) ) & + zw3d(A2D(0),1:jpkm1) = ( zprorcan(A2D(0),1:jpkm1) + zprorcad(A2D(0),1:jpkm1) + zprorcap(A2D(0),1:jpkm1) & + & - zpronmaxn(A2D(0),1:jpkm1) * ( xpsino3 * xnanono3(A2D(0),1:jpkm1) + xpsinh4 * xnanonh4(A2D(0),1:jpkm1) ) & + & - zpronmaxd(A2D(0),1:jpkm1) * ( xpsino3 * xdiatno3(A2D(0),1:jpkm1) + xpsinh4 * xdiatnh4(A2D(0),1:jpkm1) ) & + & - zpronmaxp(A2D(0),1:jpkm1) * ( xpsino3 * xpicono3(A2D(0),1:jpkm1) + xpsinh4 * xpiconh4(A2D(0),1:jpkm1) ) ) & & * zfact * tmask(A2D(0),1:jpkm1) CALL iom_put( "TPP", zw3d ) CALL iom_put( "tintpp" , tpp * zfact ) ! global total integrated primary production molC/s DEALLOCATE ( zw3d ) ENDIF ! + IF( l_dia_gpphy ) THEN + zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s + ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp + ! primary production by nanophyto + zw3d(A2D(0),1:jpkm1) = zprorcan(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) + CALL iom_put( "GPPHYN", zw3d ) + ! primary production by diatoms + zw3d(A2D(0),1:jpkm1) = zprorcad(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) + CALL iom_put( "GPPHYD", zw3d ) + ! primary production by pico + zw3d(A2D(0),1:jpkm1) = zprorcap(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) + CALL iom_put( "GPPHYP", zw3d ) + DEALLOCATE ( zw3d ) + ENDIF + ! IF( l_dia_ppnew ) THEN zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp @@ -690,7 +721,6 @@ CONTAINS ENDIF ! ENDIF - IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) WRITE(charout, FMT="('prod')") CALL prt_ctl_info( charout, cdcomp = 'top' ) @@ -716,7 +746,7 @@ CONTAINS INTEGER :: ios ! Local integer output status for namelist read !! NAMELIST/namp5zprod/ pislopen, pislopep, pisloped, excretn, excretp, excretd, & - & thetannm, thetanpm, thetandm, chlcmin, grosip, bresp, xadap + & chlcmin, grosip, bresp !!---------------------------------------------------------------------- READ ( numnatp_ref, namp5zprod, IOSTAT = ios, ERR = 901) @@ -734,15 +764,11 @@ CONTAINS WRITE(numout,*) ' P-I slope pislopen =', pislopen WRITE(numout,*) ' P-I slope for diatoms pisloped =', pisloped WRITE(numout,*) ' P-I slope for picophytoplankton pislopep =', pislopep - WRITE(numout,*) ' Acclimation factor to low light xadap =', xadap WRITE(numout,*) ' excretion ratio of nanophytoplankton excretn =', excretn WRITE(numout,*) ' excretion ratio of picophytoplankton excretp =', excretp WRITE(numout,*) ' excretion ratio of diatoms excretd =', excretd WRITE(numout,*) ' basal respiration in phytoplankton bresp =', bresp WRITE(numout,*) ' Maximum Chl/C in phytoplankton chlcmin =', chlcmin - WRITE(numout,*) ' Minimum Chl/N in nanophytoplankton thetannm =', thetannm - WRITE(numout,*) ' Minimum Chl/N in picophytoplankton thetanpm =', thetanpm - WRITE(numout,*) ' Minimum Chl/N in diatoms thetandm =', thetandm ENDIF ! r1_rday = 1._wp / rday diff --git a/src/TOP/PISCES/SED/sedadv.F90 b/src/TOP/PISCES/SED/sedadv.F90 index 53652ed621adb73352e004bf5608e5302fe59fe8..51e9c9948739401187c2936acf989795969cf1d2 100644 --- a/src/TOP/PISCES/SED/sedadv.F90 +++ b/src/TOP/PISCES/SED/sedadv.F90 @@ -150,8 +150,8 @@ CONTAINS END DO DO jk = 2, jpksed pwcp(:,jk,jwnh4) = (pwcp(:,jk,jwnh4) + zsolcp(:,jk,jpsol+1) * por1(jk) / por(jk) ) * radssol(jk,jwnh4) - IF (jpoce == 146 .and. slatit(145) > 0.) write(0,*) 'plante advection ',pwcp(145,jk,jwfe2)*1E6,zsolcp(145,jk,jpsol+2)*1E6, & - & (pwcp(145,jk,jwfe2) + zsolcp(145,jk,jpsol+2) * por1(jk) / por(jk) ) * radssol(jk,jwfe2) * 1E6 +! IF (jpoce == 146 .and. slatit(145) > 0.) write(0,*) 'plante advection ',pwcp(145,jk,jwfe2)*1E6,zsolcp(145,jk,jpsol+2)*1E6, & +! & (pwcp(145,jk,jwfe2) + zsolcp(145,jk,jpsol+2) * por1(jk) / por(jk) ) * radssol(jk,jwfe2) * 1E6 pwcp(:,jk,jwfe2) = (pwcp(:,jk,jwfe2) + zsolcp(:,jk,jpsol+2) * por1(jk) / por(jk) ) * radssol(jk,jwfe2) END DO diff --git a/src/TOP/PISCES/sms_pisces.F90 b/src/TOP/PISCES/sms_pisces.F90 index e4862e94983ae2c3e7157d98e0bf86a5fc69529b..0e1ef4c4a5c2cf2d68e7afb6dfcffb3c74491829 100644 --- a/src/TOP/PISCES/sms_pisces.F90 +++ b/src/TOP/PISCES/sms_pisces.F90 @@ -17,7 +17,7 @@ MODULE sms_pisces INTEGER :: numonp = -1 !! Logical unit for namelist pisces output !!* Model used - LOGICAL :: ln_p2z !: Flag to use LOBSTER model + LOGICAL :: ln_p2z !: Flag to use PISCES reduced model LOGICAL :: ln_p4z !: Flag to use PISCES model LOGICAL :: ln_p5z !: Flag to use PISCES quota model LOGICAL :: ln_ligand !: Flag to enable organic ligands @@ -106,6 +106,7 @@ MODULE sms_pisces REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sizena !: size of nanophytoplankton, after REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sizepa !: size of picophyto, after REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sizeda !: size of diatomss, after + REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: thetanano !: size of diatomss, after REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xfecolagg !: Refractory diagnostic concentration of ligands REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcoagfe !: Coagulation rate of colloidal Fe/ligands @@ -138,56 +139,69 @@ CONTAINS !! *** ROUTINE sms_pisces_alloc *** !!---------------------------------------------------------------------- USE lib_mpp , ONLY: ctl_stop - INTEGER :: ierr(11) ! Local variables + INTEGER :: ierr(17) ! Local variables !!---------------------------------------------------------------------- ierr(:) = 0 !* Biological fluxes for light : shared variables for pisces & lobster - ALLOCATE( xksi(A2D(0)), strn(A2D(0)), STAT=ierr(1) ) + ALLOCATE( strn(A2D(0)), STAT=ierr(1) ) + + !* Optics + ALLOCATE( enano(A2D(0),jpk) , enanom(A2D(0),jpk) , & + & emoy(A2D(0),jpk) , etotm(A2D(0),jpk) , STAT=ierr(2) ) + + ! Biological SMS + ALLOCATE( orem (A2D(0),jpk), xdiss (A2D(0),jpk), & + & nitrfac (A2D(0),jpk), nitrfac2(A2D(0),jpk), & + & prodcal (A2D(0),jpk), prodpoc (A2D(0),jpk), & + & conspoc (A2D(0),jpk), xfracal (A2D(0),jpk), STAT=ierr(3) ) + + !* Carbonate chemistry + ALLOCATE( ak13(A2D(0),jpk), & + & ak23(A2D(0),jpk), aksp (A2D(0),jpk) , & + & hi (A2D(0),jpk), excess(A2D(0),jpk) , & + & aphscale(A2D(0),jpk), STAT=ierr(4) ) + ! + !* Temperature dependency of SMS terms + ALLOCATE( tgfunc (A2D(0),jpk) , tgfunc2(A2D(0),jpk), STAT=ierr(5) ) + ! + !* Sinking speed + ALLOCATE( wsbio3 (A2D(0),jpk) , wsbio4 (A2D(0),jpk), STAT=ierr(6) ) - IF( ln_p4z .OR. ln_p5z ) THEN + !* Size of phytoplankton cells + ALLOCATE( sizen (A2D(0),jpk), sizena(A2D(0),jpk), STAT=ierr(7) ) + + ALLOCATE( blim (A2D(0),jpk), consfe3 (A2D(0),jpk), & + & xfecolagg(A2D(0),jpk), xcoagfe (A2D(0),jpk), STAT=ierr(8) ) + ! + ALLOCATE( plig(A2D(0),jpk) , biron(A2D(0),jpk) , STAT=ierr(9) ) + IF( ln_p2z ) & + & ALLOCATE( thetanano (A2D(0),jpk), STAT=ierr(10) ) + + IF( ln_p4z .OR. ln_p5z ) THEN !* Optics - ALLOCATE( enano(A2D(0),jpk) , ediat(A2D(0),jpk) , & - & enanom(A2D(0),jpk), ediatm(A2D(0),jpk), & - & emoy(A2D(0),jpk) , etotm(A2D(0),jpk), STAT=ierr(2) ) + ALLOCATE( ediat(A2D(0),jpk) , ediatm(A2D(0),jpk), STAT=ierr(11) ) !* Biological SMS - ALLOCATE( xksimax(A2D(0)) , biron(A2D(0),jpk) , STAT=ierr(3) ) + ALLOCATE( xksimax(A2D(0)) , STAT=ierr(12) ) ! Biological SMS - ALLOCATE( xfracal (A2D(0),jpk), orem (A2D(0),jpk), & - & nitrfac (A2D(0),jpk), nitrfac2(A2D(0),jpk), & - & prodcal (A2D(0),jpk), xdiss (A2D(0),jpk), & - & prodpoc (A2D(0),jpk), conspoc (A2D(0),jpk), & - & prodgoc (A2D(0),jpk), consgoc (A2D(0),jpk), & - & blim (A2D(0),jpk), consfe3 (A2D(0),jpk), & - & xfecolagg(A2D(0),jpk), xcoagfe (A2D(0),jpk), STAT=ierr(4) ) - - !* Carbonate chemistry - ALLOCATE( ak13(A2D(0),jpk), & - & ak23(A2D(0),jpk), aksp (A2D(0),jpk) , & - & hi (A2D(0),jpk), excess(A2D(0),jpk) , & - & aphscale(A2D(0),jpk), STAT=ierr(5) ) - ! - !* Temperature dependency of SMS terms - ALLOCATE( tgfunc (A2D(0),jpk) , tgfunc2(A2D(0),jpk), STAT=ierr(6) ) + ALLOCATE( prodgoc(A2D(0),jpk), consgoc(A2D(0),jpk), STAT=ierr(13) ) ! - !* Sinking speed - ALLOCATE( wsbio3 (A2D(0),jpk) , wsbio4 (A2D(0),jpk), STAT=ierr(7) ) + !* Si 1/2 saturation constant + ALLOCATE( xksi (A2D(0)) , STAT=ierr(14) ) !* Size of phytoplankton cells - ALLOCATE( sizen (A2D(0),jpk), sized (A2D(0),jpk), & - & sizena(A2D(0),jpk), sizeda(A2D(0),jpk), STAT=ierr(8) ) + ALLOCATE( sized (A2D(0),jpk), sizeda(A2D(0),jpk), STAT=ierr(15) ) ! - ALLOCATE( plig(A2D(0),jpk) , STAT=ierr(9) ) ENDIF ! IF( ln_p5z ) THEN ! PISCES-QUOTA specific part - ALLOCATE( epico(A2D(0),jpk) , epicom(A2D(0),jpk) , STAT=ierr(10) ) + ALLOCATE( epico(A2D(0),jpk) , epicom(A2D(0),jpk), STAT=ierr(16) ) !* Size of phytoplankton cells - ALLOCATE( sizep(A2D(0),jpk), sizepa(A2D(0),jpk), STAT=ierr(11) ) + ALLOCATE( sizep(A2D(0),jpk), sizepa(A2D(0),jpk), STAT=ierr(17) ) ENDIF ! sms_pisces_alloc = MAXVAL( ierr ) diff --git a/src/TOP/PISCES/trcice_pisces.F90 b/src/TOP/PISCES/trcice_pisces.F90 index 06e458a54852ae81a83dc6da4f26c0d7d9c97b60..a444dea63a0c18c25ba5dc43ad063d7232f4baaa 100644 --- a/src/TOP/PISCES/trcice_pisces.F90 +++ b/src/TOP/PISCES/trcice_pisces.F90 @@ -35,9 +35,7 @@ CONTAINS !! ** Purpose : Initialisation of the PISCES biochemical model !!---------------------------------------------------------------------- ! - IF( ln_p4z .OR. ln_p5z ) THEN ; CALL p4z_ice_ini ! PISCES - ELSE ; CALL p2z_ice_ini ! LOBSTER - ENDIF + CALL p4z_ice_ini ! PISCES ! END SUBROUTINE trc_ice_ini_pisces @@ -341,14 +339,5 @@ CONTAINS ! END SUBROUTINE p4z_ice_ini - SUBROUTINE p2z_ice_ini - !!---------------------------------------------------------------------- - !! *** ROUTINE p2z_ice_ini *** - !! - !! ** Purpose : Initialisation of the LOBSTER biochemical model - !!---------------------------------------------------------------------- - END SUBROUTINE p2z_ice_ini - - !!====================================================================== END MODULE trcice_pisces diff --git a/src/TOP/PISCES/trcini_pisces.F90 b/src/TOP/PISCES/trcini_pisces.F90 index eaaac7e2cd486fab3aad2498f24796ce0256ae64..6404915d4e5182725772682399f96011ace51447 100644 --- a/src/TOP/PISCES/trcini_pisces.F90 +++ b/src/TOP/PISCES/trcini_pisces.F90 @@ -44,9 +44,7 @@ CONTAINS ! Read the PISCES namelist CALL trc_nam_pisces ! - IF( ln_p4z .OR. ln_p5z ) THEN ; CALL p4z_ini( Kmm ) ! PISCES - ELSE ; CALL p2z_ini( Kmm ) ! LOBSTER - ENDIF + CALL p4z_ini( Kmm ) ! PISCES END SUBROUTINE trc_ini_pisces @@ -61,10 +59,13 @@ CONTAINS USE p4zche ! Chemical model USE p4zsink ! vertical flux of particulate matter due to sinking USE p4zopt ! optical model - USE p4zbc ! Boundary conditions + USE p4zbc ! Boundary conditions USE p4zfechem ! Iron chemistry USE p4zrem ! Remineralisation of organic matter USE p4zflx ! Gas exchange + USE p2zlim ! Nutrient limitation of phytoplankton + USE p2zmort ! Mortality terms for phytoplankton + USE p2zprod ! Growth rate of phytoplankton USE p4zlim ! Co-limitations of differents nutrients USE p4zprod ! Growth rate of the 2 phyto groups USE p4zmicro ! Sources and sinks of microzooplankton @@ -79,6 +80,7 @@ CONTAINS USE p5zmicro ! Sources and sinks of microzooplankton (QUOTA) USE p5zmeso ! Sources and sinks of mesozooplankton (QUOTA) USE p5zmort ! Mortality terms for phytoplankton (QUOTA) + USE p2zmicro ! Sources and sinks of microzooplankton (REDUCED) ! INTEGER, INTENT(in) :: Kmm ! time level indices ! @@ -91,9 +93,12 @@ CONTAINS ! IF(lwp) THEN WRITE(numout,*) - IF( ln_p4z ) THEN + IF( ln_p2z ) THEN + WRITE(numout,*) 'p2z_ini : PISCES biochemical model initialisation' + WRITE(numout,*) '~~~~~~~ Reduced version' + ELSE IF( ln_p4z ) THEN WRITE(numout,*) 'p4z_ini : PISCES biochemical model initialisation' - WRITE(numout,*) '~~~~~~~' + WRITE(numout,*) '~~~~~~~ Operationnal version' ELSE WRITE(numout,*) 'p5z_ini : PISCES biochemical model initialisation' WRITE(numout,*) '~~~~~~~ With variable stoichiometry' @@ -115,13 +120,19 @@ CONTAINS ierr = ierr + p4z_opt_alloc() ierr = ierr + p4z_flx_alloc() ierr = ierr + p4z_sed_alloc() - ierr = ierr + p4z_lim_alloc() + ierr = ierr + p2z_lim_alloc() + IF( ln_p2z ) THEN + ierr = ierr + p2z_prod_alloc() + ENDIF IF( ln_p4z ) THEN ! PISCES part + ierr = ierr + p4z_lim_alloc() ierr = ierr + p4z_prod_alloc() ierr = ierr + p4z_meso_alloc() - ELSE + ENDIF + IF( ln_p5z ) THEN ! PISCES-QUOTA part + ierr = ierr + p4z_lim_alloc() ierr = ierr + p5z_lim_alloc() ierr = ierr + p5z_meso_alloc() ENDIF @@ -203,26 +214,28 @@ CONTAINS tr(:,:,:,jpdoc,Kmm) = bioma0 tr(:,:,:,jptal,Kmm) = alka0 tr(:,:,:,jpoxy,Kmm) = oxyg0 - tr(:,:,:,jpcal,Kmm) = bioma0 - tr(:,:,:,jppo4,Kmm) = po4 / po4r - tr(:,:,:,jppoc,Kmm) = bioma0 - tr(:,:,:,jpgoc,Kmm) = bioma0 - tr(:,:,:,jpbfe,Kmm) = bioma0 * 5.e-6 - tr(:,:,:,jpsil,Kmm) = silic1 - tr(:,:,:,jpdsi,Kmm) = bioma0 * 0.15 - tr(:,:,:,jpgsi,Kmm) = bioma0 * 5.e-6 + tr(:,:,:,jpno3,Kmm) = no3 tr(:,:,:,jpphy,Kmm) = bioma0 - tr(:,:,:,jpdia,Kmm) = bioma0 tr(:,:,:,jpzoo,Kmm) = bioma0 - tr(:,:,:,jpmes,Kmm) = bioma0 + tr(:,:,:,jppoc,Kmm) = bioma0 tr(:,:,:,jpfer,Kmm) = 0.6E-9 - tr(:,:,:,jpsfe,Kmm) = bioma0 * 5.e-6 - tr(:,:,:,jpdfe,Kmm) = bioma0 * 5.e-6 - tr(:,:,:,jpnfe,Kmm) = bioma0 * 5.e-6 - tr(:,:,:,jpnch,Kmm) = bioma0 * 12. / 55. - tr(:,:,:,jpdch,Kmm) = bioma0 * 12. / 55. - tr(:,:,:,jpno3,Kmm) = no3 - tr(:,:,:,jpnh4,Kmm) = bioma0 + IF( .NOT. ln_p2z ) THEN + tr(:,:,:,jppo4,Kmm) = po4 / po4r + tr(:,:,:,jpgoc,Kmm) = bioma0 + tr(:,:,:,jpbfe,Kmm) = bioma0 * 5.e-6 + tr(:,:,:,jpsil,Kmm) = silic1 + tr(:,:,:,jpdsi,Kmm) = bioma0 * 0.15 + tr(:,:,:,jpgsi,Kmm) = bioma0 * 5.e-6 + tr(:,:,:,jpdia,Kmm) = bioma0 + tr(:,:,:,jpmes,Kmm) = bioma0 + tr(:,:,:,jpsfe,Kmm) = bioma0 * 5.e-6 + tr(:,:,:,jpdfe,Kmm) = bioma0 * 5.e-6 + tr(:,:,:,jpnfe,Kmm) = bioma0 * 5.e-6 + tr(:,:,:,jpnch,Kmm) = bioma0 * 12. / 55. + tr(:,:,:,jpdch,Kmm) = bioma0 * 12. / 55. + tr(:,:,:,jpnh4,Kmm) = bioma0 + tr(:,:,:,jpcal,Kmm) = bioma0 + ENDIF IF( ln_ligand) THEN tr(:,:,:,jplgw,Kmm) = 0.6E-9 ENDIF @@ -245,13 +258,17 @@ CONTAINS ENDIF ! initialize the half saturation constant for silicate ! ---------------------------------------------------- - xksi(:,:) = 2.e-6 - xksimax(:,:) = xksi(:,:) + sizen(:,:,:) = 1.0 consfe3(:,:,:) = 0._wp - ! - sized(:,:,:) = 1.0 - sizen(:,:,:) = 1.0 - IF( ln_p5z ) sizep(:,:,:) = 1.0 + IF ( .NOT. ln_p2z ) THEN + xksi(:,:) = 2.e-6 + xksimax(:,:) = xksi(:,:) + ! + sized(:,:,:) = 1.0 + IF( ln_p5z ) sizep(:,:,:) = 1.0 + ENDIF + + IF( ln_p2z ) thetanano(:,:,:) = 1.0 / 55.0 END IF @@ -260,7 +277,11 @@ CONTAINS ! ---------------------------------------------- CALL p4z_sink_init ! vertical flux of particulate organic matter CALL p4z_opt_init ! Optic: PAR in the water column - IF( ln_p4z ) THEN + IF( ln_p2z ) THEN + ! Reduced PISCES part + CALL p2z_lim_init ! co-limitations by the various nutrients + CALL p2z_prod_init ! phytoplankton growth rate over the global ocean. + ELSE IF( ln_p4z ) THEN ! PISCES part CALL p4z_lim_init ! co-limitations by the various nutrients CALL p4z_prod_init ! phytoplankton growth rate over the global ocean. @@ -276,7 +297,10 @@ CONTAINS IF( ln_ligand ) & & CALL p4z_ligand_init ! remineralisation of organic ligands - IF( ln_p4z ) THEN ! PISCES-std + IF( ln_p2z ) THEN ! PISCES-reduced + CALL p2z_mort_init ! phytoplankton mortality + CALL p2z_micro_init ! microzooplankton + ELSE IF( ln_p4z ) THEN ! PISCES-std CALL p4z_mort_init ! phytoplankton mortality CALL p4z_micro_init ! microzooplankton CALL p4z_meso_init ! mesozooplankton @@ -301,78 +325,5 @@ CONTAINS ! END SUBROUTINE p4z_ini - - SUBROUTINE p2z_ini( Kmm ) - !!---------------------------------------------------------------------- - !! *** ROUTINE p2z_ini *** - !! - !! ** Purpose : Initialisation of the LOBSTER biochemical model - !!---------------------------------------------------------------------- - ! - USE p2zopt - USE p2zexp - USE p2zbio - USE p2zsed - ! - INTEGER, INTENT(in) :: Kmm ! time level indices - INTEGER :: ji, jj, jk, jn, ierr - CHARACTER(len = 10) :: cltra - !!---------------------------------------------------------------------- - - IF(lwp) WRITE(numout,*) - IF(lwp) WRITE(numout,*) ' p2z_ini : LOBSTER biochemical model initialisation' - IF(lwp) WRITE(numout,*) ' ~~~~~~~' - - ierr = sms_pisces_alloc() - ierr = ierr + p2z_exp_alloc() - ! - CALL mpp_sum( 'trcini_pisces', ierr ) - IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'p2z_ini: unable to allocate LOBSTER arrays' ) - - DO jn = 1, jptra - cltra = ctrcnm(jn) - IF( cltra == 'DET' ) jpdet = jn !: detritus [mmoleN/m3] - IF( cltra == 'ZOO' ) jpzoo = jn !: zooplancton concentration [mmoleN/m3] - IF( cltra == 'PHY' ) jpphy = jn !: phytoplancton concentration [mmoleN/m3] - IF( cltra == 'NO3' ) jpno3 = jn !: nitrate concentration [mmoleN/m3] - IF( cltra == 'NH4' ) jpnh4 = jn !: ammonium concentration [mmoleN/m3] - IF( cltra == 'DOM' ) jpdom = jn !: dissolved organic matter [mmoleN/m3] - ENDDO - - jpkb = 10 ! last level where depth less than 200 m - DO jk = jpkm1, 1, -1 - IF( gdept_1d(jk) > 200. ) jpkb = jk - END DO - IF (lwp) WRITE(numout,*) - IF (lwp) WRITE(numout,*) ' first vertical layers where biology is active (200m depth ) ', jpkb - IF (lwp) WRITE(numout,*) - jpkbm1 = jpkb - 1 - ! - - - ! LOBSTER initialisation for GYRE : init NO3=f(density) by asklod AS Kremeur 2005-07 - ! ---------------------- - IF( .NOT. ln_rsttr ) THEN ! in case of no restart - tr(:,:,:,jpdet,Kmm) = 0.1 * tmask(:,:,:) - tr(:,:,:,jpzoo,Kmm) = 0.1 * tmask(:,:,:) - tr(:,:,:,jpnh4,Kmm) = 0.1 * tmask(:,:,:) - tr(:,:,:,jpphy,Kmm) = 0.1 * tmask(:,:,:) - tr(:,:,:,jpdom,Kmm) = 1.0 * tmask(:,:,:) - WHERE( rhd(:,:,:) <= 24.5e-3 ) ; tr(:,:,:,jpno3,Kmm) = 2._wp * tmask(:,:,:) - ELSE WHERE ; tr(:,:,:,jpno3,Kmm) = ( 15.55 * ( rhd(:,:,:) * 1000. ) - 380.11 ) * tmask(:,:,:) - END WHERE - ENDIF - ! ! Namelist read - CALL p2z_opt_init ! Optics parameters - CALL p2z_sed_init ! sedimentation - CALL p2z_bio_init ! biology - CALL p2z_exp_init( Kmm ) ! export - ! - IF(lwp) WRITE(numout,*) - IF(lwp) WRITE(numout,*) ' ==>>> Initialization of LOBSTER tracers done' - IF(lwp) WRITE(numout,*) - ! - END SUBROUTINE p2z_ini - !!====================================================================== END MODULE trcini_pisces diff --git a/src/TOP/PISCES/trcnam_pisces.F90 b/src/TOP/PISCES/trcnam_pisces.F90 index 4954e84971efcb350fc4ad1ebcf4850869a30284..11aff9dac75de6d9e83973fc2a6463b1071da352 100644 --- a/src/TOP/PISCES/trcnam_pisces.F90 +++ b/src/TOP/PISCES/trcnam_pisces.F90 @@ -62,7 +62,7 @@ CONTAINS ! IF(lwp) THEN ! control print WRITE(numout,*) ' Namelist : nampismod ' - WRITE(numout,*) ' Flag to use LOBSTER model ln_p2z = ', ln_p2z + WRITE(numout,*) ' Flag to use PISCES reduced model ln_p2z = ', ln_p2z WRITE(numout,*) ' Flag to use PISCES standard model ln_p4z = ', ln_p4z WRITE(numout,*) ' Flag to use PISCES quota model ln_p5z = ', ln_p5z WRITE(numout,*) ' Flag to ligand ln_ligand = ', ln_ligand @@ -73,8 +73,8 @@ CONTAINS WRITE(numout,*) IF( ln_p5z ) WRITE(numout,*) ' ==>>> PISCES QUOTA model is used' IF( ln_p4z ) WRITE(numout,*) ' ==>>> PISCES STANDARD model is used' - IF( ln_p2z ) WRITE(numout,*) ' ==>>> LOBSTER model is used' - IF( ln_ligand ) WRITE(numout,*) ' ==>>> Compute remineralization/dissolution of organic ligands' + IF( ln_p2z ) WRITE(numout,*) ' ==>>> PISCES REDUCED model is used' + IF( ln_ligand ) WRITE(numout,*) ' ==>>> Compute remineralization/dissolution of organic ligands' IF( ln_sediment ) WRITE(numout,*) ' ==>>> Sediment module is used' ENDIF diff --git a/src/TOP/PISCES/trcsms_pisces.F90 b/src/TOP/PISCES/trcsms_pisces.F90 index 8015dbfd91db8deff2ec608dc9b1d33b97f0a634..2cf745c33539d459ed705baf7c513c8c059d3fed 100644 --- a/src/TOP/PISCES/trcsms_pisces.F90 +++ b/src/TOP/PISCES/trcsms_pisces.F90 @@ -12,7 +12,6 @@ MODULE trcsms_pisces USE par_pisces USE sms_pisces USE p4zsms - USE p2zsms IMPLICIT NONE PRIVATE @@ -38,10 +37,7 @@ CONTAINS INTEGER, INTENT( in ) :: Kbb, Kmm, Krhs ! time level index !!--------------------------------------------------------------------- ! - IF( ln_p4z .OR. ln_p5z ) THEN ; CALL p4z_sms( kt, Kbb, Kmm, Krhs ) ! PISCES - ELSE ; CALL p2z_sms( kt, Kmm, Krhs ) ! LOBSTER - ENDIF - + CALL p4z_sms( kt, Kbb, Kmm, Krhs ) ! PISCES ! END SUBROUTINE trc_sms_pisces diff --git a/src/TOP/PISCES/trcwri_pisces.F90 b/src/TOP/PISCES/trcwri_pisces.F90 index d44b7b11eaa800b2cb374084b3cd80f5dae4fb93..eddb77d9548e04c6b4921b13d69256b6dde691bf 100644 --- a/src/TOP/PISCES/trcwri_pisces.F90 +++ b/src/TOP/PISCES/trcwri_pisces.F90 @@ -43,49 +43,42 @@ CONTAINS ! write the tracer concentrations in the file ! --------------------------------------- - IF( ln_p2z ) THEN - DO jn = jp_pcs0, jp_pcs1 - cltra = TRIM( ctrcnm(jn) ) ! short title for tracer - CALL iom_put( cltra, tr(:,:,:,jn,Kmm) ) - END DO - ELSE - DO jn = jp_pcs0, jp_pcs1 - zfact = 1.0e+6 - IF( jn == jpno3 .OR. jn == jpnh4 ) zfact = rno3 * 1.0e+6 - IF( jn == jppo4 ) zfact = po4r * 1.0e+6 - cltra = TRIM( ctrcnm(jn) ) ! short title for tracer - IF( iom_use( cltra ) ) CALL iom_put( cltra, tr(:,:,:,jn,Kmm) * zfact ) - END DO + DO jn = jp_pcs0, jp_pcs1 + zfact = 1.0e+6 + IF( jn == jpno3 .OR. jn == jpnh4 ) zfact = rno3 * 1.0e+6 + IF( jn == jppo4 ) zfact = po4r * 1.0e+6 + cltra = TRIM( ctrcnm(jn) ) ! short title for tracer + IF( iom_use( cltra ) ) CALL iom_put( cltra, tr(:,:,:,jn,Kmm) * zfact ) + END DO - IF( iom_use( "INTDIC" ) ) THEN ! DIC content in kg/m2 - zdic(:,:) = 0. - DO jk = 1, jpkm1 - DO_2D( 0, 0, 0, 0 ) - zdic(ji,jj) = zdic(ji,jj) + tr(ji,jj,jk,jpdic,Kmm) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * 12. - END_2D - ENDDO - CALL iom_put( 'INTDIC', zdic ) - ENDIF - ! - IF( iom_use( "O2MIN" ) .OR. iom_use ( "ZO2MIN" ) ) THEN ! Oxygen minimum concentration and depth + IF( iom_use( "INTDIC" ) ) THEN ! DIC content in kg/m2 + zdic(:,:) = 0. + DO jk = 1, jpkm1 DO_2D( 0, 0, 0, 0 ) - zo2min (ji,jj) = tr(ji,jj,1,jpoxy,Kmm) * tmask(ji,jj,1) - zdepo2min(ji,jj) = gdepw(ji,jj,1,Kmm) * tmask(ji,jj,1) + zdic(ji,jj) = zdic(ji,jj) + tr(ji,jj,jk,jpdic,Kmm) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * 12. END_2D - DO_3D( 0, 0, 0, 0, 2, jpkm1 ) - IF( tmask(ji,jj,jk) == 1 ) then - IF( tr(ji,jj,jk,jpoxy,Kmm) < zo2min(ji,jj) ) then - zo2min (ji,jj) = tr(ji,jj,jk,jpoxy,Kmm) - zdepo2min(ji,jj) = gdepw(ji,jj,jk,Kmm) - ENDIF + ENDDO + CALL iom_put( 'INTDIC', zdic ) + ENDIF + ! + IF( iom_use( "O2MIN" ) .OR. iom_use ( "ZO2MIN" ) ) THEN ! Oxygen minimum concentration and depth + DO_2D( 0, 0, 0, 0 ) + zo2min (ji,jj) = tr(ji,jj,1,jpoxy,Kmm) * tmask(ji,jj,1) + zdepo2min(ji,jj) = gdepw(ji,jj,1,Kmm) * tmask(ji,jj,1) + END_2D + DO_3D( 0, 0, 0, 0, 2, jpkm1 ) + IF( tmask(ji,jj,jk) == 1 ) then + IF( tr(ji,jj,jk,jpoxy,Kmm) < zo2min(ji,jj) ) then + zo2min (ji,jj) = tr(ji,jj,jk,jpoxy,Kmm) + zdepo2min(ji,jj) = gdepw(ji,jj,jk,Kmm) ENDIF - END_3D - ! - CALL iom_put('O2MIN' , zo2min ) ! oxygen minimum concentration - CALL iom_put('ZO2MIN', zdepo2min ) ! depth of oxygen minimum concentration - ! - ENDIF - ENDIF + ENDIF + END_3D + ! + CALL iom_put('O2MIN' , zo2min ) ! oxygen minimum concentration + CALL iom_put('ZO2MIN', zdepo2min ) ! depth of oxygen minimum concentration + ! + ENDIF ! END SUBROUTINE trc_wri_pisces diff --git a/tests/BENCH/EXPREF/namelist_pisces_cfg b/tests/BENCH/EXPREF/namelist_pisces_cfg index 71bea925aa6515bc8027d8d7a845307920e6fd52..3c81eff8e02712950508ac1fc2fa555cbc57d6c0 100644 --- a/tests/BENCH/EXPREF/namelist_pisces_cfg +++ b/tests/BENCH/EXPREF/namelist_pisces_cfg @@ -102,35 +102,3 @@ &nampismass ! Mass conservation !----------------------------------------------------------------------- / -!----------------------------------------------------------------------- -&namlobphy ! biological parameters for phytoplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobnut ! biological parameters for nutrients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobzoo ! biological parameters for zooplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdet ! biological parameters for detritus -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdom ! biological parameters for DOM -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobsed ! parameters from aphotic layers to sediment -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobrat ! general coefficients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobopt ! optical parameters -!----------------------------------------------------------------------- -/ diff --git a/tests/CPL_OASIS/EXPREF/namelist_pisces_cfg b/tests/CPL_OASIS/EXPREF/namelist_pisces_cfg index f67b07c4201e8ffed4eec3f2454fe6077d89f1c4..8b7782ab75af6d77a571f0b77bb15ed85e19b81a 100644 --- a/tests/CPL_OASIS/EXPREF/namelist_pisces_cfg +++ b/tests/CPL_OASIS/EXPREF/namelist_pisces_cfg @@ -107,35 +107,3 @@ &nampismass ! Mass conservation !----------------------------------------------------------------------- / -!----------------------------------------------------------------------- -&namlobphy ! biological parameters for phytoplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobnut ! biological parameters for nutrients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobzoo ! biological parameters for zooplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdet ! biological parameters for detritus -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdom ! biological parameters for DOM -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobsed ! parameters from aphotic layers to sediment -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobrat ! general coefficients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobopt ! optical parameters -!----------------------------------------------------------------------- -/ diff --git a/tests/DIA_GPU/EXPREF/namelist_pisces_cfg b/tests/DIA_GPU/EXPREF/namelist_pisces_cfg index f67b07c4201e8ffed4eec3f2454fe6077d89f1c4..8b7782ab75af6d77a571f0b77bb15ed85e19b81a 100644 --- a/tests/DIA_GPU/EXPREF/namelist_pisces_cfg +++ b/tests/DIA_GPU/EXPREF/namelist_pisces_cfg @@ -107,35 +107,3 @@ &nampismass ! Mass conservation !----------------------------------------------------------------------- / -!----------------------------------------------------------------------- -&namlobphy ! biological parameters for phytoplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobnut ! biological parameters for nutrients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobzoo ! biological parameters for zooplankton -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdet ! biological parameters for detritus -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobdom ! biological parameters for DOM -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobsed ! parameters from aphotic layers to sediment -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobrat ! general coefficients -!----------------------------------------------------------------------- -/ -!----------------------------------------------------------------------- -&namlobopt ! optical parameters -!----------------------------------------------------------------------- -/