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 7180 for branches/CNRS/dev_r6270_PISCES_QUOTA/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zrem.F90 – NEMO

Ignore:
Timestamp:
2016-11-03T16:41:10+01:00 (7 years ago)
Author:
aumont
Message:

various bug fixes on iron chemistry

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/CNRS/dev_r6270_PISCES_QUOTA/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zrem.F90

    r6841 r7180  
    2525   USE p4zlim          ! Phytoplankton limitation factors 
    2626   USE p4zprod         !  Growth rate of the 2 phyto groups 
     27   USE p4zsink         !  Sinking of particles 
    2728   USE prtctl_trc      !  print control for debugging 
    2829   USE iom             !  I/O manager 
     
    4344   REAL(wp), PUBLIC ::  xsilab     !: fraction of labile biogenic silica  
    4445   REAL(wp), PUBLIC ::  oxymin     !: halk saturation constant for anoxia  
     46   REAL(wp), PUBLIC ::  oxymin2    !: Minimum O2 concentration for oxic remin. 
     47   REAL(wp), PUBLIC ::  feratb     !: Fe/C quota in bacteria 
     48   REAL(wp), PUBLIC ::  xkferb     !: Half-saturation constant for bacteria Fe/C 
    4549 
    4650   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   denitr     !: denitrification array 
    47    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   denitnh4   !: -    -    -    -   - 
    4851 
    4952 
     
    7174      REAL(wp) ::   zremik, zsiremin  
    7275      REAL(wp) ::   zsatur, zsatur2, znusil, znusil2, zdep, zdepmin, zfactdep 
    73       REAL(wp) ::   zbactfer, zolimit 
    74       REAL(wp) ::   zosil, ztem 
     76      REAL(wp) ::   zbactfer, zolimit, zdenitnh4 
     77      REAL(wp) ::   zosil, ztem,ztoto,zpuis 
    7578      REAL(wp) ::   zonitr, zstep, zrfact2 
    7679      CHARACTER (len=25) :: charout 
    7780      REAL(wp), POINTER, DIMENSION(:,:  ) :: ztempbac 
    78       REAL(wp), POINTER, DIMENSION(:,:,:) :: zdepbac, zolimi, zdepprod 
     81      REAL(wp), POINTER, DIMENSION(:,:,:) :: zdepbac, zolimi, zdepprod, zfacsi, zfacsib 
    7982      !!--------------------------------------------------------------------- 
    8083      ! 
     
    8386      ! Allocate temporary workspace 
    8487      CALL wrk_alloc( jpi, jpj,      ztempbac ) 
    85       CALL wrk_alloc( jpi, jpj, jpk, zdepbac, zdepprod, zolimi ) 
     88      CALL wrk_alloc( jpi, jpj, jpk, zdepbac, zdepprod, zolimi, zfacsi, zfacsib ) 
    8689 
    8790      ! Initialization of local variables 
     
    9194      zdepprod(:,:,:) = 1._wp 
    9295      ztempbac(:,:)   = 0._wp 
     96      zfacsib(:,:,:)  = xsilab / ( 1.0 - xsilab ) 
     97      zfacsi(:,:,:)   = xsilab  
    9398 
    9499      ! Computation of the mean phytoplankton concentration as 
     
    117122            DO ji = 1, jpi 
    118123               ! denitrification factor computed from O2 levels 
    119                nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - trb(ji,jj,jk,jpoxy) )    & 
     124               ! ---------------------------------------------- 
     125               nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( oxymin2 - trb(ji,jj,jk,jpoxy) )    & 
    120126                  &                                / ( oxymin + trb(ji,jj,jk,jpoxy) )  ) 
    121127               nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) ) 
     
    147153               zolimi (ji,jj,jk) = MAX( 0.e0, zolimi (ji,jj,jk) ) 
    148154               denitr (ji,jj,jk) = MAX( 0.e0, denitr (ji,jj,jk) ) 
    149                ! 
     155               ! Update of the tracers trends 
     156               ! ---------------------------- 
     157               tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zolimi (ji,jj,jk) + denitr(ji,jj,jk) 
     158               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zolimi (ji,jj,jk) + denitr(ji,jj,jk) 
     159               tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) - denitr (ji,jj,jk) * rdenit 
     160               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) - zolimi (ji,jj,jk) - denitr(ji,jj,jk) 
     161               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - zolimi (ji,jj,jk) * o2ut 
     162               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zolimi (ji,jj,jk) + denitr(ji,jj,jk) 
     163               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * ( zolimi(ji,jj,jk)    & 
     164               &                     + ( rdenit + 1.) * denitr(ji,jj,jk) ) 
    150165            END DO 
    151166         END DO 
     
    165180               zonitr  = nitrif * zstep * trb(ji,jj,jk,jpnh4) * ( 1.- nitrfac(ji,jj,jk) )  & 
    166181               &         / ( 1.+ emoy(ji,jj,jk) ) * ( 1. + fr_i(ji,jj) * emoy(ji,jj,jk) ) 
    167                denitnh4(ji,jj,jk) = nitrif * zstep * trb(ji,jj,jk,jpnh4) * nitrfac(ji,jj,jk)  
     182               zdenitnh4 = nitrif * zstep * trb(ji,jj,jk,jpnh4) * nitrfac(ji,jj,jk)  
    168183               ! Update of the tracers trends 
    169184               ! ---------------------------- 
    170                tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) - zonitr - denitnh4(ji,jj,jk) 
    171                tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) + zonitr - rdenita * denitnh4(ji,jj,jk) 
     185               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) - zonitr - zdenitnh4 
     186               tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) + zonitr - rdenita * zdenitnh4 
    172187               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2nit * zonitr 
    173                tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2 * rno3 * zonitr + rno3 * ( rdenita - 1. ) * denitnh4(ji,jj,jk) 
    174             END DO 
    175          END DO 
    176       END DO 
    177  
    178        IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
     188               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2 * rno3 * zonitr + rno3 * ( rdenita - 1. ) * zdenitnh4 
     189            END DO 
     190         END DO 
     191      END DO 
     192 
     193      IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
    179194         WRITE(charout, FMT="('rem1')") 
    180195         CALL prt_ctl_trc_info(charout) 
    181196         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) 
    182        ENDIF 
     197      ENDIF 
    183198 
    184199      DO jk = 1, jpkm1 
     
    190205               ! studies (especially at Papa) have shown this uptake to be significant 
    191206               ! ---------------------------------------------------------- 
    192                zbactfer = 10.e-6 *  rfact2 * prmax(ji,jj,jk) * xlimbacl(ji,jj,jk)             & 
    193                   &              * trb(ji,jj,jk,jpfer) / ( 2.5E-10 + trb(ji,jj,jk,jpfer) )    & 
     207               zbactfer = feratb *  rfact2 * prmax(ji,jj,jk) * xlimbacl(ji,jj,jk)             & 
     208                  &              * trb(ji,jj,jk,jpfer) / ( xkferb + trb(ji,jj,jk,jpfer) )    & 
    194209                  &              * zdepprod(ji,jj,jk) * zdepbac(ji,jj,jk) 
    195210#if defined key_kriest 
     
    205220      END DO 
    206221 
    207        IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
     222      IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
    208223         WRITE(charout, FMT="('rem2')") 
    209224         CALL prt_ctl_trc_info(charout) 
    210225         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) 
    211        ENDIF 
     226      ENDIF 
     227 
     228      ! Initialization of the array which contains the labile fraction 
     229      ! of bSi. Set to a constant in the upper ocean 
     230      ! --------------------------------------------------------------- 
    212231 
    213232      DO jk = 1, jpkm1 
     
    218237               zstep = zstep * facvol(ji,jj,jk) 
    219238# endif 
     239               zdep     = MAX( hmld(ji,jj), heup_01(ji,jj) ) 
     240               zsatur   = MAX( rtrn, ( sio3eq(ji,jj,jk) - trb(ji,jj,jk,jpsil) ) / ( sio3eq(ji,jj,jk) + rtrn ) ) 
     241               zsatur2  = ( 1. + tsn(ji,jj,jk,jp_tem) / 400.)**37 
     242               znusil   = 0.225  * ( 1. + tsn(ji,jj,jk,jp_tem) / 15.) * zsatur + 0.775 * zsatur2 * zsatur**9.25 
     243 
    220244               ! Remineralization rate of BSi depedant on T and saturation 
    221245               ! --------------------------------------------------------- 
    222                zsatur   = ( sio3eq(ji,jj,jk) - trb(ji,jj,jk,jpsil) ) / ( sio3eq(ji,jj,jk) + rtrn ) 
    223                zsatur   = MAX( rtrn, zsatur ) 
    224                zsatur2  = ( 1. + tsn(ji,jj,jk,jp_tem) / 400.)**37 
    225                znusil   = 0.225  * ( 1. + tsn(ji,jj,jk,jp_tem) / 15.) * zsatur + 0.775 * zsatur2 * zsatur**9.25 
    226                znusil2  = 0.225  * ( 1. + tsn(ji,jj,1,jp_tem) / 15.) + 0.775 * zsatur2 
    227  
    228                ! Two classes of BSi are considered : a labile fraction and  
    229                ! a more refractory one. The ratio between both fractions is 
    230                ! constant and specified in the namelist. 
    231                ! ---------------------------------------------------------- 
    232                zdep     = MAX( hmld(ji,jj), heup_01(ji,jj) )  
    233                zdep     = MAX( 0., fsdept(ji,jj,jk) - zdep ) 
    234                ztem     = MAX( tsn(ji,jj,1,jp_tem), 0. ) 
    235                zfactdep = xsilab * EXP(-( xsiremlab - xsirem ) * znusil2 * zdep / wsbio2 ) * ztem / ( ztem + 10. ) 
    236                zsiremin = ( xsiremlab * zfactdep + xsirem * ( 1. - zfactdep ) ) * zstep * znusil 
     246               IF ( fsdept(ji,jj,jk) > zdep ) THEN 
     247                  zfacsib(ji,jj,jk) = zfacsib(ji,jj,jk-1) * EXP( -0.5 * ( xsiremlab - xsirem )  & 
     248                  &                   * znusil * fse3t(ji,jj,jk) / wsbio4(ji,jj,jk) ) 
     249                  zfacsi(ji,jj,jk)  = zfacsib(ji,jj,jk) / ( 1.0 + zfacsib(ji,jj,jk) ) 
     250                  zfacsib(ji,jj,jk) = zfacsib(ji,jj,jk) * EXP( -0.5 * ( xsiremlab - xsirem )    & 
     251                  &                   * znusil * fse3t(ji,jj,jk) / wsbio4(ji,jj,jk) ) 
     252               ENDIF 
     253               zsiremin = ( xsiremlab * zfacsi(ji,jj,jk) + xsirem * ( 1. - zfacsi(ji,jj,jk) ) ) * zstep * znusil 
    237254               zosil    = zsiremin * trb(ji,jj,jk,jpgsi) 
    238255               ! 
    239256               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) - zosil 
    240257               tra(ji,jj,jk,jpsil) = tra(ji,jj,jk,jpsil) + zosil 
    241                ! 
    242             END DO 
    243          END DO 
    244       END DO 
     258            END DO 
     259         END DO 
     260      END DO 
     261                
    245262 
    246263      IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
     
    250267       ENDIF 
    251268 
    252       ! Update the arrays TRA which contain the biological sources and sinks 
    253       ! -------------------------------------------------------------------- 
    254  
    255       DO jk = 1, jpkm1 
    256          tra(:,:,jk,jppo4) = tra(:,:,jk,jppo4) + zolimi (:,:,jk) + denitr(:,:,jk) 
    257          tra(:,:,jk,jpnh4) = tra(:,:,jk,jpnh4) + zolimi (:,:,jk) + denitr(:,:,jk) 
    258          tra(:,:,jk,jpno3) = tra(:,:,jk,jpno3) - denitr (:,:,jk) * rdenit 
    259          tra(:,:,jk,jpdoc) = tra(:,:,jk,jpdoc) - zolimi (:,:,jk) - denitr(:,:,jk) 
    260          tra(:,:,jk,jpoxy) = tra(:,:,jk,jpoxy) - zolimi (:,:,jk) * o2ut 
    261          tra(:,:,jk,jpdic) = tra(:,:,jk,jpdic) + zolimi (:,:,jk) + denitr(:,:,jk) 
    262          tra(:,:,jk,jptal) = tra(:,:,jk,jptal) + rno3 * ( zolimi(:,:,jk) + ( rdenit + 1.) * denitr(:,:,jk) ) 
    263       END DO 
    264  
    265269      IF( ln_diatrc .AND. lk_iomput .AND. jnt == nrdttrc ) THEN 
    266270          zrfact2 = 1.e3 * rfact2r 
     
    268272          CALL iom_put( "DENIT" , denitr(:,:,:) * rdenit * rno3 * tmask(:,:,:) * zrfact2  )  ! Denitrification 
    269273      ENDIF 
    270  
    271       IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
    272          WRITE(charout, FMT="('rem4')") 
    273          CALL prt_ctl_trc_info(charout) 
    274          CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) 
    275       ENDIF 
    276274      ! 
    277275      CALL wrk_dealloc( jpi, jpj,      ztempbac ) 
    278       CALL wrk_dealloc( jpi, jpj, jpk, zdepbac, zdepprod, zolimi ) 
     276      CALL wrk_dealloc( jpi, jpj, jpk, zdepbac, zdepprod, zolimi, zfacsi, zfacsib ) 
    279277      ! 
    280278      IF( nn_timing == 1 )  CALL timing_stop('p4z_rem') 
     
    296294      !!---------------------------------------------------------------------- 
    297295      NAMELIST/nampisrem/ xremik, nitrif, xsirem, xsiremlab, xsilab,   & 
    298       &                   oxymin 
     296      &                   oxymin, oxymin2, feratb, xkferb 
    299297      INTEGER :: ios                 ! Local integer output status for namelist read 
    300298 
     
    318316         WRITE(numout,*) '    NH4 nitrification rate                    nitrif    =', nitrif 
    319317         WRITE(numout,*) '    halk saturation constant for anoxia       oxymin    =', oxymin 
     318         WRITE(numout,*) '    Minimum O2 concentration for oxic remin.  oxymin2   =', oxymin2 
     319         WRITE(numout,*) '    Bacterial Fe/C ratio                      feratb    =', feratb 
     320         WRITE(numout,*) '    Half-saturation constant for bact. Fe/C   xkferb    =', xkferb 
    320321      ENDIF 
    321322      ! 
    322323      nitrfac (:,:,:) = 0._wp 
    323324      denitr  (:,:,:) = 0._wp 
    324       denitnh4(:,:,:) = 0._wp 
    325325 
    326326   END SUBROUTINE p4z_rem_init 
     
    331331      !!                     ***  ROUTINE p4z_rem_alloc  *** 
    332332      !!---------------------------------------------------------------------- 
    333       ALLOCATE( denitr(jpi,jpj,jpk), denitnh4(jpi,jpj,jpk), STAT=p4z_rem_alloc ) 
     333      ALLOCATE( denitr(jpi,jpj,jpk), STAT=p4z_rem_alloc ) 
    334334      ! 
    335335      IF( p4z_rem_alloc /= 0 )   CALL ctl_warn('p4z_rem_alloc: failed to allocate arrays') 
Note: See TracChangeset for help on using the changeset viewer.