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 14385 for NEMO/branches/2021 – NEMO

Changeset 14385 for NEMO/branches/2021


Ignore:
Timestamp:
2021-02-03T16:03:34+01:00 (3 years ago)
Author:
cetlod
Message:

dev_r11708_aumont_PISCES_QUOTA : merge with the trunk

Location:
NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO
Files:
2 added
2 deleted
39 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/cfgs/SHARED/field_def_nemo-pisces.xml

    r14209 r14385  
    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="dzdep"       long_name="Sedimentation rate"                      unit="cm/s"     /> 
     155       <field id="sflxclay"    long_name="Clay sedimentation rate"                 unit="g/cm2/s"     /> 
     156       <field id="sflxbsi"     long_name="BSi sedimentation rate"                  unit="g/cm2/s"     /> 
     157       <field id="sflxpoc"     long_name="POC sedimentation rate"                  unit="g/cm2/s"     /> 
     158       <field id="sflxcal"     long_name="Calcite sedimentation rate"              unit="g/cm2/s"     /> 
     159       <field id="FlxClay"     long_name="Clay burial rate"                        unit="g/cm2/s"     /> 
     160       <field id="FlxCaCO3"    long_name="Calcite burial rate"                     unit="g/cm2/s"     /> 
     161       <field id="FlxBSi"      long_name="BSi burial rate"                         unit="g/cm2/s"     /> 
     162       <field id="FlxPOC"      long_name="POC burial rate"                         unit="g/cm2/s"     /> 
     163       <field id="FlxFeO"      long_name="Fe(OH)3 burial rate"                     unit="g/cm2/s"     /> 
     164       <field id="FlxFeS"      long_name="FeS burial rate"                         unit="g/cm2/s"     /> 
     165       <field id="FlxPOR"      long_name="POR burial rate"                         unit="g/cm2/s"     /> 
     166       <field id="FlxPOS"      long_name="POS burial rate"                         unit="g/cm2/s"     /> 
     167       <field id="Flxtot"      long_name="total burial flux"                       unit="g/cm2/s"     /> 
    159168  </field_group> 
    160169 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/cfgs/SHARED/namelist_pisces_ref

    r12845 r14385  
    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    = .false.        !  PISCES model used 
     17  ln_p5z    = .true.         !  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'    ,     -1.           , 'patm'    ,  .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      =  2.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.00944 ! 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   =  3.E-9    ! Iron half saturation for phyto 
     70   concdfer   =  9.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 
    82    caco3r     =  0.3      ! mean rain ratio 
     81   qnfelim    =  10.E-6   ! Optimal quota of phyto 
     82   qdfelim    =  10.E-6   ! Optimal quota of diatoms 
     83   caco3r     =  0.28     ! mean rain ratio 
    8384   oxymin     =  1.E-6    ! Half-saturation constant for anoxia 
    8485/ 
     
    8687&namp5zlim     !   parameters for nutrient limitations PISCES QUOTA    - ln_p5z 
    8788!----------------------------------------------------------------------- 
    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 
     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   =  6E-9     ! Iron half saturation for phyto 
     99   concpfer   =  2E-9     ! Iron half saturation for picophytoplankton 
     100   concdfer   =  9E-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 
    104105   xsizedia   =  1.E-6    ! Minimum size criteria for diatoms 
    105106   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 
     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 
    109110   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 
     111   xksi1      =  8.E-6    ! half saturation constant for Si uptake 
     112   xksi2      =  20E-6    ! half saturation constant for Si/C 
    112113   xkdoc      =  417.E-6  ! half-saturation constant of DOC remineralization 
    113    caco3r     =  0.35     ! mean rain ratio 
     114   caco3r     =  0.5      ! mean rain ratio 
    114115   oxymin     =  1.E-6    ! Half-saturation constant for anoxia 
    115116/ 
     
    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     =  10.E-6   ! Optimal Fe quota of nanophyto 
     121   qfpopt     =  10.E-6   ! Optimal Fe quota of picophyto 
     122   qfdopt     =  10.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 
     
    149150&namp4zprod    !   parameters for phytoplankton growth for PISCES std  - ln_p4z 
    150151!----------------------------------------------------------------------- 
    151    pislopen   =  2.       ! P-I slope 
    152    pisloped   =  2.       ! P-I slope  for diatoms 
     152   pislopen   =  2.5      ! P-I slope 
     153   pisloped   =  2.5      ! P-I slope  for diatoms 
    153154   xadap      =  0.       ! Adaptation factor to low light 
    154155   excretn    =  0.05     ! excretion ratio of phytoplankton 
     
    157158   chlcnm     =  0.033    ! Maximum Chl/C in nanophytoplankton 
    158159   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 
     160   chlcmin    =  0.003    ! Minimum Chl/c in phytoplankton 
     161   fecnm      =  60E-6    ! Maximum Fe/C in nanophytoplankton 
     162   fecdm      =  60E-6    ! Maximum Fe/C in diatoms 
     163   grosip     =  0.13     ! mean Si/C ratio 
    163164/ 
    164165!----------------------------------------------------------------------- 
    165166&namp5zprod    !   parameters for phytoplankton growth for PISCES quota- ln_p5z 
    166167!----------------------------------------------------------------------- 
    167    pislopen   =  3.       ! P-I slope 
    168    pislopep   =  3.       ! P-I slope for picophytoplankton 
    169    pisloped   =  3.       ! P-I slope  for diatoms 
     168   pislopen   =  5        ! P-I slope of nanophytoplankton 
     169   pislopep   =  5        ! P-I slope for picophytoplankton 
     170   pisloped   =  5        ! P-I slope  for diatoms 
    170171   excretn    =  0.05     ! excretion ratio of phytoplankton 
    171172   excretp    =  0.05     ! excretion ratio of picophytoplankton 
     
    173174   xadap      =  0.       ! Adaptation factor to low light 
    174175   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 
     176   thetannm   =  0.3      ! Maximum Chl/N in nanophytoplankton 
     177   thetanpm   =  0.3      ! Maximum Chl/N in picophytoplankton 
     178   thetandm   =  0.4      ! Maximum Chl/N in diatoms 
     179   chlcmin    =  0.003    ! Minimum Chl/c in phytoplankton 
     180   grosip     =  0.12     ! mean Si/C ratio 
    180181/ 
    181182!----------------------------------------------------------------------- 
    182183&namp4zmort    !   parameters for phytoplankton sinks for PISCES std   - ln_p4z 
    183184!----------------------------------------------------------------------- 
    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 
     185   wchln      =  0.01     ! quadratic mortality of phytoplankton 
     186   wchld      =  0.03     ! maximum quadratic mortality of diatoms 
     187   mpratn     =  0.01     ! phytoplankton mortality rate 
     188   mpratd     =  0.01     ! Diatoms mortality rate 
    189189/ 
    190190!----------------------------------------------------------------------- 
     
    193193   wchln      =  0.01     ! quadratic mortality of nanophytoplankton 
    194194   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 
     195   wchld      =  0.03     ! maximum quadratic mortality of diatoms 
    197196   mpratn     =  0.01     ! nanophytoplankton mortality rate 
    198197   mpratp     =  0.01     ! picophytoplankton mortality rate 
    199    mprat2     =  0.01     ! Diatoms mortality rate 
     198   mpratd     =  0.01     ! Diatoms mortality rate 
    200199/ 
    201200!----------------------------------------------------------------------- 
    202201&namp4zmes     !   parameters for mesozooplankton for PISCES std       - ln_p4z 
    203202!----------------------------------------------------------------------- 
    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 
     203   part2       =  0.75     ! part of calcite not dissolved in mesozoo guts 
     204   grazrat2    =  0.5      ! maximal mesozoo grazing rate 
     205   resrat2     =  0.005    ! exsudation rate of mesozooplankton 
     206   mzrat2      =  0.01     ! mesozooplankton mortality rate 
     207   xpref2d     =  1.       ! mesozoo preference for diatoms 
     208   xpref2n     =  0.3      ! mesozoo preference for nanophyto. 
     209   xpref2z     =  1.       ! mesozoo preference for microzoo. 
     210   xpref2c     =  0.3      ! mesozoo preference for poc 
     211   xthresh2zoo =  1E-8     ! zoo feeding threshold for mesozooplankton  
     212   xthresh2dia =  1E-8     ! diatoms feeding threshold for mesozooplankton  
     213   xthresh2phy =  1E-8     ! nanophyto feeding threshold for mesozooplankton  
     214   xthresh2poc =  1E-8     ! poc feeding threshold for mesozooplankton  
     215   xthresh2    =  3E-7     ! Food threshold for grazing 
     216   xkgraz2     =  20.E-6   ! half saturation constant for meso grazing 
     217   epsher2     =  0.4      ! Efficicency of Mesozoo growth 
     218   epsher2min  =  0.4      ! Minimum efficiency of mesozoo growth 
     219   sigma2      =  0.6      ! Fraction of mesozoo excretion as DOM 
     220   unass2      =  0.3      ! non assimilated fraction of P by mesozoo 
     221   grazflux    =  2.e3     ! flux-feeding rate 
     222   xsigma2     =  0.5      ! Predation window size 
     223   xsigma2del  =  1.0      ! Predation window size scaling 
     224   ln_dvm_meso =  .false.  ! Activates DVM for mesozooplankton 
     225   xfracmig    =  0.3      ! Fraction of mesozooplankton performing DVM 
    223226/ 
    224227!----------------------------------------------------------------------- 
    225228&namp5zmes     !   parameters for mesozooplankton 
    226229!----------------------------------------------------------------------- 
    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 
     230   part2       =  0.75     ! part of calcite not dissolved in mesozoo guts 
     231   grazrat2    =  0.5      ! maximal mesozoo grazing rate 
     232   bmetexc2    =  .true.   ! Metabolic use of excess carbon  
     233   resrat2     =  0.005    ! exsudation rate of mesozooplankton 
     234   mzrat2      =  0.01     ! mesozooplankton mortality rate 
     235   xpref2d     =  1.       ! meso preference for diatoms 
     236   xpref2n     =  0.3      ! meso preference for nano 
     237   xpref2z     =  1.       ! meso preference for zoo 
     238   xpref2m     =  0.       ! meso preference for zoo 
     239   xpref2c     =  0.3      ! meso preference for poc 
     240   xthresh2zoo =  1E-8     ! zoo feeding threshold for mesozooplankton 
     241   xthresh2dia =  1E-8     ! diatoms feeding threshold for mesozooplankton 
     242   xthresh2phy =  1E-8     ! nanophyto feeding threshold for mesozooplankton 
     243   xthresh2mes =  1E-8     ! meso feeding threshold for mesozooplankton 
     244   xthresh2poc =  1E-8     ! poc feeding threshold for mesozooplankton 
    242245   xthresh2    =  3E-7     ! Food threshold for grazing 
    243246   xkgraz2     =  20.E-6   ! half sturation constant for meso grazing 
    244247   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 
     248   epsher2min  =  0.5      ! Minimum efficiency of mesozoo growth 
     249   ssigma2     =  0.5      ! Fraction excreted as semi-labile DOM 
     250   srespir2    =  0.2      ! Active respiration 
     251   unass2c     =  0.3      ! non assimilated fraction of C by mesozoo 
     252   unass2n     =  0.3      ! non assimilated fraction of N by mesozoo 
     253   unass2p     =  0.3      ! non assimilated fraction of P by mesozoo 
     254   xsigma2     =  0.5      ! Predation window size 
     255   xsigma2del  =  1.0      ! Predation window size scaling 
     256   grazflux    =  2.e3     ! flux-feeding rate 
     257   ln_dvm_meso =  .false.  ! Activates DVM for mesozooplankton 
     258   xfracmig    =  0.25     ! Fraction of mesozooplankton performing DVM 
    252259/ 
    253260!----------------------------------------------------------------------- 
    254261&namp4zzoo     !   parameters for microzooplankton for PISCES std      - ln_p4z 
    255262!----------------------------------------------------------------------- 
    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 
     263   part       =  0.75     ! part of calcite not dissolved in microzoo guts 
     264   grazrat    =  2.0      ! maximal zoo grazing rate 
     265   resrat     =  0.02     ! Linear mortality rate of zooplankton 
     266   mzrat      =  0.005    ! zooplankton mortality rate 
    260267   xprefc     =  0.1      ! Microzoo preference for POM 
    261268   xprefn     =  1.       ! Microzoo preference for Nanophyto 
    262    xprefd     =  0.6      ! Microzoo preference for Diatoms 
     269   xprefd     =  0.8      ! Microzoo preference for Diatoms 
    263270   xthreshdia =  1.E-8    ! Diatoms feeding threshold for microzooplankton  
    264271   xthreshphy =  1.E-8    ! Nanophyto feeding threshold for microzooplankton  
     
    266273   xthresh    =  3.E-7    ! Food threshold for feeding 
    267274   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 
     275   epsher     =  0.4     ! Efficiency of microzoo growth 
     276   epshermin  =  0.4     ! Minimum efficiency of microzoo growth 
    270277   sigma1     =  0.6      ! Fraction of microzoo excretion as DOM 
    271278   unass      =  0.3      ! non assimilated fraction of phyto by zoo 
     279   xsigma     =  0.5      ! Predation window size 
     280   xsigmadel  =  1.0      ! Predation window size scaling 
    272281/ 
    273282!----------------------------------------------------------------------- 
    274283&namp5zzoo     !   parameters for microzooplankton 
    275284!----------------------------------------------------------------------- 
    276    part       =  0.5      ! part of calcite not dissolved in microzoo gutsa 
    277    grazrat    =  2.75     ! maximal zoo grazing rate 
     285   part       =  0.75     ! part of calcite not dissolved in microzoo gutsa 
     286   grazrat    =  2.0      ! maximal zoo grazing rate 
    278287   bmetexc    =  .true.   ! Metabolic use of excess carbon 
    279    resrat     =  0.03     ! exsudation rate of zooplankton 
     288   resrat     =  0.02     ! exsudation rate of zooplankton 
    280289   mzrat      =  0.005    ! zooplankton mortality rate 
    281290   xprefc     =  0.1      ! Microzoo preference for POM 
    282    xprefn     =  1.       ! Microzoo preference for Nanophyto 
    283    xprefp     =  1.6      ! Microzoo preference for picophyto 
    284    xprefd     =  1.0      ! Microzoo preference for Diatoms 
    285    xprefz     =  0.3      ! Microzoo preference for microzooplankton 
     291   xprefn     =  1.0      ! Microzoo preference for Nanophyto 
     292   xprefp     =  1.0      ! Microzoo preference for picophyto 
     293   xprefd     =  0.8      ! Microzoo preference for Diatoms 
     294   xprefz     =  0.       ! Microzoo preference for microzooplankton 
    286295   xthreshdia =  1.E-8    ! Diatoms feeding threshold for microzooplankton 
    287296   xthreshphy =  1.E-8    ! Nanophyto feeding threshold for microzooplankton 
    288    xthreshpic =  1.E-8 
    289    xthreshzoo =  1.E-8    ! Nanophyto feeding threshold for microzooplankton 
     297   xthreshpic =  1.E-8    ! Picophyto feeding threshold for microzooplankton 
     298   xthreshzoo =  1.E-8    ! Microzoo feeding threshold for microzooplankton 
    290299   xthreshpoc =  1.E-8    ! POC feeding threshold for microzooplankton 
    291300   xthresh    =  3.E-7    ! Food threshold for feeding 
    292    xkgraz     =  20.E-6   ! half sturation constant for grazing 
     301   xkgraz     =  20.E-6   ! half saturation constant for grazing 
    293302   epsher     =  0.5      ! Efficiency of microzoo growth 
    294    epshermin  =  0.2      ! Minimum efficiency of microzoo growth 
     303   epshermin  =  0.5      ! Minimum efficiency of microzoo growth 
    295304   ssigma     =  0.5      ! Fraction excreted as semi-labile DOM 
    296305   srespir    =  0.2      ! Active respiration 
    297306   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 
     307   unassn     =  0.3      ! non assimilated fraction of N by zoo 
     308   unassp     =  0.3      ! non assimilated fraction of P by zoo 
     309   xsigma     =  0.5      ! Predation window size 
     310   xsigmadel  =  1.0      ! Predation window size scaling 
    300311/ 
    301312!----------------------------------------------------------------------- 
    302313&nampisfer     !   parameters for iron chemistry 
    303314!----------------------------------------------------------------------- 
    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  
     315   ln_ligvar =  .false.   ! variable ligand concentration 
     316   xlam1     =  0.05      ! scavenging rate of Iron by biogenic particles 
     317   xlamdust  =  150.0     ! Scavenging rate of Iron by dust 
     318   ligand    =  1E-9     ! Ligands concentration  
    308319   kfep      =  0.01      ! Nanoparticle formation rate constant 
     320   scaveff   =  1.0       ! Fraction of scavenged Fe that goes to POFe 
    309321/ 
    310322!-----------------------------------------------------------------------   
    311323&nampisrem     !   parameters for remineralization 
    312324!----------------------------------------------------------------------- 
    313    xremik    =  0.3       ! remineralization rate of DOC 
    314325   nitrif    =  0.05      ! NH4 nitrification rate 
    315326   xsirem    =  0.003     ! remineralization rate of Si 
    316327   xsiremlab =  0.03      ! fast remineralization rate of Si 
    317328   xsilab    =  0.5       ! Fraction of labile biogenic silica 
    318    feratb    =  10.E-6    ! Fe/C quota in bacteria 
     329   feratb    =  30.E-6    ! Fe/C quota in bacteria 
    319330   xkferb    =  3E-10     ! Half-saturation constant for bacteria Fe/C 
    320331!                         ! 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 
     332   xremikc   =  0.4       ! remineralization rate of DOC 
     333   xremikn   =  0.4       ! remineralization rate of DON 
     334   xremikp   =  0.5       ! remineralization rate of DOP 
    326335/ 
    327336!----------------------------------------------------------------------- 
    328337&nampispoc     !   parameters for organic particles 
    329338!----------------------------------------------------------------------- 
    330    xremip    =  0.035     ! remineralisation rate of PON 
     339   xremip    =  0.035     ! remineralisation rate of POC 
    331340   jcpoc     =  15        ! Number of lability classes 
    332341   rshape    =  1.0       ! Shape of the gamma function 
    333342!                         ! 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 
     343   xremipc   =  0.028     ! remineralisation rate of POC 
     344   xremipn   =  0.03      ! remineralisation rate of PON 
     345   xremipp   =  0.035     ! remineralisation rate of POP 
    337346/ 
    338347!----------------------------------------------------------------------- 
    339348&nampiscal     !   parameters for Calcite chemistry 
    340349!----------------------------------------------------------------------- 
    341    kdca       =  6.       ! calcite dissolution rate constant (1/time) 
    342    nca        =  1.       ! order of dissolution reaction (dimensionless) 
     350   kdca       =  3.       ! calcite dissolution rate constant (1/time) 
     351   nca        =  2.       ! order of dissolution reaction (dimensionless) 
    343352/ 
    344353!----------------------------------------------------------------------- 
     
    358367   distcoast   =  5.e3     ! Distance off the coast for Iron from sediments 
    359368   mfrac       =  0.035    ! Fe mineral fraction of dust 
    360    wdust       =  2.0      ! Dust sinking speed  
     369   wdust       =  2.0      ! Dust sinking speed 
    361370   icefeinput  =  15.e-9   ! Iron concentration in sea ice 
    362    hratio      =  1.e+7    ! Fe to 3He ratio assumed for vent iron supply  
     371   hratio      =  1.e+7    ! Fe to 3He ratio assumed for vent iron supply 
    363372!                          ! 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) 
    371    concfediaz  =  1.e-10   ! Diazotrophs half-saturation Cste for Iron 
     373   lgw_rath    =  0.5      ! Weak ligand ratio from sed hydro sources 
    372374/ 
    373375!----------------------------------------------------------------------- 
    374376&nampislig     !   Namelist parameters for ligands, nampislig 
    375377!----------------------------------------------------------------------- 
    376    rlgw        =  100.     ! Lifetime (years) of weak ligands 
     378   rlgw        =  200.     ! Lifetime (years) of weak ligands 
    377379   rlig        =  1.E-4    ! Remin ligand production per unit C 
    378    prlgw       =  1.E-4    ! Photolysis of weak ligand 
     380   prlgw       =  5.E-4    ! Photolysis of weak ligand 
    379381   rlgs        =  1.       ! Lifetime (years) of strong ligands 
     382   xklig       =  1.E-9    ! 1/2 saturation constant of photolysis 
    380383/ 
    381384!----------------------------------------------------------------------- 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zagg.F90

    r13295 r14385  
    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( 1, 1, 1, 1, 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/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zbc.F90

    r13295 r14385  
    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         DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 
     100            zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) 
     101            ! 
     102            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zdustdep * mfrac / mMass_Fe  
     103            tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zdustdep * 1.e-3 / mMass_P 
     104            tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) + zdustdep * 0.269 / mMass_Si 
     105         END_3D 
    99106         ! 
    100107         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 
     108             ! surface downward dust depo of iron 
     109             jl = n_trc_indsbc(jpfer) 
     110             CALL iom_put( "Irondep", ( rf_trsfac(jl) * sf_trcsbc(jl)%fnow(:,:,1) / rn_sbc_time ) * 1.e+3 * rfactr * tmask(:,:,1) ) 
     111 
     112             ! dust concentration at surface 
    102113             CALL iom_put( "pdust"  , dust(:,:) / ( wdust * rday ) * tmask(:,:,1) ) ! dust concentration at surface 
    103114         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 
     115      ENDIF 
     116 
    109117      ! ----------------------------------------- 
    110             ! Add the external input of nutrients from river 
     118      ! Add the external input of nutrients from river 
    111119      ! ---------------------------------------------------------- 
    112120      IF( ll_river ) THEN 
     
    124132      ! ---------------------------------------------------------- 
    125133      IF( ll_ndepo ) THEN 
    126          ALLOCATE( zndep(jpi,jpj) ) 
    127134         IF( ln_trc_sbc(jpno3) ) THEN 
    128135            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 
     136            DO_2D( 1, 1, 1, 1 ) 
     137               zndep = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(ji,jj,1) / e3t(ji,jj,1,Kmm) / rn_sbc_time 
     138               tr(ji,jj,1,jptal,Krhs) = tr(ji,jj,1,jptal,Krhs) - rno3 * zndep * rfact 
     139            END_2D 
    131140         ENDIF 
    132141         IF( ln_trc_sbc(jpnh4) ) THEN 
    133142            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. 
     143            DO_2D( 1, 1, 1, 1 ) 
     144               zndep = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(ji,jj,1) / e3t(ji,jj,1,Kmm) / rn_sbc_time 
     145               tr(ji,jj,1,jptal,Krhs) = tr(ji,jj,1,jptal,Krhs) - rno3 * zndep * rfact 
     146            END_2D 
     147         ENDIF 
     148      ENDIF 
     149      ! 
     150      ! Iron input/uptake due to sea ice : Crude parameterization based on  
     151      ! Lancelot et al. Iron concentration in sea-ice is constant and set  
     152      ! in the namelist_pisces (icefeinput). ln_ironice is forced to false 
     153      ! when nn_ice_tr = 1 
    142154      ! ---------------------------------------------------- 
    143155      IF( ln_ironice ) THEN 
    144156         ! 
    145          ALLOCATE( zironice(jpi,jpj) ) 
    146          ! 
     157         ! Compute the iron flux between sea ice and sea water 
     158         ! Simple parameterization assuming a fixed constant concentration in 
     159         ! sea-ice (icefeinput) 
     160         ! ------------------------------------------------------------------          
    147161         DO_2D( 1, 1, 1, 1 ) 
    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 ) 
     162            zdep     = rfact / e3t(ji,jj,1,Kmm) 
     163            zwflux   = fmmflx(ji,jj) / 1000._wp 
     164            zironice =  MAX( -0.99 * tr(ji,jj,1,jpfer,Kbb), -zwflux * icefeinput * zdep ) 
     165            tr(ji,jj,1,jpfer,Krhs) = tr(ji,jj,1,jpfer,Krhs) + zironice 
    151166         END_2D 
    152167         ! 
    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 ) 
     168         ! iron flux from ice 
     169         IF( lk_iomput ) & 
     170         & CALL iom_put( "Ironice", MAX( -0.99 * tr(:,:,1,jpfer,Kbb), (-1.*fmmflx(:,:)/1000._wp )*icefeinput*1.e+3*tmask(:,:,1)) ) 
    158171         ! 
    159172      ENDIF 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zbio.F90

    r13295 r14385  
    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( 1, 1, 1, 1, 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/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zfechem.F90

    r13472 r14385  
    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, zfecoll, fe3sol, zligco 
     59      REAL(wp) ::   zscave, zaggdfea, zaggdfeb, ztrc, zdust, zklight 
     60      REAL(wp) ::   ztfe, zhplus, zxlam, zaggliga, zaggligb 
     61      REAL(wp) ::   zrfact2 
    7062      CHARACTER (len=25) :: charout 
    71       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zTL1, zFe3, ztotlig, precip, zFeL1 
    72       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zcoll3d, zscav3d, zlcoll3d 
     63      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zTL1, zFe3, ztotlig, precip, precipno3, zFeL1 
     64      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zcoll3d, zscav3d, zlcoll3d, zprecip3d 
    7365      !!--------------------------------------------------------------------- 
    7466      ! 
    7567      IF( ln_timing )   CALL timing_start('p4z_fechem') 
    7668      ! 
     69      zFe3 (:,:,:) = 0. 
     70      zFeL1(:,:,:) = 0. 
     71      zTL1 (:,:,:) = 0. 
     72 
    7773      ! Total ligand concentration : Ligands can be chosen to be constant or variable 
    78       ! Parameterization from Tagliabue and Voelker (2011) 
     74      ! Parameterization from Pham and Ito (2018) 
    7975      ! ------------------------------------------------- 
    8076      IF( ln_ligvar ) THEN 
    81          ztotlig(:,:,:) =  0.09 * tr(:,:,:,jpdoc,Kbb) * 1E6 + ligand * 1E9 
     77         ztotlig(:,:,:) =  0.09 * 0.667 * tr(:,:,:,jpdoc,Kbb) * 1E6 + ligand * 1E9 + MAX(0., chemo2(:,:,:) - tr(:,:,:,jpoxy,Kbb) ) / 400.E-6 
    8278         ztotlig(:,:,:) =  MIN( ztotlig(:,:,:), 10. ) 
    8379      ELSE 
    8480        IF( ln_ligand ) THEN  ;   ztotlig(:,:,:) = tr(:,:,:,jplgw,Kbb) * 1E9 
    85         ELSE                  ;   ztotlig(:,:,:) = ligand * 1E9 
     81        ELSE                  ;   ztotlig(:,:,:) = ligand * 1E9  
    8682        ENDIF 
    8783      ENDIF 
     
    8985      ! ------------------------------------------------------------ 
    9086      !  from Aumont and Bopp (2006) 
    91       ! This model is based on one ligand and Fe'  
     87      ! This model is based on one ligand, Fe2+ and Fe3+  
    9288      ! Chemistry is supposed to be fast enough to be at equilibrium 
    9389      ! ------------------------------------------------------------ 
    9490      DO_3D( 1, 1, 1, 1, 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) ) 
     91          zTL1(ji,jj,jk)  = ztotlig(ji,jj,jk) 
     92          zkeq            = fekeq(ji,jj,jk) 
     93          zklight         = 4.77E-7 * etot(ji,jj,jk) * 0.5 / 10**-6.3 
     94          zfesatur        = zTL1(ji,jj,jk) * 1E-9 
     95          ztfe            = (1.0 + zklight) * tr(ji,jj,jk,jpfer,Kbb)  
     96          ! Fe' is the root of a 2nd order polynom 
     97          zFe3 (ji,jj,jk) = ( -( 1. + zfesatur * zkeq + zklight + consfe3(ji,jj,jk)/10**-6.3 - zkeq * tr(ji,jj,jk,jpfer,Kbb) )               & 
     98             &              + SQRT( ( 1. + zfesatur * zkeq + zklight + consfe3(ji,jj,jk)/10**-6.3 - zkeq * tr(ji,jj,jk,jpfer,Kbb) )**2       & 
     99             &              + 4. * ztfe * zkeq) ) / ( 2. * zkeq ) 
     100          zFeL1(ji,jj,jk) = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) - zFe3(ji,jj,jk) ) 
    105101      END_3D 
    106          ! 
    107  
     102      ! 
     103      plig(:,:,:) =  MAX( 0., ( zFeL1(:,:,:) / ( tr(:,:,:,jpfer,Kbb) + rtrn ) ) ) 
     104      ! 
    108105      zdust = 0.         ! if no dust available 
    109106      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     
    117114         &         + fesol(ji,jj,jk,5) / zhplus ) 
    118115         ! 
    119          zfeequi = zFe3(ji,jj,jk) * 1E-9 
    120116         zfecoll = 0.5 * zFeL1(ji,jj,jk) * 1E-9 
    121117         ! precipitation of Fe3+, creation of nanoparticles 
    122          precip(ji,jj,jk) = MAX( 0., ( zFe3(ji,jj,jk) * 1E-9 - fe3sol ) ) * kfep * xstep 
     118         precip(ji,jj,jk) = MAX( 0., ( zFe3(ji,jj,jk) - fe3sol ) ) * kfep * xstep * ( 1.0 - nitrfac(ji,jj,jk) )  
     119         ! Precipitation of Fe2+ due to oxidation by NO3 (Croot et al., 2019) 
     120         ! This occurs in anoxic waters only 
     121         precipno3(ji,jj,jk) = 2.0 * 130.0 * tr(ji,jj,jk,jpno3,Kbb) * nitrfac(ji,jj,jk) * xstep * zFe3(ji,jj,jk) 
    123122         ! 
    124123         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) 
     124         ztrc = MAX( rtrn, ztrc ) 
     125         IF( ll_dust )  zdust  = dust(ji,jj) / ( wdust / rday ) * tmask(ji,jj,jk) 
     126         zxlam  = MAX( 1.E-3, (1. - EXP(-2 * tr(ji,jj,jk,jpoxy,Kbb) / 100.E-6 ) )) 
     127         zlam1b = 3.e-5 + ( xlamdust * zdust + xlam1 * ztrc ) * zxlam 
     128         zscave = zFe3(ji,jj,jk) * zlam1b * xstep 
    148129 
    149130         !  Compute the coagulation of colloidal iron. This parameterization  
     
    151132         !  It requires certainly some more work as it is very poorly constrained. 
    152133         !  ---------------------------------------------------------------- 
    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) ) 
     134         zlam1a   = ( 12.0  * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 9.05  * tr(ji,jj,jk,jppoc,Kbb) ) * xdiss(ji,jj,jk)    & 
     135             &    + ( 2.49  * tr(ji,jj,jk,jppoc,Kbb) )     & 
     136             &    + ( 127.8 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 725.7 * tr(ji,jj,jk,jppoc,Kbb) ) 
    155137         zaggdfea = zlam1a * xstep * zfecoll 
    156          ! 
    157          zlam1b   = 3.53E3 * tr(ji,jj,jk,jpgoc,Kbb) * xdiss(ji,jj,jk) 
     138               ! 
     139         zlam1b   = ( 1.94 * xdiss(ji,jj,jk) + 1.37 ) * tr(ji,jj,jk,jpgoc,Kbb) 
    158140         zaggdfeb = zlam1b * xstep * zfecoll 
     141 
    159142         ! 
    160143         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 
     144         &                       - precip(ji,jj,jk) - precipno3(ji,jj,jk) 
     145 
     146         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc 
     147         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc 
     148 
     149 
     150          ! Precipitated iron is supposed to be permanently lost. 
     151          ! Scavenged iron is supposed to be released back to seawater 
     152          ! when POM is solubilized. This is highly uncertain as probably 
     153          ! a significant part of it may be rescavenged back onto  
     154          ! the particles. An efficiency factor is applied that is read 
     155          ! in the namelist.  
     156          ! See for instance Tagliabue et al. (2019). 
     157          ! Aggregated FeL is considered as biogenic Fe as it  
     158          ! probably remains  complexed when the particle is solubilized. 
     159          ! ------------------------------------------------------------- 
     160          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zaggdfea 
     161          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zaggdfeb 
     162          ! 
     163          zscav3d(ji,jj,jk)   = zscave  
     164          zcoll3d(ji,jj,jk)   = zaggdfea + zaggdfeb 
     165          zprecip3d(ji,jj,jk) = precip(ji,jj,jk) + precipno3(ji,jj,jk) 
    166166         ! 
    167167      END_3D 
     
    174174         ! 
    175175         DO_3D( 1, 1, 1, 1, 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 
     176             ! Coagulation of ligands due to various processes (Brownian, shear, diff. sedimentation 
     177             ! Coefficients are taken from p4zagg 
     178             ! ------------------------------------------------------------------------------------- 
     179             zlam1a   = ( 12.0  * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 9.05  * tr(ji,jj,jk,jppoc,Kbb) ) * xdiss(ji,jj,jk)    & 
     180                 &    + ( 2.49  * tr(ji,jj,jk,jppoc,Kbb) )     & 
     181                 &    + ( 127.8 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 725.7 * tr(ji,jj,jk,jppoc,Kbb) ) 
     182             ! 
     183             zlam1b   = ( 1.94 * xdiss(ji,jj,jk) + 1.37 ) * tr(ji,jj,jk,jpgoc,Kbb) 
     184             ! 50% of the ligands are supposed to be in the colloidal size fraction 
     185             ! as for FeL 
     186             zligco   = 0.5 * tr(ji,jj,jk,jplgw,Kbb) 
     187             zaggliga = zlam1a * xstep * zligco  
     188             zaggligb = zlam1b * xstep * zligco 
     189             ! 
     190             tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs)  - zaggliga - zaggligb 
     191             zlcoll3d(ji,jj,jk)  = zaggliga + zaggligb 
    185192         END_3D 
    186          ! 
    187193         plig(:,:,:) =  MAX( 0., ( ( zFeL1(:,:,:) * 1E-9 ) / ( tr(:,:,:,jpfer,Kbb) +rtrn ) ) ) 
    188194         ! 
     
    190196      !  Output of some diagnostics variables 
    191197      !     --------------------------------- 
    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 
     198      IF( lk_iomput .AND. knt == nrdttrc ) THEN 
     199         zrfact2 = 1.e3 * rfact2r  ! conversion from mol/L/timestep into mol/m3/s 
     200         IF( iom_use("Fe3")    )  CALL iom_put("Fe3"    , zFe3   (:,:,:)       * tmask(:,:,:) )   ! Fe3+ 
     201         IF( iom_use("FeL1")   )  CALL iom_put("FeL1"   , zFeL1  (:,:,:)       * tmask(:,:,:) )   ! FeL1 
     202         IF( iom_use("TL1")    )  CALL iom_put("TL1"    , zTL1   (:,:,:)       * tmask(:,:,:) )   ! TL1 
     203         IF( iom_use("Totlig") )  CALL iom_put("Totlig" , ztotlig(:,:,:)       * tmask(:,:,:) )   ! TL 
     204         IF( iom_use("Biron")  )  CALL iom_put("Biron"  , biron  (:,:,:)  * 1e9 * tmask(:,:,:) )   ! biron 
     205         IF( iom_use("FESCAV") )  CALL iom_put("FESCAV" , zscav3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 ) 
     206         IF( iom_use("FECOLL") )  CALL iom_put("FECOLL" , zcoll3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 ) 
     207         IF( iom_use("FEPREC") )  CALL iom_put("FEPREC" , zprecip3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 ) 
     208         IF( iom_use("LGWCOLL"))  CALL iom_put("LGWCOLL", zlcoll3d(:,:,:) * 1e9 * tmask(:,:,:) * zrfact2 ) 
    216209      ENDIF 
    217210 
     
    241234      INTEGER ::   ios   ! Local integer  
    242235      !! 
    243       NAMELIST/nampisfer/ ln_ligvar, xlam1, xlamdust, ligand, kfep  
     236      NAMELIST/nampisfer/ ln_ligvar, xlam1, xlamdust, ligand, kfep, scaveff  
    244237      !!---------------------------------------------------------------------- 
    245238      ! 
     
    263256         WRITE(numout,*) '      ligand concentration in the ocean         ligand       =', ligand 
    264257         WRITE(numout,*) '      rate constant for nanoparticle formation  kfep         =', kfep 
     258         WRITE(numout,*) '      Scavenged iron that is added to POFe      scaveff      =', scaveff 
    265259      ENDIF 
    266260      !  
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zflx.F90

    r13295 r14385  
    336336      IF( ln_presatm ) THEN 
    337337         CALL fld_read( kt, 1, sf_patm )               !* input Patm provided at kt + 1/2 
    338          patm(:,:) = sf_patm(1)%fnow(:,:,1)                        ! atmospheric pressure 
     338         patm(:,:) = sf_patm(1)%fnow(:,:,1)/101325.0     ! atmospheric pressure 
    339339      ENDIF 
    340340      ! 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zint.F90

    r14086 r14385  
    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 
     
    3838      ! 
    3939      INTEGER  :: ji, jj                 ! dummy loop indices 
    40       REAL(wp) :: zvar                   ! local variable 
     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( 1, 1, 1, 1 ) 
    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 jj = 1, jpj 
     78         DO ji = 1, jpi 
     79            zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad ) 
     80            zargu = MAX( -1., MIN(  1., zargu ) ) 
     81            strn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. ) 
     82         END DO 
     83      END DO 
    6184      ! 
    6285      IF( ln_timing )   CALL timing_stop('p4z_int') 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zlim.F90

    r13434 r14385  
    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  
     
    4646 
    4747   !!* 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 
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanono3   !: Nanophyto limitation by NO3 
     49   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatno3   !: Diatoms limitation by NO3 
     50   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanonh4   !: Nanophyto limitation by NH4 
     51   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatnh4   !:  Diatoms limitation by NH4 
     52   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanopo4   !: Nanophyto limitation by PO4 
     53   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatpo4   !: Diatoms limitation by PO4 
     54   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimphy    !: Nutrient limitation term of nanophytoplankton 
     55   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdia    !: Nutrient limitation term of diatoms 
     56   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimnfe    !: Nanophyto limitation by Iron 
     57   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdfe    !: Diatoms limitation by iron 
     58   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimsi     !: Diatoms limitation by Si 
     59   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimbac    !: Bacterial limitation term 
     60   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimbacl   !: Bacterial limitation term 
     61   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   concdfe    !: Limitation of diatoms uptake of Fe 
     62   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   concnfe    !: Limitation of Nano uptake of Fe 
     63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanofer   !: Limitation of Fe uptake by nanophyto 
     64   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatfer   !: Limitation of Fe uptake by diatoms 
     65   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xqfuncfecd, xqfuncfecn 
     66 
     67   ! Coefficient for iron limitation following Flynn and Hipkin (1999) 
    6568   REAL(wp) ::  xcoef1   = 0.0016  / 55.85   
    6669   REAL(wp) ::  xcoef2   = 1.21E-5 * 14. / 55.85 / 7.625 * 0.5 * 1.5 
     
    8184      !! 
    8285      !! ** Purpose :   Compute the co-limitations by the various nutrients 
    83       !!              for the various phytoplankton species 
    84       !! 
    85       !! ** Method  : - ??? 
     86      !!                for the various phytoplankton species 
     87      !! 
     88      !! ** Method  : - Limitation follows the Liebieg law of the minimum 
     89      !!              - Monod approach for N, P and Si. Quota approach  
     90      !!                for Iron 
    8691      !!--------------------------------------------------------------------- 
    8792      INTEGER, INTENT(in)  :: kt, knt 
     
    8994      ! 
    9095      INTEGER  ::   ji, jj, jk 
    91       REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zno3, zferlim 
    92       REAL(wp) ::   zconcd, zconcd2, zconcn, zconcn2 
     96      REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zcoef 
    9397      REAL(wp) ::   z1_trbdia, z1_trbphy, ztem1, ztem2, zetot1, zetot2 
    94       REAL(wp) ::   zdenom, zratio, zironmin 
     98      REAL(wp) ::   zdenom, zratio, zironmin, zbactno3, zbactnh4 
    9599      REAL(wp) ::   zconc1d, zconc1dnh4, zconc0n, zconc0nnh4    
     100      REAL(wp) ::   fananof, fadiatf, znutlim, zfalim 
     101      REAL(wp) ::   znutlimtot, zlimno3, zlimnh4, zbiron 
    96102      !!--------------------------------------------------------------------- 
    97103      ! 
    98104      IF( ln_timing )   CALL timing_start('p4z_lim') 
     105      ! 
     106      sizena(:,:,:) = 1.0  ;  sizeda(:,:,:) = 1.0 
    99107      ! 
    100108      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    101109          
    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  
    109110         ! Computation of a variable Ks for iron on diatoms taking into account 
    110111         ! that increasing biomass is made of generally bigger cells 
     112         ! The allometric relationship is classical. 
    111113         !------------------------------------------------ 
    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 
    116114         z1_trbphy   = 1. / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 
    117115         z1_trbdia   = 1. / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
    118116 
    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 ) 
     117         concnfe(ji,jj,jk) = concnfer * sizen(ji,jj,jk)**0.81 
     118         zconc0n           = concnno3 * sizen(ji,jj,jk)**0.81 
     119         zconc0nnh4        = concnnh4 * sizen(ji,jj,jk)**0.81 
     120 
     121         concdfe(ji,jj,jk) = concdfer * sized(ji,jj,jk)**0.81  
     122         zconc1d           = concdno3 * sized(ji,jj,jk)**0.81  
     123         zconc1dnh4        = concdnh4 * sized(ji,jj,jk)**0.81   
     124 
     125          ! Computation of the optimal allocation parameters 
     126          ! Based on the different papers by Pahlow et al., and  
     127          ! Smith et al. 
     128          ! --------------------------------------------------- 
     129 
     130          ! Nanophytoplankton 
     131          zbiron = ( 75.0 * ( 1.0 - plig(ji,jj,jk) ) + plig(ji,jj,jk) ) * biron(ji,jj,jk) 
     132          znutlim = zbiron / concnfe(ji,jj,jk) 
     133          fananof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
     134 
     135          ! Diatoms 
     136          znutlim = zbiron / concdfe(ji,jj,jk) 
     137          fadiatf = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
     138 
     139          ! Michaelis-Menten Limitation term by nutrients of 
     140          ! heterotrophic bacteria 
     141          ! ------------------------------------------------- 
     142          zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concbno3 + tr(ji,jj,jk,jpnh4,Kbb) ) 
     143          zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( concbno3 + tr(ji,jj,jk,jpno3,Kbb) ) 
     144          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) ) 
     145          zbactnh4 = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     146          zbactno3 = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     147          ! 
     148          zlim1    = zbactno3 + zbactnh4 
     149          zlim2    = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + concbnh4 ) 
     150          zlim3    = tr(ji,jj,jk,jpfer,Kbb) / ( concbfe + tr(ji,jj,jk,jpfer,Kbb) ) 
     151          zlim4    = tr(ji,jj,jk,jpdoc,Kbb) / ( xkdoc   + tr(ji,jj,jk,jpdoc,Kbb) ) 
     152          ! Xlimbac is used for DOC solubilization whereas xlimbacl 
     153          ! is used for all the other bacterial-dependent terms 
     154          ! ------------------------------------------------------- 
     155          xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) 
     156          xlimbac (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) * zlim4 
     157 
     158          ! Michaelis-Menten Limitation term by nutrients: Nanophyto 
     159          ! Optimal parameterization by Smith and Pahlow series of  
     160          ! papers is used. Optimal allocation is supposed independant 
     161          ! for all nutrients.  
     162          ! -------------------------------------------------------- 
     163 
     164          ! Limitation of Fe uptake (Quota formalism) 
     165          zfalim = (1.-fananof) / fananof 
     166          xnanofer(ji,jj,jk) = (1. - fananof) * zbiron / ( zbiron + zfalim * concnfe(ji,jj,jk) ) 
     167 
     168          ! Limitation of nanophytoplankton growth 
     169          zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc0n + tr(ji,jj,jk,jpnh4,Kbb) ) 
     170          zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc0n + tr(ji,jj,jk,jpno3,Kbb) ) 
     171          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) ) 
     172          xnanonh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     173          xnanono3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     174          ! 
     175          zlim1    = xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) 
     176          zlim2    = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc0nnh4 ) 
     177          zratio   = tr(ji,jj,jk,jpnfe,Kbb) * z1_trbphy  
     178 
     179          ! The minimum iron quota depends on the size of PSU, respiration 
     180          ! and the reduction of nitrate following the parameterization  
     181          ! proposed by Flynn and Hipkin (1999) 
     182          zironmin = xcoef1 * tr(ji,jj,jk,jpnch,Kbb) * z1_trbphy + xcoef2 * zlim1 + xcoef3 * xnanono3(ji,jj,jk) 
     183          xqfuncfecn(ji,jj,jk) = zironmin + qnfelim 
     184          zlim3    = MAX( 0.,( zratio - zironmin ) / qnfelim ) 
     185          xnanopo4(ji,jj,jk) = zlim2 
     186          xlimnfe (ji,jj,jk) = MIN( 1., zlim3 ) 
     187          xlimphy (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) 
     188                
     189          !   Michaelis-Menten Limitation term by nutrients : Diatoms 
     190          !   ------------------------------------------------------- 
     191          ! Limitation of Fe uptake (Quota formalism) 
     192          zfalim = (1.-fadiatf) / fadiatf 
     193          xdiatfer(ji,jj,jk) = (1. - fadiatf) * zbiron / ( zbiron + zfalim * concdfe(ji,jj,jk) ) 
     194 
     195          ! Limitation of diatoms growth 
     196          zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc1d + tr(ji,jj,jk,jpnh4,Kbb) ) 
     197          zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc1d + tr(ji,jj,jk,jpno3,Kbb) ) 
     198          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) ) 
     199          xdiatnh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn )  
     200          xdiatno3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     201          ! 
     202          zlim1    = xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) 
     203          zlim2    = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc1dnh4  ) 
     204          zlim3    = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi(ji,jj) ) 
     205          zratio   = tr(ji,jj,jk,jpdfe,Kbb) * z1_trbdia 
     206 
     207          ! The minimum iron quota depends on the size of PSU, respiration 
     208          ! and the reduction of nitrate following the parameterization  
     209          ! proposed by Flynn and Hipkin (1999) 
     210          zironmin = xcoef1 * tr(ji,jj,jk,jpdch,Kbb) * z1_trbdia + xcoef2 * zlim1 + xcoef3 * xdiatno3(ji,jj,jk) 
     211          xqfuncfecd(ji,jj,jk) = zironmin + qdfelim 
     212          zlim4    = MAX( 0., ( zratio - zironmin ) / qdfelim ) 
     213          xdiatpo4(ji,jj,jk) = zlim2 
     214          xlimdfe (ji,jj,jk) = MIN( 1., zlim4 ) 
     215          xlimdia (ji,jj,jk) = MIN( zlim1, zlim2, zlim3, zlim4 ) 
     216          xlimsi  (ji,jj,jk) = MIN( zlim1, zlim2, zlim4 ) 
    171217      END_3D 
    172218 
     219 
     220      ! Size estimation of phytoplankton based on total biomass 
     221      ! Assumes that larger biomass implies addition of larger cells 
     222      ! ------------------------------------------------------------ 
     223      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     224         zcoef = tr(ji,jj,jk,jpphy,Kbb) - MIN(xsizephy, tr(ji,jj,jk,jpphy,Kbb) ) 
     225         sizena(ji,jj,jk) = 1. + ( xsizern -1.0 ) * zcoef / ( xsizephy + zcoef ) 
     226         zcoef = tr(ji,jj,jk,jpdia,Kbb) - MIN(xsizedia, tr(ji,jj,jk,jpdia,Kbb) ) 
     227         sizeda(ji,jj,jk) = 1. + ( xsizerd - 1.0 ) * zcoef / ( xsizedia + zcoef ) 
     228      END_3D 
     229 
     230 
    173231      ! Compute the fraction of nanophytoplankton that is made of calcifiers 
     232      ! This is a purely adhoc formulation described in Aumont et al. (2015) 
     233      ! This fraction depends on nutrient limitation, light, temperature 
    174234      ! -------------------------------------------------------------------- 
    175235      DO_3D( 1, 1, 1, 1, 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) )  
     236         zlim1  = xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk)  
    178237         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) ) 
     238         zlim3  = tr(ji,jj,jk,jpfer,Kbb) / ( tr(ji,jj,jk,jpfer,Kbb) +  6.E-11   ) 
     239         ztem1  = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) + 1.8) 
    181240         ztem2  = ts(ji,jj,jk,jp_tem,Kmm) - 10. 
    182241         zetot1 = MAX( 0., etot_ndcy(ji,jj,jk) - 1.) / ( 4. + etot_ndcy(ji,jj,jk) )  
    183          zetot2 = 30. / ( 30. + etot_ndcy(ji,jj,jk) )  
     242         zetot2 = 30. / ( 30.0 + etot_ndcy(ji,jj,jk) ) 
    184243 
    185244         xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 )                  & 
     
    194253      ! 
    195254      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    196          ! denitrification factor computed from O2 levels 
     255        ! denitrification factor computed from O2 levels 
     256         ! This factor diagnoses below which level of O2 denitrification 
     257         ! is active 
    197258         nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - tr(ji,jj,jk,jpoxy,Kbb) )    & 
    198259            &                                / ( oxymin + tr(ji,jj,jk,jpoxy,Kbb) )  ) 
    199260         nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) ) 
    200261         ! 
    201          ! denitrification factor computed from NO3 levels 
     262         ! redox factor computed from NO3 levels 
     263         ! This factor diagnoses below which level of NO3 additional redox 
     264         ! reactions are taking place. 
    202265         nitrfac2(ji,jj,jk) = MAX( 0.e0,       ( 1.E-6 - tr(ji,jj,jk,jpno3,Kbb) )  & 
    203266            &                                / ( 1.E-6 + tr(ji,jj,jk,jpno3,Kbb) ) ) 
     
    211274        CALL iom_put( "LNFe"   , xlimnfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
    212275        CALL iom_put( "LDFe"   , xlimdfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     276        CALL iom_put( "SIZEN"  , sizen  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     277        CALL iom_put( "SIZED"  , sized  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
    213278      ENDIF 
    214279      ! 
     
    222287      !!                  ***  ROUTINE p4z_lim_init  *** 
    223288      !! 
    224       !! ** Purpose :   Initialization of nutrient limitation parameters 
    225       !! 
    226       !! ** Method  :   Read the nampislim namelist and check the parameters 
     289      !! ** Purpose :   Initialization of the nutrient limitation parameters 
     290      !! 
     291      !! ** Method  :   Read the namp4zlim namelist and check the parameters 
    227292      !!      called at the first timestep (nittrc000) 
    228293      !! 
    229       !! ** input   :   Namelist nampislim 
     294      !! ** input   :   Namelist namp4zlim 
    230295      !! 
    231296      !!---------------------------------------------------------------------- 
    232297      INTEGER ::   ios   ! Local integer 
    233       ! 
     298 
     299      ! Namelist block 
    234300      NAMELIST/namp4zlim/ concnno3, concdno3, concnnh4, concdnh4, concnfer, concdfer, concbfe,   & 
    235301         &                concbno3, concbnh4, xsizedia, xsizephy, xsizern, xsizerd,          &  
     
    248314902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zlim in configuration namelist' ) 
    249315      IF(lwm) WRITE( numonp, namp4zlim ) 
     316 
    250317      ! 
    251318      IF(lwp) THEN                         ! control print 
     
    287354      !!---------------------------------------------------------------------- 
    288355      !!                     ***  ROUTINE p5z_lim_alloc  *** 
     356      !!  
     357      !            Allocation of the arrays used in this module 
    289358      !!---------------------------------------------------------------------- 
    290359      USE lib_mpp , ONLY: ctl_stop 
     
    295364         &      xnanonh4(jpi,jpj,jpk), xdiatnh4(jpi,jpj,jpk),       & 
    296365         &      xnanopo4(jpi,jpj,jpk), xdiatpo4(jpi,jpj,jpk),       & 
     366         &      xnanofer(jpi,jpj,jpk), xdiatfer(jpi,jpj,jpk),       & 
    297367         &      xlimphy (jpi,jpj,jpk), xlimdia (jpi,jpj,jpk),       & 
    298368         &      xlimnfe (jpi,jpj,jpk), xlimdfe (jpi,jpj,jpk),       & 
    299369         &      xlimbac (jpi,jpj,jpk), xlimbacl(jpi,jpj,jpk),       & 
    300370         &      concnfe (jpi,jpj,jpk), concdfe (jpi,jpj,jpk),       & 
     371         &      xqfuncfecn(jpi,jpj,jpk), xqfuncfecd(jpi,jpj,jpk),   & 
    301372         &      xlimsi  (jpi,jpj,jpk), STAT=p4z_lim_alloc ) 
    302373      ! 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zmeso.F90

    r13295 r14385  
    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 
     
    5362CONTAINS 
    5463 
    55    SUBROUTINE p4z_meso( kt, knt, Kbb, Krhs ) 
     64   SUBROUTINE p4z_meso( kt, knt, Kbb, Kmm, Krhs ) 
    5665      !!--------------------------------------------------------------------- 
    5766      !!                     ***  ROUTINE p4z_meso  *** 
    5867      !! 
    5968      !! ** Purpose :   Compute the sources/sinks for mesozooplankton 
     69      !!                This includes ingestion and assimilation, flux feeding 
     70      !!                and mortality. We use a passive prey switching   
     71      !!                parameterization. 
     72      !!                All living compartments smaller than mesozooplankton 
     73      !!                are potential preys of mesozooplankton as well as small 
     74      !!                sinking particles  
    6075      !! 
    6176      !! ** Method  : - ??? 
    6277      !!--------------------------------------------------------------------- 
    6378      INTEGER, INTENT(in) ::   kt, knt   ! ocean time step and ??? 
    64       INTEGER, INTENT(in)  ::  Kbb, Krhs ! time level indices 
    65       ! 
    66       INTEGER  :: ji, jj, jk 
     79      INTEGER, INTENT(in)  ::  Kbb, kmm, Krhs ! time level indices 
     80      ! 
     81      INTEGER  :: ji, jj, jk, jkt 
    6782      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam 
    68       REAL(wp) :: zgraze2 , zdenom, zdenom2 
    69       REAL(wp) :: zfact   , zfood, zfoodlim, zproport, zbeta 
     83      REAL(wp) :: zgraze2 , zdenom, zdenom2, zfact   , zfood, zfoodlim, zproport, zbeta 
    7084      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 
     85      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgraztotc, zgraztotn, zgraztotf 
     86      REAL(wp) :: zmigreltime, zprcaca, zmortz, zgrasratf, zgrasratn 
     87      REAL(wp) :: zrespz, ztortz, zgrazdc, zgrazz, zgrazpof, zgraznc, zgrazpoc, zgraznf, zgrazdf 
     88      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg, zrum, zcodel, zargu, zval, zdep 
     89      REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmp4, ztmptot, zmigthick  
    7890      CHARACTER (len=25) :: charout 
     91      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2 
     92      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof, zgrabsi 
     93      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof 
     94      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigbsi 
    7995      !!--------------------------------------------------------------------- 
    8096      ! 
    8197      IF( ln_timing )   CALL timing_start('p4z_meso') 
     98      ! 
     99      zgrazing(:,:,:) = 0._wp   ;  zgrapoc(:,:,:) = 0._wp 
     100      zfezoo2 (:,:,:) = 0._wp   ;  zgrarem(:,:,:) = 0._wp 
     101      zgraref (:,:,:) = 0._wp   ;  zgrapof(:,:,:) = 0._wp 
     102      zgrabsi (:,:,:) = 0._wp 
     103      ! 
     104      ! 
     105      ! Diurnal vertical migration of mesozooplankton 
     106      ! Computation of the migration depth 
     107      ! --------------------------------------------- 
     108      IF (ln_dvm_meso) CALL p4z_meso_depmig( Kbb, Kmm ) 
    82109      ! 
    83110      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     
    85112         zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam 
    86113 
    87          !  Respiration rates of both zooplankton 
    88          !  ------------------------------------- 
     114          
     115         !  linear mortality of mesozooplankton 
     116         !  A michaelis menten modulation term is used to avoid extinction of  
     117         !  mesozooplankton at very low food concentration. Mortality is 
     118 
     119         !  enhanced in low O2 waters 
     120         !  ----------------------------------------------------------------- 
    89121         zrespz    = resrat2 * zfact * ( tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) )  & 
    90122         &           + 3. * nitrfac(ji,jj,jk) ) 
    91123 
    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          !  --------------------------------------------------------------- 
     124         ! Zooplankton quadratic mortality. A square function has been selected with 
     125         !  to mimic predation and disease (density dependent mortality). It also tends 
     126         !  to stabilise the model 
     127         !  ------------------------------------------------------------------------- 
    95128         ztortz    = mzrat2 * 1.e6 * zfact * tr(ji,jj,jk,jpmes,Kbb)  * (1. - nitrfac(ji,jj,jk) ) 
    96129         ! 
     130  
     131         !   Computation of the abundance of the preys 
     132         !   A threshold can be specified in the namelist 
     133         !   -------------------------------------------- 
    97134         zcompadi  = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthresh2dia ), 0.e0 ) 
    98135         zcompaz   = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthresh2zoo ), 0.e0 ) 
    99136         zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthresh2poc ), 0.e0 ) 
     137 
    100138         ! Size effect of nanophytoplankton on grazing : the smaller it is, the less prone 
    101          ! it is to predation by mesozooplankton 
     139         ! it is to predation by mesozooplankton. We use a quota dependant parameterization 
     140         ! as a low quota indicates oligotrophic conditions which are charatcerized by 
     141         ! small cells 
    102142         ! ------------------------------------------------------------------------------- 
    103143         zcompaph  = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthresh2phy ), 0.e0 ) & 
    104144            &      * MIN(1., MAX( 0., ( quotan(ji,jj,jk) - 0.2) / 0.3 ) ) 
    105145 
    106          !   Mesozooplankton grazing 
    107          !   ------------------------ 
     146 
     147         ! Mesozooplankton grazing 
     148         ! The total amount of food is the sum of all preys accessible to mesozooplankton  
     149         ! multiplied by their food preference 
     150         ! A threshold can be specified in the namelist (xthresh2). However, when food  
     151         ! concentration is close to this threshold, it is decreased to avoid the  
     152         ! accumulation of food in the mesozoopelagic domain 
     153         ! ------------------------------------------------------------------------------- 
    108154         zfood     = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc  
    109155         zfoodlim  = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) ) 
     
    112158         zgraze2   = grazrat2 * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk))  
    113159 
    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) 
     160 
     161         ! An active switching parameterization is used here. 
     162         ! We don't use the KTW parameterization proposed by  
     163         ! Vallina et al. because it tends to produce too steady biomass 
     164         ! composition and the variance of Chl is too low as it grazes 
     165         ! too strongly on winning organisms. We use a generalized 
     166         ! switching parameterization proposed by Morozov and  
     167         ! Petrovskii (2013) 
     168         ! ------------------------------------------------------------   
     169         ! The width of the selection window is increased when preys 
     170         ! have low abundance, .i.e. zooplankton become less specific  
     171         ! to avoid starvation. 
     172         ! ---------------------------------------------------------- 
     173         zsigma = 1.0 - zdenom**2/(0.05**2+zdenom**2) 
     174         zsigma = xsigma2 + xsigma2del * zsigma 
     175         ! Nanophytoplankton and diatoms are the only preys considered 
     176         ! to be close enough to have potential interference 
     177         ! ----------------------------------------------------------- 
     178         zdiffdn = exp( -ABS(log(1.67 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2 ) 
     179         ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / ( 1.0 + zdiffdn ) 
     180         ztmp2 = xpref2c * zcompapoc**2 
     181         ztmp3 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) / ( 1.0 + zdiffdn ) 
     182         ztmp4 = xpref2z * zcompaz**2 
     183         ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + rtrn 
     184         ztmp1 = ztmp1 / ztmptot 
     185         ztmp2 = ztmp2 / ztmptot 
     186         ztmp3 = ztmp3 / ztmptot 
     187         ztmp4 = ztmp4 / ztmptot 
     188 
     189         !   Mesozooplankton regular grazing on the different preys 
     190         !   ------------------------------------------------------ 
     191         zgrazdc   = zgraze2  * ztmp3 * zdenom  ! diatoms 
     192         zgraznc   = zgraze2  * ztmp1 * zdenom  ! nanophytoplankton 
     193         zgrazpoc  = zgraze2  * ztmp2 * zdenom  ! small POC 
     194         zgrazz    = zgraze2  * ztmp4 * zdenom  ! microzooplankton 
     195 
     196         ! Ingestion rates of the Fe content of the different preys 
     197         zgraznf   = zgraznc  * tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn) 
     198         zgrazdf   = zgrazdc  * tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn) 
    121199         zgrazpof  = zgrazpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
    122200 
    123          !  Mesozooplankton flux feeding on GOC 
    124          !  ---------------------------------- 
     201         !  Mesozooplankton flux feeding on GOC and POC. The feeding pressure 
     202         ! is proportional to the flux 
     203         !  ------------------------------------------------------------------ 
    125204         zgrazffeg = grazflux  * xstep * wsbio4(ji,jj,jk)      & 
    126205         &           * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb) & 
     
    132211         zgrazfffp = zgrazffep * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
    133212         ! 
    134          zgraztotc = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg 
    135          ! Compute the proportion of filter feeders 
     213         zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg 
     214         ! Compute the proportion of filter feeders. It is assumed steady state. 
     215         ! ---------------------------------------------------------------------   
    136216         zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) 
     217 
     218         ! Compute fractionation of aggregates. It is assumed that  
     219         ! diatoms based aggregates are more prone to fractionation 
     220         ! since they are more porous (marine snow instead of fecal pellets) 
     221         ! ----------------------------------------------------------------- 
     222 
    137223         ! Compute fractionation of aggregates. It is assumed that  
    138224         ! diatoms based aggregates are more prone to fractionation 
     
    145231         zfracfe   = zfrac * tr(ji,jj,jk,jpbfe,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn) 
    146232 
     233         ! Flux feeding is multiplied by the fractional biomass of flux feeders 
    147234         zgrazffep = zproport * zgrazffep 
    148235         zgrazffeg = zproport * zgrazffeg 
    149236         zgrazfffp = zproport * zgrazfffp 
    150237         zgrazfffg = zproport * zgrazfffg 
    151          zgraztotc = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg 
    152          zgraztotn = zgrazd * quotad(ji,jj,jk) + zgrazz + zgrazn * quotan(ji,jj,jk)   & 
     238 
     239         ! Total ingestion rates in C, N, Fe 
     240         zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg 
     241         zgraztotn = zgrazdc * quotad(ji,jj,jk) + zgrazz + zgraznc * quotan(ji,jj,jk)   & 
    153242         &   + zgrazpoc + zgrazffep + zgrazffeg 
    154          zgraztotf = zgrazf + zgraznf + zgrazz * ferat3 + zgrazpof + zgrazfffp + zgrazfffg 
     243         zgraztotf = zgrazdf + zgraznf + zgrazz * feratz + zgrazpof + zgrazfffp + zgrazfffg 
    155244 
    156245         ! Total grazing ( grazing by microzoo is already computed in p4zmicro ) 
    157          zgrazing2(ji,jj,jk) = zgraztotc 
     246         zgrazing(ji,jj,jk) = zgraztotc 
    158247 
    159248         ! Mesozooplankton efficiency.  
     
    165254         ! Fulton, 2012) 
    166255         ! ----------------------------------------------------------------------------------- 
    167          zgrasrat  =  ( zgraztotf + rtrn )/ ( zgraztotc + rtrn ) 
     256 
     257         zgrasratf =  ( zgraztotf + rtrn )/ ( zgraztotc + rtrn ) 
    168258         zgrasratn =  ( zgraztotn + rtrn )/ ( zgraztotc + rtrn ) 
    169          zepshert  = MIN( 1., zgrasratn, zgrasrat / ferat3) 
     259         zepshert  = MIN( 1., zgrasratn, zgrasratf / feratm) 
    170260         zbeta     = MAX(0., (epsher2 - epsher2min) ) 
     261         ! Food quantity deprivation of GGE 
    171262         zepsherf  = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta )  
     263         ! Food quality deprivation of GGE 
    172264         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  
     265         ! Actual GGE 
     266         zepsherv  = zepsherf * zepshert * zepsherq 
     267         !  
     268         ! Impact of grazing on the prognostic variables 
     269         ! --------------------------------------------- 
    199270         zmortz = ztortz + zrespz 
     271         ! Mortality induced by the upper trophic levels, ztortz, is allocated  
     272         ! according to a infinite chain of predators (ANderson et al., 2013) 
    200273         zmortzgoc = unass2 / ( 1. - epsher2 ) * ztortz + zrespz 
     274 
    201275         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 
     276         tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc 
    203277         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 ) 
     278         tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc 
     279         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 ) 
     280         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 ) 
     281         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 ) 
     282         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 ) 
     283         zgrabsi(ji,jj,jk)       = zgrazdc * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
     284         ! 
    209285         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  
     286         tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazdf 
     287         ! 
    212288         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zgrazpoc - zgrazffep + zfrac 
    213289         prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfrac 
    214290         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 
     291         ! 
     292         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zgrazffeg - zfrac 
    217293         consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfrac 
     294         ! 
    218295         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 
     296         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zgrazfffg - zfracfe 
     297 
     298         ! Calcite remineralization due to zooplankton activity 
     299         ! part2 of the ingested calcite is not dissolving in the  
     300         ! acidic gut 
     301         ! ------------------------------------------------------ 
     302         zfracal = tr(ji,jj,jk,jpcal,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) 
     303         zgrazcal = zgrazffeg * (1. - part2) * zfracal 
     304         ! calcite production by zooplankton activity 
     305         zprcaca = xfracal(ji,jj,jk) * zgraznc 
    225306         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 
    226307         ! 
    227308         zprcaca = part2 * zprcaca 
    228309         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 ) 
     310         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * ( zgrazcal - zprcaca ) 
    230311         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - zgrazcal + zprcaca 
     312 
     313         ! Computation of total excretion and egestion by mesozoo.  
     314         ! --------------------------------------------------------- 
     315         zgrarem(ji,jj,jk) = zgraztotc * ( 1. - zepsherv - unass2 ) & 
     316                 &         + ( 1. - epsher2 - unass2 ) / ( 1. - epsher2 ) * ztortz 
     317         zgraref(ji,jj,jk) = zgraztotc * MAX( 0. , ( 1. - unass2 ) * zgrasratf - feratm * zepsherv )    & 
     318                 &         + feratm * ( ( 1. - epsher2 - unass2 ) /( 1. - epsher2 ) * ztortz ) 
     319         zgrapoc(ji,jj,jk) = zgraztotc * unass2 + zmortzgoc 
     320         zgrapof(ji,jj,jk) = zgraztotf * unass2 + feratm * zmortzgoc 
     321         ! 
    231322      END_3D 
    232       ! 
     323 
     324      ! Computation of the effect of DVM by mesozooplankton 
     325      ! This part is only activated if ln_dvm_meso is set to true 
     326      ! The parameterization has been published in Gorgues et al. (2019). 
     327      ! ----------------------------------------------------------------- 
     328      IF (ln_dvm_meso) THEN 
     329         ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) ) 
     330         ALLOCATE( zgramigbsi(jpi,jpj) ) 
     331         zgramigrem(:,:) = 0.0    ;   zgramigref(:,:) = 0.0 
     332         zgramigpoc(:,:) = 0.0    ;   zgramigpof(:,:) = 0.0 
     333         zgramigbsi(:,:) = 0.0 
     334 
     335        ! Compute the amount of materials that will go into vertical migration 
     336        ! This fraction is sumed over the euphotic zone and is removed from  
     337        ! the fluxes driven by mesozooplankton in the euphotic zone. 
     338        ! -------------------------------------------------------------------- 
     339        DO_3D( 1, 1, 1, 1, 1, jpk ) 
     340            zmigreltime = (1. - strn(ji,jj)) 
     341            zmigthick   = (1. - zmigreltime ) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) 
     342            IF ( gdept(ji,jj,jk,Kmm) <= heup(ji,jj) ) THEN 
     343               zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * zmigthick  
     344               zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * zmigthick  
     345               zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * zmigthick  
     346               zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * zmigthick  
     347               zgramigbsi(ji,jj) = zgramigbsi(ji,jj) + xfracmig * zgrabsi(ji,jj,jk) * zmigthick  
     348 
     349               zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     350               zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     351               zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     352               zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     353               zgrabsi(ji,jj,jk) = zgrabsi(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     354            ENDIF 
     355         END_3D 
     356       
     357         ! The inorganic and organic fluxes induced by migrating organisms are added at the  
     358         ! the migration depth (corresponding indice is set by kmig) 
     359         ! -------------------------------------------------------------------------------- 
     360         DO_2D( 1, 1, 1, 1 ) 
     361            IF( tmask(ji,jj,1) == 1.) THEN 
     362               jkt = kmig(ji,jj) 
     363               zdep = 1. / e3t(ji,jj,jkt,Kmm) 
     364               zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) * zdep  
     365               zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) * zdep 
     366               zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) * zdep 
     367               zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) * zdep 
     368               zgrabsi(ji,jj,jkt) = zgrabsi(ji,jj,jkt) + zgramigbsi(ji,jj) * zdep 
     369            ENDIF 
     370         END_2D 
     371         ! 
     372         ! Deallocate temporary variables 
     373         ! ------------------------------ 
     374         DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof, zgramigbsi ) 
     375      ! End of the ln_dvm_meso part 
     376      ENDIF 
     377 
     378      !   Update the arrays TRA which contain the biological sources and sinks 
     379      !   This only concerns the variables which are affected by DVM (inorganic  
     380      !   nutrients, DOC agands, and particulate organic carbon).  
     381      DO_3D( 1, 1, 1, 1, 1, jpk ) 
     382         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarem(ji,jj,jk) * sigma2 
     383         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgrarem(ji,jj,jk) * sigma2 
     384         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgrarem(ji,jj,jk) * ( 1. - sigma2 ) 
     385         ! 
     386         IF( ln_ligand ) &  
     387          &  tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zgrarem(ji,jj,jk) * ( 1. - sigma2 ) * ldocz 
     388         ! 
     389         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem(ji,jj,jk) * sigma2 
     390         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref(ji,jj,jk) 
     391         zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk) 
     392         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem(ji,jj,jk) * sigma2 
     393         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgrarem(ji,jj,jk) * sigma2              
     394         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zgrapoc(ji,jj,jk) 
     395         prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk)   + zgrapoc(ji,jj,jk) 
     396         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zgrapof(ji,jj,jk) 
     397         tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrabsi(ji,jj,jk) 
     398      END_3D 
     399      ! 
     400      ! Write the output 
    233401      IF( lk_iomput .AND. knt == nrdttrc ) THEN 
    234402        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 
     403        CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) ! Total grazing of phyto by zoo 
     404        CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 
     405        IF( ln_ligand ) & 
     406         & CALL iom_put( "LPRODZ2", zgrarem(ji,jj,jk) * ( 1. - sigma2 ) * ldocz * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  ) 
    244407      ENDIF 
    245408      ! 
     
    261424      !! ** Purpose :   Initialization of mesozooplankton parameters 
    262425      !! 
    263       !! ** Method  :   Read the nampismes namelist and check the parameters 
     426      !! ** Method  :   Read the namp4zmes namelist and check the parameters 
    264427      !!      called at the first timestep (nittrc000) 
    265428      !! 
     
    270433      NAMELIST/namp4zmes/ part2, grazrat2, resrat2, mzrat2, xpref2n, xpref2d, xpref2z,   & 
    271434         &                xpref2c, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & 
    272          &                xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux 
     435         &                xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux, ln_dvm_meso,  & 
     436         &                xsigma2, xsigma2del, xfracmig 
    273437      !!---------------------------------------------------------------------- 
    274438      ! 
     
    281445      READ  ( numnatp_ref, namp4zmes, IOSTAT = ios, ERR = 901) 
    282446901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zmes in reference namelist' ) 
     447 
    283448      READ  ( numnatp_cfg, namp4zmes, IOSTAT = ios, ERR = 902 ) 
    284449902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zmes in configuration namelist' ) 
     
    303468         WRITE(numout,*) '      non assimilated fraction of P by mesozoo       unass2       =', unass2 
    304469         WRITE(numout,*) '      Efficiency of Mesozoo growth                   epsher2      =', epsher2 
    305          WRITE(numout,*) '      Minimum Efficiency of Mesozoo growth           epsher2min  =', epsher2min 
     470         WRITE(numout,*) '      Minimum Efficiency of Mesozoo growth           epsher2min   =', epsher2min 
    306471         WRITE(numout,*) '      Fraction of mesozoo excretion as DOM           sigma2       =', sigma2 
    307472         WRITE(numout,*) '      half sturation constant for grazing 2          xkgraz2      =', xkgraz2 
     473         WRITE(numout,*) '      Width of the grazing window                     xsigma2     =', xsigma2 
     474         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigma2del  =', xsigma2del 
     475         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso 
     476         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig 
    308477      ENDIF 
    309478      ! 
    310479   END SUBROUTINE p4z_meso_init 
     480 
     481   SUBROUTINE p4z_meso_depmig( Kbb, Kmm ) 
     482      !!---------------------------------------------------------------------- 
     483      !!                  ***  ROUTINE p4z_meso_depmig  *** 
     484      !! 
     485      !! ** Purpose :   Computation the migration depth of mesozooplankton 
     486      !! 
     487      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen 
     488      !!      temperature and chlorophylle following the parameterization  
     489      !!      proposed by Bianchi et al. (2013) 
     490      !!---------------------------------------------------------------------- 
     491      INTEGER, INTENT(in)  ::  Kbb, kmm ! time level indices 
     492      ! 
     493      INTEGER  :: ji, jj, jk 
     494      ! 
     495      REAL(wp) :: ztotchl, z1dep 
     496      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy 
     497 
     498      !!--------------------------------------------------------------------- 
     499      ! 
     500      IF( ln_timing == 1 )  CALL timing_start('p4z_meso_zdepmig') 
     501      ! 
     502      oxymoy(:,:)  = 0. 
     503      tempmoy(:,:) = 0. 
     504      zdepmoy(:,:) = 0. 
     505      depmig (:,:) = 5. 
     506      kmig   (:,:) = 1 
     507      ! 
     508      ! Compute the averaged values of oxygen, temperature over the domain  
     509      ! 150m to 500 m depth. 
     510      ! ------------------------------------------------------------------ 
     511      DO_3D( 1, 1, 1, 1, 1, jpk ) 
     512         IF( tmask(ji,jj,jk) == 1.) THEN 
     513            IF( gdept(ji,jj,jk,Kmm) >= 150. .AND. gdept(ji,jj,jk,kmm) <= 500.) THEN 
     514               oxymoy(ji,jj)  = oxymoy(ji,jj)  + tr(ji,jj,jk,jpoxy,Kbb) * 1E6 * e3t(ji,jj,jk,Kmm) 
     515               tempmoy(ji,jj) = tempmoy(ji,jj) + ts(ji,jj,jk,jp_tem,kmm)      * e3t(ji,jj,jk,kmm) 
     516               zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t(ji,jj,jk,Kmm) 
     517            ENDIF 
     518         ENDIF 
     519      END_3D 
     520 
     521      ! Compute the difference between surface values and the mean values in the mesopelagic 
     522      ! domain 
     523      ! ------------------------------------------------------------------------------------ 
     524      DO_2D( 1, 1, 1, 1 ) 
     525         z1dep = 1. / ( zdepmoy(ji,jj) + rtrn ) 
     526         oxymoy(ji,jj)  = tr(ji,jj,1,jpoxy,Kbb) * 1E6 - oxymoy(ji,jj)  * z1dep 
     527         tempmoy(ji,jj) = ts(ji,jj,1,jp_tem,Kmm)      - tempmoy(ji,jj) * z1dep 
     528      END_2D 
     529      ! 
     530      ! Computation of the migration depth based on the parameterization of  
     531      ! Bianchi et al. (2013) 
     532      ! ------------------------------------------------------------------- 
     533      DO_2D( 1, 1, 1, 1 ) 
     534         IF( tmask(ji,jj,1) == 1. ) THEN 
     535            ztotchl = ( tr(ji,jj,1,jpnch,Kbb) + tr(ji,jj,1,jpdch,Kbb) ) * 1E6 
     536            depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(ztotchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj) 
     537         ENDIF 
     538      END_2D 
     539      !  
     540      ! Computation of the corresponding jk indice  
     541      ! ------------------------------------------ 
     542      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     543         IF( depmig(ji,jj) >= gdepw(ji,jj,jk,Kmm) .AND. depmig(ji,jj) < gdepw(ji,jj,jk+1,Kmm) ) THEN 
     544             kmig(ji,jj) = jk 
     545          ENDIF 
     546      END_3D 
     547      ! 
     548      ! Correction of the migration depth and indice based on O2 levels 
     549      ! If O2 is too low, imposing a migration depth at this low O2 levels 
     550      ! would lead to negative O2 concentrations (respiration while O2 is close 
     551      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so 
     552      ! that it falls above the OMZ 
     553      ! ----------------------------------------------------------------------- 
     554      DO_2D( 1, 1, 1, 1 ) 
     555         IF( tr(ji,jj,kmig(ji,jj),jpoxy,Kbb) < 5E-6 ) THEN 
     556            DO jk = kmig(ji,jj),1,-1 
     557               IF( tr(ji,jj,jk,jpoxy,Kbb) >= 5E-6 .AND. tr(ji,jj,jk+1,jpoxy,Kbb)  < 5E-6) THEN 
     558                  kmig(ji,jj) = jk 
     559                  depmig(ji,jj) = gdept(ji,jj,jk,Kmm) 
     560               ENDIF 
     561            END DO 
     562         ENDIF 
     563      END_2D 
     564      ! 
     565      IF( ln_timing )   CALL timing_stop('p4z_meso_depmig') 
     566      ! 
     567   END SUBROUTINE p4z_meso_depmig 
     568 
     569   INTEGER FUNCTION p4z_meso_alloc() 
     570      !!---------------------------------------------------------------------- 
     571      !!                     ***  ROUTINE p4z_meso_alloc  *** 
     572      !!---------------------------------------------------------------------- 
     573      ! 
     574      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p4z_meso_alloc  ) 
     575      ! 
     576      IF( p4z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_meso_alloc : failed to allocate arrays.' ) 
     577      ! 
     578   END FUNCTION p4z_meso_alloc 
    311579 
    312580   !!====================================================================== 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zmicro.F90

    r13295 r14385  
    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( 1, 1, 1, 1, 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/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zmort.F90

    r13295 r14385  
    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( 1, 1, 1, 1, 1, jpkm1 ) 
    8078         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 
     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 
     
    114114         prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + ( 1. - zfracal ) * zmortp 
    115115         prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zfracal * zmortp 
     116 
     117         ! Update the arrays TRA which contains the biological sources and sinks 
    116118         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + ( 1. - zfracal ) * zmortp * zfactfe 
    117119         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zfracal * zmortp * zfactfe 
     120         ! 
    118121      END_3D 
    119122      ! 
     
    124127       ENDIF 
    125128      ! 
    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  *** 
     129      IF( ln_timing )   CALL timing_stop('p4z_mort_nano') 
     130      ! 
     131   END SUBROUTINE p4z_mort_nano 
     132 
     133 
     134   SUBROUTINE p4z_mort_diat( Kbb, Krhs ) 
     135      !!--------------------------------------------------------------------- 
     136      !!                     ***  ROUTINE p4z_mort_diat  *** 
    134137      !! 
    135138      !! ** Purpose :   Compute the mortality terms for diatoms 
    136139      !! 
    137       !! ** Method  : - ??? 
     140      !! ** Method  : - Both quadratic and simili linear mortality terms 
    138141      !!--------------------------------------------------------------------- 
    139142      INTEGER, INTENT(in) ::   Kbb, Krhs  ! time level indices 
     
    145148      !!--------------------------------------------------------------------- 
    146149      ! 
    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       !     ------------------------------------------------------------ 
     150      IF( ln_timing )   CALL timing_start('p4z_mort_diat') 
     151      ! 
     152      ! Aggregation term for diatoms is increased in case of nutrient 
     153      ! stress as observed in reality. The stressed cells become more 
     154      ! sticky and coagulate to sink quickly out of the euphotic zone 
     155      ! This is due to the production of EPS by stressed cells 
     156      ! ------------------------------------------------------------- 
    153157 
    154158      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     
    156160         zcompadi = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - 1e-9), 0. ) 
    157161 
    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          !     ------------------------ 
     162         ! Aggregation term for diatoms is increased in case of nutrient 
     163         ! stress as observed in reality. The stressed cells become more 
     164         ! sticky and coagulate to sink quickly out of the euphotic zone 
     165         ! ------------------------------------------------------------ 
    164166         zlim2   = xlimdia(ji,jj,jk) * xlimdia(ji,jj,jk) 
    165167         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  
     168         zrespp2 = 1.e6 * xstep * wchld * zlim1 * xdiss(ji,jj,jk) * zcompadi * tr(ji,jj,jk,jpdia,Kbb) 
     169 
     170         ! Phytoplankton linear mortality 
     171         ! A michaelis-menten like term is introduced to avoid  
     172         ! extinction of diatoms in highly limited areas 
     173         !  --------------------------------------------------- 
     174         ztortp2 = mpratd * xstep * tr(ji,jj,jk,jpdia,Kbb)  / ( xkmort + tr(ji,jj,jk,jpdia,Kbb) ) * zcompadi  
    171175 
    172176         zmortp2 = zrespp2 + ztortp2 
    173177 
    174          !   Update the arrays tr(:,:,:,:,Krhs) which contains the biological sources and sinks 
     178         !   Update the arrays trends which contains the biological sources and sinks 
    175179         !   --------------------------------------------------------------------- 
    176180         zfactch = tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
     
    182186         tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zmortp2 * zfactsi 
    183187         tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zmortp2 * zfactsi 
     188 
     189         ! Half of the linear mortality term is routed to big particles 
     190         ! becaue of the ballasting effect 
    184191         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zrespp2 + 0.5 * ztortp2 
    185192         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + 0.5 * ztortp2 
     
    196203      ENDIF 
    197204      ! 
    198       IF( ln_timing )   CALL timing_stop('p4z_diat') 
    199       ! 
    200    END SUBROUTINE p4z_diat 
     205      IF( ln_timing )   CALL timing_stop('p4z_mort_diat') 
     206      ! 
     207   END SUBROUTINE p4z_mort_diat 
    201208 
    202209 
     
    207214      !! ** Purpose :   Initialization of phytoplankton parameters 
    208215      !! 
    209       !! ** Method  :   Read the nampismort namelist and check the parameters 
     216      !! ** Method  :   Read the namp4zmort namelist and check the parameters 
    210217      !!              called at the first timestep 
    211218      !! 
    212       !! ** input   :   Namelist nampismort 
     219      !! ** input   :   Namelist namp4zmort 
    213220      !! 
    214221      !!---------------------------------------------------------------------- 
    215222      INTEGER ::   ios   ! Local integer 
    216223      ! 
    217       NAMELIST/namp4zmort/ wchl, wchld, wchldm, mprat, mprat2 
     224      NAMELIST/namp4zmort/ wchln, wchld, mpratn, mpratd 
    218225      !!---------------------------------------------------------------------- 
    219226      ! 
     
    226233      READ  ( numnatp_ref, namp4zmort, IOSTAT = ios, ERR = 901) 
    227234901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zmort in reference namelist' ) 
     235 
    228236      READ  ( numnatp_cfg, namp4zmort, IOSTAT = ios, ERR = 902 ) 
    229237902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zmort in configuration namelist' ) 
     
    232240      IF(lwp) THEN                         ! control print 
    233241         WRITE(numout,*) '   Namelist : namp4zmort' 
    234          WRITE(numout,*) '      quadratic mortality of phytoplankton        wchl   =', wchl 
     242         WRITE(numout,*) '      quadratic mortality of phytoplankton        wchln  =', wchln 
    235243         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 
     244         WRITE(numout,*) '      phytoplankton mortality rate                mpratn =', mpratn 
     245         WRITE(numout,*) '      Diatoms mortality rate                      mpratd =', mpratd 
    239246      ENDIF 
    240247      ! 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zopt.F90

    r14213 r14385  
    8080      ze3(:,:,:) = 0._wp 
    8181      ! 
    82       !                                        !* attenuation coef. function of Chlorophyll and wavelength (Red-Green-Blue) 
    83       !                                        !  -------------------------------------------------------- 
     82      ! Attenuation coef. function of Chlorophyll and wavelength (Red-Green-Blue) 
     83      ! Thus the light penetration scheme is based on a decomposition of PAR 
     84      ! into three wave length domains. This was first officially published 
     85      ! in Lengaigne et al. (2007). 
     86      ! -------------------------------------------------------- 
    8487                     zchl3d(:,:,:) = tr(:,:,:,jpnch,Kbb) + tr(:,:,:,jpdch,Kbb) 
    85       IF( ln_p5z )   zchl3d(:,:,:) = zchl3d(:,:,:)    + tr(:,:,:,jppch,Kbb) 
    86       ! 
     88      IF( ln_p5z )   zchl3d(:,:,:) = zchl3d(:,:,:)       + tr(:,:,:,jppch,Kbb) 
     89      ! 
     90      ! Computation of the light attenuation parameters based on a  
     91      ! look-up table 
    8792      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    8893         zchl = ( zchl3d(ji,jj,jk) + rtrn ) * 1.e6 
     
    9499         ekr(ji,jj,jk) = rkrgb(3,irgb) * e3t(ji,jj,jk,Kmm) 
    95100      END_3D 
    96       !                                        !* Photosynthetically Available Radiation (PAR) 
    97       !                                        !  -------------------------------------- 
     101 
     102      ! Photosynthetically Available Radiation (PAR) 
     103      ! Two cases are considered in the following :  
     104      ! (1) An explicit diunal cycle is activated. In that case, mean  
     105      ! QSR is used as PISCES in its current state has not been parameterized 
     106      ! for an explicit diurnal cycle 
     107      ! (2) no diurnal cycle of SW is active and in that case, QSR is used. 
     108      ! -------------------------------------------- 
    98109      IF( l_trcdm2dc ) THEN                     !  diurnal cycle 
    99110         ! 
     111          ! 
     112         ! SW over the ice free zone of the grid cell. This assumes that 
     113         ! SW is zero below sea ice which is a very crude assumption that is  
     114         ! not fully correct with LIM3 and SI3 but no information is  
     115         ! currently available to do a better job. SHould be improved in the  
     116         ! (near) future. 
    100117         zqsr_corr(:,:) = qsr_mean(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
    101118         ! 
    102119         CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100 )  
    103120         ! 
     121         ! Used PAR is computed for each phytoplankton species 
     122         ! etot_ndcy is PAR at level jk averaged over 24h. 
     123         ! Due to their size, they have different light absorption characteristics 
    104124         DO jk = 1, nksr       
    105125            etot_ndcy(:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk) 
     
    113133         ENDIF 
    114134         ! 
     135         ! SW over the ice free zone of the grid cell. This assumes that 
     136         ! SW is zero below sea ice which is a very crude assumption that is  
     137         ! not fully correct with LIM3 and SI3 but no information is  
     138         ! currently available to do a better job. SHould be improved in the  
     139         ! (near) future. 
     140 
    115141         zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
    116142         ! 
    117143         CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3 )  
    118144         ! 
     145         ! Total PAR computation at level jk that includes the diurnal cycle 
    119146         DO jk = 1, nksr       
    120147            etot(:,:,jk) =  ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk) 
    121148         END DO 
    122149         ! 
    123       ELSE 
    124          ! 
     150      ELSE   ! no diurnal cycle 
     151         ! 
     152         ! 
     153         ! SW over the ice free zone of the grid cell. This assumes that 
     154         ! SW is zero below sea ice which is a very crude assumption that is  
     155         ! not fully correct with LIM3 and SI3 but no information is  
     156         ! currently available to do a better job. SHould be improved in the  
     157         ! (near) future. 
    125158         zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn ) 
    126159         ! 
    127160         CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100  )  
    128161         ! 
     162 
     163         ! Used PAR is computed for each phytoplankton species 
     164         ! Due to their size, they have different light absorption characteristics 
    129165         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) 
     166            etot (:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk)    ! Total PAR 
     167            enano(:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk)  ! Nanophytoplankton 
     168            ediat(:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk)  ! Diatoms 
    133169         END DO 
    134170         IF( ln_p5z ) THEN 
    135171            DO jk = 1, nksr       
    136               epico(:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk) 
     172              epico(:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk)  ! Picophytoplankton (PISCES-QUOTA) 
    137173            END DO 
    138174         ENDIF 
     
    141177 
    142178 
     179      ! Biophysical feedback part (computation of vertical penetration of SW) 
    143180      IF( ln_qsr_bio ) THEN                    !* heat flux accros w-level (used in the dynamics) 
    144181         !                                     !  ------------------------ 
     
    151188         !                                     !  ------------------------ 
    152189      ENDIF 
    153       !                                        !* Euphotic depth and level 
    154       neln   (:,:) = 1                            !  ------------------------ 
     190       
     191      ! Euphotic depth and level 
     192      ! Two definitions of the euphotic zone are used here.  
     193      ! (1) The classical definition based on the relative threshold value 
     194      ! (2) An alternative definition based on a absolute threshold value. 
     195      ! ------------------------------------------------------------------- 
     196      neln(:,:) = 1 
    155197      heup   (:,:) = gdepw(:,:,2,Kmm) 
    156198      heup_01(:,:) = gdepw(:,:,2,Kmm) 
     
    162204           heup(ji,jj) = gdepw(ji,jj,jk+1,Kmm)     ! Euphotic layer depth 
    163205        ENDIF 
    164         IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >= 0.50 )  THEN 
     206        IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >= 0.10 )  THEN 
    165207           heup_01(ji,jj) = gdepw(ji,jj,jk+1,Kmm)  ! Euphotic layer depth (light level definition) 
    166208        ENDIF 
    167209      END_3D 
    168210      ! 
     211      ! The euphotic depth can not exceed 300 meters. 
    169212      heup   (:,:) = MIN( 300., heup   (:,:) ) 
    170213      heup_01(:,:) = MIN( 300., heup_01(:,:) ) 
    171       !                                        !* mean light over the mixed layer 
    172       zdepmoy(:,:)   = 0.e0                    !  ------------------------------- 
     214       
     215      ! Mean PAR over the mixed layer 
     216      ! ----------------------------- 
     217      zdepmoy(:,:)   = 0.e0              
    173218      zetmp1 (:,:)   = 0.e0 
    174219      zetmp2 (:,:)   = 0.e0 
     
    176221      DO_3D( 1, 1, 1, 1, 1, nksr ) 
    177222         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 
     223            zetmp1 (ji,jj) = zetmp1 (ji,jj) + etot     (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Actual PAR for remineralisation 
     224            zetmp2 (ji,jj) = zetmp2 (ji,jj) + etot_ndcy(ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Par averaged over 24h for production 
    180225            zdepmoy(ji,jj) = zdepmoy(ji,jj) +                       e3t(ji,jj,jk,Kmm) 
    181226         ENDIF 
     
    192237         ENDIF 
    193238      END_3D 
    194       ! 
     239 
     240      ! Computation of the mean usable light for the different phytoplankton 
     241      ! groups based on their absorption characteristics. 
    195242      zdepmoy(:,:)   = 0.e0 
    196243      zetmp3 (:,:)   = 0.e0 
     
    199246      DO_3D( 1, 1, 1, 1, 1, nksr ) 
    200247         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 
     248            zetmp3 (ji,jj) = zetmp3 (ji,jj) + enano    (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Nanophytoplankton 
     249            zetmp4 (ji,jj) = zetmp4 (ji,jj) + ediat    (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Diatoms 
    203250            zdepmoy(ji,jj) = zdepmoy(ji,jj) +                       e3t(ji,jj,jk,Kmm) 
    204251         ENDIF 
     
    216263      ! 
    217264      IF( ln_p5z ) THEN 
     265         ! Picophytoplankton when using PISCES-QUOTA 
    218266         ALLOCATE( zetmp5(jpi,jpj) )  ;   zetmp5 (:,:) = 0.e0 
    219267         DO_3D( 1, 1, 1, 1, 1, nksr ) 
    220268            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 
     269               zetmp5(ji,jj)  = zetmp5 (ji,jj) + epico(ji,jj,jk) * e3t(ji,jj,jk,Kmm) 
    222270            ENDIF 
    223271         END_3D 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zpoc.F90

    r13295 r14385  
    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( 1, 1, 1, 1, 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) 
     
    212227         END_3D 
    213228      ELSE 
     229         ! PISCES-QUOTA part 
    214230         DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    215              ! POC disaggregation by turbulence and bacterial activity.  
     231            ! POC degradation by bacterial activity. It is a function  
     232            ! of the mean lability and of temperature. This also includes 
     233            ! shrinking of particles due to the bacterial activity 
    216234            ! -------------------------------------------------------- 
    217235            zremig = zremigoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk) 
     
    223241            zofer2 = xremipn / xremipc * zremig * tr(ji,jj,jk,jpbfe,Kbb) 
    224242 
    225             ! ------------------------------------- 
     243            ! update of the TRA arrays 
    226244            tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zorem3(ji,jj,jk) 
    227245            tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + solgoc * zopon2  
     
    246264     ENDIF 
    247265 
    248      ! ------------------------------------------------------------------ 
    249266     ! Lability parameterization for the small OM particles. This param  
    250267     ! is based on the same theoretical background as the big particles. 
    251268     ! However, because of its low sinking speed, lability is not supposed 
    252269     ! 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      ! 
     270     ! organic matter) in the MLD. It is however uniform in the mixed layer. 
     271     ! --------------------------------------------------------------------- 
    256272     totprod (:,:) = 0. 
    257273     totthick(:,:) = 0. 
    258274     totcons (:,:) = 0. 
     275 
    259276     ! intregrated production and consumption of POC in the mixed layer 
    260277     ! ---------------------------------------------------------------- 
    261      !  
    262278     DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    263279        zdep = hmld(ji,jj) 
     
    272288 
    273289     ! Computation of the lability spectrum in the mixed layer. In the mixed  
    274      ! layer, this spectrum is supposed to be uniform. 
     290     ! layer, this spectrum is supposed to be uniform as a result of intense 
     291     ! mixing. 
    275292     ! --------------------------------------------------------------------- 
    276293     ztremint(:,:,:) = zremipoc(:,:,:) 
     
    302319     ENDIF 
    303320 
    304      ! ----------------------------------------------------------------------- 
    305321     ! The lability parameterization is used here. The code is here  
    306322     ! almost identical to what is done for big particles. The only difference 
     
    309325     ! should be determined before. 
    310326     ! ----------------------------------------------------------------------- 
    311      ! 
    312327     DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 
    313328        IF (tmask(ji,jj,jk) == 1.) THEN 
     
    384399 
    385400     IF( ln_p4z ) THEN 
     401         ! The standard PISCES part 
    386402         DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    387403            IF (tmask(ji,jj,jk) == 1.) THEN 
    388               ! POC disaggregation by turbulence and bacterial activity.  
     404              ! POC disaggregation by turbulence and bacterial activity.It is a function 
     405              ! of the mean lability and of temperature   
    389406              ! -------------------------------------------------------- 
    390407              zremip          = zremipoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk) 
    391408              zorem           = zremip * tr(ji,jj,jk,jppoc,Kbb) 
    392409              zofer           = zremip * tr(ji,jj,jk,jpsfe,Kbb) 
    393  
     410               
     411              ! Update of the TRA arrays 
    394412              tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zorem 
    395413              orem(ji,jj,jk)      = orem(ji,jj,jk) + zorem 
     
    401419         END_3D 
    402420     ELSE 
     421         ! PISCES-QUOTA part 
    403422       DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    404           ! POC disaggregation by turbulence and bacterial activity.  
    405           ! -------------------------------------------------------- 
     423          ! POC disaggregation by turbulence and bacterial activity.It is a function 
     424          ! of the mean lability and of temperature   
     425          !-------------------------------------------------------- 
    406426          zremip = zremipoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk) 
    407427          zopoc  = zremip * tr(ji,jj,jk,jppoc,Kbb) 
     
    410430          zopop  = xremipp / xremipc * zremip * tr(ji,jj,jk,jppop,Kbb) 
    411431          zofer  = xremipn / xremipc * zremip * tr(ji,jj,jk,jpsfe,Kbb) 
    412  
     432               
     433          ! Update of the TRA arrays 
    413434          tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zopoc 
    414435          tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zopon 
     
    426447        IF( knt == nrdttrc ) THEN 
    427448          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 
     449          CALL iom_put( "REMINP" , zremipoc(:,:,:) * tmask(:,:,:) )  ! Remineralisation rate of small particles 
     450          CALL iom_put( "REMING" , zremigoc(:,:,:) * tmask(:,:,:) )  ! Remineralisation rate of large particles 
     451          CALL iom_put( "REMINF" , zfolimi(:,:,:)  * tmask(:,:,:)  * 1.e+9 * zrfact2 )  ! Remineralisation of biogenic particulate iron 
    431452        ENDIF 
    432453     ENDIF 
     
    493514      ALLOCATE( alphan(jcpoc) , reminp(jcpoc) , alphap(jpi,jpj,jpk,jcpoc) ) 
    494515      ! 
    495       IF (jcpoc > 1) THEN 
     516      IF (jcpoc > 1) THEN  ! Case when more than one lability class is used 
    496517         ! 
    497518         remindelta = LOG(4. * 1000. ) / REAL(jcpoc-1, wp) 
     
    517538         reminp(jcpoc) = reminp(jcpoc) * xremip / alphan(jcpoc) 
    518539 
    519       ELSE 
     540      ELSE  ! Only one lability class is used 
    520541         alphan(jcpoc) = 1. 
    521542         reminp(jcpoc) = xremip 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zprod.F90

    r13295 r14385  
    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    
     83      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprdch, zprnch 
    8584      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprorcan, zprorcad, zprofed, zprofen 
    8685      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpronewn, zpronewd 
    8786      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxl_fac, zmxl_chl 
    88       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpligprod1, zpligprod2 
     87      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zpligprod 
    8988      !!--------------------------------------------------------------------- 
    9089      ! 
     
    9392      !  Allocate temporary workspace 
    9493      ! 
    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 
     94      zprorcan(:,:,:) = 0._wp ; zprorcad(:,:,:) = 0._wp ; zprofed(:,:,:) = 0._wp 
     95      zprofen (:,:,:) = 0._wp ; zysopt  (:,:,:) = 0._wp 
     96      zpronewn(:,:,:) = 0._wp ; zpronewd(:,:,:) = 0._wp ; zprdia(:,:,:) = 0._wp 
     97      zprbio  (:,:,:) = 0._wp ; zprdch  (:,:,:) = 0._wp ; zprnch(:,:,:) = 0._wp  
     98      zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp  
     99      consfe3 (:,:,:) = 0._wp 
     100 
     101      ! Computation of the maximimum production. Based on a Q10 description 
     102      ! of the thermal dependency 
     103      ! Parameters are taken from Bissinger et al. (2008) 
    103104      zprmaxn(:,:,:) = 0.8_wp * r1_rday * tgfunc(:,:,:) 
    104105      zprmaxd(:,:,:) = zprmaxn(:,:,:) 
    105106 
    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( 1, 1, 1, 1 ) 
    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( 1, 1, 1, 1, 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 )) 
    124             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 
     107      ! Intermittency is supposed to have a similar effect on production as  
     108      ! day length (Shatwell et al., 2012). The correcting factor is zmxl_fac.  
     109      ! zmxl_chl is the fractional day length and is used to compute the mean 
     110      ! PAR during daytime. The effect of mixing is computed using the  
     111      ! absolute light level definition of the euphotic zone 
     112      ! -------------------------------------------------------------------------  
     113      DO jk = 1, jpkm1 
     114         DO jj = 1 ,jpj 
     115            DO ji = 1, jpi 
     116               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     117                  zval = MAX( 1., strn(ji,jj) ) 
     118                  IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN 
     119                     zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) 
     120                  ENDIF 
     121                  zmxl_chl(ji,jj,jk) = zval / 24. 
     122                  zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval ) 
     123               ENDIF 
     124            END DO 
     125         END DO 
     126      END DO 
    129127 
    130128      zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:) 
    131129      zprdia(:,:,:) = zprmaxd(:,:,:) * zmxl_fac(:,:,:) 
    132130 
    133       ! Maximum light intensity 
    134       WHERE( zstrn(:,:) < 1.e0 ) zstrn(:,:) = 24. 
    135  
    136       ! Computation of the P-I slope for nanos and diatoms 
     131      ! The formulation proposed by Geider et al. (1997) has been modified  
     132      ! to exclude the effect of nutrient limitation and temperature in the PI 
     133      ! curve following Vichi et al. (2007) 
     134      ! ----------------------------------------------------------------------- 
    137135      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    138136         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     
    142140            zconctemp2  = tr(ji,jj,jk,jpdia,Kbb) - zconctemp 
    143141            ! 
     142            ! The initial slope of the PI curve can be increased for nano 
     143            ! to account for photadaptation, for instance in the DCM 
     144            ! This parameterization is adhoc and should be either  
     145            ! improved or removed in future versions of the model 
     146 
     147            ! Nanophytoplankton 
    144148            zpislopeadn(ji,jj,jk) = pislopen * ( 1.+ zadap  * EXP( -0.25 * enano(ji,jj,jk) ) )  & 
    145149            &                   * tr(ji,jj,jk,jpnch,Kbb) /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn) 
    146             ! 
     150 
     151            ! Diatoms 
    147152            zpislopeadd(ji,jj,jk) = (pislopen * zconctemp2 + pisloped * zconctemp) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn )   & 
    148153            &                   * tr(ji,jj,jk,jpdch,Kbb) /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn) 
     
    153158         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    154159             ! Computation of production function for Carbon 
    155              !  --------------------------------------------- 
     160             ! Actual light levels are used here  
     161             ! ---------------------------------------------- 
    156162             zpislopen = zpislopeadn(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) & 
    157163             &            * zmxl_fac(ji,jj,jk) * rday + rtrn) 
     
    160166             zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) )  ) 
    161167             zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) )  ) 
     168 
    162169             !  Computation of production function for Chlorophyll 
    163              !-------------------------------------------------- 
     170             !  Mean light level in the mixed layer (when appropriate) 
     171             !  is used here (acclimation is in general slower than  
     172             !  the characteristic time scales of vertical mixing) 
     173             !  ------------------------------------------------------ 
    164174             zpislopen = zpislopeadn(ji,jj,jk) / ( zprmaxn(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn ) 
    165175             zpisloped = zpislopeadd(ji,jj,jk) / ( zprmaxd(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn ) 
     
    169179      END_3D 
    170180 
    171       !  Computation of a proxy of the N/C ratio 
    172       !  --------------------------------------- 
     181      !  Computation of a proxy of the N/C quota from nutrient limitation  
     182      !  and light limitation. Steady state is assumed to allow the computation 
     183      !  ---------------------------------------------------------------------- 
    173184      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    174185          zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) )   & 
     
    184195 
    185196          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) 
     197             ! Si/C of diatoms 
     198             ! ------------------------ 
     199             ! Si/C increases with iron stress and silicate availability 
     200             ! Si/C is arbitrariliy increased for very high Si concentrations 
     201             ! to mimic the very high ratios observed in the Southern Ocean (zsilfac) 
     202             ! A parameterization derived from Flynn (2003) is used for the control 
     203             ! when Si is not limiting which is similar to the parameterisation 
     204             ! proposed by Gurney and Davidson (1999). 
     205             ! ----------------------------------------------------------------------- 
    191206            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 
     207            zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) 
    194208            zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) 
    195209            IF (gphit(ji,jj) < -30 ) THEN 
    196               zsilfac2 = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 ) 
     210              zsilfac = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 ) 
    197211            ELSE 
    198               zsilfac2 = 1. +      zsiborn / ( zsiborn + xksi2**3 ) 
     212              zsilfac = 1. +      zsiborn / ( zsiborn + xksi2**3 ) 
    199213            ENDIF 
    200             zysopt(ji,jj,jk) = grosip * zlim * zsilfac * zsilfac2 
     214            zratiosi = 1.0 - tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) / ( zsilfac * grosip * 3.0 + rtrn ) 
     215            zratiosi = MAX(0., MIN(1.0, zratiosi) ) 
     216            zmaxsi  = (1.0 + 0.1**4) * zratiosi**4 / ( zratiosi**4 + 0.1**4 ) 
     217            IF( xlimsi(ji,jj,jk) /= xlimdia(ji,jj,jk) ) THEN 
     218               zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zmaxsi 
     219            ELSE 
     220               zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zsilim**0.7 * zmaxsi 
     221            ENDIF 
    201222        ENDIF 
    202223      END_3D 
    203224 
    204       !  Mixed-layer effect on production  
    205       !  Sea-ice effect on production 
    206  
     225      ! Sea-ice effect on production 
     226      ! No production is assumed below sea ice 
     227      ! --------------------------------------  
    207228      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    208229         zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) 
     
    210231      END_3D 
    211232 
    212       ! Computation of the various production terms  
     233      ! Computation of the various production  and nutrient uptake terms 
     234      ! --------------------------------------------------------------- 
    213235      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    214236         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    215237            !  production terms for nanophyto. (C) 
    216238            zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2 
     239 
     240            !  New production (uptake of NO3) 
    217241            zpronewn(ji,jj,jk)  = zprorcan(ji,jj,jk)* xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn ) 
    218242            ! 
    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) 
     243            ! Size computation 
     244            ! Size is made a function of the limitation of of phytoplankton growth 
     245            ! Strongly limited cells are supposed to be smaller. sizena is the  
     246            ! size at time step t+1 and is thus updated at the end of the  
     247            ! current time step 
     248            ! -------------------------------------------------------------------- 
     249            zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn ) 
     250            zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     251            sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) ) 
     252 
     253            ! Iron uptake rates of nanophytoplankton. Upregulation is   
     254            ! not parameterized at low iron concentrations as observations 
     255            ! do not suggest it for accimated cells. Uptake is 
     256            ! downregulated when the quota is close to the maximum quota 
     257            zfecnm = xqfuncfecn(ji,jj,jk) + ( fecnm - xqfuncfecn(ji,jj,jk) ) * ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) ) 
     258            zratio = 1.0 - MIN(1.0,tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * zfecnm + rtrn ) ) 
     259            zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) )  
     260            zprofen(ji,jj,jk) = zfecnm * zprmaxn(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  & 
     261            &          * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn + xnanono3(ji,jj,jk)  & 
     262            &          + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) )   & 
     263            &          * xnanofer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpphy,Kbb) * rfact2 
     264 
     265            ! production terms of diatoms (C) 
    226266            zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * tr(ji,jj,jk,jpdia,Kbb) * rfact2 
     267 
     268            ! New production (uptake of NO3) 
    227269            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 
     270 
     271            ! Size computation 
     272            ! Size is made a function of the limitation of of phytoplankton growth 
     273            ! Strongly limited cells are supposed to be smaller. sizeda is 
     274            ! size at time step t+1 and is thus updated at the end of the  
     275            ! current time step.  
     276            ! -------------------------------------------------------------------- 
     277            zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) 
     278            zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     279            sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) ) 
     280 
     281            ! Iron uptake rates of diatoms. Upregulation is   
     282            ! not parameterized at low iron concentrations as observations 
     283            ! do not suggest it for accimated cells. Uptake is 
     284            ! downregulated when the quota is close to the maximum quota 
     285            zfecdm = xqfuncfecd(ji,jj,jk) + ( fecdm - xqfuncfecd(ji,jj,jk) ) * ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) ) 
     286            zratio = 1.0 - MIN(1.0, tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) * zfecdm + rtrn ) ) 
     287            zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) )  
     288            zprofed(ji,jj,jk) = zfecdm * zprmaxd(ji,jj,jk) * (1.0 - fr_i(ji,jj) )  & 
     289            &          * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn + xdiatno3(ji,jj,jk)  & 
     290            &          + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) )   & 
     291            &          * xdiatfer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpdia,Kbb) * rfact2 
    235292         ENDIF 
    236293      END_3D 
    237294 
    238295      ! Computation of the chlorophyll production terms 
     296      ! The parameterization is taken from Geider et al. (1997) 
     297      ! ------------------------------------------------------- 
    239298      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    240299         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     
    243302            zprod    = rday * zprorcan(ji,jj,jk) * zprnch(ji,jj,jk) * xlimphy(ji,jj,jk) 
    244303            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 / & 
     304            zprochln = zprochln + (chlcnm - chlcmin) * 12. * zprod / & 
    247305                                  & (  zpislopeadn(ji,jj,jk) * znanotot +rtrn) 
     306 
    248307            !  production terms for diatoms ( chlorophyll ) 
    249308            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    250309            zprod    = rday * zprorcad(ji,jj,jk) * zprdch(ji,jj,jk) * xlimdia(ji,jj,jk) 
    251310            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 / & 
     311            zprochld = zprochld + (chlcdm - chlcmin) * 12. * zprod / & 
    254312                                  & ( zpislopeadd(ji,jj,jk) * zdiattot +rtrn ) 
     313 
    255314            !   Update the arrays TRA which contain the Chla sources and sinks 
    256315            tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln * texcretn 
     
    262321      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    263322        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 
     323           zpptot   = zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk) 
     324           zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) 
     325           zpregtot = zpptot - zpnewtot 
     326           zprodsil  = zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb) 
     327           zproddoc  = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) 
     328           zprodfer  = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) 
     329           ! 
     330           tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpptot 
     331           tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot 
     332           tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot 
    270333           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 
     334           tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk)  * texcretn 
    272335           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) ) 
     336           tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk)  * texcretd 
     337           tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprodsil 
     338           tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - zprodsil 
     339           tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc 
     340           tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + o2ut * zpregtot + ( o2ut + o2nit ) * zpnewtot 
    278341           ! 
    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 ) 
     342           tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer 
     343           consfe3(ji,jj,jk)   = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) )   & 
     344           &                   * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2 
     345            
     346           ! 
     347           tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot 
     348           tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot ) 
    285349        ENDIF 
    286350      END_3D 
    287      ! 
     351 
     352     ! Production and uptake of ligands by phytoplankton. This part is activated  
     353     ! when ln_ligand is set to .true. in the namelist. Ligand uptake is small  
     354     ! and based on the FeL model by Morel et al. (2008) and on the study of 
     355     ! Shaked et al. (2020) 
     356     ! ------------------------------------------------------------------------- 
    288357     IF( ln_ligand ) THEN 
    289          zpligprod1(:,:,:) = 0._wp    ;    zpligprod2(:,:,:) = 0._wp 
    290358         DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    291359           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 
     360              zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) 
     361              zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) 
     362              zprodlig = plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet 
     363              ! 
     364              tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zproddoc * ldocp - zprodfer * zprodlig 
    297365           ENDIF 
    298366         END_3D 
     
    300368 
    301369 
     370    ! Output of the diagnostics 
    302371    ! Total primary production per year 
    303372    IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  & 
     
    312381       CALL iom_put( "PPNEWD"  , zpronewd(:,:,:) * zfact * tmask(:,:,:)   ) ! new primary production by diatomes 
    313382       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(:,:,:) ) 
     383       CALL iom_put( "PFeN"    , zprofen(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by nanophyto 
     384       CALL iom_put( "PFeD"    , zprofed(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by  diatomes 
     385       IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN 
     386           ALLOCATE(  zpligprod(jpi,jpj,jpk) ) 
     387           zpligprod(:,:,:) = excretd * zprorcad(:,:,:) + excretn * zprorcan(:,:,:) 
     388           CALL iom_put( "LPRODP"  , zpligprod(:,:,:) * ldocp * 1e9 * zfact * tmask(:,:,:) ) 
     389           ! 
     390           zpligprod(:,:,:) = ( texcretn * zprofen(:,:,:) + texcretd * zprofed(:,:,:) ) &  
     391             &                  * plig(:,:,:) / ( rtrn + plig(:,:,:) + 75.0 * (1.0 - plig(:,:,:) ) ) 
     392           CALL iom_put( "LDETP"   , zpligprod(:,:,:)  * lthet * 1e9 * zfact * tmask(:,:,:) ) 
     393           DEALLOCATE(  zpligprod ) 
    319394       ENDIF 
    320395       CALL iom_put( "Mumax"   , zprmaxn(:,:,:) * tmask(:,:,:)  ) ! Maximum growth rate 
     
    346421      !! ** Purpose :   Initialization of phytoplankton production parameters 
    347422      !! 
    348       !! ** Method  :   Read the nampisprod namelist and check the parameters 
     423      !! ** Method  :   Read the namp4zprod namelist and check the parameters 
    349424      !!      called at the first timestep (nittrc000) 
    350425      !! 
    351       !! ** input   :   Namelist nampisprod 
     426      !! ** input   :   Namelist namp4zprod 
    352427      !!---------------------------------------------------------------------- 
    353428      INTEGER ::   ios   ! Local integer 
    354429      ! 
     430      ! Namelist block 
    355431      NAMELIST/namp4zprod/ pislopen, pisloped, xadap, bresp, excretn, excretd,  & 
    356432         &                 chlcnm, chlcdm, chlcmin, fecnm, fecdm, grosip 
     
    365441      READ  ( numnatp_ref, namp4zprod, IOSTAT = ios, ERR = 901) 
    366442901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zprod in reference namelist' ) 
     443 
    367444      READ  ( numnatp_cfg, namp4zprod, IOSTAT = ios, ERR = 902 ) 
    368445902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zprod in configuration namelist' ) 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zrem.F90

    r13295 r14385  
    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 
    72       REAL(wp), DIMENSION(jpi,jpj    ) :: ztempbac 
    73       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdepbac, zolimi, zdepprod, zfacsi, zfacsib, zdepeff, zfebact 
     79      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdepbac, zolimi, zfacsi, zfacsib, zdepeff, zfebact 
    7480      !!--------------------------------------------------------------------- 
    7581      ! 
    7682      IF( ln_timing )   CALL timing_start('p4z_rem') 
    7783      ! 
    78       ! Initialisation of arrys 
    79       zdepprod(:,:,:) = 1._wp 
     84      ! Initialisation of arrays 
    8085      zdepeff (:,:,:) = 0.3_wp 
    81       ztempbac(:,:)   = 0._wp 
    8286      zfacsib(:,:,:)  = xsilab / ( 1.0 - xsilab ) 
    8387      zfebact(:,:,:)  = 0._wp 
    8488      zfacsi(:,:,:)   = xsilab 
    8589 
    86       ! Computation of the mean phytoplankton concentration as 
    87       ! a crude estimate of the bacterial biomass 
     90      ! Computation of the mean bacterial concentration 
    8891      ! this parameterization has been deduced from a model version 
    89       ! that was modeling explicitely bacteria 
    90       ! ------------------------------------------------------- 
    91       DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    92          zdep = MAX( hmld(ji,jj), heup(ji,jj) ) 
     92      ! that was modeling explicitely bacteria. This is a very old param  
     93      ! that will be very soon updated based on results from a much more 
     94      ! recent version of PISCES with bacteria. 
     95      ! ---------------------------------------------------------------- 
     96      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     97         zdep = MAX( hmld(ji,jj), heup_01(ji,jj) ) 
     98         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 
    9399         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 ) 
    95             ztempbac(ji,jj)   = zdepbac(ji,jj,jk) 
    96          ELSE 
    97100            zdepmin = MIN( 1., zdep / gdept(ji,jj,jk,Kmm) ) 
    98             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 
     101            zdepeff(ji,jj,jk) = zdepeff(ji,jj,jk) * zdepmin**0.3 
    101102         ENDIF 
    102103      END_3D 
    103104 
    104       IF( ln_p4z ) THEN 
    105          DO_3D( 1, 1, 1, 1, 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( 1, 1, 1, 1, 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  
     105      DO_3D( 1, 1, 1, 1, 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         ! -------------------------------------------------------------------------- 
     109         zremik = xstep / 1.e-6 * xlimbac(ji,jj,jk) * zdepbac(ji,jj,jk)  
     110         zremik = MAX( zremik, 2.74e-4 * xstep / xremikc ) 
     111         zremikc = xremikc * zremik 
     112 
     113         ! Ammonification in oxic waters with oxygen consumption 
     114         ! ----------------------------------------------------- 
     115         zolimic = zremikc * ( 1.- nitrfac(ji,jj,jk) ) * tr(ji,jj,jk,jpdoc,Kbb)  
     116         zolimic = MIN( ( tr(ji,jj,jk,jpoxy,Kbb) - rtrn ) / o2ut, zolimic )  
     117         zolimi(ji,jj,jk) = zolimic 
     118 
     119         ! Ammonification in suboxic waters with denitrification 
     120         ! ----------------------------------------------------- 
     121         zammonic = zremikc * nitrfac(ji,jj,jk) * tr(ji,jj,jk,jpdoc,Kbb) 
     122         denitr(ji,jj,jk)  = zammonic * ( 1. - nitrfac2(ji,jj,jk) ) 
     123         denitr(ji,jj,jk)  = MAX(0., MIN(  ( tr(ji,jj,jk,jpno3,Kbb) - rtrn ) / rdenit, denitr(ji,jj,jk) ) ) 
     124 
     125         ! Ammonification in waters depleted in O2 and NO3 based on  
     126         ! other redox processes 
     127         ! -------------------------------------------------------- 
     128         zoxyremc          = MAX(0., zammonic - denitr(ji,jj,jk) ) 
     129 
     130         ! Update of the the trends arrays 
     131         tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - denitr (ji,jj,jk) * rdenit 
     132         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) - ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     133         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - zolimic * o2ut 
     134         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zolimic + denitr(ji,jj,jk) + zoxyremc 
     135         IF( ln_p4z ) THEN ! PISCES-std 
     136            tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zolimic + denitr(ji,jj,jk) + zoxyremc 
     137            tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zolimic + denitr(ji,jj,jk) + zoxyremc 
     138            tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zolimic + zoxyremc + ( rdenit + 1.) * denitr(ji,jj,jk) ) 
     139         ELSE  ! PISCES-QUOTA (p5z) 
     140            zremikn = xremikn / xremikc * tr(ji,jj,jk,jpdon,kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn ) 
     141            zremikp = xremikp / xremikc * tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdoc,Kbb) + rtrn ) 
     142            tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zremikp * ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     143            tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zremikn * ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     144            tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) - zremikn * ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     145            tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) - zremikp * ( zolimic + denitr(ji,jj,jk) + zoxyremc ) 
     146            tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zremikn * ( zolimic + zoxyremc + ( rdenit + 1.) * denitr(ji,jj,jk) ) 
     147         ENDIF 
     148      END_3D 
    179149 
    180150      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     
    194164      END_3D 
    195165 
    196        IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging) 
     166      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging) 
    197167         WRITE(charout, FMT="('rem1')") 
    198168         CALL prt_ctl_info( charout, cdcomp = 'top' ) 
    199169         CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) 
    200        ENDIF 
     170      ENDIF 
    201171 
    202172      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     
    206176         ! studies (especially at Papa) have shown this uptake to be significant 
    207177         ! ---------------------------------------------------------- 
    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) 
     178         zbactfer = feratb * 0.6_wp * xstep * tgfunc(ji,jj,jk) * xlimbacl(ji,jj,jk) * tr(ji,jj,jk,jpfer,Kbb)    & 
     179           &       / ( xkferb + tr(ji,jj,jk,jpfer,Kbb) ) * zdepeff(ji,jj,jk) * zdepbac(ji,jj,jk) 
     180          
     181         ! Only the transfer of iron from its dissolved form to particles 
     182         ! is treated here. The GGE of bacteria supposed to be equal to  
     183         ! 0.33. This is hard-coded.  
     184         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zbactfer*0.18 
     185         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zbactfer*0.15 
     186         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zbactfer*0.03 
     187         zfebact(ji,jj,jk)   = zbactfer * 0.18 
     188         blim(ji,jj,jk)      = xlimbacl(ji,jj,jk)  * zdepbac(ji,jj,jk) / 1.e-6 
    216189      END_3D 
    217190 
     
    225198      ! of bSi. Set to a constant in the upper ocean 
    226199      ! --------------------------------------------------------------- 
    227  
    228       DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     200      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     201 
     202         ! Remineralization rate of BSi dependent on T and saturation 
     203         ! The parameterization is taken from Ridgwell et al. (2002)  
     204         ! --------------------------------------------------------- 
    229205         zdep     = MAX( hmld(ji,jj), heup_01(ji,jj) ) 
    230206         zsatur   = MAX( rtrn, ( sio3eq(ji,jj,jk) - tr(ji,jj,jk,jpsil,Kbb) ) / ( sio3eq(ji,jj,jk) + rtrn ) ) 
    231207         zsatur2  = ( 1. + ts(ji,jj,jk,jp_tem,Kmm) / 400.)**37 
    232208         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          ! --------------------------------------------------------- 
     209  
     210         ! Two fractions of bSi are considered : a labile one and a more 
     211         ! refractory one based on the commonly observed two step  
     212         ! dissolution of bSi (initial rapid dissolution followed by  
     213         ! more slowly dissolution). 
     214         ! Computation of the vertical evolution of the labile fraction 
     215         ! of bSi. This is computed assuming steady state. 
     216         ! -------------------------------------------------------------- 
    235217         IF ( gdept(ji,jj,jk,Kmm) > zdep ) THEN 
    236218            zfacsib(ji,jj,jk) = zfacsib(ji,jj,jk-1) * EXP( -0.5 * ( xsiremlab - xsirem )  & 
     
    283265      !! 
    284266      !!---------------------------------------------------------------------- 
    285       NAMELIST/nampisrem/ xremik, nitrif, xsirem, xsiremlab, xsilab, feratb, xkferb, &  
     267      NAMELIST/nampisrem/ nitrif, xsirem, xsiremlab, xsilab, feratb, xkferb, &  
    286268         &                xremikc, xremikn, xremikp 
    287269      INTEGER :: ios                 ! Local integer output status for namelist read 
     
    303285         WRITE(numout,*) '   Namelist parameters for remineralization, nampisrem' 
    304286         IF( ln_p4z ) THEN 
    305             WRITE(numout,*) '      remineralization rate of DOC              xremik    =', xremik 
     287            WRITE(numout,*) '      remineralization rate of DOC              xremikc   =', xremikc 
    306288         ELSE 
    307289            WRITE(numout,*) '      remineralization rate of DOC              xremikc   =', xremikc 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zsed.F90

    r13546 r14385  
    6666      REAL(wp) ::  zsiloss, zcaloss, zws3, zws4, zwsc, zdep 
    6767      REAL(wp) ::  zwstpoc, zwstpon, zwstpop 
    68       REAL(wp) ::  ztrfer, ztrpo4s, ztrdp, zwdust, zmudia, ztemp 
     68      REAL(wp) ::  ztrfer, ztrpo4, ztrdop, zmudia, ztemp 
    6969      REAL(wp) ::  xdiano3, xdianh4 
     70      REAL(wp) ::  zsoufer, zlight 
    7071      ! 
    7172      CHARACTER (len=25) :: charout 
    72       REAL(wp), DIMENSION(jpi,jpj    ) :: zdenit2d, zbureff, zwork 
     73      REAL(wp), DIMENSION(jpi,jpj    ) :: zdenit2d, zbureff 
    7374      REAL(wp), DIMENSION(jpi,jpj    ) :: zwsbio3, zwsbio4 
    7475      REAL(wp), DIMENSION(jpi,jpj    ) :: zsedcal, zsedsi, zsedc 
    75       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zsoufer, zlight 
    76       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrpo4, ztrdop, zirondep, zpdep 
    7776      !!--------------------------------------------------------------------- 
    7877      ! 
     
    8180 
    8281      ! Allocate temporary workspace 
    83       ALLOCATE( ztrpo4(jpi,jpj,jpk) ) 
    84       IF( ln_p5z )    ALLOCATE( ztrdop(jpi,jpj,jpk) ) 
    85  
    8682      zdenit2d(:,:) = 0.e0 
    8783      zbureff (:,:) = 0.e0 
    88       zwork   (:,:) = 0.e0 
    8984      zsedsi  (:,:) = 0.e0 
    9085      zsedcal (:,:) = 0.e0 
    9186      zsedc   (:,:) = 0.e0 
    9287 
     88      ! OA: Warning, the following part is necessary to avoid CFL problems  
     89      ! above the sediments. Vertical sinking speed is limited using the  
     90      ! typical CFL criterion 
     91      ! -------------------------------------------------------------------- 
     92      DO_2D( 1, 1, 1, 1 ) 
     93         ikt  = mbkt(ji,jj) 
     94         zdep = e3t(ji,jj,ikt,Kmm) / xstep 
     95         zwsbio4(ji,jj) = MIN( 0.99 * zdep, wsbio4(ji,jj,ikt) ) 
     96         zwsbio3(ji,jj) = MIN( 0.99 * zdep, wsbio3(ji,jj,ikt) ) 
     97      END_2D 
     98 
    9399      IF( .NOT.lk_sed ) THEN 
    94          ! OA: Warning, the following part is necessary to avoid CFL problems above the sediments 
    95          ! -------------------------------------------------------------------- 
    96          DO_2D( 1, 1, 1, 1 ) 
    97             ikt  = mbkt(ji,jj) 
    98             zdep = e3t(ji,jj,ikt,Kmm) / xstep 
    99             zwsbio4(ji,jj) = MIN( 0.99 * zdep, wsbio4(ji,jj,ikt) ) 
    100             zwsbio3(ji,jj) = MIN( 0.99 * zdep, wsbio3(ji,jj,ikt) ) 
    101          END_2D 
    102  
    103          ! Computation of the sediment denitrification proportion: The metamodel from midlleburg (2006) is being used 
    104          ! Computation of the fraction of organic matter that is permanently buried from Dunne's model 
     100 
     101         ! Computation of the sediment denitrification proportion: The metamodel  
     102         ! from Middleburg (2006) is used 
     103         ! Computation of the fraction of organic matter that is permanently  
     104         ! buried from Dunne's model (2007) 
    105105         ! ------------------------------------------------------- 
    106106         DO_2D( 1, 1, 1, 1 ) 
     
    125125      ENDIF 
    126126 
    127       ! This loss is scaled at each bottom grid cell for equilibrating the total budget of silica in the ocean. 
    128       ! Thus, the amount of silica lost in the sediments equal the supply at the surface (dust+rivers) 
    129       ! ------------------------------------------------------ 
     127      ! Fraction of dSi that is dissolved in the sediments. This fraction is   
     128      ! set to a constant value in p4zsbc 
     129      ! -------------------------------------------------------------------- 
    130130      IF( .NOT.lk_sed )  zrivsil = 1._wp - sedsilfrac 
    131131 
     132      ! Loss of bSi and CaCO3 to the sediments 
    132133      DO_2D( 1, 1, 1, 1 ) 
    133134         ikt  = mbkt(ji,jj) 
     
    142143      ! 
    143144      IF( .NOT.lk_sed ) THEN 
     145         ! Dissolution of CaCO3 and bSi in the sediments. This is  
     146         ! instantaneous since here sediments are not explicitly  
     147         ! modeled. The amount of CaCO3 that dissolves in the sediments 
     148         ! is computed using a metamodel constructed from Archer (1996) 
     149         ! A minimum set to sedcalfrac is preserved. This value is defined in p4zbc 
     150         ! ---------------------------------------------------------------              
    144151         DO_2D( 1, 1, 1, 1 ) 
    145152            ikt  = mbkt(ji,jj) 
     
    160167      ENDIF 
    161168      ! 
     169      ! Loss of particulate organic carbon and Fe to the sediments 
    162170      DO_2D( 1, 1, 1, 1 ) 
    163171         ikt  = mbkt(ji,jj) 
     
    171179      END_2D 
    172180      ! 
     181      ! Loss of particulate organic N and P to the sediments (p5z) 
    173182      IF( ln_p5z ) THEN 
    174183         DO_2D( 1, 1, 1, 1 ) 
     
    185194 
    186195      IF( .NOT.lk_sed ) THEN 
     196         ! Degradation of organic matter in the sediments. The metamodel of  
     197         ! Middleburg (2006) is used here to mimic the diagenetic reactions.  
    187198         ! The 0.5 factor in zpdenit is to avoid negative NO3 concentration after 
    188199         ! denitrification in the sediments. Not very clever, but simpliest option. 
     200         ! ------------------------------------------------------------------------ 
    189201         DO_2D( 1, 1, 1, 1 ) 
    190202            ikt  = mbkt(ji,jj) 
     
    192204            zws4 = zwsbio4(ji,jj) * zdep 
    193205            zws3 = zwsbio3(ji,jj) * zdep 
     206            ! Fraction that is permanently buried in the sediments             
    194207            zrivno3 = 1. - zbureff(ji,jj) 
    195208            zwstpoc = tr(ji,jj,ikt,jpgoc,Kbb) * zws4 + tr(ji,jj,ikt,jppoc,Kbb) * zws3 
     209            ! Denitrification in the sediments             
    196210            zpdenit  = MIN( 0.5 * ( tr(ji,jj,ikt,jpno3,Kbb) - rtrn ) / rdenit, zdenit2d(ji,jj) * zwstpoc * zrivno3 ) 
     211            ! Fraction that is not denitrified 
    197212            z1pdenit = zwstpoc * zrivno3 - zpdenit 
     213            ! Oxic remineralization of organic matter in the sediments 
    198214            zolimit = MIN( ( tr(ji,jj,ikt,jpoxy,Kbb) - rtrn ) / o2ut, z1pdenit * ( 1.- nitrfac(ji,jj,ikt) ) ) 
     215            ! The fraction that cannot be denitrified nor oxidized by O2 
     216            ! is released back to the water column as DOC            
    199217            tr(ji,jj,ikt,jpdoc,Krhs) = tr(ji,jj,ikt,jpdoc,Krhs) + z1pdenit - zolimit 
     218            ! Update of the tracers concentrations             
    200219            tr(ji,jj,ikt,jppo4,Krhs) = tr(ji,jj,ikt,jppo4,Krhs) + zpdenit + zolimit 
    201220            tr(ji,jj,ikt,jpnh4,Krhs) = tr(ji,jj,ikt,jpnh4,Krhs) + zpdenit + zolimit 
     
    206225            sdenit(ji,jj) = rdenit * zpdenit * e3t(ji,jj,ikt,Kmm) 
    207226            zsedc(ji,jj)   = (1. - zrivno3) * zwstpoc * e3t(ji,jj,ikt,Kmm) 
     227            ! PISCES-QUOTA (p5z)             
    208228            IF( ln_p5z ) THEN 
    209229               zwstpop              = tr(ji,jj,ikt,jpgop,Kbb) * zws4 + tr(ji,jj,ikt,jppop,Kbb) * zws3 
     
    215235       ENDIF 
    216236 
    217  
    218       ! Nitrogen fixation process 
    219       ! Small source iron from particulate inorganic iron 
    220       !----------------------------------- 
    221       DO jk = 1, jpkm1 
    222          zlight (:,:,jk) =  ( 1.- EXP( -etot_ndcy(:,:,jk) / diazolight ) ) * ( 1. - fr_i(:,:) )  
    223          zsoufer(:,:,jk) = zlight(:,:,jk) * 2E-11 / ( 2E-11 + biron(:,:,jk) ) 
    224       ENDDO 
     237      ! Nitrogen fixation process : light limitation of diazotrophy 
     238      ! Small source of iron from particulate inorganic iron (photochemistry) 
     239      ! This is a purely adhoc param. 
     240      !---------------------------------------------------------------------- 
     241 
     242      ! Diazotrophy (nitrogen fixation) is modeled according to an empirical 
     243      ! formulation. This is described in Aumont et al. (2015). Limitation  
     244      ! by P and Fe is computed. Inhibition by high N concentrations is imposed. 
     245      ! Diazotrophy sensitivity to temperature is parameterized as in  
     246      ! Ye et al. (2012)   
     247      ! ------------------------------------------------------------------------     
    225248      IF( ln_p4z ) THEN 
     249         ! PISCES part               
    226250         DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    227             !                      ! Potential nitrogen fixation dependant on temperature and iron 
     251            ! Potential nitrogen fixation dependant on temperature and iron 
    228252            ztemp = ts(ji,jj,jk,jp_tem,Kmm) 
    229             zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) * 7.625 
    230             !       Potential nitrogen fixation dependant on temperature and iron 
     253            zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) / rno3 
     254            ! Nitrogen fixation is inhibited when enough NO3 and/or NH4 
     255            zlim = ( 1.- xnanonh4(ji,jj,jk) - xnanono3(ji,jj,jk) ) 
     256            zfact = zlim * rfact2 
     257            ! Nitrogen fixation limitation by PO4 and Fe             
     258            ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) ) 
     259            ztrpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) ) 
     260            zlight =  ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) )  
     261            nitrpot(ji,jj,jk) =  zmudia * r1_rday * zfact * MIN( ztrfer, ztrpo4 ) * zlight 
     262         END_3D 
     263      ELSE       
     264         ! PISCES-QUOTA part 
     265         DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     266            !  Potential nitrogen fixation dependant on temperature and iron 
     267            ztemp = ts(ji,jj,jk,jp_tem,Kmm) 
     268            zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) / rno3 
     269            ! Nitrogen fixation is inhibited when enough NO3 and/or NH4 
    231270            xdianh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concnnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) 
    232271            xdiano3 = tr(ji,jj,jk,jpno3,Kbb) / ( concnno3 + tr(ji,jj,jk,jpno3,Kbb) ) * (1. - xdianh4) 
     
    234273            IF( zlim <= 0.1 )   zlim = 0.01 
    235274            zfact = zlim * rfact2 
     275            ! Nitrogen fixation limitation by PO4/DOP and Fe             
    236276            ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) ) 
    237             ztrpo4(ji,jj,jk) = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) ) 
    238             ztrdp = ztrpo4(ji,jj,jk) 
    239             nitrpot(ji,jj,jk) =  zmudia * r1_rday * zfact * MIN( ztrfer, ztrdp ) * zlight(ji,jj,jk) 
    240          END_3D 
    241       ELSE       ! p5z 
    242          DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    243             !                      ! Potential nitrogen fixation dependant on temperature and iron 
    244             ztemp = ts(ji,jj,jk,jp_tem,Kmm) 
    245             zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) * 7.625 
    246             !       Potential nitrogen fixation dependant on temperature and iron 
    247             xdianh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concnnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) 
    248             xdiano3 = tr(ji,jj,jk,jpno3,Kbb) / ( concnno3 + tr(ji,jj,jk,jpno3,Kbb) ) * (1. - xdianh4) 
    249             zlim = ( 1.- xdiano3 - xdianh4 ) 
    250             IF( zlim <= 0.1 )   zlim = 0.01 
    251             zfact = zlim * rfact2 
    252             ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) ) 
    253             ztrpo4(ji,jj,jk) = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) ) 
    254             ztrdop(ji,jj,jk) = tr(ji,jj,jk,jpdop,Kbb) / ( 1E-6 + tr(ji,jj,jk,jpdop,Kbb) ) * (1. - ztrpo4(ji,jj,jk)) 
    255             ztrdp = ztrpo4(ji,jj,jk) + ztrdop(ji,jj,jk) 
    256             nitrpot(ji,jj,jk) =  zmudia * r1_rday * zfact * MIN( ztrfer, ztrdp ) * zlight(ji,jj,jk) 
     277            ztrpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) ) 
     278            ztrdop = tr(ji,jj,jk,jpdop,Kbb) / ( 1E-6 + tr(ji,jj,jk,jpdop,Kbb) ) * (1. - ztrpo4) 
     279            zlight =  ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) )  
     280            nitrpot(ji,jj,jk) =  zmudia * r1_rday * zfact * MIN( ztrfer, ztrpo4 + ztrdop ) * zlight 
    257281         END_3D 
    258282      ENDIF 
     
    261285      ! ---------------------------------------- 
    262286      IF( ln_p4z ) THEN 
     287         ! PISCES part               
    263288         DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    264289            zfact = nitrpot(ji,jj,jk) * nitrfix 
     290            ! 1/3 of the diazotrophs growth is supposed to be excreted 
     291            ! as NH4. 1/3 as DOC and the rest is routed to POC/GOC as  
     292            ! a result of mortality by predation. Completely adhoc param             
    265293            tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zfact / 3.0 
    266294            tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zfact / 3.0 
     
    270298            tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zfact * 1.0 / 3.0 * 1.0 / 3.0 
    271299            tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + ( o2ut + o2nit ) * zfact * 2.0 / 3.0 + o2nit * zfact / 3.0 
     300            ! Fe/c of diazotrophs is assumed to be 30umol Fe/mol C at max             
     301            zlight  =  ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) )  
     302            zsoufer = zlight * 2E-11 / ( 2E-11 + biron(ji,jj,jk) ) 
    272303            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - 30E-6 * zfact * 1.0 / 3.0 
    273304            tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 2.0 / 3.0 
    274305            tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 1.0 / 3.0 
    275             tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer(ji,jj,jk) * rfact2 / rday 
     306            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer * rfact2 / rday 
    276307            tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + concdnh4 / ( concdnh4 + tr(ji,jj,jk,jppo4,Kbb) ) & 
    277308            &                     * 0.001 * tr(ji,jj,jk,jpdoc,Kbb) * xstep 
    278309         END_3D 
    279310      ELSE    ! p5z 
     311         ! PISCES-QUOTA part               
    280312         DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    281313            zfact = nitrpot(ji,jj,jk) * nitrfix 
     314            ! 1/3 of the diazotrophs growth is supposed to be excreted 
     315            ! as NH4. 1/3 as DOC and the rest is routed POC and GOC as  
     316            ! a result of mortality by predation. Completely adhoc param              
    282317            tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zfact / 3.0 
    283318            tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zfact / 3.0 
     319            ! N/P ratio of diazotrophs is supposed to be 46     
     320            ztrpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) ) 
     321            ztrdop = tr(ji,jj,jk,jpdop,Kbb) / ( 1E-6 + tr(ji,jj,jk,jpdop,Kbb) ) * (1. - ztrpo4) 
     322         
    284323            tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - 16.0 / 46.0 * zfact * ( 1.0 - 1.0 / 3.0 ) & 
    285             &                     * ztrpo4(ji,jj,jk) / (ztrpo4(ji,jj,jk) + ztrdop(ji,jj,jk) + rtrn) 
     324            &                     * ztrpo4 / (ztrpo4 + ztrdop + rtrn) 
    286325            tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zfact * 1.0 / 3.0 
    287326            tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zfact * 1.0 / 3.0 
    288327            tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + 16.0 / 46.0 * zfact / 3.0  & 
    289             &                     - 16.0 / 46.0 * zfact * ztrdop(ji,jj,jk)   & 
    290             &                     / (ztrpo4(ji,jj,jk) + ztrdop(ji,jj,jk) + rtrn) 
     328            &                     - 16.0 / 46.0 * zfact * ztrdop / (ztrpo4 + ztrdop + rtrn) 
    291329            tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zfact * 1.0 / 3.0 * 2.0 / 3.0 
    292330            tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + zfact * 1.0 / 3.0 * 2.0 /3.0 
     
    296334            tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + 16.0 / 46.0 * zfact * 1.0 / 3.0 * 1.0 /3.0 
    297335            tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + ( o2ut + o2nit ) * zfact * 2.0 / 3.0 + o2nit * zfact / 3.0 
     336            ! Fe/c of diazotrophs is assumed to be 30umol Fe/mol C at max            
     337            zlight  =  ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) )  
     338            zsoufer = zlight * 2E-11 / ( 2E-11 + biron(ji,jj,jk) ) 
    298339            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - 30E-6 * zfact * 1.0 / 3.0  
    299340            tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 2.0 / 3.0 
    300341            tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 1.0 / 3.0 
    301             tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer(ji,jj,jk) * rfact2 / rday 
     342            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer * rfact2 / rday 
    302343         END_3D 
    303344         ! 
     
    319360      ENDIF 
    320361      ! 
    321       IF( ln_p5z )    DEALLOCATE( ztrpo4, ztrdop ) 
    322       ! 
    323362      IF( ln_timing )  CALL timing_stop('p4z_sed') 
    324363      ! 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zsink.F90

    r13295 r14385  
    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( 1, 1, 1, 1, 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/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zsms.F90

    r14086 r14385  
    2929   PRIVATE 
    3030 
    31    PUBLIC   p4z_sms_init   ! called in p4zsms.F90 
    32    PUBLIC   p4z_sms        ! called in p4zsms.F90 
     31   PUBLIC   p4z_sms_init   ! called in trcini_pisces.F90 
     32   PUBLIC   p4z_sms        ! called in trcsms_pisces.F90 
    3333 
    3434   INTEGER ::    numco2, numnut, numnit      ! logical unit for co2 budget 
    35    REAL(wp) ::   alkbudget, no3budget, silbudget, ferbudget, po4budget 
     35   REAL(wp) ::   alkbudget, no3budget, silbudget, ferbudget, po4budget ! total budget of the different conservative elements 
    3636   REAL(wp) ::   xfact, xfact1, xfact2, xfact3 
    3737 
     
    5555      !!              routines of PISCES bio-model 
    5656      !! 
    57       !! ** Method  : - at each new day ... 
    58       !!              - several calls of bio and sed ??? 
    59       !!              - ... 
     57      !! ** Method  : - calls the various SMS subroutines 
     58      !!              - calls the sediment module (if ln_sediment)   
     59      !!              - several calls of bio and sed (possible time-splitting) 
     60      !!              - handles the potential negative concentrations (xnegtr) 
    6061      !!--------------------------------------------------------------------- 
    6162      ! 
     
    9091      IF( ln_pisdmp .AND. MOD( kt - 1, nn_pisdmp ) == 0 )   CALL p4z_dmp( kt, Kbb, Kmm )      ! Relaxation of some tracers 
    9192      ! 
    92       rfact = rDt_trc 
     93      rfact = rDt_trc  ! time step of PISCES 
    9394      ! 
    9495      IF( ( ln_top_euler .AND. kt == nittrc000 )  .OR. ( .NOT.ln_top_euler .AND. kt <= nittrc000 + 1 ) ) THEN 
    95          rfactr  = 1. / rfact 
    96          rfact2  = rfact / REAL( nrdttrc, wp ) 
    97          rfact2r = 1. / rfact2 
    98          xstep = rfact2 / rday         ! Time step duration for biology 
     96         rfactr  = 1. / rfact  ! inverse of the time step 
     97         rfact2  = rfact / REAL( nrdttrc, wp )  ! time step of the biological SMS 
     98         rfact2r = 1. / rfact2  ! Inverse of the biological time step 
     99         xstep = rfact2 / rday         ! Time step duration for biology relative to a day 
    99100         xfact = 1.e+3 * rfact2r 
    100101         IF(lwp) WRITE(numout,*)  
     
    128129         CALL p4z_flx( kt, jnt, Kbb, Kmm, Krhs )   ! Compute surface fluxes 
    129130         ! 
     131         ! Handling of the negative concentrations 
     132         ! The biological SMS may generate negative concentrations 
     133         ! Trends are tested at each grid cell. If a negative concentrations  
     134         ! is created at a grid cell, all the sources and sinks at that grid  
     135         ! cell are scale to avoid that negative concentration. This approach  
     136         ! is quite simplistic but it conserves mass. 
     137         ! ------------------------------------------------------------------ 
    130138         xnegtr(:,:,:) = 1.e0 
    131139         DO jn = jp_pcs0, jp_pcs1 
     
    139147         !                                ! where at least 1 tracer concentration becomes negative 
    140148         !                                !  
     149         ! Concentrations are updated 
    141150         DO jn = jp_pcs0, jp_pcs1 
    142151           tr(:,:,:,jn,Kbb) = tr(:,:,:,jn,Kbb) + xnegtr(:,:,:) * tr(:,:,:,jn,Krhs) 
     
    191200        ENDIF 
    192201        ! 
     202        ! Trends are are reset to 0 
    193203         DO jn = jp_pcs0, jp_pcs1 
    194204            tr(:,:,:,jn,Krhs) = 0._wp 
     
    199209#endif 
    200210      ! 
     211      ! If ln_sediment is set to .true. then the sediment module is called 
    201212      IF( ln_sediment ) THEN  
    202213         ! 
     
    210221         ztrbbio(:,:,:,jn) = 0._wp 
    211222      END DO 
     223      ! 
    212224      ! 
    213225      IF( l_trdtrc ) THEN 
     
    233245      !!                     ***  p4z_sms_init  ***   
    234246      !! 
    235       !! ** Purpose :   read PISCES namelist 
    236       !! 
    237       !! ** input   :   file 'namelist.trc.s' containing the following 
    238       !!             namelist: natext, natbio, natsms 
     247      !! ** Purpose :   read the general PISCES namelist 
     248      !! 
     249      !! ** input   :   file 'namelist_pisces' containing the following 
     250      !!                namelist: nampisbio, nampisdmp, nampismass  
    239251      !!---------------------------------------------------------------------- 
    240252      INTEGER :: ios                 ! Local integer output status for namelist read 
    241253      !! 
    242       NAMELIST/nampisbio/ nrdttrc, wsbio, xkmort, ferat3, wsbio2, wsbio2max, wsbio2scale,    & 
    243          &                  ldocp, ldocz, lthet, no3rat3, po4rat3 
     254      NAMELIST/nampisbio/ nrdttrc, wsbio, xkmort, feratz, feratm, wsbio2, wsbio2max,    & 
     255         &                wsbio2scale, ldocp, ldocz, lthet, no3rat3, po4rat3 
    244256         ! 
    245257      NAMELIST/nampisdmp/ ln_pisdmp, nn_pisdmp 
     
    265277         WRITE(numout,*) '      half saturation constant for mortality    xkmort      =', xkmort  
    266278         IF( ln_p5z ) THEN 
    267             WRITE(numout,*) '      N/C in zooplankton                        no3rat3     =', no3rat3 
    268             WRITE(numout,*) '      P/C in zooplankton                        po4rat3     =', po4rat3 
    269          ENDIF 
    270          WRITE(numout,*) '      Fe/C in zooplankton                       ferat3      =', ferat3 
     279            WRITE(numout,*) '      N/C in zooplankton                     no3rat3     =', no3rat3 
     280            WRITE(numout,*) '      P/C in zooplankton                     po4rat3     =', po4rat3 
     281         ENDIF 
     282         WRITE(numout,*) '      Fe/C in microzooplankton                  feratz      =', feratz 
     283         WRITE(numout,*) '      Fe/C in microzooplankton                  feratz      =', feratm 
    271284         WRITE(numout,*) '      Big particles sinking speed               wsbio2      =', wsbio2 
    272285         WRITE(numout,*) '      Big particles maximum sinking speed       wsbio2max   =', wsbio2max 
     
    314327      !!                   ***  ROUTINE p4z_rst  *** 
    315328      !! 
    316       !!  ** Purpose : Read or write variables in restart file: 
     329      !!  ** Purpose : Read or write specific PISCES variables in restart file: 
    317330      !! 
    318331      !!  WRITE(READ) mode: 
     
    327340      IF( TRIM(cdrw) == 'READ' ) THEN 
    328341         ! 
     342         ! Read the specific variable of PISCES 
    329343         IF(lwp) WRITE(numout,*) 
    330344         IF(lwp) WRITE(numout,*) ' p4z_rst : Read specific variables from pisces model ' 
    331345         IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~~' 
    332346         !  
     347         ! Read the pH. If not in the restart file, then it is initialized from 
     348         ! the initial conditions 
    333349         IF( iom_varid( numrtr, 'PH', ldstop = .FALSE. ) > 0 ) THEN 
    334350            CALL iom_get( numrtr, jpdom_auto, 'PH' , hi(:,:,:)  ) 
     
    338354         ENDIF 
    339355         CALL iom_get( numrtr, jpdom_auto, 'Silicalim', xksi(:,:) ) 
     356 
     357         ! Read the Si half saturation constant and the maximum Silica concentration 
    340358         IF( iom_varid( numrtr, 'Silicamax', ldstop = .FALSE. ) > 0 ) THEN 
    341359            CALL iom_get( numrtr, jpdom_auto, 'Silicamax' , xksimax(:,:)  ) 
     
    343361            xksimax(:,:) = xksi(:,:) 
    344362         ENDIF 
    345          ! 
     363 
     364         ! Read the Fe3 consumption term by phytoplankton 
     365         IF( iom_varid( numrtr, 'Consfe3', ldstop = .FALSE. ) > 0 ) THEN 
     366            CALL iom_get( numrtr, jpdom_auto, 'Consfe3' , consfe3(:,:,:)  ) 
     367         ELSE 
     368            consfe3(:,:,:) = 0._wp 
     369         ENDIF 
     370 
     371 
     372         ! Read the cumulative total flux. If not in the restart file, it is set to 0           
    346373         IF( iom_varid( numrtr, 'tcflxcum', ldstop = .FALSE. ) > 0 ) THEN  ! cumulative total flux of carbon 
    347374            CALL iom_get( numrtr, 'tcflxcum' , t_oce_co2_flx_cum  ) 
     
    350377         ENDIF 
    351378         ! 
     379         ! PISCES size proxy 
     380         IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN 
     381            CALL iom_get( numrtr, jpdom_auto, 'sized' , sized(:,:,:)  ) 
     382            sized(:,:,:) = MAX( 1.0, sized(:,:,:) ) 
     383         ELSE 
     384            sized(:,:,:) = 1. 
     385         ENDIF 
     386         ! 
     387         IF( iom_varid( numrtr, 'sizen', ldstop = .FALSE. ) > 0 ) THEN 
     388            CALL iom_get( numrtr, jpdom_auto, 'sizen' , sizen(:,:,:)  ) 
     389            sizen(:,:,:) = MAX( 1.0, sizen(:,:,:) ) 
     390         ELSE 
     391            sizen(:,:,:) = 1. 
     392         ENDIF 
     393 
     394         ! PISCES-QUOTA specific part 
    352395         IF( ln_p5z ) THEN 
    353             IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN 
     396            ! Read the size of the different phytoplankton groups 
     397            ! If not in the restart file, they are set to 1 
     398            IF( iom_varid( numrtr, 'sizep', ldstop = .FALSE. ) > 0 ) THEN 
    354399               CALL iom_get( numrtr, jpdom_auto, 'sizep' , sizep(:,:,:)  ) 
    355                CALL iom_get( numrtr, jpdom_auto, 'sizen' , sizen(:,:,:)  ) 
    356                CALL iom_get( numrtr, jpdom_auto, 'sized' , sized(:,:,:)  ) 
     400               sizep(:,:,:) = MAX( 1.0, sizep(:,:,:) ) 
    357401            ELSE 
    358402               sizep(:,:,:) = 1. 
    359                sizen(:,:,:) = 1. 
    360                sized(:,:,:) = 1. 
    361403            ENDIF 
    362404        ENDIF 
    363405        ! 
    364406      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN 
     407         ! write the specific variables of PISCES 
    365408         IF( kt == nitrst ) THEN 
    366409            IF(lwp) WRITE(numout,*) 
     
    372415         CALL iom_rstput( kt, nitrst, numrtw, 'Silicamax', xksimax(:,:) ) 
    373416         CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum ) 
    374          IF( ln_p5z ) THEN 
    375             CALL iom_rstput( kt, nitrst, numrtw, 'sizep', sizep(:,:,:) ) 
    376             CALL iom_rstput( kt, nitrst, numrtw, 'sizen', sizen(:,:,:) ) 
    377             CALL iom_rstput( kt, nitrst, numrtw, 'sized', sized(:,:,:) ) 
    378          ENDIF 
     417         CALL iom_rstput( kt, nitrst, numrtw, 'Consfe3', consfe3(:,:,:) ) ! Si max concentration 
     418         CALL iom_rstput( kt, nitrst, numrtw, 'tcflxcum', t_oce_co2_flx_cum ) ! Cumulative CO2 flux 
     419         CALL iom_rstput( kt, nitrst, numrtw, 'sizen', sizen(:,:,:) )  ! Size of nanophytoplankton 
     420         CALL iom_rstput( kt, nitrst, numrtw, 'sized', sized(:,:,:) )  ! Size of diatoms 
     421         IF( ln_p5z ) CALL iom_rstput( kt, nitrst, numrtw, 'sizep', sizep(:,:,:) )  ! Size of picophytoplankton 
    379422      ENDIF 
    380423      ! 
     
    386429      !!                    ***  p4z_dmp  *** 
    387430      !! 
    388       !! ** purpose  : Relaxation of some tracers 
     431      !! ** purpose  : Relaxation of the total budget of some elements 
     432      !!               This routine avoids the model to drift far from the  
     433      !!               observed content in various elements 
     434      !!               Elements that may be relaxed : Alk, P, N, Si 
    389435      !!---------------------------------------------------------------------- 
    390436      ! 
     
    393439      ! 
    394440      REAL(wp) ::  alkmean = 2426.     ! mean value of alkalinity ( Glodap ; for Goyet 2391. ) 
    395       REAL(wp) ::  po4mean = 2.165     ! mean value of phosphates 
    396       REAL(wp) ::  no3mean = 30.90     ! mean value of nitrate 
    397       REAL(wp) ::  silmean = 91.51     ! mean value of silicate 
     441      REAL(wp) ::  po4mean = 2.174     ! mean value of phosphate 
     442      REAL(wp) ::  no3mean = 31.00     ! mean value of nitrate 
     443      REAL(wp) ::  silmean = 90.33     ! mean value of silicate 
    398444      ! 
    399445      REAL(wp) :: zarea, zalksumn, zpo4sumn, zno3sumn, zsilsumn 
     
    416462            zsilsumn = glob_sum( 'p4zsms', tr(:,:,:,jpsil,Kmm) * cvol(:,:,:)  ) * zarea 
    417463  
     464            ! Correct the trn mean content of alkalinity 
    418465            IF(lwp) WRITE(numout,*) '       TALKN mean : ', zalksumn 
    419466            tr(:,:,:,jptal,Kmm) = tr(:,:,:,jptal,Kmm) * alkmean / zalksumn 
    420467 
     468            ! Correct the trn mean content of PO4 
    421469            IF(lwp) WRITE(numout,*) '       PO4N  mean : ', zpo4sumn 
    422470            tr(:,:,:,jppo4,Kmm) = tr(:,:,:,jppo4,Kmm) * po4mean / zpo4sumn 
    423471 
     472            ! Correct the trn mean content of NO3 
    424473            IF(lwp) WRITE(numout,*) '       NO3N  mean : ', zno3sumn 
    425474            tr(:,:,:,jpno3,Kmm) = tr(:,:,:,jpno3,Kmm) * no3mean / zno3sumn 
    426475 
     476            ! Correct the trn mean content of SiO3 
    427477            IF(lwp) WRITE(numout,*) '       SiO3N mean : ', zsilsumn 
    428478            tr(:,:,:,jpsil,Kmm) = MIN( 400.e-6,tr(:,:,:,jpsil,Kmm) * silmean / zsilsumn ) 
     
    436486  
    437487               IF(lwp) WRITE(numout,*) ' ' 
     488               ! Correct the trb mean content of alkalinity 
    438489               IF(lwp) WRITE(numout,*) '       TALKB mean : ', zalksumb 
    439490               tr(:,:,:,jptal,Kbb) = tr(:,:,:,jptal,Kbb) * alkmean / zalksumb 
    440491 
     492               ! Correct the trb mean content of PO4 
    441493               IF(lwp) WRITE(numout,*) '       PO4B  mean : ', zpo4sumb 
    442494               tr(:,:,:,jppo4,Kbb) = tr(:,:,:,jppo4,Kbb) * po4mean / zpo4sumb 
    443495 
     496               ! Correct the trb mean content of NO3 
    444497               IF(lwp) WRITE(numout,*) '       NO3B  mean : ', zno3sumb 
    445498               tr(:,:,:,jpno3,Kbb) = tr(:,:,:,jpno3,Kbb) * no3mean / zno3sumb 
    446499 
     500               ! Correct the trb mean content of SiO3 
    447501               IF(lwp) WRITE(numout,*) '       SiO3B mean : ', zsilsumb 
    448502               tr(:,:,:,jpsil,Kbb) = MIN( 400.e-6,tr(:,:,:,jpsil,Kbb) * silmean / zsilsumb ) 
     
    484538      ENDIF 
    485539 
     540      ! Compute the budget of NO3 
    486541      IF( iom_use( "pno3tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    487          !   Compute the budget of NO3, ALK, Si, Fer 
    488542         IF( ln_p4z ) THEN 
    489543            zwork(:,:,:) =    tr(:,:,:,jpno3,Kmm) + tr(:,:,:,jpnh4,Kmm)                      & 
     
    503557      ENDIF 
    504558      ! 
     559      ! Compute the budget of PO4 
    505560      IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    506561         IF( ln_p4z ) THEN 
     
    521576      ENDIF 
    522577      ! 
     578      ! Compute the budget of SiO3 
    523579      IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    524580         zwork(:,:,:) =  tr(:,:,:,jpsil,Kmm) + tr(:,:,:,jpgsi,Kmm) + tr(:,:,:,jpdsi,Kmm)  
     
    537593      ENDIF 
    538594      ! 
     595      ! Compute the budget of Iron 
    539596      IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    540597         zwork(:,:,:) =   tr(:,:,:,jpfer,Kmm) + tr(:,:,:,jpnfe,Kmm) + tr(:,:,:,jpdfe,Kmm)   & 
    541598            &         +   tr(:,:,:,jpbfe,Kmm) + tr(:,:,:,jpsfe,Kmm)                      & 
    542             &         + ( tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm) )  * ferat3     
     599            &         + ( tr(:,:,:,jpzoo,Kmm) * feratz + tr(:,:,:,jpmes,Kmm) ) * feratm    
    543600         ! 
    544601         ferbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )   
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p5zlim.F90

    r13434 r14385  
    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 ::  zpsinh4     !:  respiration cost of NH4 assimilation 
     57   REAL(wp), PUBLIC ::  zpsino3     !:  respiration cost of NO3 assimilation 
     58   REAL(wp), PUBLIC ::  zpsiuptk    !:  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, zzpsiuptk 
    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) ::   zrtp, zrtn 
     140      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrassn, zrassp, zrassd 
    127141      !!--------------------------------------------------------------------- 
    128142      ! 
     
    130144      ! 
    131145      zratchl = 6.0 
     146      sizena(:,:,:) = 0.0  ;  sizepa(:,:,:) = 0.0  ;  sizeda(:,:,:) = 0.0 
    132147      ! 
    133148      DO_3D( 1, 1, 1, 1, 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 
     149         ! Computation of the Chl/C ratio of each phytoplankton group 
    143150         ! ------------------------------------------------------- 
    144151         z1_trnphy   = 1. / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 
     
    149156         zdiatchl = tr(ji,jj,jk,jpdch,Kbb) * z1_trndia 
    150157 
    151          ! Computation of a variable Ks for iron on diatoms taking into account 
    152          ! that increasing biomass is made of generally bigger cells 
     158         ! Computation of a variable Ks for the different phytoplankton 
     159         ! group as a function of their relative size. Allometry 
     160         ! from Edwards et al. (2012) 
    153161         !------------------------------------------------ 
     162 
     163         ! diatoms 
    154164         zsized            = sized(ji,jj,jk)**0.81 
    155165         zconcdfe          = concdfer * zsized 
     
    158168         zconc0dpo4        = concdpo4 * zsized 
    159169 
    160          zsizep            = 1. 
     170         ! picophytoplankton 
     171         zsizep            = sizep(ji,jj,jk)**0.81 
    161172         zconcpfe          = concpfer * zsizep 
    162173         zconc0p           = concpno3 * zsizep 
     
    164175         zconc0ppo4        = concppo4 * zsizep 
    165176 
    166          zsizen            = 1. 
     177         ! nanophytoplankton 
     178         zsizen            = sizen(ji,jj,jk)**0.81 
    167179         zconcnfe          = concnfer * zsizen 
    168180         zconc0n           = concnno3 * zsizen 
     
    173185         ! From Talmy et al. (2014) and Maranon et al. (2013) 
    174186         ! ------------------------------------------------------- 
    175          xqnnmin(ji,jj,jk) = qnnmin 
     187         xqnnmin(ji,jj,jk) = qnnmin * sizen(ji,jj,jk)**(-0.36) 
    176188         xqnnmax(ji,jj,jk) = qnnmax 
    177          xqndmin(ji,jj,jk) = qndmin * sized(ji,jj,jk)**(-0.27)  
     189         xqndmin(ji,jj,jk) = qndmin * sized(ji,jj,jk)**(-0.36) 
    178190         xqndmax(ji,jj,jk) = qndmax 
    179          xqnpmin(ji,jj,jk) = qnpmin 
     191         xqnpmin(ji,jj,jk) = qnpmin * sizep(ji,jj,jk)**(-0.36) 
    180192         xqnpmax(ji,jj,jk) = qnpmax 
    181193 
     
    183195         ! Based on the different papers by Pahlow et al., and Smith et al. 
    184196         ! ----------------------------------------------------------------- 
     197         zbiron = ( 75.0 * ( 1.0 - plig(ji,jj,jk) ) + plig(ji,jj,jk) ) * biron(ji,jj,jk) 
     198                
     199         ! Nanophytoplankton 
    185200         znutlim = MAX( tr(ji,jj,jk,jpnh4,Kbb) / zconc0nnh4,    & 
    186201           &         tr(ji,jj,jk,jpno3,Kbb) / zconc0n) 
     
    188203         znutlim = tr(ji,jj,jk,jppo4,Kbb) / zconc0npo4 
    189204         fananop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
    190          znutlim = biron(ji,jj,jk) / zconcnfe 
     205         znutlim = zbiron / zconcnfe 
    191206         fananof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
     207 
     208         ! Picophytoplankton 
    192209         znutlim = MAX( tr(ji,jj,jk,jpnh4,Kbb) / zconc0pnh4,    & 
    193210           &         tr(ji,jj,jk,jpno3,Kbb) / zconc0p) 
     
    195212         znutlim = tr(ji,jj,jk,jppo4,Kbb) / zconc0ppo4 
    196213         fapicop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
    197          znutlim = biron(ji,jj,jk) / zconcpfe 
     214         znutlim = zbiron / zconcpfe 
    198215         fapicof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
     216 
     217         ! Diatoms 
    199218         znutlim = MAX( tr(ji,jj,jk,jpnh4,Kbb) / zconc1dnh4,    & 
    200219           &         tr(ji,jj,jk,jpno3,Kbb) / zconc1d ) 
     
    202221         znutlim = tr(ji,jj,jk,jppo4,Kbb) / zconc0dpo4 
    203222         fadiatp = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
    204          znutlim = biron(ji,jj,jk) / zconcdfe 
     223         znutlim = zbiron / zconcdfe 
    205224         fadiatf = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 
    206          ! 
    207          ! Michaelis-Menten Limitation term for nutrients Small bacteria 
     225 
     226         ! 
     227         ! Michaelis-Menten Limitation term by nutrients of 
     228         !  heterotrophic bacteria 
    208229         ! ------------------------------------------------------------- 
    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) 
     230         zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concbnh4 + tr(ji,jj,jk,jpnh4,Kbb) ) 
     231         zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( concbno3 + tr(ji,jj,jk,jpno3,Kbb) ) 
     232         znutlimtot = ( tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) )  & 
     233             &      / ( concbno3 + tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) ) 
     234         zbactnh4 = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     235         zbactno3 = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn )          
    211236         ! 
    212237         zlim1    = zbactno3 + zbactnh4 
     
    214239         zlim3    = biron(ji,jj,jk) / ( concbfe + biron(ji,jj,jk) ) 
    215240         zlim4    = tr(ji,jj,jk,jpdoc,Kbb) / ( xkdoc   + tr(ji,jj,jk,jpdoc,Kbb) ) 
     241 
     242         ! Xlimbac is used for DOC solubilization whereas xlimbacl 
     243         ! is used for all the other bacterial-dependent term 
     244         ! ------------------------------------------------------- 
    216245         xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) 
    217246         xlimbac (ji,jj,jk) = xlimbacl(ji,jj,jk) * zlim4 
     
    219248         ! Michaelis-Menten Limitation term for nutrients Small flagellates 
    220249         ! ----------------------------------------------- 
    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          ! 
     250         zrtn    = tr(ji,jj,jk,jpnh4,Kbb) + tr(ji,jj,jk,jpno3,Kbb) 
     251         zrtp    = tr(ji,jj,jk,jppo4,Kbb) + tr(ji,jj,jk,jpdop,Kbb)  
     252         ! 
     253         ! Limitation of N based nutrients uptake (NO3 and NH4) 
     254         zfalim  = (1.-fanano) / fanano 
     255         zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc0n + tr(ji,jj,jk,jpnh4,Kbb) ) 
     256         zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc0n + tr(ji,jj,jk,jpno3,Kbb) ) 
     257         znutlimtot = (1. - fanano) * zrtn  / ( zfalim * zconc0n + ztrn ) 
     258         xnanonh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     259         xnanono3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     260         ! 
     261         ! Limitation of P based nutrients (PO4 and DOP) 
     262         zfalim  = (1.-fananop) / fananop 
     263         zlimpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc0npo4 ) 
     264         zlimdop = tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdop,Kbb) + zconc0npo4 ) 
     265         znutlimtot = (1. - fananop) * ztrp / ( zfalim * zconc0npo4 + ztrp ) 
     266         xnanopo4(ji,jj,jk) = znutlimtot * 100.0 * zlimpo4 / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     267         xnanodop(ji,jj,jk) = znutlimtot * zlimdop / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     268         ! 
     269         ! Limitation of Fe uptake 
    232270         zfalim = (1.-fananof) / fananof 
    233          xnanofer(ji,jj,jk) = (1. - fananof) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcnfe ) 
    234          ! 
     271         xnanofer(ji,jj,jk) = (1. - fananof) * zbiron / ( zbiron + zfalim * zconcnfe ) 
     272         ! 
     273         ! The minimum iron quota depends on the size of PSU, respiration 
     274         ! and the reduction of nitrate following the parameterization  
     275         ! proposed by Flynn and Hipkin (1999) 
    235276         zratiof   = tr(ji,jj,jk,jpnfe,Kbb) * z1_trnphy 
    236277         zqfemn = xcoef1 * znanochl + xcoef2 + xcoef3 * xnanono3(ji,jj,jk) 
     278         xqfuncfecn(ji,jj,jk) = zqfemn + qfnopt 
    237279         ! 
    238280         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)  & 
     281         zration = MIN(xqnnmax(ji,jj,jk), MAX( xqnnmin(ji,jj,jk), zration )) 
     282         fvnuptk(ji,jj,jk) = 2.5 * zpsiuptk * xqnnmin(ji,jj,jk) / (zration + rtrn)  & 
    241283         &                   * MAX(0., (1. - zratchl * znanochl / 12. ) ) 
    242284         ! 
    243          zlim1    = max(0., (zration - 2. * xqnnmin(ji,jj,jk) )  & 
    244          &          / (xqnnmax(ji,jj,jk) - 2. * xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk)  & 
     285         zlim1  = max(0., (zration - xqnnmin(ji,jj,jk) )  & 
     286         &          / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk)  & 
    245287         &          / (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 ) 
     288         ! The value of the optimal quota in the formulation below 
     289         ! has been found by solving a non linear equation 
     290         zlim1f = max(0., ( 1.13 - xqnnmin(ji,jj,jk) )  & 
     291         &          / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk) 
     292         zlim3  = MAX( 0.,( zratiof - zqfemn ) / qfnopt ) 
     293         ! computation of the various limitation terms of nanophyto 
     294         ! growth and PP 
     295         xlimnfe (ji,jj,jk) = MIN( 1., zlim3 ) 
     296         xlimphy (ji,jj,jk) = MIN( 1., zlim1, zlim3 ) 
     297         xlimphys(ji,jj,jk) = MIN( 1., zlim1/( zlim1f + rtrn ), zlim3 ) 
     298         xlimnpn (ji,jj,jk) = MIN( 1., zlim1) 
     299 
     300 
    249301         ! 
    250302         ! Michaelis-Menten Limitation term for nutrients picophytoplankton 
    251303         ! ---------------------------------------------------------------- 
     304         ! Limitation of N based nutrients uptake (NO3 and NH4)  
    252305         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          ! 
     306         zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc0p + tr(ji,jj,jk,jpnh4,Kbb) ) 
     307         zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc0p + tr(ji,jj,jk,jpno3,Kbb) ) 
     308         znutlimtot = (1. - fapico) * zrtn / ( zfalim * zconc0p + ztrn ) 
     309         xpiconh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     310         xpicono3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     311         ! 
     312         ! Limitation of P based nutrients uptake (PO4 and DOP) 
    257313         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. 
     314         zlimpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc0ppo4 ) 
     315         zlimdop = tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdop,Kbb) + zconc0ppo4 ) 
     316         znutlimtot = (1. - fapicop) * ztrp / ( zfalim * zconc0ppo4 + ztrp) 
     317         xpicopo4(ji,jj,jk) = znutlimtot * 100.0 * zlimpo4 / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     318         xpicodop(ji,jj,jk) = znutlimtot * zlimdop / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
    262319         ! 
    263320         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 
     321         xpicofer(ji,jj,jk) = (1. - fapicof) * zbiron / ( zbiron + zfalim * zconcpfe ) 
     322         ! 
     323         ! The minimum iron quota depends on the size of PSU, respiration 
     324         ! and the reduction of nitrate following the parameterization  
     325         ! proposed by Flynn and Hipkin (1999) 
     326         zratiof = tr(ji,jj,jk,jppfe,Kbb) * z1_trnpic 
    267327         zqfemp = xcoef1 * zpicochl + xcoef2 + xcoef3 * xpicono3(ji,jj,jk) 
     328         xqfuncfecp(ji,jj,jk) = zqfemp + qfpopt 
    268329         ! 
    269330         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)  & 
     331         zration = MIN(xqnpmax(ji,jj,jk), MAX( xqnpmin(ji,jj,jk), zration )) 
     332         fvpuptk(ji,jj,jk) = 2.5 * zpsiuptk * xqnpmin(ji,jj,jk) / (zration + rtrn)  & 
    272333         &                   * MAX(0., (1. - zratchl * zpicochl / 12. ) )  
    273334         ! 
    274          zlim1    = max(0., (zration - 2. * xqnpmin(ji,jj,jk) )  & 
    275          &          / (xqnpmax(ji,jj,jk) - 2. * xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk)  & 
     335         zlim1    = max(0., (zration - xqnpmin(ji,jj,jk) )  & 
     336         &          / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk)  & 
    276337         &          / (zration + rtrn) 
     338         ! The value of the optimal quota in the formulation below 
     339         ! has been found by solving a non linear equation 
     340         zlim1f   = max(0., (1.29 - xqnpmin(ji,jj,jk) )  & 
     341         &          / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk) 
    277342         zlim3    = MAX( 0.,( zratiof - zqfemp ) / qfpopt ) 
    278          xlimpfe(ji,jj,jk) = MIN( 1., zlim3 ) 
    279          xlimpic(ji,jj,jk) = MIN( 1., zlim1, zlim3 ) 
     343 
     344         ! computation of the various limitation terms of picophyto 
     345         ! growth and PP 
     346         xlimpfe (ji,jj,jk) = MIN( 1., zlim3 ) 
     347         xlimpic (ji,jj,jk) = MIN( 1., zlim1, zlim3 ) 
     348         xlimnpp (ji,jj,jk) = MIN( 1., zlim1 ) 
     349         xlimpics(ji,jj,jk) = MIN( 1., zlim1/( zlim1f + rtrn ), zlim3 ) 
     350 
     351 
    280352         ! 
    281353         !   Michaelis-Menten Limitation term for nutrients Diatoms 
    282354         !   ------------------------------------------------------ 
     355         ! 
     356         ! Limitation of N based nutrients uptake (NO3 and NH4) 
    283357         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          ! 
     358         zlimnh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( zconc1d + tr(ji,jj,jk,jpnh4,Kbb) ) 
     359         zlimno3 = tr(ji,jj,jk,jpno3,Kbb) / ( zconc1d + tr(ji,jj,jk,jpno3,Kbb) ) 
     360         znutlimtot = (1.0 - fadiat) * ztrn / ( zfalim * zconc1d + ztrn ) 
     361         xdiatnh4(ji,jj,jk) = znutlimtot * 5.0 * zlimnh4 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     362         xdiatno3(ji,jj,jk) = znutlimtot * zlimno3 / ( zlimno3 + 5.0 * zlimnh4 + rtrn ) 
     363         ! 
     364         ! Limitation of P based nutrients uptake (PO4 and DOP) 
    288365         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          ! 
     366         zlimpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + zconc0dpo4 ) 
     367         zlimdop = tr(ji,jj,jk,jpdop,Kbb) / ( tr(ji,jj,jk,jpdop,Kbb) + zconc0dpo4 ) 
     368         znutlimtot = (1. - fadiatp) * ztrp / ( zfalim * zconc0dpo4 + ztrp ) 
     369         xdiatpo4(ji,jj,jk) = znutlimtot * 100.0 * zlimpo4 / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     370         xdiatdop(ji,jj,jk) = znutlimtot * zlimdop / ( zlimdop + 100.0 * zlimpo4 + rtrn ) 
     371         ! 
     372         ! Limitation of Fe uptake 
    294373         zfalim = (1.-fadiatf) / fadiatf 
    295          xdiatfer(ji,jj,jk) = (1. - fadiatf) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcdfe ) 
    296          ! 
     374         xdiatfer(ji,jj,jk) = (1. - fadiatf) * zbiron / ( zbiron + zfalim * zconcdfe ) 
     375         ! 
     376         ! The minimum iron quota depends on the size of PSU, respiration 
     377         ! and the reduction of nitrate following the parameterization  
     378         ! proposed by Flynn and Hipkin (1999) 
    297379         zratiof   = tr(ji,jj,jk,jpdfe,Kbb) * z1_trndia 
    298380         zqfemd = xcoef1 * zdiatchl + xcoef2 + xcoef3 * xdiatno3(ji,jj,jk) 
     381         xqfuncfecd(ji,jj,jk) = zqfemd + qfdopt 
    299382         ! 
    300383         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)   & 
     384         zration   = MIN(xqndmax(ji,jj,jk), MAX( xqndmin(ji,jj,jk), zration )) 
     385         fvduptk(ji,jj,jk) = 2.5 * zpsiuptk * xqndmin(ji,jj,jk) / (zration + rtrn)   & 
    303386         &                   * MAX(0., (1. - zratchl * zdiatchl / 12. ) )  
    304387         ! 
    305          zlim1    = max(0., (zration - 2. * xqndmin(ji,jj,jk) )    & 
    306          &          / (xqndmax(ji,jj,jk) - 2. * xqndmin(ji,jj,jk) ) )   & 
     388         zlim1    = max(0., (zration - xqndmin(ji,jj,jk) )    & 
     389         &          / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) )   & 
    307390         &          * xqndmax(ji,jj,jk) / (zration + rtrn) 
    308          zlim3    = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi(ji,jj) + rtrn ) 
     391         ! The value of the optimal quota in the formulation below 
     392         ! has been found by solving a non linear equation 
     393         zlim1f   = max(0., (1.13 - xqndmin(ji,jj,jk) )    & 
     394         &          / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) )   & 
     395         &          * xqndmax(ji,jj,jk) 
     396         zlim3    = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi(ji,jj) ) 
    309397         zlim4    = MAX( 0., ( zratiof - zqfemd ) / qfdopt ) 
     398         ! computation of the various limitation terms of diatoms 
     399         ! growth and PP 
    310400         xlimdfe(ji,jj,jk) = MIN( 1., zlim4 ) 
    311401         xlimdia(ji,jj,jk) = MIN( 1., zlim1, zlim3, zlim4 ) 
     402         xlimdias(ji,jj,jk) = MIN (1.0, zlim1 / (zlim1f + rtrn ), zlim3, zlim4 ) 
    312403         xlimsi(ji,jj,jk)  = MIN( zlim1, zlim4 ) 
     404         xlimnpd(ji,jj,jk) = MIN( 1., zlim1 ) 
    313405      END_3D 
     406 
    314407      ! 
    315408      ! Compute the phosphorus quota values. It is based on Litchmann et al., 2004 and Daines et al, 2013. 
     
    319412      ! -------------------------------------------------------------------------------------------------- 
    320413      DO_3D( 1, 1, 1, 1, 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  
     414         ! Size estimation of nanophytoplankton based on total biomass 
     415         ! Assumes that larger biomass implies addition of larger cells 
     416         ! ------------------------------------------------------------ 
     417         zcoef = tr(ji,jj,jk,jpphy,Kbb) - MIN(xsizephy, tr(ji,jj,jk,jpphy,Kbb) ) 
     418         sizena(ji,jj,jk) = 1. + ( xsizern -1.0 ) * zcoef / ( xsizephy + zcoef ) 
    326419         ! N/P ratio of nanophytoplankton 
    327420         ! ------------------------------ 
    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) ) ) ) 
     421         zfuptk = 0.2 + 0.12 / ( 3.0 * sizen(ji,jj,jk) + rtrn ) 
     422         ! Computed from Inomura et al. (2020) using Pavlova Lutheri 
     423         zrpho  = 11.55 * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn ) 
     424         zrass = MAX(0.62/4., ( 1. - zrpho - zfuptk ) * xlimnpn(ji,jj,jk) ) 
     425         zrassn(ji,jj,jk) = zrass 
     426         xqpnmin(ji,jj,jk) = ( 0.0 + 0.0078 + 0.62/4. * 0.0783 ) * 16. 
     427         xqpnmax(ji,jj,jk) = ( zrpho * 0.0089 + zrass * 0.0783 ) * 16. 
     428         xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) + (0.033 + 0.0078 ) * 16. 
     429         xqpnmax(ji,jj,jk) = MIN( qpnmax, xqpnmax(ji,jj,jk) ) 
     430 
     431         ! Size estimation of picophytoplankton based on total biomass 
     432         ! Assumes that larger biomass implies addition of larger cells 
     433         ! ------------------------------------------------------------ 
     434         zcoef = tr(ji,jj,jk,jppic,Kbb) - MIN(xsizepic, tr(ji,jj,jk,jppic,Kbb) ) 
     435         sizepa(ji,jj,jk) = 1. + ( xsizerp -1.0 ) * zcoef / ( xsizepic + zcoef ) 
    339436 
    340437         ! N/P ratio of picophytoplankton 
    341438         ! ------------------------------ 
    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) ) ) ) 
     439         zfuptk = 0.2 + 0.12 / ( 0.8 * sizep(ji,jj,jk) + rtrn ) 
     440         ! Computed from Inomura et al. (2020) using a synechococcus 
     441         zrpho = 13.4 * tr(ji,jj,jk,jppch,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) * 12. + rtrn ) 
     442         zrass = MAX(0.4/4., ( 1. - zrpho - zfuptk ) * xlimnpp(ji,jj,jk) ) 
     443         zrassp(ji,jj,jk) = zrass 
     444         xqppmin(ji,jj,jk) = ( (0.0 + 0.0078 ) + 0.4/4. * 0.0517 ) * 16. 
     445         xqppmax(ji,jj,jk) = ( zrpho * 0.0076 + zrass * 0.0517 ) * 16. 
     446         xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) +  (0.033 + 0.0078 ) * 16 
     447         xqppmax(ji,jj,jk) = MIN( qppmax, xqppmax(ji,jj,jk) ) 
     448 
     449         ! Size estimation of diatoms based on total biomass 
     450         ! Assumes that larger biomass implies addition of larger cells 
     451         ! ------------------------------------------------------------ 
    353452         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  
     453         sizeda(ji,jj,jk) = 1. + ( xsizerd - 1.0 ) * zcoef / ( xsizedia + zcoef ) 
    356454         ! N/P ratio of diatoms 
    357455         ! -------------------- 
    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  
     456         zfuptk = 0.2 + 0.12 / ( 5.0 * sized(ji,jj,jk) + rtrn ) 
     457         ! Computed from Inomura et al. (2020) using a synechococcus 
     458         zrpho = 8.08 * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpndi,Kbb) * 12. + rtrn ) 
     459         zrass = MAX(0.66/4., ( 1. - zrpho - zfuptk ) * xlimnpd(ji,jj,jk) ) 
     460         zrassd(ji,jj,jk)=zrass 
     461         xqpdmin(ji,jj,jk) = ( ( 0.0 + 0.0078 ) + 0.66/4. * 0.0783 ) * 16. 
     462         xqpdmax(ji,jj,jk) = ( zrpho * 0.0135 + zrass * 0.0783 ) * 16. 
     463         xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) + ( 0.0078 + 0.033 ) * 16. 
     464         xqpdmax(ji,jj,jk) = MIN(qpdmax, xqpdmax(ji,jj,jk) ) 
    365465      END_3D 
    366466 
    367467      ! Compute the fraction of nanophytoplankton that is made of calcifiers 
     468      ! This is a purely adhoc formulation described in Aumont et al. (2015) 
     469      ! This fraction depends on nutrient limitation, light, temperature 
    368470      ! -------------------------------------------------------------------- 
    369471      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     
    372474         &        / ( tr(ji,jj,jk,jpnh4,Kbb) + concnnh4 ) ) 
    373475         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) ) 
     476         zlim3  = tr(ji,jj,jk,jpfer,Kbb) / ( tr(ji,jj,jk,jpfer,Kbb) +  6.E-11 )  
     477         ztem1  = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) + 1.8 ) 
    376478         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 )   & 
     479         zetot1 = MAX( 0., etot_ndcy(ji,jj,jk) - 1.) / ( 4. + etot_ndcy(ji,jj,jk) ) * 30. / ( 30. + etot_ndcy(ji,jj,jk) )  
     480 
     481         xfracal(ji,jj,jk) = caco3r * xlimphy(ji,jj,jk)     & 
     482         &                   * ztem1 / ( 0.1 + ztem1 ) * MAX( 1., tr(ji,jj,jk,jpphy,Kbb)*1E6 )   & 
    382483            &                * ( 1. + EXP(-ztem2 * ztem2 / 25. ) )         & 
    383484            &                * zetot1 * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) ) 
     
    390491            &                                / ( oxymin + tr(ji,jj,jk,jpoxy,Kbb) )  ) 
    391492         nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) ) 
     493         ! 
     494         ! redox factor computed from NO3 levels 
     495         nitrfac2(ji,jj,jk) = MAX( 0.e0,       ( 1.E-6 - tr(ji,jj,jk,jpno3,Kbb) )  & 
     496            &                                / ( 1.E-6 + tr(ji,jj,jk,jpno3,Kbb) ) ) 
     497         nitrfac2(ji,jj,jk) = MIN( 1., nitrfac2(ji,jj,jk) ) 
    392498      END_3D 
    393499      ! 
     
    403509        CALL iom_put( "SIZEP"  , sizep  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
    404510        CALL iom_put( "SIZED"  , sized  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     511        CALL iom_put( "RASSN"  , zrassn (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     512        CALL iom_put( "RASSP"  , zrassp (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
     513        CALL iom_put( "RASSD"  , zrassd (:,:,:) * tmask(:,:,:) )  ! Iron limitation term 
    405514      ENDIF 
    406515      ! 
     
    416525      !! ** Purpose :   Initialization of nutrient limitation parameters 
    417526      !! 
    418       !! ** Method  :   Read the nampislim and nampisquota namelists and check 
     527      !! ** Method  :   Read the namp5zlim and nampisquota namelists and check 
    419528      !!      the parameters called at the first timestep (nittrc000) 
    420529      !! 
    421       !! ** input   :   Namelist nampislim 
     530      !! ** input   :   Namelist namp5zlim 
    422531      !! 
    423532      !!---------------------------------------------------------------------- 
     
    436545      ! 
    437546      READ  ( numnatp_ref, namp5zlim, IOSTAT = ios, ERR = 901) 
    438 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in reference namelist' ) 
     547901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zlim in reference namelist' ) 
    439548      ! 
    440549      READ  ( numnatp_cfg, namp5zlim, IOSTAT = ios, ERR = 902 ) 
    441 902   IF( ios >  0 ) CALL ctl_nam ( ios , 'nampislim in configuration namelist' ) 
     550902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zlim in configuration namelist' ) 
    442551      IF(lwm) WRITE ( numonp, namp5zlim ) 
    443552      ! 
     
    505614      ENDIF 
    506615      ! 
    507       zpsino3 = 2.3 * rno3 
    508       zpsinh4 = 1.8 * rno3 
    509       zpsiuptk = 2.3 * rno3 
     616      ! Metabolic cost of nitrate and ammonium utilisation 
     617      zpsino3  = 2.3 * rno3 
     618      zpsinh4  = 1.8 * rno3 
     619      zpsiuptk = 1.0 / 6.625 
    510620      ! 
    511621      nitrfac(:,:,jpk) = 0._wp 
     
    537647         &      xpicopo4(jpi,jpj,jpk), xpicodop(jpi,jpj,jpk),       & 
    538648         &      xnanodop(jpi,jpj,jpk), xdiatdop(jpi,jpj,jpk),       & 
    539          &      xnanofer(jpi,jpj,jpk), xdiatfer(jpi,jpj,jpk),       & 
    540649         &      xpicofer(jpi,jpj,jpk), xlimpfe (jpi,jpj,jpk),       & 
    541650         &      fvnuptk (jpi,jpj,jpk), fvduptk (jpi,jpj,jpk),       & 
     651         &      xlimphys(jpi,jpj,jpk), xlimdias(jpi,jpj,jpk),       & 
     652         &      xlimnpp (jpi,jpj,jpk), xlimnpn (jpi,jpj,jpk),       & 
     653         &      xlimnpd (jpi,jpj,jpk),                              & 
     654         &      xlimpics(jpi,jpj,jpk), xqfuncfecp(jpi,jpj,jpk),     & 
    542655         &      fvpuptk (jpi,jpj,jpk), xlimpic (jpi,jpj,jpk),    STAT=ierr(1) ) 
    543656         ! 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p5zmeso.F90

    r13295 r14385  
    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 
     
    6169CONTAINS 
    6270 
    63    SUBROUTINE p5z_meso( kt, knt, Kbb, Krhs ) 
     71   SUBROUTINE p5z_meso( kt, knt, Kbb, Kmm, Krhs ) 
    6472      !!--------------------------------------------------------------------- 
    6573      !!                     ***  ROUTINE p5z_meso  *** 
    6674      !! 
    6775      !! ** Purpose :   Compute the sources/sinks for mesozooplankton 
    68       !! 
    69       !! ** Method  : - ??? 
     76      !!                This includes ingestion and assimilation, flux feeding 
     77      !!                and mortality. We use an active prey switching   
     78      !!                parameterization Morozov and Petrovskii (2013).  
     79      !!                All living compartments and mesozooplankton 
     80      !!                are potential preys of mesozooplankton as well as small 
     81      !!                sinking particles  
     82      !! 
    7083      !!--------------------------------------------------------------------- 
    7184      INTEGER, INTENT(in) ::   kt, knt    ! ocean time step 
    72       INTEGER, INTENT(in)  ::  Kbb, Krhs  ! time level indices 
    73       INTEGER  :: ji, jj, jk 
     85      INTEGER, INTENT(in)  ::  Kbb, Kmm, Krhs  ! time level indices 
     86      ! 
     87      INTEGER  :: ji, jj, jk, jkt 
    7488      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam, zcompames 
    75       REAL(wp) :: zgraze2, zdenom, zfact, zfood, zfoodlim, zproport 
     89      REAL(wp) :: zgraze2, zdenom, zfact, zfood, zfoodlim, zproport, zdep 
    7690      REAL(wp) :: zmortzgoc, zfracc, zfracn, zfracp, zfracfe, zratio, zratio2 
    77       REAL(wp) :: zepsherf, zepshert, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi 
     91      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi 
    7892      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 
     93      REAL(wp) :: zgradoct, zgradont, zgrareft, zgradopt 
     94      REAL(wp) :: zprcaca, zmortz, zexcess 
    8295      REAL(wp) :: zbeta, zrespz, ztortz, zgrasratp, zgrasratn, zgrasratf 
    8396      REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot 
     
    87100      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg 
    88101      REAL(wp) :: zgrazffnp, zgrazffng, zgrazffpp, zgrazffpg 
     102      REAL(wp) :: zmigreltime, zrum, zcodel, zargu, zval, zmigthick  
    89103      CHARACTER (len=25) :: charout 
    90       REAL(wp) :: zrfact2, zmetexcess 
    91       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2,  zz2ligprod 
     104      REAL(wp) :: zrfact2, zmetexcess, zsigma, zdiffdn 
     105      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2 
     106      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof 
     107      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarep, zgraren, zgrapon, zgrapop 
     108      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgradoc, zgradon, zgradop 
     109      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof 
     110      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrep, zgramigren, zgramigpop, zgramigpon 
     111      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigdoc, zgramigdop, zgramigdon 
     112       
    92113 
    93114      !!--------------------------------------------------------------------- 
     
    95116      IF( ln_timing )   CALL timing_start('p5z_meso') 
    96117      ! 
     118      ! Initialization of local arrays 
     119      zgrazing(:,:,:) = 0._wp  ;  zfezoo2(:,:,:) = 0._wp 
     120      zgrarem (:,:,:) = 0._wp  ;  zgraren(:,:,:) = 0._wp 
     121      zgrarep (:,:,:) = 0._wp  ;  zgraref(:,:,:) = 0._wp 
     122      zgrapoc (:,:,:) = 0._wp  ;  zgrapon(:,:,:) = 0._wp 
     123      zgrapop (:,:,:) = 0._wp  ;  zgrapof(:,:,:) = 0._wp 
     124      zgradoc (:,:,:) = 0._wp  ;  zgradon(:,:,:) = 0._wp 
     125      zgradop (:,:,:) = 0._wp    
     126      ! 
     127 
     128      ! 
     129      ! Diurnal vertical migration of mesozooplankton 
     130      ! Computation of the migration depth 
     131      ! --------------------------------------------- 
     132      IF( ln_dvm_meso ) CALL p5z_meso_depmig( Kbb, Kmm ) 
     133 
     134      ! Use of excess carbon for metabolism 
    97135      zmetexcess = 0.0 
    98136      IF ( bmetexc2 ) zmetexcess = 1.0 
     
    102140         zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam 
    103141 
    104          !   Michaelis-Menten mortality rates of mesozooplankton 
    105          !   --------------------------------------------------- 
     142         !  linear mortality of mesozooplankton 
     143         !  A michaelis menten modulation term is used to avoid extinction of  
     144         !  mesozooplankton at very low food concentrations 
     145         !  ----------------------------------------------------------------- 
    106146         zrespz   = resrat2 * zfact * ( tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) )  & 
    107147         &          + 3. * nitrfac(ji,jj,jk) ) 
    108148 
    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          !   --------------------------------------------------------------- 
     149         !  Zooplankton quadratic mortality. A square function has been selected with 
     150         !  to mimic predation and disease (density dependent mortality). It also tends 
     151         !  to stabilise the model 
     152         !  ------------------------------------------------------------------------- 
    112153         ztortz   = mzrat2 * 1.e6 * zfact * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk)) 
    113154 
     
    121162         zcompames = MAX( ( tr(ji,jj,jk,jpmes,Kbb) - xthresh2mes ), 0.e0 ) 
    122163 
    123          !   Mesozooplankton grazing 
    124          !   ------------------------ 
     164         !  Mesozooplankton grazing 
     165         ! The total amount of food is the sum of all preys accessible to mesozooplankton  
     166         ! multiplied by their food preference 
     167         ! A threshold can be specified in the namelist (xthresh2). However, when food  
     168         ! concentration is close to this threshold, it is decreased to avoid the  
     169         ! accumulation of food in the mesozoopelagic domain 
     170         ! ------------------------------------------------------------------------------- 
    125171         zfood     = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc   & 
    126172         &           + xpref2m * zcompames  
     
    129175         zgraze2   = grazrat2 * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk))  
    130176 
    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 
     177         ! An active switching parameterization is used here. 
     178         ! We don't use the KTW parameterization proposed by  
     179         ! Vallina et al. because it tends to produce too steady biomass 
     180         ! composition and the variance of Chl is too low as it grazes 
     181         ! too strongly on winning organisms. We use a generalized 
     182         ! switching parameterization proposed by Morozov and  
     183         ! Petrovskii (2013) 
     184         ! ------------------------------------------------------------   
     185         ! The width of the selection window is increased when preys 
     186         ! have low abundance, .i.e. zooplankton become less specific  
     187         ! to avoid starvation. 
     188         ! ---------------------------------------------------------- 
     189         zsigma = 1.0 - zdenom**3/(0.1**3+zdenom**3) 
     190         zsigma = xsigma2 + xsigma2del * zsigma 
     191         ! Nanophytoplankton and diatoms are the only preys considered 
     192         ! to be close enough to have potential interference 
     193         ! ----------------------------------------------------------- 
     194         zdiffdn = exp( -ABS(log(3.0 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2 ) 
     195         ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / (1.0 + zdiffdn) 
     196         ztmp2 = xpref2m * zcompames**2 
     197         ztmp3 = xpref2c * zcompapoc**2 
     198         ztmp4 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) / (1.0 + zdiffdn) 
     199         ztmp5 = xpref2z * zcompaz**2 
    144200         ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + ztmp5 + rtrn 
    145201         ztmp1 = ztmp1 / ztmptot 
     
    166222         zgrazpof  = zgrazpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn) 
    167223 
    168          !   Mesozooplankton flux feeding on GOC 
    169          !   ---------------------------------- 
     224         !  Mesozooplankton flux feeding on GOC and POC. The feeding pressure 
     225         ! is proportional to the flux 
     226         !  ------------------------------------------------------------------ 
    170227         zgrazffeg = grazflux  * xstep * wsbio4(ji,jj,jk)      & 
    171228         &           * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb)  & 
     
    183240         zgraztotc  = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg 
    184241 
    185          !   Compute the proportion of filter feeders 
    186          !   ----------------------------------------   
     242         ! Compute the proportion of filter feeders. It is assumed steady state. 
     243         ! ---------------------------------------------------------------------   
    187244         zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) 
    188245 
     
    200257         zfracp    = zfracc * tr(ji,jj,jk,jpgop,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn) 
    201258 
     259         ! Flux feeding is multiplied by the fractional biomass of flux feeders 
    202260         zgrazffep = zproport * zgrazffep   ;   zgrazffeg = zproport * zgrazffeg 
    203261         zgrazfffp = zproport * zgrazfffp   ;   zgrazfffg = zproport * zgrazfffg 
     
    206264 
    207265         zgraztotc  = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg 
    208          zgraztotf  = zgrazdf + zgraznf + ( zgrazz + zgrazm ) * ferat3 + zgrazpof & 
     266         zgraztotf  = zgrazdf + zgraznf + zgrazz * feratz + zgrazm * feratm + zgrazpof & 
    209267         &            + zgrazfffp + zgrazfffg 
    210268         zgraztotn  = zgrazdn + (zgrazm + zgrazz) * no3rat3 + zgraznn + zgrazpon  & 
     
    213271         &            + zgrazffpp + zgrazffpg 
    214272 
    215  
    216273         ! Total grazing ( grazing by microzoo is already computed in p5zmicro ) 
    217274         zgrazing(ji,jj,jk) = zgraztotc 
     
    223280         zgrasratp  =  (zgraztotp + rtrn) / ( zgraztotc + rtrn ) 
    224281 
    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) 
     282         ! Mesozooplankton efficiency.  
     283         ! We adopt a formulation proposed by Mitra et al. (2007) 
     284         ! The gross growth efficiency is controled by the most limiting nutrient. 
     285         ! Growth is also further decreased when the food quality is poor. This is currently 
     286         ! hard coded : it can be decreased by up to 50% (zepsherq) 
     287         ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and  
     288         ! Fulton, 2012) 
     289         ! ----------------------------------------------------------------------------------- 
     290         zepshert  = MIN( 1., zgrasratn/ no3rat3, zgrasratp/ po4rat3, zgrasratf / feratm) 
    229291         zbeta     = MAX(0., (epsher2 - epsher2min) ) 
    230292         zepsherf  = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) 
    231          zepsherv  = zepsherf * zepshert 
     293         zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) 
     294         zepsherv  = zepsherf * zepshert * zepsherq 
    232295 
    233296         !   Respiration of mesozooplankton 
    234297         !   Excess carbon in the food is used preferentially 
    235          !   ----------------  ------------------------------ 
     298         !   when bmetexc2 is set to .true. 
     299         !   ----------------------------------------------- 
    236300         zexcess  = zgraztotc * zepsherf * (1.0 - zepshert) * zmetexcess  
    237301         zbasresb = MAX(0., zrespz - zexcess) 
     
    246310         zexcess  = ( zgrasratp/ po4rat3 - zepshert ) / ( 1.0 - zepshert + rtrn) 
    247311         zbasresp = zbasresi * zexcess * zgrasratp 
    248          zexcess  = ( zgrasratf/ ferat3 - zepshert ) / ( 1.0 - zepshert + rtrn) 
     312         zexcess  = ( zgrasratf/ feratm - zepshert ) / ( 1.0 - zepshert + rtrn) 
    249313         zbasresf = zbasresi * zexcess * zgrasratf 
    250314 
     
    254318         zgradont = (1. - unass2n) * zgraztotn - zepsherv * no3rat3 * zgraztotc - zbasresn 
    255319         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 
     320         zgrareft = (1. - unass2c) * zgraztotf - zepsherv * feratm * zgraztotc - zbasresf 
     321         ztmp1    = (1. - epsher2 - unass2c) /( 1. - epsher2 ) * ztortz 
     322 
     323         zgradoc(ji,jj,jk) = (zgradoct + ztmp1) * ssigma2 
     324         zgradon(ji,jj,jk) = (zgradont + no3rat3 * ztmp1) * ssigma2 
     325         zgradop(ji,jj,jk) = (zgradopt + po4rat3 * ztmp1) * ssigma2 
     326 
    262327 
    263328         !  Since only semilabile DOM is represented in PISCES 
     
    265330         !  as dissolved inorganic compounds (ssigma2) 
    266331         !  -------------------------------------------------- 
    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 ) 
     332         zgrarem(ji,jj,jk) = ( zgradoct + ztmp1 ) * (1.0 - ssigma2) 
     333         zgraren(ji,jj,jk) = ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2) 
     334         zgrarep(ji,jj,jk) = ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2) 
     335         zgraref(ji,jj,jk) = zgrareft + feratm * ztmp1 
    271336 
    272337         !   Defecation as a result of non assimilated products 
    273338         !   -------------------------------------------------- 
    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 
     339         zgrapoc(ji,jj,jk)  = zgraztotc * unass2c + unass2c / ( 1. - epsher2 ) * ztortz 
     340         zgrapon(ji,jj,jk)  = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - epsher2 ) * ztortz 
     341         zgrapop(ji,jj,jk)  = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - epsher2 ) * ztortz 
     342         zgrapof(ji,jj,jk)  = zgraztotf * unass2c + feratm  * unass2c / ( 1. - epsher2 ) * ztortz 
    278343 
    279344         !  Addition of respiration to the release of inorganic nutrients 
    280345         !  ------------------------------------------------------------- 
    281          zgrarem = zgrarem + zbasresi + zrespirc 
    282          zgraren = zgraren + zbasresn + zrespirc * no3rat3 
    283          zgrarep = zgrarep + zbasresp + zrespirc * po4rat3 
    284          zgraref = zgraref + zbasresf + zrespirc * ferat3 
     346         zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) + zbasresi + zrespirc 
     347         zgraren(ji,jj,jk) = zgraren(ji,jj,jk) + zbasresn + zrespirc * no3rat3 
     348         zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) + zbasresp + zrespirc * po4rat3 
     349         zgraref(ji,jj,jk) = zgraref(ji,jj,jk) + zbasresf + zrespirc * feratm 
     350          
    285351 
    286352         !   Update the arrays TRA which contain the biological sources and 
    287353         !   sinks 
    288354         !   -------------------------------------------------------------- 
    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 
    305355         tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) + zepsherv * zgraztotc - zrespirc   & 
    306356         &                     - ztortz - zgrazm 
     
    324374         tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zgrazpon - zgrazffnp + zfracn 
    325375         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 
     376         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zgrazffeg - zfracc 
    328377         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 
     378         tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) - zgrazffng - zfracn 
     379         tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) - zgrazffpg - zfracp 
    331380         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 
     381         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zgrazfffg - zfracfe 
    333382         zfracal = tr(ji,jj,jk,jpcal,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) 
    334383         zgrazcal = zgrazffeg * (1. - part2) * zfracal 
    335384 
    336          !  calcite production 
    337          !  ------------------ 
     385         ! Calcite production 
     386         ! Calcite remineralization due to zooplankton activity 
     387         ! part2 of the ingested calcite is dissolving in the acidic gut 
     388         ! ------------------------------------------------------------- 
    338389         zprcaca = xfracal(ji,jj,jk) * zgraznc 
    339390         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 
     
    343394         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - zgrazcal + zprcaca 
    344395      END_3D 
     396 
     397 
     398      ! Computation of the effect of DVM by mesozooplankton 
     399      ! This part is only activated if ln_dvm_meso is set to true 
     400      ! The parameterization has been published in Gorgues et al. (2019). 
     401      ! ----------------------------------------------------------------- 
     402      IF( ln_dvm_meso ) THEN 
     403          ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) ) 
     404          ALLOCATE( zgramigrep(jpi,jpj), zgramigren(jpi,jpj), zgramigpop(jpi,jpj), zgramigpon(jpi,jpj) ) 
     405          ALLOCATE( zgramigdoc(jpi,jpj), zgramigdon(jpi,jpj), zgramigdop(jpi,jpj) ) 
     406          zgramigrem(:,:)  = 0.0   ;   zgramigref(:,:) = 0.0 
     407          zgramigrep(:,:)  = 0.0   ;   zgramigren(:,:) = 0.0 
     408          zgramigpoc(:,:)  = 0.0   ;   zgramigpof(:,:) = 0.0 
     409          zgramigpop(:,:)  = 0.0   ;   zgramigpon(:,:) = 0.0 
     410          zgramigdoc(:,:)  = 0.0   ;   zgramigdon(:,:) = 0.0 
     411          zgramigdop(:,:)  = 0.0    
     412                  
     413          ! Compute the amount of materials that will go into vertical migration 
     414          ! This fraction is sumed over the euphotic zone and is removed from  
     415          ! the fluxes driven by mesozooplankton in the euphotic zone. 
     416          ! -------------------------------------------------------------------- 
     417          DO_3D( 1, 1, 1, 1, 1, jpkm1 )         
     418             zmigreltime = (1. - strn(ji,jj)) 
     419             IF( gdept(ji,jj,jk,Kmm) <= heup(ji,jj) ) THEN 
     420                zmigthick  = e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * ( 1. - zmigreltime )  
     421                zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * zmigthick   
     422                zgramigrep(ji,jj) = zgramigrep(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * zmigthick 
     423                zgramigren(ji,jj) = zgramigren(ji,jj) + xfracmig * zgraren(ji,jj,jk) * zmigthick 
     424                zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * zmigthick 
     425                zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * zmigthick 
     426                zgramigpop(ji,jj) = zgramigpop(ji,jj) + xfracmig * zgrapop(ji,jj,jk) * zmigthick 
     427                zgramigpon(ji,jj) = zgramigpon(ji,jj) + xfracmig * zgrapon(ji,jj,jk) * zmigthick 
     428                zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * zmigthick 
     429                zgramigdoc(ji,jj) = zgramigdoc(ji,jj) + xfracmig * zgradoc(ji,jj,jk) * zmigthick 
     430                zgramigdop(ji,jj) = zgramigdop(ji,jj) + xfracmig * zgradop(ji,jj,jk) * zmigthick 
     431                zgramigdon(ji,jj) = zgramigdon(ji,jj) + xfracmig * zgradon(ji,jj,jk) * zmigthick 
     432 
     433                zgrarem(ji,jj,jk)  = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     434                zgrarep(ji,jj,jk)  = zgrarep(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     435                zgraren(ji,jj,jk)  = zgraren(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     436                zgraref(ji,jj,jk)  = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     437                zgrapoc(ji,jj,jk)  = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     438                zgrapop(ji,jj,jk)  = zgrapop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     439                zgrapon(ji,jj,jk)  = zgrapon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     440                zgrapof(ji,jj,jk)  = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     441                zgradoc(ji,jj,jk)  = zgradoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     442                zgradop(ji,jj,jk)  = zgradop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     443                zgradon(ji,jj,jk)  = zgradon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     444             ENDIF 
     445          END_3D 
     446 
     447          ! The inorganic and organic fluxes induced by migrating organisms are added at the  
     448          ! the migration depth (corresponding indice is set by kmig) 
     449          ! -------------------------------------------------------------------------------- 
     450          DO_2D( 1, 1, 1, 1 ) 
     451             IF( tmask(ji,jj,1) == 1. ) THEN 
     452                 jkt = kmig(ji,jj) 
     453                 zdep = 1. / e3t(ji,jj,jkt,Kmm) 
     454                 zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) * zdep  
     455                 zgrarep(ji,jj,jkt) = zgrarep(ji,jj,jkt) + zgramigrep(ji,jj) * zdep  
     456                 zgraren(ji,jj,jkt) = zgraren(ji,jj,jkt) + zgramigren(ji,jj) * zdep  
     457                 zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) * zdep  
     458                 zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) * zdep  
     459                 zgrapop(ji,jj,jkt) = zgrapop(ji,jj,jkt) + zgramigpop(ji,jj) * zdep  
     460                 zgrapon(ji,jj,jkt) = zgrapon(ji,jj,jkt) + zgramigpon(ji,jj) * zdep  
     461                 zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) * zdep  
     462                 zgradoc(ji,jj,jkt) = zgradoc(ji,jj,jkt) + zgramigdoc(ji,jj) * zdep 
     463                 zgradop(ji,jj,jkt) = zgradop(ji,jj,jkt) + zgramigdop(ji,jj) * zdep  
     464                 zgradon(ji,jj,jkt) = zgradon(ji,jj,jkt) + zgramigdon(ji,jj) * zdep  
     465              ENDIF 
     466          END_2D 
     467                   ! 
     468          ! Deallocate temporary variables 
     469          ! ------------------------------ 
     470          DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof ) 
     471          DEALLOCATE( zgramigrep, zgramigren, zgramigpop, zgramigpon ) 
     472          DEALLOCATE( zgramigdoc, zgramigdon, zgramigdop ) 
     473         ! End of the ln_dvm_meso part 
     474      ENDIF 
     475 
     476        !   Update the arrays TRA which contain the biological sources and sinks 
     477        !   This only concerns the variables which are affected by DVM (inorganic  
     478        !   nutrients, DOC agands, and particulate organic carbon).  
     479        !   --------------------------------------------------------------------- 
     480      DO_3D( 1, 1, 1, 1, 1, jpkm1 )         
     481         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarep(ji,jj,jk)  
     482         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgraren(ji,jj,jk) 
     483         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgradoc(ji,jj,jk) 
     484         ! 
     485         IF( ln_ligand ) & 
     486           &  tr(ji,jj,jk,jplgw,Krhs)  = tr(ji,jj,jk,jplgw,Krhs) + zgradoc(ji,jj,jk) * ldocz 
     487         ! 
     488         tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zgradon(ji,jj,jk) 
     489         tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zgradop(ji,jj,jk) 
     490         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem(ji,jj,jk) 
     491         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref(ji,jj,jk) 
     492         zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk) 
     493         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem(ji,jj,jk) 
     494         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgraren(ji,jj,jk)                       
     495         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zgrapoc(ji,jj,jk) 
     496         prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk) + zgrapoc(ji,jj,jk) 
     497         tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) + zgrapon(ji,jj,jk) 
     498         tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + zgrapop(ji,jj,jk) 
     499         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zgrapof(ji,jj,jk) 
     500      END_3D 
    345501      ! 
    346502      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 
     503         CALL iom_put( "PCAL"  , prodcal(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  !  Calcite production  
     504         CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) ! Total grazing of phyto by zoo 
     505         CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 
     506         IF( ln_ligand ) & 
     507           & CALL iom_put( "LPRODZ2", zgradoc(:,:,:) * ldocz * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  ) 
    357508      ENDIF 
    358509      ! 
     
    374525      !! ** Purpose :   Initialization of mesozooplankton parameters 
    375526      !! 
    376       !! ** Method  :   Read the nampismes namelist and check the parameters 
     527      !! ** Method  :   Read the namp5zmes namelist and check the parameters 
    377528      !!      called at the first timestep (nittrc000) 
    378529      !! 
    379       !! ** input   :   Namelist nampismes 
     530      !! ** input   :   Namelist namp5zmes 
    380531      !! 
    381532      !!---------------------------------------------------------------------- 
    382       INTEGER :: ios                 ! Local integer output status for namelist read 
     533      INTEGER :: ios    ! Local integer output status for namelist read 
    383534      !! 
    384535      NAMELIST/namp5zmes/part2, bmetexc2, grazrat2, resrat2, mzrat2, xpref2c, xpref2n, xpref2z, & 
    385536         &                xpref2m, xpref2d, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & 
    386537         &                xthresh2mes, xthresh2, xkgraz2, epsher2, epsher2min, ssigma2, unass2c, & 
    387          &                unass2n, unass2p, srespir2, grazflux 
     538         &                unass2n, unass2p, srespir2, xsigma2, xsigma2del, grazflux, ln_dvm_meso, xfracmig 
    388539      !!---------------------------------------------------------------------- 
    389540      ! 
    390541      READ  ( numnatp_ref, namp5zmes, IOSTAT = ios, ERR = 901) 
    391 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismes in reference namelist' ) 
     542901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zmes in reference namelist' ) 
    392543      ! 
    393544      READ  ( numnatp_cfg, namp5zmes, IOSTAT = ios, ERR = 902 ) 
    394 902   IF( ios >  0 ) CALL ctl_nam ( ios , 'nampismes in configuration namelist' ) 
     545902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zmes in configuration namelist' ) 
    395546      IF(lwm) WRITE ( numonp, namp5zmes ) 
    396547      ! 
     
    424575         WRITE(numout,*) '    half sturation constant for grazing 2          xkgraz2     = ', xkgraz2 
    425576         WRITE(numout,*) '    Use excess carbon for respiration              bmetexc2    = ', bmetexc2 
     577         WRITE(numout,*) '      Width of the grazing window                     xsigma2     =', xsigma2 
     578         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigma2del  =', xsigma2del 
     579         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso 
     580         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig 
    426581      ENDIF 
    427582      ! 
    428583   END SUBROUTINE p5z_meso_init 
     584 
     585   SUBROUTINE p5z_meso_depmig( Kbb, Kmm ) 
     586      !!---------------------------------------------------------------------- 
     587      !!                  ***  ROUTINE p4z_meso_depmig  *** 
     588      !! 
     589      !! ** Purpose :   Computation the migration depth of mesozooplankton 
     590      !! 
     591      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen 
     592      !!      temperature and chlorophylle following the parameterization 
     593      !!      proposed by Bianchi et al. (2013) 
     594      !!---------------------------------------------------------------------- 
     595      INTEGER, INTENT(in)  ::  Kbb, kmm ! time level indices 
     596      ! 
     597      INTEGER  :: ji, jj, jk 
     598      ! 
     599      REAL(wp) :: ztotchl, z1dep 
     600      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy 
     601 
     602      !!--------------------------------------------------------------------- 
     603      ! 
     604      IF( ln_timing == 1 )  CALL timing_start('p5z_meso_zdepmig') 
     605      ! 
     606      oxymoy(:,:)  = 0. 
     607      tempmoy(:,:) = 0. 
     608      zdepmoy(:,:) = 0. 
     609      depmig (:,:) = 5. 
     610      kmig   (:,:) = 1 
     611      ! 
     612 
     613      ! Compute the averaged values of oxygen, temperature over the domain  
     614      ! 150m to 500 m depth. 
     615      ! ------------------------------------------------------------------ 
     616      DO_3D( 1, 1, 1, 1, 1, jpk ) 
     617         IF( tmask(ji,jj,jk) == 1.) THEN 
     618            IF( gdept(ji,jj,jk,Kmm) >= 150. .AND. gdept(ji,jj,jk,kmm) <= 500.) THEN 
     619               oxymoy(ji,jj)  = oxymoy(ji,jj)  + tr(ji,jj,jk,jpoxy,Kbb) * 1E6 * e3t(ji,jj,jk,Kmm) 
     620               tempmoy(ji,jj) = tempmoy(ji,jj) + ts(ji,jj,jk,jp_tem,kmm)      * e3t(ji,jj,jk,kmm) 
     621               zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t(ji,jj,jk,Kmm) 
     622            ENDIF 
     623         ENDIF 
     624      END_3D 
     625 
     626      ! Compute the difference between surface values and the mean values in the mesopelagic 
     627      ! domain 
     628      ! ------------------------------------------------------------------------------------ 
     629      DO_2D( 1, 1, 1, 1 ) 
     630         z1dep = 1. / ( zdepmoy(ji,jj) + rtrn ) 
     631         oxymoy(ji,jj)  = tr(ji,jj,1,jpoxy,Kbb) * 1E6 - oxymoy(ji,jj)  * z1dep 
     632         tempmoy(ji,jj) = ts(ji,jj,1,jp_tem,Kmm)      - tempmoy(ji,jj) * z1dep 
     633      END_2D 
     634      ! 
     635      ! Computation of the migration depth based on the parameterization of  
     636      ! Bianchi et al. (2013) 
     637      ! ------------------------------------------------------------------- 
     638      DO_2D( 1, 1, 1, 1 ) 
     639         IF( tmask(ji,jj,1) == 1. ) THEN 
     640            ztotchl = ( tr(ji,jj,1,jppch,Kbb) + tr(ji,jj,1,jpnch,Kbb) + tr(ji,jj,1,jpdch,Kbb) ) * 1E6 
     641            depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(ztotchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj) 
     642         ENDIF 
     643      END_2D 
     644 
     645            ! Computation of the corresponding jk indice  
     646      ! ------------------------------------------ 
     647      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     648         IF( depmig(ji,jj) >= gdepw(ji,jj,jk,Kmm) .AND. depmig(ji,jj) < gdepw(ji,jj,jk+1,Kmm) ) THEN 
     649             kmig(ji,jj) = jk 
     650          ENDIF 
     651      END_3D 
     652      ! 
     653      ! Correction of the migration depth and indice based on O2 levels 
     654      ! If O2 is too low, imposing a migration depth at this low O2 levels 
     655      ! would lead to negative O2 concentrations (respiration while O2 is close 
     656      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so 
     657      ! that it falls above the OMZ 
     658      ! ----------------------------------------------------------------------- 
     659      DO_2D( 1, 1, 1, 1 ) 
     660         IF( tr(ji,jj,kmig(ji,jj),jpoxy,Kbb) < 5E-6 ) THEN 
     661            DO jk = kmig(ji,jj),1,-1 
     662               IF( tr(ji,jj,jk,jpoxy,Kbb) >= 5E-6 .AND. tr(ji,jj,jk+1,jpoxy,Kbb)  < 5E-6) THEN 
     663                  kmig(ji,jj) = jk 
     664                  depmig(ji,jj) = gdept(ji,jj,jk,Kmm) 
     665               ENDIF 
     666            END DO 
     667         ENDIF 
     668      END_2D 
     669      ! 
     670      IF( ln_timing )   CALL timing_stop('p5z_meso_depmig') 
     671      ! 
     672   END SUBROUTINE p5z_meso_depmig 
     673 
     674   INTEGER FUNCTION p5z_meso_alloc() 
     675      !!---------------------------------------------------------------------- 
     676      !!                     ***  ROUTINE p5z_meso_alloc  *** 
     677      !!---------------------------------------------------------------------- 
     678      ! 
     679      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p5z_meso_alloc  ) 
     680      ! 
     681      IF( p5z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_meso_alloc : failed to allocate arrays.' ) 
     682      ! 
     683   END FUNCTION p5z_meso_alloc 
    429684 
    430685   !!====================================================================== 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p5zmicro.F90

    r13295 r14385  
    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/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p5zmort.F90

    r13295 r14385  
    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( 1, 1, 1, 1, 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( 1, 1, 1, 1, 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/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p5zprod.F90

    r13295 r14385  
    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( 1, 1, 1, 1 ) 
    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 
     116      zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp 
     117      consfe3 (:,:,:) = 0._wp 
     118 
     119      ! Computation of the optimal production rates and nutrient uptake 
     120      ! rates. Based on a Q10 description of the thermal dependency. 
     121      zprnut (:,:,:) =  0.8_wp * r1_rday * tgfunc(:,:,:) 
     122      zprmaxn(:,:,:) =  0.8_wp * (1. + zpsino3 * qnnmax ) * r1_rday * tgfunc(:,:,:) 
     123      zprmaxd(:,:,:) =  0.8_wp * (1. + zpsino3 * qndmax ) * r1_rday * tgfunc(:,:,:) 
     124      zprmaxp(:,:,:) =  0.6_wp * (1. + zpsino3 * qnpmax ) * r1_rday * tgfunc(:,:,:) 
     125 
     126      ! Impact of the day duration and light intermittency on phytoplankton growth 
     127      ! Intermittency is supposed to have a similar effect on production as  
     128      ! day length (Shatwell et al., 2012). The correcting factor is zmxl_fac.  
     129      ! zmxl_chl is the fractional day length and is used to compute the mean 
     130      ! PAR during daytime. The effect of mixing is computed using the  
     131      ! absolute light level definition of the euphotic zone 
     132      ! -------------------------------------------------------------------------  
    134133      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    135134         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    136             zval = MAX( 1., zstrn(ji,jj) ) 
     135            zval = MAX( 1., strn(ji,jj) ) 
    137136            IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN 
    138137               zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) 
    139138            ENDIF 
    140139            zmxl_chl(ji,jj,jk) = zval / 24. 
    141             zmxl_fac(ji,jj,jk) = 1.5 * zval / ( 12. + zval ) 
     140            zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval ) 
    142141         ENDIF 
    143142      END_3D 
     
    147146      zprpic(:,:,:) = zprmaxp(:,:,:) * zmxl_fac(:,:,:) 
    148147 
    149  
    150148      ! Maximum light intensity 
    151       zdaylen(:,:) = MAX(1., zstrn(:,:)) / 24. 
    152       WHERE( zstrn(:,:) < 1.e0 ) zstrn(:,:) = 24. 
    153  
     149      zdaylen(:,:) = MAX(1., strn(:,:)) / 24. 
     150 
     151      ! Computation of the P-I slope for nanos, picos and diatoms 
     152      ! The formulation proposed by Geider et al. (1997) has been used. 
    154153      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    155154         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     
    158157            zadap       = xadap * ztn / ( 2.+ ztn ) 
    159158            ! 
     159            ! Nanophytoplankton 
    160160            zpislopeadn(ji,jj,jk) = pislopen * tr(ji,jj,jk,jpnch,Kbb)    & 
    161161            &                       /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn) 
     162 
     163            ! Picophytoplankton 
    162164            zpislopeadp(ji,jj,jk) = pislopep * ( 1. + zadap * EXP( -0.25 * epico(ji,jj,jk) ) )   & 
    163165            &                       * tr(ji,jj,jk,jppch,Kbb) /( tr(ji,jj,jk,jppic,Kbb) * 12. + rtrn) 
     166 
     167            ! Diatoms 
    164168            zpislopeadd(ji,jj,jk) = pisloped * tr(ji,jj,jk,jpdch,Kbb)    & 
    165169               &                    /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn) 
     
    170174 
    171175            ! Computation of production function for Carbon 
     176            ! Actual light levels are used here  
    172177            !  --------------------------------------------- 
    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             !  ------------------------------------------------- 
     178            zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) / zmxl_fac(ji,jj,jk) )  ) 
     179            zprpic(ji,jj,jk) = zprpic(ji,jj,jk) * ( 1.- EXP( -zpislopep * epico(ji,jj,jk) / zmxl_fac(ji,jj,jk) )  ) 
     180            zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) / zmxl_fac(ji,jj,jk) )  ) 
     181 
     182            !  Computation of production function for Chlorophyll 
     183            !  Mean light level in the mixed layer (when appropriate) 
     184            !  is used here (acclimation is in general slower than  
     185            !  the characteristic time scales of vertical mixing) 
     186            !  ------------------------------------------------------ 
    179187            zpislopen = zpislopen * zmxl_fac(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    180188            zpisloped = zpisloped * zmxl_fac(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
     
    187195 
    188196      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    189  
    190197          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) 
     198            ! Si/C of diatoms 
     199            ! ------------------------ 
     200            ! Si/C increases with iron stress and silicate availability (zsilfac) 
     201            ! Si/C is arbitrariliy increased for very high Si concentrations 
     202            ! to mimic the very high ratios observed in the Southern Ocean (zsilfac2) 
     203            ! A parameterization derived from Flynn (2003) is used for the control 
     204            ! when Si is not limiting which is similar to the parameterisation 
     205            ! proposed by Gurney and Davidson (1999). 
     206            ! ----------------------------------------------------------------------- 
    196207            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 
     208            zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) 
    199209            zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) 
    200210            IF (gphit(ji,jj) < -30 ) THEN 
    201               zsilfac2 = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 ) 
     211              zsilfac2 = 1. + 1. * zsiborn / ( zsiborn + xksi2**3 ) 
    202212            ELSE 
    203               zsilfac2 = 1. +      zsiborn / ( zsiborn + xksi2**3 ) 
     213              zsilfac2 = 1. 
    204214            ENDIF 
    205             zysopt(ji,jj,jk) = grosip * zlim * zsilfac * zsilfac2 
    206         ENDIF 
    207       END_3D 
    208  
    209       !  Sea-ice effect on production                                                                                
     215            zratiosi = 1.0 - tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) / ( zsilfac2 * grosip * 3.0 + rtrn ) 
     216            zratiosi = MAX(0., MIN(1.0, zratiosi) ) 
     217            zmaxsi  = (1.0 + 0.1**4) * zratiosi**4 / ( zratiosi**4 + 0.1**4 ) 
     218            IF ( xlimsi(ji,jj,jk) /= xlimdia(ji,jj,jk) ) THEN 
     219               zysopt(ji,jj,jk) = zlim * zsilfac2 * grosip * 1.0 * zmaxsi 
     220            ELSE 
     221               zysopt(ji,jj,jk) = zlim * zsilfac2 * grosip * 1.0 * zsilim**0.7 * zmaxsi 
     222            ENDIF 
     223         ENDIF 
     224      END_3D 
     225 
     226      !  Sea-ice effect on production 
     227      ! No production is assumed below sea ice 
     228      ! --------------------------------------  
    210229      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    211230         zprbio(ji,jj,jk)  = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) 
     
    215234      END_3D 
    216235 
    217       ! Computation of the various production terms of nanophytoplankton  
     236      ! Computation of the various production and uptake terms of nanophytoplankton  
     237      ! Interactions between N and P are modeled according to the Chain Model  
     238      ! of Pahlow et al. (2009). Iron uptake is modeled following traditional 
     239      ! Droop kinetics. When the quota is approaching the maximum achievable 
     240      ! quota, uptake is downregulated according to a sigmoidal function  
     241      ! (power 2), as proposed by Flynn (2003) 
     242      ! --------------------------------------------------------------------------- 
    218243      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    219244         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    220245            !  production terms for nanophyto. 
    221246            zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2 
    222             ! 
     247 
     248            ! Size computation 
     249            ! Size is made a function of the limitation of of phytoplankton growth 
     250            ! Strongly limited cells are supposed to be smaller. sizena is the  
     251            ! size at time step t+1 and is thus updated at the end of the  
     252            ! current time step 
     253            ! -------------------------------------------------------------------- 
     254            zlimfac = xlimphys(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn ) 
     255            zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     256            sizena(ji,jj,jk) = MIN(xsizern, MAX( sizena(ji,jj,jk), zsizetmp ) ) 
     257            ! Maximum potential uptake rate 
    223258            zration = tr(ji,jj,jk,jpnph,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 
    224259            zratiop = tr(ji,jj,jk,jppph,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 
     
    226261            zprnutmax = zprnut(ji,jj,jk) * fvnuptk(ji,jj,jk) / rno3 * tr(ji,jj,jk,jpphy,Kbb) * rfact2 
    227262            ! 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)) 
     263            zratio = 1.0 - MIN( 1., zration / (xqnnmax(ji,jj,jk) + rtrn) ) 
     264            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
    230265            zpronmax = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpnmin(ji,jj,jk) )   & 
    231266            &          / ( 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) 
     267            zpronmax = zpronmax * xqnnmin(ji,jj,jk) / qnnmin 
     268            zpronewn(ji,jj,jk) = zpronmax * xnanono3(ji,jj,jk) 
    233269            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)) 
     270            ! Uptake of phosphorus and DOP 
     271            zratio = 1.0 - MIN( 1., zratiop / (xqpnmax(ji,jj,jk) + rtrn) ) 
     272            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
    237273            zpropmax = zprnutmax * zmax * xlimnfe(ji,jj,jk) 
    238274            zpropo4n(ji,jj,jk) = zpropmax * xnanopo4(ji,jj,jk) 
    239275            zprodopn(ji,jj,jk) = zpropmax * xnanodop(ji,jj,jk) 
    240276            ! 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  & 
     277            zqfnmax = xqfuncfecn(ji,jj,jk) + ( qfnmax - xqfuncfecn(ji,jj,jk) ) * xlimnpn(ji,jj,jk) 
     278            zratio = 1.0 - MIN( 1., zratiof / zqfnmax ) 
     279            zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) ) 
     280            zprofmax = zprnutmax * zqfnmax * zmax  
     281            zprofen(ji,jj,jk) = zprofmax * xnanofer(ji,jj,jk)    & 
     282            &          * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn  & 
    246283            &          + xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) ) 
    247284         ENDIF 
    248285      END_3D 
    249286 
    250       ! Computation of the various production terms of picophytoplankton  
     287      ! Computation of the various production and uptake terms of picophytoplankton  
     288      ! Interactions between N and P are modeled according to the Chain Model  
     289      ! of Pahlow et al. (2009). Iron uptake is modeled following traditional 
     290      ! Droop kinetics. When the quota is approaching the maximum achievable 
     291      ! quota, uptake is downregulated according to a sigmoidal function  
     292      ! (power 2), as proposed by Flynn (2003) 
     293      ! --------------------------------------------------------------------------- 
    251294      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    252295         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    253296            !  production terms for picophyto. 
    254297            zprorcap(ji,jj,jk) = zprpic(ji,jj,jk)  * xlimpic(ji,jj,jk) * tr(ji,jj,jk,jppic,Kbb) * rfact2 
    255             ! 
     298            ! Size computation 
     299            ! Size is made a function of the limitation of of phytoplankton growth 
     300            ! Strongly limited cells are supposed to be smaller. sizepa is 
     301            ! size at time step t+1 and is thus updated at the end of the  
     302            ! current time step 
     303            ! -------------------------------------------------------------------- 
     304            zlimfac = zprchlp(ji,jj,jk)  * xlimpics(ji,jj,jk) / ( zprmaxp(ji,jj,jk) + rtrn ) 
     305            zsizetmp = 1.0 + 1.3 * ( xsizerp - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     306            sizepa(ji,jj,jk) = min(xsizerp, max( sizepa(ji,jj,jk), zsizetmp ) ) 
     307            ! Maximum potential uptake rate of nutrients 
    256308            zration = tr(ji,jj,jk,jpnpi,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) + rtrn ) 
    257309            zratiop = tr(ji,jj,jk,jpppi,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) + rtrn ) 
     
    259311            zprnutmax = zprnut(ji,jj,jk) * fvpuptk(ji,jj,jk) / rno3 * tr(ji,jj,jk,jppic,Kbb) * rfact2 
    260312            ! 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)) 
     313            zratio = 1.0 - MIN( 1., zration / (xqnpmax(ji,jj,jk) + rtrn) ) 
     314            zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) ) 
    263315            zpronmax = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqppmin(ji,jj,jk) )   & 
    264316            &          / ( 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)  
     317            zpronmax = zpronmax * xqnpmin(ji,jj,jk) / qnnmin 
     318            zpronewp(ji,jj,jk) = zpronmax * xpicono3(ji,jj,jk)  
    266319            zproregp(ji,jj,jk) = zpronmax * xpiconh4(ji,jj,jk) 
    267320            ! 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) 
     321            zratio = 1.0 - MIN( 1., zratiop / (xqppmax(ji,jj,jk) + rtrn) ) 
     322            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
     323            zpropmax = zprnutmax * zmax * xlimpfe(ji,jj,jk)  
    271324            zpropo4p(ji,jj,jk) = zpropmax * xpicopo4(ji,jj,jk) 
    272325            zprodopp(ji,jj,jk) = zpropmax * xpicodop(ji,jj,jk) 
    273326            ! 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   & 
     327            zqfpmax = xqfuncfecp(ji,jj,jk) + ( qfpmax - xqfuncfecp(ji,jj,jk) ) * xlimnpp(ji,jj,jk) 
     328            zratio = 1.0 - MIN( 1., zratiof / zqfpmax ) 
     329            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
     330            zprofmax = zprnutmax * zqfpmax * zmax 
     331            zprofep(ji,jj,jk) = zprofmax * xpicofer(ji,jj,jk)  & 
     332            &          * (1. + 0.8 * xpicono3(ji,jj,jk) / ( rtrn   & 
    279333            &          + xpicono3(ji,jj,jk) + xpiconh4(ji,jj,jk) ) * (1. - xpicofer(ji,jj,jk) ) ) 
    280334         ENDIF 
    281335      END_3D 
    282336 
    283       ! Computation of the various production terms of diatoms 
     337      ! Computation of the various production and uptake terms of diatoms 
     338      ! Interactions between N and P are modeled according to the Chain Model  
     339      ! of Pahlow et al. (2009). Iron uptake is modeled following traditional 
     340      ! Droop kinetics. When the quota is approaching the maximum achievable 
     341      ! quota, uptake is downregulated according to a sigmoidal function  
     342      ! (power 2), as proposed by Flynn (2003) 
     343      ! --------------------------------------------------------------------------- 
    284344      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    285345         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
    286346            !  production terms for diatomees 
    287347            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             ! 
     348            ! Size computation 
     349            ! Size is made a function of the limitation of of phytoplankton growth 
     350            ! Strongly limited cells are supposed to be smaller. sizeda is 
     351            ! size at time step t+1 and is thus updated at the end of the  
     352            ! current time step.  
     353            ! -------------------------------------------------------------------- 
     354            zlimfac = zprchld(ji,jj,jk) * xlimdias(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) 
     355            zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) 
     356            sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) ) 
     357            ! Maximum potential uptake rate of nutrients 
    291358            zration = tr(ji,jj,jk,jpndi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
    292359            zratiop = tr(ji,jj,jk,jppdi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 
     
    294361            zprnutmax = zprnut(ji,jj,jk) * fvduptk(ji,jj,jk) / rno3 * tr(ji,jj,jk,jpdia,Kbb) * rfact2 
    295362            ! 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))  
     363            zratio = 1.0 - MIN( 1., zration / (xqndmax(ji,jj,jk) + rtrn) ) 
     364            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
    298365            zpronmax = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpdmin(ji,jj,jk) )   & 
    299366            &          / ( 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) 
     367            zpronmax = zpronmax * xqndmin(ji,jj,jk) / qnnmin 
     368            zpronewd(ji,jj,jk) = zpronmax * xdiatno3(ji,jj,jk) 
    301369            zproregd(ji,jj,jk) = zpronmax * xdiatnh4(ji,jj,jk) 
    302370            ! 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))  
     371            zratio = 1.0 - MIN( 1., zratiop / (xqpdmax(ji,jj,jk) + rtrn) ) 
     372            zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) ) 
    305373            zpropmax = zprnutmax * zmax * xlimdfe(ji,jj,jk) 
    306374            zpropo4d(ji,jj,jk) = zpropmax * xdiatpo4(ji,jj,jk) 
    307375            zprodopd(ji,jj,jk) = zpropmax * xdiatdop(ji,jj,jk) 
    308376            ! 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   & 
     377            zqfdmax = xqfuncfecd(ji,jj,jk) + ( qfdmax - xqfuncfecd(ji,jj,jk) ) * xlimnpd(ji,jj,jk) 
     378            zratio = 1.0 - MIN( 1., zratiof / zqfdmax ) 
     379            zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) ) 
     380            zprofmax = zprnutmax * zqfdmax * zmax 
     381            zprofed(ji,jj,jk) = zprofmax * xdiatfer(ji,jj,jk)    & 
     382            &          * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn   & 
    314383            &          + xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) ) 
    315384         ENDIF 
    316385      END_3D 
    317386 
     387      ! Production of Chlorophyll. The formulation proposed by Geider et al. 
     388      ! is adopted here. 
     389      ! -------------------------------------------------------------------- 
    318390      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    319391         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN 
     
    321393            znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    322394            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 ) 
     395            zprochln = thetannm * zprod / ( zpislopeadn(ji,jj,jk) * znanotot + rtrn ) 
    326396            zprochln = MAX(zprochln, chlcmin * 12. * zprorcan (ji,jj,jk) ) 
    327397               !  production terms for picophyto. ( chlorophyll ) 
    328398            zpicotot = epicom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    329399            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 ) 
     400            zprochlp = thetanpm * zprod / ( zpislopeadp(ji,jj,jk) * zpicotot + rtrn ) 
    333401            zprochlp = MAX(zprochlp, chlcmin * 12. * zprorcap(ji,jj,jk) ) 
    334             !  production terms for diatomees ( chlorophyll ) 
     402            !  production terms for diatoms ( chlorophyll ) 
    335403            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) 
    336404            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 ) 
     405            zprochld = thetandm * zprod / ( zpislopeadd(ji,jj,jk) * zdiattot + rtrn ) 
    340406            zprochld = MAX(zprochld, chlcmin * 12. * zprorcad(ji,jj,jk) ) 
    341407            !   Update the arrays TRA which contain the Chla sources and sinks 
     
    348414      !   Update the arrays TRA which contain the biological sources and sinks 
    349415      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     416        zpptot   = zpropo4n(ji,jj,jk) + zpropo4d(ji,jj,jk) + zpropo4p(ji,jj,jk) 
     417        zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) + zpronewp(ji,jj,jk) 
     418        zpregtot = zproregn(ji,jj,jk) + zproregd(ji,jj,jk) + zproregp(ji,jj,jk) 
     419 
    350420        zprontot = zpronewn(ji,jj,jk) + zproregn(ji,jj,jk) 
    351421        zproptot = zpronewp(ji,jj,jk) + zproregp(ji,jj,jk) 
    352422        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) 
     423        ! 
     424        zproddoc = excretd * zprorcad(ji,jj,jk) & 
     425        &        + excretn * zprorcan(ji,jj,jk) & 
     426        &        + excretp * zprorcap(ji,jj,jk) 
     427        ! 
     428        zproddop = excretd * zpropo4d(ji,jj,jk) - texcretd * zprodopd(ji,jj,jk) & 
     429        &        + excretn * zpropo4n(ji,jj,jk) - texcretn * zprodopn(ji,jj,jk) & 
     430        &        + excretp * zpropo4p(ji,jj,jk) - texcretp * zprodopp(ji,jj,jk) 
     431 
     432        zproddon =  excretd * zprodtot + excretn * zprontot + excretp * zproptot 
     433 
     434        zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) 
     435        zresptot = zrespn(ji,jj,jk) + zrespp(ji,jj,jk) + zrespd(ji,jj,jk)  
     436  
     437        ! 
     438        tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpptot 
     439        tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot 
     440        tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot   
     441        ! 
     442        tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs)         & 
     443           &                     + zprorcan(ji,jj,jk) * texcretn  & 
     444           &                     - zpsino3 * zpronewn(ji,jj,jk)   & 
     445           &                     - zpsinh4 * zproregn(ji,jj,jk)   & 
     446           &                     - zrespn(ji,jj,jk)  
     447 
    365448        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 
     449        tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) + ( zpropo4n(ji,jj,jk) + zprodopn(ji,jj,jk) ) * texcretn 
    368450        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) 
     451 
     452        ! 
     453        tr(ji,jj,jk,jppic,Krhs) = tr(ji,jj,jk,jppic,Krhs)         & 
     454           &                     + zprorcap(ji,jj,jk) * texcretp  & 
     455           &                     - zpsino3 * zpronewp(ji,jj,jk)   & 
     456           &                     - zpsinh4 * zproregp(ji,jj,jk)   & 
     457           &                     - zrespp(ji,jj,jk)  
     458 
    373459        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 
     460        tr(ji,jj,jk,jpppi,Krhs) = tr(ji,jj,jk,jpppi,Krhs) + ( zpropo4p(ji,jj,jk) + zprodopp(ji,jj,jk) ) * texcretp 
    376461        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) 
     462 
     463        ! 
     464        tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs)         & 
     465           &                    + zprorcad(ji,jj,jk) * texcretd   & 
     466           &                    - zpsino3 * zpronewd(ji,jj,jk)    & 
     467           &                    - zpsinh4 * zproregd(ji,jj,jk)    & 
     468           &                    - zrespd(ji,jj,jk)  
     469 
    381470        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 
     471        tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) + ( zpropo4d(ji,jj,jk) + zprodopd(ji,jj,jk) ) * texcretd 
    384472        tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk) * texcretd 
    385473        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      ! 
     474 
     475        tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc 
     476        tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zproddon                                         
     477        tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zproddop 
     478   
     479        tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) & 
     480           &                     + o2ut * zpregtot + ( o2ut + o2nit ) * zpnewtot - o2ut * zresptot  
     481 
     482        tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer 
     483        consfe3(ji,jj,jk)       = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) )   & 
     484           &                   * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2 
     485         
     486        tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - texcretd * zprorcad(ji,jj,jk) * zysopt(ji,jj,jk)  
     487 
     488        tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot  & 
     489           &                     + zpsino3 * zpronewn(ji,jj,jk) + zpsinh4 * zproregn(ji,jj,jk)   & 
     490           &                     + zpsino3 * zpronewp(ji,jj,jk) + zpsinh4 * zproregp(ji,jj,jk)   & 
     491           &                     + zpsino3 * zpronewd(ji,jj,jk) + zpsinh4 * zproregd(ji,jj,jk)   
     492 
     493        tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot ) 
     494        ! 
     495      END_3D 
     496      
     497     ! Production and uptake of ligands by phytoplankton. This part is activated  
     498     ! when ln_ligand is set to .true. in the namelist. Ligand uptake is small  
     499     ! and based on the FeL model by Morel et al. (2008) and on the study of 
     500     ! Shaked and Lis (2012) 
     501     ! ------------------------------------------------------------------------- 
    410502     IF( ln_ligand ) THEN 
    411          zpligprod1(:,:,:) = 0._wp    ;    zpligprod2(:,:,:) = 0._wp              
    412503         DO_3D( 1, 1, 1, 1, 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 
     504           zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) + excretp * zprorcap(ji,jj,jk) 
     505           zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk) 
     506           zprodlig = plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet  
     507           ! 
     508           tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zproddoc * ldocp - zprodfer * zprodlig 
     509        END_3D 
    419510     ENDIF 
    420  
    421  
    422      ! Total primary production per year 
    423511 
    424512    ! Total primary production per year 
     
    439527       CALL iom_put( "PFeN"    , zprofen(:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by nanophyto 
    440528       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(:,:,:) ) 
     529       IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN 
     530           ALLOCATE(  zpligprod(jpi,jpj,jpk) ) 
     531           zpligprod(:,:,:) = excretd * zprorcad(:,:,:) + excretn * zprorcan(:,:,:) + excretp * zprorcap(:,:,:) 
     532           CALL iom_put( "LPRODP"  , zpligprod(:,:,:) * ldocp * 1e9 * zfact * tmask(:,:,:) ) 
     533           ! 
     534           zpligprod(:,:,:) = ( texcretn * zprofen(:,:,:) + texcretd * zprofed(:,:,:) + texcretp * zprofep(:,:,:) ) &  
     535             &                  * plig(:,:,:) / ( rtrn + plig(:,:,:) + 75.0 * (1.0 - plig(:,:,:) ) ) 
     536           CALL iom_put( "LDETP"   , zpligprod(:,:,:)  * lthet * 1e9 * zfact * tmask(:,:,:) ) 
     537           DEALLOCATE(  zpligprod ) 
    444538       ENDIF 
    445539       CALL iom_put( "Mumax"   , zprmaxn(:,:,:) * tmask(:,:,:)  ) ! Maximum growth rate 
     
    450544       CALL iom_put( "LNlight" , zprbio(:,:,:) / (zprmaxn(:,:,:) + rtrn) * tmask(:,:,:)  )  ! light limitation term 
    451545       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 
     546       CALL iom_put( "MunetP"  , ( tr(:,:,:,jppic,Krhs)/rfact2/(tr(:,:,:,jppic,Kbb)+ rtrn ) * tmask(:,:,:)) ) ! Realized growth rate for picophyto 
     547       CALL iom_put( "MunetN"  , ( tr(:,:,:,jpphy,Krhs)/rfact2/(tr(:,:,:,jpphy,Kbb)+ rtrn ) * tmask(:,:,:)) ) ! Realized growth rate for picophyto 
     548       CALL iom_put( "MunetD"  , ( tr(:,:,:,jpdia,Krhs)/rfact2/(tr(:,:,:,jpdia,Kbb)+ rtrn ) * tmask(:,:,:)) ) ! Realized growth rate for picophyto 
    455549       CALL iom_put( "TPP"     , ( zprorcap(:,:,:) + zprorcan(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:)  )  ! total primary production 
    456550       CALL iom_put( "TPNEW"   , ( zpronewp(:,:,:) + zpronewn(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:)  ) ! total new production 
     
    476570      !! ** Purpose :   Initialization of phytoplankton production parameters 
    477571      !! 
    478       !! ** Method  :   Read the nampisprod namelist and check the parameters 
     572      !! ** Method  :   Read the namp5zprod namelist and check the parameters 
    479573      !!      called at the first timestep (nittrc000) 
    480574      !! 
    481       !! ** input   :   Namelist nampisprod 
     575      !! ** input   :   Namelist namp5zprod 
    482576      !!---------------------------------------------------------------------- 
    483       INTEGER :: ios                 ! Local integer output status for namelist read 
     577      INTEGER :: ios    ! Local integer output status for namelist read 
    484578      !! 
    485579      NAMELIST/namp5zprod/ pislopen, pislopep, pisloped, excretn, excretp, excretd,     & 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/par_sed.F90

    r14086 r14385  
    6060   INTEGER, PUBLIC, PARAMETER ::  & 
    6161      jptrased   = jpsol + jpwat , & 
    62       jpdia3dsed = 2             , & 
    63       jpdia2dsed = 12 
     62      jpdia3dsed = 4             , & 
     63      jpdia2dsed = 20  
    6464 
    6565END MODULE par_sed 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sed.F90

    r14086 r14385  
    7070   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  fromsed    !: 
    7171   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  tosed      !: 
    72    REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  rloss      !:  
    73    REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  tokbot         
    74    ! 
    7572   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  temp       !: temperature 
    7673   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  salt       !: salinity 
    77    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  press      !: pressure 
    7874   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  raintg     !: total massic flux rained in each cell (sum of sol. comp.) 
    7975   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  fecratio   !: Fe/C ratio in falling particles to the sediments 
    8076   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  dzdep      !: total thickness of solid material rained [cm] in each cell 
    81    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  zkbot      !: total thickness of solid material rained [cm] in each cell 
     77   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  zkbot      !: Total water column depth 
    8278   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  wacc       !: total thickness of solid material rained [cm] in each cell 
    8379   ! 
     
    8884   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  vols3d     !:  ??? 
    8985 
    90  
    9186   !! Chemistry 
    92    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  densSW  
    93    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  borats  
     87   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  densSW 
     88   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  borats 
    9489   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  calcon2 
    95    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  akbs   
    96    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak1s  
    97    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak2s    
    98    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  akws   
    99    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak12s   
    100    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak1ps  
    101    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak2ps   
    102    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak3ps  
    103    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak12ps  
     90   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  akbs 
     91   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak1s 
     92   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak2s 
     93   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  akws 
     94   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak12s 
     95   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak1ps 
     96   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak2ps 
     97   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak3ps 
     98   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak12ps 
    10499   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak123ps 
    105    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aksis  
    106    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aksps  
     100   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aksis 
     101   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aksps 
    107102   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  sieqs 
    108103   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aks3s 
     
    127122   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  db            !: bioturbation ceofficient 
    128123   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  irrig        !: bioturbation ceofficient 
    129    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  rdtsed        !:  sediment model time-step 
    130124   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE :: sedligand 
     125   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE :: saturco3 
    131126   REAL(wp)  ::   dens               !: density of solid material 
    132127   !! Inputs / Outputs 
     
    154149      !!------------------------------------------------------------------- 
    155150      ! 
    156       ALLOCATE( trc_data(jpi,jpj,jpdta)                                   ,   & 
    157          &      epkbot(jpi,jpj), gdepbot(jpi,jpj)        ,   & 
    158          &      dz(jpksed)  , por(jpksed) , por1(jpksed)                  ,   & 
    159          &      volw(jpksed), vols(jpksed), rdtsed(jpksed)  ,   & 
    160          &      trcsedi  (jpi,jpj,jpksed,jptrased)                        ,   & 
    161          &      flxsedi3d(jpi,jpj,jpksed,jpdia3dsed)                      ,   & 
    162          &      flxsedi2d(jpi,jpj,jpdia2dsed)                             ,   & 
    163          &      mol_wgt(jpsol),                                           STAT=sed_alloc ) 
     151      ALLOCATE( trc_data(jpi,jpj,jpdta), trcsedi  (jpi,jpj,jpksed,jptrased) ,  & 
     152         &      epkbot(jpi,jpj), gdepbot(jpi,jpj), dz(jpksed), por(jpksed)  ,  & 
     153         &      por1(jpksed), volw(jpksed), vols(jpksed), mol_wgt(jpsol)    ,  & 
     154         &      flxsedi2d(jpi,jpj,jpdia2dsed), flxsedi3d(jpi,jpj,jpksed,jpdia3dsed),  STAT=sed_alloc ) 
    164155 
    165156      IF( sed_alloc /= 0 )   CALL ctl_stop( 'STOP', 'sed_alloc: failed to allocate arrays' ) 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedadv.F90

    r10425 r14385  
    8888      fromsed(:,:) = 0. 
    8989      tosed  (:,:) = 0.  
    90       rloss  (:,:) = 0. 
    9190      ikwneg = 1 
    9291      nztime = jpksed 
     
    254253 
    255254         ELSE IF( raintg(ji) < eps ) THEN ! rain  = 0 
    256 !! Nadia    rloss(:,:) = rainrm(:,:)   bug ??????            
    257  
    258             rloss(ji,1:jpsol) = rainrm(ji,1:jpsol) 
    259255 
    260256            zfull (2) = zfilled(2) 
     
    300296            IF( ikwneg == 2 ) THEN ! advection is reversed in the first sediment layer 
    301297 
    302                zkwnup = rdtsed(ikwneg) * raintg(ji) / dz(ikwneg) 
     298               zkwnup = dtsed * raintg(ji) / ( denssol * por1(ikwneg) * dz(ikwneg) ) 
    303299               zkwnlo = ABS( zwb(ji,ikwneg) ) / dz(ikwneg) 
    304300               zfull (ikwneg+1) = zfilled(ikwneg+1) - zkwnlo * dvolsm(ikwneg+1) 
     
    347343               ! Heinze  fromsed(ji,jsclay) = zkwnlo * 1. * denssol * por1(jpksed) / mol_wgt(jsclay) 
    348344               fromsed(ji,jsclay) = zkwnlo * 1.* por1clay 
    349             ELSE   ! 2 < ikwneg(ji) <= jpksedm1 
     345            ELSE IF( ikwneg > 2 .AND. ikwneg < jpksed-1 ) THEN 
    350346 
    351347               zkwnup = ABS( zwb(ji,ikwneg-1) ) * por1(ikwneg-1) / ( dz(ikwneg) * por1(ikwneg) ) 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedarr.F90

    r14086 r14385  
    5151         jid        = MOD( tab_ind(jn) - 1, jpi ) + 1 
    5252         jjd        = ( tab_ind(jn) - 1 ) / jpi + 1 
     53!         IF ( mig(jid) == 112 .and. mjg(jjd) == 25) write(0,*) 'plante ',jn,ndim1d 
    5354         tab1d(jn)  = tab2d(jid, jjd) 
    5455      END DO  
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/seddiff.F90

    r10225 r14385  
    4343      INTEGER, INTENT(in) ::   kt, knt       ! number of iteration 
    4444      ! --- local variables 
    45       INTEGER :: ji, jk, js   ! dummy looop indices 
     45      INTEGER :: ji, jk, jw   ! dummy looop indices 
    4646 
    4747      REAL(wp), DIMENSION(jpoce,jpksed) :: zrearat1, zrearat2   ! reaction rate in pore water 
     
    6060     ! Initializations 
    6161     !---------------------- 
    62       zrearat1(:,:)   = 0. 
     62      zrearat1(:,:) = 0. 
    6363      zrearat2(:,:) = 0. 
    6464 
    65       !--------------------------- 
    66       ! Solves PO4 diffusion  
    67       !---------------------------- 
     65      ! -------------------------------------- 
     66      ! Solves solute diffusion in pore waters 
     67      ! -------------------------------------- 
    6868 
    69       ! solves tridiagonal system 
    70       CALL sed_mat( jwpo4, jpoce, jpksed, zrearat1, zrearat2, pwcp(:,:,jwpo4), dtsed2 / 2.0 ) 
    71  
    72       !--------------------------- 
    73       ! Solves NH4 diffusion  
    74       !---------------------------- 
    75  
    76       ! solves tridiagonal system 
    77       CALL sed_mat( jwnh4, jpoce, jpksed, zrearat1, zrearat2, pwcp(:,:,jwnh4), dtsed2 / 2.0 ) 
    78  
    79       !--------------------------- 
    80       ! Solves Fe2+ diffusion  
    81       !---------------------------- 
    82  
    83       ! solves tridiagonal system 
    84       CALL sed_mat( jwfe2, jpoce, jpksed, zrearat1, zrearat2, pwcp(:,:,jwfe2), dtsed2 / 2.0 ) 
    85  
    86       !--------------------------- 
    87       ! Solves H2S diffusion  
    88       !---------------------------- 
    89  
    90       ! solves tridiagonal system 
    91       CALL sed_mat( jwh2s, jpoce, jpksed, zrearat1, zrearat2, pwcp(:,:,jwh2s), dtsed2 / 2.0  ) 
    92  
    93       !--------------------------- 
    94       ! Solves SO4 diffusion  
    95       !---------------------------- 
    96  
    97       ! solves tridiagonal system 
    98       CALL sed_mat( jwso4, jpoce, jpksed, zrearat1, zrearat2, pwcp(:,:,jwso4), dtsed2 / 2.0 ) 
    99  
    100       !--------------------------- 
    101       ! Solves O2 diffusion 
    102       !---------------------------- 
    103  
    104       ! solves tridiagonal system 
    105       CALL sed_mat( jwoxy, jpoce, jpksed, zrearat1, zrearat2, pwcp(:,:,jwoxy), dtsed2 / 2.0 ) 
    106  
    107       !--------------------------- 
    108       ! Solves NO3 diffusion 
    109       !---------------------------- 
    110  
    111       ! solves tridiagonal system 
    112       CALL sed_mat( jwno3, jpoce, jpksed, zrearat1, zrearat2, pwcp(:,:,jwno3), dtsed2 / 2.0 ) 
     69      ! Solves tridiagonal system 
     70      DO jw = 1, jpwat 
     71         CALL sed_mat( jw, jpoce, jpksed, zrearat1, zrearat2, pwcp(:,:,jw), dtsed2 / 2.0 ) 
     72      END DO 
    11373 
    11474      CALL sed_mat( jwdic, jpoce, jpksed, zrearat1, zrearat2, sedligand(:,:), dtsed2 / 2.0 ) 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/seddsr.F90

    r10362 r14385  
    5555      REAL(wp), DIMENSION(jpoce,jpksed) :: zrearat1, zrearat2, zrearat3    ! reaction rate in pore water 
    5656      REAL(wp), DIMENSION(jpoce,jpksed) :: zundsat    ! undersaturation ; indice jpwatp1 is for calcite    
    57       REAL(wp), DIMENSION(jpoce,jpksed) :: zkpoc, zkpos, zkpor, zlimo2, zlimno3, zlimso4, zlimfeo    ! undersaturation ; indice jpwatp1 is for calcite    
     57      REAL(wp), DIMENSION(jpoce,jpksed) :: zlimo2, zlimno3, zlimso4, zlimfeo    ! undersaturation ; indice jpwatp1 is for calcite    
    5858      REAL(wp), DIMENSION(jpoce)        :: zsumtot 
    5959      REAL(wp)  ::  zsolid1, zsolid2, zsolid3, zvolw, zreasat 
    60       REAL(wp)  ::  zsatur, zsatur2, znusil, zkpoca, zkpocb, zkpocc 
    61       REAL(wp)  ::  zratio, zgamma, zbeta, zlimtmp, zundsat2 
     60      REAL(wp)  ::  zgamma, zbeta, zlimtmp 
    6261      !! 
    6362      !!---------------------------------------------------------------------- 
     
    7574     !---------------------- 
    7675       
    77       zrearat1(:,:)   = 0.    ;   zundsat(:,:) = 0. ; zkpoc(:,:) = 0. 
    78       zlimo2 (:,:)    = 0.    ;   zlimno3(:,:) = 0. ; zrearat2(:,:) = 0. 
    79       zlimso4(:,:)    = 0.    ;   zkpor(:,:)   = 0. ; zrearat3(:,:) = 0. 
    80       zkpos  (:,:)    = 0. 
     76      zrearat1(:,:)   = 0.    ;   zundsat(:,:)  = 0. 
     77      zlimo2 (:,:)    = 0.    ;   zlimno3(:,:)  = 0. ; zrearat2(:,:) = 0. 
     78      zlimso4(:,:)    = 0.    ;   zrearat3(:,:) = 0. 
    8179      zsumtot(:)      = rtrn 
    8280   
     
    8482      zvolc(:,:,:)    = 0. 
    8583      zadsnh4 = 1.0 / ( 1.0 + adsnh4 ) 
    86  
    87       ! Inhibition terms for the different redox equations 
    88       ! -------------------------------------------------- 
    89       DO jk = 1, jpksed 
    90          DO ji = 1, jpoce 
    91             zkpoc(ji,jk) = reac_pocl  
    92             zkpos(ji,jk) = reac_pocs 
    93             zkpor(ji,jk) = reac_pocr 
    94          END DO 
    95       END DO 
    9684 
    9785      ! Conversion of volume units 
     
    116104      zrearat3(:,:) = 0. 
    117105 
    118       zundsat(:,:) = pwcp(:,:,jwoxy) 
     106      zundsat(:,:) = MAX( pwcp(:,:,jwoxy) - rtrn, 0. ) 
    119107 
    120108      DO jk = 2, jpksed 
    121109         DO ji = 1, jpoce 
    122             zlimo2(ji,jk) = 1.0 / ( zundsat(ji,jk) + xksedo2 ) 
    123110            zsolid1 = zvolc(ji,jk,jspoc)  * solcp(ji,jk,jspoc) 
    124111            zsolid2 = zvolc(ji,jk,jspos)  * solcp(ji,jk,jspos) 
    125112            zsolid3 = zvolc(ji,jk,jspor)  * solcp(ji,jk,jspor) 
    126             zkpoca  = zkpoc(ji,jk) * zlimo2(ji,jk) 
    127             zkpocb  = zkpos(ji,jk) * zlimo2(ji,jk) 
    128             zkpocc  = zkpor(ji,jk) * zlimo2(ji,jk) 
    129             zrearat1(ji,jk)  = ( zkpoc(ji,jk) * dtsed2 * zsolid1 ) / & 
    130             &                 ( 1. + zkpoca * zundsat(ji,jk ) * dtsed2 ) 
    131             zrearat2(ji,jk)  = ( zkpos(ji,jk) * dtsed2 * zsolid2 ) / & 
    132             &                 ( 1. + zkpocb * zundsat(ji,jk ) * dtsed2 ) 
    133             zrearat3(ji,jk)  = ( zkpor(ji,jk) * dtsed2 * zsolid3 ) / & 
    134             &                 ( 1. + zkpocc * zundsat(ji,jk ) * dtsed2 ) 
    135          ENDDO 
    136       ENDDO 
    137  
    138       ! left hand side of coefficient matrix 
    139 !      DO jn = 1, 5 
    140       DO jk = 2, jpksed 
    141          DO ji = 1, jpoce 
    142 jflag1:     DO jn = 1, 10 
    143                zsolid1 = zvolc(ji,jk,jspoc)  * solcp(ji,jk,jspoc) 
    144                zsolid2 = zvolc(ji,jk,jspos)  * solcp(ji,jk,jspos) 
    145                zsolid3 = zvolc(ji,jk,jspor)  * solcp(ji,jk,jspor) 
    146                zbeta   = xksedo2 - pwcp(ji,jk,jwoxy) + so2ut * ( zrearat1(ji,jk)    & 
    147                &         + zrearat2(ji,jk) + zrearat3(ji,jk) ) 
    148                zgamma = - xksedo2 * pwcp(ji,jk,jwoxy) 
    149                zundsat2 = zundsat(ji,jk) 
    150                zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
    151                zlimo2(ji,jk) = 1.0 / ( zundsat(ji,jk) + xksedo2 ) 
    152                zkpoca  = zkpoc(ji,jk) * zlimo2(ji,jk) 
    153                zkpocb  = zkpos(ji,jk) * zlimo2(ji,jk) 
    154                zkpocc  = zkpor(ji,jk) * zlimo2(ji,jk) 
    155                zrearat1(ji,jk)  = ( zkpoc(ji,jk) * dtsed2 * zsolid1 ) / & 
    156                &                 ( 1. + zkpoca * zundsat(ji,jk ) * dtsed2 ) 
    157                zrearat2(ji,jk)  = ( zkpos(ji,jk) * dtsed2 * zsolid2 ) / & 
    158                &                 ( 1. + zkpocb * zundsat(ji,jk ) * dtsed2 ) 
    159                zrearat3(ji,jk)  = ( zkpor(ji,jk) * dtsed2 * zsolid3 ) / & 
    160                &                 ( 1. + zkpocc * zundsat(ji,jk ) * dtsed2 ) 
    161                IF ( ABS( (zundsat(ji,jk)-zundsat2)/(zundsat2+rtrn)) < 1E-8 ) THEN 
    162                   EXIT jflag1 
    163                ENDIF 
    164             END DO jflag1 
    165          END DO 
    166       END DO 
    167  
    168       ! New solid concentration values (jk=2 to jksed) for each couple  
    169       DO jk = 2, jpksed 
    170          DO ji = 1, jpoce 
    171             zreasat = zrearat1(ji,jk) * zlimo2(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspoc) 
    172             solcp(ji,jk,jspoc) = solcp(ji,jk,jspoc) - zreasat 
    173             zreasat = zrearat2(ji,jk) * zlimo2(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspos) 
    174             solcp(ji,jk,jspos) = solcp(ji,jk,jspos) - zreasat 
    175             zreasat = zrearat3(ji,jk) * zlimo2(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspor) 
    176             solcp(ji,jk,jspor) = solcp(ji,jk,jspor) - zreasat 
    177          ENDDO 
    178       ENDDO 
    179  
    180       ! New pore water concentrations     
    181       DO jk = 2, jpksed 
    182          DO ji = 1, jpoce 
    183             ! Acid Silicic  
    184             pwcp(ji,jk,jwoxy)  = zundsat(ji,jk) 
    185             zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) ) * zlimo2(ji,jk) * zundsat(ji,jk)    ! oxygen          
     113            zrearat1(ji,jk)  = ( reac_pocl * dtsed2 * zsolid1 ) / ( 1. + reac_pocl * dtsed2 ) 
     114            zrearat2(ji,jk)  = ( reac_pocs * dtsed2 * zsolid2 ) / ( 1. + reac_pocs * dtsed2 ) 
     115            zrearat3(ji,jk)  = ( reac_pocr * dtsed2 * zsolid3 ) / ( 1. + reac_pocr * dtsed2 ) 
     116            solcp(ji,jk,jspoc) = solcp(ji,jk,jspoc) - zrearat1(ji,jk) / zvolc(ji,jk,jspoc) 
     117            solcp(ji,jk,jspos) = solcp(ji,jk,jspos) - zrearat2(ji,jk) / zvolc(ji,jk,jspos) 
     118            solcp(ji,jk,jspor) = solcp(ji,jk,jspor) - zrearat3(ji,jk) / zvolc(ji,jk,jspor) 
     119            zreasat = zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) 
     120 
    186121            ! For DIC 
    187122            pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
    188123            zsumtot(ji) = zsumtot(ji) + zreasat / dtsed2 * volw3d(ji,jk) * 1.e-3 * 86400. * 365. * 1E3 
     124 
     125            ! For alkalinity 
     126            pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + zreasat * ( srno3 - 2.* spo4r ) 
     127 
    189128            ! For Phosphate (in mol/l) 
    190129            pwcp(ji,jk,jwpo4)  = pwcp(ji,jk,jwpo4) + zreasat * spo4r 
     130 
    191131            ! For iron (in mol/l) 
    192132            pwcp(ji,jk,jwfe2)  = pwcp(ji,jk,jwfe2) + fecratio(ji) * zreasat 
    193             ! For alkalinity 
    194             pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + zreasat * ( srno3 * zadsnh4 - 2.* spo4r ) 
     133 
    195134            ! Ammonium 
    196135            pwcp(ji,jk,jwnh4)  = pwcp(ji,jk,jwnh4) + zreasat * srno3 * zadsnh4 
     136 
    197137            ! Ligands 
    198             sedligand(ji,jk)   = sedligand(ji,jk) + ratligc * zreasat - reac_ligc * sedligand(ji,jk) 
     138            sedligand(ji,jk)   = sedligand(ji,jk) + ratligc * zreasat 
     139 
     140         ENDDO 
     141      ENDDO 
     142 
     143      ! left hand side of coefficient matrix 
     144      DO jk = 2, jpksed 
     145         DO ji = 1, jpoce 
     146            zreasat = zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) 
     147            zbeta   = xksedo2 - pwcp(ji,jk,jwoxy) + so2ut * zreasat 
     148            zgamma = - xksedo2 * pwcp(ji,jk,jwoxy) 
     149            zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
     150            zlimo2(ji,jk) = zundsat(ji,jk) / ( zundsat(ji,jk) + xksedo2 ) 
     151 
     152            ! Oxygen 
     153            pwcp(ji,jk,jwoxy)  = zundsat(ji,jk) + MIN( pwcp(ji,jk,jwoxy), rtrn ) 
     154            zreasat = zreasat * zlimo2(ji,jk) 
     155 
     156            ! Ligands 
     157            sedligand(ji,jk)   = sedligand(ji,jk) - reac_ligc * sedligand(ji,jk) 
    199158         ENDDO 
    200159      ENDDO 
     
    205164      !-------------------------------------------------------------------- 
    206165 
    207       zrearat1(:,:) = 0. 
    208       zrearat2(:,:) = 0. 
    209       zrearat3(:,:) = 0. 
    210  
    211       zundsat(:,:) = pwcp(:,:,jwno3) 
     166      zundsat(:,:) = MAX(0., pwcp(:,:,jwno3) - rtrn) 
    212167 
    213168      DO jk = 2, jpksed 
    214169         DO ji = 1, jpoce 
    215             zlimno3(ji,jk) = ( 1.0 - pwcp(ji,jk,jwoxy) * zlimo2(ji,jk) ) / ( zundsat(ji,jk) + xksedno3 ) 
    216             zsolid1 = zvolc(ji,jk,jspoc) * solcp(ji,jk,jspoc) 
    217             zsolid2 = zvolc(ji,jk,jspos) * solcp(ji,jk,jspos) 
    218             zsolid3 = zvolc(ji,jk,jspor) * solcp(ji,jk,jspor) 
    219             zkpoca = zkpoc(ji,jk) * zlimno3(ji,jk) 
    220             zkpocb = zkpos(ji,jk) * zlimno3(ji,jk) 
    221             zkpocc = zkpor(ji,jk) * zlimno3(ji,jk) 
    222             zrearat1(ji,jk)  = ( zkpoc(ji,jk) * dtsed2 * zsolid1 ) / & 
    223             &                 ( 1. + zkpoca * zundsat(ji,jk ) * dtsed2 ) 
    224             zrearat2(ji,jk)  = ( zkpos(ji,jk) * dtsed2 * zsolid2 ) / & 
    225             &                 ( 1. + zkpocb * zundsat(ji,jk ) * dtsed2 ) 
    226             zrearat3(ji,jk)  = ( zkpor(ji,jk) * dtsed2 * zsolid3 ) / & 
    227             &                 ( 1. + zkpocc * zundsat(ji,jk ) * dtsed2 ) 
    228         END DO 
    229       END DO 
    230  
    231 !      DO jn = 1, 5 
    232       DO jk = 2, jpksed 
    233          DO ji = 1, jpoce 
    234 jflag2:    DO jn = 1, 10 
    235                zlimtmp = ( 1.0 - pwcp(ji,jk,jwoxy) * zlimo2(ji,jk) ) 
    236                zsolid1 = zvolc(ji,jk,jspoc) * solcp(ji,jk,jspoc) 
    237                zsolid2 = zvolc(ji,jk,jspos) * solcp(ji,jk,jspos) 
    238                zsolid3 = zvolc(ji,jk,jspor) * solcp(ji,jk,jspor) 
    239                zbeta   = xksedno3 - pwcp(ji,jk,jwno3) + srDnit * ( zrearat1(ji,jk)    & 
    240                &         + zrearat2(ji,jk) + zrearat3(ji,jk) ) * zlimtmp 
    241                zgamma = - xksedno3 * pwcp(ji,jk,jwno3) 
    242                zundsat2 = zundsat(ji,jk) 
    243                zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
    244                zlimno3(ji,jk) = ( 1.0 - pwcp(ji,jk,jwoxy) * zlimo2(ji,jk) ) / ( zundsat(ji,jk) + xksedno3 ) 
    245                zkpoca  = zkpoc(ji,jk) * zlimno3(ji,jk) 
    246                zkpocb  = zkpos(ji,jk) * zlimno3(ji,jk) 
    247                zkpocc  = zkpor(ji,jk) * zlimno3(ji,jk) 
    248                zrearat1(ji,jk)  = ( zkpoc(ji,jk) * dtsed2 * zsolid1 ) / & 
    249                &                 ( 1. + zkpoca * zundsat(ji,jk ) * dtsed2 ) 
    250                zrearat2(ji,jk)  = ( zkpos(ji,jk) * dtsed2 * zsolid2 ) / & 
    251                &                 ( 1. + zkpocb * zundsat(ji,jk ) * dtsed2 ) 
    252                zrearat3(ji,jk)  = ( zkpor(ji,jk) * dtsed2 * zsolid3 ) / & 
    253                &                 ( 1. + zkpocc * zundsat(ji,jk ) * dtsed2 ) 
    254                IF ( ABS( (zundsat(ji,jk)-zundsat2)/(zundsat2+rtrn)) < 1E-8 ) THEN 
    255                   EXIT jflag2 
    256                ENDIF 
    257             END DO jflag2 
    258          END DO 
    259       END DO 
    260  
    261  
    262       ! New solid concentration values (jk=2 to jksed) for each couple  
    263       DO jk = 2, jpksed 
    264          DO ji = 1, jpoce 
    265             zreasat = zrearat1(ji,jk) * zlimno3(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspoc) 
    266             solcp(ji,jk,jspoc) = solcp(ji,jk,jspoc) - zreasat 
    267             zreasat = zrearat2(ji,jk) * zlimno3(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspos) 
    268             solcp(ji,jk,jspos) = solcp(ji,jk,jspos) - zreasat 
    269             zreasat = zrearat3(ji,jk) * zlimno3(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspor) 
    270             solcp(ji,jk,jspor) = solcp(ji,jk,jspor) - zreasat 
    271          ENDDO 
    272       ENDDO 
    273  
    274       ! New dissolved concentrations 
    275       DO jk = 2, jpksed 
    276          DO ji = 1, jpoce 
     170            zlimtmp = ( 1.0 - zlimo2(ji,jk) ) 
     171            zreasat = zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) 
     172            zbeta   = xksedno3 - pwcp(ji,jk,jwno3) + srDnit * zreasat * zlimtmp 
     173            zgamma  = - xksedno3 * pwcp(ji,jk,jwno3) 
     174            zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
     175            zlimno3(ji,jk) = zlimtmp * zundsat(ji,jk) / ( zundsat(ji,jk) + xksedno3 ) 
     176 
    277177            ! For nitrates 
    278             pwcp(ji,jk,jwno3)  =  zundsat(ji,jk) 
    279             zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) ) * zlimno3(ji,jk) * zundsat(ji,jk) 
    280             ! For DIC 
    281             pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
    282             zsumtot(ji) = zsumtot(ji) + zreasat / dtsed2 * volw3d(ji,jk) * 1.e-3 * 86400. * 365. * 1E3 
    283             ! For Phosphate (in mol/l) 
    284             pwcp(ji,jk,jwpo4)  = pwcp(ji,jk,jwpo4) + zreasat * spo4r             
    285             ! Ligands 
    286             sedligand(ji,jk)   = sedligand(ji,jk) + ratligc * zreasat 
    287             ! For iron (in mol/l) 
    288             pwcp(ji,jk,jwfe2)  = pwcp(ji,jk,jwfe2) + fecratio(ji) * zreasat 
     178            pwcp(ji,jk,jwno3) = zundsat(ji,jk) + MIN(pwcp(ji,jk,jwno3), rtrn) 
     179            zreasat = zreasat * zlimno3(ji,jk) 
     180 
    289181            ! For alkalinity 
    290             pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + zreasat * ( srDnit + srno3 * zadsnh4 - 2.* spo4r )            
    291             ! Ammonium 
    292             pwcp(ji,jk,jwnh4)  = pwcp(ji,jk,jwnh4) + zreasat * srno3 * zadsnh4 
     182            pwcp(ji,jk,jwalk) = pwcp(ji,jk,jwalk) + zreasat * srDnit 
    293183         ENDDO 
    294184      ENDDO 
     
    299189      !-------------------------------------------------------------------- 
    300190 
    301       zrearat1(:,:) = 0. 
    302       zrearat2(:,:) = 0. 
    303       zrearat3(:,:) = 0. 
    304  
    305       zundsat(:,:) = solcp(:,:,jsfeo) 
     191      zundsat(:,:) = MAX(0., solcp(:,:,jsfeo) - rtrn) 
    306192 
    307193      DO jk = 2, jpksed 
    308194         DO ji = 1, jpoce 
    309             zlimfeo(ji,jk) = ( 1.0 - pwcp(ji,jk,jwoxy) * zlimo2(ji,jk) ) * ( 1.0 - pwcp(ji,jk,jwno3)    & 
    310             &                / ( pwcp(ji,jk,jwno3) + xksedno3 ) ) / ( zundsat(ji,jk) + xksedfeo ) 
    311             zsolid1 = zvolc(ji,jk,jspoc) * solcp(ji,jk,jspoc) 
    312             zsolid2 = zvolc(ji,jk,jspos) * solcp(ji,jk,jspos) 
    313             zsolid3 = zvolc(ji,jk,jspor) * solcp(ji,jk,jspor) 
    314             zkpoca = zkpoc(ji,jk) * zlimfeo(ji,jk) 
    315             zkpocb = zkpos(ji,jk) * zlimfeo(ji,jk) 
    316             zkpocc = zkpor(ji,jk) * zlimfeo(ji,jk) 
    317             zrearat1(ji,jk) = ( zkpoc(ji,jk) * dtsed2 * zsolid1 ) / & 
    318             &                    ( 1. + zkpoca * zundsat(ji,jk) * dtsed2 ) 
    319             zrearat2(ji,jk) = ( zkpos(ji,jk) * dtsed2 * zsolid2 ) / & 
    320             &                    ( 1. + zkpocb * zundsat(ji,jk) * dtsed2 ) 
    321             zrearat3(ji,jk) = ( zkpor(ji,jk) * dtsed2 * zsolid3 ) / & 
    322             &                    ( 1. + zkpocc * zundsat(ji,jk) * dtsed2 ) 
    323          END DO 
    324       END DO 
    325  
    326 !      DO jn = 1, 5 
    327       DO jk = 2, jpksed 
    328          DO ji = 1, jpoce 
    329 jflag3:     DO jn = 1, 10 
    330                zlimtmp = ( 1.0 - pwcp(ji,jk,jwoxy) * zlimo2(ji,jk) ) * ( 1.0 - pwcp(ji,jk,jwno3)    & 
    331                &                / ( pwcp(ji,jk,jwno3) + xksedno3 ) ) 
    332                zsolid1 = zvolc(ji,jk,jspoc) * solcp(ji,jk,jspoc) 
    333                zsolid2 = zvolc(ji,jk,jspos) * solcp(ji,jk,jspos) 
    334                zsolid3 = zvolc(ji,jk,jspor) * solcp(ji,jk,jspor) 
    335                zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) ) / zvolc(ji,jk,jsfeo) 
    336                zbeta   = xksedfeo - solcp(ji,jk,jsfeo) + 4.0 * zreasat * zlimtmp 
    337                zgamma  = -xksedfeo * solcp(ji,jk,jsfeo) 
    338                zundsat2 = zundsat(ji,jk) 
    339                zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
    340                zlimfeo(ji,jk) = ( 1.0 - pwcp(ji,jk,jwoxy) * zlimo2(ji,jk) ) * ( 1.0 - pwcp(ji,jk,jwno3)    & 
    341                &                / ( pwcp(ji,jk,jwno3) + xksedno3 ) ) / ( zundsat(ji,jk) + xksedfeo ) 
    342                zkpoca  = zkpoc(ji,jk) * zlimfeo(ji,jk) 
    343                zkpocb  = zkpos(ji,jk) * zlimfeo(ji,jk) 
    344                zkpocc  = zkpor(ji,jk) * zlimfeo(ji,jk) 
    345                zrearat1(ji,jk) = ( zkpoc(ji,jk) * dtsed2 * zsolid1 ) / & 
    346                &                    ( 1. + zkpoca * zundsat(ji,jk) * dtsed2 ) 
    347                zrearat2(ji,jk) = ( zkpos(ji,jk) * dtsed2 * zsolid2 ) / & 
    348                &                    ( 1. + zkpocb * zundsat(ji,jk) * dtsed2 ) 
    349                zrearat3(ji,jk) = ( zkpor(ji,jk) * dtsed2 * zsolid3 ) / & 
    350                &                    ( 1. + zkpocc * zundsat(ji,jk) * dtsed2 ) 
    351                IF ( ABS( (zundsat(ji,jk)-zundsat2)/( MAX(0.,zundsat2)+rtrn)) < 1E-8 ) THEN 
    352                   EXIT jflag3 
    353                ENDIF 
    354             END DO jflag3 
    355          END DO 
    356       END DO 
    357  
    358  
    359          ! New solid concentration values (jk=2 to jksed) for each couple  
    360       DO jk = 2, jpksed 
    361          DO ji = 1, jpoce 
    362             zreasat = zrearat1(ji,jk) * zlimfeo(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspoc) 
    363             solcp(ji,jk,jspoc) = solcp(ji,jk,jspoc) - zreasat 
    364             zreasat = zrearat2(ji,jk) * zlimfeo(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspos) 
    365             solcp(ji,jk,jspos) = solcp(ji,jk,jspos) - zreasat 
    366             zreasat = zrearat3(ji,jk) * zlimfeo(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspor) 
    367             solcp(ji,jk,jspor) = solcp(ji,jk,jspor) - zreasat 
    368          END DO 
    369       END DO 
    370  
    371       ! New dissolved concentrations 
    372       DO jk = 2, jpksed 
    373          DO ji = 1, jpoce 
    374             zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) ) * zlimfeo(ji,jk) * zundsat(ji,jk) 
     195            zlimtmp = 1.0 - zlimo2(ji,jk) - zlimno3(ji,jk) 
     196            zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) ) / zvolc(ji,jk,jsfeo) 
     197            zbeta   = xksedfeo - solcp(ji,jk,jsfeo) + 4.0 * zreasat * zlimtmp 
     198            zgamma  = -xksedfeo * solcp(ji,jk,jsfeo) 
     199            zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
     200            zlimfeo(ji,jk) = zlimtmp * zundsat(ji,jk) / ( zundsat(ji,jk) + xksedfeo ) 
     201            zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) ) * zlimfeo(ji,jk) 
     202 
    375203            ! For FEOH 
    376             solcp(ji,jk,jsfeo) = zundsat(ji,jk) 
    377             ! For DIC 
    378             pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
    379             zsumtot(ji) = zsumtot(ji) + zreasat / dtsed2 * volw3d(ji,jk) * 1.e-3 * 86400. * 365. * 1E3 
     204            solcp(ji,jk,jsfeo) = zundsat(ji,jk) + MIN(solcp(ji,jk,jsfeo), rtrn) 
     205 
    380206            ! For Phosphate (in mol/l) 
    381             pwcp(ji,jk,jwpo4)  = pwcp(ji,jk,jwpo4) + zreasat * ( spo4r + 4.0 * redfep ) 
    382             ! Ligands 
    383             sedligand(ji,jk)   = sedligand(ji,jk) + ratligc * zreasat 
    384             ! For iron (in mol/l) 
    385             pwcp(ji,jk,jwfe2)  = pwcp(ji,jk,jwfe2) + fecratio(ji) * zreasat 
     207            pwcp(ji,jk,jwpo4)  = pwcp(ji,jk,jwpo4) + zreasat * 4.0 * redfep 
     208 
    386209            ! For alkalinity 
    387             pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + zreasat * ( srno3 * zadsnh4 - 2.* spo4r ) + 8.0 * zreasat 
    388             ! Ammonium 
    389             pwcp(ji,jk,jwnh4)  = pwcp(ji,jk,jwnh4) + zreasat * srno3 * zadsnh4 
     210            pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + 8.0 * zreasat 
     211 
     212            ! Iron 
    390213            pwcp(ji,jk,jwfe2)  = pwcp(ji,jk,jwfe2) + zreasat * 4.0 
    391214         ENDDO 
    392215      ENDDO 
    393216 
    394       !-------------------------------------------------------------------- 
    395       ! Begining POC denitrification and NO3- diffusion 
    396       ! (indice n�5 for couple POC/NO3- ie solcp(:,:,jspoc)/pwcp(:,:,jwno3)) 
    397       !-------------------------------------------------------------------- 
    398  
    399       zrearat1(:,:) = 0. 
    400       zrearat2(:,:) = 0. 
    401       zrearat3(:,:) = 0. 
    402  
    403       zundsat(:,:) = pwcp(:,:,jwso4) 
     217!      !-------------------------------------------------------------------- 
     218!      ! Begining POC denitrification and NO3- diffusion 
     219!      ! (indice n�5 for couple POC/NO3- ie solcp(:,:,jspoc)/pwcp(:,:,jwno3)) 
     220!      !-------------------------------------------------------------------- 
     221! 
     222      zundsat(:,:) = MAX(0., pwcp(:,:,jwso4) - rtrn) 
    404223 
    405224      DO jk = 2, jpksed 
    406225         DO ji = 1, jpoce 
    407             zlimso4(ji,jk) = ( 1.0 - pwcp(ji,jk,jwoxy) * zlimo2(ji,jk) ) * ( 1.0 - pwcp(ji,jk,jwno3)    & 
    408             &                / ( pwcp(ji,jk,jwno3) + xksedno3 ) ) * ( 1. - solcp(ji,jk,jsfeo)  & 
    409             &                / ( solcp(ji,jk,jsfeo) + xksedfeo ) ) / ( zundsat(ji,jk) + xksedso4 ) 
    410             zsolid1 = zvolc(ji,jk,jspoc) * solcp(ji,jk,jspoc) 
    411             zsolid2 = zvolc(ji,jk,jspos) * solcp(ji,jk,jspos) 
    412             zsolid3 = zvolc(ji,jk,jspor) * solcp(ji,jk,jspor) 
    413             zkpoca = zkpoc(ji,jk) * zlimso4(ji,jk) 
    414             zkpocb = zkpos(ji,jk) * zlimso4(ji,jk) 
    415             zkpocc = zkpor(ji,jk) * zlimso4(ji,jk) 
    416             zrearat1(ji,jk)  = ( zkpoc(ji,jk) * dtsed2 * zsolid1 ) / & 
    417             &                 ( 1. + zkpoca * zundsat(ji,jk ) * dtsed2 ) 
    418             zrearat2(ji,jk)  = ( zkpos(ji,jk) * dtsed2 * zsolid2 ) / & 
    419             &                 ( 1. + zkpocb * zundsat(ji,jk ) * dtsed2 ) 
    420             zrearat3(ji,jk)  = ( zkpor(ji,jk) * dtsed2 * zsolid3 ) / & 
    421             &                 ( 1. + zkpocc * zundsat(ji,jk ) * dtsed2 ) 
    422         END DO 
    423       END DO 
    424 ! 
    425 !      DO jn = 1, 5  
    426       DO jk = 2, jpksed 
    427          DO ji = 1, jpoce 
    428 jflag4:     DO jn = 1, 10 
    429                zlimtmp = ( 1.0 - pwcp(ji,jk,jwoxy) * zlimo2(ji,jk) ) * ( 1.0 - pwcp(ji,jk,jwno3)    & 
    430                &         / ( pwcp(ji,jk,jwno3) + xksedno3 ) ) * ( 1. - solcp(ji,jk,jsfeo)  & 
    431                &         / ( solcp(ji,jk,jsfeo) + xksedfeo ) )  
    432                zsolid1 = zvolc(ji,jk,jspoc) * solcp(ji,jk,jspoc) 
    433                zsolid2 = zvolc(ji,jk,jspos) * solcp(ji,jk,jspos) 
    434                zsolid3 = zvolc(ji,jk,jspor) * solcp(ji,jk,jspor) 
    435                zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) )  
    436                zbeta   = xksedso4 - pwcp(ji,jk,jwso4) + 0.5 * zreasat * zlimtmp 
    437                zgamma = - xksedso4 * pwcp(ji,jk,jwso4) 
    438                zundsat2 = zundsat(ji,jk) 
    439                zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
    440                zlimso4(ji,jk) = ( 1.0 - pwcp(ji,jk,jwoxy) * zlimo2(ji,jk) ) * ( 1.0 - pwcp(ji,jk,jwno3)    & 
    441                &                / ( pwcp(ji,jk,jwno3) + xksedno3 ) ) * ( 1. - solcp(ji,jk,jsfeo)  & 
    442                &                / ( solcp(ji,jk,jsfeo) + xksedfeo ) ) / ( zundsat(ji,jk) + xksedso4 ) 
    443                zkpoca  = zkpoc(ji,jk) * zlimso4(ji,jk) 
    444                zkpocb  = zkpos(ji,jk) * zlimso4(ji,jk) 
    445                zkpocc  = zkpor(ji,jk) * zlimso4(ji,jk) 
    446                zrearat1(ji,jk)  = ( zkpoc(ji,jk) * dtsed2 * zsolid1 ) / & 
    447                &                 ( 1. + zkpoca * zundsat(ji,jk ) * dtsed2 ) 
    448                zrearat2(ji,jk)  = ( zkpos(ji,jk) * dtsed2 * zsolid2 ) / & 
    449                &                 ( 1. + zkpocb * zundsat(ji,jk ) * dtsed2 ) 
    450                zrearat3(ji,jk)  = ( zkpor(ji,jk) * dtsed2 * zsolid3 ) / & 
    451                &                 ( 1. + zkpocc * zundsat(ji,jk ) * dtsed2 ) 
    452                IF ( ABS( (zundsat(ji,jk)-zundsat2)/(zundsat2+rtrn)) < 1E-8 ) THEN 
    453                   EXIT jflag4 
    454                ENDIF 
    455             END DO jflag4 
    456          END DO 
    457       END DO 
    458  
    459      ! New solid concentration values (jk=2 to jksed) for each couple  
    460       DO jk = 2, jpksed 
    461          DO ji = 1, jpoce 
    462             zreasat = zrearat1(ji,jk) * zlimso4(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspoc) 
    463             solcp(ji,jk,jspoc) = solcp(ji,jk,jspoc) - zreasat 
    464             zreasat = zrearat2(ji,jk) * zlimso4(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspos) 
    465             solcp(ji,jk,jspos) = solcp(ji,jk,jspos) - zreasat 
    466             zreasat = zrearat3(ji,jk) * zlimso4(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jspor) 
    467             solcp(ji,jk,jspor) = solcp(ji,jk,jspor) - zreasat 
    468          ENDDO 
    469       ENDDO 
    470 ! 
    471       ! New dissolved concentrations 
    472       DO jk = 2, jpksed 
    473          DO ji = 1, jpoce 
     226            zlimtmp = 1.0 - zlimo2(ji,jk) - zlimno3(ji,jk) - zlimfeo(ji,jk) 
     227            zreasat = zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) 
     228            zbeta   = xksedso4 - pwcp(ji,jk,jwso4) + 0.5 * zreasat * zlimtmp 
     229            zgamma = - xksedso4 * pwcp(ji,jk,jwso4) 
     230            zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
     231            zlimso4(ji,jk) = zlimtmp * zundsat(ji,jk) / ( zundsat(ji,jk) + xksedso4 ) 
     232 
    474233            ! For sulfur 
    475             pwcp(ji,jk,jwh2s)  = pwcp(ji,jk,jwh2s) - ( zundsat(ji,jk) - pwcp(ji,jk,jwso4) )  
    476             pwcp(ji,jk,jwso4)  =  zundsat(ji,jk) 
    477             zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) ) * zlimso4(ji,jk) * zundsat(ji,jk) 
    478             ! For DIC 
    479             pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
    480             zsumtot(ji) = zsumtot(ji) + zreasat / dtsed2 * volw3d(ji,jk) * 1.e-3 * 86400. * 365. * 1E3 
    481             ! For Phosphate (in mol/l) 
    482             pwcp(ji,jk,jwpo4)  = pwcp(ji,jk,jwpo4) + zreasat * spo4r 
    483             ! Ligands 
    484             sedligand(ji,jk)   = sedligand(ji,jk) + ratligc * zreasat 
    485             ! For iron (in mol/l) 
    486             pwcp(ji,jk,jwfe2)  = pwcp(ji,jk,jwfe2) + fecratio(ji) * zreasat 
     234            pwcp(ji,jk,jwso4)  =  zundsat(ji,jk) + MIN(pwcp(ji,jk,jwso4), rtrn) 
     235            zreasat = zreasat * zlimso4(ji,jk) 
     236            pwcp(ji,jk,jwh2s)  = pwcp(ji,jk,jwh2s) + 0.5 * zreasat 
     237 
    487238            ! For alkalinity 
    488             pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + zreasat * ( srno3 * zadsnh4 - 2.* spo4r ) + zreasat 
    489             ! Ammonium 
    490             pwcp(ji,jk,jwnh4)  = pwcp(ji,jk,jwnh4) + zreasat * srno3 * zadsnh4 
     239            pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + zreasat 
    491240         ENDDO 
    492241      ENDDO 
     
    496245     ! Patankar scheme 
    497246      ! ------------------------------------------------------------------------------ 
    498  
    499247      call sed_dsr_redoxb 
    500248 
     
    564312      !! Arguments 
    565313      ! --- local variables 
    566       INTEGER   ::  ji, jk, jn   ! dummy looop indices 
     314      INTEGER   ::  ji, jk, jn, jw   ! dummy looop indices 
    567315 
    568316      REAL, DIMENSION(6)  :: zsedtrn, zsedtra 
     
    582330            zsedtrn(5)  = solcp(ji,jk,jsfeo) * zvolc(ji,jk,jsfeo) 
    583331            zsedtrn(6)  = solcp(ji,jk,jsfes) * zvolc(ji,jk,jsfes) 
    584             zsedtra(:)  = zsedtrn(:)  
     332            zsedtra(:)  = MAX(0., zsedtrn(:) - rtrn ) 
    585333 
    586334            ! First pass of the scheme. At the end, it is 1st order  
     
    592340            zdelta = pwcp(ji,jk,jwpo4) - redfep * zsedtra(4) 
    593341            IF ( zalpha == 0. ) THEN 
    594                zsedtra(4) = zsedtra(4) / ( 1.0 + zsedtra(4) * reac_fe2 * dtsed2 / 2.0 ) 
    595             ELSE 
    596                zsedtra(4) = ( zsedtra(4) * zalpha ) / ( 0.25 * zsedtra(4) * ( exp( reac_fe2 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
     342               zsedtra(4) = zsedtra(4) / ( 1.0 + 0.25 * zsedtra(4) * reac_fe2 * dtsed2 / 2.0 ) 
     343            ELSE 
     344               zsedtra(4) = ( zsedtra(4) * zalpha ) / ( 0.25 * zsedtra(4)    & 
     345               &            * ( exp( reac_fe2 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    597346               &            + zalpha * exp( reac_fe2 * zalpha * dtsed2 / 2. ) ) 
    598347            ENDIF 
    599             zsedtra(1) = zalpha + 0.25 * zsedtra(4)  
     348            zsedtra(1) = zalpha + 0.25 * zsedtra(4) 
    600349            zsedtra(5) = zbeta  - zsedtra(4) 
    601350            pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(4) 
     
    606355            zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(2) 
    607356            IF ( zalpha == 0. ) THEN 
    608                zsedtra(2) = zsedtra(2) / ( 1.0 + zsedtra(2) * reac_h2s * dtsed2 / 2.0 ) 
     357               zsedtra(2) = zsedtra(2) / ( 1.0 + 2.0 * zsedtra(2) * reac_h2s * dtsed2 / 2.0 ) 
    609358            ELSE 
    610359               zsedtra(2) = ( zsedtra(2) * zalpha ) / ( 2.0 * zsedtra(2) * ( exp( reac_h2s * zalpha * dtsed2 / 2. ) - 1.0 )  & 
     
    615364            pwcp(ji,jk,jwso4) = zbeta - zsedtra(2) 
    616365            ! NH4 + O2 
    617             zalpha = zsedtra(1) - 2.0 * zsedtra(3) 
    618             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(3) 
    619             IF ( zalpha == 0. ) THEN 
    620                zsedtra(3) = zsedtra(3) / ( 1.0 + zsedtra(3) * reac_nh4 * zadsnh4 * dtsed2 / 2.0 ) 
    621             ELSE 
    622                zsedtra(3) = ( zsedtra(3) * zalpha ) / ( 2.0 * zsedtra(3) * ( exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    623                &            + zalpha * exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 /2. ) ) 
    624             ENDIF 
    625             zsedtra(1) = zalpha + 2.0 * zsedtra(3) 
    626             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(3) 
     366            zalpha = zsedtra(1) - 2.0 * zsedtra(3) / zadsnh4  
     367            zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(3) /zadsnh4  
     368            IF ( zalpha == 0. ) THEN 
     369               zsedtra(3) = zsedtra(3) / ( 1.0 + 2.0 * zsedtra(3) * reac_nh4 / zadsnh4 * dtsed2 / 2.0 ) 
     370            ELSE 
     371               zsedtra(3) = ( zsedtra(3) * zalpha * zadsnh4 ) / ( 2.0 * zsedtra(3) * ( exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
     372               &            + zalpha * zadsnh4 * exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 /2. ) ) 
     373            ENDIF 
     374            zsedtra(1) = zalpha + 2.0 * zsedtra(3) / zadsnh4  
     375            pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(3) / zadsnh4  
    627376            ! FeS - O2 
    628377            zalpha = zsedtra(1) - 2.0 * zsedtra(6) 
     
    630379            zgamma = pwcp(ji,jk,jwso4) + zsedtra(6) 
    631380            IF ( zalpha == 0. ) THEN 
    632                zsedtra(6) = zsedtra(6) / ( 1.0 + zsedtra(6) * reac_feso * dtsed2 / 2.0 ) 
     381               zsedtra(6) = zsedtra(6) / ( 1.0 + 2.0 * zsedtra(6) * reac_feso * dtsed2 / 2.0 ) 
    633382            ELSE 
    634383               zsedtra(6) = ( zsedtra(6) * zalpha ) / ( 2.0 * zsedtra(6) * ( exp( reac_feso * zalpha * dtsed2 / 2. ) - 1.0 )  & 
     
    658407            zepsi  = pwcp(ji,jk,jwpo4) + redfep * zsedtra(5) 
    659408            IF ( zalpha == 0. ) THEN 
    660                zsedtra(2) = zsedtra(2) / ( 1.0 + zsedtra(2) * reac_feh2s * dtsed2 ) 
     409               zsedtra(2) = zsedtra(2) / ( 1.0 + 2.0 * zsedtra(2) * reac_feh2s * dtsed2 ) 
    661410            ELSE 
    662411               zsedtra(2) = ( zsedtra(2) * zalpha ) / ( 2.0 * zsedtra(2) * ( exp( reac_feh2s * zalpha * dtsed2 ) - 1.0 )  & 
     
    668417            pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(4) 
    669418            pwcp(ji,jk,jwpo4) = zepsi - redfep * zsedtra(5) 
    670             ! Fe - H2S 
     419           ! Fe - H2S 
    671420            zalpha = zsedtra(2) - zsedtra(4) 
    672421            zbeta  = zsedtra(4) + zsedtra(6) 
     
    686435            zgamma = pwcp(ji,jk,jwso4) + zsedtra(6) 
    687436            IF (zalpha == 0.) THEN 
    688                zsedtra(6) = zsedtra(6) / ( 1.0 + zsedtra(6) * reac_feso * dtsed2 / 2. ) 
     437               zsedtra(6) = zsedtra(6) / ( 1.0 + 2.0 * zsedtra(6) * reac_feso * dtsed2 / 2. ) 
    689438            ELSE 
    690439               zsedtra(6) = ( zsedtra(6) * zalpha ) / ( 2.0 * zsedtra(6) * ( exp( reac_feso * zalpha * dtsed2 / 2. ) - 1.0 )  & 
     
    694443            zsedtra(4) = zbeta  - zsedtra(6) 
    695444            pwcp(ji,jk,jwso4) = zgamma - zsedtra(6) 
     445 
    696446            ! NH4 + O2 
    697             zalpha = zsedtra(1) - 2.0 * zsedtra(3) 
    698             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(3) 
    699             IF (zalpha == 0.) THEN 
    700                zsedtra(3) = zsedtra(3) / ( 1.0 + zsedtra(3) * reac_nh4 * zadsnh4 * dtsed2 / 2.0)  
    701             ELSE 
    702                zsedtra(3) = ( zsedtra(3) * zalpha ) / ( 2.0 * zsedtra(3) * ( exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    703                &            + zalpha * exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 /2. ) ) 
    704             ENDIF 
    705             zsedtra(1) = zalpha + 2.0 * zsedtra(3) 
    706             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(3) 
     447            zalpha = zsedtra(1) - 2.0 * zsedtra(3) / zadsnh4  
     448            zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(3) / zadsnh4  
     449            IF ( zalpha == 0. ) THEN 
     450               zsedtra(3) = zsedtra(3) / ( 1.0 + 2.0 * zsedtra(3) * reac_nh4 / zadsnh4 * dtsed2 / 2.0 ) 
     451            ELSE 
     452               zsedtra(3) = ( zsedtra(3) * zalpha * zadsnh4 ) / ( 2.0 * zsedtra(3) * ( exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
     453               &            + zalpha * zadsnh4 * exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 /2. ) ) 
     454            ENDIF 
     455            zsedtra(1) = zalpha + 2.0 * zsedtra(3) / zadsnh4  
     456            pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(3) / zadsnh4  
    707457            ! H2S + O2 
    708458            zalpha = zsedtra(1) - 2.0 * zsedtra(2) 
     
    710460            zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(2) 
    711461            IF ( zalpha == 0. ) THEN 
    712                zsedtra(2) = zsedtra(2) / ( 1.0 + zsedtra(2) * reac_h2s * dtsed2 / 2.0 ) 
     462               zsedtra(2) = zsedtra(2) / ( 1.0 + 2.0 * zsedtra(2) * reac_h2s * dtsed2 / 2.0 ) 
    713463            ELSE 
    714464               zsedtra(2) = ( zsedtra(2) * zalpha ) / ( 2.0 * zsedtra(2) * ( exp( reac_h2s * zalpha * dtsed2 / 2. ) - 1.0 )  & 
     
    718468            pwcp(ji,jk,jwso4) = zbeta - zsedtra(2) 
    719469            pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(2) 
     470 
    720471            ! Fe + O2 
    721472            zalpha = zsedtra(1) - 0.25 * zsedtra(4) 
     
    724475            zdelta = pwcp(ji,jk,jwpo4) - redfep * zsedtra(4) 
    725476            IF ( zalpha == 0. ) THEN 
    726                zsedtra(4) = zsedtra(4) / ( 1.0 + zsedtra(4) * reac_fe2 * dtsed2 / 2.0 ) 
    727             ELSE 
    728                zsedtra(4) = ( zsedtra(4) * zalpha ) / ( 0.25 * zsedtra(4) * ( exp( reac_fe2 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
     477               zsedtra(4) = zsedtra(4) / ( 1.0 + 0.25 * zsedtra(4) * reac_fe2 * dtsed2 / 2.0 ) 
     478            ELSE 
     479               zsedtra(4) = ( zsedtra(4) * zalpha ) / ( 0.25 * zsedtra(4)     & 
     480               &            * ( exp( reac_fe2  * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    729481               &            + zalpha * exp( reac_fe2 * zalpha * dtsed2 / 2. ) ) 
    730482            ENDIF 
     
    733485            pwcp(ji,jk,jwpo4) = zdelta + redfep * zsedtra(4) 
    734486            pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(4) 
     487 
     488            ! Update the concentrations after the secondary reactions  
     489            zsedtra(:) = zsedtra(:) + MIN( zsedtrn(:), rtrn ) 
    735490            pwcp(ji,jk,jwoxy)  = zsedtra(1) 
    736491            pwcp(ji,jk,jwh2s)  = zsedtra(2) 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/seddta.F90

    r13295 r14385  
    5353 
    5454      REAL(wp), DIMENSION(jpoce) :: zdtap, zdtag 
    55       REAL(wp), DIMENSION(jpi,jpj) :: zwsbio4, zwsbio3 
     55      REAL(wp), DIMENSION(jpi,jpj) :: zwsbio4, zwsbio3, zddust 
    5656      REAL(wp) :: zf0, zf1, zf2, zkapp, zratio, zdep 
    5757 
     
    8080!         conv2   = 1.0e+3 / ( 1.0e+4 * rsecday * 30. ) 
    8181         conv2 = 1.0e+3 /  1.0e+4  
    82          rdtsed(2:jpksed) = dtsed / ( denssol * por1(2:jpksed) ) 
    8382      ENDIF 
    8483 
     
    8685      zdtap(:)    = 0.  
    8786      zdtag(:)    = 0.   
     87      zddust(:,:) = 0.0 
    8888 
    8989      ! reading variables 
     
    156156!        zf1    = MIN(0.98, MAX(0., zf1 ) ) 
    157157         zf1    = 0.48 
    158          zf0    = 1.0 - 0.02 - zf1 
    159158         zf2    = 0.02 
     159         zf0    = 1.0 - zf2 - zf1 
    160160         rainrm_dta(ji,jspoc) =   ( zdtap(ji) +  zdtag(ji) ) * 1e-4 * zf0 
    161161         rainrm_dta(ji,jspos) =   ( zdtap(ji) +  zdtag(ji) ) * 1e-4 * zf1 
    162162         rainrm_dta(ji,jspor) =   ( zdtap(ji) +  zdtag(ji) ) * 1e-4 * zf2 
    163163      END DO 
     164 
    164165      !  Sinking fluxes for Calcite in mol.m-2.s-1 ; conversion in mol.cm-2.s-1 
    165166      CALL pack_arr ( jpoce,  rainrm_dta(1:jpoce,jscal), trc_data(1:jpi,1:jpj,14), iarroce(1:jpoce) ) 
     
    175176      rainrm_dta(1:jpoce,jsclay) = rainrm_dta(1:jpoce,jsclay) * conv2 / mol_wgt(jsclay)   & 
    176177      &                            + wacc(1:jpoce) * por1(2) * denssol / mol_wgt(jsclay) / ( rsecday * 365.0 ) 
    177       rainrm_dta(1:jpoce,jsclay) = rainrm_dta(1:jpoce,jsclay) * 0.965 
    178       rainrm_dta(1:jpoce,jsfeo)  = rainrm_dta(1:jpoce,jsclay) * mol_wgt(jsclay) / mol_wgt(jsfeo) * 0.035 / 0.965 
     178      rainrm_dta(1:jpoce,jsfeo)  = rainrm_dta(1:jpoce,jsclay) * mol_wgt(jsclay) / mol_wgt(jsfeo) * 0.035 * 0.5 * 0.333 
     179      rainrm_dta(1:jpoce,jsclay) = rainrm_dta(1:jpoce,jsclay) * (1.0 - 0.035 * 0.5 * 0.333 ) 
     180      CALL unpack_arr ( jpoce, zddust(1:jpi,1:jpj), iarroce(1:jpoce), wacc(1:jpoce) ) 
     181      zddust(:,:) = dust(:,:) + zddust(:,:) / ( rsecday * 365.0 ) * por1(2) * denssol / conv2 
     182 
    179183!    rainrm_dta(1:jpoce,jsclay) = 1.0E-4 * conv2 / mol_wgt(jsclay) 
    180184 
     
    209213 
    210214      ! computation of dzdep = total thickness of solid material rained [cm] in each cell 
    211       dzdep(1:jpoce) = raintg(1:jpoce) * rdtsed(2)  
     215      dzdep(1:jpoce) = raintg(1:jpoce) * dtsed / ( denssol * por1(2) ) 
    212216 
    213217      IF( lk_iomput ) THEN 
    214           IF( iom_use("sflxclay" ) ) CALL iom_put( "sflxclay", dust(:,:) * conv2 * 1E4 ) 
    215           IF( iom_use("sflxcal" ) )  CALL iom_put( "sflxcal", trc_data(:,:,13) ) 
    216           IF( iom_use("sflxbsi" ) )  CALL iom_put( "sflxbsi", trc_data(:,:,10) ) 
    217           IF( iom_use("sflxpoc" ) )  CALL iom_put( "sflxpoc", trc_data(:,:,11) + trc_data(:,:,12) ) 
     218          IF( iom_use("sflxclay" ) ) CALL iom_put( "sflxclay", zddust(:,:) * 1E3 / 1.E4 ) 
     219          IF( iom_use("sflxcal" ) )  CALL iom_put( "sflxcal", trc_data(:,:,14) / 1.E4 ) 
     220          IF( iom_use("sflxbsi" ) )  CALL iom_put( "sflxbsi", trc_data(:,:,11) / 1.E4 ) 
     221          IF( iom_use("sflxpoc" ) )  CALL iom_put( "sflxpoc", ( trc_data(:,:,12) + trc_data(:,:,13) ) / 1.E4 ) 
    218222      ENDIF 
    219223 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedini.F90

    r14086 r14385  
    4343 
    4444   REAL(wp), PUBLIC    ::  & 
    45       redO2    =  172.  ,  &  !: Redfield coef for Oxygen 
     45      redO2    =  133.  ,  &  !: Redfield coef for Oxygen 
    4646      redNo3   =   16.  ,  &  !: Redfield coef for Nitrate 
    4747      redPo4   =    1.  ,  &  !: Redfield coef for Phosphate 
     
    7373 
    7474   REAL(wp), DIMENSION(jpwat), PUBLIC  :: diff1 
    75    DATA diff1/4.59E-6, 1.104E-5, 4.81E-6 , 9.78E-6, 3.58E-6, 4.01E-6, 9.8E-6, 9.73E-6, 5.0E-6, 3.31E-6 / 
     75   DATA diff1/4.59E-6, 1.104E-5, 4.81E-6 , 9.78E-6, 3.58E-6, 4.81E-6, 9.8E-6, 9.73E-6, 5.0E-6, 3.31E-6 / 
    7676 
    7777   REAL(wp), DIMENSION(jpwat), PUBLIC  :: diff2 
    78    DATA diff2/1.74E-7, 4.47E-7, 2.51E-7, 3.89E-7, 1.77E-7, 2.5E-7, 3.89E-7, 3.06E-7, 2.5E-7, 1.5E-7 / 
     78   DATA diff2/1.74E-7, 4.47E-7, 2.51E-7, 3.89E-7, 1.77E-7, 2.51E-7, 3.89E-7, 3.06E-7, 2.5E-7, 1.5E-7 / 
    7979 
    8080 
     
    162162      ALLOCATE( diff(jpoce,jpksed,jpwat ) )  ;  ALLOCATE( irrig(jpoce, jpksed) ) 
    163163      ALLOCATE( wacc(jpoce) )                ;  ALLOCATE( fecratio(jpoce) ) 
    164       ALLOCATE( press(jpoce) )               ;  ALLOCATE( densSW(jpoce) )  
    165164      ALLOCATE( hipor(jpoce,jpksed) )        ;  ALLOCATE( co3por(jpoce,jpksed) ) 
    166165      ALLOCATE( dz3d(jpoce,jpksed) )         ;  ALLOCATE( volw3d(jpoce,jpksed) )       ;  ALLOCATE( vols3d(jpoce,jpksed) ) 
    167       ALLOCATE( sedligand(jpoce, jpksed) ) 
     166      ALLOCATE( sedligand(jpoce, jpksed) )   ;  ALLOCATE( saturco3(jpoce,jpksed) )  ;  ALLOCATE( densSW(jpoce) ) 
    168167 
    169168      ! Initialization of global variables 
    170       pwcp  (:,:,:) = 0.   ;  pwcp0 (:,:,:) = 0.  ; pwcp_dta  (:,:) = 0.   
    171       solcp (:,:,:) = 0.   ;  solcp0(:,:,:) = 0.  ; rainrm_dta(:,:) = 0. 
    172       rainrm(:,:  ) = 0.   ;  rainrg(:,:  ) = 0.  ; raintg    (:  ) = 0.  
    173       dzdep (:    ) = 0.   ;  iarroce(:   ) = 0   ; dzkbot    (:  ) = 0. 
    174       temp  (:    ) = 0.   ;  salt   (:   ) = 0.  ; zkbot     (:  ) = 0. 
    175       press (:    ) = 0.   ;  densSW (:   ) = 0.  ; db        (:,:) = 0.  
    176       hipor (:,:  ) = 0.   ;  co3por (:,: ) = 0.  ; irrig     (:,:) = 0.  
    177       dz3d  (:,:  ) = 0.   ;  volw3d (:,: ) = 0.  ; vols3d    (:,:) = 0.  
     169      pwcp  (:,:,:) = 0.   ;  pwcp0  (:,:,:) = 0.  ; pwcp_dta  (:,:) = 0.   
     170      solcp (:,:,:) = 0.   ;  solcp0 (:,:,:) = 0.  ; rainrm_dta(:,:) = 0. 
     171      rainrm(:,:  ) = 0.   ;  rainrg (:,:  ) = 0.  ; raintg    (:  ) = 0.  
     172      dzdep (:    ) = 0.   ;  iarroce(:   )  = 0   ; dzkbot    (:  ) = 0. 
     173      temp  (:    ) = 0.   ;  salt   (:   )  = 0.  ; zkbot     (:  ) = 0. 
     174      db    (:,:  ) = 0.   ;  densSW (:   ) = 0.  
     175      hipor (:,:  ) = 0.   ;  co3por (:,: )  = 0.  ; irrig     (:,:) = 0.  
     176      dz3d  (:,:  ) = 0.   ;  volw3d (:,: )  = 0.  ; vols3d    (:,:) = 0.  
    178177      fecratio(:)   = 1E-5  
    179178      sedligand(:,:) = 0.6E-9 
    180179 
    181180      ! Chemical variables       
    182       ALLOCATE( akbs  (jpoce) )  ;  ALLOCATE( ak1s   (jpoce) )  ;  ALLOCATE( ak2s  (jpoce) ) ;  ALLOCATE( akws  (jpoce) )      
    183       ALLOCATE( ak1ps (jpoce) )  ;  ALLOCATE( ak2ps  (jpoce) )  ;  ALLOCATE( ak3ps (jpoce) ) ;  ALLOCATE( aksis (jpoce) )     
    184       ALLOCATE( aksps (jpoce) )  ;  ALLOCATE( ak12s  (jpoce) )  ;  ALLOCATE( ak12ps(jpoce) ) ;  ALLOCATE( ak123ps(jpoce) )     
    185       ALLOCATE( borats(jpoce) )  ;  ALLOCATE( calcon2(jpoce) )  ;  ALLOCATE( sieqs (jpoce) )  
     181      ALLOCATE( akbs  (jpoce) )  ;  ALLOCATE( ak1s   (jpoce) )  ;  ALLOCATE( ak2s  (jpoce) ) ;  ALLOCATE( akws  (jpoce) ) 
     182      ALLOCATE( ak1ps (jpoce) )  ;  ALLOCATE( ak2ps  (jpoce) )  ;  ALLOCATE( ak3ps (jpoce) ) ;  ALLOCATE( aksis (jpoce) ) 
     183      ALLOCATE( aksps (jpoce) )  ;  ALLOCATE( ak12s  (jpoce) )  ;  ALLOCATE( ak12ps(jpoce) ) ;  ALLOCATE( ak123ps(jpoce) ) 
     184      ALLOCATE( borats(jpoce) )  ;  ALLOCATE( calcon2(jpoce) )  ;  ALLOCATE( sieqs (jpoce) ) 
    186185      ALLOCATE( aks3s(jpoce) )   ;  ALLOCATE( akf3s(jpoce) )    ;  ALLOCATE( sulfats(jpoce) ) 
    187186      ALLOCATE( fluorids(jpoce) ) 
     
    194193 
    195194      ! Mass balance calculation   
    196       ALLOCATE( fromsed(jpoce, jpsol) ) ; ALLOCATE( tosed(jpoce, jpsol) ) ;  ALLOCATE( rloss(jpoce, jpsol) ) 
    197       ALLOCATE( tokbot (jpoce, jpwat) )  
    198  
    199       fromsed(:,:) = 0.    ;   tosed(:,:) = 0. ;  rloss(:,:) = 0.  ;   tokbot(:,:) = 0.  
     195      ALLOCATE( fromsed(jpoce, jpsol) ) ; ALLOCATE( tosed(jpoce, jpsol) ) 
     196 
     197      fromsed(:,:) = 0.    ;   tosed(:,:) = 0. 
    200198 
    201199      ! Initialization of sediment geometry 
     
    218216      ! -------------------------------- 
    219217      IF (ln_sediment_offline) THEN 
    220          CALL trc_dta_ini(jptra) 
    221218         CALL trc_dmp_sed_ini 
    222219      ENDIF 
     
    370367      denssol = 2.6 
    371368 
    372       ! Initialization of diffusion coefficient as function of porosity [cm**2/s] 
    373       !-------------------------------------------------------------------- 
    374 !      DO jn = 1, jpsol 
    375 !         DO jk = 1, jpksed 
    376 !            DO ji = 1, jpoce 
    377 !               diff(ji,jk,jn) = dcoef / ( 1.0 - 2.0 * log(por(jk)) ) 
    378 !            END DO 
    379 !         END DO 
    380 !      END DO 
    381  
    382369      ! Accumulation rate from Burwicz et al. (2011). This is used to 
    383370      ! compute the flux of clays and minerals 
     
    386373          ztmp1 = 0.117 / ( 1.0 + ( zkbot(ji) / 200.)**3 ) 
    387374          ztmp2 = 0.006 / ( 1.0 + ( zkbot(ji) / 4000.)**10 ) 
    388           wacc(ji) = ztmp1 + ztmp2 
     375          wacc(ji) = (ztmp1 + ztmp2)/10.0 
     376          wacc(ji) = ztmp2 / 10.0 
    389377      END DO 
    390378 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedinorg.F90

    r12839 r14385  
    2323CONTAINS 
    2424    
    25    SUBROUTINE sed_inorg( kt )  
     25   SUBROUTINE sed_inorg( kt, knt )  
    2626      !!---------------------------------------------------------------------- 
    2727      !!                   ***  ROUTINE sed_inorg  *** 
     
    4646      !!---------------------------------------------------------------------- 
    4747      !! Arguments 
    48       INTEGER, INTENT(in) ::   kt       ! number of iteration 
     48      INTEGER, INTENT(in) ::   kt, knt       ! number of iteration 
    4949      ! --- local variables 
    5050      INTEGER :: ji, jk, js, jw         ! dummy looop indices 
     
    5454      REAL(wp), DIMENSION(jpoce,jpksed,jpsol) :: zvolc    ! temp. variables 
    5555      REAL(wp), DIMENSION(jpoce) :: zsieq 
    56       REAL(wp)  ::  zsolid1, zvolw, zreasat 
     56      REAL(wp)  ::  zsolid1, zvolw, zreasat, zbeta, zgamma 
    5757      REAL(wp)  ::  zsatur, zsatur2, znusil, zsolcpcl, zsolcpsi 
    5858      !! 
     
    6161      IF( ln_timing )  CALL timing_start('sed_inorg') 
    6262! 
    63       IF( kt == nitsed000 ) THEN 
     63      IF( kt == nitsed000 .AND. knt == 1 ) THEN 
    6464         IF (lwp) THEN 
    6565            WRITE(numsed,*) ' sed_inorg : Dissolution reaction ' 
     
    7373       
    7474      zrearat1(:,:) = 0.    ;   zundsat(:,:)  = 0.  
    75       zrearat2(:,:) = 0.    ;   zrearat2(:,:) = 0. 
     75      zrearat2(:,:) = 0. 
    7676      zco3eq(:)     = rtrn 
    7777      zvolc(:,:,:)  = 0. 
     
    8686         zsolcpsi = 0.0 
    8787         DO jk = 1, jpksed 
    88             zsolcpsi = zsolcpsi + solcp(ji,jk,jsopal) * dz(jk) 
    89             zsolcpcl = zsolcpcl + solcp(ji,jk,jsclay) * dz(jk) 
     88            zsolcpsi = zsolcpsi + solcp(ji,jk,jsopal) * vols3d(ji,jk) 
     89            zsolcpcl = zsolcpcl + solcp(ji,jk,jsclay) * vols3d(ji,jk) 
    9090         END DO 
    9191         zsolcpsi = MAX( zsolcpsi, rtrn ) 
     
    135135      DO jk = 2, jpksed 
    136136         DO ji = 1, jpoce 
    137             zsolid1 = zvolc(ji,jk,jsopal) * solcp(ji,jk,jsopal) 
    138             zsatur = MAX(0., zundsat(ji,jk) / zsieq(ji) ) 
    139             zsatur2 = (1.0 + temp(ji) / 400.0 )**37 
    140             znusil = ( 0.225 * ( 1.0 + temp(ji) / 15.) + 0.775 * zsatur2 * zsatur**2.25 ) / zsieq(ji) 
    141             zrearat1(ji,jk)  = ( reac_sil * znusil * dtsed * zsolid1 ) / & 
    142                &                ( 1. + reac_sil * znusil * dtsed * zundsat(ji,jk) ) 
    143          ENDDO 
    144       ENDDO 
    145  
    146       CALL sed_mat( jwsil, jpoce, jpksed, zrearat1, zrearat2, zundsat, dtsed ) 
    147  
    148       ! New solid concentration values (jk=2 to jksed) for each couple  
    149       DO jk = 2, jpksed 
    150          DO ji = 1, jpoce 
    151             zreasat = zrearat1(ji,jk) * zundsat(ji,jk) / ( zvolc(ji,jk,jsopal) ) 
    152             solcp(ji,jk,jsopal) = solcp(ji,jk,jsopal) - zreasat 
    153          ENDDO 
    154       ENDDO 
    155  
    156       ! New pore water concentrations     
    157       DO jk = 1, jpksed 
    158          DO ji = 1, jpoce 
    159             ! Acid Silicic  
    160             pwcp(ji,jk,jwsil)  = zsieq(ji) - zundsat(ji,jk) 
     137            IF ( zundsat(ji,jk) > 0. ) THEN 
     138               zsolid1 = zvolc(ji,jk,jsopal) * solcp(ji,jk,jsopal) 
     139               zsatur = zundsat(ji,jk) / zsieq(ji) 
     140               zsatur2 = (1.0 + temp(ji) / 400.0 )**37 
     141               znusil = ( 0.225 * ( 1.0 + temp(ji) / 15.) + 0.775 * zsatur2 * zsatur**8.25 ) / zsieq(ji) 
     142               zbeta = 1.0 - reac_sil * znusil * dtsed2 * zundsat(ji,jk) + reac_sil * znusil * dtsed2 * zsolid1 
     143               zgamma = - reac_sil * znusil * dtsed2 * zundsat(ji,jk) 
     144               zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / ( 2.0 * reac_sil * znusil * dtsed2 ) 
     145               solcp(ji,jk,jsopal ) = zsolid1 / ( 1. + reac_sil * znusil * dtsed2 * zundsat(ji,jk) ) / zvolc(ji,jk,jsopal) 
     146               pwcp(ji,jk,jwsil) = zsieq(ji) - zundsat(ji,jk)  
     147            ENDIF 
    161148         ENDDO 
    162149      ENDDO 
     
    175162            zco3eq(ji)     = aksps(ji) * densSW(ji) * densSW(ji) / ( calcon2(ji) + rtrn ) 
    176163            zco3eq(ji)     = MAX( rtrn, zco3eq(ji) )  
    177             zundsat(ji,jk) = MAX(0., zco3eq(ji) - co3por(ji,jk) ) 
     164            zundsat(ji,jk) = ( zco3eq(ji) - co3por(ji,jk) ) / zco3eq(ji) 
     165            saturco3(ji,jk) = zundsat(ji,jk) 
    178166         ENDDO 
    179167      ENDDO 
     
    181169      DO jk = 2, jpksed 
    182170         DO ji = 1, jpoce 
    183             zsolid1 = zvolc(ji,jk,jscal) * solcp(ji,jk,jscal) 
    184             zrearat1(ji,jk) = ( reac_cal * dtsed * zsolid1 / zco3eq(ji) ) / & 
    185                   &               ( 1. + reac_cal * dtsed * zundsat(ji,jk) / zco3eq(ji) ) 
     171            IF ( zundsat(ji,jk) > 0. ) THEN 
     172               zsolid1 = zvolc(ji,jk,jscal) * solcp(ji,jk,jscal) 
     173               zbeta = 1.0 - reac_cal * dtsed2 * zundsat(ji,jk) + reac_cal * dtsed2 * zsolid1 
     174               zgamma = -reac_cal * dtsed2 * zundsat(ji,jk) 
     175               zundsat(ji,jk) = ( -zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / ( 2.0 * reac_cal * dtsed2 ) 
     176               saturco3(ji,jk) = zundsat(ji,jk) 
     177               zreasat = reac_cal * dtsed2 * zundsat(ji,jk) * zsolid1 / ( 1. + reac_cal * dtsed2 * zundsat(ji,jk) ) 
     178               solcp(ji,jk,jscal) = solcp(ji,jk,jscal) - zreasat / zvolc(ji,jk,jscal) 
     179               ! For DIC 
     180               pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
     181               ! For alkalinity 
     182               pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + 2.0 * zreasat 
     183            ENDIF 
    186184         END DO 
    187185      END DO 
    188  
    189       ! solves tridiagonal system 
    190       CALL sed_mat( jwdic, jpoce, jpksed, zrearat1, zrearat2, zundsat, dtsed ) 
    191  
    192       ! New solid concentration values (jk=2 to jksed) for cacO3 
    193       DO jk = 2, jpksed 
    194          DO ji = 1, jpoce 
    195             zreasat = zrearat1(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jscal) 
    196             solcp(ji,jk,jscal) = solcp(ji,jk,jscal) - zreasat 
    197          ENDDO 
    198       ENDDO 
    199  
    200       ! New dissolved concentrations 
    201       DO jk = 1, jpksed 
    202          DO ji = 1, jpoce 
    203             zreasat = zrearat1(ji,jk) * zundsat(ji,jk)     
    204             ! For DIC 
    205             pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
    206             ! For alkalinity 
    207             pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + 2.0 * zreasat  
    208          ENDDO 
    209       ENDDO 
    210  
    211       !------------------------------------------------- 
    212       ! Beginning DIC, Alkalinity  
    213       !------------------------------------------------- 
    214        
    215       DO jk = 1, jpksed 
    216          DO ji = 1, jpoce       
    217             zundsat(ji,jk)   = pwcp(ji,jk,jwdic) 
    218             zrearat1(ji,jk)  = 0. 
    219          ENDDO 
    220       ENDDO 
    221  
    222       ! solves tridiagonal system 
    223       CALL sed_mat( jwdic, jpoce, jpksed, zrearat1, zrearat2, zundsat, dtsed ) 
    224  
    225      ! New dissolved concentrations       
    226       DO jk = 1, jpksed 
    227          DO ji = 1, jpoce                       
    228             pwcp(ji,jk,jwdic) = zundsat(ji,jk) 
    229          ENDDO 
    230       ENDDO             
    231  
    232       !------------------------------------------------- 
    233       ! Beginning DIC, Alkalinity  
    234       !------------------------------------------------- 
    235  
    236       DO jk = 1, jpksed 
    237          DO ji = 1, jpoce 
    238             zundsat(ji,jk) = pwcp(ji,jk,jwalk) 
    239             zrearat1(ji,jk) = 0. 
    240          ENDDO 
    241       ENDDO 
    242 ! 
    243 !      ! solves tridiagonal system 
    244       CALL sed_mat( jwalk, jpoce, jpksed, zrearat1, zrearat2, zundsat, dtsed ) 
    245 ! 
    246 !      ! New dissolved concentrations       
    247       DO jk = 1, jpksed 
    248          DO ji = 1, jpoce 
    249             pwcp(ji,jk,jwalk) = zundsat(ji,jk) 
    250          ENDDO 
    251       ENDDO 
    252        
    253       !---------------------------------- 
    254       !   Back to initial geometry 
    255       !----------------------------- 
    256        
    257       !--------------------------------------------------------------------- 
    258       !   1/ Compensation for ajustement of the bottom water concentrations 
    259       !      (see note n° 1 about *por(2)) 
    260       !-------------------------------------------------------------------- 
    261       DO jw = 1, jpwat 
    262          DO ji = 1, jpoce 
    263             pwcp(ji,1,jw) = pwcp(ji,1,jw) + & 
    264                &            pwcp(ji,2,jw) * dzdep(ji) * por(2) / dzkbot(ji) 
    265          END DO 
    266       ENDDO 
    267        
    268       !----------------------------------------------------------------------- 
    269       !    2/ Det of new rainrg taking account of the new weight fraction obtained  
    270       !      in dz3d(2) after diffusion/reaction (react/diffu are also in dzdep!) 
    271       !      This new rain (rgntg rm) will be used in advection/burial routine 
    272       !------------------------------------------------------------------------ 
    273       DO js = 1, jpsol 
    274          DO ji = 1, jpoce 
    275             rainrg(ji,js) = raintg(ji) * solcp(ji,2,js) 
    276             rainrm(ji,js) = rainrg(ji,js) / mol_wgt(js) 
    277          END DO 
    278       ENDDO 
    279  
    280       !  New raintg 
    281       raintg(:) = 0. 
    282       DO js = 1, jpsol 
    283          DO ji = 1, jpoce 
    284             raintg(ji) = raintg(ji) + rainrg(ji,js) 
    285          END DO 
    286       ENDDO 
    287        
    288       !-------------------------------- 
    289       !    3/ back to initial geometry 
    290       !-------------------------------- 
    291       DO ji = 1, jpoce 
    292          dz3d  (ji,2) = dz(2) 
    293          volw3d(ji,2) = dz3d(ji,2) * por(2) 
    294          vols3d(ji,2) = dz3d(ji,2) * por1(2) 
    295       ENDDO 
    296186 
    297187      IF( ln_timing )  CALL timing_stop('sed_inorg') 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedstp.F90

    r13970 r14385  
    88   USE sedchem  ! chemical constant 
    99   USE sedco3   ! carbonate in sediment pore water 
    10    USE sedorg   ! Organic reactions and diffusion 
    11    USE sedinorg ! Inorganic dissolution 
     10   USE sedsol   ! Organic reactions and diffusion 
    1211   USE sedbtb   ! bioturbation 
    1312   USE sedadv   ! vertical advection 
    14    USE sedmbc   ! mass balance calculation 
    1513   USE sedsfc   ! sediment surface data 
    1614   USE sedrst   ! restart 
     
    4644      INTEGER, INTENT(in) ::   kt                ! number of iteration 
    4745      INTEGER, INTENT(in) ::   Kbb, Kmm, Krhs    ! time level indices 
    48       INTEGER :: ji,jk,js,jn,jw 
    4946      !!---------------------------------------------------------------------- 
    50       IF( ln_timing )      CALL timing_start('sed_stp') 
     47      IF( ln_timing )           CALL timing_start('sed_stp') 
    5148        ! 
    5249                                CALL sed_rst_opn  ( kt )       ! Open tracer restart file  
     
    6663         ENDIF 
    6764 
    68          CALL sed_btb( kt )         ! 1st pass of bioturbation at t+1/2 
    69          CALL sed_org( kt )         ! Organic related reactions and diffusion 
    70          CALL sed_inorg( kt )       ! Dissolution reaction 
    71          CALL sed_btb( kt )         ! 2nd pass of bioturbation at t+1 
    72          tokbot(:,:) = 0.0 
    73          DO jw = 1, jpwat 
    74             DO ji = 1, jpoce 
    75                tokbot(ji,jw) = pwcp(ji,1,jw) * 1.e-3 * dzkbot(ji) 
    76             END DO 
    77          ENDDO 
     65         CALL sed_btb( kt )        ! 1st pass of bioturbation at t+1/2 
     66         CALL sed_sol( kt )        ! Solute diffusion and reactions  
     67         CALL sed_btb( kt )        ! 2nd pass of bioturbation at t+1 
    7868         CALL sed_adv( kt )         ! advection 
    7969         CALL sed_co3( kt )         ! pH actualization for saving 
    80          ! This routine is commented out since it does not work at all 
    81          CALL sed_mbc( kt )         ! cumulation for mass balance calculation 
    82  
    8370         IF (ln_sed_2way) CALL sed_sfc( kt, Kbb )         ! Give back new bottom wat chem to tracer model 
    8471      ENDIF 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedwri.F90

    r14086 r14385  
    5454      IF (lwp) WRITE(numsed,*) ' ' 
    5555       
    56       ALLOCATE( zdta(jpoce,jpksed) )    ;   ALLOCATE( zflx(jpoce,jpwatp1) ) 
     56      ALLOCATE( zdta(jpoce,jpksed) )    ;   ALLOCATE( zflx(jpoce,jptrased+1) ) 
    5757 
    5858      ! Initialize variables 
     
    8888      CALL unpack_arr( jpoce, flxsedi3d(1:jpi,1:jpj,1:jpksed,2)  , iarroce(1:jpoce), & 
    8989         &                   co3por(1:jpoce,1:jpksed)  ) 
     90 
     91      CALL unpack_arr( jpoce, flxsedi3d(1:jpi,1:jpj,1:jpksed,3)  , iarroce(1:jpoce), & 
     92         &                   sedligand(1:jpoce,1:jpksed)  ) 
     93 
     94      CALL unpack_arr( jpoce, flxsedi3d(1:jpi,1:jpj,1:jpksed,4)  , iarroce(1:jpoce), & 
     95         &                   saturco3(1:jpoce,1:jpksed)  ) 
     96 
    9097       
    9198!      flxsedi3d = 0. 
     
    95102         DO ji = 1, jpoce 
    96103            zflx(ji,jw) = ( pwcp(ji,1,jw) - pwcp_dta(ji,jw) ) & 
    97                &         * 1.e3 / 1.e2 * dzkbot(ji) / rDt_trc 
     104               &         * 1.e3 * ( 1.e-2 * dzkbot(ji) ) / 1.E4 / rDt_trc 
     105         ENDDO 
     106      ENDDO 
     107 
     108      ! Calculation of fluxes g/cm2/s 
     109      DO js = 1, jpsol 
     110         zrate =  1.0 / rDt_trc 
     111         DO ji = 1, jpoce 
     112            zflx(ji,jpwat+js) = zflx(ji,jpwat+js) + ( tosed(ji,js) - fromsed(ji,js) ) * zrate 
    98113         ENDDO 
    99114      ENDDO 
     
    101116      ! Calculation of accumulation rate per dt 
    102117      DO js = 1, jpsol 
    103          zrate =  1.0 / ( denssol * por1(jpksed) ) / rDt_trc 
     118         zrate =  1.0 / rDt_trc 
    104119         DO ji = 1, jpoce 
    105             zflx(ji,jpwatp1) = zflx(ji,jpwatp1) + ( tosed(ji,js) - fromsed(ji,js) ) * zrate 
     120            zflx(ji,jptrased+1) = zflx(ji,jptrased+1) + ( tosed(ji,js) - fromsed(ji,js) ) * zrate 
    106121         ENDDO 
    107122      ENDDO 
     
    110125         CALL unpack_arr( jpoce, flxsedi2d(1:jpi,1:jpj,jn), iarroce(1:jpoce), zflx(1:jpoce,jn)  ) 
    111126      END DO 
     127 
    112128      zflx(:,1) = dzdep(:) / dtsed 
    113129      CALL unpack_arr( jpoce, flxsedi2d(1:jpi,1:jpj,jpdia2dsed), iarroce(1:jpoce), zflx(1:jpoce,1) ) 
    114130 
    115        ! Start writing data 
    116        ! --------------------- 
    117        DO jn = 1, jptrased 
    118           cltra = sedtrcd(jn) ! short title for 3D diagnostic 
    119           CALL iom_put( cltra, trcsedi(:,:,:,jn) ) 
    120        END DO 
     131      ! Start writing data 
     132      ! --------------------- 
     133      DO jn = 1, jptrased 
     134         cltra = sedtrcd(jn) ! short title for 3D diagnostic 
     135         CALL iom_put( cltra, trcsedi(:,:,:,jn) ) 
     136      END DO 
    121137 
    122        DO jn = 1, jpdia3dsed 
    123           cltra = seddia3d(jn) ! short title for 3D diagnostic 
    124           CALL iom_put( cltra, flxsedi3d(:,:,:,jn) ) 
    125        END DO 
     138      DO jn = 1, jpdia3dsed 
     139         cltra = seddia3d(jn) ! short title for 3D diagnostic 
     140         CALL iom_put( cltra, flxsedi3d(:,:,:,jn) ) 
     141      END DO 
    126142 
    127        DO jn = 1, jpdia2dsed 
    128           cltra = seddia2d(jn) ! short title for 2D diagnostic 
    129           CALL iom_put( cltra, flxsedi2d(:,:,jn) ) 
    130        END DO 
     143      DO jn = 1, jpdia2dsed 
     144         cltra = seddia2d(jn) ! short title for 2D diagnostic 
     145         CALL iom_put( cltra, flxsedi2d(:,:,jn) ) 
     146      END DO 
    131147 
    132148 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/par_pisces.F90

    r12377 r14385  
    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/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/sms_pisces.F90

    r12377 r14385  
    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) ::   xkmort           !: Mortality half-saturation constant 
     45   REAL(wp) ::   feratz           !: Fe/C in microzooplankton 
     46   REAL(wp) ::   feratm           !: Fe/C in mesozooplankton 
     47   REAL(wp) ::   ldocp            !: Ligand production ratio during PP 
     48   REAL(wp) ::   ldocz            !: Ligand production ratio by grazing 
     49   REAL(wp) ::   lthet            !: Uptake of ligand by phytoplankton 
     50   REAL(wp) ::   no3rat3          !: C/N ratio of zooplankton 
     51   REAL(wp) ::   po4rat3          !: C/P ratio of zooplankton 
    5552 
    5653   !!*  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 
     54   REAL(wp) ::  tpp               !: total primary production 
     55   REAL(wp) ::  t_oce_co2_exp     !: total carbon export 
     56   REAL(wp) ::  t_oce_co2_flx     !: Total ocean carbon flux 
     57   REAL(wp) ::  t_oce_co2_flx_cum !: Cumulative Total ocean carbon flux 
     58   REAL(wp) ::  t_atm_co2_flx     !: global mean of atmospheric pco2 
    6259 
    6360   !!* 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 
     61   LOGICAL  ::  ln_pisdmp         !: restoring or not of nutrients to a mean value 
     62   INTEGER  ::  nn_pisdmp         !: frequency of relaxation or not of nutrients to a mean value 
    6663 
    6764   !!* Mass conservation 
    68    LOGICAL  ::  ln_check_mass      !: Flag to check mass conservation 
    69    LOGICAL , PUBLIC ::   ln_ironice   !: boolean for Fe input from sea ice 
     65   LOGICAL  ::  ln_check_mass     !: Flag to check mass conservation 
     66   LOGICAL, PUBLIC ::   ln_ironice   !: boolean for Fe input from sea ice 
    7067 
    7168   !!*  Biological fluxes for light : variables shared by pisces & lobster 
    7269   INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  neln  !: number of T-levels + 1 in the euphotic layer 
    7370   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  heup  !: euphotic layer depth 
     71   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:  ) ::  strn  !: Day duration in hours 
    7472   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  etot  !: par (photosynthetic available radiation) 
    7573   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  etot_ndcy      !: PAR over 24h in case of diurnal cycle 
    7674   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  enano, ediat   !: PAR for phyto, nano and diat  
    77    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  
    7876   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  epico          !: PAR for pico 
    79    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  epicom         !: PAR for pico 
    80    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  emoy           !: averaged PAR in the mixed layer 
     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 
    8179   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  heup_01 !: Absolute euphotic layer depth 
    82    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  xksi  !:  LOBSTER : zooplakton closure 
     80   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  xksi  !:  Half-saturation con,stant for diatoms 
    8381 
    8482   !!*  Biological fluxes for primary production 
    85    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   xksimax    !: ??? 
     83   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   xksimax    !: Maximum half-saturation constant over the year (Si) 
    8684   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   biron      !: bioavailable fraction of iron 
    8785   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   plig       !: proportion of iron organically complexed 
     
    9290 
    9391   !!*  SMS for the organic matter 
    94    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xfracal    !: ?? 
    95    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   nitrfac    !: ?? 
    96    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   nitrfac2   !: ?? 
    97    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   orem       !: ?? 
    98    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xdiss      !: ?? 
     92   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xfracal    !: Fraction of nanophytoplankton that are calcifying organisms 
     93   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   nitrfac    !: OMZ  
     94   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   nitrfac2   !: N depleted indice 
     95   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   orem       !: oxic remineralisation 
     96   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xdiss      !: Shear rate 
    9997   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodcal    !: Calcite production 
    100    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodpoc    !: Calcite production 
    101    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   conspoc    !: Calcite production 
    102    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodgoc    !: Calcite production 
    103    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   consgoc    !: Calcite production 
     98   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodpoc    !: POC production 
     99   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   conspoc    !: POC consumption 
     100   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prodgoc    !: GOC production 
     101   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   consgoc    !: GOC consumption 
     102   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   consfe3    !: GOC consumption 
    104103   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   blim       !: bacterial production factor 
    105    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizen      !: size of diatoms  
    106    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizep      !: size of diatoms  
     104   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizen      !: size of nanophyto 
     105   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizep      !: size of picophyto 
    107106   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sized      !: size of diatoms  
    108  
     107   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizena     !: size of nanophytoplankton, after 
     108   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizepa     !: size of picophyto, after 
     109   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sizeda     !: size of diatomss, after 
    109110 
    110111   !!* Variable for chemistry of the CO2 cycle 
    111    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ak13       !: ??? 
    112    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ak23       !: ??? 
    113    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   aksp       !: ??? 
    114    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hi         !: ??? 
    115    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   excess     !: ??? 
     112   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ak13       !: Carbonate chemistry constant 
     113   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ak23       !: Carbonate chemistry constant 
     114   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   aksp       !: Solubility product of CaCO3 
     115   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hi         !: Proton concentration 
     116   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   excess     !: CO3 saturation 
    116117   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   aphscale   !:  
    117118 
     
    135136      !!---------------------------------------------------------------------- 
    136137      USE lib_mpp , ONLY: ctl_stop 
    137       INTEGER ::   ierr(10)        ! Local variables 
     138      INTEGER ::   ierr(11)        ! Local variables 
    138139      !!---------------------------------------------------------------------- 
    139140      ierr(:) = 0 
    140       !*  Biological fluxes for light : shared variables for pisces & lobster 
    141       ALLOCATE( etot(jpi,jpj,jpk), neln(jpi,jpj), heup(jpi,jpj),    & 
    142         &       heup_01(jpi,jpj) , xksi(jpi,jpj)               ,  STAT=ierr(1) ) 
    143       ! 
    144    
     141      ALLOCATE( etot(jpi,jpj,jpk), neln(jpi,jpj), heup(jpi,jpj),   & 
     142        &       heup_01(jpi,jpj) , xksi(jpi,jpj), strn(jpi,jpj),  STAT=ierr(1) ) 
     143 
    145144      IF( ln_p4z .OR. ln_p5z ) THEN 
    146          !*  Biological fluxes for light  
     145 
     146         !* Optics 
    147147         ALLOCATE(  enano(jpi,jpj,jpk)    , ediat(jpi,jpj,jpk) ,   & 
    148148           &        enanom(jpi,jpj,jpk)   , ediatm(jpi,jpj,jpk),   & 
    149            &        etot_ndcy(jpi,jpj,jpk), emoy(jpi,jpj,jpk)  ,  STAT=ierr(2) )  
     149           &        etot_ndcy(jpi,jpj,jpk), emoy(jpi,jpj,jpk)  ,   & 
     150           &        etotm(jpi,jpj,jpk),                           STAT=ierr(2) ) 
    150151 
    151          !*  Biological fluxes for primary production 
     152         !* Biological SMS 
    152153         ALLOCATE( xksimax(jpi,jpj)  , biron(jpi,jpj,jpk)      ,  STAT=ierr(3) ) 
    153          ! 
    154          !*  SMS for the organic matter 
     154 
     155         ! Biological SMS 
    155156         ALLOCATE( xfracal (jpi,jpj,jpk), orem(jpi,jpj,jpk)    ,    & 
    156             &      nitrfac(jpi,jpj,jpk), nitrfac2(jpi,jpj,jpk) ,    & 
     157            &      nitrfac(jpi,jpj,jpk) , nitrfac2(jpi,jpj,jpk),    & 
    157158            &      prodcal(jpi,jpj,jpk) , xdiss   (jpi,jpj,jpk),    & 
    158159            &      prodpoc(jpi,jpj,jpk) , conspoc(jpi,jpj,jpk) ,    & 
    159160            &      prodgoc(jpi,jpj,jpk) , consgoc(jpi,jpj,jpk) ,    & 
    160             &      blim   (jpi,jpj,jpk) ,                         STAT=ierr(4) ) 
     161            &      blim   (jpi,jpj,jpk) , consfe3(jpi,jpj,jpk) ,  STAT=ierr(4) ) 
    161162 
    162          !* Variable for chemistry of the CO2 cycle 
    163          ALLOCATE( ak13  (jpi,jpj,jpk) ,                            & 
     163         !* Carbonate chemistry 
     164         ALLOCATE( ak13  (jpi,jpj,jpk)  ,                           & 
    164165            &      ak23(jpi,jpj,jpk)    , aksp  (jpi,jpj,jpk) ,     & 
    165166            &      hi  (jpi,jpj,jpk)    , excess(jpi,jpj,jpk) ,     & 
    166167            &      aphscale(jpi,jpj,jpk),                         STAT=ierr(5) ) 
    167168         ! 
    168          !* Temperature dependancy of SMS terms 
    169          ALLOCATE( tgfunc(jpi,jpj,jpk) , tgfunc2(jpi,jpj,jpk),   STAT=ierr(6) ) 
     169         !* Temperature dependency of SMS terms 
     170         ALLOCATE( tgfunc (jpi,jpj,jpk) , tgfunc2(jpi,jpj,jpk),   STAT=ierr(6) ) 
    170171         ! 
    171          !* Sinkong speed 
    172          ALLOCATE( wsbio3 (jpi,jpj,jpk) , wsbio4 (jpi,jpj,jpk),     & 
    173             &                             STAT=ierr(7) )    
     172         !* Sinking speed 
     173         ALLOCATE( wsbio3 (jpi,jpj,jpk) , wsbio4 (jpi,jpj,jpk),   STAT=ierr(7) ) 
     174 
     175         !*  Size of phytoplankton cells 
     176         ALLOCATE( sizen (jpi,jpj,jpk), sized (jpi,jpj,jpk),        & 
     177           &       sizena(jpi,jpj,jpk), sizeda(jpi,jpj,jpk),      STAT=ierr(8) ) 
    174178         !  
    175          IF( ln_ligand ) THEN 
    176            ALLOCATE( plig(jpi,jpj,jpk)  ,                         STAT=ierr(8) ) 
    177          ENDIF 
     179         ALLOCATE( plig(jpi,jpj,jpk)  ,                           STAT=ierr(9) ) 
    178180      ENDIF 
    179181      ! 
    180182      IF( ln_p5z ) THEN 
    181          !        
    182          ALLOCATE( epico(jpi,jpj,jpk)   , epicom(jpi,jpj,jpk) ,   STAT=ierr(9) )  
     183         ! PISCES-QUOTA specific part       
     184         ALLOCATE( epico(jpi,jpj,jpk)   , epicom(jpi,jpj,jpk) ,   STAT=ierr(10) )  
    183185 
    184186         !*  Size of phytoplankton cells 
    185          ALLOCATE( sizen(jpi,jpj,jpk), sizep(jpi,jpj,jpk),         & 
    186            &       sized(jpi,jpj,jpk),                            STAT=ierr(10) ) 
     187         ALLOCATE( sizep(jpi,jpj,jpk), sizepa(jpi,jpj,jpk),       STAT=ierr(11) ) 
    187188      ENDIF 
    188189      ! 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/trcini_pisces.F90

    r14086 r14385  
    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 
     
    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 / 122._wp   ! C/N 
     190      po4r    =   1._wp / 122._wp   ! C/P 
     191      o2nit   =  32._wp / 122._wp   ! O2/C for nitrification 
     192      o2ut    = 133._wp / 122._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 
     
    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 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/trcsms_pisces.F90

    r12377 r14385  
    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.