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 15574 for NEMO/branches/2021/dev_r14318_RK3_stage1/src/TOP/PISCES/P4Z/p4zmicro.F90 – NEMO

Ignore:
Timestamp:
2021-12-03T20:32:50+01:00 (3 years ago)
Author:
techene
Message:

#2605 #2715 trunk merged into dev_r14318_RK3_stage1

Location:
NEMO/branches/2021/dev_r14318_RK3_stage1
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14318_RK3_stage1

    • Property svn:externals
      •  

        old new  
        99 
        1010# SETTE 
        11 ^/utils/CI/sette@14244        sette 
         11^/utils/CI/sette@HEAD        sette 
         12 
  • NEMO/branches/2021/dev_r14318_RK3_stage1/src/TOP/PISCES/P4Z/p4zmicro.F90

    r13295 r15574  
    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') 
    8088      ! 
    81       DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
     89      IF (ln_ligand) THEN 
     90         ALLOCATE( zzligprod(jpi,jpj,jpk) ) 
     91         zzligprod(:,:,:) = 0._wp 
     92      ENDIF 
     93      ! 
     94      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) 
    8295         zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - 1.e-9 ), 0.e0 ) 
    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      ! 
Note: See TracChangeset for help on using the changeset viewer.