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/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zmeso.F90 – NEMO

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

dev_r11708_aumont_PISCES_QUOTA : merge with the trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.