New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 15459 – NEMO

Changeset 15459


Ignore:
Timestamp:
2021-10-29T10:19:18+02:00 (2 years ago)
Author:
cetlod
Message:

Various bug fixes and more comments in PISCES routines ; sette test OK in debug mode, nn_hls=1/2, with tiling ; run.stat unchanged ; of course tracer.stat different

Location:
NEMO/trunk
Files:
1 added
31 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/cfgs/SHARED/axis_def_nemo.xml

    r14072 r15459  
    2929  <axis id="section_ice" n_glo="4" /> 
    3030  <axis id="gau" /> 
     31  <!-- PISCES Sediment vertical axis definition --> 
     32  <axis id="profsed" long_name="Vertical S levels" unit="cm" positive="down"/> 
    3133</axis_definition> 
  • NEMO/trunk/cfgs/SHARED/field_def_nemo-oce.xml

    r15457 r15459  
    11221122  <!-- shared variables available with TOP interface --> 
    11231123  <field_group id="top_shared" grid_ref="grid_T_3D"> 
    1124     <field id="xbla"           long_name="Broadband light attenuation"                     unit="-"                            /> 
     1124    <field id="xeps"           long_name="Broadband light attenuation"                     unit="-"                            /> 
    11251125    <field id="Heup"           long_name="Euphotic layer depth"                            unit="m"     grid_ref="grid_T_2D"   /> 
    11261126  </field_group> 
  • NEMO/trunk/cfgs/SHARED/field_def_nemo-pisces.xml

    r14209 r15459  
    136136    <field id="SedpH"           long_name="PH"                                       unit="1"          /> 
    137137    <field id="SedCO3por"       long_name="Bicarbonates"                             unit="mol/m3" /> 
     138    <field id="Sedligand"       long_name="Ligands"                                  unit="mol/m3" /> 
     139    <field id="SaturCO3"        long_name="CO3 Saturation"                           unit="-" />        
    138140  </field_group> 
    139141 
    140142  <!-- SEDIMENT additional variables on T sediment grid  --> 
    141143  <field_group id="Diag_S" grid_ref="grid_T_2D"> 
    142     <field id="FlxSi"       long_name="Si sediment flux"                        unit="mol/cm2/s"     /> 
    143     <field id="FlxO2"       long_name="O2 sediment flux"                        unit="mol/cm2/s"     /> 
    144     <field id="FlxDIC"      long_name="DIC sediment flux"                       unit="mol/cm2/s"     /> 
    145     <field id="FlxNO3"      long_name="NO3 sediment flux"                       unit="mol/cm2/s"     /> 
    146     <field id="FlxPO4"      long_name="PO4 sediment flux"                       unit="mol/cm2/s"     /> 
    147     <field id="FlxAlkalini" long_name="Alkalinity sediment flux"                unit="mol/cm2/s"     /> 
    148     <field id="FlxNH4"      long_name="Ammonium sediment flux"                  unit="mol/cm2/s"     /> 
    149     <field id="FlxH2S"      long_name="H2S sediment flux"                       unit="mol/cm2/s"     /> 
    150     <field id="FlxSO4"      long_name="SO4 sediment flux"                       unit="mol/cm2/s"     /> 
    151     <field id="FlxFe2"      long_name="Fe2+ sediment flux"                      unit="mol/cm2/s"     /> 
    152     <field id="Flxtot"      long_name="Sediment net burial rate"                unit="cm/s"     /> 
    153     <field id="dzdep"       long_name="Sedimentation rate"                      unit="cm/s"     /> 
    154     <field id="sflxclay"    long_name="Clay sedimentation rate"                 unit="g/m2/s"     /> 
    155     <field id="sflxcal"     long_name="Calcite sedimentation rate"              unit="mol/m2/s"     /> 
    156     <field id="sflxbsi"     long_name="BSi Sedimentation rate"                  unit="mol/m2/s"     /> 
    157     <field id="sflxpoc"     long_name="POC Sedimentation rate"                  unit="mol/m2/s"     /> 
    158     <field id="sflxfeo"     long_name="Fe(OH)3 Sedimentation rate"              unit="mol/m2/s"     /> 
     144      <field id="FlxSi"       long_name="Si sediment flux"                        unit="mol/cm2/s"     /> 
     145       <field id="FlxO2"       long_name="O2 sediment flux"                        unit="mol/cm2/s"     /> 
     146       <field id="FlxDIC"      long_name="DIC sediment flux"                       unit="mol/cm2/s"     /> 
     147       <field id="FlxNO3"      long_name="NO3 sediment flux"                       unit="mol/cm2/s"     /> 
     148       <field id="FlxPO4"      long_name="PO4 sediment flux"                       unit="mol/cm2/s"     /> 
     149       <field id="FlxAlkalini" long_name="Alkalinity sediment flux"                unit="mol/cm2/s"     /> 
     150       <field id="FlxNH4"      long_name="Ammonium sediment flux"                  unit="mol/cm2/s"     /> 
     151       <field id="FlxH2S"      long_name="H2S sediment flux"                       unit="mol/cm2/s"     /> 
     152       <field id="FlxSO4"      long_name="SO4 sediment flux"                       unit="mol/cm2/s"     /> 
     153       <field id="FlxFe2"      long_name="Fe2+ sediment flux"                      unit="mol/cm2/s"     /> 
     154       <field id="FlxLig"      long_name="Ligand sediment flux"                    unit="mol/cm2/s"     /> 
     155       <field id="dzdep"       long_name="Sedimentation rate"                      unit="cm/s"     /> 
     156       <field id="sflxclay"    long_name="Clay sedimentation rate"                 unit="g/cm2/s"     /> 
     157       <field id="sflxbsi"     long_name="BSi sedimentation rate"                  unit="g/cm2/s"     /> 
     158       <field id="sflxpoc"     long_name="POC sedimentation rate"                  unit="g/cm2/s"     /> 
     159       <field id="sflxcal"     long_name="Calcite sedimentation rate"              unit="g/cm2/s"     /> 
     160       <field id="sflxfeo"     long_name="Fe(OH)3 Sedimentation rate"              unit="mol/cm2/s"     /> 
     161       <field id="FlxClay"     long_name="Clay burial rate"                        unit="g/cm2/s"     /> 
     162       <field id="FlxCaCO3"    long_name="Calcite burial rate"                     unit="g/cm2/s"     /> 
     163       <field id="FlxBSi"      long_name="BSi burial rate"                         unit="g/cm2/s"     /> 
     164       <field id="FlxPOC"      long_name="POC burial rate"                         unit="g/cm2/s"     /> 
     165       <field id="FlxFeO"      long_name="Fe(OH)3 burial rate"                     unit="g/cm2/s"     /> 
     166       <field id="FlxFeS"      long_name="FeS burial rate"                         unit="g/cm2/s"     /> 
     167       <field id="FlxPOR"      long_name="POR burial rate"                         unit="g/cm2/s"     /> 
     168       <field id="FlxPOS"      long_name="POS burial rate"                         unit="g/cm2/s"     /> 
     169       <field id="Flxtot"      long_name="total burial flux"                       unit="g/cm2/s"     /> 
     170       <field id="Rstepros"    long_name="Number of iterations"                    unit="-"     /> 
    159171  </field_group> 
    160172 
     
    205217    <field id="SIZEP"       long_name="Mean relative size of picophyto."        unit="-"          grid_ref="grid_T_3D" /> 
    206218    <field id="SIZED"       long_name="Mean relative size of diatoms"           unit="-"          grid_ref="grid_T_3D" /> 
     219    <field id="RASSD"       long_name="Size of the protein machinery (Diat.)"   unit="-"          grid_ref="grid_T_3D" /> 
     220    <field id="RASSN"       long_name="Size of the protein machinery (Nano.)"   unit="-"          grid_ref="grid_T_3D" /> 
     221    <field id="RASSP"       long_name="Size of the protein machinery (Pico.)"   unit="-"          grid_ref="grid_T_3D" /> 
    207222    <field id="Fe3"         long_name="Iron III concentration"                  unit="nmol/m3"    grid_ref="grid_T_3D" /> 
    208223    <field id="FeL1"        long_name="Complexed Iron concentration with L1"    unit="nmol/m3"    grid_ref="grid_T_3D" /> 
     
    241256    <field id="BACT"        long_name="Bacterial Biomass"                       unit="mmol/m3"  grid_ref="grid_T_3D" /> 
    242257    <field id="FEBACT"      long_name="Bacterial uptake of Fe"                  unit="molFe/m3/s"  grid_ref="grid_T_3D" /> 
     258    <field id="FEPREC"      long_name="Precipitation of Fe"                     unit="molFe/m3/s"  grid_ref="grid_T_3D" /> 
    243259    <field id="LPRODR"      long_name="OM remineralisation ligand production rate" unit="nmol-L/m3/s"  grid_ref="grid_T_3D" /> 
    244260    <field id="LPRODP"      long_name="phytoplankton ligand production rate"    unit="nmol-L/m3/s"  grid_ref="grid_T_3D" /> 
  • NEMO/trunk/cfgs/SHARED/namelist_pisces_ref

    r15287 r15459  
    1414!----------------------------------------------------------------------- 
    1515  ln_p2z    = .false.        !  LOBSTER model used 
    16   ln_p4z    = .true.         !  PISCES model used 
    17   ln_p5z    = .false.        !  PISCES QUOTA model used 
     16  ln_p4z    = .true.        !  PISCES model used 
     17  ln_p5z    = .false.         !  PISCES QUOTA model used 
    1818  ln_ligand = .false.        !  Enable  organic ligands 
    1919  ln_sediment = .false.      !  Enable sediment module 
     
    3434!              !  file name   ! frequency (hours) ! variable  ! time interp. !  clim  ! 'yearly'/ ! weights  ! rotation ! land/sea mask ! 
    3535!              !              !  (if <0  months)  !   name    !   (logical)  !  (T/F) ! 'monthly' ! filename ! pairing  ! filename      ! 
    36    sn_patm     = 'presatm'    ,     -1            , 'patm'    ,  .true.      , .true. , 'yearly'  , ''       , ''       , '' 
    37    sn_atmco2   = 'presatmco2' ,     -1            , 'xco2'    ,  .true.      , .true. , 'yearly'  , ''       , ''       , '' 
     36   sn_patm     = 'presatm.orca2'    ,     24.           , 'presatm'    ,  .true.      , .true. , 'yearly'  , ''       , ''       , '' 
     37   sn_atmco2   = 'presatmco2' ,     -1.           , 'xco2'    ,  .true.      , .true. , 'yearly'  , ''       , ''       , '' 
    3838   cn_dir      = './'     !  root directory for the location of the dynamical files 
    3939! 
     
    4444&nampisbio     !   biological parameters 
    4545!----------------------------------------------------------------------- 
    46    nrdttrc    =  1        ! time step frequency for biology 
    47    wsbio      =  2.       ! POC sinking speed 
    48    xkmort     =  2.E-7    ! half saturation constant for mortality 
    49    ferat3     =  10.E-6   ! Fe/C in zooplankton  
    50    wsbio2     =  50.      ! Big particles sinking speed 
    51    wsbio2max  =  50.      ! Big particles maximum sinking speed 
    52    wsbio2scale =  5000.    ! Big particles length scale of sinking 
     46   nrdttrc     =  1       ! time step frequency for biology 
     47   wsbio       =  2.      ! POC sinking speed 
     48   xkmort      =  1.E-7   ! half saturation constant for mortality 
     49   feratz      =  10.E-6  ! Fe/C in zooplankton  
     50   feratm      =  15.E-6  ! Fe/C in mesozooplankton 
     51   wsbio2      =  50.     ! Big particles sinking speed 
     52   wsbio2max   =  50.     ! Big particles maximum sinking speed 
     53   wsbio2scale =  5000.   ! Big particles length scale of sinking 
    5354!                         !  ln_ligand enabled 
    54    ldocp      =  1.E-4    ! Phyto ligand production per unit doc  
    55    ldocz      =  1.E-4    ! Zoo ligand production per unit doc  
    56    lthet      =  1.0      ! Proportional loss of ligands due to Fe uptake  
     55   ldocp       =  1.E-4   ! Phyto ligand production per unit doc  
     56   ldocz       =  1.E-4   ! Zoo ligand production per unit doc  
     57   lthet       =  1.0     ! Proportional loss of ligands due to Fe uptake  
    5758!                         !  ln_p5z enabled 
    58    no3rat3    =  0.182    ! N/C ratio in zooplankton 
    59    po4rat3    =  0.0094  ! P/C ratio in zooplankton 
     59   no3rat3     =  0.151   ! N/C ratio in zooplankton 
     60   po4rat3     =  0.00943 ! P/C ratio in zooplankton 
    6061/ 
    6162!----------------------------------------------------------------------- 
     
    6465   concnno3   =  1.e-6    ! Nitrate half saturation of nanophytoplankton 
    6566   concdno3   =  3.E-6    ! Nitrate half saturation for diatoms 
    66    concnnh4   =  1.E-7    ! NH4 half saturation for phyto 
    67    concdnh4   =  3.E-7    ! NH4 half saturation for diatoms 
    68    concnfer   =  1.E-9    ! Iron half saturation for phyto 
    69    concdfer   =  3.E-9    ! Iron half saturation for diatoms 
    70    concbfe    =  1.E-11   ! Iron half-saturation for DOC remin. 
    71    concbnh4   =  2.E-8    ! NH4 half saturation for DOC remin. 
    72    concbno3   =  2.E-7    ! Nitrate half saturation for DOC remin. 
     67   concnnh4   =  1.E-6    ! NH4 half saturation for phyto 
     68   concdnh4   =  3.E-6    ! NH4 half saturation for diatoms 
     69   concnfer   =  1.7E-9   ! Iron half saturation for phyto 
     70   concdfer   =  5.E-9    ! Iron half saturation for diatoms 
     71   concbfe    =  3.E-11   ! Iron half-saturation for DOC remin. 
     72   concbnh4   =  3.E-7    ! NH4 half saturation for DOC remin. 
     73   concbno3   =  3.E-7    ! Nitrate half saturation for DOC remin. 
    7374   xsizedia   =  1.E-6    ! Minimum size criteria for diatoms 
    7475   xsizephy   =  1.E-6    ! Minimum size criteria for phyto 
    7576   xsizern    =  3.0      ! Size ratio for nanophytoplankton 
    76    xsizerd    =  3.0      ! Size ratio for diatoms 
    77    xksi1      =  2.E-6    ! half saturation constant for Si uptake 
     77   xsizerd    =  4.0      ! Size ratio for diatoms 
     78   xksi1      =  8.E-6    ! half saturation constant for Si uptake 
    7879   xksi2      =  20E-6    ! half saturation constant for Si/C 
    7980   xkdoc      =  417.E-6  ! half-saturation constant of DOC remineralization 
    80    qnfelim    =  7.E-6    ! Optimal quota of phyto 
    81    qdfelim    =  7.E-6    ! Optimal quota of diatoms 
     81   qnfelim    =  10.E-6   ! Optimal quota of phyto 
     82   qdfelim    =  10.E-6   ! Optimal quota of diatoms 
     83   caco3r     =  0.2      ! mean rain ratio 
     84   oxymin     =  1.E-6    ! Half-saturation constant for anoxia 
     85/ 
     86!----------------------------------------------------------------------- 
     87&namp5zlim     !   parameters for nutrient limitations PISCES QUOTA    - ln_p5z 
     88!----------------------------------------------------------------------- 
     89   concnno3   =  2e-6     ! Nitrate half saturation of nanophytoplankton 
     90   concpno3   =  7e-7     ! Nitrate half saturation of picophytoplankton 
     91   concdno3   =  3E-6     ! Phosphate half saturation for diatoms 
     92   concnnh4   =  2E-6     ! NH4 half saturation for phyto 
     93   concpnh4   =  7E-7     ! NH4 half saturation for picophytoplankton 
     94   concdnh4   =  3E-6     ! NH4 half saturation for diatoms 
     95   concnpo4   =  2E-6     ! PO4 half saturation for phyto 
     96   concppo4   =  7E-7     ! PO4 half saturation for picophytoplankton 
     97   concdpo4   =  3E-6     ! PO4 half saturation for diatoms 
     98   concnfer   =  3E-9     ! Iron half saturation for phyto 
     99   concpfer   =  1E-9     ! Iron half saturation for picophytoplankton 
     100   concdfer   =  4.5E-9   ! Iron half saturation for diatoms 
     101   concbfe    =  3E-11    ! Half-saturation for Fe limitation of Bacteria 
     102   concbnh4   =  4.E-7    ! NH4 half saturation for phyto 
     103   concbno3   =  4.E-7    ! Phosphate half saturation for diatoms 
     104   concbpo4   =  4.E-7    ! Phosphate half saturation for bacteria 
     105   xsizedia   =  1.E-6    ! Minimum size criteria for diatoms 
     106   xsizephy   =  1.E-6    ! Minimum size criteria for phyto 
     107   xsizepic   =  5.E-7    ! Minimum size criteria for picophyto 
     108   xsizern    =  3.0      ! Size ratio for nanophytoplankton 
     109   xsizerp    =  2.0      ! Size ratio for picophytoplankton 
     110   xsizerd    =  4.0      ! Size ratio for diatoms 
     111   xksi1      =  8.E-6    ! half saturation constant for Si uptake 
     112   xksi2      =  20E-6    ! half saturation constant for Si/C 
     113   xkdoc      =  417.E-6  ! half-saturation constant of DOC remineralization 
    82114   caco3r     =  0.3      ! mean rain ratio 
    83115   oxymin     =  1.E-6    ! Half-saturation constant for anoxia 
    84116/ 
    85117!----------------------------------------------------------------------- 
    86 &namp5zlim     !   parameters for nutrient limitations PISCES QUOTA    - ln_p5z 
    87 !----------------------------------------------------------------------- 
    88    concnno3   =  3e-6     ! Nitrate half saturation of nanophytoplankton 
    89    concpno3   =  1e-6 
    90    concdno3   =  4E-6     ! Phosphate half saturation for diatoms 
    91    concnnh4   =  1.5E-6   ! NH4 half saturation for phyto 
    92    concpnh4   =  4E-7 
    93    concdnh4   =  2E-6     ! NH4 half saturation for diatoms 
    94    concnpo4   =  3E-6     ! PO4 half saturation for phyto 
    95    concppo4   =  1.5E-6 
    96    concdpo4   =  4E-6     ! PO4 half saturation for diatoms 
    97    concnfer   =  3E-9   ! Iron half saturation for phyto 
    98    concpfer   =  1.5E-9 
    99    concdfer   =  4E-9   ! Iron half saturation for diatoms 
    100    concbfe    =  1.E-11   ! Half-saturation for Fe limitation of Bacteria 
    101    concbnh4   =  1.E-7    ! NH4 half saturation for phyto 
    102    concbno3   =  5.E-7    ! Phosphate half saturation for diatoms 
    103    concbpo4   =  1E-7     ! Phosphate half saturation for bacteria 
    104    xsizedia   =  1.E-6    ! Minimum size criteria for diatoms 
    105    xsizephy   =  1.E-6    ! Minimum size criteria for phyto 
    106    xsizepic   =  1.E-6 
    107    xsizern    =  1.0      ! Size ratio for nanophytoplankton 
    108    xsizerp    =  1.0 
    109    xsizerd    =  4.0      ! Size ratio for diatoms 
    110    xksi1      =  2.E-6    ! half saturation constant for Si uptake 
    111    xksi2      =  20E-6  ! half saturation constant for Si/C 
    112    xkdoc      =  417.E-6  ! half-saturation constant of DOC remineralization 
    113    caco3r     =  0.35     ! mean rain ratio 
    114    oxymin     =  1.E-6    ! Half-saturation constant for anoxia 
    115 / 
    116 !----------------------------------------------------------------------- 
    117118&namp5zquota   !   parameters for nutrient limitations PISCES quota    - ln_p5z 
    118119!----------------------------------------------------------------------- 
    119    qfnopt     =  7.E-6    ! Optimal Fe quota of nanophyto 
    120    qfpopt     =  7.E-6    ! Optimal Fe quota of picophyto 
    121    qfdopt     =  7.E-6    ! Optimal quota of diatoms 
    122    qnnmin     =  0.29     ! Minimal N quota for nano 
    123    qnnmax     =  1.39     ! Maximal N quota for nano 
    124    qpnmin     =  0.28     ! Minimal P quota for nano 
    125    qpnmax     =  1.06     ! Maximal P quota for nano 
    126    qnpmin     =  0.42     ! Minimal N quota for pico 
     120   qfnopt     =  12.E-6   ! Optimal Fe quota of nanophyto 
     121   qfpopt     =  12.E-6   ! Optimal Fe quota of picophyto 
     122   qfdopt     =  12.E-6   ! Optimal quota of diatoms 
     123   qnnmin     =  0.61     ! Minimal N quota for nano 
     124   qnnmax     =  1.25     ! Maximal N quota for nano 
     125   qpnmin     =  0.24     ! Minimal P quota for nano 
     126   qpnmax     =  1.35     ! Maximal P quota for nano 
     127   qnpmin     =  1.02     ! Minimal N quota for pico 
    127128   qnpmax     =  1.39     ! Maximal N quota for pico 
    128    qppmin     =  0.25     ! Minimal P quota for pico 
    129    qppmax     =  0.7      ! Maximal P quota for pico 
    130    qndmin     =  0.25     ! Minimal N quota for diatoms 
    131    qndmax     =  1.39     ! Maximal N quota for diatoms 
    132    qpdmin     =  0.29     ! Minimal P quota for diatoms 
    133    qpdmax     =  1.32     ! Maximal P quota for diatoms 
    134    qfnmax     =  40E-6    ! Maximal Fe quota for nano 
    135    qfpmax     =  40E-6    ! Maximal Fe quota for pico 
    136    qfdmax     =  40E-6    ! Maximal Fe quota for diatoms 
     129   qppmin     =  0.19     ! Minimal P quota for pico 
     130   qppmax     =  1.15     ! Maximal P quota for pico 
     131   qndmin     =  0.51     ! Minimal N quota for diatoms 
     132   qndmax     =  1.25     ! Maximal N quota for diatoms 
     133   qpdmin     =  0.24     ! Minimal P quota for diatoms 
     134   qpdmax     =  1.525    ! Maximal P quota for diatoms 
     135   qfnmax     =  60E-6    ! Maximal Fe quota for nano 
     136   qfpmax     =  60E-6    ! Maximal Fe quota for pico 
     137   qfdmax     =  60E-6    ! Maximal Fe quota for diatoms 
    137138/ 
    138139!----------------------------------------------------------------------- 
     
    141142!              !  file name       ! frequency (hours) ! variable  ! time interp. !  clim  ! 'yearly'/ ! weights  ! rotation ! land/sea mask ! 
    142143!              !                  !  (if <0  months)  !   name    !   (logical)  !  (T/F) ! 'monthly' ! filename ! pairing  ! filename      ! 
    143    sn_par      = 'par.orca'       ,     24            , 'fr_par'  ,  .true.      , .true. , 'yearly'  , ''       , ''       , '' 
     144   sn_par      = 'par.orca'       ,     24.           , 'fr_par'  ,  .true.      , .true. , 'yearly'  , ''       , ''       , '' 
    144145   cn_dir      = './'      !  root directory for the location of the dynamical files 
    145146   ln_varpar   =  .true.   ! boolean for PAR variable 
    146147   parlux      =  0.43      ! Fraction of shortwave as PAR 
     148   ln_p4z_dcyc =  .false.  ! Diurnal cycle in PISCES 
    147149/  
    148150!----------------------------------------------------------------------- 
     
    157159   chlcnm     =  0.033    ! Maximum Chl/C in nanophytoplankton 
    158160   chlcdm     =  0.05     ! Maximum Chl/C in diatoms 
    159    chlcmin    =  0.004    ! Minimum Chl/c in phytoplankton 
    160    fecnm      =  40E-6    ! Maximum Fe/C in nanophytoplankton 
    161    fecdm      =  40E-6    ! Maximum Fe/C in diatoms 
    162    grosip     =  0.159    ! mean Si/C ratio 
     161   chlcmin    =  0.003    ! Minimum Chl/c in phytoplankton 
     162   fecnm      =  60E-6    ! Maximum Fe/C in nanophytoplankton 
     163   fecdm      =  60E-6    ! Maximum Fe/C in diatoms 
     164   grosip     =  0.13     ! mean Si/C ratio 
    163165/ 
    164166!----------------------------------------------------------------------- 
    165167&namp5zprod    !   parameters for phytoplankton growth for PISCES quota- ln_p5z 
    166168!----------------------------------------------------------------------- 
    167    pislopen   =  3.       ! P-I slope 
    168    pislopep   =  3.       ! P-I slope for picophytoplankton 
    169    pisloped   =  3.       ! P-I slope  for diatoms 
     169   pislopen   =  5        ! P-I slope of nanophytoplankton 
     170   pislopep   =  5        ! P-I slope for picophytoplankton 
     171   pisloped   =  5        ! P-I slope  for diatoms 
    170172   excretn    =  0.05     ! excretion ratio of phytoplankton 
    171173   excretp    =  0.05     ! excretion ratio of picophytoplankton 
     
    173175   xadap      =  0.       ! Adaptation factor to low light 
    174176   bresp      =  0.02     ! Basal respiration rate 
    175    thetannm   =  0.25     ! Maximum Chl/N in nanophytoplankton 
    176    thetanpm   =  0.25     ! Maximum Chl/N in picophytoplankton 
    177    thetandm   =  0.3      ! Maximum Chl/N in diatoms 
    178    chlcmin    =  0.004    ! Minimum Chl/c in phytoplankton 
    179    grosip     =  0.131    ! mean Si/C ratio 
     177   thetannm   =  0.3      ! Maximum Chl/N in nanophytoplankton 
     178   thetanpm   =  0.3      ! Maximum Chl/N in picophytoplankton 
     179   thetandm   =  0.4      ! Maximum Chl/N in diatoms 
     180   chlcmin    =  0.003    ! Minimum Chl/c in phytoplankton 
     181   grosip     =  0.12     ! mean Si/C ratio 
    180182/ 
    181183!----------------------------------------------------------------------- 
    182184&namp4zmort    !   parameters for phytoplankton sinks for PISCES std   - ln_p4z 
    183185!----------------------------------------------------------------------- 
    184    wchl       =  0.01     ! quadratic mortality of phytoplankton 
    185    wchld      =  0.01     ! maximum quadratic mortality of diatoms 
    186    wchldm     =  0.03     ! maximum quadratic mortality of diatoms 
    187    mprat      =  0.01     ! phytoplankton mortality rate 
    188    mprat2     =  0.01     ! Diatoms mortality rate 
     186   wchln      =  0.01     ! quadratic mortality of phytoplankton 
     187   wchld      =  0.03     ! maximum quadratic mortality of diatoms 
     188   mpratn     =  0.01     ! phytoplankton mortality rate 
     189   mpratd     =  0.01     ! Diatoms mortality rate 
    189190/ 
    190191!----------------------------------------------------------------------- 
     
    193194   wchln      =  0.01     ! quadratic mortality of nanophytoplankton 
    194195   wchlp      =  0.01     ! quadratic mortality of picophytoplankton 
    195    wchld      =  0.01     ! maximum quadratic mortality of diatoms 
    196    wchldm     =  0.02     ! maximum quadratic mortality of diatoms 
     196   wchld      =  0.03     ! maximum quadratic mortality of diatoms 
    197197   mpratn     =  0.01     ! nanophytoplankton mortality rate 
    198198   mpratp     =  0.01     ! picophytoplankton mortality rate 
    199    mprat2     =  0.01     ! Diatoms mortality rate 
     199   mpratd     =  0.01     ! Diatoms mortality rate 
    200200/ 
    201201!----------------------------------------------------------------------- 
    202202&namp4zmes     !   parameters for mesozooplankton for PISCES std       - ln_p4z 
    203203!----------------------------------------------------------------------- 
    204    part2      =  0.75     ! part of calcite not dissolved in mesozoo guts 
    205    grazrat2   =  0.75     ! maximal mesozoo grazing rate 
    206    resrat2    =  0.005    ! exsudation rate of mesozooplankton 
    207    mzrat2     =  0.03     ! mesozooplankton mortality rate 
    208    xpref2d    =  1.       ! mesozoo preference for diatoms 
    209    xpref2n    =  0.3      ! mesozoo preference for nanophyto. 
    210    xpref2z    =  1.       ! mesozoo preference for microzoo. 
    211    xpref2c    =  0.3      ! mesozoo preference for poc 
    212    xthresh2zoo = 1E-8     ! zoo feeding threshold for mesozooplankton  
    213    xthresh2dia = 1E-8     ! diatoms feeding threshold for mesozooplankton  
    214    xthresh2phy = 1E-8     ! nanophyto feeding threshold for mesozooplankton  
    215    xthresh2poc = 1E-8     ! poc feeding threshold for mesozooplankton  
    216    xthresh2   =  3E-7     ! Food threshold for grazing 
    217    xkgraz2    =  20.E-6   ! half saturation constant for meso grazing 
    218    epsher2    =  0.35     ! Efficicency of Mesozoo growth 
    219    epsher2min =  0.35     ! Minimum efficiency of mesozoo growth 
    220    sigma2     =  0.6      ! Fraction of mesozoo excretion as DOM 
    221    unass2     =  0.3      ! non assimilated fraction of P by mesozoo 
    222    grazflux   =  3.e3     ! flux-feeding rate 
     204   part2       =  0.75     ! part of calcite not dissolved in mesozoo guts 
     205   grazrat2    =  0.5      ! maximal mesozoo grazing rate 
     206   resrat2     =  0.005    ! exsudation rate of mesozooplankton 
     207   mzrat2      =  0.01     ! mesozooplankton mortality rate 
     208   xpref2d     =  1.       ! mesozoo preference for diatoms 
     209   xpref2n     =  0.3      ! mesozoo preference for nanophyto. 
     210   xpref2z     =  1.       ! mesozoo preference for microzoo. 
     211   xpref2c     =  0.3      ! mesozoo preference for poc 
     212   xthresh2zoo =  1E-8     ! zoo feeding threshold for mesozooplankton  
     213   xthresh2dia =  1E-8     ! diatoms feeding threshold for mesozooplankton  
     214   xthresh2phy =  1E-8     ! nanophyto feeding threshold for mesozooplankton  
     215   xthresh2poc =  1E-8     ! poc feeding threshold for mesozooplankton  
     216   xthresh2    =  3E-7     ! Food threshold for grazing 
     217   xkgraz2     =  20.E-6   ! half saturation constant for meso grazing 
     218   epsher2     =  0.4      ! Efficicency of Mesozoo growth 
     219   epsher2min  =  0.4      ! Minimum efficiency of mesozoo growth 
     220   sigma2      =  0.6      ! Fraction of mesozoo excretion as DOM 
     221   unass2      =  0.3      ! non assimilated fraction of P by mesozoo 
     222   grazflux    =  3.e3     ! flux-feeding rate 
     223   xsigma2     =  0.5      ! Predation window size 
     224   xsigma2del  =  1.0      ! Predation window size scaling 
     225   ln_dvm_meso =  .false.  ! Activates DVM for mesozooplankton 
     226   xfracmig    =  0.3      ! Fraction of mesozooplankton performing DVM 
    223227/ 
    224228!----------------------------------------------------------------------- 
    225229&namp5zmes     !   parameters for mesozooplankton 
    226230!----------------------------------------------------------------------- 
    227    part2      =  0.75     ! part of calcite not dissolved in mesozoo guts 
    228    grazrat2   =  0.85     ! maximal mesozoo grazing rate 
    229    bmetexc2   =  .true.   ! Metabolic use of excess carbon  
    230    resrat2    =  0.005    ! exsudation rate of mesozooplankton 
    231    mzrat2     =  0.02     ! mesozooplankton mortality rate 
    232    xpref2d    =  1.       ! zoo preference for phyto 
    233    xpref2p    =  1.       ! zoo preference for POC 
    234    xpref2z    =  1.       ! zoo preference for zoo 
    235    xpref2m    =  0.2      ! meso preference for zoo 
    236    xpref2c    =  0.3      ! zoo preference for poc 
    237    xthresh2zoo = 1E-8     ! zoo feeding threshold for mesozooplankton 
    238    xthresh2dia = 1E-8     ! diatoms feeding threshold for mesozooplankton 
    239    xthresh2phy = 1E-8     ! nanophyto feeding threshold for mesozooplankton 
    240    xthresh2mes = 1E-8     ! meso feeding threshold for mesozooplankton 
    241    xthresh2poc = 1E-8     ! poc feeding threshold for mesozooplankton 
     231   part2       =  0.75     ! part of calcite not dissolved in mesozoo guts 
     232   grazrat2    =  0.5      ! maximal mesozoo grazing rate 
     233   bmetexc2    =  .true.   ! Metabolic use of excess carbon  
     234   resrat2     =  0.005    ! exsudation rate of mesozooplankton 
     235   mzrat2      =  0.01     ! mesozooplankton mortality rate 
     236   xpref2d     =  1.       ! meso preference for diatoms 
     237   xpref2n     =  0.3      ! meso preference for nano 
     238   xpref2z     =  1.       ! meso preference for zoo 
     239   xpref2m     =  0.       ! meso preference for zoo 
     240   xpref2c     =  0.3      ! meso preference for poc 
     241   xthresh2zoo =  1E-8     ! zoo feeding threshold for mesozooplankton 
     242   xthresh2dia =  1E-8     ! diatoms feeding threshold for mesozooplankton 
     243   xthresh2phy =  1E-8     ! nanophyto feeding threshold for mesozooplankton 
     244   xthresh2mes =  1E-8     ! meso feeding threshold for mesozooplankton 
     245   xthresh2poc =  1E-8     ! poc feeding threshold for mesozooplankton 
    242246   xthresh2    =  3E-7     ! Food threshold for grazing 
    243247   xkgraz2     =  20.E-6   ! half sturation constant for meso grazing 
    244248   epsher2     =  0.5      ! Efficicency of Mesozoo growth 
    245    epsher2min  =  0.2     ! Minimum efficiency of mesozoo growth 
    246    ssigma2     =  0.5     ! Fraction excreted as semi-labile DOM 
    247    srespir2    =  0.2     ! Active respiration 
    248    unass2c     =  0.3     ! non assimilated fraction of P by mesozoo 
    249    unass2n     =  0.3     ! non assimilated fraction of N by mesozoo 
    250    unass2p     =  0.3     ! non assimilated fraction of P by mesozoo 
    251    grazflux   =  3.e3     ! flux-feeding rate 
     249   epsher2min  =  0.5      ! Minimum efficiency of mesozoo growth 
     250   ssigma2     =  0.5      ! Fraction excreted as semi-labile DOM 
     251   srespir2    =  0.2      ! Active respiration 
     252   unass2c     =  0.3      ! non assimilated fraction of C by mesozoo 
     253   unass2n     =  0.3      ! non assimilated fraction of N by mesozoo 
     254   unass2p     =  0.3      ! non assimilated fraction of P by mesozoo 
     255   xsigma2     =  0.5      ! Predation window size 
     256   xsigma2del  =  1.0      ! Predation window size scaling 
     257   grazflux    =  3.e3     ! flux-feeding rate 
     258   ln_dvm_meso =  .false.  ! Activates DVM for mesozooplankton 
     259   xfracmig    =  0.25     ! Fraction of mesozooplankton performing DVM 
    252260/ 
    253261!----------------------------------------------------------------------- 
    254262&namp4zzoo     !   parameters for microzooplankton for PISCES std      - ln_p4z 
    255263!----------------------------------------------------------------------- 
    256    part       =  0.5      ! part of calcite not dissolved in microzoo guts 
    257    grazrat    =  3.0      ! maximal zoo grazing rate 
    258    resrat     =  0.03     ! exsudation rate of zooplankton 
    259    mzrat      =  0.004    ! zooplankton mortality rate 
    260    xprefc     =  0.1      ! Microzoo preference for POM 
     264   part       =  0.75     ! part of calcite not dissolved in microzoo guts 
     265   grazrat    =  2.0      ! maximal zoo grazing rate 
     266   resrat     =  0.02     ! Linear mortality rate of zooplankton 
     267   mzrat      =  0.005    ! zooplankton mortality rate 
     268   xprefc     =  0.15      ! Microzoo preference for POM 
    261269   xprefn     =  1.       ! Microzoo preference for Nanophyto 
    262    xprefd     =  0.6      ! Microzoo preference for Diatoms 
     270   xprefd     =  0.8      ! Microzoo preference for Diatoms 
    263271   xthreshdia =  1.E-8    ! Diatoms feeding threshold for microzooplankton  
    264272   xthreshphy =  1.E-8    ! Nanophyto feeding threshold for microzooplankton  
     
    266274   xthresh    =  3.E-7    ! Food threshold for feeding 
    267275   xkgraz     =  20.E-6   ! half sturation constant for grazing 
    268    epsher     =  0.3      ! Efficiency of microzoo growth 
    269    epshermin  =  0.3      ! Minimum efficiency of microzoo growth 
     276   epsher     =  0.4     ! Efficiency of microzoo growth 
     277   epshermin  =  0.4     ! Minimum efficiency of microzoo growth 
    270278   sigma1     =  0.6      ! Fraction of microzoo excretion as DOM 
    271279   unass      =  0.3      ! non assimilated fraction of phyto by zoo 
     280   xsigma     =  0.5      ! Predation window size 
     281   xsigmadel  =  1.0      ! Predation window size scaling 
    272282/ 
    273283!----------------------------------------------------------------------- 
    274284&namp5zzoo     !   parameters for microzooplankton 
    275285!----------------------------------------------------------------------- 
    276    part       =  0.5      ! part of calcite not dissolved in microzoo gutsa 
    277    grazrat    =  2.75     ! maximal zoo grazing rate 
     286   part       =  0.75     ! part of calcite not dissolved in microzoo gutsa 
     287   grazrat    =  2.0      ! maximal zoo grazing rate 
    278288   bmetexc    =  .true.   ! Metabolic use of excess carbon 
    279    resrat     =  0.03     ! exsudation rate of zooplankton 
     289   resrat     =  0.02     ! exsudation rate of zooplankton 
    280290   mzrat      =  0.005    ! zooplankton mortality rate 
    281    xprefc     =  0.1      ! Microzoo preference for POM 
    282    xprefn     =  1.       ! Microzoo preference for Nanophyto 
    283    xprefp     =  1.6      ! Microzoo preference for picophyto 
     291   xprefc     =  0.15     ! Microzoo preference for POM 
     292   xprefn     =  1.0      ! Microzoo preference for Nanophyto 
     293   xprefp     =  1.0      ! Microzoo preference for picophyto 
    284294   xprefd     =  1.0      ! Microzoo preference for Diatoms 
    285    xprefz     =  0.3      ! Microzoo preference for microzooplankton 
     295   xprefz     =  0.       ! Microzoo preference for microzooplankton 
    286296   xthreshdia =  1.E-8    ! Diatoms feeding threshold for microzooplankton 
    287297   xthreshphy =  1.E-8    ! Nanophyto feeding threshold for microzooplankton 
    288    xthreshpic =  1.E-8 
    289    xthreshzoo =  1.E-8    ! Nanophyto feeding threshold for microzooplankton 
     298   xthreshpic =  1.E-8    ! Picophyto feeding threshold for microzooplankton 
     299   xthreshzoo =  1.E-8    ! Microzoo feeding threshold for microzooplankton 
    290300   xthreshpoc =  1.E-8    ! POC feeding threshold for microzooplankton 
    291301   xthresh    =  3.E-7    ! Food threshold for feeding 
    292    xkgraz     =  20.E-6   ! half sturation constant for grazing 
     302   xkgraz     =  20.E-6   ! half saturation constant for grazing 
    293303   epsher     =  0.5      ! Efficiency of microzoo growth 
    294    epshermin  =  0.2      ! Minimum efficiency of microzoo growth 
     304   epshermin  =  0.5      ! Minimum efficiency of microzoo growth 
    295305   ssigma     =  0.5      ! Fraction excreted as semi-labile DOM 
    296306   srespir    =  0.2      ! Active respiration 
    297307   unassc     =  0.3      ! non assimilated fraction of C by zoo 
    298    unassn     =  0.3      ! non assimilated fraction of C by zoo 
    299    unassp     =  0.3      ! non assimilated fraction of C by zoo 
     308   unassn     =  0.3      ! non assimilated fraction of N by zoo 
     309   unassp     =  0.3      ! non assimilated fraction of P by zoo 
     310   xsigma     =  0.5      ! Predation window size 
     311   xsigmadel  =  1.0      ! Predation window size scaling 
    300312/ 
    301313!----------------------------------------------------------------------- 
    302314&nampisfer     !   parameters for iron chemistry 
    303315!----------------------------------------------------------------------- 
    304    ln_ligvar =  .false.    ! variable ligand concentration 
    305    xlam1     =  0.005     ! scavenging rate of Iron 
    306    xlamdust  =  150.0     ! Scavenging rate of dust 
    307    ligand    =  0.7E-9    ! Ligands concentration  
     316   ln_ligvar =  .false.   ! variable ligand concentration 
     317   xlam1     =  0.02      ! scavenging rate of Iron by biogenic particles 
     318   xlamdust  =  150.0     ! Scavenging rate of Iron by dust 
     319   ligand    =  1E-9     ! Ligands concentration  
    308320   kfep      =  0.01      ! Nanoparticle formation rate constant 
     321   scaveff   =  1.0       ! Fraction of scavenged Fe that goes to POFe 
    309322/ 
    310323!-----------------------------------------------------------------------   
    311324&nampisrem     !   parameters for remineralization 
    312325!----------------------------------------------------------------------- 
    313    xremik    =  0.3       ! remineralization rate of DOC 
    314326   nitrif    =  0.05      ! NH4 nitrification rate 
    315327   xsirem    =  0.003     ! remineralization rate of Si 
    316328   xsiremlab =  0.03      ! fast remineralization rate of Si 
    317329   xsilab    =  0.5       ! Fraction of labile biogenic silica 
    318    feratb    =  10.E-6    ! Fe/C quota in bacteria 
    319    xkferb    =  3E-10     ! Half-saturation constant for bacteria Fe/C 
     330   feratb    =  60.E-6    ! Fe/C quota in bacteria 
     331   xkferb    =  4E-10     ! Half-saturation constant for bacteria Fe/C 
    320332!                         ! ln_p5z 
    321    xremikc   =  0.25      ! remineralization rate of DOC 
    322    xremikn   =  0.35      ! remineralization rate of DON 
    323    xremikp   =  0.4       ! remineralization rate of DOP 
    324 !   feratb    =  20E-6     ! Bacterial Fe/C ratio 
    325 !   xkferb    =  3E-10     ! Half-saturation constant for bact. Fe/C 
     333   xremikc   =  0.4       ! remineralization rate of DOC 
     334   xremikn   =  0.4       ! remineralization rate of DON 
     335   xremikp   =  0.5       ! remineralization rate of DOP 
    326336/ 
    327337!----------------------------------------------------------------------- 
    328338&nampispoc     !   parameters for organic particles 
    329339!----------------------------------------------------------------------- 
    330    xremip    =  0.035     ! remineralisation rate of PON 
     340   xremip    =  0.035     ! remineralisation rate of POC 
    331341   jcpoc     =  15        ! Number of lability classes 
    332342   rshape    =  1.0       ! Shape of the gamma function 
    333343!                         ! ln_p5z 
    334    xremipc   =  0.02      ! remineralisation rate of POC 
    335    xremipn   =  0.025     ! remineralisation rate of PON 
    336    xremipp   =  0.03      ! remineralisation rate of POP 
     344   xremipc   =  0.028     ! remineralisation rate of POC 
     345   xremipn   =  0.03      ! remineralisation rate of PON 
     346   xremipp   =  0.035     ! remineralisation rate of POP 
    337347/ 
    338348!----------------------------------------------------------------------- 
     
    358368   distcoast   =  5.e3     ! Distance off the coast for Iron from sediments 
    359369   mfrac       =  0.035    ! Fe mineral fraction of dust 
    360    wdust       =  2.0      ! Dust sinking speed  
     370   wdust       =  2.0      ! Dust sinking speed 
    361371   icefeinput  =  15.e-9   ! Iron concentration in sea ice 
    362    hratio      =  1.e+7    ! Fe to 3He ratio assumed for vent iron supply  
     372   hratio      =  1.e+7    ! Fe to 3He ratio assumed for vent iron supply 
    363373!                          ! ln_ligand 
    364    lgw_rath    =  0.5      ! Weak ligand ratio from sed hydro sources  
    365 / 
    366 !----------------------------------------------------------------------- 
    367 &nampissed     !   parameters for sediments mobilization 
    368 !----------------------------------------------------------------------- 
    369    nitrfix     =  1.e-7    ! Nitrogen fixation rate 
    370    diazolight  =  50.      ! Diazotrophs sensitivity to light (W/m2) 
     374   lgw_rath    =  0.2      ! Weak ligand ratio from sed hydro sources 
     375/ 
     376!----------------------------------------------------------------------- 
     377&nampislig     !   Namelist parameters for ligands, nampislig 
     378!----------------------------------------------------------------------- 
     379   rlgw        =  300.     ! Lifetime (years) of weak ligands 
     380   rlig        =  1.E-4    ! Remin ligand production per unit C 
     381   prlgw       =  3.E-4    ! Photolysis of weak ligand 
     382   rlgs        =  1.       ! Lifetime (years) of strong ligands 
     383   xklig       =  1.E-9    ! 1/2 saturation constant of photolysis 
     384/ 
     385!----------------------------------------------------------------------- 
     386&nampissed     !   Namelist parameters for sediment mobilisation 
     387!----------------------------------------------------------------------- 
     388   nitrfix     =  2.e-7    ! Nitrogen fixation rate 
     389   diazolight  =  30.      ! Diazotrophs sensitivity to light (W/m2) 
    371390   concfediaz  =  1.e-10   ! Diazotrophs half-saturation Cste for Iron 
    372 / 
    373 !----------------------------------------------------------------------- 
    374 &nampislig     !   Namelist parameters for ligands, nampislig 
    375 !----------------------------------------------------------------------- 
    376    rlgw        =  100.     ! Lifetime (years) of weak ligands 
    377    rlig        =  1.E-4    ! Remin ligand production per unit C 
    378    prlgw       =  1.E-4    ! Photolysis of weak ligand 
    379    rlgs        =  1.       ! Lifetime (years) of strong ligands 
    380391/ 
    381392!----------------------------------------------------------------------- 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zagg.F90

    r15090 r15459  
    22   !!====================================================================== 
    33   !!                         ***  MODULE p4zagg  *** 
    4    !! TOP :  PISCES  aggregation of particles 
     4   !! TOP :  PISCES  aggregation of particles (DOC, POC, GOC) 
     5   !!        This module is the same for both PISCES and PISCES-QUOTA 
    56   !!====================================================================== 
    67   !! History :   1.0  !  2004     (O. Aumont) Original code 
     
    3738      !!                     ***  ROUTINE p4z_agg  *** 
    3839      !! 
    39       !! ** Purpose :   Compute aggregation of particles 
     40      !! ** Purpose :   Compute aggregation of particle. Aggregation by  
     41      !!                brownian motion, differential settling and shear 
     42      !!                are considered. 
    4043      !! 
    41       !! ** Method  : - ??? 
     44      !! ** Method  : - Aggregation rates are computed assuming a fixed and  
     45      !!                constant size spectrum in the different particulate  
     46      !!                pools. The coagulation rates have been computed  
     47      !!                externally using dedicated programs (O. Aumont). They  
     48      !!                are hard-coded because they can't be changed  
     49      !!                independently of each other.  
    4250      !!--------------------------------------------------------------------- 
    4351      INTEGER, INTENT(in) ::   kt, knt   ! 
     
    5664      IF( ln_timing )   CALL timing_start('p4z_agg') 
    5765      ! 
    58       !  Exchange between organic matter compartments due to coagulation/disaggregation 
     66      !  Exchange between organic matter compartments due to  
     67      !  coagulation/disaggregation 
    5968      !  --------------------------------------------------- 
     69 
     70      ! PISCES part 
    6071      IF( ln_p4z ) THEN 
    6172         ! 
     
    6374            ! 
    6475            zfact = xstep * xdiss(ji,jj,jk) 
     76            ! Part I : Coagulation dependent on turbulence 
     77            !  The stickiness has been assumed to be 0.1 
    6578            !  Part I : Coagulation dependent on turbulence 
    66             zagg1 = 25.9  * zfact * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jppoc,Kbb) 
    67             zagg2 = 4452. * zfact * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jpgoc,Kbb) 
     79            zagg1 = 12.5  * zfact * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jppoc,Kbb) 
     80            zagg2 = 169.7 * zfact * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jpgoc,Kbb) 
    6881 
    6982            ! Part II : Differential settling 
    70  
    71             !  Aggregation of small into large particles 
    72             zagg3 =  47.1 * xstep * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jpgoc,Kbb) 
    73             zagg4 =  3.3  * xstep * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jppoc,Kbb) 
     83            ! Aggregation of small into large particles 
     84            ! The stickiness has been assumed to be 0.1 
     85            zagg3 =  8.63  * xstep * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jppoc,Kbb) 
     86            zagg4 =  132.8 * xstep * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jpgoc,Kbb) 
    7487 
    7588            zagg   = zagg1 + zagg2 + zagg3 + zagg4 
     
    8093            ! 2nd term is shear aggregation of DOC-POC 
    8194            ! 3rd term is differential settling of DOC-POC 
    82             zaggdoc  = ( ( 0.369 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 102.4 * tr(ji,jj,jk,jppoc,Kbb) ) * zfact       & 
    83             &            + 2.4 * xstep * tr(ji,jj,jk,jppoc,Kbb) ) * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) 
     95            ! 1/3 of DOC is supposed to experience aggregation (HMW) 
     96            zaggdoc  = ( ( 12.0 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 9.05 * tr(ji,jj,jk,jppoc,Kbb) ) * zfact       & 
     97            &            + 2.49 * xstep * tr(ji,jj,jk,jppoc,Kbb) ) * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) 
    8498            ! transfer of DOC to GOC :  
    8599            ! 1st term is shear aggregation 
    86             ! 2nd term is differential settling  
    87             zaggdoc2 = ( 3.53E3 * zfact + 0.1 * xstep ) * tr(ji,jj,jk,jpgoc,Kbb) * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) 
     100            ! 1/3 of DOC is supposed to experience aggregation (HMW) 
     101            zaggdoc2 = ( 1.94 * zfact + 1.37 * xstep ) * tr(ji,jj,jk,jpgoc,Kbb) * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) 
    88102            ! tranfer of DOC to POC due to brownian motion 
    89             zaggdoc3 =  114. * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) *xstep * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) 
     103            ! The temperature dependency has been omitted. 
     104            zaggdoc3 =  ( 127.8 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 725.7 * tr(ji,jj,jk,jppoc,Kbb) ) * xstep * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) 
    90105 
    91106            !  Update the trends 
     
    101116         END_3D 
    102117      ELSE    ! ln_p5z 
     118        ! PISCES-QUOTA part 
    103119        ! 
    104120         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
     
    106122            zfact = xstep * xdiss(ji,jj,jk) 
    107123            !  Part I : Coagulation dependent on turbulence 
     124            ! The stickiness has been assumed to be 0.1 
    108125            zaggtmp = 25.9  * zfact * tr(ji,jj,jk,jppoc,Kbb) 
    109126            zaggpoc1 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb) 
    110127            zaggtmp = 4452. * zfact * tr(ji,jj,jk,jpgoc,Kbb) 
    111128            zaggpoc2 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb) 
    112  
     129                   
    113130            ! Part II : Differential settling 
    114  
     131            ! The stickiness has been assumed to be 0.1 
     132    
    115133            !  Aggregation of small into large particles 
    116134            zaggtmp =  47.1 * xstep * tr(ji,jj,jk,jpgoc,Kbb) 
     
    119137            zaggpoc4 = zaggtmp * tr(ji,jj,jk,jppoc,Kbb) 
    120138 
    121             zaggpoc   = zaggpoc1 + zaggpoc2 + zaggpoc3 + zaggpoc4 
     139            zaggpoc = zaggpoc1 + zaggpoc2 + zaggpoc3 + zaggpoc4 
    122140            zaggpon = zaggpoc * tr(ji,jj,jk,jppon,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
    123141            zaggpop = zaggpoc * tr(ji,jj,jk,jppop,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
    124             zaggfe = zaggpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb)  + rtrn ) 
     142            zaggfe  = zaggpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb)  + rtrn ) 
    125143 
    126144            ! Aggregation of DOC to POC :  
     
    128146            ! 2nd term is shear aggregation of DOC-POC 
    129147            ! 3rd term is differential settling of DOC-POC 
    130             zaggtmp = ( ( 0.369 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 102.4 * tr(ji,jj,jk,jppoc,Kbb) ) * zfact       & 
    131             &            + 2.4 * xstep * tr(ji,jj,jk,jppoc,Kbb) ) 
     148            ! 1/3 of DOC is supposed to experience aggregation (HMW) 
     149            zaggtmp = ( ( 0.37 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 20.5 * tr(ji,jj,jk,jppoc,Kbb) ) * zfact       & 
     150            &            + 0.15 * xstep * tr(ji,jj,jk,jppoc,Kbb) ) 
    132151            zaggdoc  = zaggtmp * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) 
    133152            zaggdon  = zaggtmp * 0.3 * tr(ji,jj,jk,jpdon,Kbb) 
     
    137156            ! 1st term is shear aggregation 
    138157            ! 2nd term is differential settling  
    139             zaggtmp = ( 3.53E3 * zfact + 0.1 * xstep ) * tr(ji,jj,jk,jpgoc,Kbb) 
     158            ! 1/3 of DOC is supposed to experience aggregation (HMW) 
     159            zaggtmp = 655.4 * zfact * tr(ji,jj,jk,jpgoc,Kbb) 
    140160            zaggdoc2 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) 
    141161            zaggdon2 = zaggtmp * 0.3 * tr(ji,jj,jk,jpdon,Kbb) 
     
    143163 
    144164            ! tranfer of DOC to POC due to brownian motion 
    145             zaggtmp = ( 114. * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) ) * xstep 
     165            ! 1/3 of DOC is supposed to experience aggregation (HMW) 
     166            zaggtmp = ( 260.2 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) +  418.5 * tr(ji,jj,jk,jppoc,Kbb) ) * xstep 
    146167            zaggdoc3 =  zaggtmp * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) 
    147168            zaggdon3 =  zaggtmp * 0.3 * tr(ji,jj,jk,jpdon,Kbb) 
    148169            zaggdop3 =  zaggtmp * 0.3 * tr(ji,jj,jk,jpdop,Kbb) 
     170 
    149171 
    150172            !  Update the trends 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zbc.F90

    r15090 r15459  
    7171      ! 
    7272      INTEGER  ::  ji, jj, jk, jl  
    73       REAL(wp) ::  zcoef, zyyss 
    74       REAL(wp) ::  zdep, ztrfer, zwdust, zwflux, zrivdin 
     73      REAL(wp) ::  zdep, zwflux, zironice 
     74      REAL(wp) ::  zcoef, zwdust, zrivdin, zdustdep, zndep 
    7575      ! 
    7676      CHARACTER (len=25) :: charout 
    77       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zirondep 
    78       REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: zironice, zndep 
    7977      !!--------------------------------------------------------------------- 
    8078      ! 
    8179      IF( ln_timing )   CALL timing_start('p4z_bc') 
    82       ! 
     80       
     81      ! Add the external input of nutrients from dust deposition in the water column 
     82      ! The inputs at surface have already been added 
     83      ! ---------------------------------------------------------- 
    8384      IF( ll_dust )  THEN 
    84          ALLOCATE(  zirondep(jpi,jpj,jpk) ) 
    8585         ! 
    8686         CALL fld_read( kt, 1, sf_dust ) 
    8787         dust(:,:) = MAX( rtrn, sf_dust(1)%fnow(:,:,1) ) 
    8888         ! 
    89          jl = n_trc_indsbc(jpfer) 
    90          zirondep(:,:,1) = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(:,:,1) / e3t(:,:,1,Kmm) / rn_sbc_time 
    91          !                                              ! Iron solubilization of particles in the water column 
    92          !                                              ! dust in kg/m2/s ---> 1/55.85 to put in mol/Fe ;  wdust in m/j 
    93          zwdust = 0.03 / ( wdust / rday ) / ( 270. * rday ) 
    94          DO jk = 2, jpkm1 
    95             zirondep(:,:,jk) = ( mfrac * dust(:,:) * zwdust / mMass_Fe ) * rfact * EXP( -gdept(:,:,jk,Kmm) / 540. ) 
    96             tr(:,:,jk,jpfer,Krhs) = tr(:,:,jk,jpfer,Krhs) + zirondep(:,:,jk) 
    97             tr(:,:,jk,jppo4,Krhs) = tr(:,:,jk,jppo4,Krhs) + zirondep(:,:,jk) * 0.023 
    98          ENDDO 
     89         ! Iron solubilization of particles in the water column 
     90         ! dust in kg/m2/s ---> 1/55.85 to put in mol/Fe ;  wdust in m/d 
     91         ! Dust are supposed to sink at wdust sinking speed. 3% of the iron  
     92         ! in dust is hypothesized to be soluble at a dissolution rate set to  
     93         ! 1/(250 days). The vertical distribution of iron in dust is computed  
     94         ! from a steady state assumption. Parameters are very uncertain and  
     95         ! are estimated from the literature quoted in Raiswell et al. (2011)  
     96         ! -------------------------------------------------------------------  
     97 
     98         zwdust = 0.03 / ( wdust / rday ) / ( 250. * rday ) 
     99 
     100         ! Atmospheric input of Iron dissolves in the water column 
     101         IF ( ln_trc_sbc(jpfer) ) THEN 
     102            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 ) 
     103               zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) 
     104               ! 
     105               tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zdustdep * mfrac / mMass_Fe  
     106            END_3D 
     107 
     108            IF( lk_iomput ) THEN 
     109                ! surface downward dust depo of iron 
     110                jl = n_trc_indsbc(jpfer) 
     111                CALL iom_put( "Irondep", ( rf_trsfac(jl) * sf_trcsbc(jl)%fnow(:,:,1) / rn_sbc_time ) * 1.e+3 * tmask(:,:,1) ) 
     112 
     113            ENDIF 
     114 
     115         ENDIF 
     116 
     117         ! Atmospheric input of PO4 dissolves in the water column 
     118         IF ( ln_trc_sbc(jppo4) ) THEN 
     119            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 ) 
     120               zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) 
     121               ! 
     122               tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zdustdep * 1.e-3 / mMass_P 
     123            END_3D 
     124         ENDIF 
     125 
     126         ! Atmospheric input of Si dissolves in the water column 
     127         IF ( ln_trc_sbc(jpsil) ) THEN 
     128            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 ) 
     129               zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) 
     130               ! 
     131               tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) + zdustdep * 0.269 / mMass_Si 
     132            END_3D 
     133         ENDIF 
     134 
    99135         ! 
    100136         IF( lk_iomput ) THEN 
    101              CALL iom_put( "Irondep", zirondep(:,:,1) * 1.e+3 * rfactr * e3t(:,:,1,Kmm) * tmask(:,:,1) ) ! surface downward dust depo of iron 
    102              CALL iom_put( "pdust"  , dust(:,:) / ( wdust * rday ) * tmask(:,:,1) ) ! dust concentration at surface 
    103          ENDIF 
    104          DEALLOCATE( zirondep ) 
    105       ENDIF 
    106  
    107       ! N/P and Si releases due to coastal rivers 
    108       ! Compute river at nit000 or only if there is more than 1 time record in river file 
     137             ! dust concentration at surface 
     138             CALL iom_put( "pdust"  , dust(:,:) / ( wdust / rday ) * tmask(:,:,1) ) ! dust concentration at surface 
     139         ENDIF 
     140      ENDIF 
     141 
    109142      ! ----------------------------------------- 
    110             ! Add the external input of nutrients from river 
     143      ! Add the external input of nutrients from river 
    111144      ! ---------------------------------------------------------- 
    112145      IF( ll_river ) THEN 
     
    124157      ! ---------------------------------------------------------- 
    125158      IF( ll_ndepo ) THEN 
    126          ALLOCATE( zndep(jpi,jpj) ) 
    127159         IF( ln_trc_sbc(jpno3) ) THEN 
    128160            jl = n_trc_indsbc(jpno3) 
    129             zndep(:,:) = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(:,:,1) / e3t(:,:,1,Kmm) / rn_sbc_time 
    130             tr(:,:,1,jptal,Krhs) = tr(:,:,1,jptal,Krhs) - rno3 * zndep(:,:) * rfact 
     161            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     162               zndep = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(ji,jj,1) / e3t(ji,jj,1,Kmm) / rn_sbc_time 
     163               tr(ji,jj,1,jptal,Krhs) = tr(ji,jj,1,jptal,Krhs) - rno3 * zndep * rfact 
     164            END_2D 
    131165         ENDIF 
    132166         IF( ln_trc_sbc(jpnh4) ) THEN 
    133167            jl = n_trc_indsbc(jpnh4) 
    134             zndep(:,:) = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(:,:,1) / e3t(:,:,1,Kmm) / rn_sbc_time 
    135             tr(:,:,1,jptal,Krhs) = tr(:,:,1,jptal,Krhs) - rno3 * zndep(:,:) * rfact 
    136          ENDIF 
    137          DEALLOCATE( zndep ) 
    138       ENDIF 
    139       ! 
    140       ! Iron input/uptake due to sea ice : Crude parameterization based on 
    141       ! Lancelot et al. 
     168            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     169               zndep = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(ji,jj,1) / e3t(ji,jj,1,Kmm) / rn_sbc_time 
     170               tr(ji,jj,1,jptal,Krhs) = tr(ji,jj,1,jptal,Krhs) + rno3 * zndep * rfact 
     171            END_2D 
     172         ENDIF 
     173      ENDIF 
     174      ! 
     175      ! Iron input/uptake due to sea ice : Crude parameterization based on  
     176      ! Lancelot et al. Iron concentration in sea-ice is constant and set  
     177      ! in the namelist_pisces (icefeinput). ln_ironice is forced to false 
     178      ! when nn_ice_tr = 1 
    142179      ! ---------------------------------------------------- 
    143180      IF( ln_ironice ) THEN 
    144181         ! 
    145          ALLOCATE( zironice(jpi,jpj) ) 
    146          ! 
     182         ! Compute the iron flux between sea ice and sea water 
     183         ! Simple parameterization assuming a fixed constant concentration in 
     184         ! sea-ice (icefeinput) 
     185         ! ------------------------------------------------------------------          
    147186         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    148             zdep    = rfact / e3t(ji,jj,1,Kmm) 
    149             zwflux  = fmmflx(ji,jj) / 1000._wp 
    150             zironice(ji,jj) =  MAX( -0.99 * tr(ji,jj,1,jpfer,Kbb), -zwflux * icefeinput * zdep ) 
     187            zdep     = rfact / e3t(ji,jj,1,Kmm) 
     188            zwflux   = fmmflx(ji,jj) / 1000._wp 
     189            zironice =  MAX( -0.99 * tr(ji,jj,1,jpfer,Kbb), -zwflux * icefeinput * zdep ) 
     190            tr(ji,jj,1,jpfer,Krhs) = tr(ji,jj,1,jpfer,Krhs) + zironice 
    151191         END_2D 
    152192         ! 
    153          tr(:,:,1,jpfer,Krhs) = tr(:,:,1,jpfer,Krhs) + zironice(:,:) 
    154          ! 
    155          IF( lk_iomput )  CALL iom_put( "Ironice", zironice(:,:) * 1.e+3 * rfactr * e3t(:,:,1,Kmm) * tmask(:,:,1) ) ! iron flux from ice 
    156          ! 
    157          DEALLOCATE( zironice ) 
     193         ! iron flux from ice 
     194         IF( lk_iomput ) & 
     195         & CALL iom_put( "Ironice", MAX( -0.99 * tr(:,:,1,jpfer,Kbb), (-1.*fmmflx(:,:)/1000._wp )*icefeinput*1.e+3*tmask(:,:,1)) ) 
    158196         ! 
    159197      ENDIF 
     
    212250      !! 
    213251      NAMELIST/nampisbc/cn_dir, sn_dust, sn_ironsed, sn_hydrofe, & 
    214         &                ln_ironsed, ln_ironice, ln_hydrofe,    & 
    215         &                sedfeinput, distcoast, icefeinput, wdust, mfrac,  & 
     252        &                ln_ironsed, ln_ironice, ln_hydrofe,     & 
     253        &                sedfeinput, distcoast, icefeinput, wdust, mfrac,   & 
    216254        &                hratio, lgw_rath 
    217255      !!---------------------------------------------------------------------- 
     
    254292      END IF 
    255293 
    256       ll_bc    = ( ln_trcbc .AND. lltrcbc )  .OR. ln_hydrofe .OR. ln_ironsed .OR. ln_ironice 
    257       ll_dust  =  ln_trc_sbc(jpfer)    
     294      ll_bc    = ( ln_trcbc .AND. lltrcbc )  .OR. ln_hydrofe .OR. ln_ironsed .OR. ln_ironice  
     295      ll_dust  =  ln_trc_sbc(jpfer) .OR. ln_trc_sbc(jppo4) .OR. ln_trc_sbc(jpsil) .OR. ln_sediment 
    258296      ll_ndepo =  ln_trc_sbc(jpno3) .OR. ln_trc_sbc(jpnh4)    
    259297      ll_river =  ln_trc_cbc(jpno3)   
     
    269307         ! 
    270308         ALLOCATE( sf_dust(1), STAT=ierr )           !* allocate and fill sf_sst (forcing structure) with sn_sst 
    271          IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_sed_init: unable to allocate sf_dust structure' ) 
    272          ! 
    273          CALL fld_fill( sf_dust, (/ sn_dust /), cn_dir, 'p4z_sed_init', 'Atmospheric dust deposition', 'nampissed' ) 
     309         IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_bc_init: unable to allocate sf_dust structure' ) 
     310         ! 
     311         CALL fld_fill( sf_dust, (/ sn_dust /), cn_dir, 'p4z_bc_init', 'Atmospheric dust deposition', 'nampisbc' ) 
    274312                                   ALLOCATE( sf_dust(1)%fnow(jpi,jpj,1)   ) 
    275313         IF( sn_dust%ln_tint )     ALLOCATE( sf_dust(1)%fdta(jpi,jpj,1,2) ) 
     
    337375         ! 
    338376         ALLOCATE( sf_hydrofe(1), STAT=ierr )           !* allocate and fill sf_sst (forcing structure) with sn_sst 
    339          IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_sed_init: unable to allocate sf_hydro structure' ) 
    340          ! 
    341          CALL fld_fill( sf_hydrofe, (/ sn_hydrofe /), cn_dir, 'p4z_sed_init', 'Input of iron from hydrothermal vents', 'nampisbc' ) 
     377         IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_bc_init: unable to allocate sf_hydro structure' ) 
     378         ! 
     379         CALL fld_fill( sf_hydrofe, (/ sn_hydrofe /), cn_dir, 'p4z_bc_init', 'Input of iron from hydrothermal vents', 'nampisbc' ) 
    342380                                   ALLOCATE( sf_hydrofe(1)%fnow(jpi,jpj,jpk)   ) 
    343381         IF( sn_hydrofe%ln_tint )    ALLOCATE( sf_hydrofe(1)%fdta(jpi,jpj,jpk,2) ) 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zbio.F90

    r15090 r15459  
    22   !!====================================================================== 
    33   !!                         ***  MODULE p4zbio  *** 
    4    !! TOP :   PISCES bio-model 
     4   !! TOP :   PISCES biogeochemical model 
     5   !!         This module is for both PISCES and PISCES-QUOTA 
    56   !!====================================================================== 
    67   !! History :   1.0  !  2004     (O. Aumont) Original code 
    78   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90 
     9   !!             3.6  ! 2015 (O. Aumont) PISCES-QUOTA 
    810   !!---------------------------------------------------------------------- 
    911   !!   p4z_bio        :   computes the interactions between the different 
     
    5355      !! 
    5456      !! ** Purpose :   Ecosystem model in the whole ocean: computes the 
    55       !!              different interactions between the different compartments 
    56       !!              of PISCES 
     57      !!                different interactions between the different compartments 
     58      !!                of PISCES 
    5759      !! 
    5860      !! ** Method  : - ??? 
     
    6668      ! 
    6769      IF( ln_timing )   CALL timing_start('p4z_bio') 
    68       ! 
    69       !     ASSIGN THE SHEAR RATE THAT IS USED FOR AGGREGATION 
    70       !     OF PHYTOPLANKTON AND DETRITUS 
    7170 
     71      ! ASSIGN THE SHEAR RATE THAT IS USED FOR AGGREGATION 
     72      ! OF PHYTOPLANKTON AND DETRITUS. Shear rate is supposed to equal 1 
     73      ! in the mixed layer and 0.1 below the mixed layer. 
    7274      xdiss(:,:,:) = 1. 
    73 !!gm the use of nmld should be better here? 
    7475      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 ) 
    75 !!gm  :  use nmln  and test on jk ...  less memory acces 
    7676         IF( gdepw(ji,jj,jk+1,Kmm) > hmld(ji,jj) )   xdiss(ji,jj,jk) = 0.01 
    7777      END_3D 
     
    8181      CALL p4z_fechem  ( kt, knt, Kbb, Kmm, Krhs )     ! Iron chemistry/scavenging 
    8282      ! 
    83       IF( ln_p4z ) THEN 
     83      IF( ln_p4z ) THEN  ! PISCES standard 
     84         ! Phytoplankton only sources/sinks terms 
    8485         CALL p4z_lim  ( kt, knt, Kbb, Kmm       )     ! co-limitations by the various nutrients 
    8586         CALL p4z_prod ( kt, knt, Kbb, Kmm, Krhs )     ! phytoplankton growth rate over the global ocean.  
    8687         !                                          ! (for each element : C, Si, Fe, Chl ) 
    8788         CALL p4z_mort ( kt,      Kbb,      Krhs )     ! phytoplankton mortality 
    88          !                                          ! zooplankton sources/sinks routines  
     89         ! zooplankton sources/sinks routines  
    8990         CALL p4z_micro( kt, knt, Kbb,      Krhs )     ! microzooplankton 
    90          CALL p4z_meso ( kt, knt, Kbb,      Krhs )     ! mesozooplankton 
    91       ELSE 
     91         CALL p4z_meso ( kt, knt, Kbb, Kmm, Krhs )     ! mesozooplankton 
     92      ELSE  ! PISCES-QUOTA 
     93         ! Phytoplankton only sources/sinks terms 
    9294         CALL p5z_lim  ( kt, knt, Kbb, Kmm       )     ! co-limitations by the various nutrients 
    9395         CALL p5z_prod ( kt, knt, Kbb, Kmm, Krhs )     ! phytoplankton growth rate over the global ocean.  
    9496         !                                          ! (for each element : C, Si, Fe, Chl ) 
    9597         CALL p5z_mort ( kt,      Kbb,      Krhs      )     ! phytoplankton mortality 
    96          !                                          ! zooplankton sources/sinks routines  
     98         !  zooplankton sources/sinks routines  
    9799         CALL p5z_micro( kt, knt, Kbb,      Krhs )           ! microzooplankton 
    98          CALL p5z_meso ( kt, knt, Kbb,     Krhs )           ! mesozooplankton 
     100         CALL p5z_meso ( kt, knt, Kbb, Kmm, Krhs )           ! mesozooplankton 
    99101      ENDIF 
    100102      ! 
     
    103105      CALL p4z_poc     ( kt, knt, Kbb, Kmm, Krhs )     ! Remineralization of organic particles 
    104106      ! 
     107      ! Ligand production. ln_ligand should be set .true. to activate 
    105108      IF( ln_ligand )  & 
    106109      & CALL p4z_ligand( kt, knt, Kbb,      Krhs ) 
     110 
     111      ! Update of the size of the different phytoplankton groups 
     112      sized(:,:,:) = MAX(1.0, sizeda(:,:,:) ) 
     113      sizen(:,:,:) = MAX(1.0, sizena(:,:,:) ) 
     114      IF (ln_p5z) THEN 
     115         sizep(:,:,:) = MAX(1.0, sizepa(:,:,:) ) 
     116      ENDIF 
    107117      !                                                             ! 
    108118      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging) 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zche.F90

    r15090 r15459  
    195195         !                             ! LN(K0) OF SOLUBILITY OF CO2 (EQ. 12, WEISS, 1980) 
    196196         !                             !     AND FOR THE ATMOSPHERE FOR NON IDEAL GAS 
    197          zcek1 = 9345.17/ztkel - 60.2409 + 23.3585 * LOG(zt) + zsal*(0.023517 - 0.00023656*ztkel    & 
    198          &       + 0.0047036e-4*ztkel**2) 
    199          chemc(ji,jj,1) = EXP( zcek1 ) * 1E-6 * rhop(ji,jj,1) / 1000. ! mol/(L atm) 
     197         zcek1 = 9050.69/ztkel - 58.0931 + 22.2940 * LOG(zt) + zsal*(0.027766 - 0.00025888*ztkel    & 
     198         &       + 0.0050578e-4*ztkel**2) 
     199         chemc(ji,jj,1) = EXP( zcek1 ) * 1E-6   ! mol/(L atm) 
    200200         chemc(ji,jj,2) = -1636.75 + 12.0408*ztkel - 0.0327957*ztkel**2 + 0.0000316528*ztkel**3 
    201201         chemc(ji,jj,3) = 57.7 - 0.118*ztkel 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zfechem.F90

    r15090 r15459  
    3030   REAL(wp), PUBLIC ::   ligand       !: ligand concentration in the ocean  
    3131   REAL(wp), PUBLIC ::   kfep         !: rate constant for nanoparticle formation 
     32   REAL(wp), PUBLIC ::   scaveff      !: Fraction of scavenged iron that is considered as being subject to solubilization 
    3233 
    3334   !! * Substitutions 
     
    5455      ! 
    5556      INTEGER  ::   ji, jj, jk, jic, jn 
    56       REAL(wp) ::   zdep, zlam1a, zlam1b, zlamfac 
    57       REAL(wp) ::   zkeq, zfeequi, zfesatur, zfecoll, fe3sol 
    58       REAL(wp) ::   zdenom1, zscave, zaggdfea, zaggdfeb, zcoag 
    59       REAL(wp) ::   ztrc, zdust 
    60       REAL(wp) ::   zdenom2 
    61       REAL(wp) ::   zzFeL1, zzFeL2, zzFe2, zzFeP, zzFe3, zzstrn2 
    62       REAL(wp) ::   zrum, zcodel, zargu, zlight 
    63       REAL(wp) ::   zkox, zkph1, zkph2, zph, zionic, ztligand 
    64       REAL(wp) ::   za, zb, zc, zkappa1, zkappa2, za0, za1, za2 
    65       REAL(wp) ::   zxs, zfunc, zp, zq, zd, zr, zphi, zfff, zp3, zq2 
    66       REAL(wp) ::   ztfe, zoxy, zhplus, zxlam 
    67       REAL(wp) ::   zaggliga, zaggligb 
    68       REAL(wp) ::   dissol, zligco 
    69       REAL(wp) :: zrfact2 
     57      REAL(wp) ::   zlam1a, zlam1b 
     58      REAL(wp) ::   zkeq, zfesatur, fe3sol, zligco 
     59      REAL(wp) ::   zscave, zaggdfea, zaggdfeb, ztrc, zdust, zklight 
     60      REAL(wp) ::   ztfe, zhplus, zxlam, zaggliga, zaggligb 
     61      REAL(wp) ::   zprecip, zprecipno3,  zconsfe, za1 
     62      REAL(wp) ::   zrfact2 
    7063      CHARACTER (len=25) :: charout 
    71       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zTL1, zFe3, ztotlig, precip, zFeL1 
     64      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zTL1, zFe3, ztotlig, zfeprecip, zFeL1, zfecoll 
    7265      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zcoll3d, zscav3d, zlcoll3d 
    7366      !!--------------------------------------------------------------------- 
     
    7568      IF( ln_timing )   CALL timing_start('p4z_fechem') 
    7669      ! 
     70      zFe3     (:,:,jpk) = 0. 
     71      zFeL1    (:,:,jpk) = 0. 
     72      zTL1     (:,:,jpk) = 0. 
     73      zfeprecip(:,:,jpk) = 0. 
     74      zcoll3d  (:,:,jpk) = 0. 
     75      zscav3d  (:,:,jpk) = 0. 
     76      zlcoll3d (:,:,jpk) = 0. 
     77      zfecoll  (:,:,jpk) = 0. 
     78      xfecolagg(:,:,jpk) = 0. 
     79      xcoagfe  (:,:,jpk) = 0. 
     80      ! 
    7781      ! Total ligand concentration : Ligands can be chosen to be constant or variable 
    78       ! Parameterization from Tagliabue and Voelker (2011) 
     82      ! Parameterization from Pham and Ito (2018) 
    7983      ! ------------------------------------------------- 
     84      xfecolagg(:,:,:) = ligand * 1E9 + MAX(0., chemo2(:,:,:) - tr(:,:,:,jpoxy,Kbb) ) / 400.E-6 
    8085      IF( ln_ligvar ) THEN 
    81          ztotlig(:,:,:) =  0.09 * tr(:,:,:,jpdoc,Kbb) * 1E6 + ligand * 1E9 
     86         ztotlig(:,:,:) =  0.09 * 0.667 * tr(:,:,:,jpdoc,Kbb) * 1E6 + xfecolagg(:,:,:) 
    8287         ztotlig(:,:,:) =  MIN( ztotlig(:,:,:), 10. ) 
    8388      ELSE 
    8489        IF( ln_ligand ) THEN  ;   ztotlig(:,:,:) = tr(:,:,:,jplgw,Kbb) * 1E9 
    85         ELSE                  ;   ztotlig(:,:,:) = ligand * 1E9 
     90        ELSE                  ;   ztotlig(:,:,:) = ligand * 1E9  
    8691        ENDIF 
    8792      ENDIF 
     
    8994      ! ------------------------------------------------------------ 
    9095      !  from Aumont and Bopp (2006) 
    91       ! This model is based on one ligand and Fe'  
     96      ! This model is based on one ligand, Fe2+ and Fe3+  
    9297      ! Chemistry is supposed to be fast enough to be at equilibrium 
    9398      ! ------------------------------------------------------------ 
    9499      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    95          zTL1(ji,jj,jk)  = ztotlig(ji,jj,jk) 
    96          zkeq            = fekeq(ji,jj,jk) 
    97          zfesatur        = zTL1(ji,jj,jk) * 1E-9 
    98          ztfe            = tr(ji,jj,jk,jpfer,Kbb)  
    99          ! Fe' is the root of a 2nd order polynom 
    100          zFe3 (ji,jj,jk) = ( -( 1. + zfesatur * zkeq - zkeq * ztfe )               & 
    101             &              + SQRT( ( 1. + zfesatur * zkeq - zkeq * ztfe )**2       & 
    102             &              + 4. * ztfe * zkeq) ) / ( 2. * zkeq ) 
    103          zFe3 (ji,jj,jk) = zFe3(ji,jj,jk) * 1E9 
    104          zFeL1(ji,jj,jk) = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) * 1E9 - zFe3(ji,jj,jk) ) 
     100          zTL1(ji,jj,jk)  = ztotlig(ji,jj,jk) 
     101          zkeq            = fekeq(ji,jj,jk) 
     102          zklight         = 4.77E-7 * etot(ji,jj,jk) * 0.5 / ( 10**(-6.3) ) 
     103          zconsfe         = consfe3(ji,jj,jk) / ( 10**(-6.3) ) 
     104          zfesatur        = zTL1(ji,jj,jk) * 1E-9 
     105          ztfe            = (1.0 + zklight) * tr(ji,jj,jk,jpfer,Kbb)  
     106          ! Fe' is the root of a 2nd order polynom 
     107          za1 =  1. + zfesatur * zkeq + zklight +  zconsfe - zkeq * tr(ji,jj,jk,jpfer,Kbb) 
     108          zFe3 (ji,jj,jk) = ( -1 * za1 + SQRT( za1**2 + 4. * ztfe * zkeq) ) / ( 2. * zkeq + rtrn ) 
     109          zFeL1(ji,jj,jk) = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) - zFe3(ji,jj,jk) ) 
    105110      END_3D 
    106          ! 
    107  
     111      ! 
     112      plig(:,:,:) =  MAX( 0., ( zFeL1(:,:,:) / ( tr(:,:,:,jpfer,Kbb) + rtrn ) ) ) 
     113      ! 
    108114      zdust = 0.         ! if no dust available 
     115 
     116      ! Computation of the colloidal fraction that is subjecto to coagulation 
     117      ! The assumption is that 50% of complexed iron is colloidal. Furthermore 
     118      ! The refractory part is supposed to be non sticky. The refractory 
     119      ! fraction is supposed to equal to the background concentration +  
     120      ! the fraction that accumulates in the deep ocean. AOU is taken as a  
     121      ! proxy of that accumulation following numerous studies showing  
     122      ! some relationship between weak ligands and AOU. 
     123      ! An issue with that parameterization is that when ligands are not 
     124      ! prognostic or non variable, all the colloidal fraction is supposed 
     125      ! to coagulate 
     126      ! ---------------------------------------------------------------------- 
     127      IF (ln_ligand) THEN 
     128         zfecoll(:,:,:) = 0.5 * zFeL1(:,:,:) * MAX(0., tr(:,:,:,jplgw,Kbb) - xfecolagg(:,:,:) * 1.0E-9 ) / ( tr(:,:,:,jplgw,Kbb) + rtrn )  
     129      ELSE 
     130         IF (ln_ligvar) THEN 
     131            zfecoll(:,:,:) = 0.5 * zFeL1(:,:,:) * MAX(0., tr(:,:,:,jplgw,Kbb) - xfecolagg(:,:,:) * 1.0E-9 ) / ( tr(:,:,:,jplgw,Kbb) + rtrn )    
     132         ELSE 
     133            zfecoll(:,:,:) = 0.5 * zFeL1(:,:,:) 
     134         ENDIF 
     135      ENDIF 
     136 
    109137      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    110138         ! Scavenging rate of iron. This scavenging rate depends on the load of particles of sea water.  
     
    117145         &         + fesol(ji,jj,jk,5) / zhplus ) 
    118146         ! 
    119          zfeequi = zFe3(ji,jj,jk) * 1E-9 
    120          zfecoll = 0.5 * zFeL1(ji,jj,jk) * 1E-9 
    121147         ! precipitation of Fe3+, creation of nanoparticles 
    122          precip(ji,jj,jk) = MAX( 0., ( zFe3(ji,jj,jk) * 1E-9 - fe3sol ) ) * kfep * xstep 
     148         zprecip = MAX( 0., ( zFe3(ji,jj,jk) - fe3sol ) ) * kfep * xstep * ( 1.0 - nitrfac(ji,jj,jk) )  
     149         ! Precipitation of Fe2+ due to oxidation by NO3 (Croot et al., 2019) 
     150         ! This occurs in anoxic waters only 
     151         zprecipno3 = 2.0 * 130.0 * tr(ji,jj,jk,jpno3,Kbb) * nitrfac(ji,jj,jk) * xstep * zFe3(ji,jj,jk) 
     152         ! 
     153         zfeprecip(ji,jj,jk) = zprecip + zprecipno3 
    123154         ! 
    124155         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  
    125          IF( ll_dust )  zdust  = dust(ji,jj) / ( wdust / rday ) * tmask(ji,jj,jk) & 
    126          &  * EXP( -gdept(ji,jj,jk,Kmm) / 540. ) 
    127          IF (ln_ligand) THEN 
    128             zxlam  = xlam1 * MAX( 1.E-3, EXP(-2 * etot(ji,jj,jk) / 10. ) * (1. - EXP(-2 * tr(ji,jj,jk,jpoxy,Kbb) / 100.E-6 ) )) 
    129          ELSE 
    130             zxlam  = xlam1 * 1.0 
    131          ENDIF 
    132          zlam1b = 3.e-5 + xlamdust * zdust + zxlam * ztrc 
    133          zscave = zfeequi * zlam1b * xstep 
    134  
    135          ! Compute the different ratios for scavenging of iron 
    136          ! to later allocate scavenged iron to the different organic pools 
    137          ! --------------------------------------------------------- 
    138          zdenom1 = zxlam * tr(ji,jj,jk,jppoc,Kbb) / zlam1b 
    139          zdenom2 = zxlam * tr(ji,jj,jk,jpgoc,Kbb) / zlam1b 
    140  
    141          !  Increased scavenging for very high iron concentrations found near the coasts  
    142          !  due to increased lithogenic particles and let say it is unknown processes (precipitation, ...) 
    143          !  ----------------------------------------------------------- 
    144          zlamfac = MAX( 0.e0, ( gphit(ji,jj) + 55.) / 30. ) 
    145          zlamfac = MIN( 1.  , zlamfac ) 
    146          zdep    = MIN( 1., 1000. / gdept(ji,jj,jk,Kmm) ) 
    147          zcoag   = 1E-4 * ( 1. - zlamfac ) * zdep * xstep * tr(ji,jj,jk,jpfer,Kbb) 
     156         ztrc = MAX( rtrn, ztrc ) 
     157         IF( ll_dust )  zdust  = dust(ji,jj) / ( wdust / rday ) * tmask(ji,jj,jk) 
     158         zxlam  = MAX( 1.E-3, (1. - EXP(-2 * tr(ji,jj,jk,jpoxy,Kbb) / 100.E-6 ) )) 
     159         zlam1b = 3.e-5 + ( xlamdust * zdust + xlam1 * ztrc ) * zxlam 
     160         zscave = zFe3(ji,jj,jk) * zlam1b * xstep 
    148161 
    149162         !  Compute the coagulation of colloidal iron. This parameterization  
     
    151164         !  It requires certainly some more work as it is very poorly constrained. 
    152165         !  ---------------------------------------------------------------- 
    153          zlam1a   = ( 0.369  * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 102.4  * tr(ji,jj,jk,jppoc,Kbb) ) * xdiss(ji,jj,jk)    & 
    154              &      + ( 114.   * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) ) 
    155          zaggdfea = zlam1a * xstep * zfecoll 
    156          ! 
    157          zlam1b   = 3.53E3 * tr(ji,jj,jk,jpgoc,Kbb) * xdiss(ji,jj,jk) 
    158          zaggdfeb = zlam1b * xstep * zfecoll 
     166         zlam1a   = ( 12.0  * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 9.05  * tr(ji,jj,jk,jppoc,Kbb) ) * xdiss(ji,jj,jk)    & 
     167             &    + ( 2.49  * tr(ji,jj,jk,jppoc,Kbb) )     & 
     168             &    + ( 127.8 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 725.7 * tr(ji,jj,jk,jppoc,Kbb) ) 
     169         zaggdfea = zlam1a * xstep * zfecoll(ji,jj,jk) 
     170               ! 
     171         zlam1b   = ( 1.94 * xdiss(ji,jj,jk) + 1.37 ) * tr(ji,jj,jk,jpgoc,Kbb) 
     172         zaggdfeb = zlam1b * xstep * zfecoll(ji,jj,jk) 
     173         xcoagfe(ji,jj,jk) = zlam1a + zlam1b 
    159174         ! 
    160175         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zscave - zaggdfea - zaggdfeb & 
    161          &                     - zcoag - precip(ji,jj,jk) 
    162          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zscave * zdenom1 + zaggdfea 
    163          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zscave * zdenom2 + zaggdfeb 
    164          zscav3d(ji,jj,jk)   = zscave 
    165          zcoll3d(ji,jj,jk)   = zaggdfea + zaggdfeb 
     176         &                       - zfeprecip(ji,jj,jk) 
     177 
     178         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc 
     179         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc 
     180 
     181 
     182          ! Precipitated iron is supposed to be permanently lost. 
     183          ! Scavenged iron is supposed to be released back to seawater 
     184          ! when POM is solubilized. This is highly uncertain as probably 
     185          ! a significant part of it may be rescavenged back onto  
     186          ! the particles. An efficiency factor is applied that is read 
     187          ! in the namelist.  
     188          ! See for instance Tagliabue et al. (2019). 
     189          ! Aggregated FeL is considered as biogenic Fe as it  
     190          ! probably remains  complexed when the particle is solubilized. 
     191          ! ------------------------------------------------------------- 
     192          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zaggdfea 
     193          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zaggdfeb 
     194          ! 
     195          zscav3d(ji,jj,jk)   = zscave  
     196          zcoll3d(ji,jj,jk)   = zaggdfea + zaggdfeb 
    166197         ! 
    167198      END_3D 
     
    171202      biron(:,:,:) = tr(:,:,:,jpfer,Kbb)  
    172203      ! 
    173       IF( ln_ligand ) THEN 
    174          ! 
    175          DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    176             zlam1a   = ( 0.369  * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 102.4  * tr(ji,jj,jk,jppoc,Kbb) ) * xdiss(ji,jj,jk)    & 
    177                 &    + ( 114.   * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) ) 
    178             ! 
    179             zlam1b   = 3.53E3 *   tr(ji,jj,jk,jpgoc,Kbb) * xdiss(ji,jj,jk) 
    180             zligco   = 0.5 * tr(ji,jj,jk,jplgw,Kmm) 
    181             zaggliga = zlam1a * xstep * zligco 
    182             zaggligb = zlam1b * xstep * zligco 
    183             tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) - zaggliga - zaggligb 
    184             zlcoll3d(ji,jj,jk)  = zaggliga + zaggligb 
    185          END_3D 
    186          ! 
    187          plig(:,:,:) =  MAX( 0., ( ( zFeL1(:,:,:) * 1E-9 ) / ( tr(:,:,:,jpfer,Kbb) +rtrn ) ) ) 
    188          ! 
    189       ENDIF 
    190204      !  Output of some diagnostics variables 
    191205      !     --------------------------------- 
    192       IF( lk_iomput ) THEN 
    193          IF( knt == nrdttrc ) THEN 
    194             zrfact2 = 1.e3 * rfact2r  ! conversion from mol/L/timestep into mol/m3/s 
    195             IF( iom_use("Fe3")  )  THEN 
    196                zFe3(:,:,jpk) = 0.  ;  CALL iom_put("Fe3" , zFe3(:,:,:) * tmask(:,:,:) )   ! Fe3+ 
    197             ENDIF 
    198             IF( iom_use("FeL1") )  THEN 
    199               zFeL1(:,:,jpk) = 0.  ;  CALL iom_put("FeL1", zFeL1(:,:,:) * tmask(:,:,:) )   ! FeL1 
    200             ENDIF 
    201             IF( iom_use("TL1")  )  THEN 
    202               zTL1(:,:,jpk) = 0.   ;  CALL iom_put("TL1" , zTL1(:,:,:) * tmask(:,:,:) )   ! TL1 
    203             ENDIF 
    204             IF( iom_use("Totlig") )  CALL iom_put("Totlig" , ztotlig(:,:,:)       * tmask(:,:,:) )   ! TL 
    205             IF( iom_use("Biron")  )  CALL iom_put("Biron"  , biron  (:,:,:)  * 1e9 * tmask(:,:,:) )   ! biron 
    206             IF( iom_use("FESCAV") )  THEN 
    207                zscav3d (:,:,jpk) = 0.  ;  CALL iom_put("FESCAV" , zscav3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 ) 
    208             ENDIF 
    209             IF( iom_use("FECOLL") ) THEN 
    210                zcoll3d (:,:,jpk) = 0.  ;   CALL iom_put("FECOLL" , zcoll3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 ) 
    211             ENDIF 
    212             IF( iom_use("LGWCOLL")) THEN 
    213                zlcoll3d(:,:,jpk) = 0.  ;  CALL iom_put("LGWCOLL", zlcoll3d(:,:,:) * 1e9 * tmask(:,:,:) * zrfact2 ) 
    214             ENDIF 
    215           ENDIF 
     206      IF( lk_iomput .AND. knt == nrdttrc ) THEN 
     207         zrfact2 = 1.e3 * rfact2r  ! conversion from mol/L/timestep into mol/m3/s 
     208         IF( iom_use("Fe3")    )  CALL iom_put("Fe3"    , zFe3   (:,:,:)       * tmask(:,:,:) )   ! Fe3+ 
     209         IF( iom_use("FeL1")   )  CALL iom_put("FeL1"   , zFeL1  (:,:,:)       * tmask(:,:,:) )   ! FeL1 
     210         IF( iom_use("TL1")    )  CALL iom_put("TL1"    , zTL1   (:,:,:)       * tmask(:,:,:) )   ! TL1 
     211         IF( iom_use("Totlig") )  CALL iom_put("Totlig" , ztotlig(:,:,:)       * tmask(:,:,:) )   ! TL 
     212         IF( iom_use("Biron")  )  CALL iom_put("Biron"  , biron  (:,:,:)  * 1e9 * tmask(:,:,:) )   ! biron 
     213         IF( iom_use("FESCAV") )  CALL iom_put("FESCAV" , zscav3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 ) 
     214         IF( iom_use("FECOLL") )  CALL iom_put("FECOLL" , zcoll3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 ) 
     215         IF( iom_use("FEPREC") )  CALL iom_put("FEPREC" , zfeprecip(:,:,:) *1e9*tmask(:,:,:)*zrfact2 ) 
    216216      ENDIF 
    217217 
     
    241241      INTEGER ::   ios   ! Local integer  
    242242      !! 
    243       NAMELIST/nampisfer/ ln_ligvar, xlam1, xlamdust, ligand, kfep  
     243      NAMELIST/nampisfer/ ln_ligvar, xlam1, xlamdust, ligand, kfep, scaveff  
    244244      !!---------------------------------------------------------------------- 
    245245      ! 
     
    263263         WRITE(numout,*) '      ligand concentration in the ocean         ligand       =', ligand 
    264264         WRITE(numout,*) '      rate constant for nanoparticle formation  kfep         =', kfep 
    265       ENDIF 
    266       !  
     265         WRITE(numout,*) '      Scavenged iron that is added to POFe      scaveff      =', scaveff 
     266      ENDIF 
     267      ! 
    267268   END SUBROUTINE p4z_fechem_init 
    268269    
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zflx.F90

    r15090 r15459  
    8383      REAL(wp) ::   zyr_dec, zdco2dt 
    8484      CHARACTER (len=25) ::   charout 
    85       REAL(wp), DIMENSION(jpi,jpj) ::   zkgco2, zkgo2, zh2co3, zoflx,  zpco2atm   
     85      REAL(wp), DIMENSION(jpi,jpj) ::   zkgco2, zkgo2, zh2co3, zoflx,  zpco2atm, zpco2oce   
    8686      !!--------------------------------------------------------------------- 
    8787      ! 
     
    158158         zfld = zfco2 * chemc(ji,jj,1) * zkgco2(ji,jj)  ! (mol/L) * (m/s) 
    159159         zflu = zh2co3(ji,jj) * zkgco2(ji,jj)                                   ! (mol/L) (m/s) ? 
    160          oce_co2(ji,jj) = ( zfld - zflu ) * tmask(ji,jj,1)  
     160         zpco2oce(ji,jj) = zh2co3(ji,jj) / ( chemc(ji,jj,1) * zfugcoeff + rtrn ) 
     161         oce_co2(ji,jj)  = ( zfld - zflu ) * tmask(ji,jj,1)  
    161162         ! compute the trend 
    162163         tr(ji,jj,1,jpdic,Krhs) = tr(ji,jj,1,jpdic,Krhs) + oce_co2(ji,jj) * rfact2 / e3t(ji,jj,1,Kmm) 
     
    187188         CALL iom_put( "Oflx"    , zoflx(:,:) * 1000.  ) 
    188189         CALL iom_put( "Kg"      , zkgco2(:,:) * tmask(:,:,1)  ) 
    189          CALL iom_put( "Dpco2"   , ( zpco2atm(:,:) - zh2co3(:,:) / ( chemc(:,:,1) + rtrn ) ) * tmask(:,:,1) ) 
    190          CALL iom_put( "pCO2sea" , ( zh2co3(:,:) / ( chemc(:,:,1) + rtrn ) ) * tmask(:,:,1) ) 
     190         CALL iom_put( "Dpco2"   , ( zpco2atm(:,:) - zpco2oce(:,:) ) * tmask(:,:,1) ) 
     191         CALL iom_put( "pCO2sea" , zpco2oce(:,:) * tmask(:,:,1) ) 
    191192         CALL iom_put( "Dpo2"    , ( atcox * patm(:,:) - atcox * tr(:,:,1,jpoxy,Kbb) / ( chemo2(:,:,1) + rtrn ) ) * tmask(:,:,1) ) 
    192193         CALL iom_put( "tcflx"   , t_oce_co2_flx     )   ! molC/s 
     
    336337      IF( ln_presatm ) THEN 
    337338         CALL fld_read( kt, 1, sf_patm )               !* input Patm provided at kt + 1/2 
    338          patm(:,:) = sf_patm(1)%fnow(:,:,1)                        ! atmospheric pressure 
     339         patm(:,:) = sf_patm(1)%fnow(:,:,1)/101325.0     ! atmospheric pressure 
    339340      ENDIF 
    340341      ! 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zint.F90

    r15090 r15459  
    11MODULE p4zint 
    2    !!====================================================================== 
     2   !!========================================================================= 
    33   !!                         ***  MODULE p4zint  *** 
    44   !! TOP :   PISCES interpolation and computation of various accessory fields 
    5    !!====================================================================== 
     5   !!========================================================================= 
    66   !! History :   1.0  !  2004-03 (O. Aumont) Original code 
    77   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90 
     
    3737      INTEGER, INTENT( in ) ::   Kbb, Kmm ! time level indices 
    3838      ! 
    39       INTEGER  :: ji, jj                 ! dummy loop indices 
    40       REAL(wp) :: zvar                   ! local variable 
     39      INTEGER  :: ji, jj, jk              ! dummy loop indices 
     40      REAL(wp) :: zrum, zcodel, zargu, zvar 
    4141      !!--------------------------------------------------------------------- 
    4242      ! 
     
    4545      ! Computation of phyto and zoo metabolic rate 
    4646      ! ------------------------------------------- 
    47       tgfunc (:,:,:) = EXP( 0.063913 * ts(:,:,:,jp_tem,Kmm) ) 
    48       tgfunc2(:,:,:) = EXP( 0.07608  * ts(:,:,:,jp_tem,Kmm) ) 
     47      ! Generic temperature dependence (Eppley, 1972) 
     48      tgfunc (:,:,:) = EXP( 0.0631 * ts(:,:,:,jp_tem,Kmm) ) 
     49      ! Temperature dependence of mesozooplankton (Buitenhuis et al. (2005)) 
     50      tgfunc2(:,:,:) = EXP( 0.0761 * ts(:,:,:,jp_tem,Kmm) ) 
     51 
    4952 
    5053      ! Computation of the silicon dependant half saturation  constant for silica uptake 
    51       ! --------------------------------------------------- 
     54      ! This is based on an old study by Pondaven et al. (1998) 
     55      ! -------------------------------------------------------------------------------- 
    5256      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    5357         zvar = tr(ji,jj,1,jpsil,Kbb) * tr(ji,jj,1,jpsil,Kbb) 
     
    5559      END_2D 
    5660      ! 
     61      ! At the end of each year, the half saturation constant for silica is  
     62      ! updated as this is based on the highest concentration reached over  
     63      ! the year 
     64      ! ------------------------------------------------------------------- 
    5765      IF( nday_year == nyear_len(1) ) THEN 
    5866         xksi   (:,:) = xksimax(:,:) 
    5967         xksimax(:,:) = 0._wp 
    6068      ENDIF 
     69      ! 
     70      ! compute the day length depending on latitude and the day 
     71      ! Astronomical parameterization taken from HAMOCC3 
     72      zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp ) 
     73      zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  ) 
     74 
     75      ! day length in hours 
     76      strn(:,:) = 0. 
     77      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     78         zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad ) 
     79         zargu = MAX( -1., MIN(  1., zargu ) ) 
     80         strn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. ) 
     81      END_2D 
     82      ! 
     83      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
     84        ! denitrification factor computed from O2 levels 
     85         ! This factor diagnoses below which level of O2 denitrification 
     86         ! is active 
     87         nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - tr(ji,jj,jk,jpoxy,Kbb) )    & 
     88            &                                / ( oxymin + tr(ji,jj,jk,jpoxy,Kbb) )  ) 
     89         nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) ) 
     90         ! 
     91         ! redox factor computed from NO3 levels 
     92         ! This factor diagnoses below which level of NO3 additional redox 
     93         ! reactions are taking place. 
     94         nitrfac2(ji,jj,jk) = MAX( 0.e0,       ( 1.E-6 - tr(ji,jj,jk,jpno3,Kbb) )  & 
     95            &                                / ( 1.E-6 + tr(ji,jj,jk,jpno3,Kbb) ) ) 
     96         nitrfac2(ji,jj,jk) = MIN( 1., nitrfac2(ji,jj,jk) ) 
     97      END_3D 
    6198      ! 
    6299      IF( ln_timing )   CALL timing_stop('p4z_int') 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zligand.F90

    r15090 r15459  
    2525   REAL(wp), PUBLIC ::  rlig     !: Remin ligand production 
    2626   REAL(wp), PUBLIC ::  prlgw    !: Photochemical of weak ligand 
     27   REAL(wp), PUBLIC ::  xklig    !: 1/2 saturation constant of photolysis 
    2728 
    2829   !! * Substitutions 
     
    4546      ! 
    4647      INTEGER  ::   ji, jj, jk 
    47       REAL(wp) ::   zlgwp, zlgwpr, zlgwr, zlablgw 
    48       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zligrem, zligpr, zligprod 
     48      REAL(wp) ::   zlgwp, zlgwpr, zlgwr, zlablgw  
     49      REAL(wp) ::   zlam1a, zlam1b, zaggliga, zligco 
     50      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zligrem, zligpr, zligprod, zlcoll3d 
    4951      CHARACTER (len=25) ::   charout 
    5052      !!--------------------------------------------------------------------- 
     
    6264         ! This is based on the idea that as LGW is lower 
    6365         ! there is a larger fraction of refractory OM 
    64          zlgwr = max( rlgs , rlgw * exp( -2 * (tr(ji,jj,jk,jplgw,Kbb)*1e9) ) ) ! years 
    65          zlgwr = 1. / zlgwr * tgfunc(ji,jj,jk) * ( xstep / nyear_len(1) ) * blim(ji,jj,jk) * tr(ji,jj,jk,jplgw,Kbb) 
     66         zlgwr = ( 1.0 / rlgs * MAX(0., tr(ji,jj,jk,jplgw,Kbb) - xfecolagg(ji,jj,jk) * 1.0E-9 )    & 
     67         &       + 1.0 / rlgw * xfecolagg(ji,jj,jk) * 1.0E-9 ) / ( rtrn + tr(ji,jj,jk,jplgw,Kbb) ) 
     68         zlgwr = zlgwr * tgfunc(ji,jj,jk) * ( xstep / nyear_len(1) ) * blim(ji,jj,jk) * tr(ji,jj,jk,jplgw,Kbb) 
    6669         ! photochem loss of weak ligand 
    67          zlgwpr = prlgw * xstep * etot(ji,jj,jk) * tr(ji,jj,jk,jplgw,Kbb) * (1. - fr_i(ji,jj)) 
    68          tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zlgwp - zlgwr - zlgwpr 
     70         zlgwpr = prlgw * xstep * etot(ji,jj,jk) * tr(ji,jj,jk,jplgw,Kbb)**3 * (1. - fr_i(ji,jj))   & 
     71         &        / ( tr(ji,jj,jk,jplgw,Kbb)**2 + (xklig)**2) 
     72         ! Coagulation of ligands due to various processes (Brownian, shear, diff. sedimentation 
     73         ! xcoagfe is computed in p4zfechem 
     74         ! ------------------------------------------------------------------------------------- 
     75         ! 50% of the ligands are supposed to be in the colloidal size fraction 
     76         ! as for FeL 
     77         zligco   = 0.5 * MAX(0., tr(ji,jj,jk,jplgw,Kbb) - xfecolagg(ji,jj,jk) * 1.0E-9 ) 
     78         zaggliga = xcoagfe(ji,jj,jk) * xstep * zligco 
     79 
     80         tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zlgwp - zlgwr - zlgwpr - zaggliga 
     81         ! 
    6982         zligrem(ji,jj,jk)   = zlgwr 
    7083         zligpr(ji,jj,jk)    = zlgwpr 
    71          zligprod(ji,jj,jk) = zlgwp 
    72          ! 
     84         zligprod(ji,jj,jk)  = zlgwp 
     85         zlcoll3d(ji,jj,jk)  = zaggliga 
    7386      END_3D 
    7487      ! 
     
    8497         IF( iom_use( "LPRODR" ) ) THEN 
    8598           zligprod(:,:,jpk) = 0. ; CALL iom_put( "LPRODR", zligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 
     99         ENDIF 
     100         IF( iom_use( "LGWCOLL" ) ) THEN 
     101            zlcoll3d(:,:,jpk) = 0. ; CALL iom_put( "LGWCOLL", zlcoll3d(:,:,:) * 1.e9 *  1.e+3 * rfact2r * tmask(:,:,:) ) 
    86102         ENDIF 
    87103      ENDIF 
     
    110126      INTEGER ::   ios   ! Local integer  
    111127      ! 
    112       NAMELIST/nampislig/ rlgw, prlgw, rlgs, rlig 
     128      NAMELIST/nampislig/ rlgw, prlgw, rlgs, rlig, xklig 
    113129      !!---------------------------------------------------------------------- 
    114130      ! 
     
    130146         WRITE(numout,*) '      Photolysis of weak ligand                    prlgw =', prlgw 
    131147         WRITE(numout,*) '      Lifetime (years) of strong ligands           rlgs  =', rlgs 
     148         WRITE(numout,*) '      1/2 saturation for photolysis                xklig =', xklig 
    132149      ENDIF 
    133150      ! 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zlim.F90

    r15090 r15459  
    22   !!====================================================================== 
    33   !!                         ***  MODULE p4zlim  *** 
    4    !! TOP :   PISCES  
     4   !! TOP :   Computes the nutrient limitation terms of phytoplankton 
    55   !!====================================================================== 
    66   !! History :   1.0  !  2004     (O. Aumont) Original code 
     
    1414   USE trc             ! Tracers defined 
    1515   USE sms_pisces      ! PISCES variables 
    16    USE iom             !  I/O manager 
     16   USE iom             ! I/O manager 
    1717 
    1818   IMPLICIT NONE 
    1919   PRIVATE 
    2020 
    21    PUBLIC p4z_lim     
    22    PUBLIC p4z_lim_init     
    23    PUBLIC p4z_lim_alloc 
     21   PUBLIC p4z_lim           ! called in p4zbio.F90  
     22   PUBLIC p4z_lim_init      ! called in trcsms_pisces.F90  
     23   PUBLIC p4z_lim_alloc     ! called in trcini_pisces.F90 
    2424 
    2525   !! * Shared module variables 
    2626   REAL(wp), PUBLIC ::  concnno3    !:  NO3, PO4 half saturation    
    2727   REAL(wp), PUBLIC ::  concdno3    !:  Phosphate half saturation for diatoms   
    28    REAL(wp), PUBLIC ::  concnnh4    !:  NH4 half saturation for phyto   
     28   REAL(wp), PUBLIC ::  concnnh4    !:  NH4 half saturation for nanophyto   
    2929   REAL(wp), PUBLIC ::  concdnh4    !:  NH4 half saturation for diatoms 
    3030   REAL(wp), PUBLIC ::  concnfer    !:  Iron half saturation for nanophyto  
     
    4040   REAL(wp), PUBLIC ::  xkdoc       !:  2nd half-sat. of DOC remineralization   
    4141   REAL(wp), PUBLIC ::  concbfe     !:  Fe half saturation for bacteria  
    42    REAL(wp), PUBLIC ::  oxymin      !:  half saturation constant for anoxia 
    4342   REAL(wp), PUBLIC ::  qnfelim     !:  optimal Fe quota for nanophyto 
    4443   REAL(wp), PUBLIC ::  qdfelim     !:  optimal Fe quota for diatoms 
     
    4645 
    4746   !!* Phytoplankton limitation terms 
    48    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanono3   !: ??? 
    49    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatno3   !: ??? 
    50    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanonh4   !: ??? 
    51    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatnh4   !: ??? 
    52    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanopo4   !: ??? 
    53    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatpo4   !: ??? 
    54    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimphy    !: ??? 
    55    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdia    !: ??? 
    56    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimnfe    !: ??? 
    57    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdfe    !: ??? 
    58    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimsi     !: ??? 
    59    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimbac    !: ?? 
    60    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimbacl   !: ?? 
    61    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   concdfe    !: ??? 
    62    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   concnfe    !: ??? 
    63  
    64    ! Coefficient for iron limitation 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanono3   !: Nanophyto limitation by NO3 
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatno3   !: Diatoms limitation by NO3 
     49   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanonh4   !: Nanophyto limitation by NH4 
     50   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatnh4   !:  Diatoms limitation by NH4 
     51   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanopo4   !: Nanophyto limitation by PO4 
     52   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatpo4   !: Diatoms limitation by PO4 
     53   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimphy    !: Nutrient limitation term of nanophytoplankton 
     54   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdia    !: Nutrient limitation term of diatoms 
     55   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimnfe    !: Nanophyto limitation by Iron 
     56   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdfe    !: Diatoms limitation by iron 
     57   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimsi     !: Diatoms limitation by Si 
     58   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimbac    !: Bacterial limitation term 
     59   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimbacl   !: Bacterial limitation term 
     60   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   concdfe    !: Limitation of diatoms uptake of Fe 
     61   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   concnfe    !: Limitation of Nano uptake of Fe 
     62   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanofer   !: Limitation of Fe uptake by nanophyto 
     63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatfer   !: Limitation of Fe uptake by diatoms 
     64   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xqfuncfecd, xqfuncfecn 
     65 
     66   ! Coefficient for iron limitation following Flynn and Hipkin (1999) 
    6567   REAL(wp) ::  xcoef1   = 0.0016  / 55.85   
    66    REAL(wp) ::  xcoef2   = 1.21E-5 * 14. / 55.85 / 7.625 * 0.5 * 1.5 
    67    REAL(wp) ::  xcoef3   = 1.15E-4 * 14. / 55.85 / 7.625 * 0.5  
     68   REAL(wp) ::  xcoef2   = 1.21E-5 * 14. / 55.85 / 7.3125 * 0.5 * 1.5 
     69   REAL(wp) ::  xcoef3   = 1.15E-4 * 14. / 55.85 / 7.3125 * 0.5  
    6870 
    6971   !! * Substitutions 
     
    8183      !! 
    8284      !! ** Purpose :   Compute the co-limitations by the various nutrients 
    83       !!              for the various phytoplankton species 
    84       !! 
    85       !! ** Method  : - ??? 
     85      !!                for the various phytoplankton species 
     86      !! 
     87      !! ** Method  : - Limitation follows the Liebieg law of the minimum 
     88      !!              - Monod approach for N, P and Si. Quota approach  
     89      !!                for Iron 
    8690      !!--------------------------------------------------------------------- 
    8791      INTEGER, INTENT(in)  :: kt, knt 
     
    8993      ! 
    9094      INTEGER  ::   ji, jj, jk 
    91       REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zno3, zferlim 
    92       REAL(wp) ::   zconcd, zconcd2, zconcn, zconcn2 
     95      REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zcoef 
    9396      REAL(wp) ::   z1_trbdia, z1_trbphy, ztem1, ztem2, zetot1, zetot2 
    94       REAL(wp) ::   zdenom, zratio, zironmin 
     97      REAL(wp) ::   zdenom, zratio, zironmin, zbactno3, zbactnh4 
    9598      REAL(wp) ::   zconc1d, zconc1dnh4, zconc0n, zconc0nnh4    
     99      REAL(wp) ::   fananof, fadiatf, znutlim, zfalim 
     100      REAL(wp) ::   znutlimtot, zlimno3, zlimnh4, zbiron 
    96101      !!--------------------------------------------------------------------- 
    97102      ! 
    98103      IF( ln_timing )   CALL timing_start('p4z_lim') 
     104      ! 
     105      sizena(:,:,:) = 1.0  ;  sizeda(:,:,:) = 1.0 
    99106      ! 
    100107      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    101108          
    102          ! Tuning of the iron concentration to a minimum level that is set to the detection limit 
    103          !------------------------------------- 
    104          zno3    = tr(ji,jj,jk,jpno3,Kbb) / 40.e-6 
    105          zferlim = MAX( 3e-11 * zno3 * zno3, 5e-12 ) 
    106          zferlim = MIN( zferlim, 7e-11 ) 
    107          tr(ji,jj,jk,jpfer,Kbb) = MAX( tr(ji,jj,jk,jpfer,Kbb), zferlim ) 
    108  
    109109         ! Computation of a variable Ks for iron on diatoms taking into account 
    110110         ! that increasing biomass is made of generally bigger cells 
     111         ! The allometric relationship is classical. 
    111112         !------------------------------------------------ 
    112          zconcd   = MAX( 0.e0 , tr(ji,jj,jk,jpdia,Kbb) - xsizedia ) 
    113          zconcd2  = tr(ji,jj,jk,jpdia,Kbb) - zconcd 
    114          zconcn   = MAX( 0.e0 , tr(ji,jj,jk,jpphy,Kbb) - xsizephy ) 
    115          zconcn2  = tr(ji,jj,jk,jpphy,Kbb) - zconcn 
    116113         z1_trbphy   = 1. / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 
    117114         z1_trbdia   = 1. / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
    118115 
    119          concdfe(ji,jj,jk) = MAX( concdfer, ( zconcd2 * concdfer + concdfer * xsizerd * zconcd ) * z1_trbdia ) 
    120          zconc1d           = MAX( concdno3, ( zconcd2 * concdno3 + concdno3 * xsizerd * zconcd ) * z1_trbdia ) 
    121          zconc1dnh4        = MAX( concdnh4, ( zconcd2 * concdnh4 + concdnh4 * xsizerd * zconcd ) * z1_trbdia ) 
    122  
    123          concnfe(ji,jj,jk) = MAX( concnfer, ( zconcn2 * concnfer + concnfer * xsizern * zconcn ) * z1_trbphy ) 
    124          zconc0n           = MAX( concnno3, ( zconcn2 * concnno3 + concnno3 * xsizern * zconcn ) * z1_trbphy ) 
    125          zconc0nnh4        = MAX( concnnh4, ( zconcn2 * concnnh4 + concnnh4 * xsizern * zconcn ) * z1_trbphy ) 
    126  
    127          ! Michaelis-Menten Limitation term for nutrients Small bacteria 
    128          ! ------------------------------------------------------------- 
    129          zdenom = 1. /  ( concbno3 * concbnh4 + concbnh4 * tr(ji,jj,jk,jpno3,Kbb) + concbno3 * tr(ji,jj,jk,jpnh4,Kbb) ) 
    130          xnanono3(ji,jj,jk) = tr(ji,jj,jk,jpno3,Kbb) * concbnh4 * zdenom 
    131          xnanonh4(ji,jj,jk) = tr(ji,jj,jk,jpnh4,Kbb) * concbno3 * zdenom 
    132          ! 
    133          zlim1    = xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) 
    134          zlim2    = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + concbnh4 ) 
    135          zlim3    = tr(ji,jj,jk,jpfer,Kbb) / ( concbfe + tr(ji,jj,jk,jpfer,Kbb) ) 
    136          zlim4    = tr(ji,jj,jk,jpdoc,Kbb) / ( xkdoc   + tr(ji,jj,jk,jpdoc,Kbb) ) 
    137          xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) 
    138          xlimbac (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) * zlim4 
    139  
    140          ! Michaelis-Menten Limitation term for nutrients Small flagellates 
    141          ! ----------------------------------------------- 
    142          zdenom = 1. /  ( zconc0n * zconc0nnh4 + zconc0nnh4 * tr(ji,jj,jk,jpno3,Kbb) + zconc0n * tr(ji,jj,jk,jpnh4,Kbb) ) 
    143          xnanono3(ji,jj,jk) = tr(ji,jj,jk,jpno3,Kbb) * zconc0nnh4 * zdenom 
    144          xnanonh4(ji,jj,jk) = tr(ji,jj,jk,jpnh4,Kbb) * zconc0n    * zdenom 
    145          ! 
    146          zlim1    = xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) 
    147          zlim2    = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc0nnh4 ) 
    148          zratio   = tr(ji,jj,jk,jpnfe,Kbb) * z1_trbphy  
    149          zironmin = xcoef1 * tr(ji,jj,jk,jpnch,Kbb) * z1_trbphy + xcoef2 * zlim1 + xcoef3 * xnanono3(ji,jj,jk) 
    150          zlim3    = MAX( 0.,( zratio - zironmin ) / qnfelim ) 
    151          xnanopo4(ji,jj,jk) = zlim2 
    152          xlimnfe (ji,jj,jk) = MIN( 1., zlim3 ) 
    153          xlimphy (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) 
    154          ! 
    155          !   Michaelis-Menten Limitation term for nutrients Diatoms 
    156          !   ---------------------------------------------- 
    157          zdenom   = 1. / ( zconc1d * zconc1dnh4 + zconc1dnh4 * tr(ji,jj,jk,jpno3,Kbb) + zconc1d * tr(ji,jj,jk,jpnh4,Kbb) ) 
    158          xdiatno3(ji,jj,jk) = tr(ji,jj,jk,jpno3,Kbb) * zconc1dnh4 * zdenom 
    159          xdiatnh4(ji,jj,jk) = tr(ji,jj,jk,jpnh4,Kbb) * zconc1d    * zdenom 
    160          ! 
    161          zlim1    = xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) 
    162          zlim2    = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc1dnh4  ) 
    163          zlim3    = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi(ji,jj) + rtrn ) 
    164          zratio   = tr(ji,jj,jk,jpdfe,Kbb) * z1_trbdia 
    165          zironmin = xcoef1 * tr(ji,jj,jk,jpdch,Kbb) * z1_trbdia + xcoef2 * zlim1 + xcoef3 * xdiatno3(ji,jj,jk) 
    166          zlim4    = MAX( 0., ( zratio - zironmin ) / qdfelim ) 
    167          xdiatpo4(ji,jj,jk) = zlim2 
    168          xlimdfe (ji,jj,jk) = MIN( 1., zlim4 ) 
    169          xlimdia (ji,jj,jk) = MIN( zlim1, zlim2, zlim3, zlim4 ) 
    170          xlimsi  (ji,jj,jk) = MIN( zlim1, zlim2, zlim4 ) 
     116         concnfe(ji,jj,jk) = concnfer * sizen(ji,jj,jk)**0.81 
     117         zconc0n           = concnno3 * sizen(ji,jj,jk)**0.81 
     118         zconc0nnh4        = concnnh4 * sizen(ji,jj,jk)**0.81 
     119 
     120         concdfe(ji,jj,jk) = concdfer * sized(ji,jj,jk)**0.81  
     121         zconc1d           = concdno3 * sized(ji,jj,jk)**0.81  
     122         zconc1dnh4        = concdnh4 * sized(ji,jj,jk)**0.81   
     123 
     124          ! Computation of the optimal allocation parameters 
     125          ! Based on the different papers by Pahlow et al., and  
     126          ! Smith et al. 
     127          ! --------------------------------------------------- 
     128 
     129          ! Nanophytoplankton 
     130          zbiron = ( 75.0 * ( 1.0 - plig(ji,jj,jk) ) + plig(ji,jj,jk) ) * biron(ji,jj,jk) 
     131          znutlim = zbiron / concnfe(ji,jj,jk) 
     132          fananof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
     133 
     134          ! Diatoms 
     135          znutlim = zbiron / concdfe(ji,jj,jk) 
     136          fadiatf = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
     137 
     138          ! Michaelis-Menten Limitation term by nutrients of 
     139          ! heterotrophic bacteria 
     140          ! ------------------------------------------------- 
     141          zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concbno3 + tr(ji,jj,jk,jpnh4,Kbb) ) 
     142          zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( concbno3 + tr(ji,jj,jk,jpno3,Kbb) ) 
     143          znutlimtot = ( 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) ) 
     144          zbactnh4 = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     145          zbactno3 = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     146          ! 
     147          zlim1    = zbactno3 + zbactnh4 
     148          zlim2    = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + concbnh4 ) 
     149          zlim3    = tr(ji,jj,jk,jpfer,Kbb) / ( concbfe + tr(ji,jj,jk,jpfer,Kbb) ) 
     150          zlim4    = tr(ji,jj,jk,jpdoc,Kbb) / ( xkdoc   + tr(ji,jj,jk,jpdoc,Kbb) ) 
     151          ! Xlimbac is used for DOC solubilization whereas xlimbacl 
     152          ! is used for all the other bacterial-dependent terms 
     153          ! ------------------------------------------------------- 
     154          xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) 
     155          xlimbac (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) * zlim4 
     156 
     157          ! Michaelis-Menten Limitation term by nutrients: Nanophyto 
     158          ! Optimal parameterization by Smith and Pahlow series of  
     159          ! papers is used. Optimal allocation is supposed independant 
     160          ! for all nutrients.  
     161          ! -------------------------------------------------------- 
     162 
     163          ! Limitation of Fe uptake (Quota formalism) 
     164          zfalim = (1.-fananof) / fananof 
     165          xnanofer(ji,jj,jk) = (1. - fananof) * zbiron / ( zbiron + zfalim * concnfe(ji,jj,jk) ) 
     166 
     167          ! Limitation of nanophytoplankton growth 
     168          zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc0n + tr(ji,jj,jk,jpnh4,Kbb) ) 
     169          zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc0n + tr(ji,jj,jk,jpno3,Kbb) ) 
     170          znutlimtot = ( tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) ) / ( zconc0n + tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) ) 
     171          xnanonh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     172          xnanono3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     173          ! 
     174          zlim1    = xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) 
     175          zlim2    = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc0nnh4 ) 
     176          zratio   = tr(ji,jj,jk,jpnfe,Kbb) * z1_trbphy  
     177 
     178          ! The minimum iron quota depends on the size of PSU, respiration 
     179          ! and the reduction of nitrate following the parameterization  
     180          ! proposed by Flynn and Hipkin (1999) 
     181          zironmin = xcoef1 * tr(ji,jj,jk,jpnch,Kbb) * z1_trbphy + xcoef2 * zlim1 + xcoef3 * xnanono3(ji,jj,jk) 
     182          xqfuncfecn(ji,jj,jk) = zironmin + qnfelim 
     183          zlim3    = MAX( 0.,( zratio - zironmin ) / qnfelim ) 
     184          xnanopo4(ji,jj,jk) = zlim2 
     185          xlimnfe (ji,jj,jk) = MIN( 1., zlim3 ) 
     186          xlimphy (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) 
     187                
     188          !   Michaelis-Menten Limitation term by nutrients : Diatoms 
     189          !   ------------------------------------------------------- 
     190          ! Limitation of Fe uptake (Quota formalism) 
     191          zfalim = (1.-fadiatf) / fadiatf 
     192          xdiatfer(ji,jj,jk) = (1. - fadiatf) * zbiron / ( zbiron + zfalim * concdfe(ji,jj,jk) ) 
     193 
     194          ! Limitation of diatoms growth 
     195          zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc1d + tr(ji,jj,jk,jpnh4,Kbb) ) 
     196          zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc1d + tr(ji,jj,jk,jpno3,Kbb) ) 
     197          znutlimtot = ( tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) ) / ( zconc1d + tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) ) 
     198          xdiatnh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn )  
     199          xdiatno3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     200          ! 
     201          zlim1    = xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) 
     202          zlim2    = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc1dnh4  ) 
     203          zlim3    = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi(ji,jj) + rtrn ) 
     204          zratio   = tr(ji,jj,jk,jpdfe,Kbb) * z1_trbdia 
     205 
     206          ! The minimum iron quota depends on the size of PSU, respiration 
     207          ! and the reduction of nitrate following the parameterization  
     208          ! proposed by Flynn and Hipkin (1999) 
     209          zironmin = xcoef1 * tr(ji,jj,jk,jpdch,Kbb) * z1_trbdia + xcoef2 * zlim1 + xcoef3 * xdiatno3(ji,jj,jk) 
     210          xqfuncfecd(ji,jj,jk) = zironmin + qdfelim 
     211          zlim4    = MAX( 0., ( zratio - zironmin ) / qdfelim ) 
     212          xdiatpo4(ji,jj,jk) = zlim2 
     213          xlimdfe (ji,jj,jk) = MIN( 1., zlim4 ) 
     214          xlimdia (ji,jj,jk) = MIN( zlim1, zlim2, zlim3, zlim4 ) 
     215          xlimsi  (ji,jj,jk) = MIN( zlim1, zlim2, zlim4 ) 
    171216      END_3D 
    172217 
     218 
     219      ! Size estimation of phytoplankton based on total biomass 
     220      ! Assumes that larger biomass implies addition of larger cells 
     221      ! ------------------------------------------------------------ 
     222      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     223         zcoef = tr(ji,jj,jk,jpphy,Kbb) - MIN(xsizephy, tr(ji,jj,jk,jpphy,Kbb) ) 
     224         sizena(ji,jj,jk) = 1. + ( xsizern -1.0 ) * zcoef / ( xsizephy + zcoef ) 
     225         zcoef = tr(ji,jj,jk,jpdia,Kbb) - MIN(xsizedia, tr(ji,jj,jk,jpdia,Kbb) ) 
     226         sizeda(ji,jj,jk) = 1. + ( xsizerd - 1.0 ) * zcoef / ( xsizedia + zcoef ) 
     227      END_3D 
     228 
     229 
    173230      ! Compute the fraction of nanophytoplankton that is made of calcifiers 
     231      ! This is a purely adhoc formulation described in Aumont et al. (2015) 
     232      ! This fraction depends on nutrient limitation, light, temperature 
    174233      ! -------------------------------------------------------------------- 
    175234      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    176          zlim1 =  ( tr(ji,jj,jk,jpno3,Kbb) * concnnh4 + tr(ji,jj,jk,jpnh4,Kbb) * concnno3 )    & 
    177             &   / ( concnno3 * concnnh4 + concnnh4 * tr(ji,jj,jk,jpno3,Kbb) + concnno3 * tr(ji,jj,jk,jpnh4,Kbb) )  
     235         zlim1  = xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk)  
    178236         zlim2  = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + concnnh4 ) 
    179          zlim3  = tr(ji,jj,jk,jpfer,Kbb) / ( tr(ji,jj,jk,jpfer,Kbb) +  5.E-11   ) 
    180          ztem1  = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) ) 
     237         zlim3  = tr(ji,jj,jk,jpfer,Kbb) / ( tr(ji,jj,jk,jpfer,Kbb) +  6.E-11   ) 
     238         ztem1  = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) + 1.8) 
    181239         ztem2  = ts(ji,jj,jk,jp_tem,Kmm) - 10. 
    182240         zetot1 = MAX( 0., etot_ndcy(ji,jj,jk) - 1.) / ( 4. + etot_ndcy(ji,jj,jk) )  
    183          zetot2 = 30. / ( 30. + etot_ndcy(ji,jj,jk) )  
     241         zetot2 = 30. / ( 30.0 + etot_ndcy(ji,jj,jk) ) 
    184242 
    185243         xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 )                  & 
     
    211269        CALL iom_put( "LNFe"   , xlimnfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
    212270        CALL iom_put( "LDFe"   , xlimdfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     271        CALL iom_put( "SIZEN"  , sizen  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     272        CALL iom_put( "SIZED"  , sized  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
    213273      ENDIF 
    214274      ! 
     
    222282      !!                  ***  ROUTINE p4z_lim_init  *** 
    223283      !! 
    224       !! ** Purpose :   Initialization of nutrient limitation parameters 
    225       !! 
    226       !! ** Method  :   Read the nampislim namelist and check the parameters 
     284      !! ** Purpose :   Initialization of the nutrient limitation parameters 
     285      !! 
     286      !! ** Method  :   Read the namp4zlim namelist and check the parameters 
    227287      !!      called at the first timestep (nittrc000) 
    228288      !! 
    229       !! ** input   :   Namelist nampislim 
     289      !! ** input   :   Namelist namp4zlim 
    230290      !! 
    231291      !!---------------------------------------------------------------------- 
    232292      INTEGER ::   ios   ! Local integer 
    233       ! 
     293 
     294      ! Namelist block 
    234295      NAMELIST/namp4zlim/ concnno3, concdno3, concnnh4, concdnh4, concnfer, concdfer, concbfe,   & 
    235296         &                concbno3, concbnh4, xsizedia, xsizephy, xsizern, xsizerd,          &  
     
    248309902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zlim in configuration namelist' ) 
    249310      IF(lwm) WRITE( numonp, namp4zlim ) 
     311 
    250312      ! 
    251313      IF(lwp) THEN                         ! control print 
     
    287349      !!---------------------------------------------------------------------- 
    288350      !!                     ***  ROUTINE p5z_lim_alloc  *** 
     351      !!  
     352      !            Allocation of the arrays used in this module 
    289353      !!---------------------------------------------------------------------- 
    290354      USE lib_mpp , ONLY: ctl_stop 
     
    295359         &      xnanonh4(jpi,jpj,jpk), xdiatnh4(jpi,jpj,jpk),       & 
    296360         &      xnanopo4(jpi,jpj,jpk), xdiatpo4(jpi,jpj,jpk),       & 
     361         &      xnanofer(jpi,jpj,jpk), xdiatfer(jpi,jpj,jpk),       & 
    297362         &      xlimphy (jpi,jpj,jpk), xlimdia (jpi,jpj,jpk),       & 
    298363         &      xlimnfe (jpi,jpj,jpk), xlimdfe (jpi,jpj,jpk),       & 
    299364         &      xlimbac (jpi,jpj,jpk), xlimbacl(jpi,jpj,jpk),       & 
    300365         &      concnfe (jpi,jpj,jpk), concdfe (jpi,jpj,jpk),       & 
     366         &      xqfuncfecn(jpi,jpj,jpk), xqfuncfecd(jpi,jpj,jpk),   & 
    301367         &      xlimsi  (jpi,jpj,jpk), STAT=p4z_lim_alloc ) 
    302368      ! 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zmeso.F90

    r15090 r15459  
    88   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Quota model for iron 
    99   !!---------------------------------------------------------------------- 
    10    !!   p4z_meso       : Compute the sources/sinks for mesozooplankton 
    11    !!   p4z_meso_init  : Initialization of the parameters for mesozooplankton 
     10   !!   p4z_meso        : Compute the sources/sinks for mesozooplankton 
     11   !!   p4z_meso_init   : Initialization of the parameters for mesozooplankton 
     12   !!   p4z_meso_alloc  : Allocate variables for mesozooplankton  
    1213   !!---------------------------------------------------------------------- 
    1314   USE oce_trc         ! shared variables between ocean and passive tracers 
     
    2324   PUBLIC   p4z_meso              ! called in p4zbio.F90 
    2425   PUBLIC   p4z_meso_init         ! called in trcsms_pisces.F90 
    25  
     26   PUBLIC   p4z_meso_alloc        ! called in trcini_pisces.F90 
     27 
     28   !! * Shared module variables 
    2629   REAL(wp), PUBLIC ::  part2        !: part of calcite not dissolved in mesozoo guts 
    2730   REAL(wp), PUBLIC ::  xpref2d      !: mesozoo preference for diatoms 
     
    4245   REAL(wp), PUBLIC ::  epsher2      !: growth efficiency 
    4346   REAL(wp), PUBLIC ::  epsher2min   !: minimum growth efficiency at high food for grazing 2 
     47   REAL(wp), PUBLIC ::  xsigma2      !: Width of the predation window 
     48   REAL(wp), PUBLIC ::  xsigma2del   !: Maximum width of the predation window at low food density 
    4449   REAL(wp), PUBLIC ::  grazflux     !: mesozoo flux feeding rate 
     50   REAL(wp), PUBLIC ::  xfracmig     !: Fractional biomass of meso that performs DVM 
     51   LOGICAL , PUBLIC ::  ln_dvm_meso  !: Boolean to activate DVM of mesozooplankton 
     52   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig  !: DVM of mesozooplankton : migration depth 
     53   INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig    !: Vertical indice of the the migration depth 
    4554 
    4655   !! * Substitutions 
    4756#  include "do_loop_substitute.h90" 
     57#  include "domzgr_substitute.h90" 
    4858   !!---------------------------------------------------------------------- 
    4959   !! NEMO/TOP 4.0 , NEMO Consortium (2018) 
     
    5363CONTAINS 
    5464 
    55    SUBROUTINE p4z_meso( kt, knt, Kbb, Krhs ) 
     65   SUBROUTINE p4z_meso( kt, knt, Kbb, Kmm, Krhs ) 
    5666      !!--------------------------------------------------------------------- 
    5767      !!                     ***  ROUTINE p4z_meso  *** 
    5868      !! 
    5969      !! ** Purpose :   Compute the sources/sinks for mesozooplankton 
     70      !!                This includes ingestion and assimilation, flux feeding 
     71      !!                and mortality. We use a passive prey switching   
     72      !!                parameterization. 
     73      !!                All living compartments smaller than mesozooplankton 
     74      !!                are potential preys of mesozooplankton as well as small 
     75      !!                sinking particles  
    6076      !! 
    6177      !! ** Method  : - ??? 
    6278      !!--------------------------------------------------------------------- 
    6379      INTEGER, INTENT(in) ::   kt, knt   ! ocean time step and ??? 
    64       INTEGER, INTENT(in)  ::  Kbb, Krhs ! time level indices 
    65       ! 
    66       INTEGER  :: ji, jj, jk 
     80      INTEGER, INTENT(in)  ::  Kbb, kmm, Krhs ! time level indices 
     81      ! 
     82      INTEGER  :: ji, jj, jk, jkt 
    6783      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam 
    68       REAL(wp) :: zgraze2 , zdenom, zdenom2 
    69       REAL(wp) :: zfact   , zfood, zfoodlim, zproport, zbeta 
     84      REAL(wp) :: zgraze2 , zdenom, zdenom2, zfact   , zfood, zfoodlim, zproport, zbeta 
    7085      REAL(wp) :: zmortzgoc, zfrac, zfracfe, zratio, zratio2, zfracal, zgrazcal 
    71       REAL(wp) :: zepsherf, zepshert, zepsherv, zepsherq  
    72       REAL(wp) :: zgrarsig, zgraztotc, zgraztotn, zgraztotf 
    73       REAL(wp) :: zgrarem2, zgrafer2, zgrapoc2, zprcaca, zmortz, zgrasrat, zgrasratn 
    74       REAL(wp) :: zrespz, ztortz, zgrazd, zgrazz, zgrazpof 
    75       REAL(wp) :: zgrazn, zgrazpoc, zgraznf, zgrazf 
    76       REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg 
    77       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing2, zfezoo2, zz2ligprod 
     86      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgraztotc, zgraztotn, zgraztotf 
     87      REAL(wp) :: zmigreltime, zprcaca, zmortz, zgrasratf, zgrasratn 
     88      REAL(wp) :: zrespz, ztortz, zgrazdc, zgrazz, zgrazpof, zgraznc, zgrazpoc, zgraznf, zgrazdf 
     89      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg, zrum, zcodel, zargu, zval, zdep 
     90      REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmp4, ztmptot, zmigthick  
    7891      CHARACTER (len=25) :: charout 
     92      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2 
     93      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof, zgrabsi 
     94      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof 
     95      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigbsi 
    7996      !!--------------------------------------------------------------------- 
    8097      ! 
    8198      IF( ln_timing )   CALL timing_start('p4z_meso') 
     99      ! 
     100      zgrazing(:,:,:) = 0._wp   ;  zgrapoc(:,:,:) = 0._wp 
     101      zfezoo2 (:,:,:) = 0._wp   ;  zgrarem(:,:,:) = 0._wp 
     102      zgraref (:,:,:) = 0._wp   ;  zgrapof(:,:,:) = 0._wp 
     103      zgrabsi (:,:,:) = 0._wp 
     104      ! 
     105      ! 
     106      ! Diurnal vertical migration of mesozooplankton 
     107      ! Computation of the migration depth 
     108      ! --------------------------------------------- 
     109      IF (ln_dvm_meso) CALL p4z_meso_depmig( Kbb, Kmm ) 
    82110      ! 
    83111      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     
    85113         zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam 
    86114 
    87          !  Respiration rates of both zooplankton 
    88          !  ------------------------------------- 
     115          
     116         !  linear mortality of mesozooplankton 
     117         !  A michaelis menten modulation term is used to avoid extinction of  
     118         !  mesozooplankton at very low food concentration. Mortality is 
     119 
     120         !  enhanced in low O2 waters 
     121         !  ----------------------------------------------------------------- 
    89122         zrespz    = resrat2 * zfact * ( tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) )  & 
    90123         &           + 3. * nitrfac(ji,jj,jk) ) 
    91124 
    92          !  Zooplankton mortality. A square function has been selected with 
    93          !  no real reason except that it seems to be more stable and may mimic predation 
    94          !  --------------------------------------------------------------- 
     125         ! Zooplankton quadratic mortality. A square function has been selected with 
     126         !  to mimic predation and disease (density dependent mortality). It also tends 
     127         !  to stabilise the model 
     128         !  ------------------------------------------------------------------------- 
    95129         ztortz    = mzrat2 * 1.e6 * zfact * tr(ji,jj,jk,jpmes,Kbb)  * (1. - nitrfac(ji,jj,jk) ) 
    96130         ! 
     131  
     132         !   Computation of the abundance of the preys 
     133         !   A threshold can be specified in the namelist 
     134         !   -------------------------------------------- 
    97135         zcompadi  = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthresh2dia ), 0.e0 ) 
    98136         zcompaz   = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthresh2zoo ), 0.e0 ) 
    99137         zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthresh2poc ), 0.e0 ) 
     138 
    100139         ! Size effect of nanophytoplankton on grazing : the smaller it is, the less prone 
    101          ! it is to predation by mesozooplankton 
     140         ! it is to predation by mesozooplankton. We use a quota dependant parameterization 
     141         ! as a low quota indicates oligotrophic conditions which are charatcerized by 
     142         ! small cells 
    102143         ! ------------------------------------------------------------------------------- 
    103          zcompaph  = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthresh2phy ), 0.e0 ) & 
    104             &      * MIN(1., MAX( 0., ( quotan(ji,jj,jk) - 0.2) / 0.3 ) ) 
    105  
    106          !   Mesozooplankton grazing 
    107          !   ------------------------ 
     144         zcompaph  = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthresh2phy ), 0.e0 ) 
     145 
     146         ! Mesozooplankton grazing 
     147         ! The total amount of food is the sum of all preys accessible to mesozooplankton  
     148         ! multiplied by their food preference 
     149         ! A threshold can be specified in the namelist (xthresh2). However, when food  
     150         ! concentration is close to this threshold, it is decreased to avoid the  
     151         ! accumulation of food in the mesozoopelagic domain 
     152         ! ------------------------------------------------------------------------------- 
    108153         zfood     = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc  
    109154         zfoodlim  = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) ) 
     
    112157         zgraze2   = grazrat2 * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk))  
    113158 
    114          zgrazd    = zgraze2  * xpref2d  * zcompadi  * zdenom2  
    115          zgrazz    = zgraze2  * xpref2z  * zcompaz   * zdenom2  
    116          zgrazn    = zgraze2  * xpref2n  * zcompaph  * zdenom2  
    117          zgrazpoc  = zgraze2  * xpref2c  * zcompapoc * zdenom2  
    118  
    119          zgraznf   = zgrazn   * tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn) 
    120          zgrazf    = zgrazd   * tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn) 
     159 
     160         ! An active switching parameterization is used here. 
     161         ! We don't use the KTW parameterization proposed by  
     162         ! Vallina et al. because it tends to produce too steady biomass 
     163         ! composition and the variance of Chl is too low as it grazes 
     164         ! too strongly on winning organisms. We use a generalized 
     165         ! switching parameterization proposed by Morozov and  
     166         ! Petrovskii (2013) 
     167         ! ------------------------------------------------------------   
     168         ! The width of the selection window is increased when preys 
     169         ! have low abundance, .i.e. zooplankton become less specific  
     170         ! to avoid starvation. 
     171         ! ---------------------------------------------------------- 
     172         zsigma = 1.0 - zdenom**2/(0.05**2+zdenom**2) 
     173         zsigma = xsigma2 + xsigma2del * zsigma 
     174         ! Nanophytoplankton and diatoms are the only preys considered 
     175         ! to be close enough to have potential interference 
     176         ! ----------------------------------------------------------- 
     177         zdiffdn = exp( -ABS(log(1.67 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2 ) 
     178         ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / ( 1.0 + zdiffdn ) 
     179         ztmp2 = xpref2c * zcompapoc**2 
     180         ztmp3 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) / ( 1.0 + zdiffdn ) 
     181         ztmp4 = xpref2z * zcompaz**2 
     182         ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + rtrn 
     183         ztmp1 = ztmp1 / ztmptot 
     184         ztmp2 = ztmp2 / ztmptot 
     185         ztmp3 = ztmp3 / ztmptot 
     186         ztmp4 = ztmp4 / ztmptot 
     187 
     188         !   Mesozooplankton regular grazing on the different preys 
     189         !   ------------------------------------------------------ 
     190         zgrazdc   = zgraze2  * ztmp3 * zdenom  ! diatoms 
     191         zgraznc   = zgraze2  * ztmp1 * zdenom  ! nanophytoplankton 
     192         zgrazpoc  = zgraze2  * ztmp2 * zdenom  ! small POC 
     193         zgrazz    = zgraze2  * ztmp4 * zdenom  ! microzooplankton 
     194 
     195         ! Ingestion rates of the Fe content of the different preys 
     196         zgraznf   = zgraznc  * tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn) 
     197         zgrazdf   = zgrazdc  * tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn) 
    121198         zgrazpof  = zgrazpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
    122199 
    123          !  Mesozooplankton flux feeding on GOC 
    124          !  ---------------------------------- 
     200         !  Mesozooplankton flux feeding on GOC and POC. The feeding pressure 
     201         ! is proportional to the flux 
     202         !  ------------------------------------------------------------------ 
    125203         zgrazffeg = grazflux  * xstep * wsbio4(ji,jj,jk)      & 
    126204         &           * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb) & 
     
    132210         zgrazfffp = zgrazffep * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
    133211         ! 
    134          zgraztotc = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg 
    135          ! Compute the proportion of filter feeders 
    136          zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) 
     212         zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg 
     213         ! Compute the proportion of filter feeders. It is assumed steady state. 
     214         ! ---------------------------------------------------------------------   
     215         zproport  = 0._wp 
     216         IF( gdepw(ji,jj,jk+1,Kmm) > MAX(hmld(ji,jj), heup_01(ji,jj) ) ) THEN 
     217            zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) 
     218         ENDIF 
     219 
     220         ! Compute fractionation of aggregates. It is assumed that  
     221         ! diatoms based aggregates are more prone to fractionation 
     222         ! since they are more porous (marine snow instead of fecal pellets) 
     223         ! ----------------------------------------------------------------- 
     224 
    137225         ! Compute fractionation of aggregates. It is assumed that  
    138226         ! diatoms based aggregates are more prone to fractionation 
     
    142230         zfrac     = zproport * grazflux  * xstep * wsbio4(ji,jj,jk)      & 
    143231         &          * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb)          & 
    144          &          * ( 0.2 + 3.8 * zratio2 / ( 1.**2 + zratio2 ) ) 
     232         &          * ( 0.4 + 3.6 * zratio2 / ( 1.**2 + zratio2 ) ) 
    145233         zfracfe   = zfrac * tr(ji,jj,jk,jpbfe,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn) 
    146234 
     235         ! Flux feeding is multiplied by the fractional biomass of flux feeders 
    147236         zgrazffep = zproport * zgrazffep 
    148237         zgrazffeg = zproport * zgrazffeg 
    149238         zgrazfffp = zproport * zgrazfffp 
    150239         zgrazfffg = zproport * zgrazfffg 
    151          zgraztotc = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg 
    152          zgraztotn = zgrazd * quotad(ji,jj,jk) + zgrazz + zgrazn * quotan(ji,jj,jk)   & 
     240         zgrazdc   = (1.0 - zproport) * zgrazdc 
     241         zgraznc   = (1.0 - zproport) * zgraznc 
     242         zgrazz    = (1.0 - zproport) * zgrazz 
     243         zgrazpoc  = (1.0 - zproport) * zgrazpoc 
     244         zgrazdf   = (1.0 - zproport) * zgrazdf 
     245         zgraznf   = (1.0 - zproport) * zgraznf 
     246         zgrazpof  = (1.0 - zproport) * zgrazpof 
     247 
     248 
     249         ! Total ingestion rates in C, N, Fe 
     250         zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg 
     251         zgraztotn = zgrazdc * quotad(ji,jj,jk) + zgrazz + zgraznc * quotan(ji,jj,jk)   & 
    153252         &   + zgrazpoc + zgrazffep + zgrazffeg 
    154          zgraztotf = zgrazf + zgraznf + zgrazz * ferat3 + zgrazpof + zgrazfffp + zgrazfffg 
     253         zgraztotf = zgrazdf + zgraznf + zgrazz * feratz + zgrazpof + zgrazfffp + zgrazfffg 
    155254 
    156255         ! Total grazing ( grazing by microzoo is already computed in p4zmicro ) 
    157          zgrazing2(ji,jj,jk) = zgraztotc 
     256         zgrazing(ji,jj,jk) = zgraztotc 
    158257 
    159258         ! Mesozooplankton efficiency.  
     
    165264         ! Fulton, 2012) 
    166265         ! ----------------------------------------------------------------------------------- 
    167          zgrasrat  =  ( zgraztotf + rtrn )/ ( zgraztotc + rtrn ) 
     266 
     267         zgrasratf =  ( zgraztotf + rtrn )/ ( zgraztotc + rtrn ) 
    168268         zgrasratn =  ( zgraztotn + rtrn )/ ( zgraztotc + rtrn ) 
    169          zepshert  = MIN( 1., zgrasratn, zgrasrat / ferat3) 
     269         zepshert  = MIN( 1., zgrasratn, zgrasratf / feratm) 
    170270         zbeta     = MAX(0., (epsher2 - epsher2min) ) 
     271         ! Food quantity deprivation of GGE 
    171272         zepsherf  = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta )  
     273         ! Food quality deprivation of GGE 
    172274         zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) 
    173          zepsherv  = zepsherf * zepshert * zepsherq  
    174  
    175          zgrarem2  = zgraztotc * ( 1. - zepsherv - unass2 ) & 
    176          &         + ( 1. - epsher2 - unass2 ) / ( 1. - epsher2 ) * ztortz 
    177          zgrafer2  = zgraztotc * MAX( 0. , ( 1. - unass2 ) * zgrasrat - ferat3 * zepsherv )    & 
    178          &         + ferat3 * ( ( 1. - epsher2 - unass2 ) /( 1. - epsher2 ) * ztortz ) 
    179          zgrapoc2  = zgraztotc * unass2 
    180  
    181  
    182          !   Update the arrays TRA which contain the biological sources and sinks 
    183          zgrarsig  = zgrarem2 * sigma2 
    184          tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarsig 
    185          tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgrarsig 
    186          tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgrarem2 - zgrarsig 
    187          ! 
    188          IF( ln_ligand ) THEN  
    189             tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + (zgrarem2 - zgrarsig) * ldocz 
    190             zz2ligprod(ji,jj,jk) = (zgrarem2 - zgrarsig) * ldocz 
    191          ENDIF 
    192          ! 
    193          tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarsig 
    194          tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgrafer2 
    195          zfezoo2(ji,jj,jk)   = zgrafer2 
    196          tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarsig 
    197          tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgrarsig               
    198  
     275         ! Actual GGE 
     276         zepsherv  = zepsherf * zepshert * zepsherq 
     277         !  
     278         ! Impact of grazing on the prognostic variables 
     279         ! --------------------------------------------- 
    199280         zmortz = ztortz + zrespz 
     281         ! Mortality induced by the upper trophic levels, ztortz, is allocated  
     282         ! according to a infinite chain of predators (ANderson et al., 2013) 
    200283         zmortzgoc = unass2 / ( 1. - epsher2 ) * ztortz + zrespz 
     284 
    201285         tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) - zmortz + zepsherv * zgraztotc  
    202          tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazd 
     286         tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc 
    203287         tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zgrazz 
    204          tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgrazn 
    205          tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) - zgrazn * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 
    206          tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) - zgrazd * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
    207          tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zgrazd * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
    208          tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrazd * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
     288         tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc 
     289         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 ) 
     290         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 ) 
     291         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 ) 
     292         zgrabsi(ji,jj,jk)       = zgrazdc * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
     293         ! 
    209294         tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgraznf 
    210          tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazf 
    211  
     295         tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazdf 
     296         ! 
    212297         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zgrazpoc - zgrazffep + zfrac 
    213298         prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfrac 
    214299         conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep 
    215          tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zmortzgoc - zgrazffeg + zgrapoc2 - zfrac 
    216          prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zmortzgoc + zgrapoc2 
     300         ! 
     301         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zgrazffeg - zfrac 
    217302         consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfrac 
     303         ! 
    218304         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zgrazpof - zgrazfffp + zfracfe 
    219          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + ferat3 * zmortzgoc - zgrazfffg     & 
    220            &                + zgraztotf * unass2 - zfracfe 
    221          zfracal = tr(ji,jj,jk,jpcal,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) 
    222          zgrazcal = (zgrazffeg + zgrazpoc) * (1. - part2) * zfracal 
    223          ! calcite production 
    224          zprcaca = xfracal(ji,jj,jk) * zgrazn 
     305         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zgrazfffg - zfracfe 
     306 
     307         ! Calcite remineralization due to zooplankton activity 
     308         ! part2 of the ingested calcite is not dissolving in the  
     309         ! acidic gut 
     310         ! ------------------------------------------------------ 
     311         zfracal = tr(ji,jj,jk,jpcal,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) 
     312         zgrazcal = zgrazffeg * (1. - part2) * zfracal 
     313         ! calcite production by zooplankton activity 
     314         zprcaca = xfracal(ji,jj,jk) * zgraznc 
    225315         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 
    226316         ! 
    227317         zprcaca = part2 * zprcaca 
    228318         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrazcal - zprcaca 
    229          tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * ( zgrazcal + zprcaca ) 
     319         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + 2. * ( zgrazcal - zprcaca ) 
    230320         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - zgrazcal + zprcaca 
     321 
     322         ! Computation of total excretion and egestion by mesozoo.  
     323         ! --------------------------------------------------------- 
     324         zgrarem(ji,jj,jk) = zgraztotc * ( 1. - zepsherv - unass2 ) & 
     325                 &         + ( 1. - epsher2 - unass2 ) / ( 1. - epsher2 ) * ztortz 
     326         zgraref(ji,jj,jk) = zgraztotc * MAX( 0. , ( 1. - unass2 ) * zgrasratf - feratm * zepsherv )    & 
     327                 &         + feratm * ( ( 1. - epsher2 - unass2 ) /( 1. - epsher2 ) * ztortz ) 
     328         zgrapoc(ji,jj,jk) = zgraztotc * unass2 + zmortzgoc 
     329         zgrapof(ji,jj,jk) = zgraztotf * unass2 + feratm * zmortzgoc 
     330         ! 
    231331      END_3D 
    232       ! 
     332 
     333      ! Computation of the effect of DVM by mesozooplankton 
     334      ! This part is only activated if ln_dvm_meso is set to true 
     335      ! The parameterization has been published in Gorgues et al. (2019). 
     336      ! ----------------------------------------------------------------- 
     337      IF (ln_dvm_meso) THEN 
     338         ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) ) 
     339         ALLOCATE( zgramigbsi(jpi,jpj) ) 
     340         zgramigrem(:,:) = 0.0    ;   zgramigref(:,:) = 0.0 
     341         zgramigpoc(:,:) = 0.0    ;   zgramigpof(:,:) = 0.0 
     342         zgramigbsi(:,:) = 0.0 
     343 
     344        ! Compute the amount of materials that will go into vertical migration 
     345        ! This fraction is sumed over the euphotic zone and is removed from  
     346        ! the fluxes driven by mesozooplankton in the euphotic zone. 
     347        ! -------------------------------------------------------------------- 
     348        DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk) 
     349            zmigreltime = (1. - strn(ji,jj)) 
     350            zmigthick   = (1. - zmigreltime ) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) 
     351            IF ( gdept(ji,jj,jk,Kmm) <= heup(ji,jj) ) THEN 
     352               zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * zmigthick  
     353               zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * zmigthick  
     354               zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * zmigthick  
     355               zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * zmigthick  
     356               zgramigbsi(ji,jj) = zgramigbsi(ji,jj) + xfracmig * zgrabsi(ji,jj,jk) * zmigthick  
     357 
     358               zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     359               zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     360               zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     361               zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     362               zgrabsi(ji,jj,jk) = zgrabsi(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     363            ENDIF 
     364         END_3D 
     365       
     366         ! The inorganic and organic fluxes induced by migrating organisms are added at the  
     367         ! the migration depth (corresponding indice is set by kmig) 
     368         ! -------------------------------------------------------------------------------- 
     369         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     370            IF( tmask(ji,jj,1) == 1.) THEN 
     371               jkt = kmig(ji,jj) 
     372               zdep = 1. / e3t(ji,jj,jkt,Kmm) 
     373               zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) * zdep  
     374               zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) * zdep 
     375               zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) * zdep 
     376               zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) * zdep 
     377               zgrabsi(ji,jj,jkt) = zgrabsi(ji,jj,jkt) + zgramigbsi(ji,jj) * zdep 
     378            ENDIF 
     379         END_2D 
     380         ! 
     381         ! Deallocate temporary variables 
     382         ! ------------------------------ 
     383         DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof, zgramigbsi ) 
     384      ! End of the ln_dvm_meso part 
     385      ENDIF 
     386 
     387      !   Update the arrays TRA which contain the biological sources and sinks 
     388      !   This only concerns the variables which are affected by DVM (inorganic  
     389      !   nutrients, DOC agands, and particulate organic carbon).  
     390      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk) 
     391         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarem(ji,jj,jk) * sigma2 
     392         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgrarem(ji,jj,jk) * sigma2 
     393         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgrarem(ji,jj,jk) * ( 1. - sigma2 ) 
     394         ! 
     395         IF( ln_ligand ) &  
     396          &  tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zgrarem(ji,jj,jk) * ( 1. - sigma2 ) * ldocz 
     397         ! 
     398         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem(ji,jj,jk) * sigma2 
     399         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref(ji,jj,jk) 
     400         zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk) 
     401         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem(ji,jj,jk) * sigma2 
     402         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgrarem(ji,jj,jk) * sigma2              
     403         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zgrapoc(ji,jj,jk) 
     404         prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk)   + zgrapoc(ji,jj,jk) 
     405         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zgrapof(ji,jj,jk) 
     406         tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrabsi(ji,jj,jk) 
     407      END_3D 
     408      ! 
     409      ! Write the output 
    233410      IF( lk_iomput .AND. knt == nrdttrc ) THEN 
    234411        CALL iom_put( "PCAL"  , prodcal(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  !  Calcite production  
    235         IF( iom_use("GRAZ2") ) THEN  !   Total grazing of phyto by zooplankton 
    236            zgrazing2(:,:,jpk) = 0._wp ;  CALL iom_put( "GRAZ2" , zgrazing2(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  
    237          ENDIF 
    238          IF( iom_use("FEZOO2") ) THEN   
    239            zfezoo2 (:,:,jpk) = 0._wp ; CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 
    240          ENDIF 
    241          IF( ln_ligand ) THEN 
    242             zz2ligprod(:,:,jpk) = 0._wp ; CALL iom_put( "LPRODZ2", zz2ligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  ) 
    243          ENDIF 
     412        CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) ! Total grazing of phyto by zoo 
     413        CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 
     414        IF( ln_ligand ) & 
     415         & CALL iom_put( "LPRODZ2", zgrarem(ji,jj,jk) * ( 1. - sigma2 ) * ldocz * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  ) 
    244416      ENDIF 
    245417      ! 
     
    261433      !! ** Purpose :   Initialization of mesozooplankton parameters 
    262434      !! 
    263       !! ** Method  :   Read the nampismes namelist and check the parameters 
     435      !! ** Method  :   Read the namp4zmes namelist and check the parameters 
    264436      !!      called at the first timestep (nittrc000) 
    265437      !! 
     
    270442      NAMELIST/namp4zmes/ part2, grazrat2, resrat2, mzrat2, xpref2n, xpref2d, xpref2z,   & 
    271443         &                xpref2c, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & 
    272          &                xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux 
     444         &                xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux, ln_dvm_meso,  & 
     445         &                xsigma2, xsigma2del, xfracmig 
    273446      !!---------------------------------------------------------------------- 
    274447      ! 
     
    281454      READ  ( numnatp_ref, namp4zmes, IOSTAT = ios, ERR = 901) 
    282455901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zmes in reference namelist' ) 
     456 
    283457      READ  ( numnatp_cfg, namp4zmes, IOSTAT = ios, ERR = 902 ) 
    284458902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zmes in configuration namelist' ) 
     
    303477         WRITE(numout,*) '      non assimilated fraction of P by mesozoo       unass2       =', unass2 
    304478         WRITE(numout,*) '      Efficiency of Mesozoo growth                   epsher2      =', epsher2 
    305          WRITE(numout,*) '      Minimum Efficiency of Mesozoo growth           epsher2min  =', epsher2min 
     479         WRITE(numout,*) '      Minimum Efficiency of Mesozoo growth           epsher2min   =', epsher2min 
    306480         WRITE(numout,*) '      Fraction of mesozoo excretion as DOM           sigma2       =', sigma2 
    307481         WRITE(numout,*) '      half sturation constant for grazing 2          xkgraz2      =', xkgraz2 
     482         WRITE(numout,*) '      Width of the grazing window                     xsigma2     =', xsigma2 
     483         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigma2del  =', xsigma2del 
     484         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso 
     485         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig 
    308486      ENDIF 
    309487      ! 
    310488   END SUBROUTINE p4z_meso_init 
     489 
     490   SUBROUTINE p4z_meso_depmig( Kbb, Kmm ) 
     491      !!---------------------------------------------------------------------- 
     492      !!                  ***  ROUTINE p4z_meso_depmig  *** 
     493      !! 
     494      !! ** Purpose :   Computation the migration depth of mesozooplankton 
     495      !! 
     496      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen 
     497      !!      temperature and chlorophylle following the parameterization  
     498      !!      proposed by Bianchi et al. (2013) 
     499      !!---------------------------------------------------------------------- 
     500      INTEGER, INTENT(in)  ::  Kbb, kmm ! time level indices 
     501      ! 
     502      INTEGER  :: ji, jj, jk 
     503      ! 
     504      REAL(wp) :: ztotchl, z1dep 
     505      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy 
     506 
     507      !!--------------------------------------------------------------------- 
     508      ! 
     509      IF( ln_timing == 1 )  CALL timing_start('p4z_meso_zdepmig') 
     510      ! 
     511      oxymoy(:,:)  = 0. 
     512      tempmoy(:,:) = 0. 
     513      zdepmoy(:,:) = 0. 
     514      depmig (:,:) = 5. 
     515      kmig   (:,:) = 1 
     516      ! 
     517      ! Compute the averaged values of oxygen, temperature over the domain  
     518      ! 150m to 500 m depth. 
     519      ! ------------------------------------------------------------------ 
     520      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk) 
     521         IF( tmask(ji,jj,jk) == 1.) THEN 
     522            IF( gdept(ji,jj,jk,Kmm) >= 150. .AND. gdept(ji,jj,jk,kmm) <= 500.) THEN 
     523               oxymoy(ji,jj)  = oxymoy(ji,jj)  + tr(ji,jj,jk,jpoxy,Kbb) * 1E6 * e3t(ji,jj,jk,Kmm) 
     524               tempmoy(ji,jj) = tempmoy(ji,jj) + ts(ji,jj,jk,jp_tem,kmm)      * e3t(ji,jj,jk,kmm) 
     525               zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t(ji,jj,jk,Kmm) 
     526            ENDIF 
     527         ENDIF 
     528      END_3D 
     529 
     530      ! Compute the difference between surface values and the mean values in the mesopelagic 
     531      ! domain 
     532      ! ------------------------------------------------------------------------------------ 
     533      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     534         z1dep = 1. / ( zdepmoy(ji,jj) + rtrn ) 
     535         oxymoy(ji,jj)  = tr(ji,jj,1,jpoxy,Kbb) * 1E6 - oxymoy(ji,jj)  * z1dep 
     536         tempmoy(ji,jj) = ts(ji,jj,1,jp_tem,Kmm)      - tempmoy(ji,jj) * z1dep 
     537      END_2D 
     538      ! 
     539      ! Computation of the migration depth based on the parameterization of  
     540      ! Bianchi et al. (2013) 
     541      ! ------------------------------------------------------------------- 
     542      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     543         IF( tmask(ji,jj,1) == 1. ) THEN 
     544            ztotchl = ( tr(ji,jj,1,jpnch,Kbb) + tr(ji,jj,1,jpdch,Kbb) ) * 1E6 
     545            depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(ztotchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj) 
     546         ENDIF 
     547      END_2D 
     548      !  
     549      ! Computation of the corresponding jk indice  
     550      ! ------------------------------------------ 
     551      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     552         IF( depmig(ji,jj) >= gdepw(ji,jj,jk,Kmm) .AND. depmig(ji,jj) < gdepw(ji,jj,jk+1,Kmm) ) THEN 
     553             kmig(ji,jj) = jk 
     554          ENDIF 
     555      END_3D 
     556      ! 
     557      ! Correction of the migration depth and indice based on O2 levels 
     558      ! If O2 is too low, imposing a migration depth at this low O2 levels 
     559      ! would lead to negative O2 concentrations (respiration while O2 is close 
     560      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so 
     561      ! that it falls above the OMZ 
     562      ! ----------------------------------------------------------------------- 
     563      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     564         IF( tr(ji,jj,kmig(ji,jj),jpoxy,Kbb) < 5E-6 ) THEN 
     565            DO jk = kmig(ji,jj),1,-1 
     566               IF( tr(ji,jj,jk,jpoxy,Kbb) >= 5E-6 .AND. tr(ji,jj,jk+1,jpoxy,Kbb)  < 5E-6) THEN 
     567                  kmig(ji,jj) = jk 
     568                  depmig(ji,jj) = gdept(ji,jj,jk,Kmm) 
     569               ENDIF 
     570            END DO 
     571         ENDIF 
     572      END_2D 
     573      ! 
     574      IF( ln_timing )   CALL timing_stop('p4z_meso_depmig') 
     575      ! 
     576   END SUBROUTINE p4z_meso_depmig 
     577 
     578   INTEGER FUNCTION p4z_meso_alloc() 
     579      !!---------------------------------------------------------------------- 
     580      !!                     ***  ROUTINE p4z_meso_alloc  *** 
     581      !!---------------------------------------------------------------------- 
     582      ! 
     583      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p4z_meso_alloc  ) 
     584      ! 
     585      IF( p4z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_meso_alloc : failed to allocate arrays.' ) 
     586      ! 
     587   END FUNCTION p4z_meso_alloc 
    311588 
    312589   !!====================================================================== 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zmicro.F90

    r15090 r15459  
    2222   PRIVATE 
    2323 
     24   !! * Shared module variables 
    2425   PUBLIC   p4z_micro         ! called in p4zbio.F90 
    2526   PUBLIC   p4z_micro_init    ! called in trcsms_pisces.F90 
     
    4142   REAL(wp), PUBLIC ::   epsher      !: growth efficiency for grazing 1  
    4243   REAL(wp), PUBLIC ::   epshermin   !: minimum growth efficiency for grazing 1 
     44   REAL(wp), PUBLIC ::   xsigma      !: Width of the grazing window 
     45   REAL(wp), PUBLIC ::   xsigmadel   !: Maximum additional width of the grazing window at low food density  
    4346 
    4447   !! * Substitutions 
     
    5659      !! 
    5760      !! ** Purpose :   Compute the sources/sinks for microzooplankton 
     61      !!                This includes ingestion and assimilation, flux feeding 
     62      !!                and mortality. We use a passive prey switching   
     63      !!                parameterization. 
     64      !!                All living compartments smaller than microzooplankton 
     65      !!                are potential preys of microzooplankton 
    5866      !! 
    5967      !! ** Method  : - ??? 
     
    6573      INTEGER  :: ji, jj, jk 
    6674      REAL(wp) :: zcompadi, zcompaz , zcompaph, zcompapoc 
    67       REAL(wp) :: zgraze  , zdenom, zdenom2 
    68       REAL(wp) :: zfact   , zfood, zfoodlim, zbeta 
    69       REAL(wp) :: zepsherf, zepshert, zepsherv, zepsherq 
    70       REAL(wp) :: zgrarsig, zgraztotc, zgraztotn, zgraztotf 
     75      REAL(wp) :: zgraze  , zdenom, zdenom2, zfact, zfood, zfoodlim, zbeta 
     76      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgrarsig, zgraztotc, zgraztotn, zgraztotf 
    7177      REAL(wp) :: zgrarem, zgrafer, zgrapoc, zprcaca, zmortz 
    72       REAL(wp) :: zrespz, ztortz, zgrasrat, zgrasratn 
    73       REAL(wp) :: zgrazp, zgrazm, zgrazsd 
    74       REAL(wp) :: zgrazmf, zgrazsf, zgrazpf 
    75       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo, zzligprod 
     78      REAL(wp) :: zrespz, ztortz, zgrasratf, zgrasratn 
     79      REAL(wp) :: zgraznc, zgrazpoc, zgrazdc, zgrazpof, zgrazdf, zgraznf 
     80      REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmptot, zproport 
     81      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo 
     82      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zzligprod 
    7683      CHARACTER (len=25) :: charout 
     84 
    7785      !!--------------------------------------------------------------------- 
    7886      ! 
    7987      IF( ln_timing )   CALL timing_start('p4z_micro') 
     88      ! 
     89      IF (ln_ligand) THEN 
     90         ALLOCATE( zzligprod(jpi,jpj,jpk) ) 
     91         zzligprod(:,:,:) = 0._wp 
     92      ENDIF 
    8093      ! 
    8194      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     
    8396         zfact   = xstep * tgfunc2(ji,jj,jk) * zcompaz 
    8497 
    85          !  Respiration rates of both zooplankton 
    86          !  ------------------------------------- 
     98         ! Proportion of diatoms that are within the size range 
     99         ! accessible to microzooplankton.  
     100         zproport  = min(1.0, exp(-1.1 * MAX(0., ( sized(ji,jj,jk) - 1.8 ))**0.8 )) 
     101 
     102         !  linear mortality of mesozooplankton 
     103         !  A michaelis menten modulation term is used to avoid extinction of  
     104         !  microzooplankton at very low food concentrations. Mortality is  
     105         !  enhanced in low O2 waters 
     106         !  ----------------------------------------------------------------- 
    87107         zrespz = resrat * zfact * tr(ji,jj,jk,jpzoo,Kbb) / ( xkmort + tr(ji,jj,jk,jpzoo,Kbb) )  & 
    88108            &   + resrat * zfact * 3. * nitrfac(ji,jj,jk) 
    89109 
    90          !  Zooplankton mortality. A square function has been selected with 
    91          !  no real reason except that it seems to be more stable and may mimic predation. 
    92          !  --------------------------------------------------------------- 
     110         !  Zooplankton quadratic mortality. A square function has been selected with 
     111         !  to mimic predation and disease (density dependent mortality). It also tends 
     112         !  to stabilise the model 
     113         !  ------------------------------------------------------------------------- 
    93114         ztortz = mzrat * 1.e6 * zfact * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) 
    94115 
    95          zcompadi  = MIN( MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthreshdia ), 0.e0 ), xsizedia ) 
     116         !   Computation of the abundance of the preys 
     117         !   A threshold can be specified in the namelist 
     118         !   Diatoms have a specific treatment. WHen concentrations  
     119         !   exceed a certain value, diatoms are suppposed to be too  
     120         !   big for microzooplankton. 
     121         !   -------------------------------------------------------- 
     122         zcompadi  = zproport * MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthreshdia ), 0.e0 ) 
    96123         zcompaph  = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthreshphy ), 0.e0 ) 
    97124         zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthreshpoc ), 0.e0 ) 
    98           
    99          !     Microzooplankton grazing 
    100          !     ------------------------ 
     125  
     126         ! Microzooplankton grazing 
     127         ! The total amount of food is the sum of all preys accessible to mesozooplankton  
     128         ! multiplied by their food preference 
     129         ! A threshold can be specified in the namelist (xthresh). However, when food  
     130         ! concentration is close to this threshold, it is decreased to avoid the  
     131         ! accumulation of food in the mesozoopelagic domain 
     132         ! ------------------------------------------------------------------------------- 
    101133         zfood     = xprefn * zcompaph + xprefc * zcompapoc + xprefd * zcompadi 
    102134         zfoodlim  = MAX( 0. , zfood - min(xthresh,0.5*zfood) ) 
     
    105137         zgraze    = grazrat * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) 
    106138 
    107          zgrazp    = zgraze  * xprefn * zcompaph  * zdenom2  
    108          zgrazm    = zgraze  * xprefc * zcompapoc * zdenom2  
    109          zgrazsd   = zgraze  * xprefd * zcompadi  * zdenom2  
    110  
    111          zgrazpf   = zgrazp  * tr(ji,jj,jk,jpnfe,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn) 
    112          zgrazmf   = zgrazm  * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
    113          zgrazsf   = zgrazsd * tr(ji,jj,jk,jpdfe,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn) 
    114          ! 
    115          zgraztotc = zgrazp  + zgrazm  + zgrazsd  
    116          zgraztotf = zgrazpf + zgrazsf + zgrazmf  
    117          zgraztotn = zgrazp * quotan(ji,jj,jk) + zgrazm + zgrazsd * quotad(ji,jj,jk) 
     139         ! An active switching parameterization is used here. 
     140         ! We don't use the KTW parameterization proposed by  
     141         ! Vallina et al. because it tends to produce too steady biomass 
     142         ! composition and the variance of Chl is too low as it grazes 
     143         ! too strongly on winning organisms. We use a generalized 
     144         ! switching parameterization proposed by Morozov and  
     145         ! Petrovskii (2013) 
     146         ! ------------------------------------------------------------   
     147         ! The width of the selection window is increased when preys 
     148         ! have low abundance, .i.e. zooplankton become less specific  
     149         ! to avoid starvation. 
     150         ! ---------------------------------------------------------- 
     151         zsigma = 1.0 - zdenom**2/(0.05**2+zdenom**2) 
     152         zsigma = xsigma + xsigmadel * zsigma 
     153         zdiffdn = exp( -ABS(log(1.67 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2) 
     154         ztmp1 = xprefn * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / ( 1.0 + zdiffdn ) 
     155         ztmp2 = xprefd * zcompadi * ( zdiffdn * zcompaph + zcompadi ) / ( 1.0 + zdiffdn ) 
     156         ztmp3 = xprefc * zcompapoc**2 
     157         ztmptot = ztmp1 + ztmp2 + ztmp3 + rtrn 
     158         ztmp1 = ztmp1 / ztmptot 
     159         ztmp2 = ztmp2 / ztmptot 
     160         ztmp3 = ztmp3 / ztmptot 
     161 
     162         ! Ingestion terms on the different preys of microzooplankton 
     163         zgraznc   = zgraze   * ztmp1 * zdenom  ! Nanophytoplankton 
     164         zgrazdc   = zgraze   * ztmp2 * zdenom  ! Diatoms 
     165         zgrazpoc  = zgraze   * ztmp3 * zdenom  ! POC 
     166 
     167         ! Ingestion terms on the iron content of the different preys 
     168         zgraznf   = zgraznc  * tr(ji,jj,jk,jpnfe,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn) 
     169         zgrazpof  = zgrazpoc * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
     170         zgrazdf   = zgrazdc  * tr(ji,jj,jk,jpdfe,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn) 
     171         ! 
     172         ! Total ingestion rate in C, Fe, N units 
     173         zgraztotc = zgraznc + zgrazpoc + zgrazdc 
     174         zgraztotf = zgraznf + zgrazdf  + zgrazpof  
     175         zgraztotn = zgraznc * quotan(ji,jj,jk) + zgrazpoc + zgrazdc * quotad(ji,jj,jk) 
    118176 
    119177         ! Grazing by microzooplankton 
     
    129187         ! Fulton, 2012) 
    130188         ! ----------------------------------------------------------------------------- 
    131          zgrasrat  = ( zgraztotf + rtrn ) / ( zgraztotc + rtrn ) 
     189 
     190         zgrasratf = ( zgraztotf + rtrn ) / ( zgraztotc + rtrn ) 
    132191         zgrasratn = ( zgraztotn + rtrn ) / ( zgraztotc + rtrn ) 
    133          zepshert  =  MIN( 1., zgrasratn, zgrasrat / ferat3) 
     192         zepshert  =  MIN( 1., zgrasratn, zgrasratf / feratz) 
    134193         zbeta     = MAX(0., (epsher - epshermin) ) 
     194         ! Food quantity deprivation of the GGE 
    135195         zepsherf  = epshermin + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) 
     196         ! Food quality deprivation of the GGE 
    136197         zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) 
    137          zepsherv  = zepsherf * zepshert * zepsherq  
    138  
    139          zgrafer   = zgraztotc * MAX( 0. , ( 1. - unass ) * zgrasrat - ferat3 * zepsherv )  
     198         ! Actual GGE of microzooplankton 
     199         zepsherv  = zepsherf * zepshert * zepsherq 
     200         ! Excretion of Fe 
     201         zgrafer   = zgraztotc * MAX( 0. , ( 1. - unass ) * zgrasratf - feratz * zepsherv )  
     202         ! Excretion of C, N, P 
    140203         zgrarem   = zgraztotc * ( 1. - zepsherv - unass ) 
     204         ! Egestion of C, N, P 
    141205         zgrapoc   = zgraztotc * unass 
     206 
    142207 
    143208         !  Update of the TRA arrays 
    144209         !  ------------------------ 
     210         ! Fraction of excretion as inorganic nutrients and DIC 
    145211         zgrarsig  = zgrarem * sigma1 
    146212         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarsig 
     
    165231         zmortz = ztortz + zrespz 
    166232         tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zmortz + zepsherv * zgraztotc  
    167          tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgrazp 
    168          tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazsd 
    169          tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) - zgrazp * tr(ji,jj,jk,jpnch,Kbb)/(tr(ji,jj,jk,jpphy,Kbb)+rtrn) 
    170          tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) - zgrazsd * tr(ji,jj,jk,jpdch,Kbb)/(tr(ji,jj,jk,jpdia,Kbb)+rtrn) 
    171          tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zgrazsd * tr(ji,jj,jk,jpdsi,Kbb)/(tr(ji,jj,jk,jpdia,Kbb)+rtrn) 
    172          tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrazsd * tr(ji,jj,jk,jpdsi,Kbb)/(tr(ji,jj,jk,jpdia,Kbb)+rtrn) 
    173          tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgrazpf 
    174          tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazsf 
    175          tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zmortz - zgrazm 
     233         tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc 
     234         tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc 
     235         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) 
     236         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) 
     237         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) 
     238         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) 
     239         tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgraznf 
     240         tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazdf 
     241         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zmortz - zgrazpoc 
    176242         prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortz 
    177          conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazm 
    178          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + ferat3 * zmortz - zgrazmf 
    179          ! 
    180          ! calcite production 
    181          zprcaca = xfracal(ji,jj,jk) * zgrazp 
     243         conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc 
     244         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + feratz * zmortz - zgrazpof 
     245         ! 
     246         ! Calcite remineralization due to zooplankton activity 
     247         ! part of the ingested calcite is not dissolving in the acidic gut 
     248         ! ---------------------------------------------------------------- 
     249         zprcaca = xfracal(ji,jj,jk) * zgraznc 
    182250         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 
     251 
    183252         ! 
    184253         zprcaca = part * zprcaca 
     
    217286      !! ** Purpose :   Initialization of microzooplankton parameters 
    218287      !! 
    219       !! ** Method  :   Read the nampiszoo namelist and check the parameters 
     288      !! ** Method  :   Read the namp4zzoo namelist and check the parameters 
    220289      !!                called at the first timestep (nittrc000) 
    221290      !! 
    222       !! ** input   :   Namelist nampiszoo 
     291      !! ** input   :   Namelist namp4zzoo 
    223292      !! 
    224293      !!---------------------------------------------------------------------- 
     
    227296      NAMELIST/namp4zzoo/ part, grazrat, resrat, mzrat, xprefn, xprefc, & 
    228297         &                xprefd,  xthreshdia,  xthreshphy,  xthreshpoc, & 
    229          &                xthresh, xkgraz, epsher, epshermin, sigma1, unass 
     298         &                xthresh, xkgraz, epsher, epshermin, sigma1, unass,  & 
     299         &                xsigma, xsigmadel 
    230300      !!---------------------------------------------------------------------- 
    231301      ! 
     
    238308      READ  ( numnatp_ref, namp4zzoo, IOSTAT = ios, ERR = 901) 
    239309901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zzoo in reference namelist' ) 
     310 
    240311      READ  ( numnatp_cfg, namp4zzoo, IOSTAT = ios, ERR = 902 ) 
    241312902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zzoo in configuration namelist' ) 
     
    259330         WRITE(numout,*) '      Minimum efficicency of microzoo growth          epshermin   =', epshermin 
    260331         WRITE(numout,*) '      Fraction of microzoo excretion as DOM           sigma1      =', sigma1 
    261          WRITE(numout,*) '      half sturation constant for grazing 1           xkgraz      =', xkgraz 
     332         WRITE(numout,*) '      half saturation constant for grazing 1          xkgraz      =', xkgraz 
     333         WRITE(numout,*) '      Width of the grazing window                     xsigma      =', xsigma 
     334         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigmadel   =', xsigmadel 
     335 
    262336      ENDIF 
    263337      ! 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zmort.F90

    r15090 r15459  
    2020   PRIVATE 
    2121 
    22    PUBLIC   p4z_mort     
    23    PUBLIC   p4z_mort_init     
    24  
    25    REAL(wp), PUBLIC ::   wchl     !: 
    26    REAL(wp), PUBLIC ::   wchld    !: 
    27    REAL(wp), PUBLIC ::   wchldm   !: 
    28    REAL(wp), PUBLIC ::   mprat    !: 
    29    REAL(wp), PUBLIC ::   mprat2   !: 
     22   PUBLIC   p4z_mort           ! Called from p4zbio.F90  
     23   PUBLIC   p4z_mort_init      ! Called from trcini_pisces.F90  
     24 
     25   REAL(wp), PUBLIC ::   wchln    !: Quadratic mortality rate of nanophytoplankton 
     26   REAL(wp), PUBLIC ::   wchld    !: Quadratic mortality rate of diatoms 
     27   REAL(wp), PUBLIC ::   mpratn   !: Linear mortality rate of nanophytoplankton 
     28   REAL(wp), PUBLIC ::   mpratd   !: Linear mortality rate of diatoms 
    3029 
    3130   !! * Substitutions 
     
    4241      !!                     ***  ROUTINE p4z_mort  *** 
    4342      !! 
    44       !! ** Purpose :   Calls the different subroutine to initialize and compute 
     43      !! ** Purpose :   Calls the different subroutine to compute 
    4544      !!                the different phytoplankton mortality terms 
    4645      !! 
     
    5150      !!--------------------------------------------------------------------- 
    5251      ! 
    53       CALL p4z_nano( Kbb, Krhs )            ! nanophytoplankton 
    54       ! 
    55       CALL p4z_diat( Kbb, Krhs )            ! diatoms 
     52      CALL p4z_mort_nano( Kbb, Krhs )            ! nanophytoplankton 
     53      CALL p4z_mort_diat( Kbb, Krhs )            ! diatoms 
    5654      ! 
    5755   END SUBROUTINE p4z_mort 
    5856 
    5957 
    60    SUBROUTINE p4z_nano( Kbb, Krhs ) 
    61       !!--------------------------------------------------------------------- 
    62       !!                     ***  ROUTINE p4z_nano  *** 
     58   SUBROUTINE p4z_mort_nano( Kbb, Krhs ) 
     59      !!--------------------------------------------------------------------- 
     60      !!                     ***  ROUTINE p4z_mort_nano  *** 
    6361      !! 
    6462      !! ** Purpose :   Compute the mortality terms for nanophytoplankton 
    6563      !! 
    66       !! ** Method  : - ??? 
     64      !! ** Method  :   Both quadratic and simili linear mortality terms 
    6765      !!--------------------------------------------------------------------- 
    6866      INTEGER, INTENT(in) ::   Kbb, Krhs  ! time level indices 
    6967      INTEGER  ::   ji, jj, jk 
    70       REAL(wp) ::   zsizerat, zcompaph 
     68      REAL(wp) ::   zcompaph 
    7169      REAL(wp) ::   zfactfe, zfactch, zprcaca, zfracal 
    72       REAL(wp) ::   ztortp , zrespp , zmortp  
     70      REAL(wp) ::   ztortp , zrespp , zmortp, zlim1, zlim2  
    7371      CHARACTER (len=25) ::   charout 
    7472      !!--------------------------------------------------------------------- 
    7573      ! 
    76       IF( ln_timing )   CALL timing_start('p4z_nano') 
     74      IF( ln_timing )   CALL timing_start('p4z_mort_nano') 
    7775      ! 
    7876      prodcal(:,:,:) = 0._wp   ! calcite production variable set to zero 
    7977      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    80          zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - 1e-8 ), 0.e0 ) 
    81          !     When highly limited by macronutrients, very small cells  
    82          !     dominate the community. As a consequence, aggregation 
    83          !     due to turbulence is negligible. Mortality is also set 
    84          !     to 0 
    85          zsizerat = MIN(1., MAX( 0., (quotan(ji,jj,jk) - 0.2) / 0.3) ) * tr(ji,jj,jk,jpphy,Kbb) 
    86          !     Squared mortality of Phyto similar to a sedimentation term during 
    87          !     blooms (Doney et al. 1996) 
    88          zrespp = wchl * 1.e6 * xstep * xdiss(ji,jj,jk) * zcompaph * zsizerat  
    89  
    90          !     Phytoplankton mortality. This mortality loss is slightly 
    91          !     increased when nutrients are limiting phytoplankton growth 
    92          !     as observed for instance in case of iron limitation. 
    93          ztortp = mprat * xstep * zcompaph / ( xkmort + tr(ji,jj,jk,jpphy,Kbb) ) * zsizerat 
     78         zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - 1e-9 ), 0.e0 ) 
     79 
     80         ! Quadratic mortality of nano due to aggregation during 
     81         ! blooms (Doney et al. 1996) 
     82         ! ----------------------------------------------------- 
     83         zlim2   = xlimphy(ji,jj,jk) * xlimphy(ji,jj,jk) 
     84         zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) * tr(ji,jj,jk,jpphy,Kbb) 
     85         zrespp  = wchln * 1.e6 * xstep * zlim1 * xdiss(ji,jj,jk) * zcompaph 
     86 
     87         ! Phytoplankton linear mortality 
     88         ! A michaelis-menten like term is introduced to avoid  
     89         ! extinction of nanophyto in highly limited areas 
     90         ! ---------------------------------------------------- 
     91         ztortp = mpratn * xstep * zcompaph / ( xkmort + tr(ji,jj,jk,jpphy,Kbb) ) * tr(ji,jj,jk,jpphy,Kbb) 
    9492 
    9593         zmortp = zrespp + ztortp 
    96  
     94          
    9795         !   Update the arrays TRA which contains the biological sources and sinks 
    98  
    9996         zfactfe = tr(ji,jj,jk,jpnfe,Kbb)/(tr(ji,jj,jk,jpphy,Kbb)+rtrn) 
    10097         zfactch = tr(ji,jj,jk,jpnch,Kbb)/(tr(ji,jj,jk,jpphy,Kbb)+rtrn) 
     
    10299         tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) - zmortp * zfactch 
    103100         tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zmortp * zfactfe 
     101 
     102         ! Production PIC particles due to mortality 
    104103         zprcaca = xfracal(ji,jj,jk) * zmortp 
    105          ! 
    106104         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 
    107          ! 
     105 
     106         ! POC associated with the shell is supposed to be routed to  
     107         ! big particles because of the ballasting effect 
    108108         zfracal = 0.5 * xfracal(ji,jj,jk) 
    109109         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zprcaca 
    110110         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * zprcaca 
    111111         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) + zprcaca 
    112          tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zfracal * zmortp 
    113          tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + ( 1. - zfracal ) * zmortp 
    114          prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + ( 1. - zfracal ) * zmortp 
    115          prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zfracal * zmortp 
    116          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + ( 1. - zfracal ) * zmortp * zfactfe 
    117          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zfracal * zmortp * zfactfe 
     112         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zmortp 
     113         prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zmortp 
     114 
     115         ! Update the arrays TRA which contains the biological sources and sinks 
     116         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zmortp * zfactfe 
     117         ! 
    118118      END_3D 
    119119      ! 
     
    124124       ENDIF 
    125125      ! 
    126       IF( ln_timing )   CALL timing_stop('p4z_nano') 
    127       ! 
    128    END SUBROUTINE p4z_nano 
    129  
    130  
    131    SUBROUTINE p4z_diat( Kbb, Krhs ) 
    132       !!--------------------------------------------------------------------- 
    133       !!                     ***  ROUTINE p4z_diat  *** 
     126      IF( ln_timing )   CALL timing_stop('p4z_mort_nano') 
     127      ! 
     128   END SUBROUTINE p4z_mort_nano 
     129 
     130 
     131   SUBROUTINE p4z_mort_diat( Kbb, Krhs ) 
     132      !!--------------------------------------------------------------------- 
     133      !!                     ***  ROUTINE p4z_mort_diat  *** 
    134134      !! 
    135135      !! ** Purpose :   Compute the mortality terms for diatoms 
    136136      !! 
    137       !! ** Method  : - ??? 
     137      !! ** Method  : - Both quadratic and simili linear mortality terms 
    138138      !!--------------------------------------------------------------------- 
    139139      INTEGER, INTENT(in) ::   Kbb, Krhs  ! time level indices 
     
    145145      !!--------------------------------------------------------------------- 
    146146      ! 
    147       IF( ln_timing )   CALL timing_start('p4z_diat') 
    148       ! 
    149       !    Aggregation term for diatoms is increased in case of nutrient 
    150       !    stress as observed in reality. The stressed cells become more 
    151       !    sticky and coagulate to sink quickly out of the euphotic zone 
    152       !     ------------------------------------------------------------ 
     147      IF( ln_timing )   CALL timing_start('p4z_mort_diat') 
     148      ! 
     149      ! Aggregation term for diatoms is increased in case of nutrient 
     150      ! stress as observed in reality. The stressed cells become more 
     151      ! sticky and coagulate to sink quickly out of the euphotic zone 
     152      ! This is due to the production of EPS by stressed cells 
     153      ! ------------------------------------------------------------- 
    153154 
    154155      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     
    156157         zcompadi = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - 1e-9), 0. ) 
    157158 
    158          !    Aggregation term for diatoms is increased in case of nutrient 
    159          !    stress as observed in reality. The stressed cells become more 
    160          !    sticky and coagulate to sink quickly out of the euphotic zone 
    161          !     ------------------------------------------------------------ 
    162          !  Phytoplankton respiration  
    163          !     ------------------------ 
     159         ! Aggregation term for diatoms is increased in case of nutrient 
     160         ! stress as observed in reality. The stressed cells become more 
     161         ! sticky and coagulate to sink quickly out of the euphotic zone 
     162         ! ------------------------------------------------------------ 
    164163         zlim2   = xlimdia(ji,jj,jk) * xlimdia(ji,jj,jk) 
    165164         zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 )  
    166          zrespp2 = 1.e6 * xstep * (  wchld + wchldm * zlim1 ) * xdiss(ji,jj,jk) * zcompadi * tr(ji,jj,jk,jpdia,Kbb) 
    167  
    168          !     Phytoplankton mortality.  
    169          !     ------------------------ 
    170          ztortp2 = mprat2 * xstep * tr(ji,jj,jk,jpdia,Kbb)  / ( xkmort + tr(ji,jj,jk,jpdia,Kbb) ) * zcompadi  
     165         zrespp2 = 1.e6 * xstep * wchld * zlim1 * xdiss(ji,jj,jk) * zcompadi * tr(ji,jj,jk,jpdia,Kbb) 
     166 
     167         ! Phytoplankton linear mortality 
     168         ! A michaelis-menten like term is introduced to avoid  
     169         ! extinction of diatoms in highly limited areas 
     170         !  --------------------------------------------------- 
     171         ztortp2 = mpratd * xstep * tr(ji,jj,jk,jpdia,Kbb)  / ( xkmort + tr(ji,jj,jk,jpdia,Kbb) ) * zcompadi  
    171172 
    172173         zmortp2 = zrespp2 + ztortp2 
    173174 
    174          !   Update the arrays tr(:,:,:,:,Krhs) which contains the biological sources and sinks 
     175         !   Update the arrays trends which contains the biological sources and sinks 
    175176         !   --------------------------------------------------------------------- 
    176177         zfactch = tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
     
    182183         tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zmortp2 * zfactsi 
    183184         tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zmortp2 * zfactsi 
    184          tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zrespp2 + 0.5 * ztortp2 
    185          tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + 0.5 * ztortp2 
    186          prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + 0.5 * ztortp2 
    187          prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zrespp2 + 0.5 * ztortp2 
    188          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + 0.5 * ztortp2 * zfactfe 
    189          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + ( zrespp2 + 0.5 * ztortp2 ) * zfactfe 
     185 
     186         ! Half of the linear mortality term is routed to big particles 
     187         ! becaue of the ballasting effect 
     188         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zrespp2 
     189         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + ztortp2 
     190         prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + ztortp2 
     191         prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zrespp2 
     192         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + ztortp2 * zfactfe 
     193         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zrespp2 * zfactfe 
    190194      END_3D 
    191195      ! 
     
    196200      ENDIF 
    197201      ! 
    198       IF( ln_timing )   CALL timing_stop('p4z_diat') 
    199       ! 
    200    END SUBROUTINE p4z_diat 
     202      IF( ln_timing )   CALL timing_stop('p4z_mort_diat') 
     203      ! 
     204   END SUBROUTINE p4z_mort_diat 
    201205 
    202206 
     
    207211      !! ** Purpose :   Initialization of phytoplankton parameters 
    208212      !! 
    209       !! ** Method  :   Read the nampismort namelist and check the parameters 
     213      !! ** Method  :   Read the namp4zmort namelist and check the parameters 
    210214      !!              called at the first timestep 
    211215      !! 
    212       !! ** input   :   Namelist nampismort 
     216      !! ** input   :   Namelist namp4zmort 
    213217      !! 
    214218      !!---------------------------------------------------------------------- 
    215219      INTEGER ::   ios   ! Local integer 
    216220      ! 
    217       NAMELIST/namp4zmort/ wchl, wchld, wchldm, mprat, mprat2 
     221      NAMELIST/namp4zmort/ wchln, wchld, mpratn, mpratd 
    218222      !!---------------------------------------------------------------------- 
    219223      ! 
     
    226230      READ  ( numnatp_ref, namp4zmort, IOSTAT = ios, ERR = 901) 
    227231901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zmort in reference namelist' ) 
     232 
    228233      READ  ( numnatp_cfg, namp4zmort, IOSTAT = ios, ERR = 902 ) 
    229234902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zmort in configuration namelist' ) 
     
    232237      IF(lwp) THEN                         ! control print 
    233238         WRITE(numout,*) '   Namelist : namp4zmort' 
    234          WRITE(numout,*) '      quadratic mortality of phytoplankton        wchl   =', wchl 
     239         WRITE(numout,*) '      quadratic mortality of phytoplankton        wchln  =', wchln 
    235240         WRITE(numout,*) '      maximum quadratic mortality of diatoms      wchld  =', wchld 
    236          WRITE(numout,*) '      maximum quadratic mortality of diatoms      wchldm =', wchldm 
    237          WRITE(numout,*) '      phytoplankton mortality rate                mprat  =', mprat 
    238          WRITE(numout,*) '      Diatoms mortality rate                      mprat2 =', mprat2 
     241         WRITE(numout,*) '      phytoplankton mortality rate                mpratn =', mpratn 
     242         WRITE(numout,*) '      Diatoms mortality rate                      mpratd =', mpratd 
    239243      ENDIF 
    240244      ! 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zopt.F90

    r15090 r15459  
    6767      REAL(wp), DIMENSION(jpi,jpj    ) :: zdepmoy, zetmp1, zetmp2, zetmp3, zetmp4 
    6868      REAL(wp), DIMENSION(jpi,jpj    ) :: zqsr100, zqsr_corr 
    69       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpar, ze0, ze1, ze2, ze3, zchl3d 
     69      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpar, ze0, ze1, ze2, ze3 
    7070      !!--------------------------------------------------------------------- 
    7171      ! 
     
    7979      ze2(:,:,:) = 0._wp 
    8080      ze3(:,:,:) = 0._wp 
    81       ! 
    82       !                                        !* attenuation coef. function of Chlorophyll and wavelength (Red-Green-Blue) 
    83       !                                        !  -------------------------------------------------------- 
    84                      zchl3d(:,:,:) = tr(:,:,:,jpnch,Kbb) + tr(:,:,:,jpdch,Kbb) 
    85       IF( ln_p5z )   zchl3d(:,:,:) = zchl3d(:,:,:)    + tr(:,:,:,jppch,Kbb) 
    86       ! 
     81 
     82      ! 
     83      ! Attenuation coef. function of Chlorophyll and wavelength (Red-Green-Blue) 
     84      ! Thus the light penetration scheme is based on a decomposition of PAR 
     85      ! into three wave length domains. This was first officially published 
     86      ! in Lengaigne et al. (2007). 
     87      ! -------------------------------------------------------- 
     88      ! 
     89      ! Computation of the light attenuation parameters based on a  
     90      ! look-up table 
    8791      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    88          zchl = ( zchl3d(ji,jj,jk) + rtrn ) * 1.e6 
     92         zchl =  ( tr(ji,jj,jk,jpnch,Kbb) + tr(ji,jj,jk,jpdch,Kbb) + rtrn ) * 1.e6 
     93         IF( ln_p5z )   zchl = zchl + tr(ji,jj,jk,jppch,Kbb) * 1.e6 
    8994         zchl = MIN(  10. , MAX( 0.05, zchl )  ) 
    9095         irgb = NINT( 41 + 20.* LOG10( zchl ) + rtrn ) 
     
    9499         ekr(ji,jj,jk) = rkrgb(3,irgb) * e3t(ji,jj,jk,Kmm) 
    95100      END_3D 
    96       !                                        !* Photosynthetically Available Radiation (PAR) 
    97       !                                        !  -------------------------------------- 
     101 
     102 
     103      ! Photosynthetically Available Radiation (PAR) 
     104      ! Two cases are considered in the following :  
     105      ! (1) An explicit diunal cycle is activated. In that case, mean  
     106      ! QSR is used as PISCES in its current state has not been parameterized 
     107      ! for an explicit diurnal cycle 
     108      ! (2) no diurnal cycle of SW is active and in that case, QSR is used. 
     109      ! -------------------------------------------- 
    98110      IF( l_trcdm2dc ) THEN                     !  diurnal cycle 
    99          ! 
    100          zqsr_corr(:,:) = qsr_mean(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
    101          ! 
    102          CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100 )  
    103          ! 
     111         IF ( ln_p4z_dcyc ) THEN   ! Diurnal cycle in PISCES 
     112            ! 
     113            ! 
     114            ! SW over the ice free zone of the grid cell. This assumes that 
     115            ! SW is zero below sea ice which is a very crude assumption that is  
     116            ! not fully correct with LIM3 and SI3 but no information is  
     117            ! currently available to do a better job. SHould be improved in the  
     118            ! (near) future. 
     119            zqsr_corr(:,:) = qsr_mean(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
     120            ! 
     121            CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100 ) 
     122            ! 
     123            ! Used PAR is computed for each phytoplankton species 
     124            ! etot_ndcy is PAR at level jk averaged over 24h. 
     125            ! Due to their size, they have different light absorption characteristics 
     126            DO jk = 1, nksr 
     127               etot_ndcy(:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk) 
     128            END DO 
     129            ! 
     130            ! SW over the ice free zone of the grid cell. This assumes that 
     131            ! SW is zero below sea ice which is a very crude assumption that is  
     132            ! not fully correct with LIM3 and SI3 but no information is  
     133            ! currently available to do a better job. SHould be improved in the  
     134            ! (near) future. 
     135            zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
     136            ! 
     137            CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3 ) 
     138            ! 
     139            ! Total PAR computation at level jk that includes the diurnal cycle 
     140            DO jk = 1, nksr 
     141               etot (:,:,jk) =  ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk) 
     142               enano(:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk) 
     143               ediat(:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk) 
     144            END DO 
     145            IF( ln_p5z ) THEN 
     146               DO jk = 1, nksr 
     147                  epico  (:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk) 
     148               END DO 
     149            ENDIF 
     150 
     151         ELSE ! No diurnal cycle in PISCES 
     152 
     153            ! 
     154            ! 
     155            ! SW over the ice free zone of the grid cell. This assumes that 
     156            ! SW is zero below sea ice which is a very crude assumption that is  
     157            ! not fully correct with LIM3 and SI3 but no information is  
     158            ! currently available to do a better job. SHould be improved in the  
     159            ! (near) future. 
     160            zqsr_corr(:,:) = qsr_mean(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
     161            ! 
     162            CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100 )  
     163            ! 
     164            ! Used PAR is computed for each phytoplankton species 
     165            ! etot_ndcy is PAR at level jk averaged over 24h. 
     166            ! Due to their size, they have different light absorption characteristics 
     167            DO jk = 1, nksr       
     168               etot_ndcy(:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk) 
     169               enano    (:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk) 
     170               ediat    (:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk) 
     171            END DO 
     172            IF( ln_p5z ) THEN 
     173               DO jk = 1, nksr       
     174                  epico  (:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk) 
     175               END DO 
     176            ENDIF 
     177            ! 
     178            ! SW over the ice free zone of the grid cell. This assumes that 
     179            ! SW is zero below sea ice which is a very crude assumption that is  
     180            ! not fully correct with LIM3 and SI3 but no information is  
     181            ! currently available to do a better job. SHould be improved in the  
     182            ! (near) future. 
     183            zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
     184            ! 
     185            CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3 )  
     186            ! 
     187            ! Total PAR computation at level jk that includes the diurnal cycle 
     188            DO jk = 1, nksr       
     189               etot(:,:,jk) =  ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk) 
     190            END DO 
     191         ENDIF 
     192         ! 
     193      ELSE   ! no diurnal cycle 
     194         ! 
     195         ! 
     196         ! SW over the ice free zone of the grid cell. This assumes that 
     197         ! SW is zero below sea ice which is a very crude assumption that is  
     198         ! not fully correct with LIM3 and SI3 but no information is  
     199         ! currently available to do a better job. SHould be improved in the  
     200         ! (near) future. 
     201         zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
     202         ! 
     203         CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100  )  
     204         ! 
     205 
     206         ! Used PAR is computed for each phytoplankton species 
     207         ! Due to their size, they have different light absorption characteristics 
    104208         DO jk = 1, nksr       
    105             etot_ndcy(:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk) 
    106             enano    (:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk) 
    107             ediat    (:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk) 
     209            etot (:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk)    ! Total PAR 
     210            enano(:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk)  ! Nanophytoplankton 
     211            ediat(:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk)  ! Diatoms 
    108212         END DO 
    109213         IF( ln_p5z ) THEN 
    110214            DO jk = 1, nksr       
    111               epico  (:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk) 
     215              epico(:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk)  ! Picophytoplankton (PISCES-QUOTA) 
    112216            END DO 
    113217         ENDIF 
    114          ! 
    115          zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
    116          ! 
    117          CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3 )  
    118          ! 
    119          DO jk = 1, nksr       
    120             etot(:,:,jk) =  ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk) 
    121          END DO 
    122          ! 
    123       ELSE 
    124          ! 
    125          zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
    126          ! 
    127          CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100  )  
    128          ! 
    129          DO jk = 1, nksr       
    130             etot (:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk) 
    131             enano(:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk) 
    132             ediat(:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk) 
    133          END DO 
    134          IF( ln_p5z ) THEN 
    135             DO jk = 1, nksr       
    136               epico(:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk) 
    137             END DO 
    138          ENDIF 
    139218         etot_ndcy(:,:,:) =  etot(:,:,:)  
    140219      ENDIF 
    141220 
    142221 
     222      ! Biophysical feedback part (computation of vertical penetration of SW) 
    143223      IF( ln_qsr_bio ) THEN                    !* heat flux accros w-level (used in the dynamics) 
    144224         !                                     !  ------------------------ 
     
    151231         !                                     !  ------------------------ 
    152232      ENDIF 
    153       !                                        !* Euphotic depth and level 
    154       neln   (:,:) = 1                            !  ------------------------ 
     233       
     234      ! Euphotic depth and level 
     235      ! Two definitions of the euphotic zone are used here.  
     236      ! (1) The classical definition based on the relative threshold value 
     237      ! (2) An alternative definition based on a absolute threshold value. 
     238      ! ------------------------------------------------------------------- 
     239      neln(:,:) = 1 
    155240      heup   (:,:) = gdepw(:,:,2,Kmm) 
    156241      heup_01(:,:) = gdepw(:,:,2,Kmm) 
     
    162247           heup(ji,jj) = gdepw(ji,jj,jk+1,Kmm)     ! Euphotic layer depth 
    163248        ENDIF 
    164         IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >= 0.50 )  THEN 
     249        IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >= 0.10 )  THEN 
    165250           heup_01(ji,jj) = gdepw(ji,jj,jk+1,Kmm)  ! Euphotic layer depth (light level definition) 
    166251        ENDIF 
    167252      END_3D 
    168253      ! 
     254      ! The euphotic depth can not exceed 300 meters. 
    169255      heup   (:,:) = MIN( 300., heup   (:,:) ) 
    170256      heup_01(:,:) = MIN( 300., heup_01(:,:) ) 
    171       !                                        !* mean light over the mixed layer 
    172       zdepmoy(:,:)   = 0.e0                    !  ------------------------------- 
     257       
     258      ! Mean PAR over the mixed layer 
     259      ! ----------------------------- 
     260      zdepmoy(:,:)   = 0.e0              
    173261      zetmp1 (:,:)   = 0.e0 
    174262      zetmp2 (:,:)   = 0.e0 
     
    176264      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr) 
    177265         IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN 
    178             zetmp1 (ji,jj) = zetmp1 (ji,jj) + etot     (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! remineralisation 
    179             zetmp2 (ji,jj) = zetmp2 (ji,jj) + etot_ndcy(ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! production 
     266            zetmp1 (ji,jj) = zetmp1 (ji,jj) + etot     (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Actual PAR for remineralisation 
     267            zetmp2 (ji,jj) = zetmp2 (ji,jj) + etot_ndcy(ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Par averaged over 24h for production 
    180268            zdepmoy(ji,jj) = zdepmoy(ji,jj) +                       e3t(ji,jj,jk,Kmm) 
    181269         ENDIF 
     
    192280         ENDIF 
    193281      END_3D 
    194       ! 
     282 
     283      ! Computation of the mean usable light for the different phytoplankton 
     284      ! groups based on their absorption characteristics. 
    195285      zdepmoy(:,:)   = 0.e0 
    196286      zetmp3 (:,:)   = 0.e0 
     
    199289      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr) 
    200290         IF( gdepw(ji,jj,jk+1,Kmm) <= MIN(hmld(ji,jj), heup_01(ji,jj)) ) THEN 
    201             zetmp3 (ji,jj) = zetmp3 (ji,jj) + enano    (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! production 
    202             zetmp4 (ji,jj) = zetmp4 (ji,jj) + ediat    (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! production 
     291            zetmp3 (ji,jj) = zetmp3 (ji,jj) + enano    (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Nanophytoplankton 
     292            zetmp4 (ji,jj) = zetmp4 (ji,jj) + ediat    (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Diatoms 
    203293            zdepmoy(ji,jj) = zdepmoy(ji,jj) +                       e3t(ji,jj,jk,Kmm) 
    204294         ENDIF 
     
    216306      ! 
    217307      IF( ln_p5z ) THEN 
     308         ! Picophytoplankton when using PISCES-QUOTA 
    218309         ALLOCATE( zetmp5(jpi,jpj) )  ;   zetmp5 (:,:) = 0.e0 
    219310         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr) 
    220311            IF( gdepw(ji,jj,jk+1,Kmm) <= MIN(hmld(ji,jj), heup_01(ji,jj)) ) THEN 
    221                zetmp5(ji,jj)  = zetmp5 (ji,jj) + epico(ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! production 
     312               zetmp5(ji,jj)  = zetmp5 (ji,jj) + epico(ji,jj,jk) * e3t(ji,jj,jk,Kmm) 
    222313            ENDIF 
    223314         END_3D 
     
    281372         pe3(:,:,1) = zqsr(:,:) 
    282373         ! 
    283          DO jk = 2, nksr + 1 
    284             DO jj = 1, jpj 
    285                DO ji = 1, jpi 
    286                   pe0(ji,jj,jk) = pe0(ji,jj,jk-1) * EXP( -e3t(ji,jj,jk-1,Kmm) * xsi0r ) 
    287                   pe1(ji,jj,jk) = pe1(ji,jj,jk-1) * EXP( -ekb  (ji,jj,jk-1 )        ) 
    288                   pe2(ji,jj,jk) = pe2(ji,jj,jk-1) * EXP( -ekg  (ji,jj,jk-1 )        ) 
    289                   pe3(ji,jj,jk) = pe3(ji,jj,jk-1) * EXP( -ekr  (ji,jj,jk-1 )        ) 
    290                END DO 
    291               ! 
    292             END DO 
    293             ! 
    294          END DO 
     374         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, nksr + 1) 
     375            pe0(ji,jj,jk) = pe0(ji,jj,jk-1) * EXP( -e3t(ji,jj,jk-1,Kmm) * xsi0r ) 
     376            pe1(ji,jj,jk) = pe1(ji,jj,jk-1) * EXP( -ekb  (ji,jj,jk-1 )        ) 
     377            pe2(ji,jj,jk) = pe2(ji,jj,jk-1) * EXP( -ekg  (ji,jj,jk-1 )        ) 
     378            pe3(ji,jj,jk) = pe3(ji,jj,jk-1) * EXP( -ekr  (ji,jj,jk-1 )        ) 
     379        END_3D 
    295380        ! 
    296381      ELSE   ! T- level 
     
    358443      TYPE(FLD_N) ::   sn_par                ! informations about the fields to be read 
    359444      ! 
    360       NAMELIST/nampisopt/cn_dir, sn_par, ln_varpar, parlux 
     445      NAMELIST/nampisopt/cn_dir, sn_par, ln_varpar, parlux, ln_p4z_dcyc 
    361446      !!---------------------------------------------------------------------- 
    362447      IF(lwp) THEN 
     
    373458      IF(lwp) THEN 
    374459         WRITE(numout,*) '   Namelist : nampisopt ' 
    375          WRITE(numout,*) '      PAR as a variable fraction of SW     ln_varpar      = ', ln_varpar 
    376          WRITE(numout,*) '      Default value for the PAR fraction   parlux         = ', parlux 
     460         WRITE(numout,*) '      PAR as a variable fraction of SW       ln_varpar      = ', ln_varpar 
     461         WRITE(numout,*) '      Default value for the PAR fraction     parlux         = ', parlux 
     462         WRITE(numout,*) '      Activate the diurnal cycle in PISCES   ln_p4z_dcyc    = ', ln_p4z_dcyc 
    377463      ENDIF 
    378464      ! 
    379465      xparsw = parlux / 3.0 
    380466      xsi0r  = 1.e0 / rn_si0 
     467 
     468      ! Warning : activate the diurnal cycle with no diurnal cycle in the forcing fields makes no sense 
     469      ! That does not produce a bug because the model does not use the flag but a warning is necessary 
     470      ! ---------------------------------------------------------------------------------------------- 
     471      IF ( ln_p4z_dcyc .AND. l_trcdm2dc ) THEN 
     472         IF (lwp) WRITE(numout,*) 'No diurnal cycle in the PAR forcing field ' 
     473         IF (lwp) WRITE(numout,*) 'Activating the diurnal cycle in PISCES has no effect' 
     474      ENDIF 
    381475      ! 
    382476      ! Variable PAR at the surface of the ocean 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zpoc.F90

    r15090 r15459  
    33   !!                         ***  MODULE p4zpoc  *** 
    44   !! TOP :   PISCES Compute remineralization of organic particles 
     5   !!         Same module for both PISCES and PISCES-QUOTA 
    56   !!========================================================================= 
    67   !! History :   1.0  !  2004     (O. Aumont) Original code 
     
    89   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Quota model for iron 
    910   !!             3.6  !  2016-03  (O. Aumont) Quota model and diverse 
     11   !!             4.0  !  2018     (O. Aumont) Variable lability parameterization 
    1012   !!---------------------------------------------------------------------- 
    1113   !!   p4z_poc       :  Compute remineralization/dissolution of organic compounds 
    1214   !!   p4z_poc_init  :  Initialisation of parameters for remineralisation 
     15   !!   alngam and gamain : computation of the incomplete gamma function 
    1316   !!---------------------------------------------------------------------- 
    1417   USE oce_trc         !  shared variables between ocean and passive tracers 
     
    2225 
    2326   PUBLIC   p4z_poc         ! called in p4zbio.F90 
    24    PUBLIC   p4z_poc_init    ! called in trcsms_pisces.F90 
    25    PUBLIC   alngam          ! 
     27   PUBLIC   p4z_poc_init    ! called in trcini_pisces.F90 
     28   PUBLIC   alngam          !  
    2629   PUBLIC   gamain          ! 
    2730 
     
    3336   REAL(wp), PUBLIC ::   rshape     !: shape factor of the gamma distribution 
    3437 
    35    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)       ::   alphan, reminp   !: 
    36    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   alphap           !: 
     38   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)       ::   alphan, reminp   !: variable lability of POC and initial distribution 
     39   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   alphap           !: lability distribution of small particles 
    3740 
    3841 
     
    5255      !! 
    5356      !! ** Purpose :   Compute remineralization of organic particles 
     57      !!                A reactivity-continuum parameterization is chosen 
     58      !!                to describe the lability of the organic particles 
     59      !!                As a consequence, the remineralisation rates of the  
     60      !!                the different pools change with time as a function of  
     61      !!                the lability distribution 
    5462      !! 
    55       !! ** Method  : - ??? 
     63      !! ** Method  : - Computation of the remineralisation rates is performed 
     64      !!                according to reactivity continuum formalism described 
     65      !!                in Aumont et al. (2017).  
    5666      !!--------------------------------------------------------------------- 
    5767      INTEGER, INTENT(in) ::   kt, knt         ! ocean time step and ??? 
     
    8393      solgoc = 0.04/ 2.56 * 1./ ( 1.-50**(-0.04) ) 
    8494 
    85       ! Initialisation of temprary arrys 
     95      ! Initialisation of temporary arrays 
    8696      IF( ln_p4z ) THEN 
    8797         zremipoc(:,:,:) = xremip 
     
    96106      zfolimi (:,:,:) = 0. 
    97107 
     108      ! Initialisation of the lability distributions that are set to  
     109      ! the distribution of newly produced organic particles 
    98110      DO jn = 1, jcpoc 
    99111        alphag(:,:,:,jn) = alphan(jn) 
     
    101113      END DO 
    102114 
    103      ! ----------------------------------------------------------------------- 
    104115     ! Lability parameterization. This is the big particles part (GOC) 
    105      ! This lability parameterization can be activated only with the standard 
    106      ! particle scheme. Does not work with Kriest parameterization. 
     116     ! This lability parameterization is always active. However, if only one 
     117     ! lability class is specified in the namelist, this is equivalent to  
     118     ! a standard parameterisation with a constant lability 
    107119     ! ----------------------------------------------------------------------- 
    108120     ztremint(:,:,:) = zremigoc(:,:,:) 
     
    192204 
    193205      IF( ln_p4z ) THEN 
     206         ! The standard PISCES part 
    194207         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    195             ! POC disaggregation by turbulence and bacterial activity.  
    196             ! -------------------------------------------------------- 
     208            ! POC degradation by bacterial activity. It is a function  
     209            ! of the mean lability and of temperature. This also includes 
     210            ! shrinking of particles due to the bacterial activity 
     211            ! ----------------------------------------------------------- 
    197212            zremig = zremigoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk) 
    198213            zorem2  = zremig * tr(ji,jj,jk,jpgoc,Kbb) 
     
    202217            zofer3 = zremig * solgoc * tr(ji,jj,jk,jpbfe,Kbb) 
    203218 
    204             ! ------------------------------------- 
     219            ! update of the TRA arrays 
    205220            tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zorem3(ji,jj,jk) 
    206221            tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zorem2 - zorem3(ji,jj,jk) 
     
    213228      ELSE 
    214229         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    215              ! POC disaggregation by turbulence and bacterial activity.  
     230            ! POC degradation by bacterial activity. It is a function  
     231            ! of the mean lability and of temperature. This also includes 
     232            ! shrinking of particles due to the bacterial activity 
    216233            ! -------------------------------------------------------- 
    217234            zremig = zremigoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk) 
     
    223240            zofer2 = xremipn / xremipc * zremig * tr(ji,jj,jk,jpbfe,Kbb) 
    224241 
    225             ! ------------------------------------- 
     242            ! update of the TRA arrays 
    226243            tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zorem3(ji,jj,jk) 
    227244            tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + solgoc * zopon2  
     
    246263     ENDIF 
    247264 
    248      ! ------------------------------------------------------------------ 
    249265     ! Lability parameterization for the small OM particles. This param  
    250266     ! is based on the same theoretical background as the big particles. 
    251267     ! However, because of its low sinking speed, lability is not supposed 
    252268     ! to be equal to its initial value (the value of the freshly produced 
    253      ! organic matter). It is however uniform in the mixed layer. 
    254      ! ------------------------------------------------------------------- 
    255      ! 
     269     ! organic matter) in the MLD. It is however uniform in the mixed layer. 
     270     ! --------------------------------------------------------------------- 
    256271     totprod (:,:) = 0. 
    257272     totthick(:,:) = 0. 
    258273     totcons (:,:) = 0. 
     274 
    259275     ! intregrated production and consumption of POC in the mixed layer 
    260276     ! ---------------------------------------------------------------- 
    261      !  
    262277     DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    263278        zdep = hmld(ji,jj) 
     
    272287 
    273288     ! Computation of the lability spectrum in the mixed layer. In the mixed  
    274      ! layer, this spectrum is supposed to be uniform. 
     289     ! layer, this spectrum is supposed to be uniform as a result of intense 
     290     ! mixing. 
    275291     ! --------------------------------------------------------------------- 
    276292     ztremint(:,:,:) = zremipoc(:,:,:) 
     
    302318     ENDIF 
    303319 
    304      ! ----------------------------------------------------------------------- 
    305320     ! The lability parameterization is used here. The code is here  
    306321     ! almost identical to what is done for big particles. The only difference 
     
    309324     ! should be determined before. 
    310325     ! ----------------------------------------------------------------------- 
    311      ! 
    312326     DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1) 
    313327        IF (tmask(ji,jj,jk) == 1.) THEN 
     
    386400         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    387401            IF (tmask(ji,jj,jk) == 1.) THEN 
    388               ! POC disaggregation by turbulence and bacterial activity.  
     402              ! POC disaggregation by turbulence and bacterial activity.It is a function 
     403              ! of the mean lability and of temperature   
    389404              ! -------------------------------------------------------- 
    390405              zremip          = zremipoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk) 
    391406              zorem           = zremip * tr(ji,jj,jk,jppoc,Kbb) 
    392407              zofer           = zremip * tr(ji,jj,jk,jpsfe,Kbb) 
    393  
     408               
     409              ! Update of the TRA arrays 
    394410              tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zorem 
    395411              orem(ji,jj,jk)      = orem(ji,jj,jk) + zorem 
     
    402418     ELSE 
    403419       DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    404           ! POC disaggregation by turbulence and bacterial activity.  
    405           ! -------------------------------------------------------- 
     420          ! POC disaggregation by turbulence and bacterial activity.It is a function 
     421          ! of the mean lability and of temperature   
     422          !-------------------------------------------------------- 
    406423          zremip = zremipoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk) 
    407424          zopoc  = zremip * tr(ji,jj,jk,jppoc,Kbb) 
     
    410427          zopop  = xremipp / xremipc * zremip * tr(ji,jj,jk,jppop,Kbb) 
    411428          zofer  = xremipn / xremipc * zremip * tr(ji,jj,jk,jpsfe,Kbb) 
    412  
     429               
     430          ! Update of the TRA arrays 
    413431          tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zopoc 
    414432          tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zopon 
     
    426444        IF( knt == nrdttrc ) THEN 
    427445          zrfact2 = 1.e3 * rfact2r 
    428           CALL iom_put( "REMINP" , zremipoc(:,:,:) * tmask(:,:,:) )  ! Remineralisation rate 
    429           CALL iom_put( "REMING" , zremigoc(:,:,:) * tmask(:,:,:) )  ! Remineralisation rate 
    430           CALL iom_put( "REMINF" , zfolimi(:,:,:)  * tmask(:,:,:)  * 1.e+9 * zrfact2 )  ! Remineralisation rate 
     446          CALL iom_put( "REMINP" , zremipoc(:,:,:) * tmask(:,:,:) )  ! Remineralisation rate of small particles 
     447          CALL iom_put( "REMING" , zremigoc(:,:,:) * tmask(:,:,:) )  ! Remineralisation rate of large particles 
     448          CALL iom_put( "REMINF" , zfolimi(:,:,:)  * tmask(:,:,:)  * 1.e+9 * zrfact2 )  ! Remineralisation of biogenic particulate iron 
    431449        ENDIF 
    432450     ENDIF 
     
    493511      ALLOCATE( alphan(jcpoc) , reminp(jcpoc) , alphap(jpi,jpj,jpk,jcpoc) ) 
    494512      ! 
    495       IF (jcpoc > 1) THEN 
     513      IF (jcpoc > 1) THEN  ! Case when more than one lability class is used 
    496514         ! 
    497515         remindelta = LOG(4. * 1000. ) / REAL(jcpoc-1, wp) 
     
    517535         reminp(jcpoc) = reminp(jcpoc) * xremip / alphan(jcpoc) 
    518536 
    519       ELSE 
     537      ELSE  ! Only one lability class is used 
    520538         alphan(jcpoc) = 1. 
    521539         reminp(jcpoc) = xremip 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zprod.F90

    r15090 r15459  
    22   !!====================================================================== 
    33   !!                         ***  MODULE p4zprod  *** 
    4    !! TOP :  Growth Rate of the two phytoplanktons groups  
     4   !! TOP :  Growth Rate of the two phytoplankton groups of PISCES  
    55   !!====================================================================== 
    66   !! History :   1.0  !  2004     (O. Aumont) Original code 
     
    2424   PUBLIC   p4z_prod         ! called in p4zbio.F90 
    2525   PUBLIC   p4z_prod_init    ! called in trcsms_pisces.F90 
    26    PUBLIC   p4z_prod_alloc 
    27  
    28    REAL(wp), PUBLIC ::   pislopen     !: 
    29    REAL(wp), PUBLIC ::   pisloped     !: 
    30    REAL(wp), PUBLIC ::   xadap        !: 
    31    REAL(wp), PUBLIC ::   excretn      !: 
    32    REAL(wp), PUBLIC ::   excretd      !: 
    33    REAL(wp), PUBLIC ::   bresp        !: 
    34    REAL(wp), PUBLIC ::   chlcnm       !: 
    35    REAL(wp), PUBLIC ::   chlcdm       !: 
    36    REAL(wp), PUBLIC ::   chlcmin      !: 
    37    REAL(wp), PUBLIC ::   fecnm        !: 
    38    REAL(wp), PUBLIC ::   fecdm        !: 
    39    REAL(wp), PUBLIC ::   grosip       !: 
     26   PUBLIC   p4z_prod_alloc   ! called in trcini_pisces.F90 
     27 
     28   REAL(wp), PUBLIC ::   pislopen     !:  P-I slope of nanophytoplankton 
     29   REAL(wp), PUBLIC ::   pisloped     !:  P-I slope of diatoms 
     30   REAL(wp), PUBLIC ::   xadap        !:  Adaptation factor to low light  
     31   REAL(wp), PUBLIC ::   excretn      !:  Excretion ratio of nanophyto 
     32   REAL(wp), PUBLIC ::   excretd      !:  Excretion ratio of diatoms 
     33   REAL(wp), PUBLIC ::   bresp        !:  Basal respiration rate 
     34   REAL(wp), PUBLIC ::   chlcnm       !:  Maximum Chl/C ratio of nano 
     35   REAL(wp), PUBLIC ::   chlcdm       !:  Maximum Chl/C ratio of diatoms 
     36   REAL(wp), PUBLIC ::   chlcmin      !:  Minimum Chl/C ratio of phytoplankton 
     37   REAL(wp), PUBLIC ::   fecnm        !:  Maximum Fe/C ratio of nano 
     38   REAL(wp), PUBLIC ::   fecdm        !:  Maximum Fe/C ratio of diatoms 
     39   REAL(wp), PUBLIC ::   grosip       !:  Mean Si/C ratio of diatoms 
    4040 
    4141   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   quotan   !: proxy of N quota in Nanophyto 
    42    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   quotad   !: proxy of N quota in diatomee 
     42   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   quotad   !: proxy of N quota in diatoms 
    4343    
    4444   REAL(wp) ::   r1_rday    ! 1 / rday 
     
    6060      !!                     ***  ROUTINE p4z_prod  *** 
    6161      !! 
    62       !! ** Purpose :   Compute the phytoplankton production depending on 
    63       !!              light, temperature and nutrient availability 
    64       !! 
    65       !! ** Method  : - ??? 
     62      !! ** Purpose :   Computes phytoplankton production depending on 
     63      !!                light, temperature and nutrient availability 
     64      !!                Computes also the uptake of Iron and Si as well  
     65      !!                as the chlorophyll content of the cells 
     66      !!                PISCES relies on a mixed Monod-Quota formalism  
    6667      !!--------------------------------------------------------------------- 
    6768      INTEGER, INTENT(in) ::   kt, knt   ! 
     
    7071      INTEGER  ::   ji, jj, jk 
    7172      REAL(wp) ::   zsilfac, znanotot, zdiattot, zconctemp, zconctemp2 
    72       REAL(wp) ::   zratio, zmax, zsilim, ztn, zadap, zlim, zsilfac2, zsiborn 
    73       REAL(wp) ::   zprod, zproreg, zproreg2, zprochln, zprochld 
    74       REAL(wp) ::   zmaxday, zdocprod, zpislopen, zpisloped 
    75       REAL(wp) ::   zmxltst, zmxlday 
    76       REAL(wp) ::   zrum, zcodel, zargu, zval, zfeup, chlcnm_n, chlcdm_n 
    77       REAL(wp) ::   zfact 
     73      REAL(wp) ::   zratio, zmax, zsilim, ztn, zadap, zlim, zsiborn 
     74      REAL(wp) ::   zpptot, zpnewtot, zpregtot, zprochln, zprochld 
     75      REAL(wp) ::   zproddoc, zprodsil, zprodfer, zprodlig 
     76      REAL(wp) ::   zpislopen, zpisloped, zfact 
     77      REAL(wp) ::   zratiosi, zmaxsi, zlimfac, zsizetmp, zfecnm, zfecdm 
     78      REAL(wp) ::   zprod, zval 
    7879      CHARACTER (len=25) :: charout 
    79       REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zw2d 
    80       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d 
    81       REAL(wp), DIMENSION(jpi,jpj    ) :: zstrn, zmixnano, zmixdiat 
    8280      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprmaxn,zprmaxd 
    8381      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpislopeadn, zpislopeadd, zysopt   
    84       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprdia, zprbio, zprdch, zprnch    
     82      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprdia, zprbio, zprchld, zprchln    
    8583      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprorcan, zprorcad, zprofed, zprofen 
    8684      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpronewn, zpronewd 
    8785      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxl_fac, zmxl_chl 
    88       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpligprod1, zpligprod2 
     86      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zpligprod 
    8987      !!--------------------------------------------------------------------- 
    9088      ! 
     
    9391      !  Allocate temporary workspace 
    9492      ! 
    95       zprorcan  (:,:,:) = 0._wp ; zprorcad  (:,:,:) = 0._wp ; zprofed (:,:,:) = 0._wp 
    96       zprofen   (:,:,:) = 0._wp ; zysopt    (:,:,:) = 0._wp 
    97       zpronewn  (:,:,:) = 0._wp ; zpronewd  (:,:,:) = 0._wp ; zprdia  (:,:,:) = 0._wp 
    98       zprbio    (:,:,:) = 0._wp ; zprdch    (:,:,:) = 0._wp ; zprnch  (:,:,:) = 0._wp  
    99       zmxl_fac  (:,:,:) = 0._wp ; zmxl_chl  (:,:,:) = 0._wp  
    100       zpligprod1(:,:,:) = 0._wp ; zpligprod2(:,:,:) = 0._wp  
    101  
    102       ! Computation of the optimal production 
    103       zprmaxn(:,:,:) = 0.8_wp * r1_rday * tgfunc(:,:,:) 
     93      zprorcan(:,:,:) = 0._wp ; zprorcad(:,:,:) = 0._wp ; zprofed(:,:,:) = 0._wp 
     94      zprofen (:,:,:) = 0._wp ; zysopt  (:,:,:) = 0._wp 
     95      zpronewn(:,:,:) = 0._wp ; zpronewd(:,:,:) = 0._wp ; zprdia(:,:,:) = 0._wp 
     96      zprbio  (:,:,:) = 0._wp ; zprchld (:,:,:) = 0._wp ; zprchln(:,:,:) = 0._wp  
     97      zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp  
     98 
     99      ! Computation of the maximimum production. Based on a Q10 description 
     100      ! of the thermal dependency 
     101      ! Parameters are taken from Bissinger et al. (2008) 
     102      zprmaxn(:,:,:) = 0.65_wp * r1_rday * tgfunc(:,:,:) 
    104103      zprmaxd(:,:,:) = zprmaxn(:,:,:) 
    105104 
    106       ! compute the day length depending on latitude and the day 
    107       zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp ) 
    108       zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  ) 
    109  
    110       ! day length in hours 
    111       zstrn(:,:) = 0. 
    112       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    113          zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad ) 
    114          zargu = MAX( -1., MIN(  1., zargu ) ) 
    115          zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. ) 
    116       END_2D 
    117  
    118       ! Impact of the day duration and light intermittency on phytoplankton growth 
    119       DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    120          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    121             zval = MAX( 1., zstrn(ji,jj) ) 
    122             IF( gdept(ji,jj,jk,Kmm) <= hmld(ji,jj) ) THEN 
    123                zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) 
     105      ! Intermittency is supposed to have a similar effect on production as  
     106      ! day length (Shatwell et al., 2012). The correcting factor is zmxl_fac.  
     107      ! zmxl_chl is the fractional day length and is used to compute the mean 
     108      ! PAR during daytime. The effect of mixing is computed using the  
     109      ! absolute light level definition of the euphotic zone 
     110      ! -------------------------------------------------------------------------  
     111      IF ( ln_p4z_dcyc ) THEN    ! Diurnal cycle in PISCES 
     112 
     113         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     114            IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     115               IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN 
     116                  zval = MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) 
     117               ENDIF 
     118               zmxl_chl(ji,jj,jk) = zval / 24. 
     119               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval ) 
    124120            ENDIF 
    125             zmxl_chl(ji,jj,jk) = zval / 24. 
    126             zmxl_fac(ji,jj,jk) = 1.5 * zval / ( 12. + zval ) 
    127          ENDIF 
    128       END_3D 
     121         END_3D 
     122  
     123      ELSE ! No diurnal cycle in PISCES 
     124         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     125            IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     126               zval = MAX( 1., strn(ji,jj) ) 
     127               IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN 
     128                  zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) 
     129               ENDIF 
     130               zmxl_chl(ji,jj,jk) = zval / 24. 
     131               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval ) 
     132            ENDIF 
     133         END_3D 
     134 
     135      ENDIF 
    129136 
    130137      zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:) 
    131138      zprdia(:,:,:) = zprmaxd(:,:,:) * zmxl_fac(:,:,:) 
    132139 
    133       ! Maximum light intensity 
    134       WHERE( zstrn(:,:) < 1.e0 ) zstrn(:,:) = 24. 
    135  
    136       ! Computation of the P-I slope for nanos and diatoms 
     140      ! The formulation proposed by Geider et al. (1997) has been modified  
     141      ! to exclude the effect of nutrient limitation and temperature in the PI 
     142      ! curve following Vichi et al. (2007) 
     143      ! ----------------------------------------------------------------------- 
    137144      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    138145         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     
    142149            zconctemp2  = tr(ji,jj,jk,jpdia,Kbb) - zconctemp 
    143150            ! 
     151            ! The initial slope of the PI curve can be increased for nano 
     152            ! to account for photadaptation, for instance in the DCM 
     153            ! This parameterization is adhoc and should be either  
     154            ! improved or removed in future versions of the model 
     155 
     156            ! Nanophytoplankton 
    144157            zpislopeadn(ji,jj,jk) = pislopen * ( 1.+ zadap  * EXP( -0.25 * enano(ji,jj,jk) ) )  & 
    145158            &                   * tr(ji,jj,jk,jpnch,Kbb) /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn) 
    146             ! 
     159 
     160            ! Diatoms 
    147161            zpislopeadd(ji,jj,jk) = (pislopen * zconctemp2 + pisloped * zconctemp) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn )   & 
    148162            &                   * tr(ji,jj,jk,jpdch,Kbb) /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn) 
     
    153167         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    154168             ! Computation of production function for Carbon 
    155              !  --------------------------------------------- 
     169             ! Actual light levels are used here  
     170             ! ---------------------------------------------- 
    156171             zpislopen = zpislopeadn(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) & 
    157172             &            * zmxl_fac(ji,jj,jk) * rday + rtrn) 
     
    160175             zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) )  ) 
    161176             zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) )  ) 
     177 
    162178             !  Computation of production function for Chlorophyll 
    163              !-------------------------------------------------- 
     179             !  Mean light level in the mixed layer (when appropriate) 
     180             !  is used here (acclimation is in general slower than  
     181             !  the characteristic time scales of vertical mixing) 
     182             !  ------------------------------------------------------ 
    164183             zpislopen = zpislopeadn(ji,jj,jk) / ( zprmaxn(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn ) 
    165184             zpisloped = zpislopeadd(ji,jj,jk) / ( zprmaxd(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn ) 
    166              zprnch(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) ) 
    167              zprdch(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) ) 
     185             zprchln(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) ) 
     186             zprchld(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) ) 
    168187         ENDIF 
    169188      END_3D 
    170189 
    171       !  Computation of a proxy of the N/C ratio 
    172       !  --------------------------------------- 
     190      !  Computation of a proxy of the N/C quota from nutrient limitation  
     191      !  and light limitation. Steady state is assumed to allow the computation 
     192      !  ---------------------------------------------------------------------- 
    173193      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    174194          zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) )   & 
    175195          &      * zprmaxn(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn ) 
    176           quotan(ji,jj,jk) = MIN( 1., 0.2 + 0.8 * zval ) 
     196          quotan(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval ) 
    177197          zval = MIN( xdiatpo4(ji,jj,jk), ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) )   & 
    178198          &      * zprmaxd(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn ) 
    179           quotad(ji,jj,jk) = MIN( 1., 0.2 + 0.8 * zval ) 
     199          quotad(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval ) 
    180200      END_3D 
    181201 
     
    184204 
    185205          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    186              !    Si/C of diatoms 
    187              !    ------------------------ 
    188              !    Si/C increases with iron stress and silicate availability 
    189              !    Si/C is arbitrariliy increased for very high Si concentrations 
    190              !    to mimic the very high ratios observed in the Southern Ocean (silpot2) 
     206             ! Si/C of diatoms 
     207             ! ------------------------ 
     208             ! Si/C increases with iron stress and silicate availability 
     209             ! Si/C is arbitrariliy increased for very high Si concentrations 
     210             ! to mimic the very high ratios observed in the Southern Ocean (zsilfac) 
     211             ! A parameterization derived from Flynn (2003) is used for the control 
     212             ! when Si is not limiting which is similar to the parameterisation 
     213             ! proposed by Gurney and Davidson (1999). 
     214             ! ----------------------------------------------------------------------- 
    191215            zlim  = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi1 ) 
    192             zsilim = MIN( zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ), xlimsi(ji,jj,jk) ) 
    193             zsilfac = 4.4 * EXP( -4.23 * zsilim ) * MAX( 0.e0, MIN( 1., 2.2 * ( zlim - 0.5 ) )  ) + 1.e0 
     216            zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) 
    194217            zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) 
    195218            IF (gphit(ji,jj) < -30 ) THEN 
    196               zsilfac2 = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 ) 
     219              zsilfac = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 ) 
    197220            ELSE 
    198               zsilfac2 = 1. +      zsiborn / ( zsiborn + xksi2**3 ) 
     221              zsilfac = 1. +      zsiborn / ( zsiborn + xksi2**3 ) 
    199222            ENDIF 
    200             zysopt(ji,jj,jk) = grosip * zlim * zsilfac * zsilfac2 
     223            zratiosi = 1.0 - tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) / ( zsilfac * grosip * 3.0 + rtrn ) 
     224            zratiosi = MAX(0., MIN(1.0, zratiosi) ) 
     225            zmaxsi  = (1.0 + 0.1**4) * zratiosi**4 / ( zratiosi**4 + 0.1**4 ) 
     226            IF( xlimsi(ji,jj,jk) /= xlimdia(ji,jj,jk) ) THEN 
     227               zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zmaxsi 
     228            ELSE 
     229               zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zsilim**0.7 * zmaxsi 
     230            ENDIF 
    201231        ENDIF 
    202232      END_3D 
    203233 
    204       !  Mixed-layer effect on production  
    205       !  Sea-ice effect on production 
    206  
     234      ! Sea-ice effect on production 
     235      ! No production is assumed below sea ice 
     236      ! --------------------------------------  
    207237      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    208238         zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) 
     
    210240      END_3D 
    211241 
    212       ! Computation of the various production terms  
     242      ! Computation of the various production  and nutrient uptake terms 
     243      ! --------------------------------------------------------------- 
    213244      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    214245         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    215246            !  production terms for nanophyto. (C) 
    216247            zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2 
     248 
     249            !  New production (uptake of NO3) 
    217250            zpronewn(ji,jj,jk)  = zprorcan(ji,jj,jk)* xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn ) 
    218251            ! 
    219             zratio = tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * fecnm + rtrn ) 
    220             zmax   = MAX( 0., ( 1. - zratio ) / ABS( 1.05 - zratio ) )  
    221             zprofen(ji,jj,jk) = fecnm * zprmaxn(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  & 
    222             &             * ( 4. - 4.5 * xlimnfe(ji,jj,jk) / ( xlimnfe(ji,jj,jk) + 0.5 ) )    & 
    223             &             * biron(ji,jj,jk) / ( biron(ji,jj,jk) + concnfe(ji,jj,jk) )  & 
    224             &             * zmax * tr(ji,jj,jk,jpphy,Kbb) * rfact2 
    225             !  production terms for diatoms (C) 
     252            ! Size computation 
     253            ! Size is made a function of the limitation of of phytoplankton growth 
     254            ! Strongly limited cells are supposed to be smaller. sizena is the  
     255            ! size at time step t+1 and is thus updated at the end of the  
     256            ! current time step 
     257            ! -------------------------------------------------------------------- 
     258            zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn ) 
     259            zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     260            sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) ) 
     261 
     262            ! Iron uptake rates of nanophytoplankton. Upregulation is   
     263            ! not parameterized at low iron concentrations as observations 
     264            ! do not suggest it for accimated cells. Uptake is 
     265            ! downregulated when the quota is close to the maximum quota 
     266            zfecnm = xqfuncfecn(ji,jj,jk) + ( fecnm - xqfuncfecn(ji,jj,jk) ) * ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) ) 
     267            zratio = 1.0 - MIN(1.0,tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * zfecnm + rtrn ) ) 
     268            zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) )  
     269            zprofen(ji,jj,jk) = zfecnm * zprmaxn(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  & 
     270            &          * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn + xnanono3(ji,jj,jk)  & 
     271            &          + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) )   & 
     272            &          * xnanofer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpphy,Kbb) * rfact2 
     273            ! production terms of diatoms (C) 
    226274            zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * tr(ji,jj,jk,jpdia,Kbb) * rfact2 
     275 
     276            ! New production (uptake of NO3) 
    227277            zpronewd(ji,jj,jk) = zprorcad(ji,jj,jk) * xdiatno3(ji,jj,jk) / ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) + rtrn ) 
    228             ! 
    229             zratio = tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) * fecdm + rtrn ) 
    230             zmax   = MAX( 0., ( 1. - zratio ) / ABS( 1.05 - zratio ) )  
    231             zprofed(ji,jj,jk) = fecdm * zprmaxd(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  & 
    232             &             * ( 4. - 4.5 * xlimdfe(ji,jj,jk) / ( xlimdfe(ji,jj,jk) + 0.5 ) )    & 
    233             &             * biron(ji,jj,jk) / ( biron(ji,jj,jk) + concdfe(ji,jj,jk) )  & 
    234             &             * zmax * tr(ji,jj,jk,jpdia,Kbb) * rfact2 
     278 
     279            ! Size computation 
     280            ! Size is made a function of the limitation of of phytoplankton growth 
     281            ! Strongly limited cells are supposed to be smaller. sizeda is 
     282            ! size at time step t+1 and is thus updated at the end of the  
     283            ! current time step.  
     284            ! -------------------------------------------------------------------- 
     285            zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) 
     286            zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     287            sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) ) 
     288 
     289            ! Iron uptake rates of diatoms. Upregulation is   
     290            ! not parameterized at low iron concentrations as observations 
     291            ! do not suggest it for accimated cells. Uptake is 
     292            ! downregulated when the quota is close to the maximum quota 
     293            zfecdm = xqfuncfecd(ji,jj,jk) + ( fecdm - xqfuncfecd(ji,jj,jk) ) * ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) ) 
     294            zratio = 1.0 - MIN(1.0, tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) * zfecdm + rtrn ) ) 
     295            zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) )  
     296            zprofed(ji,jj,jk) = zfecdm * zprmaxd(ji,jj,jk) * (1.0 - fr_i(ji,jj) )  & 
     297            &          * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn + xdiatno3(ji,jj,jk)  & 
     298            &          + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) )   & 
     299            &          * xdiatfer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpdia,Kbb) * rfact2 
    235300         ENDIF 
    236301      END_3D 
    237302 
    238303      ! Computation of the chlorophyll production terms 
     304      ! The parameterization is taken from Geider et al. (1997) 
     305      ! ------------------------------------------------------- 
    239306      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    240307         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    241308            !  production terms for nanophyto. ( chlorophyll ) 
    242309            znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    243             zprod    = rday * zprorcan(ji,jj,jk) * zprnch(ji,jj,jk) * xlimphy(ji,jj,jk) 
     310            zprod    = rday * zprorcan(ji,jj,jk) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk) 
    244311            zprochln = chlcmin * 12. * zprorcan (ji,jj,jk) 
    245             chlcnm_n   = MIN ( chlcnm, ( chlcnm / (1. - 1.14 / 43.4 *ts(ji,jj,jk,jp_tem,Kmm))) * (1. - 1.14 / 43.4 * 20.)) 
    246             zprochln = zprochln + (chlcnm_n-chlcmin) * 12. * zprod / & 
     312            zprochln = zprochln + (chlcnm - chlcmin) * 12. * zprod / & 
    247313                                  & (  zpislopeadn(ji,jj,jk) * znanotot +rtrn) 
     314 
    248315            !  production terms for diatoms ( chlorophyll ) 
    249316            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    250             zprod    = rday * zprorcad(ji,jj,jk) * zprdch(ji,jj,jk) * xlimdia(ji,jj,jk) 
     317            zprod    = rday * zprorcad(ji,jj,jk) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) 
    251318            zprochld = chlcmin * 12. * zprorcad(ji,jj,jk) 
    252             chlcdm_n   = MIN ( chlcdm, ( chlcdm / (1. - 1.14 / 43.4 * ts(ji,jj,jk,jp_tem,Kmm))) * (1. - 1.14 / 43.4 * 20.)) 
    253             zprochld = zprochld + (chlcdm_n-chlcmin) * 12. * zprod / & 
     319            zprochld = zprochld + (chlcdm - chlcmin) * 12. * zprod / & 
    254320                                  & ( zpislopeadd(ji,jj,jk) * zdiattot +rtrn ) 
     321 
    255322            !   Update the arrays TRA which contain the Chla sources and sinks 
    256323            tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln * texcretn 
     
    262329      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    263330        IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    264            zproreg  = zprorcan(ji,jj,jk) - zpronewn(ji,jj,jk) 
    265            zproreg2 = zprorcad(ji,jj,jk) - zpronewd(ji,jj,jk) 
    266            zdocprod = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) 
    267            tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zprorcan(ji,jj,jk) - zprorcad(ji,jj,jk) 
    268            tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpronewn(ji,jj,jk) - zpronewd(ji,jj,jk) 
    269            tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zproreg - zproreg2 
     331           zpptot   = zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk) 
     332           zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) 
     333           zpregtot = zpptot - zpnewtot 
     334           zprodsil  = zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb) 
     335           zproddoc  = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) 
     336           zprodfer  = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) 
     337           ! 
     338           tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpptot 
     339           tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot 
     340           tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot 
    270341           tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) + zprorcan(ji,jj,jk) * texcretn 
    271            tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk) * texcretn 
     342           tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk)  * texcretn 
    272343           tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) + zprorcad(ji,jj,jk) * texcretd 
    273            tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk) * texcretd 
    274            tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprorcad(ji,jj,jk) * zysopt(ji,jj,jk) * texcretd 
    275            tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zdocprod 
    276            tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + o2ut * ( zproreg + zproreg2) & 
    277            &                   + ( o2ut + o2nit ) * ( zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) ) 
     344           tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk)  * texcretd 
     345           tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprodsil 
     346           tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - zprodsil 
     347           tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc 
     348           tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + o2ut * zpregtot + ( o2ut + o2nit ) * zpnewtot 
    278349           ! 
    279            zfeup = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) 
    280            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zfeup 
    281            tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - texcretd * zprorcad(ji,jj,jk) * zysopt(ji,jj,jk) 
    282            tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zprorcan(ji,jj,jk) - zprorcad(ji,jj,jk) 
    283            tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) ) & 
    284            &                                         - rno3 * ( zproreg + zproreg2 ) 
     350           tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer 
     351           consfe3(ji,jj,jk)   = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) )   & 
     352           &                   * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2 
     353           ! 
     354           tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot 
     355           tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot ) 
    285356        ENDIF 
    286357      END_3D 
    287      ! 
     358 
     359     ! Production and uptake of ligands by phytoplankton. This part is activated  
     360     ! when ln_ligand is set to .true. in the namelist. Ligand uptake is small  
     361     ! and based on the FeL model by Morel et al. (2008) and on the study of 
     362     ! Shaked et al. (2020) 
     363     ! ------------------------------------------------------------------------- 
    288364     IF( ln_ligand ) THEN 
    289          zpligprod1(:,:,:) = 0._wp    ;    zpligprod2(:,:,:) = 0._wp 
    290365         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    291366           IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    292               zdocprod = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) 
    293               zfeup    = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) 
    294               tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zdocprod * ldocp - zfeup * plig(ji,jj,jk) * lthet 
    295               zpligprod1(ji,jj,jk) = zdocprod * ldocp 
    296               zpligprod2(ji,jj,jk) = zfeup * plig(ji,jj,jk) * lthet 
     367              zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) 
     368              zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) 
     369              zprodlig = plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet 
     370              ! 
     371              tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zproddoc * ldocp - zprodfer * zprodlig 
    297372           ENDIF 
    298373         END_3D 
     
    300375 
    301376 
     377    ! Output of the diagnostics 
    302378    ! Total primary production per year 
    303379    IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  & 
     
    312388       CALL iom_put( "PPNEWD"  , zpronewd(:,:,:) * zfact * tmask(:,:,:)   ) ! new primary production by diatomes 
    313389       CALL iom_put( "PBSi"    , zprorcad(:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:)  ) ! biogenic silica production 
    314        CALL iom_put( "PFeN"    , zprofen(:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by nanophyto 
    315        CALL iom_put( "PFeD"    , zprofed(:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by  diatomes 
    316        IF( ln_ligand ) THEN 
    317          CALL iom_put( "LPRODP"  , zpligprod1(:,:,:) * 1e9 * zfact * tmask(:,:,:) ) 
    318          CALL iom_put( "LDETP"   , zpligprod2(:,:,:) * 1e9 * zfact * tmask(:,:,:) ) 
     390       CALL iom_put( "PFeN"    , zprofen(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by nanophyto 
     391       CALL iom_put( "PFeD"    , zprofed(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by  diatomes 
     392       IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN 
     393           ALLOCATE(  zpligprod(jpi,jpj,jpk) ) 
     394           zpligprod(:,:,:) = excretd * zprorcad(:,:,:) + excretn * zprorcan(:,:,:) 
     395           CALL iom_put( "LPRODP"  , zpligprod(:,:,:) * ldocp * 1e9 * zfact * tmask(:,:,:) ) 
     396           ! 
     397           zpligprod(:,:,:) = ( texcretn * zprofen(:,:,:) + texcretd * zprofed(:,:,:) ) &  
     398             &                  * plig(:,:,:) / ( rtrn + plig(:,:,:) + 75.0 * (1.0 - plig(:,:,:) ) ) 
     399           CALL iom_put( "LDETP"   , zpligprod(:,:,:)  * lthet * 1e9 * zfact * tmask(:,:,:) ) 
     400           DEALLOCATE(  zpligprod ) 
    319401       ENDIF 
    320402       CALL iom_put( "Mumax"   , zprmaxn(:,:,:) * tmask(:,:,:)  ) ! Maximum growth rate 
     
    346428      !! ** Purpose :   Initialization of phytoplankton production parameters 
    347429      !! 
    348       !! ** Method  :   Read the nampisprod namelist and check the parameters 
     430      !! ** Method  :   Read the namp4zprod namelist and check the parameters 
    349431      !!      called at the first timestep (nittrc000) 
    350432      !! 
    351       !! ** input   :   Namelist nampisprod 
     433      !! ** input   :   Namelist namp4zprod 
    352434      !!---------------------------------------------------------------------- 
    353435      INTEGER ::   ios   ! Local integer 
    354436      ! 
     437      ! Namelist block 
    355438      NAMELIST/namp4zprod/ pislopen, pisloped, xadap, bresp, excretn, excretd,  & 
    356439         &                 chlcnm, chlcdm, chlcmin, fecnm, fecdm, grosip 
     
    365448      READ  ( numnatp_ref, namp4zprod, IOSTAT = ios, ERR = 901) 
    366449901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zprod in reference namelist' ) 
     450 
    367451      READ  ( numnatp_cfg, namp4zprod, IOSTAT = ios, ERR = 902 ) 
    368452902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zprod in configuration namelist' ) 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zrem.F90

    r15090 r15459  
    33   !!                         ***  MODULE p4zrem  *** 
    44   !! TOP :   PISCES Compute remineralization/dissolution of organic compounds 
     5   !!         except for POC which is treated in p4zpoc.F90 
     6   !!         This module is common to both PISCES and PISCES-QUOTA 
    57   !!========================================================================= 
    68   !! History :   1.0  !  2004     (O. Aumont) Original code 
     
    1719   USE p4zche          !  chemical model 
    1820   USE p4zprod         !  Growth rate of the 2 phyto groups 
    19    USE p4zlim 
     21   USE p4zlim          !  Nutrient limitation terms 
    2022   USE prtctl          !  print control for debugging 
    2123   USE iom             !  I/O manager 
     
    2628 
    2729   PUBLIC   p4z_rem         ! called in p4zbio.F90 
    28    PUBLIC   p4z_rem_init    ! called in trcsms_pisces.F90 
    29    PUBLIC   p4z_rem_alloc 
    30  
    31    REAL(wp), PUBLIC ::   xremikc    !: remineralisation rate of DOC  
    32    REAL(wp), PUBLIC ::   xremikn    !: remineralisation rate of DON  
    33    REAL(wp), PUBLIC ::   xremikp    !: remineralisation rate of DOP  
    34    REAL(wp), PUBLIC ::   xremik     !: remineralisation rate of POC  
     30   PUBLIC   p4z_rem_init    ! called in trcini_pisces.F90 
     31   PUBLIC   p4z_rem_alloc   ! called in trcini_pisces.F90 
     32 
     33   !! * Shared module variables 
     34   REAL(wp), PUBLIC ::   xremikc    !: remineralisation rate of DOC (p5z)  
     35   REAL(wp), PUBLIC ::   xremikn    !: remineralisation rate of DON (p5z)  
     36   REAL(wp), PUBLIC ::   xremikp    !: remineralisation rate of DOP (p5z)  
    3537   REAL(wp), PUBLIC ::   nitrif     !: NH4 nitrification rate  
    36    REAL(wp), PUBLIC ::   xsirem     !: remineralisation rate of POC  
    37    REAL(wp), PUBLIC ::   xsiremlab  !: fast remineralisation rate of POC  
     38   REAL(wp), PUBLIC ::   xsirem     !: remineralisation rate of biogenic silica 
     39   REAL(wp), PUBLIC ::   xsiremlab  !: fast remineralisation rate of BSi 
    3840   REAL(wp), PUBLIC ::   xsilab     !: fraction of labile biogenic silica  
    3941   REAL(wp), PUBLIC ::   feratb     !: Fe/C quota in bacteria 
    40    REAL(wp), PUBLIC ::   xkferb     !: Half-saturation constant for bacteria Fe/C 
     42   REAL(wp), PUBLIC ::   xkferb     !: Half-saturation constant for bacterial Fe/C 
    4143 
    4244   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   denitr   !: denitrification array 
     
    5658      !!                     ***  ROUTINE p4z_rem  *** 
    5759      !! 
    58       !! ** Purpose :   Compute remineralization/scavenging of organic compounds 
    59       !! 
    60       !! ** Method  : - ??? 
     60      !! ** Purpose :   Compute remineralization/dissolution of organic compounds 
     61      !!                Computes also nitrification of ammonium  
     62      !!                The solubilization/remineralization of POC is treated  
     63      !!                in p4zpoc.F90. The dissolution of calcite is processed 
     64      !!                in p4zlys.F90.  
     65      !! 
     66      !! ** Method  : - Bacterial biomass is computed implicitely based on a  
     67      !!                parameterization developed from an explicit modeling 
     68      !!                of PISCES in an alternative version  
    6169      !!--------------------------------------------------------------------- 
    6270      INTEGER, INTENT(in) ::   kt, knt         ! ocean time step 
     
    6674      REAL(wp) ::   zremik, zremikc, zremikn, zremikp, zsiremin, zfact  
    6775      REAL(wp) ::   zsatur, zsatur2, znusil, znusil2, zdep, zdepmin, zfactdep 
    68       REAL(wp) ::   zbactfer, zolimit, zonitr, zrfact2 
    69       REAL(wp) ::   zammonic, zoxyremc, zoxyremn, zoxyremp 
    70       REAL(wp) ::   zosil, ztem, zdenitnh4, zolimic, zolimin, zolimip, zdenitrn, zdenitrp 
     76      REAL(wp) ::   zbactfer, zonitr, zrfact2 
     77      REAL(wp) ::   zammonic, zoxyremc, zosil, ztem, zdenitnh4, zolimic 
    7178      CHARACTER (len=25) :: charout 
     79      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdepbac, zolimi, zfacsi, zfacsib, zdepeff, zfebact 
    7280      REAL(wp), DIMENSION(jpi,jpj    ) :: ztempbac 
    73       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdepbac, zolimi, zdepprod, zfacsi, zfacsib, zdepeff, zfebact 
    7481      !!--------------------------------------------------------------------- 
    7582      ! 
    7683      IF( ln_timing )   CALL timing_start('p4z_rem') 
    7784      ! 
    78       ! Initialisation of arrys 
    79       zdepprod(:,:,:) = 1._wp 
     85      ! Initialisation of arrays 
    8086      zdepeff (:,:,:) = 0.3_wp 
    81       ztempbac(:,:)   = 0._wp 
    8287      zfacsib(:,:,:)  = xsilab / ( 1.0 - xsilab ) 
    8388      zfebact(:,:,:)  = 0._wp 
    8489      zfacsi(:,:,:)   = xsilab 
    8590 
    86       ! Computation of the mean phytoplankton concentration as 
    87       ! a crude estimate of the bacterial biomass 
     91      ! Computation of the mean bacterial concentration 
    8892      ! this parameterization has been deduced from a model version 
    89       ! that was modeling explicitely bacteria 
    90       ! ------------------------------------------------------- 
    91       DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    92          zdep = MAX( hmld(ji,jj), heup(ji,jj) ) 
    93          IF( gdept(ji,jj,jk,Kmm) < zdep ) THEN 
    94             zdepbac(ji,jj,jk) = MIN( 0.7 * ( tr(ji,jj,jk,jpzoo,Kbb) + 2.* tr(ji,jj,jk,jpmes,Kbb) ), 4.e-6 ) 
     93      ! that was modeling explicitely bacteria. This is a very old param  
     94      ! that will be very soon updated based on results from a much more 
     95      ! recent version of PISCES with bacteria. 
     96      ! ---------------------------------------------------------------- 
     97      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     98         zdep = MAX( hmld(ji,jj), heup_01(ji,jj) ) 
     99         IF ( gdept(ji,jj,jk,Kmm) < zdep ) THEN 
     100            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 
    95101            ztempbac(ji,jj)   = zdepbac(ji,jj,jk) 
     102!         IF( gdept(ji,jj,jk,Kmm) >= zdep ) THEN 
    96103         ELSE 
    97104            zdepmin = MIN( 1., zdep / gdept(ji,jj,jk,Kmm) ) 
    98105            zdepbac (ji,jj,jk) = zdepmin**0.683 * ztempbac(ji,jj) 
    99             zdepprod(ji,jj,jk) = zdepmin**0.273 
    100             zdepeff (ji,jj,jk) = zdepeff(ji,jj,jk) * zdepmin**0.3 
     106!            zdepeff(ji,jj,jk) = zdepeff(ji,jj,jk) * zdepmin**0.3 
     107            zdepeff(ji,jj,jk) = zdepeff(ji,jj,jk) * zdepmin**0.6 
    101108         ENDIF 
    102109      END_3D 
    103110 
    104       IF( ln_p4z ) THEN 
    105          DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    106             ! DOC ammonification. Depends on depth, phytoplankton biomass 
    107             ! and a limitation term which is supposed to be a parameterization of the bacterial activity.  
    108             zremik = xremik * xstep / 1.e-6 * xlimbac(ji,jj,jk) * zdepbac(ji,jj,jk)  
    109             zremik = MAX( zremik, 2.74e-4 * xstep ) 
    110             ! Ammonification in oxic waters with oxygen consumption 
    111             ! ----------------------------------------------------- 
    112             zolimit = zremik * ( 1.- nitrfac(ji,jj,jk) ) * tr(ji,jj,jk,jpdoc,Kbb)  
    113             zolimi(ji,jj,jk) = MIN( ( tr(ji,jj,jk,jpoxy,Kbb) - rtrn ) / o2ut, zolimit )  
    114             ! Ammonification in suboxic waters with denitrification 
    115             ! ------------------------------------------------------- 
    116             zammonic = zremik * nitrfac(ji,jj,jk) * tr(ji,jj,jk,jpdoc,Kbb) 
    117             denitr(ji,jj,jk)  = zammonic * ( 1. - nitrfac2(ji,jj,jk) ) 
    118             denitr(ji,jj,jk)  = MIN( ( tr(ji,jj,jk,jpno3,Kbb) - rtrn ) / rdenit, denitr(ji,jj,jk) ) 
    119             zoxyremc          = zammonic - denitr(ji,jj,jk) 
    120             ! 
    121             zolimi (ji,jj,jk) = MAX( 0.e0, zolimi (ji,jj,jk) ) 
    122             denitr (ji,jj,jk) = MAX( 0.e0, denitr (ji,jj,jk) ) 
    123             zoxyremc          = MAX( 0.e0, zoxyremc ) 
    124  
    125             ! 
    126             tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zolimi (ji,jj,jk) + denitr(ji,jj,jk) + zoxyremc 
    127             tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zolimi (ji,jj,jk) + denitr(ji,jj,jk) + zoxyremc 
    128             tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - denitr (ji,jj,jk) * rdenit 
    129             tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) - zolimi (ji,jj,jk) - denitr(ji,jj,jk) - zoxyremc 
    130             tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - zolimi (ji,jj,jk) * o2ut 
    131             tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zolimi (ji,jj,jk) + denitr(ji,jj,jk) + zoxyremc 
    132             tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zolimi(ji,jj,jk) + zoxyremc    & 
    133             &                     + ( rdenit + 1.) * denitr(ji,jj,jk) ) 
    134          END_3D 
    135       ELSE 
    136          DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    137             ! DOC ammonification. Depends on depth, phytoplankton biomass 
    138             ! and a limitation term which is supposed to be a parameterization of the bacterial activity.  
    139             ! ----------------------------------------------------------------- 
    140             zremik = xstep / 1.e-6 * MAX(0.01, xlimbac(ji,jj,jk)) * zdepbac(ji,jj,jk)  
    141             zremik = MAX( zremik, 2.74e-4 * xstep / xremikc ) 
    142  
    143             zremikc = xremikc * zremik 
    144             zremikn = xremikn / xremikc 
    145             zremikp = xremikp / xremikc 
    146  
    147             ! Ammonification in oxic waters with oxygen consumption 
    148             ! ----------------------------------------------------- 
    149             zolimit = zremikc * ( 1.- nitrfac(ji,jj,jk) ) * tr(ji,jj,jk,jpdoc,Kbb)  
    150             zolimic = MAX( 0.e0, MIN( ( tr(ji,jj,jk,jpoxy,Kbb) - rtrn ) / o2ut, zolimit ) )  
    151             zolimi(ji,jj,jk) = zolimic 
    152             zolimin = zremikn * zolimic * tr(ji,jj,jk,jpdon,Kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn ) 
    153             zolimip = zremikp * zolimic * tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn )  
    154  
    155             ! Ammonification in suboxic waters with denitrification 
    156             ! ------------------------------------------------------- 
    157             zammonic = zremikc * nitrfac(ji,jj,jk) * tr(ji,jj,jk,jpdoc,Kbb) 
    158             denitr(ji,jj,jk)  = zammonic * ( 1. - nitrfac2(ji,jj,jk) ) 
    159             denitr(ji,jj,jk)  = MAX(0., MIN(  ( tr(ji,jj,jk,jpno3,Kbb) - rtrn ) / rdenit, denitr(ji,jj,jk) ) ) 
    160             zoxyremc          = MAX(0., zammonic - denitr(ji,jj,jk)) 
    161             zdenitrn  = zremikn * denitr(ji,jj,jk) * tr(ji,jj,jk,jpdon,Kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn ) 
    162             zdenitrp  = zremikp * denitr(ji,jj,jk) * tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn ) 
    163             zoxyremn  = zremikn * zoxyremc * tr(ji,jj,jk,jpdon,Kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn ) 
    164             zoxyremp  = zremikp * zoxyremc * tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn ) 
    165  
    166             tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zolimip + zdenitrp + zoxyremp 
    167             tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zolimin + zdenitrn + zoxyremn 
    168             tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - denitr(ji,jj,jk) * rdenit 
    169             tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) - zolimic - denitr(ji,jj,jk) - zoxyremc 
    170             tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) - zolimin - zdenitrn - zoxyremn 
    171             tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) - zolimip - zdenitrp - zoxyremp 
    172             tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - zolimic * o2ut 
    173             tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zolimic + denitr(ji,jj,jk) + zoxyremc 
    174             tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zolimin + zoxyremn + ( rdenit + 1.) * zdenitrn ) 
    175          END_3D 
    176          ! 
    177       ENDIF 
    178  
     111      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     112         ! DOC ammonification. Depends on depth, phytoplankton biomass 
     113         ! and a limitation term which is supposed to be a parameterization of the bacterial activity.  
     114         ! -------------------------------------------------------------------------- 
     115         zremik = xstep / 1.e-6 * xlimbac(ji,jj,jk) * zdepbac(ji,jj,jk)  
     116         zremik = MAX( zremik, 2.74e-4 * xstep / xremikc ) 
     117         zremikc = xremikc * zremik 
     118         ! Ammonification in oxic waters with oxygen consumption 
     119         ! ----------------------------------------------------- 
     120         zolimic = zremikc * ( 1.- nitrfac(ji,jj,jk) ) * tr(ji,jj,jk,jpdoc,Kbb)  
     121         zolimic = MAX(0., MIN( ( tr(ji,jj,jk,jpoxy,Kbb) - rtrn ) / o2ut, zolimic ) )  
     122         zolimi(ji,jj,jk) = zolimic 
     123 
     124         ! Ammonification in suboxic waters with denitrification 
     125         ! ----------------------------------------------------- 
     126         zammonic = zremikc * nitrfac(ji,jj,jk) * tr(ji,jj,jk,jpdoc,Kbb) 
     127         denitr(ji,jj,jk)  = zammonic * ( 1. - nitrfac2(ji,jj,jk) ) 
     128         denitr(ji,jj,jk)  = MAX(0., MIN(  ( tr(ji,jj,jk,jpno3,Kbb) - rtrn ) / rdenit, denitr(ji,jj,jk) ) ) 
     129 
     130         ! Ammonification in waters depleted in O2 and NO3 based on  
     131         ! other redox processes 
     132         ! -------------------------------------------------------- 
     133         zoxyremc          = MAX(0., zammonic - denitr(ji,jj,jk) ) 
     134 
     135         ! Update of the the trends arrays 
     136         tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - denitr (ji,jj,jk) * rdenit 
     137         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) - ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     138         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - zolimic * o2ut 
     139         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zolimic + denitr(ji,jj,jk) + zoxyremc 
     140         IF( ln_p4z ) THEN ! PISCES-std 
     141            tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zolimic + denitr(ji,jj,jk) + zoxyremc 
     142            tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zolimic + denitr(ji,jj,jk) + zoxyremc 
     143            tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zolimic + zoxyremc + ( rdenit + 1.) * denitr(ji,jj,jk) ) 
     144         ELSE  ! PISCES-QUOTA (p5z) 
     145            zremikn = xremikn / xremikc * tr(ji,jj,jk,jpdon,kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn ) 
     146            zremikp = xremikp / xremikc * tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn ) 
     147            tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zremikp * ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     148            tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zremikn * ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     149            tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) - zremikn * ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     150            tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) - zremikp * ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     151            tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zremikn * ( zolimic + zoxyremc + ( rdenit + 1.) * denitr(ji,jj,jk) ) 
     152         ENDIF 
     153      END_3D 
    179154 
    180155      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     
    185160         &         / ( 1.+ emoy(ji,jj,jk) ) * ( 1. + fr_i(ji,jj) * emoy(ji,jj,jk) )  
    186161         zdenitnh4 = nitrif * xstep * tr(ji,jj,jk,jpnh4,Kbb) * nitrfac(ji,jj,jk) 
    187          zdenitnh4 = MIN(  ( tr(ji,jj,jk,jpno3,Kbb) - rtrn ) / rdenita, zdenitnh4 )  
     162         zdenitnh4 = MAX(0., MIN(  ( tr(ji,jj,jk,jpno3,Kbb) - rtrn ) / rdenita, zdenitnh4 ) ) 
    188163         ! Update of the tracers trends 
    189164         ! ---------------------------- 
     
    194169      END_3D 
    195170 
    196        IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging) 
     171      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging) 
    197172         WRITE(charout, FMT="('rem1')") 
    198173         CALL prt_ctl_info( charout, cdcomp = 'top' ) 
    199174         CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) 
    200        ENDIF 
     175      ENDIF 
    201176 
    202177      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     
    206181         ! studies (especially at Papa) have shown this uptake to be significant 
    207182         ! ---------------------------------------------------------- 
    208          zbactfer = feratb *  rfact2 * 0.6_wp / rday * tgfunc(ji,jj,jk) * xlimbacl(ji,jj,jk)     & 
    209             &              * tr(ji,jj,jk,jpfer,Kbb) / ( xkferb + tr(ji,jj,jk,jpfer,Kbb) )    & 
    210             &              * zdepprod(ji,jj,jk) * zdepeff(ji,jj,jk) * zdepbac(ji,jj,jk) 
    211          tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zbactfer*0.33 
    212          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zbactfer*0.25 
    213          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zbactfer*0.08 
    214          zfebact(ji,jj,jk)   = zbactfer * 0.33 
    215          blim(ji,jj,jk)      = xlimbacl(ji,jj,jk)  * zdepbac(ji,jj,jk) / 1.e-6 * zdepprod(ji,jj,jk) 
     183         zbactfer = feratb * 0.6_wp * xstep * tgfunc(ji,jj,jk) * xlimbacl(ji,jj,jk) * tr(ji,jj,jk,jpfer,Kbb)    & 
     184           &       / ( xkferb + tr(ji,jj,jk,jpfer,Kbb) ) * zdepeff(ji,jj,jk) * zdepbac(ji,jj,jk) 
     185          
     186         ! Only the transfer of iron from its dissolved form to particles 
     187         ! is treated here. The GGE of bacteria supposed to be equal to  
     188         ! 0.33. This is hard-coded.  
     189         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zbactfer*0.1 
     190         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zbactfer*0.08 
     191         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zbactfer*0.02 
     192         zfebact(ji,jj,jk)   = zbactfer * 0.1 
     193         blim(ji,jj,jk)      = xlimbacl(ji,jj,jk)  * zdepbac(ji,jj,jk) / 1.e-6 
    216194      END_3D 
    217195 
     
    225203      ! of bSi. Set to a constant in the upper ocean 
    226204      ! --------------------------------------------------------------- 
    227  
    228       DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     205      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     206         ! Remineralization rate of BSi dependent on T and saturation 
     207         ! The parameterization is taken from Ridgwell et al. (2002)  
     208         ! --------------------------------------------------------- 
    229209         zdep     = MAX( hmld(ji,jj), heup_01(ji,jj) ) 
    230210         zsatur   = MAX( rtrn, ( sio3eq(ji,jj,jk) - tr(ji,jj,jk,jpsil,Kbb) ) / ( sio3eq(ji,jj,jk) + rtrn ) ) 
    231211         zsatur2  = ( 1. + ts(ji,jj,jk,jp_tem,Kmm) / 400.)**37 
    232212         znusil   = 0.225  * ( 1. + ts(ji,jj,jk,jp_tem,Kmm) / 15.) * zsatur + 0.775 * zsatur2 * zsatur**9.25 
    233          ! Remineralization rate of BSi depedant on T and saturation 
    234          ! --------------------------------------------------------- 
     213  
     214         ! Two fractions of bSi are considered : a labile one and a more 
     215         ! refractory one based on the commonly observed two step  
     216         ! dissolution of bSi (initial rapid dissolution followed by  
     217         ! more slowly dissolution). 
     218         ! Computation of the vertical evolution of the labile fraction 
     219         ! of bSi. This is computed assuming steady state. 
     220         ! -------------------------------------------------------------- 
    235221         IF ( gdept(ji,jj,jk,Kmm) > zdep ) THEN 
    236222            zfacsib(ji,jj,jk) = zfacsib(ji,jj,jk-1) * EXP( -0.5 * ( xsiremlab - xsirem )  & 
     
    283269      !! 
    284270      !!---------------------------------------------------------------------- 
    285       NAMELIST/nampisrem/ xremik, nitrif, xsirem, xsiremlab, xsilab, feratb, xkferb, &  
     271      NAMELIST/nampisrem/ nitrif, xsirem, xsiremlab, xsilab, feratb, xkferb, &  
    286272         &                xremikc, xremikn, xremikp 
    287273      INTEGER :: ios                 ! Local integer output status for namelist read 
     
    303289         WRITE(numout,*) '   Namelist parameters for remineralization, nampisrem' 
    304290         IF( ln_p4z ) THEN 
    305             WRITE(numout,*) '      remineralization rate of DOC              xremik    =', xremik 
     291            WRITE(numout,*) '      remineralization rate of DOC              xremikc   =', xremikc 
    306292         ELSE 
    307293            WRITE(numout,*) '      remineralization rate of DOC              xremikc   =', xremikc 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zsink.F90

    r15090 r15459  
    22   !!====================================================================== 
    33   !!                         ***  MODULE p4zsink  *** 
    4    !! TOP :  PISCES  vertical flux of particulate matter due to gravitational sinking 
     4   !! TOP :  PISCES  vertical flux of particulate matter due to  
     5   !!        gravitational sinking 
     6   !!        This module is the same for both PISCES and PISCES-QUOTA 
    57   !!====================================================================== 
    68   !! History :   1.0  !  2004     (O. Aumont) Original code 
     
    810   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Change aggregation formula 
    911   !!             3.5  !  2012-07  (O. Aumont) Introduce potential time-splitting 
     12   !!             4.0  !  2019     (O. Aumont) an external subroutine is called 
     13   !!                                          to compute the impact of sinking 
    1014   !!---------------------------------------------------------------------- 
    1115   !!   p4z_sink       :  Compute vertical flux of particulate matter due to gravitational sinking 
     
    2529 
    2630   PUBLIC   p4z_sink         ! called in p4zbio.F90 
    27    PUBLIC   p4z_sink_init    ! called in trcsms_pisces.F90 
    28    PUBLIC   p4z_sink_alloc 
     31   PUBLIC   p4z_sink_init    ! called in trcini_pisces.F90 
     32   PUBLIC   p4z_sink_alloc   ! called in trcini_pisces.F90 
    2933 
    3034   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinking, sinking2  !: POC sinking fluxes  
    3135   !                                                          !  (different meanings depending on the parameterization) 
    32    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkingn, sinking2n  !: POC sinking fluxes  
    33    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkingp, sinking2p  !: POC sinking fluxes  
     36   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkingn, sinking2n  !: PON sinking fluxes  
     37   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkingp, sinking2p  !: POP sinking fluxes  
    3438   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkcal, sinksil   !: CaCO3 and BSi sinking fluxes 
    3539   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkfer            !: Small BFe sinking fluxes 
     
    4852CONTAINS 
    4953 
    50    !!---------------------------------------------------------------------- 
    51    !!   'standard sinking parameterisation'                  ??? 
    52    !!---------------------------------------------------------------------- 
    53  
    5454   SUBROUTINE p4z_sink ( kt, knt, Kbb, Kmm, Krhs ) 
    5555      !!--------------------------------------------------------------------- 
     
    5757      !! 
    5858      !! ** Purpose :   Compute vertical flux of particulate matter due to  
    59       !!                gravitational sinking 
    60       !! 
    61       !! ** Method  : - ??? 
     59      !!                gravitational sinking.  
     60      !! 
     61      !! ** Method  : - An external advection subroutine is called to compute 
     62      !!                the impact of sinking on the particles. The tracers 
     63      !!                concentrations are updated in this subroutine which 
     64      !!                is mandatory to deal with negative concentrations 
    6265      !!--------------------------------------------------------------------- 
    6366      INTEGER, INTENT(in) :: kt, knt 
     
    7780      consgoc(:,:,:) = 0. 
    7881 
    79       ! 
    80       !    Sinking speeds of detritus is increased with depth as shown 
    81       !    by data and from the coagulation theory 
    82       !    ----------------------------------------------------------- 
     82      ! Sinking speeds of big detritus is increased with depth as shown 
     83      ! by data and from the coagulation theory. This is controled by 
     84      ! wsbio2max and wsbio2scale. If wsbio2max is set to wsbio2, then 
     85      ! sinking speed is constant with depth. 
     86      ! CaCO3 and bSi are supposed to sink at the big particles speed  
     87      ! due to their high density 
     88      ! --------------------------------------------------------------- 
    8389      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    8490         zmax  = MAX( heup_01(ji,jj), hmld(ji,jj) ) 
     
    8793      END_3D 
    8894 
    89       ! limit the values of the sinking speeds to avoid numerical instabilities   
     95      ! Sinking speed of the small particles is always constant 
    9096      wsbio3(:,:,:) = wsbio 
    9197 
    92       ! 
    93       !  Initializa to zero all the sinking arrays  
    94       !   ----------------------------------------- 
     98      ! Initialize to zero all the sinking arrays  
     99      ! ----------------------------------------- 
    95100      sinking (:,:,:) = 0.e0 
    96101      sinking2(:,:,:) = 0.e0 
     
    100105      sinkfer2(:,:,:) = 0.e0 
    101106 
    102       !   Compute the sedimentation term using p4zsink2 for all the sinking particles 
    103       !   ----------------------------------------------------- 
     107      ! Compute the sedimentation term using trc_sink for all the sinking particles 
     108      ! --------------------------------------------------------------------------- 
    104109      CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinking , jppoc, rfact2 ) 
    105110      CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinkfer , jpsfe, rfact2 ) 
     
    109114      CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinkcal , jpcal, rfact2 ) 
    110115 
     116      ! PISCES-QUOTA part 
    111117      IF( ln_p5z ) THEN 
    112118         sinkingn (:,:,:) = 0.e0 
     
    115121         sinking2p(:,:,:) = 0.e0 
    116122 
    117          !   Compute the sedimentation term using p4zsink2 for all the sinking particles 
    118          !   ----------------------------------------------------- 
     123         ! Compute the sedimentation term using trc_sink for all the sinking particles 
     124         ! --------------------------------------------------------------------------- 
    119125         CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinkingn , jppon, rfact2 ) 
    120126         CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinkingp , jppop, rfact2 ) 
     
    156162      !!---------------------------------------------------------------------- 
    157163      !!                  ***  ROUTINE p4z_sink_init  *** 
     164      !! 
     165      !! ** Purpose :   Initialization of sinking parameters 
     166      !! 
     167      !! ** Method  :    
     168      !! 
     169      !! ** input   :    
    158170      !!---------------------------------------------------------------------- 
    159171      INTEGER :: jk 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p4zsms.F90

    r15182 r15459  
    3030   PRIVATE 
    3131 
    32    PUBLIC   p4z_sms_init   ! called in p4zsms.F90 
    33    PUBLIC   p4z_sms        ! called in p4zsms.F90 
     32   PUBLIC   p4z_sms_init   ! called in trcini_pisces.F90 
     33   PUBLIC   p4z_sms        ! called in trcsms_pisces.F90 
    3434 
    3535   INTEGER ::    numco2, numnut, numnit      ! logical unit for co2 budget 
    36    REAL(wp) ::   alkbudget, no3budget, silbudget, ferbudget, po4budget 
     36   REAL(wp) ::   alkbudget, no3budget, silbudget, ferbudget, po4budget ! total budget of the different conservative elements 
    3737   REAL(wp) ::   xfact, xfact1, xfact2, xfact3 
    3838 
     
    5656      !!              routines of PISCES bio-model 
    5757      !! 
    58       !! ** Method  : - at each new day ... 
    59       !!              - several calls of bio and sed ??? 
    60       !!              - ... 
     58      !! ** Method  : - calls the various SMS subroutines 
     59      !!              - calls the sediment module (if ln_sediment)   
     60      !!              - several calls of bio and sed (possible time-splitting) 
     61      !!              - handles the potential negative concentrations (xnegtr) 
    6162      !!--------------------------------------------------------------------- 
    6263      ! 
     
    9192      IF( ln_pisdmp .AND. MOD( kt - 1, nn_pisdmp ) == 0 )   CALL p4z_dmp( kt, Kbb, Kmm )      ! Relaxation of some tracers 
    9293      ! 
    93       rfact = rDt_trc 
     94      rfact = rDt_trc  ! time step of PISCES 
    9495      ! 
    9596      IF( ( ln_top_euler .AND. kt == nittrc000 )  .OR. ( .NOT.ln_top_euler .AND. kt <= nittrc000 + 1 ) ) THEN 
    96          rfactr  = 1. / rfact 
    97          rfact2  = rfact / REAL( nrdttrc, wp ) 
    98          rfact2r = 1. / rfact2 
    99          xstep = rfact2 / rday         ! Time step duration for biology 
     97         rfactr  = 1. / rfact  ! inverse of the time step 
     98         rfact2  = rfact / REAL( nrdttrc, wp )  ! time step of the biological SMS 
     99         rfact2r = 1. / rfact2  ! Inverse of the biological time step 
     100         xstep = rfact2 / rday         ! Time step duration for biology relative to a day 
    100101         xfact = 1.e+3 * rfact2r 
    101102         IF(lwp) WRITE(numout,*)  
     
    131132         CALL p4z_flx( kt, jnt, Kbb, Kmm, Krhs )   ! Compute surface fluxes 
    132133         ! 
     134         ! Handling of the negative concentrations 
     135         ! The biological SMS may generate negative concentrations 
     136         ! Trends are tested at each grid cell. If a negative concentrations  
     137         ! is created at a grid cell, all the sources and sinks at that grid  
     138         ! cell are scale to avoid that negative concentration. This approach  
     139         ! is quite simplistic but it conserves mass. 
     140         ! ------------------------------------------------------------------ 
    133141         xnegtr(:,:,:) = 1.e0 
    134142         DO jn = jp_pcs0, jp_pcs1 
     
    142150         !                                ! where at least 1 tracer concentration becomes negative 
    143151         !                                !  
     152         ! Concentrations are updated 
    144153         DO jn = jp_pcs0, jp_pcs1 
    145154           tr(:,:,:,jn,Kbb) = tr(:,:,:,jn,Kbb) + xnegtr(:,:,:) * tr(:,:,:,jn,Krhs) 
     
    194203        ENDIF 
    195204        ! 
     205        ! Trends are are reset to 0 
    196206         DO jn = jp_pcs0, jp_pcs1 
    197207            tr(:,:,:,jn,Krhs) = 0._wp 
     
    202212#endif 
    203213      ! 
     214      ! If ln_sediment is set to .true. then the sediment module is called 
    204215      IF( ln_sediment ) THEN  
    205216         ! 
     
    213224         ztrbbio(:,:,:,jn) = 0._wp 
    214225      END DO 
     226      ! 
    215227      ! 
    216228      IF( l_trdtrc ) THEN 
     
    236248      !!                     ***  p4z_sms_init  ***   
    237249      !! 
    238       !! ** Purpose :   read PISCES namelist 
    239       !! 
    240       !! ** input   :   file 'namelist.trc.s' containing the following 
    241       !!             namelist: natext, natbio, natsms 
     250      !! ** Purpose :   read the general PISCES namelist 
     251      !! 
     252      !! ** input   :   file 'namelist_pisces' containing the following 
     253      !!                namelist: nampisbio, nampisdmp, nampismass  
    242254      !!---------------------------------------------------------------------- 
    243255      INTEGER :: ios                 ! Local integer output status for namelist read 
    244256      !! 
    245       NAMELIST/nampisbio/ nrdttrc, wsbio, xkmort, ferat3, wsbio2, wsbio2max, wsbio2scale,    & 
    246          &                  ldocp, ldocz, lthet, no3rat3, po4rat3 
     257      NAMELIST/nampisbio/ nrdttrc, wsbio, xkmort, feratz, feratm, wsbio2, wsbio2max,    & 
     258         &                wsbio2scale, ldocp, ldocz, lthet, no3rat3, po4rat3 
    247259         ! 
    248260      NAMELIST/nampisdmp/ ln_pisdmp, nn_pisdmp 
     
    268280         WRITE(numout,*) '      half saturation constant for mortality    xkmort      =', xkmort  
    269281         IF( ln_p5z ) THEN 
    270             WRITE(numout,*) '      N/C in zooplankton                        no3rat3     =', no3rat3 
    271             WRITE(numout,*) '      P/C in zooplankton                        po4rat3     =', po4rat3 
    272          ENDIF 
    273          WRITE(numout,*) '      Fe/C in zooplankton                       ferat3      =', ferat3 
     282            WRITE(numout,*) '      N/C in zooplankton                     no3rat3     =', no3rat3 
     283            WRITE(numout,*) '      P/C in zooplankton                     po4rat3     =', po4rat3 
     284         ENDIF 
     285         WRITE(numout,*) '      Fe/C in microzooplankton                  feratz      =', feratz 
     286         WRITE(numout,*) '      Fe/C in microzooplankton                  feratz      =', feratm 
    274287         WRITE(numout,*) '      Big particles sinking speed               wsbio2      =', wsbio2 
    275288         WRITE(numout,*) '      Big particles maximum sinking speed       wsbio2max   =', wsbio2max 
     
    317330      !!                   ***  ROUTINE p4z_rst  *** 
    318331      !! 
    319       !!  ** Purpose : Read or write variables in restart file: 
     332      !!  ** Purpose : Read or write specific PISCES variables in restart file: 
    320333      !! 
    321334      !!  WRITE(READ) mode: 
     
    330343      IF( TRIM(cdrw) == 'READ' ) THEN 
    331344         ! 
     345         ! Read the specific variable of PISCES 
    332346         IF(lwp) WRITE(numout,*) 
    333347         IF(lwp) WRITE(numout,*) ' p4z_rst : Read specific variables from pisces model ' 
    334348         IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~~' 
    335349         !  
     350         ! Read the pH. If not in the restart file, then it is initialized from 
     351         ! the initial conditions 
    336352         IF( iom_varid( numrtr, 'PH', ldstop = .FALSE. ) > 0 ) THEN 
    337353            CALL iom_get( numrtr, jpdom_auto, 'PH' , hi(:,:,:)  ) 
     
    341357         ENDIF 
    342358         CALL iom_get( numrtr, jpdom_auto, 'Silicalim', xksi(:,:) ) 
     359 
     360         ! Read the Si half saturation constant and the maximum Silica concentration 
    343361         IF( iom_varid( numrtr, 'Silicamax', ldstop = .FALSE. ) > 0 ) THEN 
    344362            CALL iom_get( numrtr, jpdom_auto, 'Silicamax' , xksimax(:,:)  ) 
     
    346364            xksimax(:,:) = xksi(:,:) 
    347365         ENDIF 
    348          ! 
     366 
     367         ! Read the Fe3 consumption term by phytoplankton 
     368         IF( iom_varid( numrtr, 'Consfe3', ldstop = .FALSE. ) > 0 ) THEN 
     369            CALL iom_get( numrtr, jpdom_auto, 'Consfe3' , consfe3(:,:,:)  ) 
     370         ELSE 
     371            consfe3(:,:,:) = 0._wp 
     372         ENDIF 
     373 
     374 
     375         ! Read the cumulative total flux. If not in the restart file, it is set to 0           
    349376         IF( iom_varid( numrtr, 'tcflxcum', ldstop = .FALSE. ) > 0 ) THEN  ! cumulative total flux of carbon 
    350377            CALL iom_get( numrtr, 'tcflxcum' , t_oce_co2_flx_cum  ) 
     
    353380         ENDIF 
    354381         ! 
     382         ! PISCES size proxy 
     383         IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN 
     384            CALL iom_get( numrtr, jpdom_auto, 'sized' , sized(:,:,:)  ) 
     385            sized(:,:,:) = MAX( 1.0, sized(:,:,:) ) 
     386         ELSE 
     387            sized(:,:,:) = 1. 
     388         ENDIF 
     389         ! 
     390         IF( iom_varid( numrtr, 'sizen', ldstop = .FALSE. ) > 0 ) THEN 
     391            CALL iom_get( numrtr, jpdom_auto, 'sizen' , sizen(:,:,:)  ) 
     392            sizen(:,:,:) = MAX( 1.0, sizen(:,:,:) ) 
     393         ELSE 
     394            sizen(:,:,:) = 1. 
     395         ENDIF 
     396 
     397         ! PISCES-QUOTA specific part 
    355398         IF( ln_p5z ) THEN 
    356             IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN 
     399            ! Read the size of the different phytoplankton groups 
     400            ! If not in the restart file, they are set to 1 
     401            IF( iom_varid( numrtr, 'sizep', ldstop = .FALSE. ) > 0 ) THEN 
    357402               CALL iom_get( numrtr, jpdom_auto, 'sizep' , sizep(:,:,:)  ) 
    358                CALL iom_get( numrtr, jpdom_auto, 'sizen' , sizen(:,:,:)  ) 
    359                CALL iom_get( numrtr, jpdom_auto, 'sized' , sized(:,:,:)  ) 
     403               sizep(:,:,:) = MAX( 1.0, sizep(:,:,:) ) 
    360404            ELSE 
    361405               sizep(:,:,:) = 1. 
    362                sizen(:,:,:) = 1. 
    363                sized(:,:,:) = 1. 
    364406            ENDIF 
    365407        ENDIF 
    366408        ! 
    367409      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN 
     410         ! write the specific variables of PISCES 
    368411         IF( kt == nitrst ) THEN 
    369412            IF(lwp) WRITE(numout,*) 
     
    375418         CALL iom_rstput( kt, nitrst, numrtw, 'Silicamax', xksimax(:,:) ) 
    376419         CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum ) 
    377          IF( ln_p5z ) THEN 
    378             CALL iom_rstput( kt, nitrst, numrtw, 'sizep', sizep(:,:,:) ) 
    379             CALL iom_rstput( kt, nitrst, numrtw, 'sizen', sizen(:,:,:) ) 
    380             CALL iom_rstput( kt, nitrst, numrtw, 'sized', sized(:,:,:) ) 
    381          ENDIF 
     420         CALL iom_rstput( kt, nitrst, numrtw, 'Consfe3', consfe3(:,:,:) ) ! Si max concentration 
     421         CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum ) ! Cumulative CO2 flux 
     422         CALL iom_rstput( kt, nitrst, numrtw, 'sizen', sizen(:,:,:) )  ! Size of nanophytoplankton 
     423         CALL iom_rstput( kt, nitrst, numrtw, 'sized', sized(:,:,:) )  ! Size of diatoms 
     424         IF( ln_p5z ) CALL iom_rstput( kt, nitrst, numrtw, 'sizep', sizep(:,:,:) )  ! Size of picophytoplankton 
    382425      ENDIF 
    383426      ! 
     
    389432      !!                    ***  p4z_dmp  *** 
    390433      !! 
    391       !! ** purpose  : Relaxation of some tracers 
     434      !! ** purpose  : Relaxation of the total budget of some elements 
     435      !!               This routine avoids the model to drift far from the  
     436      !!               observed content in various elements 
     437      !!               Elements that may be relaxed : Alk, P, N, Si 
    392438      !!---------------------------------------------------------------------- 
    393439      ! 
     
    396442      ! 
    397443      REAL(wp) ::  alkmean = 2426.     ! mean value of alkalinity ( Glodap ; for Goyet 2391. ) 
    398       REAL(wp) ::  po4mean = 2.165     ! mean value of phosphates 
    399       REAL(wp) ::  no3mean = 30.90     ! mean value of nitrate 
    400       REAL(wp) ::  silmean = 91.51     ! mean value of silicate 
     444      REAL(wp) ::  po4mean = 2.174     ! mean value of phosphate 
     445      REAL(wp) ::  no3mean = 31.00     ! mean value of nitrate 
     446      REAL(wp) ::  silmean = 90.33     ! mean value of silicate 
    401447      ! 
    402448      REAL(wp) :: zarea, zalksumn, zpo4sumn, zno3sumn, zsilsumn 
     
    419465            zsilsumn = glob_sum( 'p4zsms', tr(:,:,:,jpsil,Kmm) * cvol(:,:,:)  ) * zarea 
    420466  
     467            ! Correct the trn mean content of alkalinity 
    421468            IF(lwp) WRITE(numout,*) '       TALKN mean : ', zalksumn 
    422469            tr(:,:,:,jptal,Kmm) = tr(:,:,:,jptal,Kmm) * alkmean / zalksumn 
    423470 
     471            ! Correct the trn mean content of PO4 
    424472            IF(lwp) WRITE(numout,*) '       PO4N  mean : ', zpo4sumn 
    425473            tr(:,:,:,jppo4,Kmm) = tr(:,:,:,jppo4,Kmm) * po4mean / zpo4sumn 
    426474 
     475            ! Correct the trn mean content of NO3 
    427476            IF(lwp) WRITE(numout,*) '       NO3N  mean : ', zno3sumn 
    428477            tr(:,:,:,jpno3,Kmm) = tr(:,:,:,jpno3,Kmm) * no3mean / zno3sumn 
    429478 
     479            ! Correct the trn mean content of SiO3 
    430480            IF(lwp) WRITE(numout,*) '       SiO3N mean : ', zsilsumn 
    431481            tr(:,:,:,jpsil,Kmm) = MIN( 400.e-6,tr(:,:,:,jpsil,Kmm) * silmean / zsilsumn ) 
     
    439489  
    440490               IF(lwp) WRITE(numout,*) ' ' 
     491               ! Correct the trb mean content of alkalinity 
    441492               IF(lwp) WRITE(numout,*) '       TALKB mean : ', zalksumb 
    442493               tr(:,:,:,jptal,Kbb) = tr(:,:,:,jptal,Kbb) * alkmean / zalksumb 
    443494 
     495               ! Correct the trb mean content of PO4 
    444496               IF(lwp) WRITE(numout,*) '       PO4B  mean : ', zpo4sumb 
    445497               tr(:,:,:,jppo4,Kbb) = tr(:,:,:,jppo4,Kbb) * po4mean / zpo4sumb 
    446498 
     499               ! Correct the trb mean content of NO3 
    447500               IF(lwp) WRITE(numout,*) '       NO3B  mean : ', zno3sumb 
    448501               tr(:,:,:,jpno3,Kbb) = tr(:,:,:,jpno3,Kbb) * no3mean / zno3sumb 
    449502 
     503               ! Correct the trb mean content of SiO3 
    450504               IF(lwp) WRITE(numout,*) '       SiO3B mean : ', zsilsumb 
    451505               tr(:,:,:,jpsil,Kbb) = MIN( 400.e-6,tr(:,:,:,jpsil,Kbb) * silmean / zsilsumb ) 
     
    487541      ENDIF 
    488542 
     543      ! Compute the budget of NO3 
    489544      IF( iom_use( "pno3tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    490          !   Compute the budget of NO3, ALK, Si, Fer 
    491545         IF( ln_p4z ) THEN 
    492546            zwork(:,:,:) =    tr(:,:,:,jpno3,Kmm) + tr(:,:,:,jpnh4,Kmm)                      & 
     
    506560      ENDIF 
    507561      ! 
     562      ! Compute the budget of PO4 
    508563      IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    509564         IF( ln_p4z ) THEN 
     
    524579      ENDIF 
    525580      ! 
     581      ! Compute the budget of SiO3 
    526582      IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    527583         zwork(:,:,:) =  tr(:,:,:,jpsil,Kmm) + tr(:,:,:,jpgsi,Kmm) + tr(:,:,:,jpdsi,Kmm)  
     
    540596      ENDIF 
    541597      ! 
     598      ! Compute the budget of Iron 
    542599      IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    543600         zwork(:,:,:) =   tr(:,:,:,jpfer,Kmm) + tr(:,:,:,jpnfe,Kmm) + tr(:,:,:,jpdfe,Kmm)   & 
    544601            &         +   tr(:,:,:,jpbfe,Kmm) + tr(:,:,:,jpsfe,Kmm)                      & 
    545             &         + ( tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm) )  * ferat3     
     602            &         + ( tr(:,:,:,jpzoo,Kmm) * feratz + tr(:,:,:,jpmes,Kmm) ) * feratm    
    546603         ! 
    547604         ferbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )   
  • NEMO/trunk/src/TOP/PISCES/P4Z/p5zlim.F90

    r15090 r15459  
    22   !!====================================================================== 
    33   !!                         ***  MODULE p5zlim  *** 
    4    !! TOP :   PISCES with variable stoichiometry  
     4   !! TOP :   PISCES-QUOTA : Computes the various nutrient limitation terms 
     5   !!                        of phytoplankton 
    56   !!====================================================================== 
    67   !! History :   1.0  !  2004     (O. Aumont) Original code 
     
    1415   USE oce_trc         ! Shared ocean-passive tracers variables 
    1516   USE trc             ! Tracers defined 
    16    USE p4zlim 
     17   USE p4zlim          ! Nutrient limitation  
    1718   USE sms_pisces      ! PISCES variables 
    1819   USE iom             !  I/O manager 
     
    2122   PRIVATE 
    2223 
    23    PUBLIC p5z_lim     
    24    PUBLIC p5z_lim_init     
    25    PUBLIC p5z_lim_alloc 
     24   PUBLIC p5z_lim           ! called in p4zbio.F90   
     25   PUBLIC p5z_lim_init      ! called in trcsms_pisces.F90  
     26   PUBLIC p5z_lim_alloc     ! called in trcini_pisces.F90 
    2627 
    2728   !! * Shared module variables 
    28    REAL(wp), PUBLIC ::  concpno3    !:  NO3, PO4 half saturation    
    29    REAL(wp), PUBLIC ::  concpnh4    !:  NH4 half saturation for phyto   
    30    REAL(wp), PUBLIC ::  concnpo4    !:  NH4 half saturation for diatoms 
    31    REAL(wp), PUBLIC ::  concppo4    !:  NH4 half saturation for diatoms 
    32    REAL(wp), PUBLIC ::  concdpo4    !:  NH4 half saturation for diatoms 
    33    REAL(wp), PUBLIC ::  concpfer    !:  Iron half saturation for nanophyto  
     29   REAL(wp), PUBLIC ::  concpno3    !:  NO3 half saturation for picophyto   
     30   REAL(wp), PUBLIC ::  concpnh4    !:  NH4 half saturation for picophyto 
     31   REAL(wp), PUBLIC ::  concnpo4    !:  PO4 half saturation for nanophyto 
     32   REAL(wp), PUBLIC ::  concppo4    !:  PO4 half saturation for picophyto 
     33   REAL(wp), PUBLIC ::  concdpo4    !:  PO4 half saturation for diatoms 
     34   REAL(wp), PUBLIC ::  concpfer    !:  Iron half saturation for picophyto 
    3435   REAL(wp), PUBLIC ::  concbpo4    !:  PO4 half saturation for bacteria 
    35    REAL(wp), PUBLIC ::  xsizepic    !:  Minimum size criteria for diatoms 
    36    REAL(wp), PUBLIC ::  xsizerp     !:  Size ratio for nanophytoplankton 
     36   REAL(wp), PUBLIC ::  xsizepic    !:  Minimum size criteria for picophyto 
     37   REAL(wp), PUBLIC ::  xsizerp     !:  Size ratio for picophytoplankton 
    3738   REAL(wp), PUBLIC ::  qfnopt      !:  optimal Fe quota for nanophyto 
    38    REAL(wp), PUBLIC ::  qfpopt      !:  optimal Fe quota for nanophyto 
     39   REAL(wp), PUBLIC ::  qfpopt      !:  optimal Fe quota for picophyto 
    3940   REAL(wp), PUBLIC ::  qfdopt      !:  optimal Fe quota for diatoms 
    40    REAL(wp), PUBLIC ::  qnnmin      !:  optimal Fe quota for diatoms 
    41    REAL(wp), PUBLIC ::  qnnmax      !:  optimal Fe quota for diatoms 
    42    REAL(wp), PUBLIC ::  qpnmin      !:  optimal Fe quota for diatoms 
    43    REAL(wp), PUBLIC ::  qpnmax      !:  optimal Fe quota for diatoms 
    44    REAL(wp), PUBLIC ::  qnpmin      !:  optimal Fe quota for diatoms 
    45    REAL(wp), PUBLIC ::  qnpmax      !:  optimal Fe quota for diatoms 
    46    REAL(wp), PUBLIC ::  qppmin      !:  optimal Fe quota for diatoms 
    47    REAL(wp), PUBLIC ::  qppmax      !:  optimal Fe quota for diatoms 
    48    REAL(wp), PUBLIC ::  qndmin      !:  optimal Fe quota for diatoms 
    49    REAL(wp), PUBLIC ::  qndmax      !:  optimal Fe quota for diatoms 
    50    REAL(wp), PUBLIC ::  qpdmin      !:  optimal Fe quota for diatoms 
    51    REAL(wp), PUBLIC ::  qpdmax      !:  optimal Fe quota for diatoms 
    52    REAL(wp), PUBLIC ::  qfnmax      !:  optimal Fe quota for diatoms 
    53    REAL(wp), PUBLIC ::  qfpmax      !:  optimal Fe quota for diatoms 
    54    REAL(wp), PUBLIC ::  qfdmax      !:  optimal Fe quota for diatoms 
    55    REAL(wp), PUBLIC ::  zpsinh4 
    56    REAL(wp), PUBLIC ::  zpsino3 
    57    REAL(wp), PUBLIC ::  zpsiuptk 
     41   REAL(wp), PUBLIC ::  qnnmin      !:  minimum N  quota for nanophyto 
     42   REAL(wp), PUBLIC ::  qnnmax      !:  maximum N quota for nanophyto 
     43   REAL(wp), PUBLIC ::  qpnmin      !:  minimum P quota for nanophyto 
     44   REAL(wp), PUBLIC ::  qpnmax      !:  maximum P quota for nanophyto 
     45   REAL(wp), PUBLIC ::  qnpmin      !:  minimum N quota for nanophyto 
     46   REAL(wp), PUBLIC ::  qnpmax      !:  maximum N quota for nanophyto 
     47   REAL(wp), PUBLIC ::  qppmin      !:  minimum P quota for nanophyto 
     48   REAL(wp), PUBLIC ::  qppmax      !:  maximum P quota for nanophyto 
     49   REAL(wp), PUBLIC ::  qndmin      !:  minimum N quota for diatoms 
     50   REAL(wp), PUBLIC ::  qndmax      !:  maximum N quota for diatoms 
     51   REAL(wp), PUBLIC ::  qpdmin      !:  minimum P quota for diatoms 
     52   REAL(wp), PUBLIC ::  qpdmax      !:  maximum P quota for diatoms 
     53   REAL(wp), PUBLIC ::  qfnmax      !:  maximum Fe quota for nanophyto 
     54   REAL(wp), PUBLIC ::  qfpmax      !:  maximum Fe quota for picophyto 
     55   REAL(wp), PUBLIC ::  qfdmax      !:  maximum Fe quota for diatoms 
     56   REAL(wp), PUBLIC ::  xpsinh4     !:  respiration cost of NH4 assimilation 
     57   REAL(wp), PUBLIC ::  xpsino3     !:  respiration cost of NO3 assimilation 
     58   REAL(wp), PUBLIC ::  xpsiuptk    !:  Mean respiration cost 
    5859 
    5960   !!*  Allometric variations of the quotas 
    60    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnnmin    !: ??? 
    61    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnnmax    !: ??? 
    62    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpnmin    !: ??? 
    63    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpnmax    !: ??? 
    64    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnpmin    !: ??? 
    65    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnpmax    !: ??? 
    66    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqppmin    !: ??? 
    67    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqppmax    !: ??? 
    68    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqndmin    !: ??? 
    69    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqndmax    !: ??? 
    70    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpdmin    !: ??? 
    71    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpdmax    !: ??? 
    72  
    73    !!* Phytoplankton limitation terms 
    74    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicono3   !: ??? 
    75    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpiconh4   !: ??? 
    76    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicopo4   !: ??? 
    77    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanodop   !: ??? 
    78    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicodop   !: ??? 
    79    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatdop   !: ??? 
    80    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanofer   !: ??? 
    81    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicofer   !: ??? 
    82    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatfer   !: ??? 
    83    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpic    !: ??? 
    84    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpfe    !: ??? 
    85    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvnuptk 
    86    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvpuptk 
    87    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvduptk 
    88  
    89    ! Coefficient for iron limitation 
     61   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnnmin    !: Minimum N quota of nanophyto 
     62   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnnmax    !: Maximum N quota of nanophyto 
     63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpnmin    !: Minimum P quota of nanophyto 
     64   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpnmax    !: Maximum P quota of picophyto 
     65   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnpmin    !: Minimum N quota of picophyto 
     66   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnpmax    !: Maximum N quota of picophyto 
     67   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqppmin    !: Minimum P quota of picophyto 
     68   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqppmax    !: Maximum P quota of picophyto 
     69   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqndmin    !: Minimum N quota of diatoms 
     70   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqndmax    !: Maximum N quota of diatoms 
     71   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpdmin    !: Minimum P quota of diatoms 
     72   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpdmax    !: Maximum P quota of diatoms 
     73 
     74   !!* Phytoplankton nutrient limitation terms 
     75   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicono3   !: Limitation of NO3 uptake by picophyto 
     76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpiconh4   !: Limitation of NH4 uptake by picophyto 
     77   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicopo4   !: Limitation of PO4 uptake by picophyto 
     78   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanodop   !: Limitation of DOP uptake by nanophyto 
     79   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicodop   !: Limitation of DOP uptake by picophyto 
     80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatdop   !: Limitation of DOP uptake by diatoms 
     81   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicofer   !: Limitation of Fe uptake by picophyto 
     82   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpic    !: Limitation of picophyto PP by nutrients 
     83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpics   !: Limitation of picophyto PP by nutrients 
     84   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimphys   !: Limitation of nanophyto PP by nutrients 
     85   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdias   !: Limitation of diatoms PP by nutrients 
     86   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpfe    !: Limitation of picophyto PP by Fe 
     87   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvnuptk    !: Maximum potential uptake rate of nanophyto 
     88   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvpuptk    !: Maximum potential uptake rate of picophyto 
     89   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvduptk    !: Maximum potential uptake rate of diatoms 
     90   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xqfuncfecp !:  
     91   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimnpn, xlimnpp, xlimnpd 
     92 
     93   ! Coefficient for iron limitation following Flynn and Hipkin (1999) 
    9094   REAL(wp) ::  xcoef1   = 0.00167  / 55.85 
    9195   REAL(wp) ::  xcoef2   = 1.21E-5 * 14. / 55.85 / 7.625 * 0.5 * 1.5 
     
    106110      !! 
    107111      !! ** Purpose :   Compute the co-limitations by the various nutrients 
    108       !!              for the various phytoplankton species 
     112      !!                for the various phytoplankton species. Quota based 
     113      !!                approach. The quota model is derived from theoretical 
     114      !!                models proposed by Pahlow and Oschlies (2009) and  
     115      !!                Flynn (2001). Various adaptations from several  
     116      !!                publications by these authors have been also adopted.  
    109117      !! 
    110       !! ** Method  : - ??? 
     118      !! ** Method  : Quota based approach. The quota model is derived from  
     119      !!              theoretical models by Pahlow and Oschlies (2009) and  
     120      !!              Flynn (2001). Various adaptations from several publications 
     121      !!              by these authors have been also adopted. 
    111122      !!--------------------------------------------------------------------- 
    112123      ! 
     
    117128      REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zno3, zferlim 
    118129      REAL(wp) ::   z1_trndia, z1_trnpic, z1_trnphy, ztem1, ztem2, zetot1 
    119       REAL(wp) ::   zratio, zration, zratiof, znutlim, zfalim 
     130      REAL(wp) ::   zratio, zration, zratiof, znutlim, zfalim, zxpsiuptk 
    120131      REAL(wp) ::   zconc1d, zconc1dnh4, zconc0n, zconc0nnh4, zconc0npo4, zconc0dpo4 
    121132      REAL(wp) ::   zconc0p, zconc0pnh4, zconc0ppo4, zconcpfe, zconcnfe, zconcdfe 
    122133      REAL(wp) ::   fanano, fananop, fananof, fadiat, fadiatp, fadiatf 
    123       REAL(wp) ::   fapico, fapicop, fapicof 
    124       REAL(wp) ::   zrpho, zrass, zcoef, zfuptk, zratchl 
     134      REAL(wp) ::   fapico, fapicop, fapicof, zlimpo4, zlimdop 
     135      REAL(wp) ::   zrpho, zrass, zcoef, zfuptk, zratchl, ztrn, ztrp 
    125136      REAL(wp) ::   zfvn, zfvp, zfvf, zsizen, zsizep, zsized, znanochl, zpicochl, zdiatchl 
    126       REAL(wp) ::   zqfemn, zqfemp, zqfemd, zbactno3, zbactnh4 
     137      REAL(wp) ::   zqfemn, zqfemp, zqfemd, zbactno3, zbactnh4, zbiron 
     138      REAL(wp) ::   znutlimtot, zlimno3, zlimnh4, zlim1f, zsizetmp 
     139      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrassn, zrassp, zrassd 
    127140      !!--------------------------------------------------------------------- 
    128141      ! 
     
    130143      ! 
    131144      zratchl = 6.0 
     145      sizena(:,:,:) = 0.0  ;  sizepa(:,:,:) = 0.0  ;  sizeda(:,:,:) = 0.0 
    132146      ! 
    133147      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    134          !  
    135          ! Tuning of the iron concentration to a minimum level that is set to the detection limit 
    136          !------------------------------------- 
    137          zno3    = tr(ji,jj,jk,jpno3,Kbb) / 40.e-6 
    138          zferlim = MAX( 3e-11 * zno3 * zno3, 5e-12 ) 
    139          zferlim = MIN( zferlim, 7e-11 ) 
    140          tr(ji,jj,jk,jpfer,Kbb) = MAX( tr(ji,jj,jk,jpfer,Kbb), zferlim ) 
    141  
    142          ! Computation of the mean relative size of each community 
     148         ! Computation of the Chl/C ratio of each phytoplankton group 
    143149         ! ------------------------------------------------------- 
    144150         z1_trnphy   = 1. / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 
     
    149155         zdiatchl = tr(ji,jj,jk,jpdch,Kbb) * z1_trndia 
    150156 
    151          ! Computation of a variable Ks for iron on diatoms taking into account 
    152          ! that increasing biomass is made of generally bigger cells 
     157         ! Computation of a variable Ks for the different phytoplankton 
     158         ! group as a function of their relative size. Allometry 
     159         ! from Edwards et al. (2012) 
    153160         !------------------------------------------------ 
     161 
     162         ! diatoms 
    154163         zsized            = sized(ji,jj,jk)**0.81 
    155164         zconcdfe          = concdfer * zsized 
     
    158167         zconc0dpo4        = concdpo4 * zsized 
    159168 
    160          zsizep            = 1. 
     169         ! picophytoplankton 
     170         zsizep            = sizep(ji,jj,jk)**0.81 
    161171         zconcpfe          = concpfer * zsizep 
    162172         zconc0p           = concpno3 * zsizep 
     
    164174         zconc0ppo4        = concppo4 * zsizep 
    165175 
    166          zsizen            = 1. 
     176         ! nanophytoplankton 
     177         zsizen            = sizen(ji,jj,jk)**0.81 
    167178         zconcnfe          = concnfer * zsizen 
    168179         zconc0n           = concnno3 * zsizen 
     
    173184         ! From Talmy et al. (2014) and Maranon et al. (2013) 
    174185         ! ------------------------------------------------------- 
    175          xqnnmin(ji,jj,jk) = qnnmin 
     186         xqnnmin(ji,jj,jk) = qnnmin * sizen(ji,jj,jk)**(-0.36) 
    176187         xqnnmax(ji,jj,jk) = qnnmax 
    177          xqndmin(ji,jj,jk) = qndmin * sized(ji,jj,jk)**(-0.27)  
     188         xqndmin(ji,jj,jk) = qndmin * sized(ji,jj,jk)**(-0.36) 
    178189         xqndmax(ji,jj,jk) = qndmax 
    179          xqnpmin(ji,jj,jk) = qnpmin 
     190         xqnpmin(ji,jj,jk) = qnpmin * sizep(ji,jj,jk)**(-0.36) 
    180191         xqnpmax(ji,jj,jk) = qnpmax 
    181192 
     
    183194         ! Based on the different papers by Pahlow et al., and Smith et al. 
    184195         ! ----------------------------------------------------------------- 
     196         zbiron = ( 75.0 * ( 1.0 - plig(ji,jj,jk) ) + plig(ji,jj,jk) ) * biron(ji,jj,jk) 
     197                
     198         ! Nanophytoplankton 
    185199         znutlim = MAX( tr(ji,jj,jk,jpnh4,Kbb) / zconc0nnh4,    & 
    186200           &         tr(ji,jj,jk,jpno3,Kbb) / zconc0n) 
     
    188202         znutlim = tr(ji,jj,jk,jppo4,Kbb) / zconc0npo4 
    189203         fananop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
    190          znutlim = biron(ji,jj,jk) / zconcnfe 
     204         znutlim = zbiron / zconcnfe 
    191205         fananof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
     206 
     207         ! Picophytoplankton 
    192208         znutlim = MAX( tr(ji,jj,jk,jpnh4,Kbb) / zconc0pnh4,    & 
    193209           &         tr(ji,jj,jk,jpno3,Kbb) / zconc0p) 
     
    195211         znutlim = tr(ji,jj,jk,jppo4,Kbb) / zconc0ppo4 
    196212         fapicop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
    197          znutlim = biron(ji,jj,jk) / zconcpfe 
     213         znutlim = zbiron / zconcpfe 
    198214         fapicof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
     215 
     216         ! Diatoms 
    199217         znutlim = MAX( tr(ji,jj,jk,jpnh4,Kbb) / zconc1dnh4,    & 
    200218           &         tr(ji,jj,jk,jpno3,Kbb) / zconc1d ) 
     
    202220         znutlim = tr(ji,jj,jk,jppo4,Kbb) / zconc0dpo4 
    203221         fadiatp = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
    204          znutlim = biron(ji,jj,jk) / zconcdfe 
     222         znutlim = zbiron / zconcdfe 
    205223         fadiatf = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
    206          ! 
    207          ! Michaelis-Menten Limitation term for nutrients Small bacteria 
     224 
     225         ! 
     226         ! Michaelis-Menten Limitation term by nutrients of 
     227         !  heterotrophic bacteria 
    208228         ! ------------------------------------------------------------- 
    209          zbactnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concbnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) 
    210          zbactno3 = tr(ji,jj,jk,jpno3,Kbb) / ( concbno3 + tr(ji,jj,jk,jpno3,Kbb) ) * (1. - zbactnh4) 
     229         zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concbnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) 
     230         zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( concbno3 + tr(ji,jj,jk,jpno3,Kbb) ) 
     231         znutlimtot = ( tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) )  & 
     232             &      / ( concbno3 + tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) ) 
     233         zbactnh4 = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     234         zbactno3 = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn )          
    211235         ! 
    212236         zlim1    = zbactno3 + zbactnh4 
     
    214238         zlim3    = biron(ji,jj,jk) / ( concbfe + biron(ji,jj,jk) ) 
    215239         zlim4    = tr(ji,jj,jk,jpdoc,Kbb) / ( xkdoc   + tr(ji,jj,jk,jpdoc,Kbb) ) 
     240 
     241         ! Xlimbac is used for DOC solubilization whereas xlimbacl 
     242         ! is used for all the other bacterial-dependent term 
     243         ! ------------------------------------------------------- 
    216244         xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) 
    217245         xlimbac (ji,jj,jk) = xlimbacl(ji,jj,jk) * zlim4 
     
    219247         ! Michaelis-Menten Limitation term for nutrients Small flagellates 
    220248         ! ----------------------------------------------- 
    221          zfalim = (1.-fanano) / fanano 
    222          xnanonh4(ji,jj,jk) = (1. - fanano) * tr(ji,jj,jk,jpnh4,Kbb) / ( zfalim * zconc0nnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) 
    223          xnanono3(ji,jj,jk) = (1. - fanano) * tr(ji,jj,jk,jpno3,Kbb) / ( zfalim * zconc0n + tr(ji,jj,jk,jpno3,Kbb) )  & 
    224          &                    * (1. - xnanonh4(ji,jj,jk)) 
    225          ! 
    226          zfalim = (1.-fananop) / fananop 
    227          xnanopo4(ji,jj,jk) = (1. - fananop) * tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zfalim * zconc0npo4 ) 
    228          xnanodop(ji,jj,jk) = tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdop,Kbb) + xkdoc )   & 
    229          &                    * ( 1.0 - xnanopo4(ji,jj,jk) ) 
    230          xnanodop(ji,jj,jk) = 0. 
    231          ! 
     249         ztrn    = tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) 
     250         ztrp    = tr(ji,jj,jk,jppo4,Kbb) + tr(ji,jj,jk,jpdop,Kbb)  
     251         ! 
     252         ! Limitation of N based nutrients uptake (NO3 and NH4) 
     253         zfalim  = (1.-fanano) / fanano 
     254         zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc0n + tr(ji,jj,jk,jpnh4,Kbb) ) 
     255         zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc0n + tr(ji,jj,jk,jpno3,Kbb) ) 
     256         znutlimtot = (1. - fanano) * ztrn  / ( zfalim * zconc0n + ztrn ) 
     257         xnanonh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     258         xnanono3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     259         ! 
     260         ! Limitation of P based nutrients (PO4 and DOP) 
     261         zfalim  = (1.-fananop) / fananop 
     262         zlimpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc0npo4 ) 
     263         zlimdop = tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdop,Kbb) + zconc0npo4 ) 
     264         znutlimtot = (1. - fananop) * ztrp / ( zfalim * zconc0npo4 + ztrp ) 
     265         xnanopo4(ji,jj,jk) = znutlimtot * 100.0 * zlimpo4 / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     266         xnanodop(ji,jj,jk) = znutlimtot * zlimdop / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     267         ! 
     268         ! Limitation of Fe uptake 
    232269         zfalim = (1.-fananof) / fananof 
    233          xnanofer(ji,jj,jk) = (1. - fananof) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcnfe ) 
    234          ! 
     270         xnanofer(ji,jj,jk) = (1. - fananof) * zbiron / ( zbiron + zfalim * zconcnfe ) 
     271         ! 
     272         ! The minimum iron quota depends on the size of PSU, respiration 
     273         ! and the reduction of nitrate following the parameterization  
     274         ! proposed by Flynn and Hipkin (1999) 
    235275         zratiof   = tr(ji,jj,jk,jpnfe,Kbb) * z1_trnphy 
    236276         zqfemn = xcoef1 * znanochl + xcoef2 + xcoef3 * xnanono3(ji,jj,jk) 
     277         xqfuncfecn(ji,jj,jk) = zqfemn + qfnopt 
    237278         ! 
    238279         zration = tr(ji,jj,jk,jpnph,Kbb) * z1_trnphy 
    239          zration = MIN(xqnnmax(ji,jj,jk), MAX( 2. * xqnnmin(ji,jj,jk), zration )) 
    240          fvnuptk(ji,jj,jk) = 1. / zpsiuptk * rno3 * 2. * xqnnmin(ji,jj,jk) / (zration + rtrn)  & 
     280         zration = MIN(xqnnmax(ji,jj,jk), MAX( xqnnmin(ji,jj,jk), zration )) 
     281         fvnuptk(ji,jj,jk) = 2.5 * xpsiuptk * xqnnmin(ji,jj,jk) / (zration + rtrn)  & 
    241282         &                   * MAX(0., (1. - zratchl * znanochl / 12. ) ) 
    242283         ! 
    243          zlim1    = max(0., (zration - 2. * xqnnmin(ji,jj,jk) )  & 
    244          &          / (xqnnmax(ji,jj,jk) - 2. * xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk)  & 
     284         zlim1  = max(0., (zration - xqnnmin(ji,jj,jk) )  & 
     285         &          / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk)  & 
    245286         &          / (zration + rtrn) 
    246          zlim3    = MAX( 0.,( zratiof - zqfemn ) / qfnopt )  
    247          xlimnfe(ji,jj,jk) = MIN( 1., zlim3 ) 
    248          xlimphy(ji,jj,jk) = MIN( 1., zlim1, zlim3 ) 
     287         ! The value of the optimal quota in the formulation below 
     288         ! has been found by solving a non linear equation 
     289         zlim1f = max(0., ( 1.13 - xqnnmin(ji,jj,jk) )  & 
     290         &          / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk) 
     291         zlim3  = MAX( 0.,( zratiof - zqfemn ) / qfnopt ) 
     292         ! computation of the various limitation terms of nanophyto 
     293         ! growth and PP 
     294         xlimnfe (ji,jj,jk) = MIN( 1., zlim3 ) 
     295         xlimphy (ji,jj,jk) = MIN( 1., zlim1, zlim3 ) 
     296         xlimphys(ji,jj,jk) = MIN( 1., zlim1/( zlim1f + rtrn ), zlim3 ) 
     297         xlimnpn (ji,jj,jk) = MIN( 1., zlim1) 
    249298         ! 
    250299         ! Michaelis-Menten Limitation term for nutrients picophytoplankton 
    251300         ! ---------------------------------------------------------------- 
     301         ! Limitation of N based nutrients uptake (NO3 and NH4)  
    252302         zfalim = (1.-fapico) / fapico  
    253          xpiconh4(ji,jj,jk) = (1. - fapico) * tr(ji,jj,jk,jpnh4,Kbb) / ( zfalim * zconc0pnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) 
    254          xpicono3(ji,jj,jk) = (1. - fapico) * tr(ji,jj,jk,jpno3,Kbb) / ( zfalim * zconc0p + tr(ji,jj,jk,jpno3,Kbb) )  & 
    255          &                    * (1. - xpiconh4(ji,jj,jk)) 
    256          ! 
     303         zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc0p + tr(ji,jj,jk,jpnh4,Kbb) ) 
     304         zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc0p + tr(ji,jj,jk,jpno3,Kbb) ) 
     305         znutlimtot = (1. - fapico) * ztrn / ( zfalim * zconc0p + ztrn ) 
     306         xpiconh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     307         xpicono3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     308         ! 
     309         ! Limitation of P based nutrients uptake (PO4 and DOP) 
    257310         zfalim = (1.-fapicop) / fapicop  
    258          xpicopo4(ji,jj,jk) = (1. - fapicop) * tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zfalim * zconc0ppo4 ) 
    259          xpicodop(ji,jj,jk) = tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdop,Kbb) + xkdoc )   & 
    260          &                    * ( 1.0 - xpicopo4(ji,jj,jk) ) 
    261          xpicodop(ji,jj,jk) = 0. 
     311         zlimpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc0ppo4 ) 
     312         zlimdop = tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdop,Kbb) + zconc0ppo4 ) 
     313         znutlimtot = (1. - fapicop) * ztrp / ( zfalim * zconc0ppo4 + ztrp) 
     314         xpicopo4(ji,jj,jk) = znutlimtot * 100.0 * zlimpo4 / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     315         xpicodop(ji,jj,jk) = znutlimtot * zlimdop / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
    262316         ! 
    263317         zfalim = (1.-fapicof) / fapicof 
    264          xpicofer(ji,jj,jk) = (1. - fapicof) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcpfe ) 
    265          ! 
    266          zratiof   = tr(ji,jj,jk,jppfe,Kbb) * z1_trnpic 
     318         xpicofer(ji,jj,jk) = (1. - fapicof) * zbiron / ( zbiron + zfalim * zconcpfe ) 
     319         ! 
     320         ! The minimum iron quota depends on the size of PSU, respiration 
     321         ! and the reduction of nitrate following the parameterization  
     322         ! proposed by Flynn and Hipkin (1999) 
     323         zratiof = tr(ji,jj,jk,jppfe,Kbb) * z1_trnpic 
    267324         zqfemp = xcoef1 * zpicochl + xcoef2 + xcoef3 * xpicono3(ji,jj,jk) 
     325         xqfuncfecp(ji,jj,jk) = zqfemp + qfpopt 
    268326         ! 
    269327         zration   = tr(ji,jj,jk,jpnpi,Kbb) * z1_trnpic 
    270          zration = MIN(xqnpmax(ji,jj,jk), MAX( 2. * xqnpmin(ji,jj,jk), zration )) 
    271          fvpuptk(ji,jj,jk) = 1. / zpsiuptk * rno3 * 2. * xqnpmin(ji,jj,jk) / (zration + rtrn)  & 
     328         zration = MIN(xqnpmax(ji,jj,jk), MAX( xqnpmin(ji,jj,jk), zration )) 
     329         fvpuptk(ji,jj,jk) = 2.5 * xpsiuptk * xqnpmin(ji,jj,jk) / (zration + rtrn)  & 
    272330         &                   * MAX(0., (1. - zratchl * zpicochl / 12. ) )  
    273331         ! 
    274          zlim1    = max(0., (zration - 2. * xqnpmin(ji,jj,jk) )  & 
    275          &          / (xqnpmax(ji,jj,jk) - 2. * xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk)  & 
     332         zlim1    = max(0., (zration - xqnpmin(ji,jj,jk) )  & 
     333         &          / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk)  & 
    276334         &          / (zration + rtrn) 
     335         ! The value of the optimal quota in the formulation below 
     336         ! has been found by solving a non linear equation 
     337         zlim1f   = max(0., (1.29 - xqnpmin(ji,jj,jk) )  & 
     338         &          / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk) 
    277339         zlim3    = MAX( 0.,( zratiof - zqfemp ) / qfpopt ) 
    278          xlimpfe(ji,jj,jk) = MIN( 1., zlim3 ) 
    279          xlimpic(ji,jj,jk) = MIN( 1., zlim1, zlim3 ) 
     340 
     341         ! computation of the various limitation terms of picophyto 
     342         ! growth and PP 
     343         xlimpfe (ji,jj,jk) = MIN( 1., zlim3 ) 
     344         xlimpic (ji,jj,jk) = MIN( 1., zlim1, zlim3 ) 
     345         xlimnpp (ji,jj,jk) = MIN( 1., zlim1 ) 
     346         xlimpics(ji,jj,jk) = MIN( 1., zlim1/( zlim1f + rtrn ), zlim3 ) 
     347 
     348 
    280349         ! 
    281350         !   Michaelis-Menten Limitation term for nutrients Diatoms 
    282351         !   ------------------------------------------------------ 
     352         ! 
     353         ! Limitation of N based nutrients uptake (NO3 and NH4) 
    283354         zfalim = (1.-fadiat) / fadiat  
    284          xdiatnh4(ji,jj,jk) = (1. - fadiat) * tr(ji,jj,jk,jpnh4,Kbb) / ( zfalim * zconc1dnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) 
    285          xdiatno3(ji,jj,jk) = (1. - fadiat) * tr(ji,jj,jk,jpno3,Kbb) / ( zfalim * zconc1d + tr(ji,jj,jk,jpno3,Kbb) )  & 
    286          &                    * (1. - xdiatnh4(ji,jj,jk)) 
    287          ! 
     355         zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc1d + tr(ji,jj,jk,jpnh4,Kbb) ) 
     356         zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc1d + tr(ji,jj,jk,jpno3,Kbb) ) 
     357         znutlimtot = (1.0 - fadiat) * ztrn / ( zfalim * zconc1d + ztrn ) 
     358         xdiatnh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     359         xdiatno3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     360         ! 
     361         ! Limitation of P based nutrients uptake (PO4 and DOP) 
    288362         zfalim = (1.-fadiatp) / fadiatp 
    289          xdiatpo4(ji,jj,jk) = (1. - fadiatp) * tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zfalim * zconc0dpo4 ) 
    290          xdiatdop(ji,jj,jk) = tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdop,Kbb) + xkdoc )  & 
    291          &                    * ( 1.0 - xdiatpo4(ji,jj,jk) ) 
    292          xdiatdop(ji,jj,jk) = 0. 
    293          ! 
     363         zlimpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc0dpo4 ) 
     364         zlimdop = tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdop,Kbb) + zconc0dpo4 ) 
     365         znutlimtot = (1. - fadiatp) * ztrp / ( zfalim * zconc0dpo4 + ztrp ) 
     366         xdiatpo4(ji,jj,jk) = znutlimtot * 100.0 * zlimpo4 / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     367         xdiatdop(ji,jj,jk) = znutlimtot * zlimdop / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     368         ! 
     369         ! Limitation of Fe uptake 
    294370         zfalim = (1.-fadiatf) / fadiatf 
    295          xdiatfer(ji,jj,jk) = (1. - fadiatf) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcdfe ) 
    296          ! 
     371         xdiatfer(ji,jj,jk) = (1. - fadiatf) * zbiron / ( zbiron + zfalim * zconcdfe ) 
     372         ! 
     373         ! The minimum iron quota depends on the size of PSU, respiration 
     374         ! and the reduction of nitrate following the parameterization  
     375         ! proposed by Flynn and Hipkin (1999) 
    297376         zratiof   = tr(ji,jj,jk,jpdfe,Kbb) * z1_trndia 
    298377         zqfemd = xcoef1 * zdiatchl + xcoef2 + xcoef3 * xdiatno3(ji,jj,jk) 
     378         xqfuncfecd(ji,jj,jk) = zqfemd + qfdopt 
    299379         ! 
    300380         zration   = tr(ji,jj,jk,jpndi,Kbb) * z1_trndia 
    301          zration = MIN(xqndmax(ji,jj,jk), MAX( 2. * xqndmin(ji,jj,jk), zration )) 
    302          fvduptk(ji,jj,jk) = 1. / zpsiuptk * rno3 * 2. * xqndmin(ji,jj,jk) / (zration + rtrn)   & 
     381         zration   = MIN(xqndmax(ji,jj,jk), MAX( xqndmin(ji,jj,jk), zration )) 
     382         fvduptk(ji,jj,jk) = 2.5 * xpsiuptk * xqndmin(ji,jj,jk) / (zration + rtrn)   & 
    303383         &                   * MAX(0., (1. - zratchl * zdiatchl / 12. ) )  
    304384         ! 
    305          zlim1    = max(0., (zration - 2. * xqndmin(ji,jj,jk) )    & 
    306          &          / (xqndmax(ji,jj,jk) - 2. * xqndmin(ji,jj,jk) ) )   & 
     385         zlim1    = max(0., (zration - xqndmin(ji,jj,jk) )    & 
     386         &          / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) )   & 
    307387         &          * xqndmax(ji,jj,jk) / (zration + rtrn) 
    308          zlim3    = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi(ji,jj) + rtrn ) 
     388         ! The value of the optimal quota in the formulation below 
     389         ! has been found by solving a non linear equation 
     390         zlim1f   = max(0., (1.13 - xqndmin(ji,jj,jk) )    & 
     391         &          / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) )   & 
     392         &          * xqndmax(ji,jj,jk) 
     393         zlim3    = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi(ji,jj) ) 
    309394         zlim4    = MAX( 0., ( zratiof - zqfemd ) / qfdopt ) 
     395         ! computation of the various limitation terms of diatoms 
     396         ! growth and PP 
    310397         xlimdfe(ji,jj,jk) = MIN( 1., zlim4 ) 
    311398         xlimdia(ji,jj,jk) = MIN( 1., zlim1, zlim3, zlim4 ) 
     399         xlimdias(ji,jj,jk) = MIN (1.0, zlim1 / (zlim1f + rtrn ), zlim3, zlim4 ) 
    312400         xlimsi(ji,jj,jk)  = MIN( zlim1, zlim4 ) 
     401         xlimnpd(ji,jj,jk) = MIN( 1., zlim1 ) 
    313402      END_3D 
     403 
    314404      ! 
    315405      ! Compute the phosphorus quota values. It is based on Litchmann et al., 2004 and Daines et al, 2013. 
     
    319409      ! -------------------------------------------------------------------------------------------------- 
    320410      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    321          ! Size estimation of nanophytoplankton 
    322          ! ------------------------------------ 
    323          zfvn = 2. * fvnuptk(ji,jj,jk) 
    324          sizen(ji,jj,jk) = MAX(1., MIN(xsizern, 1.0 / ( MAX(rtrn, zfvn) ) ) ) 
    325  
     411         ! Size estimation of nanophytoplankton based on total biomass 
     412         ! Assumes that larger biomass implies addition of larger cells 
     413         ! ------------------------------------------------------------ 
     414         zcoef = tr(ji,jj,jk,jpphy,Kbb) - MIN(xsizephy, tr(ji,jj,jk,jpphy,Kbb) ) 
     415         sizena(ji,jj,jk) = 1. + ( xsizern -1.0 ) * zcoef / ( xsizephy + zcoef ) 
    326416         ! N/P ratio of nanophytoplankton 
    327417         ! ------------------------------ 
    328          zfuptk = 0.23 * zfvn 
    329          zrpho = 2.24 * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpnph,Kbb) * rno3 * 15. + rtrn ) 
    330          zrass = 1. - 0.2 - zrpho - zfuptk 
    331          xqpnmax(ji,jj,jk) = ( zfuptk + zrpho ) * 0.0128 * 16. + zrass * 1./ 7.2 * 16. 
    332          xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) * tr(ji,jj,jk,jpnph,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) + 0.13 
    333          xqpnmin(ji,jj,jk) = 0.13 + 0.23 * 0.0128 * 16. 
    334  
    335          ! Size estimation of picophytoplankton 
    336          ! ------------------------------------ 
    337          zfvn = 2. * fvpuptk(ji,jj,jk) 
    338          sizep(ji,jj,jk) = MAX(1., MIN(xsizerp, 1.0 / ( MAX(rtrn, zfvn) ) ) ) 
     418         zfuptk = 0.2 + 0.12 / ( 3.0 * sizen(ji,jj,jk) + rtrn ) 
     419         ! Computed from Inomura et al. (2020) using Pavlova Lutheri 
     420         zrpho  = 11.55 * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn ) 
     421         zrass = MAX(0.62/4., ( 1. - zrpho - zfuptk ) * xlimnpn(ji,jj,jk) ) 
     422         zrassn(ji,jj,jk) = zrass 
     423         xqpnmin(ji,jj,jk) = ( 0.0 + 0.0078 + 0.62/4. * 0.0783 ) * 16. 
     424         xqpnmax(ji,jj,jk) = ( zrpho * 0.0089 + zrass * 0.0783 ) * 16. 
     425         xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) + (0.033 + 0.0078 ) * 16. 
     426         xqpnmax(ji,jj,jk) = MIN( qpnmax, xqpnmax(ji,jj,jk) ) 
     427 
     428         ! Size estimation of picophytoplankton based on total biomass 
     429         ! Assumes that larger biomass implies addition of larger cells 
     430         ! ------------------------------------------------------------ 
     431         zcoef = tr(ji,jj,jk,jppic,Kbb) - MIN(xsizepic, tr(ji,jj,jk,jppic,Kbb) ) 
     432         sizepa(ji,jj,jk) = 1. + ( xsizerp -1.0 ) * zcoef / ( xsizepic + zcoef ) 
    339433 
    340434         ! N/P ratio of picophytoplankton 
    341435         ! ------------------------------ 
    342          zfuptk = 0.35 * zfvn 
    343          zrpho = 2.24 * tr(ji,jj,jk,jppch,Kbb) / ( tr(ji,jj,jk,jpnpi,Kbb) * rno3 * 15. + rtrn ) 
    344          zrass = 1. - 0.4 - zrpho - zfuptk 
    345          xqppmax(ji,jj,jk) =  (zrpho + zfuptk) * 0.0128 * 16. + zrass * 1./ 9. * 16. 
    346          xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) * tr(ji,jj,jk,jpnpi,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) + rtrn ) + 0.13 
    347          xqppmin(ji,jj,jk) = 0.13 
    348  
    349          ! Size estimation of diatoms 
    350          ! -------------------------- 
    351          zfvn = 2. * fvduptk(ji,jj,jk) 
    352          sized(ji,jj,jk) = MAX(1., MIN(xsizerd, 1.0 / ( MAX(rtrn, zfvn) ) ) ) 
     436         zfuptk = 0.2 + 0.12 / ( 0.8 * sizep(ji,jj,jk) + rtrn ) 
     437         ! Computed from Inomura et al. (2020) using a synechococcus 
     438         zrpho = 13.4 * tr(ji,jj,jk,jppch,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) * 12. + rtrn ) 
     439         zrass = MAX(0.4/4., ( 1. - zrpho - zfuptk ) * xlimnpp(ji,jj,jk) ) 
     440         zrassp(ji,jj,jk) = zrass 
     441         xqppmin(ji,jj,jk) = ( (0.0 + 0.0078 ) + 0.4/4. * 0.0517 ) * 16. 
     442         xqppmax(ji,jj,jk) = ( zrpho * 0.0076 + zrass * 0.0517 ) * 16. 
     443         xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) +  (0.033 + 0.0078 ) * 16 
     444         xqppmax(ji,jj,jk) = MIN( qppmax, xqppmax(ji,jj,jk) ) 
     445 
     446         ! Size estimation of diatoms based on total biomass 
     447         ! Assumes that larger biomass implies addition of larger cells 
     448         ! ------------------------------------------------------------ 
    353449         zcoef = tr(ji,jj,jk,jpdia,Kbb) - MIN(xsizedia, tr(ji,jj,jk,jpdia,Kbb) ) 
    354          sized(ji,jj,jk) = 1. + xsizerd * zcoef *1E6 / ( 1. + zcoef * 1E6 ) 
    355  
     450         sizeda(ji,jj,jk) = 1. + ( xsizerd - 1.0 ) * zcoef / ( xsizedia + zcoef ) 
    356451         ! N/P ratio of diatoms 
    357452         ! -------------------- 
    358          zfuptk = 0.2 * zfvn 
    359          zrpho = 2.24 * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpndi,Kbb) * rno3 * 15. + rtrn ) 
    360          zrass = 1. - 0.2 - zrpho - zfuptk 
    361          xqpdmax(ji,jj,jk) = ( zfuptk + zrpho ) * 0.0128 * 16. + zrass * 1./ 7.2 * 16. 
    362          xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) * tr(ji,jj,jk,jpndi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) + 0.13 
    363          xqpdmin(ji,jj,jk) = 0.13 + 0.2 * 0.0128 * 16. 
    364  
     453         zfuptk = 0.2 + 0.12 / ( 5.0 * sized(ji,jj,jk) + rtrn ) 
     454         ! Computed from Inomura et al. (2020) using a synechococcus 
     455         zrpho = 8.08 * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpndi,Kbb) * 12. + rtrn ) 
     456         zrass = MAX(0.66/4., ( 1. - zrpho - zfuptk ) * xlimnpd(ji,jj,jk) ) 
     457         zrassd(ji,jj,jk)=zrass 
     458         xqpdmin(ji,jj,jk) = ( ( 0.0 + 0.0078 ) + 0.66/4. * 0.0783 ) * 16. 
     459         xqpdmax(ji,jj,jk) = ( zrpho * 0.0135 + zrass * 0.0783 ) * 16. 
     460         xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) + ( 0.0078 + 0.033 ) * 16. 
     461         xqpdmax(ji,jj,jk) = MIN(qpdmax, xqpdmax(ji,jj,jk) ) 
    365462      END_3D 
    366463 
    367464      ! Compute the fraction of nanophytoplankton that is made of calcifiers 
     465      ! This is a purely adhoc formulation described in Aumont et al. (2015) 
     466      ! This fraction depends on nutrient limitation, light, temperature 
    368467      ! -------------------------------------------------------------------- 
    369468      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     
    372471         &        / ( tr(ji,jj,jk,jpnh4,Kbb) + concnnh4 ) ) 
    373472         zlim2  = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + concnpo4 ) 
    374          zlim3  = tr(ji,jj,jk,jpfer,Kbb) / ( tr(ji,jj,jk,jpfer,Kbb) +  5.E-11 )  
    375          ztem1  = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) ) 
     473         zlim3  = tr(ji,jj,jk,jpfer,Kbb) / ( tr(ji,jj,jk,jpfer,Kbb) +  6.E-11 )  
     474         ztem1  = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) + 1.8 ) 
    376475         ztem2  = ts(ji,jj,jk,jp_tem,Kmm) - 10. 
    377          zetot1 = MAX( 0., etot(ji,jj,jk) - 1.) / ( 4. + etot(ji,jj,jk) ) * 20. / ( 20. + etot(ji,jj,jk) )  
    378  
    379 !               xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 )                  & 
    380          xfracal(ji,jj,jk) = caco3r                 & 
    381          &                   * ztem1 / ( 1. + ztem1 ) * MAX( 1., tr(ji,jj,jk,jpphy,Kbb)*1E6 )   & 
     476         zetot1 = MAX( 0., etot_ndcy(ji,jj,jk) - 1.) / ( 4. + etot_ndcy(ji,jj,jk) ) * 30. / ( 30. + etot_ndcy(ji,jj,jk) )  
     477 
     478         xfracal(ji,jj,jk) = caco3r * xlimphy(ji,jj,jk)     & 
     479         &                   * ztem1 / ( 0.1 + ztem1 ) * MAX( 1., tr(ji,jj,jk,jpphy,Kbb)*1E6 )   & 
    382480            &                * ( 1. + EXP(-ztem2 * ztem2 / 25. ) )         & 
    383481            &                * zetot1 * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) ) 
     
    403501        CALL iom_put( "SIZEP"  , sizep  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
    404502        CALL iom_put( "SIZED"  , sized  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     503        CALL iom_put( "RASSN"  , zrassn (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     504        CALL iom_put( "RASSP"  , zrassp (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     505        CALL iom_put( "RASSD"  , zrassd (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
    405506      ENDIF 
    406507      ! 
     
    416517      !! ** Purpose :   Initialization of nutrient limitation parameters 
    417518      !! 
    418       !! ** Method  :   Read the nampislim and nampisquota namelists and check 
     519      !! ** Method  :   Read the namp5zlim and nampisquota namelists and check 
    419520      !!      the parameters called at the first timestep (nittrc000) 
    420521      !! 
    421       !! ** input   :   Namelist nampislim 
     522      !! ** input   :   Namelist namp5zlim 
    422523      !! 
    423524      !!---------------------------------------------------------------------- 
     
    436537      ! 
    437538      READ  ( numnatp_ref, namp5zlim, IOSTAT = ios, ERR = 901) 
    438 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in reference namelist' ) 
     539901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zlim in reference namelist' ) 
    439540      ! 
    440541      READ  ( numnatp_cfg, namp5zlim, IOSTAT = ios, ERR = 902 ) 
    441 902   IF( ios >  0 ) CALL ctl_nam ( ios , 'nampislim in configuration namelist' ) 
     542902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zlim in configuration namelist' ) 
    442543      IF(lwm) WRITE ( numonp, namp5zlim ) 
    443544      ! 
     
    505606      ENDIF 
    506607      ! 
    507       zpsino3 = 2.3 * rno3 
    508       zpsinh4 = 1.8 * rno3 
    509       zpsiuptk = 2.3 * rno3 
     608      ! Metabolic cost of nitrate and ammonium utilisation 
     609      xpsino3  = 2.3 * rno3 
     610      xpsinh4  = 1.8 * rno3 
     611      xpsiuptk = 1.0 / 6.625 
    510612      ! 
    511613      nitrfac(:,:,jpk) = 0._wp 
     
    537639         &      xpicopo4(jpi,jpj,jpk), xpicodop(jpi,jpj,jpk),       & 
    538640         &      xnanodop(jpi,jpj,jpk), xdiatdop(jpi,jpj,jpk),       & 
    539          &      xnanofer(jpi,jpj,jpk), xdiatfer(jpi,jpj,jpk),       & 
    540641         &      xpicofer(jpi,jpj,jpk), xlimpfe (jpi,jpj,jpk),       & 
    541642         &      fvnuptk (jpi,jpj,jpk), fvduptk (jpi,jpj,jpk),       & 
     643         &      xlimphys(jpi,jpj,jpk), xlimdias(jpi,jpj,jpk),       & 
     644         &      xlimnpp (jpi,jpj,jpk), xlimnpn (jpi,jpj,jpk),       & 
     645         &      xlimnpd (jpi,jpj,jpk),                              & 
     646         &      xlimpics(jpi,jpj,jpk), xqfuncfecp(jpi,jpj,jpk),     & 
    542647         &      fvpuptk (jpi,jpj,jpk), xlimpic (jpi,jpj,jpk),    STAT=ierr(1) ) 
    543648         ! 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p5zmeso.F90

    r15090 r15459  
    22   !!====================================================================== 
    33   !!                         ***  MODULE p5zmeso  *** 
    4    !! TOP :   PISCES Compute the sources/sinks for mesozooplankton 
     4   !! TOP :   PISCES-QUOTA Compute the sources/sinks for mesozooplankton 
    55   !!====================================================================== 
    66   !! History :   1.0  !  2002     (O. Aumont) Original code 
     
    99   !!             3.6  !  2015-05  (O. Aumont) PISCES quota 
    1010   !!---------------------------------------------------------------------- 
    11    !!   p5z_meso       :   Compute the sources/sinks for mesozooplankton 
    12    !!   p5z_meso_init  :   Initialization of the parameters for mesozooplankton 
     11   !!   p5z_meso       : Compute the sources/sinks for mesozooplankton 
     12   !!   p5z_meso_init  : Initialization of the parameters for mesozooplankton 
     13   !!   p5z_meso_alloc : Allocate variables for mesozooplankton  
    1314   !!---------------------------------------------------------------------- 
    1415   USE oce_trc         !  shared variables between ocean and passive tracers 
     
    2324   PUBLIC   p5z_meso              ! called in p5zbio.F90 
    2425   PUBLIC   p5z_meso_init         ! called in trcsms_pisces.F90 
     26   PUBLIC   p5z_meso_alloc        ! called in trcini_pisces.F90 
    2527 
    2628   !! * Shared module variables 
     
    4951   REAL(wp), PUBLIC ::  srespir2     !: Active respiration 
    5052   REAL(wp), PUBLIC ::  grazflux     !: mesozoo flux feeding rate 
     53   REAL(wp), PUBLIC ::  xfracmig     !: Fractional biomass of meso that performs DVM 
     54   REAL(wp), PUBLIC ::  xsigma2      !: Width of the predation window 
     55   REAL(wp), PUBLIC ::  xsigma2del   !: Maximum width of the predation window at low food density 
    5156   LOGICAL,  PUBLIC ::  bmetexc2     !: Use of excess carbon for respiration 
     57   LOGICAL , PUBLIC ::  ln_dvm_meso  !: Boolean to activate DVM of mesozooplankton 
     58   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig  !: DVM of mesozooplankton : migration depth 
     59   INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig    !: Vertical indice of the the migration depth 
    5260 
    5361   !! * Substitutions 
    5462#  include "do_loop_substitute.h90" 
     63#  include "domzgr_substitute.h90" 
    5564   !!---------------------------------------------------------------------- 
    5665   !! NEMO/TOP 4.0 , NEMO Consortium (2018) 
     
    6170CONTAINS 
    6271 
    63    SUBROUTINE p5z_meso( kt, knt, Kbb, Krhs ) 
     72   SUBROUTINE p5z_meso( kt, knt, Kbb, Kmm, Krhs ) 
    6473      !!--------------------------------------------------------------------- 
    6574      !!                     ***  ROUTINE p5z_meso  *** 
    6675      !! 
    6776      !! ** Purpose :   Compute the sources/sinks for mesozooplankton 
    68       !! 
    69       !! ** Method  : - ??? 
     77      !!                This includes ingestion and assimilation, flux feeding 
     78      !!                and mortality. We use an active prey switching   
     79      !!                parameterization Morozov and Petrovskii (2013).  
     80      !!                All living compartments and mesozooplankton 
     81      !!                are potential preys of mesozooplankton as well as small 
     82      !!                sinking particles  
     83      !! 
    7084      !!--------------------------------------------------------------------- 
    7185      INTEGER, INTENT(in) ::   kt, knt    ! ocean time step 
    72       INTEGER, INTENT(in)  ::  Kbb, Krhs  ! time level indices 
    73       INTEGER  :: ji, jj, jk 
     86      INTEGER, INTENT(in)  ::  Kbb, Kmm, Krhs  ! time level indices 
     87      ! 
     88      INTEGER  :: ji, jj, jk, jkt 
    7489      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam, zcompames 
    75       REAL(wp) :: zgraze2, zdenom, zfact, zfood, zfoodlim, zproport 
     90      REAL(wp) :: zgraze2, zdenom, zfact, zfood, zfoodlim, zproport, zdep 
    7691      REAL(wp) :: zmortzgoc, zfracc, zfracn, zfracp, zfracfe, zratio, zratio2 
    77       REAL(wp) :: zepsherf, zepshert, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi 
     92      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi 
    7893      REAL(wp) :: zgraztotc, zgraztotn, zgraztotp, zgraztotf, zbasresn, zbasresp, zbasresf 
    79       REAL(wp) :: zgradoc, zgradon, zgradop, zgratmp, zgradoct, zgradont, zgrareft, zgradopt 
    80       REAL(wp) :: zgrapoc, zgrapon, zgrapop, zgrapof, zprcaca, zmortz 
    81       REAL(wp) :: zexcess, zgrarem, zgraren, zgrarep, zgraref 
     94      REAL(wp) :: zgradoct, zgradont, zgrareft, zgradopt 
     95      REAL(wp) :: zprcaca, zmortz, zexcess 
    8296      REAL(wp) :: zbeta, zrespz, ztortz, zgrasratp, zgrasratn, zgrasratf 
    8397      REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot 
     
    87101      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg 
    88102      REAL(wp) :: zgrazffnp, zgrazffng, zgrazffpp, zgrazffpg 
     103      REAL(wp) :: zmigreltime, zrum, zcodel, zargu, zval, zmigthick  
    89104      CHARACTER (len=25) :: charout 
    90       REAL(wp) :: zrfact2, zmetexcess 
    91       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2,  zz2ligprod 
     105      REAL(wp) :: zrfact2, zmetexcess, zsigma, zdiffdn 
     106      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2 
     107      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof 
     108      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarep, zgraren, zgrapon, zgrapop 
     109      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgradoc, zgradon, zgradop 
     110      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof 
     111      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrep, zgramigren, zgramigpop, zgramigpon 
     112      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigdoc, zgramigdop, zgramigdon 
     113       
    92114 
    93115      !!--------------------------------------------------------------------- 
     
    95117      IF( ln_timing )   CALL timing_start('p5z_meso') 
    96118      ! 
     119      ! Initialization of local arrays 
     120      zgrazing(:,:,:) = 0._wp  ;  zfezoo2(:,:,:) = 0._wp 
     121      zgrarem (:,:,:) = 0._wp  ;  zgraren(:,:,:) = 0._wp 
     122      zgrarep (:,:,:) = 0._wp  ;  zgraref(:,:,:) = 0._wp 
     123      zgrapoc (:,:,:) = 0._wp  ;  zgrapon(:,:,:) = 0._wp 
     124      zgrapop (:,:,:) = 0._wp  ;  zgrapof(:,:,:) = 0._wp 
     125      zgradoc (:,:,:) = 0._wp  ;  zgradon(:,:,:) = 0._wp 
     126      zgradop (:,:,:) = 0._wp    
     127      ! 
     128 
     129      ! 
     130      ! Diurnal vertical migration of mesozooplankton 
     131      ! Computation of the migration depth 
     132      ! --------------------------------------------- 
     133      IF( ln_dvm_meso ) CALL p5z_meso_depmig( Kbb, Kmm ) 
     134 
     135      ! Use of excess carbon for metabolism 
    97136      zmetexcess = 0.0 
    98137      IF ( bmetexc2 ) zmetexcess = 1.0 
     
    102141         zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam 
    103142 
    104          !   Michaelis-Menten mortality rates of mesozooplankton 
    105          !   --------------------------------------------------- 
     143         !  linear mortality of mesozooplankton 
     144         !  A michaelis menten modulation term is used to avoid extinction of  
     145         !  mesozooplankton at very low food concentrations 
     146         !  ----------------------------------------------------------------- 
    106147         zrespz   = resrat2 * zfact * ( tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) )  & 
    107148         &          + 3. * nitrfac(ji,jj,jk) ) 
    108149 
    109          !   Zooplankton mortality. A square function has been selected with 
    110          !   no real reason except that it seems to be more stable and may mimic predation 
    111          !   --------------------------------------------------------------- 
     150         !  Zooplankton quadratic mortality. A square function has been selected with 
     151         !  to mimic predation and disease (density dependent mortality). It also tends 
     152         !  to stabilise the model 
     153         !  ------------------------------------------------------------------------- 
    112154         ztortz   = mzrat2 * 1.e6 * zfact * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk)) 
    113155 
     
    121163         zcompames = MAX( ( tr(ji,jj,jk,jpmes,Kbb) - xthresh2mes ), 0.e0 ) 
    122164 
    123          !   Mesozooplankton grazing 
    124          !   ------------------------ 
     165         !  Mesozooplankton grazing 
     166         ! The total amount of food is the sum of all preys accessible to mesozooplankton  
     167         ! multiplied by their food preference 
     168         ! A threshold can be specified in the namelist (xthresh2). However, when food  
     169         ! concentration is close to this threshold, it is decreased to avoid the  
     170         ! accumulation of food in the mesozoopelagic domain 
     171         ! ------------------------------------------------------------------------------- 
    125172         zfood     = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc   & 
    126173         &           + xpref2m * zcompames  
     
    129176         zgraze2   = grazrat2 * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk))  
    130177 
    131          !   An active switching parameterization is used here. 
    132          !   We don't use the KTW parameterization proposed by  
    133          !   Vallina et al. because it tends to produce to steady biomass 
    134          !   composition and the variance of Chl is too low as it grazes 
    135          !   too strongly on winning organisms. Thus, instead of a square 
    136          !   a 1.5 power value is used which decreases the pressure on the 
    137          !   most abundant species 
    138          !   ------------------------------------------------------------   
    139          ztmp1 = xpref2n * zcompaph**1.5 
    140          ztmp2 = xpref2m * zcompames**1.5 
    141          ztmp3 = xpref2c * zcompapoc**1.5 
    142          ztmp4 = xpref2d * zcompadi**1.5 
    143          ztmp5 = xpref2z * zcompaz**1.5 
     178         ! An active switching parameterization is used here. 
     179         ! We don't use the KTW parameterization proposed by  
     180         ! Vallina et al. because it tends to produce too steady biomass 
     181         ! composition and the variance of Chl is too low as it grazes 
     182         ! too strongly on winning organisms. We use a generalized 
     183         ! switching parameterization proposed by Morozov and  
     184         ! Petrovskii (2013) 
     185         ! ------------------------------------------------------------   
     186         ! The width of the selection window is increased when preys 
     187         ! have low abundance, .i.e. zooplankton become less specific  
     188         ! to avoid starvation. 
     189         ! ---------------------------------------------------------- 
     190         zsigma = 1.0 - zdenom**3/(0.1**3+zdenom**3) 
     191         zsigma = xsigma2 + xsigma2del * zsigma 
     192         ! Nanophytoplankton and diatoms are the only preys considered 
     193         ! to be close enough to have potential interference 
     194         ! ----------------------------------------------------------- 
     195         zdiffdn = exp( -ABS(log(3.0 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2 ) 
     196         ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / (1.0 + zdiffdn) 
     197         ztmp2 = xpref2m * zcompames**2 
     198         ztmp3 = xpref2c * zcompapoc**2 
     199         ztmp4 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) / (1.0 + zdiffdn) 
     200         ztmp5 = xpref2z * zcompaz**2 
    144201         ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + ztmp5 + rtrn 
    145202         ztmp1 = ztmp1 / ztmptot 
     
    166223         zgrazpof  = zgrazpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
    167224 
    168          !   Mesozooplankton flux feeding on GOC 
    169          !   ---------------------------------- 
     225         !  Mesozooplankton flux feeding on GOC and POC. The feeding pressure 
     226         ! is proportional to the flux 
     227         !  ------------------------------------------------------------------ 
    170228         zgrazffeg = grazflux  * xstep * wsbio4(ji,jj,jk)      & 
    171229         &           * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb)  & 
     
    183241         zgraztotc  = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg 
    184242 
    185          !   Compute the proportion of filter feeders 
    186          !   ----------------------------------------   
    187          zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) 
     243         ! Compute the proportion of filter feeders. It is assumed steady state. 
     244         ! ---------------------------------------------------------------------   
     245         zproport  = 0._wp 
     246         IF( gdepw(ji,jj,jk+1,Kmm) > MAX(hmld(ji,jj), heup_01(ji,jj) ) ) THEN 
     247            zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) 
     248         ENDIF 
    188249 
    189250         !   Compute fractionation of aggregates. It is assumed that  
     
    195256         zfracc    = zproport * grazflux  * xstep * wsbio4(ji,jj,jk)      & 
    196257         &          * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb)          & 
    197          &          * ( 0.2 + 3.8 * zratio2 / ( 1.**2 + zratio2 ) ) 
     258         &          * ( 0.4 + 3.6 * zratio2 / ( 1.**2 + zratio2 ) ) 
    198259         zfracfe   = zfracc * tr(ji,jj,jk,jpbfe,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn) 
    199260         zfracn    = zfracc * tr(ji,jj,jk,jpgon,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn) 
    200261         zfracp    = zfracc * tr(ji,jj,jk,jpgop,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn) 
    201262 
    202          zgrazffep = zproport * zgrazffep   ;   zgrazffeg = zproport * zgrazffeg 
    203          zgrazfffp = zproport * zgrazfffp   ;   zgrazfffg = zproport * zgrazfffg 
    204          zgrazffnp = zproport * zgrazffnp   ;   zgrazffng = zproport * zgrazffng 
    205          zgrazffpp = zproport * zgrazffpp   ;   zgrazffpg = zproport * zgrazffpg 
     263         ! Flux feeding is multiplied by the fractional biomass of flux feeders 
     264         zgrazffep = zproport * zgrazffep         ;   zgrazffeg = zproport * zgrazffeg 
     265         zgrazfffp = zproport * zgrazfffp         ;   zgrazfffg = zproport * zgrazfffg 
     266         zgrazffnp = zproport * zgrazffnp         ;   zgrazffng = zproport * zgrazffng 
     267         zgrazffpp = zproport * zgrazffpp         ;   zgrazffpg = zproport * zgrazffpg 
     268         zgrazdc   = (1.0 - zproport) * zgrazdc   ;   zgraznc   = (1.0 - zproport) * zgraznc 
     269         zgrazz    = (1.0 - zproport) * zgrazz    ;   zgrazpoc  = (1.0 - zproport) * zgrazpoc 
     270         zgrazm    = (1.0 - zproport) * zgrazm 
     271         zgrazdn   = (1.0 - zproport) * zgrazdn   ;   zgraznn   = (1.0 - zproport) * zgraznn 
     272         zgrazpon  = (1.0 - zproport) * zgrazpon 
     273         zgrazdp   = (1.0 - zproport) * zgrazdp   ;   zgraznp   = (1.0 - zproport) * zgraznp 
     274         zgrazpop  = (1.0 - zproport) * zgrazpop 
     275         zgrazdf   = (1.0 - zproport) * zgrazdf   ;   zgraznf   = (1.0 - zproport) * zgraznf 
     276         zgrazpof  = (1.0 - zproport) * zgrazpof 
    206277 
    207278         zgraztotc  = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg 
    208          zgraztotf  = zgrazdf + zgraznf + ( zgrazz + zgrazm ) * ferat3 + zgrazpof & 
     279         zgraztotf  = zgrazdf + zgraznf + zgrazz * feratz + zgrazm * feratm + zgrazpof & 
    209280         &            + zgrazfffp + zgrazfffg 
    210281         zgraztotn  = zgrazdn + (zgrazm + zgrazz) * no3rat3 + zgraznn + zgrazpon  & 
     
    213284         &            + zgrazffpp + zgrazffpg 
    214285 
    215  
    216286         ! Total grazing ( grazing by microzoo is already computed in p5zmicro ) 
    217287         zgrazing(ji,jj,jk) = zgraztotc 
     
    223293         zgrasratp  =  (zgraztotp + rtrn) / ( zgraztotc + rtrn ) 
    224294 
    225          !   Growth efficiency is made a function of the quality  
    226          !   and the quantity of the preys 
    227          !   --------------------------------------------------- 
    228          zepshert  = MIN( 1., zgrasratn/ no3rat3, zgrasratp/ po4rat3, zgrasratf / ferat3) 
     295         ! Mesozooplankton efficiency.  
     296         ! We adopt a formulation proposed by Mitra et al. (2007) 
     297         ! The gross growth efficiency is controled by the most limiting nutrient. 
     298         ! Growth is also further decreased when the food quality is poor. This is currently 
     299         ! hard coded : it can be decreased by up to 50% (zepsherq) 
     300         ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and  
     301         ! Fulton, 2012) 
     302         ! ----------------------------------------------------------------------------------- 
     303         zepshert  = MIN( 1., zgrasratn/ no3rat3, zgrasratp/ po4rat3, zgrasratf / feratm) 
    229304         zbeta     = MAX(0., (epsher2 - epsher2min) ) 
    230305         zepsherf  = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) 
    231          zepsherv  = zepsherf * zepshert 
     306         zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) 
     307         zepsherv  = zepsherf * zepshert * zepsherq 
    232308 
    233309         !   Respiration of mesozooplankton 
    234310         !   Excess carbon in the food is used preferentially 
    235          !   ----------------  ------------------------------ 
     311         !   when bmetexc2 is set to .true. 
     312         !   ----------------------------------------------- 
    236313         zexcess  = zgraztotc * zepsherf * (1.0 - zepshert) * zmetexcess  
    237314         zbasresb = MAX(0., zrespz - zexcess) 
     
    246323         zexcess  = ( zgrasratp/ po4rat3 - zepshert ) / ( 1.0 - zepshert + rtrn) 
    247324         zbasresp = zbasresi * zexcess * zgrasratp 
    248          zexcess  = ( zgrasratf/ ferat3 - zepshert ) / ( 1.0 - zepshert + rtrn) 
     325         zexcess  = ( zgrasratf/ feratm - zepshert ) / ( 1.0 - zepshert + rtrn) 
    249326         zbasresf = zbasresi * zexcess * zgrasratf 
    250327 
     
    254331         zgradont = (1. - unass2n) * zgraztotn - zepsherv * no3rat3 * zgraztotc - zbasresn 
    255332         zgradopt = (1. - unass2p) * zgraztotp - zepsherv * po4rat3 * zgraztotc - zbasresp 
    256          zgrareft = (1. - unass2c) * zgraztotf - zepsherv * ferat3 * zgraztotc - zbasresf 
    257          ztmp1   = ( 1. - epsher2 - unass2c ) /( 1. - 0.8 * epsher2 ) * ztortz 
    258          zgradoc = (zgradoct + ztmp1) * ssigma2 
    259          zgradon = (zgradont + no3rat3 * ztmp1) * ssigma2 
    260          zgradop = (zgradopt + po4rat3 * ztmp1) * ssigma2 
    261          zgratmp = 0.2 * epsher2 /( 1. - 0.8 * epsher2 ) * ztortz 
     333         zgrareft = (1. - unass2c) * zgraztotf - zepsherv * feratm * zgraztotc - zbasresf 
     334         ztmp1    = (1. - epsher2 - unass2c) /( 1. - epsher2 ) * ztortz 
     335 
     336         zgradoc(ji,jj,jk) = (zgradoct + ztmp1) * ssigma2 
     337         zgradon(ji,jj,jk) = (zgradont + no3rat3 * ztmp1) * ssigma2 
     338         zgradop(ji,jj,jk) = (zgradopt + po4rat3 * ztmp1) * ssigma2 
     339 
    262340 
    263341         !  Since only semilabile DOM is represented in PISCES 
     
    265343         !  as dissolved inorganic compounds (ssigma2) 
    266344         !  -------------------------------------------------- 
    267          zgrarem = zgratmp + ( zgradoct + ztmp1 ) * (1.0 - ssigma2) 
    268          zgraren = no3rat3 * zgratmp + ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2) 
    269          zgrarep = po4rat3 * zgratmp + ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2) 
    270          zgraref = zgrareft + ferat3 * ( ztmp1 + zgratmp ) 
     345         zgrarem(ji,jj,jk) = ( zgradoct + ztmp1 ) * (1.0 - ssigma2) 
     346         zgraren(ji,jj,jk) = ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2) 
     347         zgrarep(ji,jj,jk) = ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2) 
     348         zgraref(ji,jj,jk) = zgrareft + feratm * ztmp1 
    271349 
    272350         !   Defecation as a result of non assimilated products 
    273351         !   -------------------------------------------------- 
    274          zgrapoc  = zgraztotc * unass2c + unass2c / ( 1. - 0.8 * epsher2 ) * ztortz 
    275          zgrapon  = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - 0.8 * epsher2 ) * ztortz 
    276          zgrapop  = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - 0.8 * epsher2 ) * ztortz 
    277          zgrapof  = zgraztotf * unass2c + ferat3  * unass2c / ( 1. - 0.8 * epsher2 ) * ztortz 
     352         zgrapoc(ji,jj,jk)  = zgraztotc * unass2c + unass2c / ( 1. - epsher2 ) * ztortz 
     353         zgrapon(ji,jj,jk)  = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - epsher2 ) * ztortz 
     354         zgrapop(ji,jj,jk)  = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - epsher2 ) * ztortz 
     355         zgrapof(ji,jj,jk)  = zgraztotf * unass2c + feratm  * unass2c / ( 1. - epsher2 ) * ztortz 
    278356 
    279357         !  Addition of respiration to the release of inorganic nutrients 
    280358         !  ------------------------------------------------------------- 
    281          zgrarem = zgrarem + zbasresi + zrespirc 
    282          zgraren = zgraren + zbasresn + zrespirc * no3rat3 
    283          zgrarep = zgrarep + zbasresp + zrespirc * po4rat3 
    284          zgraref = zgraref + zbasresf + zrespirc * ferat3 
     359         zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) + zbasresi + zrespirc 
     360         zgraren(ji,jj,jk) = zgraren(ji,jj,jk) + zbasresn + zrespirc * no3rat3 
     361         zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) + zbasresp + zrespirc * po4rat3 
     362         zgraref(ji,jj,jk) = zgraref(ji,jj,jk) + zbasresf + zrespirc * feratm 
     363          
    285364 
    286365         !   Update the arrays TRA which contain the biological sources and 
    287366         !   sinks 
    288367         !   -------------------------------------------------------------- 
    289          tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarep  
    290          tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgraren 
    291          tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgradoc 
    292          ! 
    293          IF( ln_ligand ) THEN 
    294             tr(ji,jj,jk,jplgw,Krhs)  = tr(ji,jj,jk,jplgw,Krhs) + zgradoc * ldocz 
    295             zz2ligprod(ji,jj,jk) = zgradoc * ldocz 
    296          ENDIF 
    297          ! 
    298          tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zgradon 
    299          tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zgradop 
    300          tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem 
    301          tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref 
    302          zfezoo2(ji,jj,jk)   = zgraref 
    303          tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem 
    304          tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgraren 
    305368         tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) + zepsherv * zgraztotc - zrespirc   & 
    306369         &                     - ztortz - zgrazm 
     
    324387         tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zgrazpon - zgrazffnp + zfracn 
    325388         tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) - zgrazpop - zgrazffpp + zfracp 
    326          tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zgrazffeg + zgrapoc - zfracc 
    327          prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zgrapoc 
     389         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zgrazffeg - zfracc 
    328390         consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfracc 
    329          tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) - zgrazffng + zgrapon - zfracn 
    330          tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) - zgrazffpg + zgrapop - zfracp 
     391         tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) - zgrazffng - zfracn 
     392         tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) - zgrazffpg - zfracp 
    331393         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zgrazpof - zgrazfffp + zfracfe 
    332          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zgrazfffg + zgrapof - zfracfe 
     394         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zgrazfffg - zfracfe 
    333395         zfracal = tr(ji,jj,jk,jpcal,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) 
    334396         zgrazcal = zgrazffeg * (1. - part2) * zfracal 
    335397 
    336          !  calcite production 
    337          !  ------------------ 
     398         ! Calcite production 
     399         ! Calcite remineralization due to zooplankton activity 
     400         ! part2 of the ingested calcite is dissolving in the acidic gut 
     401         ! ------------------------------------------------------------- 
    338402         zprcaca = xfracal(ji,jj,jk) * zgraznc 
    339403         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 
     
    343407         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - zgrazcal + zprcaca 
    344408      END_3D 
     409 
     410 
     411      ! Computation of the effect of DVM by mesozooplankton 
     412      ! This part is only activated if ln_dvm_meso is set to true 
     413      ! The parameterization has been published in Gorgues et al. (2019). 
     414      ! ----------------------------------------------------------------- 
     415      IF( ln_dvm_meso ) THEN 
     416          ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) ) 
     417          ALLOCATE( zgramigrep(jpi,jpj), zgramigren(jpi,jpj), zgramigpop(jpi,jpj), zgramigpon(jpi,jpj) ) 
     418          ALLOCATE( zgramigdoc(jpi,jpj), zgramigdon(jpi,jpj), zgramigdop(jpi,jpj) ) 
     419          zgramigrem(:,:)  = 0.0   ;   zgramigref(:,:) = 0.0 
     420          zgramigrep(:,:)  = 0.0   ;   zgramigren(:,:) = 0.0 
     421          zgramigpoc(:,:)  = 0.0   ;   zgramigpof(:,:) = 0.0 
     422          zgramigpop(:,:)  = 0.0   ;   zgramigpon(:,:) = 0.0 
     423          zgramigdoc(:,:)  = 0.0   ;   zgramigdon(:,:) = 0.0 
     424          zgramigdop(:,:)  = 0.0    
     425                  
     426          ! Compute the amount of materials that will go into vertical migration 
     427          ! This fraction is sumed over the euphotic zone and is removed from  
     428          ! the fluxes driven by mesozooplankton in the euphotic zone. 
     429          ! -------------------------------------------------------------------- 
     430          DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     431             zmigreltime = (1. - strn(ji,jj)) 
     432             IF( gdept(ji,jj,jk,Kmm) <= heup(ji,jj) ) THEN 
     433                zmigthick  = e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * ( 1. - zmigreltime )  
     434                zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * zmigthick   
     435                zgramigrep(ji,jj) = zgramigrep(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * zmigthick 
     436                zgramigren(ji,jj) = zgramigren(ji,jj) + xfracmig * zgraren(ji,jj,jk) * zmigthick 
     437                zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * zmigthick 
     438                zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * zmigthick 
     439                zgramigpop(ji,jj) = zgramigpop(ji,jj) + xfracmig * zgrapop(ji,jj,jk) * zmigthick 
     440                zgramigpon(ji,jj) = zgramigpon(ji,jj) + xfracmig * zgrapon(ji,jj,jk) * zmigthick 
     441                zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * zmigthick 
     442                zgramigdoc(ji,jj) = zgramigdoc(ji,jj) + xfracmig * zgradoc(ji,jj,jk) * zmigthick 
     443                zgramigdop(ji,jj) = zgramigdop(ji,jj) + xfracmig * zgradop(ji,jj,jk) * zmigthick 
     444                zgramigdon(ji,jj) = zgramigdon(ji,jj) + xfracmig * zgradon(ji,jj,jk) * zmigthick 
     445 
     446                zgrarem(ji,jj,jk)  = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     447                zgrarep(ji,jj,jk)  = zgrarep(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     448                zgraren(ji,jj,jk)  = zgraren(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     449                zgraref(ji,jj,jk)  = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     450                zgrapoc(ji,jj,jk)  = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     451                zgrapop(ji,jj,jk)  = zgrapop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     452                zgrapon(ji,jj,jk)  = zgrapon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     453                zgrapof(ji,jj,jk)  = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     454                zgradoc(ji,jj,jk)  = zgradoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     455                zgradop(ji,jj,jk)  = zgradop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     456                zgradon(ji,jj,jk)  = zgradon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     457             ENDIF 
     458          END_3D 
     459 
     460          ! The inorganic and organic fluxes induced by migrating organisms are added at the  
     461          ! the migration depth (corresponding indice is set by kmig) 
     462          ! -------------------------------------------------------------------------------- 
     463          DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     464             IF( tmask(ji,jj,1) == 1. ) THEN 
     465                 jkt = kmig(ji,jj) 
     466                 zdep = 1. / e3t(ji,jj,jkt,Kmm) 
     467                 zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) * zdep  
     468                 zgrarep(ji,jj,jkt) = zgrarep(ji,jj,jkt) + zgramigrep(ji,jj) * zdep  
     469                 zgraren(ji,jj,jkt) = zgraren(ji,jj,jkt) + zgramigren(ji,jj) * zdep  
     470                 zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) * zdep  
     471                 zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) * zdep  
     472                 zgrapop(ji,jj,jkt) = zgrapop(ji,jj,jkt) + zgramigpop(ji,jj) * zdep  
     473                 zgrapon(ji,jj,jkt) = zgrapon(ji,jj,jkt) + zgramigpon(ji,jj) * zdep  
     474                 zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) * zdep  
     475                 zgradoc(ji,jj,jkt) = zgradoc(ji,jj,jkt) + zgramigdoc(ji,jj) * zdep 
     476                 zgradop(ji,jj,jkt) = zgradop(ji,jj,jkt) + zgramigdop(ji,jj) * zdep  
     477                 zgradon(ji,jj,jkt) = zgradon(ji,jj,jkt) + zgramigdon(ji,jj) * zdep  
     478              ENDIF 
     479          END_2D 
     480                   ! 
     481          ! Deallocate temporary variables 
     482          ! ------------------------------ 
     483          DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof ) 
     484          DEALLOCATE( zgramigrep, zgramigren, zgramigpop, zgramigpon ) 
     485          DEALLOCATE( zgramigdoc, zgramigdon, zgramigdop ) 
     486         ! End of the ln_dvm_meso part 
     487      ENDIF 
     488 
     489        !   Update the arrays TRA which contain the biological sources and sinks 
     490        !   This only concerns the variables which are affected by DVM (inorganic  
     491        !   nutrients, DOC agands, and particulate organic carbon).  
     492        !   --------------------------------------------------------------------- 
     493      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     494         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarep(ji,jj,jk)  
     495         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgraren(ji,jj,jk) 
     496         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgradoc(ji,jj,jk) 
     497         ! 
     498         IF( ln_ligand ) & 
     499           &  tr(ji,jj,jk,jplgw,Krhs)  = tr(ji,jj,jk,jplgw,Krhs) + zgradoc(ji,jj,jk) * ldocz 
     500         ! 
     501         tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zgradon(ji,jj,jk) 
     502         tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zgradop(ji,jj,jk) 
     503         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem(ji,jj,jk) 
     504         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref(ji,jj,jk) 
     505         zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk) 
     506         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem(ji,jj,jk) 
     507         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgraren(ji,jj,jk)                       
     508         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zgrapoc(ji,jj,jk) 
     509         prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk) + zgrapoc(ji,jj,jk) 
     510         tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) + zgrapon(ji,jj,jk) 
     511         tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + zgrapop(ji,jj,jk) 
     512         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zgrapof(ji,jj,jk) 
     513      END_3D 
    345514      ! 
    346515      IF( lk_iomput .AND. knt == nrdttrc ) THEN 
    347         CALL iom_put( "PCAL"  , prodcal(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  !  Calcite production  
    348         IF( iom_use("GRAZ2") ) THEN  !   Total grazing of phyto by zooplankton 
    349            zgrazing(:,:,jpk) = 0._wp ;  CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  
    350          ENDIF 
    351          IF( iom_use("FEZOO2") ) THEN   
    352            zfezoo2 (:,:,jpk) = 0._wp ; CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 
    353          ENDIF 
    354          IF( ln_ligand ) THEN 
    355             zz2ligprod(:,:,jpk) = 0._wp ; CALL iom_put( "LPRODZ2", zz2ligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  ) 
    356          ENDIF 
     516         CALL iom_put( "PCAL"  , prodcal(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  !  Calcite production  
     517         CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) ! Total grazing of phyto by zoo 
     518         CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 
     519         IF( ln_ligand ) & 
     520           & CALL iom_put( "LPRODZ2", zgradoc(:,:,:) * ldocz * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  ) 
    357521      ENDIF 
    358522      ! 
     
    374538      !! ** Purpose :   Initialization of mesozooplankton parameters 
    375539      !! 
    376       !! ** Method  :   Read the nampismes namelist and check the parameters 
     540      !! ** Method  :   Read the namp5zmes namelist and check the parameters 
    377541      !!      called at the first timestep (nittrc000) 
    378542      !! 
    379       !! ** input   :   Namelist nampismes 
     543      !! ** input   :   Namelist namp5zmes 
    380544      !! 
    381545      !!---------------------------------------------------------------------- 
    382       INTEGER :: ios                 ! Local integer output status for namelist read 
     546      INTEGER :: ios    ! Local integer output status for namelist read 
    383547      !! 
    384548      NAMELIST/namp5zmes/part2, bmetexc2, grazrat2, resrat2, mzrat2, xpref2c, xpref2n, xpref2z, & 
    385549         &                xpref2m, xpref2d, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & 
    386550         &                xthresh2mes, xthresh2, xkgraz2, epsher2, epsher2min, ssigma2, unass2c, & 
    387          &                unass2n, unass2p, srespir2, grazflux 
     551         &                unass2n, unass2p, srespir2, xsigma2, xsigma2del, grazflux, ln_dvm_meso, xfracmig 
    388552      !!---------------------------------------------------------------------- 
    389553      ! 
    390554      READ  ( numnatp_ref, namp5zmes, IOSTAT = ios, ERR = 901) 
    391 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismes in reference namelist' ) 
     555901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zmes in reference namelist' ) 
    392556      ! 
    393557      READ  ( numnatp_cfg, namp5zmes, IOSTAT = ios, ERR = 902 ) 
    394 902   IF( ios >  0 ) CALL ctl_nam ( ios , 'nampismes in configuration namelist' ) 
     558902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zmes in configuration namelist' ) 
    395559      IF(lwm) WRITE ( numonp, namp5zmes ) 
    396560      ! 
     
    424588         WRITE(numout,*) '    half sturation constant for grazing 2          xkgraz2     = ', xkgraz2 
    425589         WRITE(numout,*) '    Use excess carbon for respiration              bmetexc2    = ', bmetexc2 
     590         WRITE(numout,*) '      Width of the grazing window                     xsigma2     =', xsigma2 
     591         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigma2del  =', xsigma2del 
     592         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso 
     593         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig 
    426594      ENDIF 
    427595      ! 
    428596   END SUBROUTINE p5z_meso_init 
     597 
     598   SUBROUTINE p5z_meso_depmig( Kbb, Kmm ) 
     599      !!---------------------------------------------------------------------- 
     600      !!                  ***  ROUTINE p4z_meso_depmig  *** 
     601      !! 
     602      !! ** Purpose :   Computation the migration depth of mesozooplankton 
     603      !! 
     604      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen 
     605      !!      temperature and chlorophylle following the parameterization 
     606      !!      proposed by Bianchi et al. (2013) 
     607      !!---------------------------------------------------------------------- 
     608      INTEGER, INTENT(in)  ::  Kbb, kmm ! time level indices 
     609      ! 
     610      INTEGER  :: ji, jj, jk 
     611      ! 
     612      REAL(wp) :: ztotchl, z1dep 
     613      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy 
     614 
     615      !!--------------------------------------------------------------------- 
     616      ! 
     617      IF( ln_timing == 1 )  CALL timing_start('p5z_meso_zdepmig') 
     618      ! 
     619      oxymoy(:,:)  = 0. 
     620      tempmoy(:,:) = 0. 
     621      zdepmoy(:,:) = 0. 
     622      depmig (:,:) = 5. 
     623      kmig   (:,:) = 1 
     624      ! 
     625 
     626      ! Compute the averaged values of oxygen, temperature over the domain  
     627      ! 150m to 500 m depth. 
     628      ! ------------------------------------------------------------------ 
     629      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk ) 
     630         IF( tmask(ji,jj,jk) == 1.) THEN 
     631            IF( gdept(ji,jj,jk,Kmm) >= 150. .AND. gdept(ji,jj,jk,kmm) <= 500.) THEN 
     632               oxymoy(ji,jj)  = oxymoy(ji,jj)  + tr(ji,jj,jk,jpoxy,Kbb) * 1E6 * e3t(ji,jj,jk,Kmm) 
     633               tempmoy(ji,jj) = tempmoy(ji,jj) + ts(ji,jj,jk,jp_tem,kmm)      * e3t(ji,jj,jk,kmm) 
     634               zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t(ji,jj,jk,Kmm) 
     635            ENDIF 
     636         ENDIF 
     637      END_3D 
     638 
     639      ! Compute the difference between surface values and the mean values in the mesopelagic 
     640      ! domain 
     641      ! ------------------------------------------------------------------------------------ 
     642      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     643         z1dep = 1. / ( zdepmoy(ji,jj) + rtrn ) 
     644         oxymoy(ji,jj)  = tr(ji,jj,1,jpoxy,Kbb) * 1E6 - oxymoy(ji,jj)  * z1dep 
     645         tempmoy(ji,jj) = ts(ji,jj,1,jp_tem,Kmm)      - tempmoy(ji,jj) * z1dep 
     646      END_2D 
     647      ! 
     648      ! Computation of the migration depth based on the parameterization of  
     649      ! Bianchi et al. (2013) 
     650      ! ------------------------------------------------------------------- 
     651      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     652         IF( tmask(ji,jj,1) == 1. ) THEN 
     653            ztotchl = ( tr(ji,jj,1,jppch,Kbb) + tr(ji,jj,1,jpnch,Kbb) + tr(ji,jj,1,jpdch,Kbb) ) * 1E6 
     654            depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(ztotchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj) 
     655         ENDIF 
     656      END_2D 
     657 
     658            ! Computation of the corresponding jk indice  
     659      ! ------------------------------------------ 
     660      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
     661         IF( depmig(ji,jj) >= gdepw(ji,jj,jk,Kmm) .AND. depmig(ji,jj) < gdepw(ji,jj,jk+1,Kmm) ) THEN 
     662             kmig(ji,jj) = jk 
     663          ENDIF 
     664      END_3D 
     665      ! 
     666      ! Correction of the migration depth and indice based on O2 levels 
     667      ! If O2 is too low, imposing a migration depth at this low O2 levels 
     668      ! would lead to negative O2 concentrations (respiration while O2 is close 
     669      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so 
     670      ! that it falls above the OMZ 
     671      ! ----------------------------------------------------------------------- 
     672      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     673         IF( tr(ji,jj,kmig(ji,jj),jpoxy,Kbb) < 5E-6 ) THEN 
     674            DO jk = kmig(ji,jj),1,-1 
     675               IF( tr(ji,jj,jk,jpoxy,Kbb) >= 5E-6 .AND. tr(ji,jj,jk+1,jpoxy,Kbb)  < 5E-6) THEN 
     676                  kmig(ji,jj) = jk 
     677                  depmig(ji,jj) = gdept(ji,jj,jk,Kmm) 
     678               ENDIF 
     679            END DO 
     680         ENDIF 
     681      END_2D 
     682      ! 
     683      IF( ln_timing )   CALL timing_stop('p5z_meso_depmig') 
     684      ! 
     685   END SUBROUTINE p5z_meso_depmig 
     686 
     687   INTEGER FUNCTION p5z_meso_alloc() 
     688      !!---------------------------------------------------------------------- 
     689      !!                     ***  ROUTINE p5z_meso_alloc  *** 
     690      !!---------------------------------------------------------------------- 
     691      ! 
     692      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p5z_meso_alloc  ) 
     693      ! 
     694      IF( p5z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_meso_alloc : failed to allocate arrays.' ) 
     695      ! 
     696   END FUNCTION p5z_meso_alloc 
    429697 
    430698   !!====================================================================== 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p5zmicro.F90

    r15090 r15459  
    1515   USE trc             !  passive tracers common variables  
    1616   USE sms_pisces      !  PISCES Source Minus Sink variables 
    17    USE p4zlim 
     17   USE p4zlim          !  PISCES nutrient limitation term of PISCES std 
    1818   USE p5zlim          !  Phytoplankton limitation terms 
    1919   USE iom             !  I/O manager 
     
    5050   REAL(wp), PUBLIC ::  srespir     !: half sturation constant for grazing 1  
    5151   REAL(wp), PUBLIC ::  ssigma      !: Fraction excreted as semi-labile DOM 
     52   REAL(wp), PUBLIC ::  xsigma      !: Width of the grazing window 
     53   REAL(wp), PUBLIC ::  xsigmadel   !: Maximum additional width of the grazing window at low food density 
    5254   LOGICAL,  PUBLIC ::  bmetexc     !: Use of excess carbon for respiration 
    5355 
     
    7880      REAL(wp) :: zcompapi, zgraze  , zdenom, zfact, zfood, zfoodlim 
    7981      REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot 
    80       REAL(wp) :: zepsherf, zepshert, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi 
     82      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi 
    8183      REAL(wp) :: zgraztotc, zgraztotn, zgraztotp, zgraztotf, zbasresn, zbasresp, zbasresf 
    8284      REAL(wp) :: zgradoc, zgradon, zgradop, zgraref, zgradoct, zgradont, zgradopt, zgrareft 
     
    8890      REAL(wp) :: zgrazpc, zgrazpn, zgrazpp, zgrazpf, zbeta, zrfact2, zmetexcess 
    8991      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo, zzligprod 
     92      REAL(wp) :: zsigma, zdiffdn, zdiffpn, zdiffdp, zproport, zproport2 
    9093      CHARACTER (len=25) :: charout 
    9194      !!--------------------------------------------------------------------- 
     
    9396      IF( ln_timing )   CALL timing_start('p5z_micro') 
    9497      ! 
     98      ! Use of excess carbon for metabolism 
    9599      zmetexcess = 0.0 
    96100      IF ( bmetexc ) zmetexcess = 1.0 
     
    99103         zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - 1.e-9 ), 0.e0 ) 
    100104         zfact   = xstep * tgfunc2(ji,jj,jk) * zcompaz 
     105         ! Proportion of nano and diatoms that are within the size range 
     106         ! accessible to microzooplankton.  
     107         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 )) 
     108         zproport2 = sizen(ji,jj,jk)**(-0.48) 
     109         zproport2 = 1.0 
     110         !  linear mortality of mesozooplankton 
     111         !  A michaelis menten modulation term is used to avoid extinction of  
     112         !  microzooplankton at very low food concentrations. Mortality is  
     113         !  enhanced in low O2 waters 
     114         !  ----------------------------------------------------------------- 
    101115 
    102116         !   Michaelis-Menten mortality rates of microzooplankton 
     
    105119         &        + 3. * nitrfac(ji,jj,jk) ) 
    106120 
    107          !   Zooplankton mortality. A square function has been selected with 
    108          !   no real reason except that it seems to be more stable and may mimic predation. 
    109          !   ------------------------------------------------------------------------------ 
     121         !  Zooplankton quadratic mortality. A square function has been selected with 
     122         !  to mimic predation and disease (density dependent mortality). It also tends 
     123         !  to stabilise the model 
     124         !  ------------------------------------------------------------------------- 
    110125         ztortz = mzrat * 1.e6 * zfact * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) 
    111126 
    112127         !   Computation of the abundance of the preys 
    113128         !   A threshold can be specified in the namelist 
    114          !   -------------------------------------------- 
    115          zcompadi  = MIN( MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthreshdia ), 0.e0 ), xsizedia ) 
    116          zcompaph  = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthreshphy ), 0.e0 ) 
     129         !   Nanophyto and diatoms have a specific treatment with  
     130         !   teir preference decreasing with size. 
     131         !   -------------------------------------------------------- 
     132         zcompadi  = zproport  * MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthreshdia ), 0.e0 ) 
     133         zcompaph  = zproport2 * MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthreshphy ), 0.e0 ) 
    117134         zcompaz   = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthreshzoo ), 0.e0 ) 
    118135         zcompapi  = MAX( ( tr(ji,jj,jk,jppic,Kbb) - xthreshpic ), 0.e0 ) 
    119136         zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthreshpoc ), 0.e0 ) 
    120           
    121          !   Microzooplankton grazing 
    122          !   ------------------------ 
     137                
     138         ! Microzooplankton grazing 
     139         ! The total amount of food is the sum of all preys accessible to mesozooplankton  
     140         ! multiplied by their food preference 
     141         ! A threshold can be specified in the namelist (xthresh). However, when food  
     142         ! concentration is close to this threshold, it is decreased to avoid the  
     143         ! accumulation of food in the mesozoopelagic domain 
     144         ! ------------------------------------------------------------------------------- 
    123145         zfood     = xprefn * zcompaph + xprefc * zcompapoc + xprefd * zcompadi   & 
    124146         &           + xprefz * zcompaz + xprefp * zcompapi 
     
    127149         zgraze    = grazrat * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk))  
    128150 
    129          !   An active switching parameterization is used here. 
    130          !   We don't use the KTW parameterization proposed by  
    131          !   Vallina et al. because it tends to produce to steady biomass 
    132          !   composition and the variance of Chl is too low as it grazes 
    133          !   too strongly on winning organisms. Thus, instead of a square 
    134          !   a 1.5 power value is used which decreases the pressure on the 
    135          !   most abundant species 
    136          !   ------------------------------------------------------------   
    137          ztmp1 = xprefn * zcompaph**1.5 
    138          ztmp2 = xprefp * zcompapi**1.5 
    139          ztmp3 = xprefc * zcompapoc**1.5 
    140          ztmp4 = xprefd * zcompadi**1.5 
    141          ztmp5 = xprefz * zcompaz**1.5 
     151         ! An active switching parameterization is used here. 
     152         ! We don't use the KTW parameterization proposed by  
     153         ! Vallina et al. because it tends to produce too steady biomass 
     154         ! composition and the variance of Chl is too low as it grazes 
     155         ! too strongly on winning organisms. We use a generalized 
     156         ! switching parameterization proposed by Morozov and  
     157         ! Petrovskii (2013) 
     158         ! ------------------------------------------------------------   
     159         ! The width of the selection window is increased when preys 
     160         ! have low abundance, .i.e. zooplankton become less specific  
     161         ! to avoid starvation. 
     162         ! ---------------------------------------------------------- 
     163         zsigma = 1.0 - zdenom**3/(0.1**3+zdenom**3) 
     164         zsigma = xsigma + xsigmadel * zsigma 
     165         zdiffpn = exp( -ABS(log(0.7 * sizep(ji,jj,jk) / (3.0 * sizen(ji,jj,jk) + rtrn )) )**2 / zsigma**2 ) 
     166         zdiffdn = exp( -ABS(log(3.0 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2) 
     167         zdiffdp = exp( -ABS(log(0.7 * sizep(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2) 
     168         ztmp1 = xprefn * zcompaph * ( zcompaph + zdiffdn * zcompadi + zdiffpn * zcompapi ) / ( 1.0 + zdiffdn + zdiffpn ) 
     169         ztmp2 = xprefp * zcompapi * ( zcompapi + zdiffpn * zcompaph + zdiffdp * zcompadi ) / ( 1.0 + zdiffpn + zdiffdp ) 
     170         ztmp3 = xprefc * zcompapoc**2 
     171         ztmp4 = xprefd * zcompadi * ( zdiffdp * zcompapi + zdiffdn * zcompaph + zcompadi ) / ( 1.0 + zdiffdn + zdiffdp ) 
     172         ztmp5 = xprefz * zcompaz**2 
    142173         ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + ztmp5 + rtrn 
    143174         ztmp1 = ztmp1 / ztmptot 
     
    149180         !   Microzooplankton regular grazing on the different preys 
    150181         !   ------------------------------------------------------- 
     182               !   Nanophytoplankton 
    151183         zgraznc   = zgraze  * ztmp1  * zdenom 
    152184         zgraznn   = zgraznc * tr(ji,jj,jk,jpnph,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn) 
    153185         zgraznp   = zgraznc * tr(ji,jj,jk,jppph,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn) 
    154186         zgraznf   = zgraznc * tr(ji,jj,jk,jpnfe,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn) 
     187 
     188               ! Picophytoplankton 
    155189         zgrazpc   = zgraze  * ztmp2  * zdenom 
    156190         zgrazpn   = zgrazpc * tr(ji,jj,jk,jpnpi,Kbb) / (tr(ji,jj,jk,jppic,Kbb) + rtrn) 
    157191         zgrazpp   = zgrazpc * tr(ji,jj,jk,jpppi,Kbb) / (tr(ji,jj,jk,jppic,Kbb) + rtrn) 
    158192         zgrazpf   = zgrazpc * tr(ji,jj,jk,jppfe,Kbb) / (tr(ji,jj,jk,jppic,Kbb) + rtrn) 
     193 
     194               ! Microzooplankton 
    159195         zgrazz    = zgraze  * ztmp5   * zdenom 
     196 
     197               ! small POC 
    160198         zgrazpoc  = zgraze  * ztmp3   * zdenom 
    161199         zgrazpon  = zgrazpoc * tr(ji,jj,jk,jppon,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn ) 
    162200         zgrazpop  = zgrazpoc * tr(ji,jj,jk,jppop,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn ) 
    163201         zgrazpof  = zgrazpoc* tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
     202 
     203               ! Diatoms 
    164204         zgrazdc   = zgraze  * ztmp4  * zdenom 
    165205         zgrazdn   = zgrazdc * tr(ji,jj,jk,jpndi,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn) 
     
    167207         zgrazdf   = zgrazdc * tr(ji,jj,jk,jpdfe,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn) 
    168208         ! 
     209               ! Total ingestion rates in C, P, Fe, N 
    169210         zgraztotc = zgraznc + zgrazpoc + zgrazdc + zgrazz + zgrazpc 
    170211         zgraztotn = zgraznn + zgrazpn + zgrazpon + zgrazdn + zgrazz * no3rat3 
    171212         zgraztotp = zgraznp + zgrazpp + zgrazpop + zgrazdp + zgrazz * po4rat3 
    172          zgraztotf = zgraznf + zgrazpf + zgrazpof + zgrazdf + zgrazz * ferat3 
     213         zgraztotf = zgraznf + zgrazpf + zgrazpof + zgrazdf + zgrazz * feratz 
    173214         ! 
    174215         ! Grazing by microzooplankton 
     
    181222         zgrasratp =  (zgraztotp + rtrn) / ( zgraztotc + rtrn ) 
    182223 
    183          !   Growth efficiency is made a function of the quality  
    184          !   and the quantity of the preys 
    185          !   --------------------------------------------------- 
    186          zepshert  = MIN( 1., zgrasratn/ no3rat3, zgrasratp/ po4rat3, zgrasratf / ferat3) 
     224         ! Mesozooplankton efficiency.  
     225         ! We adopt a formulation proposed by Mitra et al. (2007) 
     226         ! The gross growth efficiency is controled by the most limiting nutrient. 
     227         ! Growth is also further decreased when the food quality is poor. This is currently 
     228         ! hard coded : it can be decreased by up to 50% (zepsherq) 
     229         ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and  
     230         ! Fulton, 2012) 
     231         ! ----------------------------------------------------------------------------------- 
     232         zepshert  = MIN( 1., zgrasratn/ no3rat3, zgrasratp/ po4rat3, zgrasratf / feratz) 
    187233         zbeta     = MAX( 0., (epsher - epshermin) ) 
     234         ! Food density deprivation of GGE 
    188235         zepsherf  = epshermin + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) 
    189          zepsherv  = zepsherf * zepshert 
    190  
    191          !   Respiration of microzooplankton 
    192          !   Excess carbon in the food is used preferentially 
    193          !   ------------------------------------------------ 
     236         ! Food quality deprivation of GGE 
     237         zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) 
     238         ! Actual GGE 
     239         zepsherv  = zepsherf * zepshert * zepsherq 
     240 
     241         ! Respiration of microzooplankton 
     242         ! Excess carbon in the food is used preferentially 
     243         ! when activated by zmetexcess 
     244         ! ------------------------------------------------ 
    194245         zexcess  = zgraztotc * zepsherf * (1.0 - zepshert) * zmetexcess 
    195246         zbasresb = MAX(0., zrespz - zexcess) 
     
    197248         zrespirc = srespir * zepsherv * zgraztotc + zbasresb 
    198249          
    199          !   When excess carbon is used, the other elements in excess 
    200          !   are also used proportionally to their abundance 
    201          !   -------------------------------------------------------- 
     250         ! When excess carbon is used, the other elements in excess 
     251         ! are also used proportionally to their abundance 
     252         ! -------------------------------------------------------- 
    202253         zexcess  = ( zgrasratn/ no3rat3 - zepshert ) / ( 1.0 - zepshert + rtrn) 
    203254         zbasresn = zbasresi * zexcess * zgrasratn  
    204255         zexcess  = ( zgrasratp/ po4rat3 - zepshert ) / ( 1.0 - zepshert + rtrn) 
    205256         zbasresp = zbasresi * zexcess * zgrasratp 
    206          zexcess  = ( zgrasratf/ ferat3 - zepshert ) / ( 1.0 - zepshert + rtrn) 
     257         zexcess  = ( zgrasratf/ feratz - zepshert ) / ( 1.0 - zepshert + rtrn) 
    207258         zbasresf = zbasresi * zexcess * zgrasratf 
    208259 
    209          !   Voiding of the excessive elements as DOM 
    210          !   ---------------------------------------- 
     260         ! Voiding of the excessive elements as DOM 
     261         ! ---------------------------------------- 
    211262         zgradoct   = (1. - unassc - zepsherv) * zgraztotc - zbasresi   
    212263         zgradont   = (1. - unassn) * zgraztotn - zepsherv * no3rat3 * zgraztotc - zbasresn 
    213264         zgradopt   = (1. - unassp) * zgraztotp - zepsherv * po4rat3 * zgraztotc - zbasresp 
    214          zgrareft   = (1. - unassc) * zgraztotf - zepsherv * ferat3 * zgraztotc - zbasresf 
    215  
    216          !  Since only semilabile DOM is represented in PISCES 
    217          !  part of DOM is in fact labile and is then released 
    218          !  as dissolved inorganic compounds (ssigma) 
    219          !  -------------------------------------------------- 
     265         zgrareft   = (1. - unassc) * zgraztotf - zepsherv * feratz * zgraztotc - zbasresf 
     266 
     267         ! Since only semilabile DOM is represented in PISCES 
     268         ! part of DOM is in fact labile and is then released 
     269         ! as dissolved inorganic compounds (ssigma) 
     270         ! -------------------------------------------------- 
    220271         zgradoc =  zgradoct * ssigma 
    221272         zgradon =  zgradont * ssigma 
     
    226277         zgraref = zgrareft 
    227278 
    228          !   Defecation as a result of non assimilated products 
    229          !   -------------------------------------------------- 
     279         ! Defecation as a result of non assimilated products 
     280         ! -------------------------------------------------- 
    230281         zgrapoc   = zgraztotc * unassc 
    231282         zgrapon   = zgraztotn * unassn 
     
    233284         zgrapof   = zgraztotf * unassc 
    234285 
    235          !  Addition of respiration to the release of inorganic nutrients 
    236          !  ------------------------------------------------------------- 
     286         ! Addition of respiration to the release of inorganic nutrients 
     287         ! ------------------------------------------------------------- 
    237288         zgrarem = zgrarem + zbasresi + zrespirc 
    238289         zgraren = zgraren + zbasresn + zrespirc * no3rat3 
    239290         zgrarep = zgrarep + zbasresp + zrespirc * po4rat3 
    240          zgraref = zgraref + zbasresf + zrespirc * ferat3 
     291         zgraref = zgraref + zbasresf + zrespirc * feratz 
    241292 
    242293         !   Update of the TRA arrays 
     
    279330         tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + no3rat3 * ztortz + zgrapon - zgrazpon 
    280331         tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + po4rat3 * ztortz + zgrapop - zgrazpop 
    281          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + ferat3 * ztortz  + zgrapof - zgrazpof 
     332         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + feratz * ztortz  + zgrapof - zgrazpof 
    282333         ! 
    283334         ! calcite production 
     
    287338         zprcaca = part * zprcaca 
    288339         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem - zprcaca 
    289          tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * zprcaca     & 
    290          &                     + rno3 * zgraren 
     340         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * zprcaca + rno3 * zgraren 
    291341         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) + zprcaca 
    292342      END_3D 
     
    321371      !! ** Purpose :   Initialization of microzooplankton parameters 
    322372      !! 
    323       !! ** Method  :   Read the nampiszoo namelist and check the parameters 
     373      !! ** Method  :   Read the namp5zzoo namelist and check the parameters 
    324374      !!                called at the first timestep (nittrc000) 
    325375      !! 
    326       !! ** input   :   Namelist nampiszoo 
     376      !! ** input   :   Namelist namp5zzoo 
    327377      !! 
    328378      !!---------------------------------------------------------------------- 
     
    332382         &                xprefp, xprefd, xprefz, xthreshdia, xthreshphy, & 
    333383         &                xthreshpic, xthreshpoc, xthreshzoo, xthresh, xkgraz, & 
    334          &                epsher, epshermin, ssigma, srespir, unassc, unassn, unassp 
     384         &                epsher, epshermin, ssigma, srespir, unassc, unassn, unassp,   & 
     385         &                xsigma, xsigmadel    
    335386      !!---------------------------------------------------------------------- 
    336387      ! 
     
    370421         WRITE(numout,*) '    half sturation constant for grazing 1           xkgraz      =', xkgraz 
    371422         WRITE(numout,*) '    Use of excess carbon for respiration            bmetexc     =', bmetexc 
     423         WRITE(numout,*) '      Width of the grazing window                     xsigma      =', xsigma 
     424         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigmadel   =', xsigmadel 
    372425      ENDIF 
    373426      ! 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p5zmort.F90

    r15090 r15459  
    22   !!====================================================================== 
    33   !!                         ***  MODULE p5zmort  *** 
    4    !! TOP :   PISCES Compute the mortality terms for phytoplankton 
     4   !! TOP :   PISCES-QUOTA Compute the mortality terms for phytoplankton 
    55   !!====================================================================== 
    66   !! History :   1.0  !  2002     (O. Aumont)  Original code 
     
    1414   USE trc             !  passive tracers common variables  
    1515   USE sms_pisces      !  PISCES Source Minus Sink variables 
    16    USE p4zlim 
    17    USE p5zlim          !  Phytoplankton limitation terms 
     16   USE p4zlim          !  Phytoplankton limitation terms (p4z) 
     17   USE p5zlim          !  Phytoplankton limitation terms (p5z) 
    1818   USE prtctl          !  print control for debugging 
    1919 
     
    2121   PRIVATE 
    2222 
    23    PUBLIC   p5z_mort     
    24    PUBLIC   p5z_mort_init     
     23   PUBLIC   p5z_mort           ! Called from p4zbio.F90  
     24   PUBLIC   p5z_mort_init      ! Called from trcini_pisces.F90  
    2525 
    2626   !! * Shared module variables 
    27    REAL(wp), PUBLIC :: wchln    !: 
    28    REAL(wp), PUBLIC :: wchlp   !: 
    29    REAL(wp), PUBLIC :: wchld   !: 
    30    REAL(wp), PUBLIC :: wchldm  !: 
    31    REAL(wp), PUBLIC :: mpratn   !: 
    32    REAL(wp), PUBLIC :: mpratp  !: 
    33    REAL(wp), PUBLIC :: mpratd  !: 
     27   REAL(wp), PUBLIC :: wchln   !! Quadratic mortality rate of nanophytoplankton 
     28   REAL(wp), PUBLIC :: wchlp   !: Quadratic mortality rate of picophytoplankton 
     29   REAL(wp), PUBLIC :: wchld   !: Quadratic mortality rate of diatoms 
     30   REAL(wp), PUBLIC :: mpratn  !: Linear mortality rate of nanophytoplankton 
     31   REAL(wp), PUBLIC :: mpratp  !: Linear mortality rate of picophytoplankton 
     32   REAL(wp), PUBLIC :: mpratd  !: Linear mortality rate of diatoms 
    3433 
    3534   !! * Substitutions 
     
    4746      !!                     ***  ROUTINE p5z_mort  *** 
    4847      !! 
    49       !! ** Purpose :   Calls the different subroutine to initialize and compute 
     48      !! ** Purpose :   Calls the different subroutine to compute 
    5049      !!                the different phytoplankton mortality terms 
    5150      !! 
     
    5655      !!--------------------------------------------------------------------- 
    5756 
    58       CALL p5z_nano( Kbb, Krhs )            ! nanophytoplankton 
    59       CALL p5z_pico( Kbb, Krhs )            ! picophytoplankton 
    60       CALL p5z_diat( Kbb, Krhs )            ! diatoms 
     57      CALL p5z_mort_nano( Kbb, Krhs )            ! nanophytoplankton 
     58      CALL p5z_mort_pico( Kbb, Krhs )            ! picophytoplankton 
     59      CALL p5z_mort_diat( Kbb, Krhs )            ! diatoms 
    6160 
    6261   END SUBROUTINE p5z_mort 
    6362 
    6463 
    65    SUBROUTINE p5z_nano( Kbb, Krhs ) 
    66       !!--------------------------------------------------------------------- 
    67       !!                     ***  ROUTINE p5z_nano  *** 
     64   SUBROUTINE p5z_mort_nano( Kbb, Krhs ) 
     65      !!--------------------------------------------------------------------- 
     66      !!                     ***  ROUTINE p5z_mort_nano  *** 
    6867      !! 
    6968      !! ** Purpose :   Compute the mortality terms for nanophytoplankton 
    7069      !! 
    71       !! ** Method  : - ??? 
     70      !! ** Method  : - Both quadratic and simili linear mortality terms 
    7271      !!--------------------------------------------------------------------- 
    7372      INTEGER, INTENT(in) ::   Kbb, Krhs  ! time level indices 
    7473      INTEGER  :: ji, jj, jk 
    75       REAL(wp) :: zcompaph 
     74      REAL(wp) :: zcompaph, zlim1, zlim2 
    7675      REAL(wp) :: zfactfe, zfactch, zfactn, zfactp, zprcaca 
    7776      REAL(wp) :: ztortp , zrespp , zmortp 
     
    7978      !!--------------------------------------------------------------------- 
    8079      ! 
    81       IF( ln_timing )   CALL timing_start('p5z_nano') 
     80      IF( ln_timing )   CALL timing_start('p5z_mort_nano') 
    8281      ! 
    8382      prodcal(:,:,:) = 0.  !: calcite production variable set to zero 
    8483      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    8584         zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - 1e-9 ), 0.e0 ) 
    86          !   Squared mortality of Phyto similar to a sedimentation term during 
    87          !   blooms (Doney et al. 1996) 
    88          !   ----------------------------------------------------------------- 
    89          zrespp = wchln * 1.e6 * xstep * xdiss(ji,jj,jk) * zcompaph * tr(ji,jj,jk,jpphy,Kbb) 
    90  
    91          !   Phytoplankton linear mortality 
    92          !   ------------------------------ 
    93          ztortp = mpratn * xstep  * zcompaph 
     85 
     86         ! Quadratic mortality of nano due to aggregation during 
     87         ! blooms (Doney et al. 1996) 
     88         ! ----------------------------------------------------- 
     89         zlim2   = xlimphy(ji,jj,jk) * xlimphy(ji,jj,jk) 
     90         zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) * tr(ji,jj,jk,jpphy,Kbb) 
     91         zrespp = wchln * 1.e6 * xstep * zlim1 * xdiss(ji,jj,jk) * zcompaph 
     92 
     93         ! Phytoplankton linear mortality 
     94         ! A michaelis-menten like term is introduced to avoid  
     95         ! extinction of nanophyto in highly limited areas 
     96         ! ---------------------------------------------------- 
     97         ztortp = mpratn * xstep * zcompaph * tr(ji,jj,jk,jpphy,Kbb) / ( xkmort + tr(ji,jj,jk,jpphy,Kbb) ) 
    9498         zmortp = zrespp + ztortp 
    9599 
    96100         !   Update the arrays TRA which contains the biological sources and sinks 
    97  
    98101         zfactn  = tr(ji,jj,jk,jpnph,Kbb)/(tr(ji,jj,jk,jpphy,Kbb)+rtrn) 
    99102         zfactp  = tr(ji,jj,jk,jppph,Kbb)/(tr(ji,jj,jk,jpphy,Kbb)+rtrn) 
     
    105108         tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) - zmortp * zfactch 
    106109         tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zmortp * zfactfe 
     110 
     111                       ! Production PIC particles due to mortality 
    107112         zprcaca = xfracal(ji,jj,jk) * zmortp 
    108          ! 
    109113         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 
    110114         ! 
     
    125129       ENDIF 
    126130      ! 
    127       IF( ln_timing )   CALL timing_stop('p5z_nano') 
    128       ! 
    129    END SUBROUTINE p5z_nano 
    130  
    131  
    132    SUBROUTINE p5z_pico( Kbb, Krhs ) 
    133       !!--------------------------------------------------------------------- 
    134       !!                     ***  ROUTINE p5z_pico  *** 
     131      IF( ln_timing )   CALL timing_stop('p5z_mort_nano') 
     132      ! 
     133   END SUBROUTINE p5z_mort_nano 
     134 
     135 
     136   SUBROUTINE p5z_mort_pico( Kbb, Krhs ) 
     137      !!--------------------------------------------------------------------- 
     138      !!                     ***  ROUTINE p5z_mort_pico  *** 
    135139      !! 
    136140      !! ** Purpose :   Compute the mortality terms for picophytoplankton 
    137141      !! 
    138       !! ** Method  : - ??? 
     142      !! ** Method  : - Both quadratic and semilininear terms are used 
    139143      !!--------------------------------------------------------------------- 
    140144      INTEGER, INTENT(in) ::   Kbb, Krhs  ! time level indices 
    141145      INTEGER  :: ji, jj, jk 
    142       REAL(wp) :: zcompaph 
     146      REAL(wp) :: zcompaph, zlim1, zlim2 
    143147      REAL(wp) :: zfactfe, zfactch, zfactn, zfactp 
    144148      REAL(wp) :: ztortp , zrespp , zmortp  
     
    146150      !!--------------------------------------------------------------------- 
    147151      ! 
    148       IF( ln_timing )   CALL timing_start('p5z_pico') 
     152      IF( ln_timing )   CALL timing_start('p5z_mort_pico') 
    149153      ! 
    150154      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    151155         zcompaph = MAX( ( tr(ji,jj,jk,jppic,Kbb) - 1e-9 ), 0.e0 ) 
    152          !  Squared mortality of Phyto similar to a sedimentation term during 
    153          !  blooms (Doney et al. 1996) 
    154          !  ----------------------------------------------------------------- 
    155          zrespp = wchlp * 1.e6 * xstep * xdiss(ji,jj,jk) * zcompaph * tr(ji,jj,jk,jppic,Kbb) 
    156  
    157          !     Phytoplankton mortality  
    158          ztortp = mpratp * xstep  * zcompaph 
     156 
     157         ! Quadratic mortality of pico due to aggregation during 
     158         ! blooms (Doney et al. 1996) 
     159         ! ----------------------------------------------------- 
     160         zlim2   = xlimpic(ji,jj,jk) * xlimpic(ji,jj,jk) 
     161         zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 ) * tr(ji,jj,jk,jppic,Kbb) 
     162         zrespp = wchlp * 1.e6 * xstep * zlim1 * xdiss(ji,jj,jk) * zcompaph 
     163 
     164         ! Phytoplankton linear mortality 
     165         ! A michaelis-menten like term is introduced to avoid  
     166         ! extinction of picophyto in highly limited areas 
     167         ! ---------------------------------------------------- 
     168         ztortp = mpratp * xstep  * zcompaph * tr(ji,jj,jk,jppic,Kbb) /  ( xkmort + tr(ji,jj,jk,jppic,Kbb) ) 
    159169         zmortp = zrespp + ztortp 
    160170 
    161171         !   Update the arrays TRA which contains the biological sources and sinks 
    162  
    163172         zfactn = tr(ji,jj,jk,jpnpi,Kbb)/(tr(ji,jj,jk,jppic,Kbb)+rtrn) 
    164173         zfactp = tr(ji,jj,jk,jpppi,Kbb)/(tr(ji,jj,jk,jppic,Kbb)+rtrn) 
     
    183192       ENDIF 
    184193      ! 
    185       IF( ln_timing )   CALL timing_stop('p5z_pico') 
    186       ! 
    187    END SUBROUTINE p5z_pico 
    188  
    189  
    190    SUBROUTINE p5z_diat( Kbb, Krhs ) 
    191       !!--------------------------------------------------------------------- 
    192       !!                     ***  ROUTINE p5z_diat  *** 
     194      IF( ln_timing )   CALL timing_stop('p5z_mort_pico') 
     195      ! 
     196   END SUBROUTINE p5z_mort_pico 
     197 
     198 
     199   SUBROUTINE p5z_mort_diat( Kbb, Krhs ) 
     200      !!--------------------------------------------------------------------- 
     201      !!                     ***  ROUTINE p5z_mort_diat  *** 
    193202      !! 
    194203      !! ** Purpose :   Compute the mortality terms for diatoms 
     
    204213      !!--------------------------------------------------------------------- 
    205214      ! 
    206       IF( ln_timing )   CALL timing_start('p5z_diat') 
     215      IF( ln_timing )   CALL timing_start('p5z_mort_diat') 
    207216      ! 
    208217 
     
    219228         zlim2   = xlimdia(ji,jj,jk) * xlimdia(ji,jj,jk) 
    220229         zlim1   = 0.25 * ( 1. - zlim2 ) / ( 0.25 + zlim2 )  
    221          zrespp2 = 1.e6 * xstep * (  wchld + wchldm * zlim1 ) * xdiss(ji,jj,jk) * zcompadi * tr(ji,jj,jk,jpdia,Kbb) 
    222  
    223          !  Phytoplankton linear mortality  
    224          !  ------------------------------ 
    225          ztortp2 = mpratd * xstep  * zcompadi 
     230         zrespp2 = 1.e6 * xstep * wchld * zlim1 * xdiss(ji,jj,jk) * zcompadi * tr(ji,jj,jk,jpdia,Kbb) 
     231 
     232         ! Phytoplankton linear mortality 
     233         ! A michaelis-menten like term is introduced to avoid  
     234         ! extinction of diatoms in highly limited areas 
     235         !  --------------------------------------------------- 
     236         ztortp2 = mpratd * xstep  * zcompadi * tr(ji,jj,jk,jpdia,Kbb) /  ( xkmort + tr(ji,jj,jk,jpdia,Kbb) ) 
    226237         zmortp2 = zrespp2 + ztortp2 
    227238 
     
    250261         prodpoc(ji,jj,jk)   = prodpoc(ji,jj,jk) + ztortp2 
    251262         prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk) + zrespp2 
     263 
    252264      END_3D 
    253265      ! 
     
    258270      ENDIF 
    259271      ! 
    260       IF( ln_timing )   CALL timing_stop('p5z_diat') 
    261       ! 
    262    END SUBROUTINE p5z_diat 
     272      IF( ln_timing )   CALL timing_stop('p5z_mort_diat') 
     273      ! 
     274   END SUBROUTINE p5z_mort_diat 
    263275 
    264276 
     
    267279      !!                  ***  ROUTINE p5z_mort_init  *** 
    268280      !! 
    269       !! ** Purpose :   Initialization of phytoplankton parameters 
    270       !! 
    271       !! ** Method  :   Read the nampismort namelist and check the parameters 
     281      !! ** Purpose :   Initialization of phytoplankton mortality parameters 
     282      !! 
     283      !! ** Method  :   Read the namp5zmort namelist and check the parameters 
    272284      !!      called at the first timestep 
    273285      !! 
    274       !! ** input   :   Namelist nampismort 
     286      !! ** input   :   Namelist namp5zmort 
    275287      !! 
    276288      !!---------------------------------------------------------------------- 
    277       INTEGER :: ios                 ! Local integer output status for namelist read 
    278       !! 
    279       NAMELIST/namp5zmort/ wchln, wchlp, wchld, wchldm, mpratn, mpratp, mpratd 
     289      INTEGER :: ios   ! Local integer output status for namelist read 
     290      !! 
     291      NAMELIST/namp5zmort/ wchln, wchlp, wchld, mpratn, mpratp, mpratd 
    280292      !!---------------------------------------------------------------------- 
    281293 
     
    294306         WRITE(numout,*) '    quadratic mortality of picophyto.         wchlp     =', wchlp 
    295307         WRITE(numout,*) '    quadratic mortality of diatoms            wchld     =', wchld 
    296          WRITE(numout,*) '    Additional quadratic mortality of diatoms wchldm    =', wchldm 
    297308         WRITE(numout,*) '    nanophyto. mortality rate                 mpratn    =', mpratn 
    298309         WRITE(numout,*) '    picophyto. mortality rate                 mpratp    =', mpratp 
  • NEMO/trunk/src/TOP/PISCES/P4Z/p5zprod.F90

    r15090 r15459  
    22   !!====================================================================== 
    33   !!                         ***  MODULE p5zprod  *** 
    4    !! TOP :  Growth Rate of the two phytoplanktons groups  
     4   !! TOP :  Growth Rate of the three phytoplanktons groups  
     5   !!        PISCES-QUOTA version of the module 
    56   !!====================================================================== 
    67   !! History :   1.0  !  2004     (O. Aumont) Original code 
     
    2930 
    3031   !! * Shared module variables 
    31    REAL(wp), PUBLIC ::  pislopen        !: 
    32    REAL(wp), PUBLIC ::  pislopep        !: 
    33    REAL(wp), PUBLIC ::  pisloped        !: 
    34    REAL(wp), PUBLIC ::  xadap           !: 
    35    REAL(wp), PUBLIC ::  excretn         !: 
    36    REAL(wp), PUBLIC ::  excretp         !: 
    37    REAL(wp), PUBLIC ::  excretd         !: 
    38    REAL(wp), PUBLIC ::  bresp           !: 
    39    REAL(wp), PUBLIC ::  thetanpm        !: 
    40    REAL(wp), PUBLIC ::  thetannm        !: 
    41    REAL(wp), PUBLIC ::  thetandm        !: 
    42    REAL(wp), PUBLIC ::  chlcmin         !: 
    43    REAL(wp), PUBLIC ::  grosip          !: 
    44  
    45    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   zdaylen 
     32   REAL(wp), PUBLIC ::  pislopen        !: P-I slope of nanophytoplankton 
     33   REAL(wp), PUBLIC ::  pislopep        !: P-I slope of picophytoplankton 
     34   REAL(wp), PUBLIC ::  pisloped        !: P-I slope of diatoms 
     35   REAL(wp), PUBLIC ::  xadap           !: Adaptation factor to low light 
     36   REAL(wp), PUBLIC ::  excretn         !: Excretion ratio of nanophyto 
     37   REAL(wp), PUBLIC ::  excretp         !: Excretion ratio of picophyto 
     38   REAL(wp), PUBLIC ::  excretd         !: Excretion ratio of diatoms 
     39   REAL(wp), PUBLIC ::  bresp           !: Basal respiration rate 
     40   REAL(wp), PUBLIC ::  thetanpm        !: Maximum Chl/N ratio of picophyto 
     41   REAL(wp), PUBLIC ::  thetannm        !: Maximum Chl/N ratio of nanophyto 
     42   REAL(wp), PUBLIC ::  thetandm        !: Maximum Chl/N ratio of diatoms 
     43   REAL(wp), PUBLIC ::  chlcmin         !: Minimum Chl/C ratio of phytoplankton 
     44   REAL(wp), PUBLIC ::  grosip          !: Mean Si/C ratio of diatoms 
     45 
     46   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   zdaylen ! day length 
    4647    
    4748   REAL(wp) :: r1_rday                !: 1 / rday 
    48    REAL(wp) :: texcretn               !: 1 - excret  
     49   REAL(wp) :: texcretn               !: 1 - excretn  
    4950   REAL(wp) :: texcretp               !: 1 - excretp  
    50    REAL(wp) :: texcretd               !: 1 - excret2         
     51   REAL(wp) :: texcretd               !: 1 - excretd         
    5152 
    5253   !! * Substitutions 
     
    6667      !! ** Purpose :   Compute the phytoplankton production depending on 
    6768      !!              light, temperature and nutrient availability 
    68       !! 
    69       !! ** Method  : - ??? 
     69      !!              Computes also the uptake of nutrients. PISCES-quota 
     70      !!              relies on a full quota formalism 
    7071      !!--------------------------------------------------------------------- 
    7172      ! 
     
    7576      INTEGER  ::   ji, jj, jk 
    7677      REAL(wp) ::   zsilfac, znanotot, zpicotot, zdiattot, zconctemp, zconctemp2 
    77       REAL(wp) ::   zration, zratiop, zratiof, zmax, zmax2, zsilim, ztn, zadap 
    78       REAL(wp) ::   zpronmax, zpropmax, zprofmax, zrat 
     78      REAL(wp) ::   zration, zratiop, zratiof, zmax, ztn, zadap 
     79      REAL(wp) ::   zpronmax, zpropmax, zprofmax, zratio 
    7980      REAL(wp) ::   zlim, zsilfac2, zsiborn, zprod, zprontot, zproptot, zprodtot 
    80       REAL(wp) ::   zprnutmax, zdocprod, zprochln, zprochld, zprochlp 
    81       REAL(wp) ::   zpislopen, zpislopep, zpisloped, thetannm_n, thetandm_n, thetanpm_n 
    82       REAL(wp) ::   zrum, zcodel, zargu, zval, zfeup 
    83       REAL(wp) ::   zfact, zrfact2 
     81      REAL(wp) ::   zproddoc, zproddon, zproddop, zprodsil, zprodfer, zprodlig, zresptot      
     82      REAL(wp) ::   zprnutmax, zprochln, zprochld, zprochlp 
     83      REAL(wp) ::   zpislopen, zpislopep, zpisloped 
     84      REAL(wp) ::   zval, zpptot, zpnewtot, zpregtot 
     85      REAL(wp) ::   zqfpmax, zqfnmax, zqfdmax 
     86      REAL(wp) ::   zfact, zrfact2, zmaxsi, zratiosi, zsizetmp, zlimfac, zsilim 
    8487      CHARACTER (len=25) :: charout 
    85       REAL(wp), DIMENSION(jpi,jpj    ) :: zmixnano, zmixpico, zmixdiat, zstrn 
     88      REAL(wp), DIMENSION(jpi,jpj    ) :: zmixnano, zmixpico, zmixdiat 
    8689      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpislopeadn, zpislopeadp, zpislopeadd 
    8790      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprnut, zprmaxp, zprmaxn, zprmaxd 
     
    9598      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprodopn, zprodopp, zprodopd 
    9699      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrespn, zrespp, zrespd 
    97       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zcroissn, zcroissp, zcroissd 
    98100      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxl_fac, zmxl_chl 
    99       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpligprod1, zpligprod2 
     101      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zpligprod 
    100102      !!--------------------------------------------------------------------- 
    101103      ! 
    102104      IF( ln_timing )   CALL timing_start('p5z_prod') 
    103       ! 
     105 
     106      ! Initialize the local arrays 
    104107      zprorcan(:,:,:) = 0._wp ; zprorcap(:,:,:) = 0._wp ; zprorcad(:,:,:) = 0._wp 
    105       zcroissn(:,:,:) = 0._wp ; zcroissp(:,:,:) = 0._wp ; zcroissd(:,:,:) = 0._wp 
    106108      zprofed (:,:,:) = 0._wp ; zprofep (:,:,:) = 0._wp ; zprofen (:,:,:) = 0._wp 
    107109      zpronewn(:,:,:) = 0._wp ; zpronewp(:,:,:) = 0._wp ; zpronewd(:,:,:) = 0._wp 
     
    112114      zysopt  (:,:,:) = 0._wp  
    113115      zrespn  (:,:,:) = 0._wp ; zrespp  (:,:,:) = 0._wp ; zrespd  (:,:,:) = 0._wp  
    114  
    115       ! Computation of the optimal production 
    116       zprnut (:,:,:) = 0.65_wp * r1_rday * tgfunc(:,:,:) 
    117       zprmaxn(:,:,:) = ( 0.65_wp * (1. + zpsino3 * qnpmax ) ) * r1_rday * tgfunc(:,:,:) 
    118       zprmaxp(:,:,:) = 0.5 / 0.65 * zprmaxn(:,:,:)  
    119       zprmaxd(:,:,:) = zprmaxn(:,:,:)  
    120  
    121       ! compute the day length depending on latitude and the day 
    122       zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp ) 
    123       zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  ) 
    124  
    125       ! day length in hours 
    126       zstrn(:,:) = 0. 
    127       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    128          zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad ) 
    129          zargu = MAX( -1., MIN(  1., zargu ) ) 
    130          zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. ) 
    131       END_2D 
    132  
    133          ! Impact of the day duration on phytoplankton growth 
    134       DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    135          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    136             zval = MAX( 1., zstrn(ji,jj) ) 
    137             IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN 
    138                zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) 
     116      zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp 
     117 
     118      ! Computation of the optimal production rates and nutrient uptake 
     119      ! rates. Based on a Q10 description of the thermal dependency. 
     120      zprnut (:,:,:) =  0.8_wp * r1_rday * tgfunc(:,:,:) 
     121      zprmaxn(:,:,:) =  0.8_wp * (1. + xpsino3 * qnnmax ) * r1_rday * tgfunc(:,:,:) 
     122      zprmaxd(:,:,:) =  0.8_wp * (1. + xpsino3 * qndmax ) * r1_rday * tgfunc(:,:,:) 
     123      zprmaxp(:,:,:) =  0.6_wp * (1. + xpsino3 * qnpmax ) * r1_rday * tgfunc(:,:,:) 
     124 
     125      ! Impact of the day duration and light intermittency on phytoplankton growth 
     126      ! Intermittency is supposed to have a similar effect on production as  
     127      ! day length (Shatwell et al., 2012). The correcting factor is zmxl_fac.  
     128      ! zmxl_chl is the fractional day length and is used to compute the mean 
     129      ! PAR during daytime. The effect of mixing is computed using the  
     130      ! absolute light level definition of the euphotic zone 
     131      ! -------------------------------------------------------------------------  
     132 
     133      IF ( ln_p4z_dcyc ) THEN    ! Diurnal cycle in PISCES 
     134 
     135         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     136            IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     137               IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN 
     138                  zval = MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) 
     139               ENDIF 
     140               zmxl_chl(ji,jj,jk) = zval / 24. 
     141               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval ) 
    139142            ENDIF 
    140             zmxl_chl(ji,jj,jk) = zval / 24. 
    141             zmxl_fac(ji,jj,jk) = 1.5 * zval / ( 12. + zval ) 
    142          ENDIF 
    143       END_3D 
     143         END_3D 
     144 
     145      ELSE ! No diurnal cycle in PISCES 
     146 
     147         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     148            IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     149               zval = MAX( 1., strn(ji,jj) ) 
     150               IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN 
     151                  zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) 
     152               ENDIF 
     153               zmxl_chl(ji,jj,jk) = zval / 24. 
     154               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval ) 
     155            ENDIF 
     156         END_3D 
     157 
     158      ENDIF 
    144159 
    145160      zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:) 
     
    147162      zprpic(:,:,:) = zprmaxp(:,:,:) * zmxl_fac(:,:,:) 
    148163 
    149  
    150164      ! Maximum light intensity 
    151       zdaylen(:,:) = MAX(1., zstrn(:,:)) / 24. 
    152       WHERE( zstrn(:,:) < 1.e0 ) zstrn(:,:) = 24. 
    153  
     165      zdaylen(:,:) = MAX(1., strn(:,:)) / 24. 
     166 
     167      ! Computation of the P-I slope for nanos, picos and diatoms 
     168      ! The formulation proposed by Geider et al. (1997) has been used. 
    154169      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    155170         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     
    158173            zadap       = xadap * ztn / ( 2.+ ztn ) 
    159174            ! 
     175            ! Nanophytoplankton 
    160176            zpislopeadn(ji,jj,jk) = pislopen * tr(ji,jj,jk,jpnch,Kbb)    & 
    161177            &                       /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn) 
     178 
     179            ! Picophytoplankton 
    162180            zpislopeadp(ji,jj,jk) = pislopep * ( 1. + zadap * EXP( -0.25 * epico(ji,jj,jk) ) )   & 
    163181            &                       * tr(ji,jj,jk,jppch,Kbb) /( tr(ji,jj,jk,jppic,Kbb) * 12. + rtrn) 
     182 
     183            ! Diatoms 
    164184            zpislopeadd(ji,jj,jk) = pisloped * tr(ji,jj,jk,jpdch,Kbb)    & 
    165185               &                    /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn) 
     
    170190 
    171191            ! Computation of production function for Carbon 
     192            ! Actual light levels are used here  
    172193            !  --------------------------------------------- 
    173             zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) )  ) 
    174             zprpic(ji,jj,jk) = zprpic(ji,jj,jk) * ( 1.- EXP( -zpislopep * epico(ji,jj,jk) )  ) 
    175             zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) )  ) 
    176  
    177             ! Computation of production function for Chlorophyll 
    178             !  ------------------------------------------------- 
     194            zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) / zmxl_fac(ji,jj,jk) )  ) 
     195            zprpic(ji,jj,jk) = zprpic(ji,jj,jk) * ( 1.- EXP( -zpislopep * epico(ji,jj,jk) / zmxl_fac(ji,jj,jk) )  ) 
     196            zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) / zmxl_fac(ji,jj,jk) )  ) 
     197 
     198            !  Computation of production function for Chlorophyll 
     199            !  Mean light level in the mixed layer (when appropriate) 
     200            !  is used here (acclimation is in general slower than  
     201            !  the characteristic time scales of vertical mixing) 
     202            !  ------------------------------------------------------ 
    179203            zpislopen = zpislopen * zmxl_fac(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    180204            zpisloped = zpisloped * zmxl_fac(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
     
    187211 
    188212      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    189  
    190213          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    191             !    Si/C of diatoms 
    192             !    ------------------------ 
    193             !    Si/C increases with iron stress and silicate availability 
    194             !    Si/C is arbitrariliy increased for very high Si concentrations 
    195             !    to mimic the very high ratios observed in the Southern Ocean (silpot2) 
     214            ! Si/C of diatoms 
     215            ! ------------------------ 
     216            ! Si/C increases with iron stress and silicate availability (zsilfac) 
     217            ! Si/C is arbitrariliy increased for very high Si concentrations 
     218            ! to mimic the very high ratios observed in the Southern Ocean (zsilfac2) 
     219            ! A parameterization derived from Flynn (2003) is used for the control 
     220            ! when Si is not limiting which is similar to the parameterisation 
     221            ! proposed by Gurney and Davidson (1999). 
     222            ! ----------------------------------------------------------------------- 
    196223            zlim  = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi1 ) 
    197             zsilim = MIN( zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ), xlimsi(ji,jj,jk) ) 
    198             zsilfac = 3.4 * EXP( -4.23 * zsilim ) * MAX( 0.e0, MIN( 1., 2.2 * ( zlim - 0.5 ) )  ) + 1.e0 
     224            zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) 
    199225            zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) 
    200226            IF (gphit(ji,jj) < -30 ) THEN 
    201               zsilfac2 = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 ) 
     227              zsilfac2 = 1. + 1. * zsiborn / ( zsiborn + xksi2**3 ) 
    202228            ELSE 
    203               zsilfac2 = 1. +      zsiborn / ( zsiborn + xksi2**3 ) 
     229              zsilfac2 = 1. 
    204230            ENDIF 
    205             zysopt(ji,jj,jk) = grosip * zlim * zsilfac * zsilfac2 
    206         ENDIF 
    207       END_3D 
    208  
    209       !  Sea-ice effect on production                                                                                
     231            zratiosi = 1.0 - tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) / ( zsilfac2 * grosip * 3.0 + rtrn ) 
     232            zratiosi = MAX(0., MIN(1.0, zratiosi) ) 
     233            zmaxsi  = (1.0 + 0.1**4) * zratiosi**4 / ( zratiosi**4 + 0.1**4 ) 
     234            IF ( xlimsi(ji,jj,jk) /= xlimdia(ji,jj,jk) ) THEN 
     235               zysopt(ji,jj,jk) = zlim * zsilfac2 * grosip * 1.0 * zmaxsi 
     236            ELSE 
     237               zysopt(ji,jj,jk) = zlim * zsilfac2 * grosip * 1.0 * zsilim**0.7 * zmaxsi 
     238            ENDIF 
     239         ENDIF 
     240      END_3D 
     241 
     242      !  Sea-ice effect on production 
     243      ! No production is assumed below sea ice 
     244      ! --------------------------------------  
    210245      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    211246         zprbio(ji,jj,jk)  = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) 
     
    215250      END_3D 
    216251 
    217       ! Computation of the various production terms of nanophytoplankton  
     252      ! Computation of the various production and uptake terms of nanophytoplankton  
     253      ! Interactions between N and P are modeled according to the Chain Model  
     254      ! of Pahlow et al. (2009). Iron uptake is modeled following traditional 
     255      ! Droop kinetics. When the quota is approaching the maximum achievable 
     256      ! quota, uptake is downregulated according to a sigmoidal function  
     257      ! (power 2), as proposed by Flynn (2003) 
     258      ! --------------------------------------------------------------------------- 
    218259      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    219260         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    220261            !  production terms for nanophyto. 
    221262            zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2 
    222             ! 
     263 
     264            ! Size computation 
     265            ! Size is made a function of the limitation of of phytoplankton growth 
     266            ! Strongly limited cells are supposed to be smaller. sizena is the  
     267            ! size at time step t+1 and is thus updated at the end of the  
     268            ! current time step 
     269            ! -------------------------------------------------------------------- 
     270            zlimfac = xlimphys(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn ) 
     271            zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     272            sizena(ji,jj,jk) = MIN(xsizern, MAX( sizena(ji,jj,jk), zsizetmp ) ) 
     273            ! Maximum potential uptake rate 
    223274            zration = tr(ji,jj,jk,jpnph,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 
    224275            zratiop = tr(ji,jj,jk,jppph,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 
     
    226277            zprnutmax = zprnut(ji,jj,jk) * fvnuptk(ji,jj,jk) / rno3 * tr(ji,jj,jk,jpphy,Kbb) * rfact2 
    227278            ! Uptake of nitrogen 
    228             zrat = MIN( 1., zration / (xqnnmax(ji,jj,jk) + rtrn) )  
    229             zmax = MAX(0., MIN(1., (1. - zrat)/ (1.05 - zrat) * 1.05)) 
     279            zratio = 1.0 - MIN( 1., zration / (xqnnmax(ji,jj,jk) + rtrn) ) 
     280            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
    230281            zpronmax = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpnmin(ji,jj,jk) )   & 
    231282            &          / ( xqpnmax(ji,jj,jk) - xqpnmin(ji,jj,jk) + rtrn ), xlimnfe(ji,jj,jk) ) ) 
    232             zpronewn(ji,jj,jk) = zpronmax * zdaylen(ji,jj) * xnanono3(ji,jj,jk) 
     283            zpronmax = zpronmax * xqnnmin(ji,jj,jk) / qnnmin 
     284            zpronewn(ji,jj,jk) = zpronmax * xnanono3(ji,jj,jk) 
    233285            zproregn(ji,jj,jk) = zpronmax * xnanonh4(ji,jj,jk) 
    234             ! Uptake of phosphorus 
    235             zrat = MIN( 1., zratiop / (xqpnmax(ji,jj,jk) + rtrn) ) 
    236             zmax = MAX(0., MIN(1., (1. - zrat)/ (1.05 - zrat) * 1.05)) 
     286            ! Uptake of phosphorus and DOP 
     287            zratio = 1.0 - MIN( 1., zratiop / (xqpnmax(ji,jj,jk) + rtrn) ) 
     288            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
    237289            zpropmax = zprnutmax * zmax * xlimnfe(ji,jj,jk) 
    238290            zpropo4n(ji,jj,jk) = zpropmax * xnanopo4(ji,jj,jk) 
    239291            zprodopn(ji,jj,jk) = zpropmax * xnanodop(ji,jj,jk) 
    240292            ! Uptake of iron 
    241             zrat = MIN( 1., zratiof / qfnmax ) 
    242             zmax = MAX(0., MIN(1., (1. - zrat)/ (1.05 - zrat) * 1.05)) 
    243             zprofmax = zprnutmax * qfnmax * zmax 
    244             zprofen(ji,jj,jk) = zprofmax * xnanofer(ji,jj,jk) * ( 3. - 2.4 * xlimnfe(ji,jj,jk)    & 
    245             &          / ( xlimnfe(ji,jj,jk) + 0.2 ) ) * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn  & 
     293            zqfnmax = xqfuncfecn(ji,jj,jk) + ( qfnmax - xqfuncfecn(ji,jj,jk) ) * xlimnpn(ji,jj,jk) 
     294            zratio = 1.0 - MIN( 1., zratiof / zqfnmax ) 
     295            zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) ) 
     296            zprofmax = zprnutmax * zqfnmax * zmax  
     297            zprofen(ji,jj,jk) = zprofmax * xnanofer(ji,jj,jk)    & 
     298            &          * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn  & 
    246299            &          + xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) ) 
    247300         ENDIF 
    248301      END_3D 
    249302 
    250       ! Computation of the various production terms of picophytoplankton  
     303      ! Computation of the various production and uptake terms of picophytoplankton  
     304      ! Interactions between N and P are modeled according to the Chain Model  
     305      ! of Pahlow et al. (2009). Iron uptake is modeled following traditional 
     306      ! Droop kinetics. When the quota is approaching the maximum achievable 
     307      ! quota, uptake is downregulated according to a sigmoidal function  
     308      ! (power 2), as proposed by Flynn (2003) 
     309      ! --------------------------------------------------------------------------- 
    251310      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    252311         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    253312            !  production terms for picophyto. 
    254313            zprorcap(ji,jj,jk) = zprpic(ji,jj,jk)  * xlimpic(ji,jj,jk) * tr(ji,jj,jk,jppic,Kbb) * rfact2 
    255             ! 
     314            ! Size computation 
     315            ! Size is made a function of the limitation of of phytoplankton growth 
     316            ! Strongly limited cells are supposed to be smaller. sizepa is 
     317            ! size at time step t+1 and is thus updated at the end of the  
     318            ! current time step 
     319            ! -------------------------------------------------------------------- 
     320            zlimfac = zprchlp(ji,jj,jk)  * xlimpics(ji,jj,jk) / ( zprmaxp(ji,jj,jk) + rtrn ) 
     321            zsizetmp = 1.0 + 1.3 * ( xsizerp - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     322            sizepa(ji,jj,jk) = min(xsizerp, max( sizepa(ji,jj,jk), zsizetmp ) ) 
     323            ! Maximum potential uptake rate of nutrients 
    256324            zration = tr(ji,jj,jk,jpnpi,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) + rtrn ) 
    257325            zratiop = tr(ji,jj,jk,jpppi,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) + rtrn ) 
     
    259327            zprnutmax = zprnut(ji,jj,jk) * fvpuptk(ji,jj,jk) / rno3 * tr(ji,jj,jk,jppic,Kbb) * rfact2 
    260328            ! Uptake of nitrogen 
    261             zrat = MIN( 1., zration / (xqnpmax(ji,jj,jk) + rtrn) ) 
    262             zmax = MAX(0., MIN(1., (1. - zrat)/ (1.05 - zrat) * 1.05)) 
     329            zratio = 1.0 - MIN( 1., zration / (xqnpmax(ji,jj,jk) + rtrn) ) 
     330            zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) ) 
    263331            zpronmax = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqppmin(ji,jj,jk) )   & 
    264332            &          / ( xqppmax(ji,jj,jk) - xqppmin(ji,jj,jk) + rtrn ), xlimpfe(ji,jj,jk) ) ) 
    265             zpronewp(ji,jj,jk) = zpronmax * zdaylen(ji,jj) * xpicono3(ji,jj,jk)  
     333            zpronmax = zpronmax * xqnpmin(ji,jj,jk) / qnnmin 
     334            zpronewp(ji,jj,jk) = zpronmax * xpicono3(ji,jj,jk)  
    266335            zproregp(ji,jj,jk) = zpronmax * xpiconh4(ji,jj,jk) 
    267336            ! Uptake of phosphorus 
    268             zrat = MIN( 1., zratiop / (xqppmax(ji,jj,jk) + rtrn) ) 
    269             zmax = MAX(0., MIN(1., (1. - zrat)/ (1.05 - zrat) * 1.05)) 
    270             zpropmax = zprnutmax * zmax * xlimpfe(ji,jj,jk) 
     337            zratio = 1.0 - MIN( 1., zratiop / (xqppmax(ji,jj,jk) + rtrn) ) 
     338            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
     339            zpropmax = zprnutmax * zmax * xlimpfe(ji,jj,jk)  
    271340            zpropo4p(ji,jj,jk) = zpropmax * xpicopo4(ji,jj,jk) 
    272341            zprodopp(ji,jj,jk) = zpropmax * xpicodop(ji,jj,jk) 
    273342            ! Uptake of iron 
    274             zrat = MIN( 1., zratiof / qfpmax ) 
    275             zmax = MAX(0., MIN(1., (1. - zrat)/ (1.05 - zrat) * 1.05)) 
    276             zprofmax = zprnutmax * qfpmax * zmax 
    277             zprofep(ji,jj,jk) = zprofmax * xpicofer(ji,jj,jk) * ( 3. - 2.4 * xlimpfe(ji,jj,jk)   & 
    278             &          / ( xlimpfe(ji,jj,jk) + 0.2 ) ) * (1. + 0.8 * xpicono3(ji,jj,jk) / ( rtrn   & 
     343            zqfpmax = xqfuncfecp(ji,jj,jk) + ( qfpmax - xqfuncfecp(ji,jj,jk) ) * xlimnpp(ji,jj,jk) 
     344            zratio = 1.0 - MIN( 1., zratiof / zqfpmax ) 
     345            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
     346            zprofmax = zprnutmax * zqfpmax * zmax 
     347            zprofep(ji,jj,jk) = zprofmax * xpicofer(ji,jj,jk)  & 
     348            &          * (1. + 0.8 * xpicono3(ji,jj,jk) / ( rtrn   & 
    279349            &          + xpicono3(ji,jj,jk) + xpiconh4(ji,jj,jk) ) * (1. - xpicofer(ji,jj,jk) ) ) 
    280350         ENDIF 
    281351      END_3D 
    282352 
    283       ! Computation of the various production terms of diatoms 
     353      ! Computation of the various production and uptake terms of diatoms 
     354      ! Interactions between N and P are modeled according to the Chain Model  
     355      ! of Pahlow et al. (2009). Iron uptake is modeled following traditional 
     356      ! Droop kinetics. When the quota is approaching the maximum achievable 
     357      ! quota, uptake is downregulated according to a sigmoidal function  
     358      ! (power 2), as proposed by Flynn (2003) 
     359      ! --------------------------------------------------------------------------- 
    284360      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    285361         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    286362            !  production terms for diatomees 
    287363            zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * tr(ji,jj,jk,jpdia,Kbb) * rfact2 
    288             ! Computation of the respiration term according to pahlow  
    289             ! & oschlies (2013) 
    290             ! 
     364            ! Size computation 
     365            ! Size is made a function of the limitation of of phytoplankton growth 
     366            ! Strongly limited cells are supposed to be smaller. sizeda is 
     367            ! size at time step t+1 and is thus updated at the end of the  
     368            ! current time step.  
     369            ! -------------------------------------------------------------------- 
     370            zlimfac = zprchld(ji,jj,jk) * xlimdias(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) 
     371            zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     372            sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) ) 
     373            ! Maximum potential uptake rate of nutrients 
    291374            zration = tr(ji,jj,jk,jpndi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
    292375            zratiop = tr(ji,jj,jk,jppdi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
     
    294377            zprnutmax = zprnut(ji,jj,jk) * fvduptk(ji,jj,jk) / rno3 * tr(ji,jj,jk,jpdia,Kbb) * rfact2 
    295378            ! Uptake of nitrogen 
    296             zrat = MIN( 1., zration / (xqndmax(ji,jj,jk) + rtrn) ) 
    297             zmax = MAX(0., MIN(1., (1. - zrat)/ (1.05 - zrat) * 1.05))  
     379            zratio = 1.0 - MIN( 1., zration / (xqndmax(ji,jj,jk) + rtrn) ) 
     380            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
    298381            zpronmax = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpdmin(ji,jj,jk) )   & 
    299382            &          / ( xqpdmax(ji,jj,jk) - xqpdmin(ji,jj,jk) + rtrn ), xlimdfe(ji,jj,jk) ) ) 
    300             zpronewd(ji,jj,jk) = zpronmax * zdaylen(ji,jj) * xdiatno3(ji,jj,jk) 
     383            zpronmax = zpronmax * xqndmin(ji,jj,jk) / qnnmin 
     384            zpronewd(ji,jj,jk) = zpronmax * xdiatno3(ji,jj,jk) 
    301385            zproregd(ji,jj,jk) = zpronmax * xdiatnh4(ji,jj,jk) 
    302386            ! Uptake of phosphorus 
    303             zrat = MIN( 1., zratiop / (xqpdmax(ji,jj,jk) + rtrn) ) 
    304             zmax = MAX(0., MIN(1., (1. - zrat)/ (1.05 - zrat) * 1.05))  
     387            zratio = 1.0 - MIN( 1., zratiop / (xqpdmax(ji,jj,jk) + rtrn) ) 
     388            zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) ) 
    305389            zpropmax = zprnutmax * zmax * xlimdfe(ji,jj,jk) 
    306390            zpropo4d(ji,jj,jk) = zpropmax * xdiatpo4(ji,jj,jk) 
    307391            zprodopd(ji,jj,jk) = zpropmax * xdiatdop(ji,jj,jk) 
    308392            ! Uptake of iron 
    309             zrat = MIN( 1., zratiof / qfdmax ) 
    310             zmax = MAX(0., MIN(1., (1. - zrat)/ (1.05 - zrat) * 1.05)) 
    311             zprofmax = zprnutmax * qfdmax * zmax 
    312             zprofed(ji,jj,jk) = zprofmax * xdiatfer(ji,jj,jk) * ( 3. - 2.4 * xlimdfe(ji,jj,jk)     & 
    313             &          / ( xlimdfe(ji,jj,jk) + 0.2 ) ) * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn   & 
     393            zqfdmax = xqfuncfecd(ji,jj,jk) + ( qfdmax - xqfuncfecd(ji,jj,jk) ) * xlimnpd(ji,jj,jk) 
     394            zratio = 1.0 - MIN( 1., zratiof / zqfdmax ) 
     395            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
     396            zprofmax = zprnutmax * zqfdmax * zmax 
     397            zprofed(ji,jj,jk) = zprofmax * xdiatfer(ji,jj,jk)    & 
     398            &          * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn   & 
    314399            &          + xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) ) 
    315400         ENDIF 
    316401      END_3D 
    317402 
     403      ! Production of Chlorophyll. The formulation proposed by Geider et al. 
     404      ! is adopted here. 
     405      ! -------------------------------------------------------------------- 
    318406      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    319407         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     
    321409            znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    322410            zprod = rday * (zpronewn(ji,jj,jk) + zproregn(ji,jj,jk)) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk) 
    323             thetannm_n   = MIN ( thetannm, ( thetannm / (1. - 1.14 / 43.4 *ts(ji,jj,jk,jp_tem,Kmm)))   & 
    324             &               * (1. - 1.14 / 43.4 * 20.)) 
    325             zprochln = thetannm_n * zprod / ( zpislopeadn(ji,jj,jk) * znanotot + rtrn ) 
     411            zprochln = thetannm * zprod / ( zpislopeadn(ji,jj,jk) * znanotot + rtrn ) 
    326412            zprochln = MAX(zprochln, chlcmin * 12. * zprorcan (ji,jj,jk) ) 
    327413               !  production terms for picophyto. ( chlorophyll ) 
    328414            zpicotot = epicom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    329415            zprod = rday * (zpronewp(ji,jj,jk) + zproregp(ji,jj,jk)) * zprchlp(ji,jj,jk) * xlimpic(ji,jj,jk) 
    330             thetanpm_n   = MIN ( thetanpm, ( thetanpm / (1. - 1.14 / 43.4 *ts(ji,jj,jk,jp_tem,Kmm)))   & 
    331             &               * (1. - 1.14 / 43.4 * 20.)) 
    332             zprochlp = thetanpm_n * zprod / ( zpislopeadp(ji,jj,jk) * zpicotot + rtrn ) 
     416            zprochlp = thetanpm * zprod / ( zpislopeadp(ji,jj,jk) * zpicotot + rtrn ) 
    333417            zprochlp = MAX(zprochlp, chlcmin * 12. * zprorcap(ji,jj,jk) ) 
    334             !  production terms for diatomees ( chlorophyll ) 
     418            !  production terms for diatoms ( chlorophyll ) 
    335419            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    336420            zprod = rday * (zpronewd(ji,jj,jk) + zproregd(ji,jj,jk)) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) 
    337             thetandm_n   = MIN ( thetandm, ( thetandm / (1. - 1.14 / 43.4 *ts(ji,jj,jk,jp_tem,Kmm)))   & 
    338             &               * (1. - 1.14 / 43.4 * 20.)) 
    339             zprochld = thetandm_n * zprod / ( zpislopeadd(ji,jj,jk) * zdiattot + rtrn ) 
     421            zprochld = thetandm * zprod / ( zpislopeadd(ji,jj,jk) * zdiattot + rtrn ) 
    340422            zprochld = MAX(zprochld, chlcmin * 12. * zprorcad(ji,jj,jk) ) 
    341423            !   Update the arrays TRA which contain the Chla sources and sinks 
     
    348430      !   Update the arrays TRA which contain the biological sources and sinks 
    349431      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
     432        zpptot   = zpropo4n(ji,jj,jk) + zpropo4d(ji,jj,jk) + zpropo4p(ji,jj,jk) 
     433        zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) + zpronewp(ji,jj,jk) 
     434        zpregtot = zproregn(ji,jj,jk) + zproregd(ji,jj,jk) + zproregp(ji,jj,jk) 
     435 
    350436        zprontot = zpronewn(ji,jj,jk) + zproregn(ji,jj,jk) 
    351437        zproptot = zpronewp(ji,jj,jk) + zproregp(ji,jj,jk) 
    352438        zprodtot = zpronewd(ji,jj,jk) + zproregd(ji,jj,jk) 
    353         zdocprod = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)  & 
    354         &          + excretp * zprorcap(ji,jj,jk) 
    355         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpropo4n(ji,jj,jk) - zpropo4d(ji,jj,jk)  & 
    356         &                     - zpropo4p(ji,jj,jk) 
    357         tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpronewn(ji,jj,jk) - zpronewd(ji,jj,jk)  & 
    358         &                     - zpronewp(ji,jj,jk) 
    359         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zproregn(ji,jj,jk) - zproregd(ji,jj,jk)  & 
    360         &                     - zproregp(ji,jj,jk) 
    361         tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) + zprorcan(ji,jj,jk) * texcretn    & 
    362            &                  - zpsino3 * zpronewn(ji,jj,jk) - zpsinh4 * zproregn(ji,jj,jk)   & 
    363            &                  - zrespn(ji,jj,jk)  
    364         zcroissn(ji,jj,jk) = tr(ji,jj,jk,jpphy,Krhs) / rfact2/ (tr(ji,jj,jk,jpphy,Kbb) + rtrn) 
     439        ! 
     440        zproddoc = excretd * zprorcad(ji,jj,jk) & 
     441        &        + excretn * zprorcan(ji,jj,jk) & 
     442        &        + excretp * zprorcap(ji,jj,jk) 
     443        ! 
     444        zproddop = excretd * zpropo4d(ji,jj,jk) - texcretd * zprodopd(ji,jj,jk) & 
     445        &        + excretn * zpropo4n(ji,jj,jk) - texcretn * zprodopn(ji,jj,jk) & 
     446        &        + excretp * zpropo4p(ji,jj,jk) - texcretp * zprodopp(ji,jj,jk) 
     447 
     448        zproddon =  excretd * zprodtot + excretn * zprontot + excretp * zproptot 
     449 
     450        zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) 
     451        zresptot = zrespn(ji,jj,jk) + zrespp(ji,jj,jk) + zrespd(ji,jj,jk)  
     452        ! 
     453        tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpptot 
     454        tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot 
     455        tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot   
     456        ! 
     457        tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs)         & 
     458           &                     + zprorcan(ji,jj,jk) * texcretn  & 
     459           &                     - xpsino3 * zpronewn(ji,jj,jk)   & 
     460           &                     - xpsinh4 * zproregn(ji,jj,jk)   & 
     461           &                     - zrespn(ji,jj,jk)  
     462 
    365463        tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) + zprontot * texcretn 
    366         tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) + zpropo4n(ji,jj,jk) * texcretn   & 
    367         &                     + zprodopn(ji,jj,jk) * texcretn 
     464        tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) + ( zpropo4n(ji,jj,jk) + zprodopn(ji,jj,jk) ) * texcretn 
    368465        tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk) * texcretn 
    369         tr(ji,jj,jk,jppic,Krhs) = tr(ji,jj,jk,jppic,Krhs) + zprorcap(ji,jj,jk) * texcretp     & 
    370            &                  - zpsino3 * zpronewp(ji,jj,jk) - zpsinh4 * zproregp(ji,jj,jk)   & 
    371            &                  - zrespp(ji,jj,jk)  
    372         zcroissp(ji,jj,jk) = tr(ji,jj,jk,jppic,Krhs) / rfact2/ (tr(ji,jj,jk,jppic,Kbb) + rtrn) 
     466 
     467        ! 
     468        tr(ji,jj,jk,jppic,Krhs) = tr(ji,jj,jk,jppic,Krhs)         & 
     469           &                     + zprorcap(ji,jj,jk) * texcretp  & 
     470           &                     - xpsino3 * zpronewp(ji,jj,jk)   & 
     471           &                     - xpsinh4 * zproregp(ji,jj,jk)   & 
     472           &                     - zrespp(ji,jj,jk)  
     473 
    373474        tr(ji,jj,jk,jpnpi,Krhs) = tr(ji,jj,jk,jpnpi,Krhs) + zproptot * texcretp 
    374         tr(ji,jj,jk,jpppi,Krhs) = tr(ji,jj,jk,jpppi,Krhs) + zpropo4p(ji,jj,jk) * texcretp   & 
    375         &                     + zprodopp(ji,jj,jk) * texcretp 
     475        tr(ji,jj,jk,jpppi,Krhs) = tr(ji,jj,jk,jpppi,Krhs) + ( zpropo4p(ji,jj,jk) + zprodopp(ji,jj,jk) ) * texcretp 
    376476        tr(ji,jj,jk,jppfe,Krhs) = tr(ji,jj,jk,jppfe,Krhs) + zprofep(ji,jj,jk) * texcretp 
    377         tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) + zprorcad(ji,jj,jk) * texcretd   & 
    378            &                  - zpsino3 * zpronewd(ji,jj,jk) - zpsinh4 * zproregd(ji,jj,jk)   & 
    379            &                  - zrespd(ji,jj,jk)  
    380         zcroissd(ji,jj,jk) = tr(ji,jj,jk,jpdia,Krhs) / rfact2 / (tr(ji,jj,jk,jpdia,Kbb) + rtrn) 
     477 
     478        ! 
     479        tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs)         & 
     480           &                    + zprorcad(ji,jj,jk) * texcretd   & 
     481           &                    - xpsino3 * zpronewd(ji,jj,jk)    & 
     482           &                    - xpsinh4 * zproregd(ji,jj,jk)    & 
     483           &                    - zrespd(ji,jj,jk)  
     484 
    381485        tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) + zprodtot * texcretd 
    382         tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) + zpropo4d(ji,jj,jk) * texcretd   & 
    383         &                     + zprodopd(ji,jj,jk) * texcretd 
     486        tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) + ( zpropo4d(ji,jj,jk) + zprodopd(ji,jj,jk) ) * texcretd 
    384487        tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk) * texcretd 
    385         tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprorcad(ji,jj,jk) * zysopt(ji,jj,jk) * texcretd 
    386         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)  & 
    387         &                     + excretp * zprorcap(ji,jj,jk) 
    388         tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + excretd * zprodtot + excretn * zprontot   & 
    389         &                     + excretp * zproptot 
    390         tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + excretd * zpropo4d(ji,jj,jk) + excretn * zpropo4n(ji,jj,jk)   & 
    391         &    - texcretn * zprodopn(ji,jj,jk) - texcretd * zprodopd(ji,jj,jk) + excretp * zpropo4p(ji,jj,jk)     & 
    392         &    - texcretp * zprodopp(ji,jj,jk) 
    393         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + o2ut * ( zproregn(ji,jj,jk) + zproregd(ji,jj,jk)   & 
    394            &                + zproregp(ji,jj,jk) ) + ( o2ut + o2nit ) * ( zpronewn(ji,jj,jk)           & 
    395            &                + zpronewd(ji,jj,jk) + zpronewp(ji,jj,jk) )   & 
    396            &                - o2ut * ( zrespn(ji,jj,jk) + zrespp(ji,jj,jk) + zrespd(ji,jj,jk) ) 
    397         zfeup = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) 
    398         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zfeup 
    399         tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - texcretd * zprorcad(ji,jj,jk) * zysopt(ji,jj,jk) 
    400         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zprorcan(ji,jj,jk) - zprorcad(ji,jj,jk) - zprorcap(ji,jj,jk)  & 
    401         &                     + zpsino3 * zpronewn(ji,jj,jk) + zpsinh4 * zproregn(ji,jj,jk)   & 
    402         &                     + zpsino3 * zpronewp(ji,jj,jk) + zpsinh4 * zproregp(ji,jj,jk)   & 
    403         &                     + zpsino3 * zpronewd(ji,jj,jk) + zpsinh4 * zproregd(ji,jj,jk)  & 
    404         &                     + zrespn(ji,jj,jk) + zrespd(ji,jj,jk) + zrespp(ji,jj,jk)  
    405         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk)  & 
    406         &                     + zpronewp(ji,jj,jk) ) - rno3 * ( zproregn(ji,jj,jk) + zproregd(ji,jj,jk)     & 
    407         &                     + zproregp(ji,jj,jk) )  
    408       END_3D 
    409      ! 
     488        tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb) 
     489        tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc 
     490        tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zproddon                                         
     491        tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zproddop 
     492   
     493        tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) & 
     494           &                     + o2ut * zpregtot + ( o2ut + o2nit ) * zpnewtot - o2ut * zresptot  
     495 
     496        tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer 
     497        consfe3(ji,jj,jk)       = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) )   & 
     498           &                   * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2 
     499        tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb)  
     500 
     501        tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot  & 
     502           &                     + xpsino3 * zpronewn(ji,jj,jk) + xpsinh4 * zproregn(ji,jj,jk)   & 
     503           &                     + xpsino3 * zpronewp(ji,jj,jk) + xpsinh4 * zproregp(ji,jj,jk)   & 
     504           &                     + xpsino3 * zpronewd(ji,jj,jk) + xpsinh4 * zproregd(ji,jj,jk)   
     505 
     506        tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot ) 
     507        ! 
     508      END_3D 
     509      
     510     ! Production and uptake of ligands by phytoplankton. This part is activated  
     511     ! when ln_ligand is set to .true. in the namelist. Ligand uptake is small  
     512     ! and based on the FeL model by Morel et al. (2008) and on the study of 
     513     ! Shaked and Lis (2012) 
     514     ! ------------------------------------------------------------------------- 
    410515     IF( ln_ligand ) THEN 
    411          zpligprod1(:,:,:) = 0._wp    ;    zpligprod2(:,:,:) = 0._wp              
    412516         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    413            zdocprod = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) + excretp * zprorcap(ji,jj,jk) 
    414            zfeup    = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) 
    415            tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zdocprod * ldocp - zfeup * plig(ji,jj,jk) * lthet 
    416            zpligprod1(ji,jj,jk) = zdocprod * ldocp 
    417            zpligprod2(ji,jj,jk) = zfeup * plig(ji,jj,jk) * lthet 
    418          END_3D 
     517           zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) + excretp * zprorcap(ji,jj,jk) 
     518           zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) 
     519           zprodlig = plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet  
     520           ! 
     521           tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zproddoc * ldocp - zprodfer * zprodlig 
     522        END_3D 
    419523     ENDIF 
    420  
    421  
    422      ! Total primary production per year 
    423524 
    424525    ! Total primary production per year 
     
    435536       CALL iom_put( "PPNEWN"  , zpronewn(:,:,:) * zfact * tmask(:,:,:)    ) ! new primary production by nanophyto 
    436537       CALL iom_put( "PPNEWD"  , zpronewd(:,:,:) * zfact * tmask(:,:,:)   ) ! new primary production by diatomes 
    437        CALL iom_put( "PBSi"    , zprorcad(:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:)  ) ! biogenic silica production 
    438        CALL iom_put( "PFeP"    , zprofep(:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by picophyto 
     538       CALL iom_put( "PBSi"    , zprmaxd (:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:)  ) ! biogenic silica production 
     539       CALL iom_put( "PFeP"    , zprofep (:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by picophyto 
    439540       CALL iom_put( "PFeN"    , zprofen(:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by nanophyto 
    440541       CALL iom_put( "PFeD"    , zprofed(:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by  diatomes 
    441        IF( ln_ligand ) THEN 
    442          CALL iom_put( "LPRODP"  , zpligprod1(:,:,:) * 1e9 * zfact * tmask(:,:,:) ) 
    443          CALL iom_put( "LDETP"   , zpligprod2(:,:,:) * 1e9 * zfact * tmask(:,:,:) ) 
     542       IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN 
     543           ALLOCATE(  zpligprod(jpi,jpj,jpk) ) 
     544           zpligprod(:,:,:) = excretd * zprorcad(:,:,:) + excretn * zprorcan(:,:,:) + excretp * zprorcap(:,:,:) 
     545           CALL iom_put( "LPRODP"  , zpligprod(:,:,:) * ldocp * 1e9 * zfact * tmask(:,:,:) ) 
     546           ! 
     547           zpligprod(:,:,:) = ( texcretn * zprofen(:,:,:) + texcretd * zprofed(:,:,:) + texcretp * zprofep(:,:,:) ) &  
     548             &                  * plig(:,:,:) / ( rtrn + plig(:,:,:) + 75.0 * (1.0 - plig(:,:,:) ) ) 
     549           CALL iom_put( "LDETP"   , zpligprod(:,:,:)  * lthet * 1e9 * zfact * tmask(:,:,:) ) 
     550           DEALLOCATE(  zpligprod ) 
    444551       ENDIF 
    445552       CALL iom_put( "Mumax"   , zprmaxn(:,:,:) * tmask(:,:,:)  ) ! Maximum growth rate 
     
    450557       CALL iom_put( "LNlight" , zprbio(:,:,:) / (zprmaxn(:,:,:) + rtrn) * tmask(:,:,:)  )  ! light limitation term 
    451558       CALL iom_put( "LDlight" , zprdia(:,:,:) / (zprmaxd(:,:,:) + rtrn) * tmask(:,:,:)   ) 
    452        CALL iom_put( "MunetP"  , zcroissp(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for picophyto 
    453        CALL iom_put( "MunetN"  , zcroissn(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for nanophyto 
    454        CALL iom_put( "MunetD"  , zcroissd(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for diatoms 
     559       CALL iom_put( "MunetP"  , ( tr(:,:,:,jppic,Krhs)/rfact2/(tr(:,:,:,jppic,Kbb)+ rtrn ) * tmask(:,:,:)) ) ! Realized growth rate for picophyto 
     560       CALL iom_put( "MunetN"  , ( tr(:,:,:,jpphy,Krhs)/rfact2/(tr(:,:,:,jpphy,Kbb)+ rtrn ) * tmask(:,:,:)) ) ! Realized growth rate for picophyto 
     561       CALL iom_put( "MunetD"  , ( tr(:,:,:,jpdia,Krhs)/rfact2/(tr(:,:,:,jpdia,Kbb)+ rtrn ) * tmask(:,:,:)) ) ! Realized growth rate for picophyto 
    455562       CALL iom_put( "TPP"     , ( zprorcap(:,:,:) + zprorcan(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:)  )  ! total primary production 
    456563       CALL iom_put( "TPNEW"   , ( zpronewp(:,:,:) + zpronewn(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:)  ) ! total new production 
     
    476583      !! ** Purpose :   Initialization of phytoplankton production parameters 
    477584      !! 
    478       !! ** Method  :   Read the nampisprod namelist and check the parameters 
     585      !! ** Method  :   Read the namp5zprod namelist and check the parameters 
    479586      !!      called at the first timestep (nittrc000) 
    480587      !! 
    481       !! ** input   :   Namelist nampisprod 
     588      !! ** input   :   Namelist namp5zprod 
    482589      !!---------------------------------------------------------------------- 
    483       INTEGER :: ios                 ! Local integer output status for namelist read 
     590      INTEGER :: ios    ! Local integer output status for namelist read 
    484591      !! 
    485592      NAMELIST/namp5zprod/ pislopen, pislopep, pisloped, excretn, excretp, excretd,     & 
  • NEMO/trunk/src/TOP/PISCES/par_pisces.F90

    r12377 r15459  
    1111 
    1212   ! productive layer depth 
    13    INTEGER, PUBLIC ::   jpkb       !: first vertical layers where biology is active 
    14    INTEGER, PUBLIC ::   jpkbm1     !: first vertical layers where biology is active 
     13   INTEGER, PUBLIC ::   jpkb      !: first vertical layers where biology is active 
     14   INTEGER, PUBLIC ::   jpkbm1    !: first vertical layers where biology is active 
    1515 
    1616   ! assign an index in trc arrays for each LOBSTER prognostic variables 
  • NEMO/trunk/src/TOP/PISCES/sms_pisces.F90

    r14558 r15459  
    22   !!---------------------------------------------------------------------- 
    33   !!                     ***  sms_pisces.F90  ***   
    4    !! TOP :   PISCES Source Minus Sink variables 
     4   !! TOP :   PISCES Source Minus Sink variables are declared and allocated 
    55   !!---------------------------------------------------------------------- 
    66   !! History :   1.0  !  2000-02 (O. Aumont) original code 
     
    1717   INTEGER ::   numonp      = -1                !! Logical unit for namelist pisces output 
    1818 
    19    !                                                       !:  PISCES  : silicon dependant half saturation 
    20  
    2119   !!* Model used 
    2220   LOGICAL  ::  ln_p2z            !: Flag to use LOBSTER model 
     
    2725 
    2826   !!*  Time variables 
    29    INTEGER  ::   nrdttrc           !: ??? 
    30    REAL(wp) ::   rfact , rfactr    !: ??? 
    31    REAL(wp) ::   rfact2, rfact2r   !: ??? 
    32    REAL(wp) ::   xstep             !: Time step duration for biology 
    33    REAL(wp) ::   ryyss             !: number of seconds per year  
    34    REAL(wp) ::   r1_ryyss          !: inverse number of seconds per year  
    35  
     27   INTEGER  ::   nrdttrc          !: ??? 
     28   REAL(wp) ::   rfact , rfactr   !: time step duration (in seconds) 
     29   REAL(wp) ::   rfact2, rfact2r  !: time step duration (in seconds) when timesplitting is activated for PISCES 
     30   REAL(wp) ::   xstep            !: Time step duration for biology 
     31   REAL(wp) ::   ryyss            !: number of seconds per year  
     32   REAL(wp) ::   r1_ryyss         !: inverse number of seconds per year  
    3633 
    3734   !!*  Biological parameters  
    38    REAL(wp) ::   rno3              !: ??? 
    39    REAL(wp) ::   o2ut              !: ??? 
    40    REAL(wp) ::   po4r              !: ??? 
    41    REAL(wp) ::   rdenit            !: ??? 
    42    REAL(wp) ::   rdenita           !: ??? 
    43    REAL(wp) ::   o2nit             !: ??? 
    44    REAL(wp) ::   wsbio, wsbio2     !: ??? 
    45    REAL(wp) ::   wsbio2max         !: ??? 
    46    REAL(wp) ::   wsbio2scale       !: ??? 
    47    REAL(wp) ::   xkmort            !: ??? 
    48    REAL(wp) ::   ferat3            !: ??? 
    49    REAL(wp) ::   ldocp             !: ??? 
    50    REAL(wp) ::   ldocz             !: ??? 
    51    REAL(wp) ::   lthet             !: ??? 
    52    REAL(wp) ::   no3rat3           !: ??? 
    53    REAL(wp) ::   po4rat3           !: ??? 
    54  
     35   REAL(wp) ::   rno3             !: C/N stoichiometric ratio 
     36   REAL(wp) ::   o2ut             !: O2/N stoichiometric ratio for ammonification 
     37   REAL(wp) ::   po4r             !: C/P stoichiometric ratio 
     38   REAL(wp) ::   rdenit           !: C/N ratio for denitrification 
     39   REAL(wp) ::   rdenita          !: C/N ratio for denitrification 
     40   REAL(wp) ::   o2nit            !: O2/N ratio for nitrification 
     41   REAL(wp) ::   wsbio, wsbio2    !: Sinking speeds of particles 
     42   REAL(wp) ::   wsbio2max        !: Maximum sinking speed of the largest particles 
     43   REAL(wp) ::   wsbio2scale      !: Length scale for the variations of wsbio2 
     44   REAL(wp) ::   oxymin           !:  half saturation constant for anoxia 
     45   REAL(wp) ::   xkmort           !: Mortality half-saturation constant 
     46   REAL(wp) ::   feratz           !: Fe/C in microzooplankton 
     47   REAL(wp) ::   feratm           !: Fe/C in mesozooplankton 
     48   REAL(wp) ::   ldocp            !: Ligand production ratio during PP 
     49   REAL(wp) ::   ldocz            !: Ligand production ratio by grazing 
     50   REAL(wp) ::   lthet            !: Uptake of ligand by phytoplankton 
     51   REAL(wp) ::   no3rat3          !: C/N ratio of zooplankton 
     52   REAL(wp) ::   po4rat3          !: C/P ratio of zooplankton 
    5553 
    5654   !!*  diagnostic parameters  
    57    REAL(wp) ::  tpp                !: total primary production 
    58    REAL(wp) ::  t_oce_co2_exp      !: total carbon export 
    59    REAL(wp) ::  t_oce_co2_flx      !: Total ocean carbon flux 
    60    REAL(wp) ::  t_oce_co2_flx_cum  !: Cumulative Total ocean carbon flux 
    61    REAL(wp) ::  t_atm_co2_flx      !: global mean of atmospheric pco2 
     55   REAL(wp) ::  tpp               !: total primary production 
     56   REAL(wp) ::  t_oce_co2_exp     !: total carbon export 
     57   REAL(wp) ::  t_oce_co2_flx     !: Total ocean carbon flux 
     58   REAL(wp) ::  t_oce_co2_flx_cum !: Cumulative Total ocean carbon flux 
     59   REAL(wp) ::  t_atm_co2_flx     !: global mean of atmospheric pco2 
    6260 
    6361   !!* restoring 
    64    LOGICAL  ::  ln_pisdmp          !: restoring or not of nutrients to a mean value 
    65    INTEGER  ::  nn_pisdmp          !: frequency of relaxation or not of nutrients to a mean value 
     62   LOGICAL  ::  ln_pisdmp         !: restoring or not of nutrients to a mean value 
     63   INTEGER  ::  nn_pisdmp         !: frequency of relaxation or not of nutrients to a mean value 
    6664 
    6765   !!* Mass conservation 
    68    LOGICAL  ::  ln_check_mass      !: Flag to check mass conservation 
    69    LOGICAL , PUBLIC ::   ln_ironice   !: boolean for Fe input from sea ice 
     66   LOGICAL  ::  ln_check_mass     !: Flag to check mass conservation 
     67   LOGICAL, PUBLIC ::   ln_ironice   !: boolean for Fe input from sea ice 
     68 
     69   !!* Diurnal cycle in PISCES 
     70   LOGICAL  ::  ln_p4z_dcyc       !: Flag to activate diurnal cycle in PISCES 
    7071 
    7172   !!*  Biological fluxes for light : variables shared by pisces & lobster 
     73   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:  ) ::  strn  !: Day duration in hours 
    7274   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  enano, ediat   !: PAR for phyto, nano and diat  
    73    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  enanom, ediatm !: PAR for phyto, nano and diat  
     75   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  enanom, ediatm !: mean PAR for phyto, nano and diat  
    7476   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  epico          !: PAR for pico 
    75    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  epicom         !: PAR for pico 
    76    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  emoy           !: averaged PAR in the mixed layer 
    77    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  xksi  !:  LOBSTER : zooplakton closure 
     77   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  epicom         !: mean PAR for pico 
     78   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  emoy, etotm    !: averaged PAR in the mixed layer 
     79   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  xksi  !:  Half-saturation con,stant for diatoms 
    7880 
    7981   !!*  Biological fluxes for primary production 
    80    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   xksimax    !: ??? 
     82   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   xksimax    !: Maximum half-saturation constant over the year (Si) 
    8183   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   biron      !: bioavailable fraction of iron 
    8284   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   plig       !: proportion of iron organically complexed 
     
    8789 
    8890   !!*  SMS for the organic matter 
    89    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xfracal    !: ?? 
    90    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   nitrfac    !: ?? 
    91    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   nitrfac2   !: ?? 
    92    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   orem       !: ?? 
    93    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xdiss      !: ?? 
     91   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xfracal    !: Fraction of nanophytoplankton that are calcifying organisms 
     92   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   nitrfac    !: OMZ  
     93   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   nitrfac2   !: N depleted indice 
     94   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   orem       !: oxic remineralisation 
     95   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xdiss      !: Shear rate 
    9496   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodcal    !: Calcite production 
    95    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodpoc    !: Calcite production 
    96    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   conspoc    !: Calcite production 
    97    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodgoc    !: Calcite production 
    98    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   consgoc    !: Calcite production 
     97   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodpoc    !: POC production 
     98   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   conspoc    !: POC consumption 
     99   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodgoc    !: GOC production 
     100   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   consgoc    !: GOC consumption 
     101   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   consfe3    !: GOC consumption 
    99102   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   blim       !: bacterial production factor 
    100    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizen      !: size of diatoms  
    101    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizep      !: size of diatoms  
     103   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizen      !: size of nanophyto 
     104   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizep      !: size of picophyto 
    102105   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sized      !: size of diatoms  
    103  
     106   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizena     !: size of nanophytoplankton, after 
     107   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizepa     !: size of picophyto, after 
     108   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizeda     !: size of diatomss, after 
     109   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xfecolagg  !: Refractory diagnostic concentration of ligands 
     110   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xcoagfe    !: Coagulation rate of colloidal Fe/ligands 
    104111 
    105112   !!* Variable for chemistry of the CO2 cycle 
    106    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ak13       !: ??? 
    107    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ak23       !: ??? 
    108    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   aksp       !: ??? 
    109    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hi         !: ??? 
    110    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   excess     !: ??? 
     113   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ak13       !: Carbonate chemistry constant 
     114   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ak23       !: Carbonate chemistry constant 
     115   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   aksp       !: Solubility product of CaCO3 
     116   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hi         !: Proton concentration 
     117   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   excess     !: CO3 saturation 
    111118   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   aphscale   !:  
    112119 
     
    130137      !!---------------------------------------------------------------------- 
    131138      USE lib_mpp , ONLY: ctl_stop 
    132       INTEGER ::   ierr(10)        ! Local variables 
     139      INTEGER ::   ierr(11)        ! Local variables 
    133140      !!---------------------------------------------------------------------- 
    134141      ierr(:) = 0 
    135142      !*  Biological fluxes for light : shared variables for pisces & lobster 
    136       ALLOCATE( xksi(jpi,jpj)                                  ,  STAT=ierr(1) ) 
    137       ! 
    138    
     143      ALLOCATE( xksi(jpi,jpj), strn(jpi,jpj),  STAT=ierr(1) ) 
     144 
    139145      IF( ln_p4z .OR. ln_p5z ) THEN 
    140          !*  Biological fluxes for light  
    141          ALLOCATE(  enano(jpi,jpj,jpk)    , ediat(jpi,jpj,jpk) ,   & 
    142            &        enanom(jpi,jpj,jpk)   , ediatm(jpi,jpj,jpk),   & 
    143            &        emoy(jpi,jpj,jpk)                          ,  STAT=ierr(2) )  
    144146 
    145          !*  Biological fluxes for primary production 
     147         !* Optics 
     148         ALLOCATE(  enano(jpi,jpj,jpk) , ediat(jpi,jpj,jpk) ,   & 
     149           &        enanom(jpi,jpj,jpk), ediatm(jpi,jpj,jpk),   & 
     150           &        emoy(jpi,jpj,jpk)  , etotm(jpi,jpj,jpk),   STAT=ierr(2) ) 
     151 
     152         !* Biological SMS 
    146153         ALLOCATE( xksimax(jpi,jpj)  , biron(jpi,jpj,jpk)      ,  STAT=ierr(3) ) 
    147          ! 
    148          !*  SMS for the organic matter 
    149          ALLOCATE( xfracal (jpi,jpj,jpk), orem(jpi,jpj,jpk)    ,    & 
    150             &      nitrfac(jpi,jpj,jpk), nitrfac2(jpi,jpj,jpk) ,    & 
    151             &      prodcal(jpi,jpj,jpk) , xdiss   (jpi,jpj,jpk),    & 
    152             &      prodpoc(jpi,jpj,jpk) , conspoc(jpi,jpj,jpk) ,    & 
    153             &      prodgoc(jpi,jpj,jpk) , consgoc(jpi,jpj,jpk) ,    & 
    154             &      blim   (jpi,jpj,jpk) ,                         STAT=ierr(4) ) 
    155154 
    156          !* Variable for chemistry of the CO2 cycle 
    157          ALLOCATE( ak13  (jpi,jpj,jpk) ,                            & 
    158             &      ak23(jpi,jpj,jpk)    , aksp  (jpi,jpj,jpk) ,     & 
    159             &      hi  (jpi,jpj,jpk)    , excess(jpi,jpj,jpk) ,     & 
     155         ! Biological SMS 
     156         ALLOCATE( xfracal  (jpi,jpj,jpk), orem    (jpi,jpj,jpk),  & 
     157            &      nitrfac  (jpi,jpj,jpk), nitrfac2(jpi,jpj,jpk),  & 
     158            &      prodcal  (jpi,jpj,jpk), xdiss   (jpi,jpj,jpk),  & 
     159            &      prodpoc  (jpi,jpj,jpk), conspoc (jpi,jpj,jpk),  & 
     160            &      prodgoc  (jpi,jpj,jpk), consgoc (jpi,jpj,jpk),  & 
     161            &      blim     (jpi,jpj,jpk), consfe3 (jpi,jpj,jpk),  & 
     162            &      xfecolagg(jpi,jpj,jpk), xcoagfe (jpi,jpj,jpk), STAT=ierr(4) ) 
     163 
     164         !* Carbonate chemistry 
     165         ALLOCATE( ak13  (jpi,jpj,jpk)  ,                          & 
     166            &      ak23(jpi,jpj,jpk)    , aksp  (jpi,jpj,jpk) ,    & 
     167            &      hi  (jpi,jpj,jpk)    , excess(jpi,jpj,jpk) ,    & 
    160168            &      aphscale(jpi,jpj,jpk),                         STAT=ierr(5) ) 
    161169         ! 
    162          !* Temperature dependancy of SMS terms 
    163          ALLOCATE( tgfunc(jpi,jpj,jpk) , tgfunc2(jpi,jpj,jpk),   STAT=ierr(6) ) 
     170         !* Temperature dependency of SMS terms 
     171         ALLOCATE( tgfunc (jpi,jpj,jpk) , tgfunc2(jpi,jpj,jpk),   STAT=ierr(6) ) 
    164172         ! 
    165          !* Sinkong speed 
    166          ALLOCATE( wsbio3 (jpi,jpj,jpk) , wsbio4 (jpi,jpj,jpk),     & 
    167             &                             STAT=ierr(7) )    
     173         !* Sinking speed 
     174         ALLOCATE( wsbio3 (jpi,jpj,jpk) , wsbio4 (jpi,jpj,jpk),   STAT=ierr(7) ) 
     175 
     176         !*  Size of phytoplankton cells 
     177         ALLOCATE( sizen (jpi,jpj,jpk), sized (jpi,jpj,jpk),        & 
     178           &       sizena(jpi,jpj,jpk), sizeda(jpi,jpj,jpk),      STAT=ierr(8) ) 
    168179         !  
    169          IF( ln_ligand ) THEN 
    170            ALLOCATE( plig(jpi,jpj,jpk)  ,                         STAT=ierr(8) ) 
    171          ENDIF 
     180         ALLOCATE( plig(jpi,jpj,jpk)  ,                           STAT=ierr(9) ) 
    172181      ENDIF 
    173182      ! 
    174183      IF( ln_p5z ) THEN 
    175          !        
    176          ALLOCATE( epico(jpi,jpj,jpk)   , epicom(jpi,jpj,jpk) ,   STAT=ierr(9) )  
     184         ! PISCES-QUOTA specific part       
     185         ALLOCATE( epico(jpi,jpj,jpk)   , epicom(jpi,jpj,jpk) ,   STAT=ierr(10) )  
    177186 
    178187         !*  Size of phytoplankton cells 
    179          ALLOCATE( sizen(jpi,jpj,jpk), sizep(jpi,jpj,jpk),         & 
    180            &       sized(jpi,jpj,jpk),                            STAT=ierr(10) ) 
     188         ALLOCATE( sizep(jpi,jpj,jpk), sizepa(jpi,jpj,jpk),       STAT=ierr(11) ) 
    181189      ENDIF 
    182190      ! 
  • NEMO/trunk/src/TOP/PISCES/trcini_pisces.F90

    r15450 r15459  
    33   !!                         ***  MODULE trcini_pisces  *** 
    44   !! TOP :   initialisation of the PISCES biochemical model 
     5   !!         This module is for LOBSTER, PISCES and PISCES-QUOTA 
    56   !!====================================================================== 
    67   !! History :    -   !  1988-07  (E. Maier-Reiner) Original code 
     
    3738      !! 
    3839      !! ** Purpose :   Initialisation of the PISCES biochemical model 
     40      !!                Allocation of the dynamic arrays 
    3941      !!---------------------------------------------------------------------- 
    4042      INTEGER, INTENT(in)  ::  Kmm      ! time level indices 
    4143      ! 
     44      ! Read the PISCES namelist 
    4245      CALL trc_nam_pisces 
    4346      ! 
     
    5558      !! ** Purpose :   Initialisation of the PISCES biochemical model 
    5659      !!---------------------------------------------------------------------- 
    57       USE p4zsms          ! Main P4Z routine 
     60      USE p4zsms          !  Main P4Z routine 
    5861      USE p4zche          !  Chemical model 
    5962      USE p4zsink         !  vertical flux of particulate matter due to sinking 
     
    7275      USE p4zpoc          !  Remineralization of organic particles 
    7376      USE p4zligand       !  Remineralization of organic ligands 
    74       USE p5zlim          !  Co-limitations of differents nutrients 
    75       USE p5zprod         !  Growth rate of the 2 phyto groups 
    76       USE p5zmicro        !  Sources and sinks of microzooplankton 
    77       USE p5zmeso         !  Sources and sinks of mesozooplankton 
    78       USE p5zmort         !  Mortality terms for phytoplankton 
     77      USE p5zlim          !  Co-limitations of differents nutrients (QUOTA) 
     78      USE p5zprod         !  Growth rate of the 3 phyto groups (QUOTA) 
     79      USE p5zmicro        !  Sources and sinks of microzooplankton (QUOTA) 
     80      USE p5zmeso         !  Sources and sinks of mesozooplankton (QUOTA) 
     81      USE p5zmort         !  Mortality terms for phytoplankton (QUOTA) 
    7982      ! 
    8083      INTEGER, INTENT(in)  ::  Kmm      ! time level indices 
     
    104107      bioma0 =  1.000e-8_wp   
    105108      silic1 =  91.51e-6_wp   
    106       no3    =  30.9e-6_wp * 7.625_wp 
     109      no3    =  30.9e-6_wp * 7.3125_wp 
    107110      ! 
    108111      ! Allocate PISCES arrays 
     
    115118      ierr = ierr +  p4z_lim_alloc() 
    116119      IF( ln_p4z ) THEN 
     120         ! PISCES part 
    117121         ierr = ierr +  p4z_prod_alloc() 
     122         ierr = ierr +  p4z_meso_alloc() 
    118123      ELSE 
     124         ! PISCES-QUOTA part 
    119125         ierr = ierr +  p5z_lim_alloc() 
    120126         ierr = ierr +  p5z_prod_alloc() 
     127         ierr = ierr +  p5z_meso_alloc() 
    121128      ENDIF 
    122129      ierr = ierr +  p4z_rem_alloc() 
     
    130137 
    131138      ! assign an index in trc arrays for each prognostic variables 
     139      ! This is based on the information read in the namelist_top 
    132140      DO jn = 1, jptra 
    133141        cltra = ctrcnm(jn)  
     
    179187      ! Set biological ratios 
    180188      ! --------------------- 
    181       rno3    =  16._wp / 122._wp 
    182       po4r    =   1._wp / 122._wp 
    183       o2nit   =  32._wp / 122._wp 
    184       o2ut    = 133._wp / 122._wp 
    185       rdenit  =  ( ( o2ut + o2nit ) * 0.80 - rno3 - rno3 * 0.60 ) / rno3 
    186       rdenita =   3._wp /  5._wp 
     189      rno3    =  16._wp / 117._wp   ! C/N 
     190      po4r    =   1._wp / 117._wp   ! C/P 
     191      o2nit   =  32._wp / 117._wp   ! O2/C for nitrification 
     192      o2ut    = 138._wp / 117._wp   ! O2/C for ammonification 
     193      rdenit  =  ( ( o2ut + o2nit ) * 0.80 - rno3 - rno3 * 0.60 ) / rno3  ! Denitrification 
     194      rdenita =   3._wp /  5._wp    ! Denitrification 
    187195      IF( ln_p5z ) THEN 
    188          no3rat3 = no3rat3 / rno3 
    189          po4rat3 = po4rat3 / po4r 
     196         no3rat3 = no3rat3 / rno3   ! C/N ratio in zooplankton 
     197         po4rat3 = po4rat3 / po4r   ! C/P ratio in zooplankton 
    190198      ENDIF 
    191199 
     
    239247         ! initialize the half saturation constant for silicate 
    240248         ! ---------------------------------------------------- 
    241          xksi(:,:)    = 2.e-6 
    242          xksimax(:,:) = xksi(:,:) 
    243          IF( ln_p5z ) THEN 
    244             sized(:,:,:) = 1.0 
    245             sizen(:,:,:) = 1.0 
    246             sized(:,:,:) = 1.0 
    247          ENDIF 
     249         xksi(:,:)      = 2.e-6 
     250         xksimax(:,:)   = xksi(:,:) 
     251         consfe3(:,:,:) = 0._wp 
     252         ! 
     253         sized(:,:,:) = 1.0 
     254         sizen(:,:,:) = 1.0 
     255         IF( ln_p5z )  sizep(:,:,:) = 1.0 
    248256      END IF 
    249257 
    250258 
     259      ! Initialization of the different PISCES modules 
     260      ! Mainly corresponds to the namelist use 
     261      ! ---------------------------------------------- 
    251262      CALL p4z_sink_init         !  vertical flux of particulate organic matter 
    252263      CALL p4z_opt_init          !  Optic: PAR in the water column 
    253264      IF( ln_p4z ) THEN 
     265         ! PISCES part 
    254266         CALL p4z_lim_init       !  co-limitations by the various nutrients 
    255267         CALL p4z_prod_init      !  phytoplankton growth rate over the global ocean. 
    256268      ELSE 
     269         ! PISCES-QUOTA part 
    257270         CALL p5z_lim_init       !  co-limitations by the various nutrients 
    258271         CALL p5z_prod_init      !  phytoplankton growth rate over the global ocean. 
     
    265278         & CALL p4z_ligand_init  !  remineralisation of organic ligands 
    266279 
    267       IF( ln_p4z ) THEN 
     280      IF( ln_p4z ) THEN ! PISCES-std 
    268281         CALL p4z_mort_init      !  phytoplankton mortality  
    269282         CALL p4z_micro_init     !  microzooplankton 
    270283         CALL p4z_meso_init      !  mesozooplankton 
    271       ELSE 
     284      ELSE ! PISCES-QUOTA 
    272285         CALL p5z_mort_init      !  phytoplankton mortality  
    273286         CALL p5z_micro_init     !  microzooplankton 
     
    280293      ! Initialization of the sediment model 
    281294      IF( ln_sediment)   & 
    282         & CALL sed_ini ! Initialization of the sediment model  
     295        & CALL sed_ini           ! Initialization of the sediment model  
    283296 
    284297      CALL p4z_sed_init          ! loss of organic matter in the sediments  
  • NEMO/trunk/src/TOP/PISCES/trcsms_pisces.F90

    r12377 r15459  
    33   !!                         ***  MODULE trcsms_pisces  *** 
    44   !! TOP :   PISCES Source Minus Sink manager 
     5   !!         This module is for LOBSTER, PISCES and PISCES-QUOTA 
    56   !!====================================================================== 
    67   !! History :   1.0  !  2004-03 (O. Aumont) Original code 
     
    3031      !! 
    3132      !! ** Purpose :   Managment of the call to Biological sources and sinks  
    32       !!                routines of PISCES or LOBSTER bio-model 
     33      !!                routines of PISCES/PISCES-QUOTA or LOBSTER bio-model 
    3334      !! 
    3435      !!--------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.