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

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

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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/TOP/PISCES/P4Z/p5zmeso.F90

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