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 12524 for NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p5zmeso.F90 – NEMO

Ignore:
Timestamp:
2020-03-09T14:42:03+01:00 (4 years ago)
Author:
aumont
Message:

DVM of mesozooplankton + slight changes on prognostic ligands

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p5zmeso.F90

    r12349 r12524  
    2323   PUBLIC   p5z_meso              ! called in p5zbio.F90 
    2424   PUBLIC   p5z_meso_init         ! called in trcsms_pisces.F90 
     25   PUBLIC   p5z_meso_alloc 
    2526 
    2627   !! * Shared module variables 
     
    4950   REAL(wp), PUBLIC ::  srespir2     !: Active respiration 
    5051   REAL(wp), PUBLIC ::  grazflux     !: mesozoo flux feeding rate 
     52   REAL(wp), PUBLIC ::  xfracmig     !: Fractional biomass of meso that performs DVM 
    5153   LOGICAL,  PUBLIC ::  bmetexc2     !: Use of excess carbon for respiration 
     54   LOGICAL , PUBLIC ::  ln_dvm_meso  !: Boolean to activate DVM of mesozooplankton 
     55   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig 
     56   INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig 
     57 
    5258 
    5359   !!---------------------------------------------------------------------- 
     
    6874      !!--------------------------------------------------------------------- 
    6975      INTEGER, INTENT(in) ::   kt, knt ! ocean time step 
    70       INTEGER  :: ji, jj, jk 
     76      INTEGER  :: ji, jj, jk, jkt 
    7177      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam, zcompames 
    7278      REAL(wp) :: zgraze2, zdenom, zfact, zfood, zfoodlim, zproport 
     
    7480      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi 
    7581      REAL(wp) :: zgraztotc, zgraztotn, zgraztotp, zgraztotf, zbasresn, zbasresp, zbasresf 
    76       REAL(wp) :: zgradoc, zgradon, zgradop, zgratmp, zgradoct, zgradont, zgrareft, zgradopt 
    77       REAL(wp) :: zgrapoc, zgrapon, zgrapop, zgrapof, zprcaca, zmortz 
    78       REAL(wp) :: zexcess, zgrarem, zgraren, zgrarep, zgraref 
     82      REAL(wp) :: zgratmp, zgradoct, zgradont, zgrareft, zgradopt 
     83      REAL(wp) :: zprcaca, zmortz, zexcess 
    7984      REAL(wp) :: zbeta, zrespz, ztortz, zgrasratp, zgrasratn, zgrasratf 
    8085      REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot 
     
    8489      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg 
    8590      REAL(wp) :: zgrazffnp, zgrazffng, zgrazffpp, zgrazffpg 
     91      REAL(wp) :: zmigreltime, zrum, zcodel, zargu, zval 
    8692      CHARACTER (len=25) :: charout 
    8793      REAL(wp) :: zrfact2, zmetexcess, zsigma, zdiffdn 
    8894      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2 
    89       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d, zz2ligprod 
     95      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof 
     96      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarep, zgraren, zgrapon, zgrapop 
     97      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgradoc, zgradon, zgradop 
     98      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof, zstrn 
     99      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrep, zgramigren, zgramigpop, zgramigpon 
     100      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigdoc, zgramigdop, zgramigdon 
     101      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zw3d, zz2ligprod 
    90102 
    91103      !!--------------------------------------------------------------------- 
     
    93105      IF( ln_timing )   CALL timing_start('p5z_meso') 
    94106      ! 
    95  
    96107      zgrazing(:,:,:) = 0._wp 
    97108      zfezoo2 (:,:,:) = 0._wp 
     
    101112         zz2ligprod(:,:,:) = 0._wp 
    102113      ENDIF 
     114 
     115      ! 
     116      ! Diurnal vertical migration of mesozooplankton 
     117      ! --------------------------------------------- 
     118      IF (ln_dvm_meso) CALL p5z_meso_depmig 
    103119 
    104120      zmetexcess = 0.0 
     
    268284               zgrareft = (1. - unass2c) * zgraztotf - zepsherv * ferat3 * zgraztotc - zbasresf 
    269285               ztmp1   = ( 1. - epsher2 - unass2c ) /( 1. - 0.8 * epsher2 ) * ztortz 
    270                zgradoc = (zgradoct + ztmp1) * ssigma2 
    271                zgradon = (zgradont + no3rat3 * ztmp1) * ssigma2 
    272                zgradop = (zgradopt + po4rat3 * ztmp1) * ssigma2 
     286               zgradoc(ji,jj,jk) = (zgradoct + ztmp1) * ssigma2 
     287               zgradon(ji,jj,jk) = (zgradont + no3rat3 * ztmp1) * ssigma2 
     288               zgradop(ji,jj,jk) = (zgradopt + po4rat3 * ztmp1) * ssigma2 
    273289               zgratmp = 0.2 * epsher2 /( 1. - 0.8 * epsher2 ) * ztortz 
    274290 
     
    277293               !  as dissolved inorganic compounds (ssigma2) 
    278294               !  -------------------------------------------------- 
    279                zgrarem = zgratmp + ( zgradoct + ztmp1 ) * (1.0 - ssigma2) 
    280                zgraren = no3rat3 * zgratmp + ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2) 
    281                zgrarep = po4rat3 * zgratmp + ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2) 
    282                zgraref = zgrareft + ferat3 * ( ztmp1 + zgratmp ) 
     295               zgrarem(ji,jj,jk) = zgratmp + ( zgradoct + ztmp1 ) * (1.0 - ssigma2) 
     296               zgraren(ji,jj,jk) = no3rat3 * zgratmp + ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2) 
     297               zgrarep(ji,jj,jk) = po4rat3 * zgratmp + ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2) 
     298               zgraref(ji,jj,jk) = zgrareft + ferat3 * ( ztmp1 + zgratmp ) 
    283299 
    284300               !   Defecation as a result of non assimilated products 
    285301               !   -------------------------------------------------- 
    286                zgrapoc  = zgraztotc * unass2c + unass2c / ( 1. - 0.8 * epsher2 ) * ztortz 
    287                zgrapon  = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - 0.8 * epsher2 ) * ztortz 
    288                zgrapop  = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - 0.8 * epsher2 ) * ztortz 
    289                zgrapof  = zgraztotf * unass2c + ferat3  * unass2c / ( 1. - 0.8 * epsher2 ) * ztortz 
     302               zgrapoc(ji,jj,jk)  = zgraztotc * unass2c + unass2c / ( 1. - 0.8 * epsher2 ) * ztortz 
     303               zgrapon(ji,jj,jk)  = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - 0.8 * epsher2 ) * ztortz 
     304               zgrapop(ji,jj,jk)  = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - 0.8 * epsher2 ) * ztortz 
     305               zgrapof(ji,jj,jk)  = zgraztotf * unass2c + ferat3  * unass2c / ( 1. - 0.8 * epsher2 ) * ztortz 
    290306 
    291307               !  Addition of respiration to the release of inorganic nutrients 
    292308               !  ------------------------------------------------------------- 
    293                zgrarem = zgrarem + zbasresi + zrespirc 
    294                zgraren = zgraren + zbasresn + zrespirc * no3rat3 
    295                zgrarep = zgrarep + zbasresp + zrespirc * po4rat3 
    296                zgraref = zgraref + zbasresf + zrespirc * ferat3 
     309               zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) + zbasresi + zrespirc 
     310               zgraren(ji,jj,jk) = zgraren(ji,jj,jk) + zbasresn + zrespirc * no3rat3 
     311               zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) + zbasresp + zrespirc * po4rat3 
     312               zgraref(ji,jj,jk) = zgraref(ji,jj,jk) + zbasresf + zrespirc * ferat3 
    297313 
    298314               !   Update the arrays TRA which contain the biological sources and 
    299315               !   sinks 
    300316               !   -------------------------------------------------------------- 
    301                tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarep  
    302                tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgraren 
    303                tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgradoc 
    304                ! 
    305                IF( ln_ligand ) THEN 
    306                   tra(ji,jj,jk,jplgw)  = tra(ji,jj,jk,jplgw) + zgradoc * ldocz 
    307                   zz2ligprod(ji,jj,jk) = zgradoc * ldocz 
    308                ENDIF 
    309                ! 
    310                tra(ji,jj,jk,jpdon) = tra(ji,jj,jk,jpdon) + zgradon 
    311                tra(ji,jj,jk,jpdop) = tra(ji,jj,jk,jpdop) + zgradop 
    312                tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarem 
    313                tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgraref 
    314                zfezoo2(ji,jj,jk)   = zgraref 
    315                tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarem 
    316                tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgraren 
    317317               tra(ji,jj,jk,jpmes) = tra(ji,jj,jk,jpmes) + zepsherv * zgraztotc - zrespirc   & 
    318318               &                     - ztortz - zgrazm 
     
    332332 
    333333               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zgrazpoc - zgrazffep + zfracc 
    334                prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfracc 
    335                conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep 
     334               prodpoc(ji,jj,jk)   = prodpoc(ji,jj,jk) + zfracc 
     335               conspoc(ji,jj,jk)   = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep 
    336336               tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) - zgrazpon - zgrazffnp + zfracn 
    337337               tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) - zgrazpop - zgrazffpp + zfracp 
    338                tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zgrazffeg + zgrapoc - zfracc 
    339                prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zgrapoc 
    340                consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfracc 
    341                tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) - zgrazffng + zgrapon - zfracn 
    342                tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) - zgrazffpg + zgrapop - zfracp 
     338               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zgrazffeg - zfracc 
     339               consgoc(ji,jj,jk)   = consgoc(ji,jj,jk) - zgrazffeg - zfracc 
     340               tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) - zgrazffng - zfracn 
     341               tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) - zgrazffpg - zfracp 
    343342               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zgrazpof - zgrazfffp + zfracfe 
    344                tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zgrazfffg + zgrapof - zfracfe 
     343               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zgrazfffg - zfracfe 
    345344               zfracal = trb(ji,jj,jk,jpcal) / ( trb(ji,jj,jk,jpgoc) + rtrn ) 
    346345               zgrazcal = zgrazffeg * (1. - part2) * zfracal 
    347  
    348346               !  calcite production 
    349347               !  ------------------ 
     
    354352               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + 2. * ( zgrazcal - zprcaca ) 
    355353               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) - zgrazcal + zprcaca 
     354            END DO 
     355         END DO 
     356      END DO 
     357 
     358      IF (ln_dvm_meso) THEN 
     359         ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) ) 
     360         ALLOCATE( zgramigrep(jpi,jpj), zgramigren(jpi,jpj), zgramigpop(jpi,jpj), zgramigpon(jpi,jpj) ) 
     361         ALLOCATE( zgramigdoc(jpi,jpj), zgramigdon(jpi,jpj), zgramigdop(jpi,jpj) ) 
     362 
     363         ALLOCATE( zstrn(jpi,jpj) ) 
     364         zgramigrem(:,:)  = 0.0   ;   zgramigref(:,:) = 0.0 
     365         zgramigrep(:,:)  = 0.0   ;   zgramigren(:,:) = 0.0 
     366         zgramigpoc(:,:)  = 0.0   ;   zgramigpof(:,:) = 0.0 
     367         zgramigpop(:,:)  = 0.0   ;   zgramigpon(:,:) = 0.0 
     368         zgramigdoc(:,:)  = 0.0   ;   zgramigdon(:,:) = 0.0 
     369         zgramigdop(:,:)  = 0.0    
     370 
     371         ! compute the day length depending on latitude and the day 
     372         zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp ) 
     373         zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  ) 
     374 
     375         ! day length in hours 
     376         zstrn(:,:) = 0. 
     377         DO jj = 1, jpj 
     378            DO ji = 1, jpi 
     379               zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad ) 
     380               zargu = MAX( -1., MIN(  1., zargu ) ) 
     381               zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. ) 
     382               zstrn(ji,jj) = MIN(0.75, MAX( 0.25, zstrn(ji,jj) / 24.) ) 
     383            END DO 
     384         END DO 
     385 
     386 
     387         DO jk = 1, jpk 
     388            DO jj = 1, jpj 
     389               DO ji = 1, jpi 
     390 
     391                  !   Compute the amount of materials that will go into vertical migration 
     392                  zmigreltime = (1. - zstrn(ji,jj)) 
     393                  IF ( gdept_n(ji,jj,jk) <= heup(ji,jj) ) THEN 
     394                     zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * (1. - zmigreltime )    & 
     395                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     396                     zgramigrep(ji,jj) = zgramigrep(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * (1. - zmigreltime )    & 
     397                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     398                     zgramigrep(ji,jj) = zgramigren(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * (1. - zmigreltime )    & 
     399                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     400                     zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * (1. - zmigreltime )   & 
     401                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     402                     zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * (1. - zmigreltime )   & 
     403                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     404                     zgramigpop(ji,jj) = zgramigpop(ji,jj) + xfracmig * zgrapop(ji,jj,jk) * (1. - zmigreltime )   & 
     405                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     406                     zgramigpon(ji,jj) = zgramigpon(ji,jj) + xfracmig * zgrapon(ji,jj,jk) * (1. - zmigreltime )   & 
     407                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     408                     zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * (1. - zmigreltime )   & 
     409                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     410                     zgramigdoc(ji,jj) = zgramigdoc(ji,jj) + xfracmig * zgradoc(ji,jj,jk) * (1. - zmigreltime )   & 
     411                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     412                     zgramigdop(ji,jj) = zgramigdop(ji,jj) + xfracmig * zgradop(ji,jj,jk) * (1. - zmigreltime )   & 
     413                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     414                     zgramigdon(ji,jj) = zgramigdon(ji,jj) + xfracmig * zgradon(ji,jj,jk) * (1. - zmigreltime )   & 
     415                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     416 
     417                     zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     418                     zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     419                     zgraren(ji,jj,jk) = zgraren(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     420                     zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     421                     zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     422                     zgrapop(ji,jj,jk) = zgrapop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     423                     zgrapon(ji,jj,jk) = zgrapon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     424                     zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     425                     zgradoc(ji,jj,jk) = zgradoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     426                     zgradop(ji,jj,jk) = zgradop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     427                     zgradon(ji,jj,jk) = zgradon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 
     428                  ENDIF 
     429               END DO 
     430            END DO 
     431         END DO 
     432 
     433         DO jj = 1, jpj 
     434            DO ji = 1, jpi 
     435               IF (tmask(ji,jj,1) == 1.) THEN 
     436                  jkt = kmig(ji,jj) 
     437                  zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) / e3t_n(ji,jj,jkt) 
     438                  zgrarep(ji,jj,jkt) = zgrarep(ji,jj,jkt) + zgramigrep(ji,jj) / e3t_n(ji,jj,jkt) 
     439                  zgraren(ji,jj,jkt) = zgraren(ji,jj,jkt) + zgramigren(ji,jj) / e3t_n(ji,jj,jkt) 
     440                  zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) / e3t_n(ji,jj,jkt) 
     441                  zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) / e3t_n(ji,jj,jkt) 
     442                  zgrapop(ji,jj,jkt) = zgrapop(ji,jj,jkt) + zgramigpop(ji,jj) / e3t_n(ji,jj,jkt) 
     443                  zgrapon(ji,jj,jkt) = zgrapon(ji,jj,jkt) + zgramigpon(ji,jj) / e3t_n(ji,jj,jkt) 
     444                  zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) / e3t_n(ji,jj,jkt) 
     445                  zgradoc(ji,jj,jkt) = zgradoc(ji,jj,jkt) + zgramigdoc(ji,jj) / e3t_n(ji,jj,jkt) 
     446                  zgradop(ji,jj,jkt) = zgradop(ji,jj,jkt) + zgramigdop(ji,jj) / e3t_n(ji,jj,jkt) 
     447                  zgradon(ji,jj,jkt) = zgradon(ji,jj,jkt) + zgramigdon(ji,jj) / e3t_n(ji,jj,jkt) 
     448               ENDIF 
     449            END DO 
     450         END DO 
     451         ! 
     452         ! Deallocate temporary variables 
     453         ! ------------------------------ 
     454         DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof ) 
     455         DEALLOCATE( zgramigrep, zgramigren, zgramigpop, zgramigpon ) 
     456         DEALLOCATE( zgramigdoc, zgramigdon, zgramigdop ) 
     457         DEALLOCATE( zstrn ) 
     458 
     459      ENDIF 
     460 
     461      DO jk = 1, jpk 
     462         DO jj = 1, jpj 
     463            DO ji = 1, jpi 
     464               !   Update the arrays TRA which contain the biological sources and sinks 
     465               tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarep(ji,jj,jk)  
     466               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgraren(ji,jj,jk) 
     467               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgradoc(ji,jj,jk) 
     468               ! 
     469               IF( ln_ligand ) THEN 
     470                  tra(ji,jj,jk,jplgw)  = tra(ji,jj,jk,jplgw) + zgradoc(ji,jj,jk) * ldocz 
     471                  zz2ligprod(ji,jj,jk) = zgradoc(ji,jj,jk) * ldocz 
     472               ENDIF 
     473               ! 
     474               tra(ji,jj,jk,jpdon) = tra(ji,jj,jk,jpdon) + zgradon(ji,jj,jk) 
     475               tra(ji,jj,jk,jpdop) = tra(ji,jj,jk,jpdop) + zgradop(ji,jj,jk) 
     476               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarem(ji,jj,jk) 
     477               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgraref(ji,jj,jk) 
     478               zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk) 
     479               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarem(ji,jj,jk) 
     480               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgraren(ji,jj,jk) 
     481               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zgrapoc(ji,jj,jk) 
     482               prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk) + zgrapoc(ji,jj,jk) 
     483               tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) + zgrapon(ji,jj,jk) 
     484               tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) + zgrapop(ji,jj,jk) 
     485               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zgrapof(ji,jj,jk) 
    356486            END DO 
    357487         END DO 
     
    407537         &                xpref2m, xpref2d, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & 
    408538         &                xthresh2mes, xthresh2, xkgraz2, epsher2, epsher2min, ssigma2, unass2c, & 
    409          &                unass2n, unass2p, srespir2, grazflux 
     539         &                unass2n, unass2p, srespir2, grazflux, ln_dvm_meso, xfracmig 
    410540      !!---------------------------------------------------------------------- 
    411541      ! 
     
    448578         WRITE(numout,*) '    half sturation constant for grazing 2          xkgraz2     = ', xkgraz2 
    449579         WRITE(numout,*) '    Use excess carbon for respiration              bmetexc2    = ', bmetexc2 
     580         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso 
     581         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig 
    450582      ENDIF 
    451583      ! 
    452584   END SUBROUTINE p5z_meso_init 
     585 
     586   SUBROUTINE p5z_meso_depmig 
     587      !!---------------------------------------------------------------------- 
     588      !!                  ***  ROUTINE p5z_meso_depmig  *** 
     589      !! 
     590      !! ** Purpose :   Computation the migration depth of mesozooplankton 
     591      !! 
     592      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen 
     593      !!      temperature and chlorophylle following the parameterization  
     594      !!      proposed by Bianchi et al. (2013) 
     595      !! 
     596      !! ** input   :    
     597      !!---------------------------------------------------------------------- 
     598      INTEGER  :: ji, jj, jk 
     599      ! 
     600      REAL(wp) :: totchl 
     601      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy 
     602 
     603      !!--------------------------------------------------------------------- 
     604      ! 
     605      IF( ln_timing == 1 )  CALL timing_start('p5z_meso_zdepmig') 
     606      ! 
     607      oxymoy(:,:)  = 0. 
     608      tempmoy(:,:) = 0. 
     609      zdepmoy(:,:) = 0. 
     610      depmig (:,:) = 5. 
     611      kmig   (:,:) = 1 
     612      ! 
     613      ! Compute the averaged values of oxygen, temperature over the domain  
     614      ! 150m to 500 m depth. 
     615      ! 
     616      DO jk =1, jpk 
     617         DO jj = 1, jpj 
     618            DO ji = 1, jpi 
     619               IF (tmask(ji,jj,jk) == 1.) THEN 
     620                  IF (gdept_n(ji,jj,jk) >= 150. .AND. gdept_n(ji,jj,jk) <= 500.) THEN 
     621                     oxymoy(ji,jj)  = oxymoy(ji,jj)  + trb(ji,jj,jk,jpoxy)*e3t_n(ji,jj,jk)*1E6 
     622                     tempmoy(ji,jj) = tempmoy(ji,jj) + tsn(ji,jj,jk,jp_tem)*e3t_n(ji,jj,jk) 
     623                     zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t_n(ji,jj,jk) 
     624                  ENDIF 
     625               ENDIF 
     626            END DO 
     627         END DO 
     628      END DO 
     629 
     630      DO jj = 1, jpj 
     631         DO ji = 1, jpi 
     632            oxymoy(ji,jj) = trb(ji,jj,1,jpoxy)*1E6 - oxymoy(ji,jj) / (zdepmoy(ji,jj) + rtrn) 
     633            tempmoy(ji,jj) = tsn(ji,jj,1,jp_tem)-tempmoy(ji,jj) / (zdepmoy(ji,jj) + rtrn) 
     634         END DO 
     635      END DO 
     636      ! 
     637      ! Computation of the migration depth based on the parameterization of  
     638      ! 
     639      DO jj = 1, jpj 
     640         DO ji = 1, jpi 
     641            IF (tmask(ji,jj,1) == 1.) THEN 
     642               totchl = (trb(ji,jj,1,jppch)+trb(ji,jj,1,jpnch)+trb(ji,jj,1,jpdch))*1E6 
     643               depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(totchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj) 
     644            ENDIF 
     645         END DO 
     646      END DO 
     647      !  
     648      ! Computation of the corresponding jk indice  
     649      ! ------------------------------------------ 
     650      !  
     651      DO jk = 1, jpk-1 
     652         DO jj = 1, jpj 
     653            DO ji = 1, jpi 
     654               IF (depmig(ji,jj) .GE. gdepw_n(ji,jj,jk) .AND. depmig(ji,jj) .LT. gdepw_n(ji,jj,jk+1) ) THEN 
     655                  kmig(ji,jj) = jk 
     656               ENDIF 
     657            END DO 
     658         END DO 
     659      END DO 
     660      ! 
     661      ! Correction of the migration depth and indice based on O2 levels 
     662      ! If O2 is too low, imposing a migration depth at this low O2 levels 
     663      ! would lead to negative O2 concentrations (respiration while O2 is close 
     664      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so 
     665      ! that it falls above the OMZ 
     666      ! ----------------------------------------------------------------------- 
     667      ! 
     668      DO ji =1, jpi 
     669         DO jj = 1, jpj 
     670            IF (trb(ji,jj,kmig(ji,jj),jpoxy) < 5E-6) THEN 
     671               DO jk = kmig(ji,jj),1,-1 
     672                  IF (trb(ji,jj,jk,jpoxy) >= 5E-6 .AND. trb(ji,jj,jk+1,jpoxy)  < 5E-6) THEN 
     673                     kmig(ji,jj) = jk 
     674                     depmig(ji,jj) = gdept_n(ji,jj,jk) 
     675                  ENDIF 
     676               END DO 
     677            ENDIF 
     678         END DO 
     679      END DO 
     680      ! 
     681      IF( ln_timing )   CALL timing_stop('p5z_meso_depmig') 
     682      ! 
     683   END SUBROUTINE p5z_meso_depmig 
     684 
     685   INTEGER FUNCTION p5z_meso_alloc() 
     686      !!---------------------------------------------------------------------- 
     687      !!                     ***  ROUTINE p4z_meso_alloc  *** 
     688      !!---------------------------------------------------------------------- 
     689      ! 
     690      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p5z_meso_alloc  ) 
     691      ! 
     692      IF( p5z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_meso_alloc : failed to allocate arrays.' ) 
     693      ! 
     694   END FUNCTION p5z_meso_alloc 
    453695 
    454696   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.