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 13463 for NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/TOP/PISCES/P4Z/p4zsms.F90 – NEMO

Ignore:
Timestamp:
2020-09-14T17:40:34+02:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2195:update to trunk 13461

Location:
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@13382        sette 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/TOP/PISCES/P4Z/p4zsms.F90

    r10425 r13463  
    1717   USE p4zlys          ! Calcite saturation 
    1818   USE p4zflx          ! Gas exchange 
    19    USE p4zsbc          ! External source of nutrients 
     19   USE p4zbc           ! External source of nutrients 
    2020   USE p4zsed          ! Sedimentation 
    2121   USE p4zint          ! time interpolation 
     
    2525   USE trdtrc          ! TOP trends variables 
    2626   USE sedmodel        ! Sediment model 
    27    USE prtctl_trc      ! print control for debugging 
     27   USE prtctl          ! print control for debugging 
    2828 
    2929   IMPLICIT NONE 
     
    3535   INTEGER ::    numco2, numnut, numnit      ! logical unit for co2 budget 
    3636   REAL(wp) ::   alkbudget, no3budget, silbudget, ferbudget, po4budget 
    37    REAL(wp) ::   xfact1, xfact2, xfact3 
     37   REAL(wp) ::   xfact, xfact1, xfact2, xfact3 
    3838 
    3939   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xnegtr     ! Array used to indicate negative tracer values 
    4040 
     41   !! * Substitutions 
     42#  include "do_loop_substitute.h90" 
     43#  include "domzgr_substitute.h90" 
    4144   !!---------------------------------------------------------------------- 
    4245   !! NEMO/TOP 4.0 , NEMO Consortium (2018) 
     
    4649CONTAINS 
    4750 
    48    SUBROUTINE p4z_sms( kt ) 
     51   SUBROUTINE p4z_sms( kt, Kbb, Kmm, Krhs ) 
    4952      !!--------------------------------------------------------------------- 
    5053      !!                     ***  ROUTINE p4z_sms  *** 
     
    5861      !!--------------------------------------------------------------------- 
    5962      ! 
    60       INTEGER, INTENT( in ) ::   kt      ! ocean time-step index       
     63      INTEGER, INTENT( in ) ::   kt              ! ocean time-step index       
     64      INTEGER, INTENT( in ) ::   Kbb, Kmm, Krhs  ! time level index 
    6165      !! 
    6266      INTEGER ::   ji, jj, jk, jnt, jn, jl 
    6367      REAL(wp) ::  ztra 
    6468      CHARACTER (len=25) :: charout 
     69      REAL(wp), ALLOCATABLE, DIMENSION(:,:    ) :: zw2d 
     70      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:  ) :: zw3d 
     71      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ztrdt   ! 4D workspace 
     72 
    6573      !!--------------------------------------------------------------------- 
    6674      ! 
     
    7280        ! 
    7381        IF( .NOT. ln_rsttr ) THEN 
    74             CALL p4z_che                              ! initialize the chemical constants 
    75             CALL ahini_for_at(hi)   !  set PH at kt=nit000 
     82            CALL p4z_che( Kbb, Kmm )                  ! initialize the chemical constants 
     83            CALL ahini_for_at( hi, Kbb )              !  set PH at kt=nit000 
    7684            t_oce_co2_flx_cum = 0._wp 
    7785        ELSE 
    78             CALL p4z_rst( nittrc000, 'READ' )  !* read or initialize all required fields 
     86            CALL p4z_rst( nittrc000, Kbb, Kmm,  'READ' )  !* read or initialize all required fields 
    7987        ENDIF 
    8088        ! 
    8189      ENDIF 
    8290      ! 
    83       IF( ln_pisdmp .AND. MOD( kt - nn_dttrc, nn_pisdmp ) == 0 )   CALL p4z_dmp( kt )      ! Relaxation of some tracers 
    84       ! 
    85       rfact = r2dttrc 
    86       ! 
    87       IF( ( ln_top_euler .AND. kt == nittrc000 )  .OR. ( .NOT.ln_top_euler .AND. kt <= nittrc000 + nn_dttrc ) ) THEN 
     91      IF( ln_pisdmp .AND. MOD( kt - 1, nn_pisdmp ) == 0 )   CALL p4z_dmp( kt, Kbb, Kmm )      ! Relaxation of some tracers 
     92      ! 
     93      rfact = rDt_trc 
     94      ! 
     95      ! trends computation initialisation 
     96      IF( l_trdtrc )  THEN 
     97         ALLOCATE( ztrdt(jpi,jpj,jpk,jp_pisces) )  !* store now fields before applying the Asselin filter 
     98         ztrdt(:,:,:,:)  = tr(:,:,:,:,Kmm) 
     99      ENDIF 
     100      ! 
     101 
     102      IF( ( ln_top_euler .AND. kt == nittrc000 )  .OR. ( .NOT.ln_top_euler .AND. kt <= nittrc000 + 1 ) ) THEN 
    88103         rfactr  = 1. / rfact 
    89104         rfact2  = rfact / REAL( nrdttrc, wp ) 
    90105         rfact2r = 1. / rfact2 
    91106         xstep = rfact2 / rday         ! Time step duration for biology 
     107         xfact = 1.e+3 * rfact2r 
    92108         IF(lwp) WRITE(numout,*)  
    93          IF(lwp) WRITE(numout,*) '    Passive Tracer  time step    rfact  = ', rfact, ' rdt = ', rdt 
     109         IF(lwp) WRITE(numout,*) '    Passive Tracer  time step    rfact  = ', rfact, ' rn_Dt = ', rn_Dt 
    94110         IF(lwp) write(numout,*) '    PISCES  Biology time step    rfact2 = ', rfact2 
    95111         IF(lwp) WRITE(numout,*) 
    96112      ENDIF 
    97113 
    98       IF( ( neuler == 0 .AND. kt == nittrc000 ) .OR. ln_top_euler ) THEN 
     114      IF( l_1st_euler .OR. ln_top_euler ) THEN 
    99115         DO jn = jp_pcs0, jp_pcs1              !   SMS on tracer without Asselin time-filter 
    100             trb(:,:,:,jn) = trn(:,:,:,jn) 
     116            tr(:,:,:,jn,Kbb) = tr(:,:,:,jn,Kmm) 
    101117         END DO 
    102118      ENDIF 
    103119      ! 
    104       IF( ll_sbc ) CALL p4z_sbc( kt )   ! external sources of nutrients  
     120      IF( ll_bc )    CALL p4z_bc( kt, Kbb, Kmm, Krhs )   ! external sources of nutrients  
    105121      ! 
    106122#if ! defined key_sed_off 
    107       CALL p4z_che              ! computation of chemical constants 
    108       CALL p4z_int( kt )        ! computation of various rates for biogeochemistry 
     123      CALL p4z_che(     Kbb, Kmm       ) ! computation of chemical constants 
     124      CALL p4z_int( kt, Kbb, Kmm       ) ! computation of various rates for biogeochemistry 
    109125      ! 
    110126      DO jnt = 1, nrdttrc          ! Potential time splitting if requested 
    111127         ! 
    112          CALL p4z_bio( kt, jnt )   ! Biology 
    113          CALL p4z_lys( kt, jnt )   ! Compute CaCO3 saturation 
    114          CALL p4z_sed( kt, jnt )   ! Surface and Bottom boundary conditions 
    115          CALL p4z_flx( kt, jnt )   ! Compute surface fluxes 
     128         CALL p4z_bio( kt, jnt, Kbb, Kmm, Krhs )   ! Biology 
     129         CALL p4z_lys( kt, jnt, Kbb,      Krhs )   ! Compute CaCO3 saturation 
     130         CALL p4z_sed( kt, jnt, Kbb, Kmm, Krhs )   ! Surface and Bottom boundary conditions 
     131         CALL p4z_flx( kt, jnt, Kbb, Kmm, Krhs )   ! Compute surface fluxes 
    116132         ! 
    117133         xnegtr(:,:,:) = 1.e0 
    118134         DO jn = jp_pcs0, jp_pcs1 
    119             DO jk = 1, jpk 
    120                DO jj = 1, jpj 
    121                   DO ji = 1, jpi 
    122                      IF( ( trb(ji,jj,jk,jn) + tra(ji,jj,jk,jn) ) < 0.e0 ) THEN 
    123                         ztra             = ABS( trb(ji,jj,jk,jn) ) / ( ABS( tra(ji,jj,jk,jn) ) + rtrn ) 
    124                         xnegtr(ji,jj,jk) = MIN( xnegtr(ji,jj,jk),  ztra ) 
    125                      ENDIF 
    126                  END DO 
    127                END DO 
    128             END DO 
     135            DO_3D( 1, 1, 1, 1, 1, jpk ) 
     136               IF( ( tr(ji,jj,jk,jn,Kbb) + tr(ji,jj,jk,jn,Krhs) ) < 0.e0 ) THEN 
     137                  ztra             = ABS( tr(ji,jj,jk,jn,Kbb) ) / ( ABS( tr(ji,jj,jk,jn,Krhs) ) + rtrn ) 
     138                  xnegtr(ji,jj,jk) = MIN( xnegtr(ji,jj,jk),  ztra ) 
     139               ENDIF 
     140            END_3D 
    129141         END DO 
    130142         !                                ! where at least 1 tracer concentration becomes negative 
    131143         !                                !  
    132144         DO jn = jp_pcs0, jp_pcs1 
    133            trb(:,:,:,jn) = trb(:,:,:,jn) + xnegtr(:,:,:) * tra(:,:,:,jn) 
     145           tr(:,:,:,jn,Kbb) = tr(:,:,:,jn,Kbb) + xnegtr(:,:,:) * tr(:,:,:,jn,Krhs) 
    134146         END DO 
    135147        ! 
     148        IF(  iom_use( 'INTdtAlk' ) .OR. iom_use( 'INTdtDIC' ) .OR. iom_use( 'INTdtFer' ) .OR.  & 
     149          &  iom_use( 'INTdtDIN' ) .OR. iom_use( 'INTdtDIP' ) .OR. iom_use( 'INTdtSil' ) )  THEN 
     150          ! 
     151          ALLOCATE( zw3d(jpi,jpj,jpk), zw2d(jpi,jpj) ) 
     152          zw3d(:,:,jpk) = 0. 
     153          DO jk = 1, jpkm1 
     154              zw3d(:,:,jk) = xnegtr(:,:,jk) * xfact * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
     155          ENDDO 
     156          ! 
     157          zw2d(:,:) = 0. 
     158          DO jk = 1, jpkm1 
     159             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * tr(:,:,jk,jptal,Krhs) 
     160          ENDDO 
     161          CALL iom_put( 'INTdtAlk', zw2d ) 
     162          ! 
     163          zw2d(:,:) = 0. 
     164          DO jk = 1, jpkm1 
     165             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * tr(:,:,jk,jpdic,Krhs) 
     166          ENDDO 
     167          CALL iom_put( 'INTdtDIC', zw2d ) 
     168          ! 
     169          zw2d(:,:) = 0. 
     170          DO jk = 1, jpkm1 
     171             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * rno3 * ( tr(:,:,jk,jpno3,Krhs) + tr(:,:,jk,jpnh4,Krhs) ) 
     172          ENDDO 
     173          CALL iom_put( 'INTdtDIN', zw2d ) 
     174          ! 
     175          zw2d(:,:) = 0. 
     176          DO jk = 1, jpkm1 
     177             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * po4r * tr(:,:,jk,jppo4,Krhs) 
     178          ENDDO 
     179          CALL iom_put( 'INTdtDIP', zw2d ) 
     180          ! 
     181          zw2d(:,:) = 0. 
     182          DO jk = 1, jpkm1 
     183             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * tr(:,:,jk,jpfer,Krhs) 
     184          ENDDO 
     185          CALL iom_put( 'INTdtFer', zw2d ) 
     186          ! 
     187          zw2d(:,:) = 0. 
     188          DO jk = 1, jpkm1 
     189             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * tr(:,:,jk,jpsil,Krhs) 
     190          ENDDO 
     191          CALL iom_put( 'INTdtSil', zw2d ) 
     192          ! 
     193          DEALLOCATE( zw3d, zw2d ) 
     194        ENDIF 
     195        ! 
    136196         DO jn = jp_pcs0, jp_pcs1 
    137             tra(:,:,:,jn) = 0._wp 
     197            tr(:,:,:,jn,Krhs) = 0._wp 
    138198         END DO 
    139199         ! 
    140200         IF( ln_top_euler ) THEN 
    141201            DO jn = jp_pcs0, jp_pcs1 
    142                trn(:,:,:,jn) = trb(:,:,:,jn) 
     202               tr(:,:,:,jn,Kmm) = tr(:,:,:,jn,Kbb) 
    143203            END DO 
    144204         ENDIF 
    145205      END DO 
    146  
    147206      ! 
    148207      IF( l_trdtrc ) THEN 
    149208         DO jn = jp_pcs0, jp_pcs1 
    150            CALL trd_trc( tra(:,:,:,jn), jn, jptra_sms, kt )   ! save trends 
     209           ztrdt(:,:,:,jn) = ( tr(:,:,:,jn,Kbb) - ztrdt(:,:,:,jn) ) * rfactr  
     210           CALL trd_trc( tr(:,:,:,jn,Krhs), jn, jptra_sms, kt, Kmm )   ! save trends 
    151211         END DO 
     212         DEALLOCATE( ztrdt )  
    152213      END IF 
    153214#endif 
     
    155216      IF( ln_sediment ) THEN  
    156217         ! 
    157          CALL sed_model( kt )     !  Main program of Sediment model 
     218         CALL sed_model( kt, Kbb, Kmm, Krhs )     !  Main program of Sediment model 
    158219         ! 
    159220         IF( ln_top_euler ) THEN 
    160221            DO jn = jp_pcs0, jp_pcs1 
    161                trn(:,:,:,jn) = trb(:,:,:,jn) 
     222               tr(:,:,:,jn,Kmm) = tr(:,:,:,jn,Kbb) 
    162223            END DO 
    163224         ENDIF 
     
    165226      ENDIF 
    166227      ! 
    167       IF( lrst_trc )  CALL p4z_rst( kt, 'WRITE' )  !* Write PISCES informations in restart file  
    168       ! 
    169  
    170       IF( lk_iomput .OR. ln_check_mass )  CALL p4z_chk_mass( kt )    ! Mass conservation checking 
    171  
    172       IF( lwm .AND. kt == nittrc000    )  CALL FLUSH( numonp )       ! flush output namelist PISCES 
     228      IF( lrst_trc )  CALL p4z_rst( kt, Kbb, Kmm,  'WRITE' )           !* Write PISCES informations in restart file  
     229      ! 
     230 
     231      IF( lk_iomput .OR. ln_check_mass )  CALL p4z_chk_mass( kt, Kmm ) ! Mass conservation checking 
     232 
     233      IF( lwm .AND. kt == nittrc000    )  CALL FLUSH( numonp )         ! flush output namelist PISCES 
    173234      ! 
    174235      IF( ln_timing )  CALL timing_stop('p4z_sms') 
     
    201262      ENDIF 
    202263 
    203       REWIND( numnatp_ref )              ! Namelist nampisbio in reference namelist : Pisces variables 
    204264      READ  ( numnatp_ref, nampisbio, IOSTAT = ios, ERR = 901) 
    205 901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisbio in reference namelist', lwp ) 
    206       REWIND( numnatp_cfg )              ! Namelist nampisbio in configuration namelist : Pisces variables 
     265901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisbio in reference namelist' ) 
    207266      READ  ( numnatp_cfg, nampisbio, IOSTAT = ios, ERR = 902 ) 
    208 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisbio in configuration namelist', lwp ) 
     267902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisbio in configuration namelist' ) 
    209268      IF(lwm) WRITE( numonp, nampisbio ) 
    210269      ! 
     
    232291 
    233292 
    234       REWIND( numnatp_ref )              ! Namelist nampisdmp in reference namelist : Pisces damping 
    235293      READ  ( numnatp_ref, nampisdmp, IOSTAT = ios, ERR = 905) 
    236 905   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisdmp in reference namelist', lwp ) 
    237       REWIND( numnatp_cfg )              ! Namelist nampisdmp in configuration namelist : Pisces damping 
     294905   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisdmp in reference namelist' ) 
    238295      READ  ( numnatp_cfg, nampisdmp, IOSTAT = ios, ERR = 906 ) 
    239 906   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisdmp in configuration namelist', lwp ) 
     296906   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisdmp in configuration namelist' ) 
    240297      IF(lwm) WRITE( numonp, nampisdmp ) 
    241298      ! 
     
    247304      ENDIF 
    248305 
    249       REWIND( numnatp_ref )              ! Namelist nampismass in reference namelist : Pisces mass conservation check 
    250306      READ  ( numnatp_ref, nampismass, IOSTAT = ios, ERR = 907) 
    251 907   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampismass in reference namelist', lwp ) 
    252       REWIND( numnatp_cfg )              ! Namelist nampismass in configuration namelist : Pisces mass conservation check  
     307907   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampismass in reference namelist' ) 
    253308      READ  ( numnatp_cfg, nampismass, IOSTAT = ios, ERR = 908 ) 
    254 908   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampismass in configuration namelist', lwp ) 
     309908   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampismass in configuration namelist' ) 
    255310      IF(lwm) WRITE( numonp, nampismass ) 
    256311 
     
    264319 
    265320 
    266    SUBROUTINE p4z_rst( kt, cdrw ) 
     321   SUBROUTINE p4z_rst( kt, Kbb, Kmm, cdrw ) 
    267322      !!--------------------------------------------------------------------- 
    268323      !!                   ***  ROUTINE p4z_rst  *** 
     
    275330      !!--------------------------------------------------------------------- 
    276331      INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
     332      INTEGER         , INTENT(in) ::   Kbb, Kmm   ! time level indices 
    277333      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
    278334      !!--------------------------------------------------------------------- 
     
    285341         !  
    286342         IF( iom_varid( numrtr, 'PH', ldstop = .FALSE. ) > 0 ) THEN 
    287             CALL iom_get( numrtr, jpdom_autoglo, 'PH' , hi(:,:,:)  ) 
     343            CALL iom_get( numrtr, jpdom_auto, 'PH' , hi(:,:,:)  ) 
    288344         ELSE 
    289             CALL p4z_che                              ! initialize the chemical constants 
    290             CALL ahini_for_at(hi) 
    291          ENDIF 
    292          CALL iom_get( numrtr, jpdom_autoglo, 'Silicalim', xksi(:,:) ) 
     345            CALL p4z_che( Kbb, Kmm )                  ! initialize the chemical constants 
     346            CALL ahini_for_at( hi, Kbb ) 
     347         ENDIF 
     348         CALL iom_get( numrtr, jpdom_auto, 'Silicalim', xksi(:,:) ) 
    293349         IF( iom_varid( numrtr, 'Silicamax', ldstop = .FALSE. ) > 0 ) THEN 
    294             CALL iom_get( numrtr, jpdom_autoglo, 'Silicamax' , xksimax(:,:)  ) 
     350            CALL iom_get( numrtr, jpdom_auto, 'Silicamax' , xksimax(:,:)  ) 
    295351         ELSE 
    296352            xksimax(:,:) = xksi(:,:) 
     
    305361         IF( ln_p5z ) THEN 
    306362            IF( iom_varid( numrtr, 'sized', ldstop = .FALSE. ) > 0 ) THEN 
    307                CALL iom_get( numrtr, jpdom_autoglo, 'sizep' , sizep(:,:,:)  ) 
    308                CALL iom_get( numrtr, jpdom_autoglo, 'sizen' , sizen(:,:,:)  ) 
    309                CALL iom_get( numrtr, jpdom_autoglo, 'sized' , sized(:,:,:)  ) 
     363               CALL iom_get( numrtr, jpdom_auto, 'sizep' , sizep(:,:,:)  ) 
     364               CALL iom_get( numrtr, jpdom_auto, 'sizen' , sizen(:,:,:)  ) 
     365               CALL iom_get( numrtr, jpdom_auto, 'sized' , sized(:,:,:)  ) 
    310366            ELSE 
    311367               sizep(:,:,:) = 1. 
     
    335391 
    336392 
    337    SUBROUTINE p4z_dmp( kt ) 
     393   SUBROUTINE p4z_dmp( kt, Kbb, Kmm ) 
    338394      !!---------------------------------------------------------------------- 
    339395      !!                    ***  p4z_dmp  *** 
     
    342398      !!---------------------------------------------------------------------- 
    343399      ! 
    344       INTEGER, INTENT( in )  ::     kt ! time step 
     400      INTEGER, INTENT( in )  ::     kt            ! time step 
     401      INTEGER, INTENT( in )  ::     Kbb, Kmm      ! time level indices 
    345402      ! 
    346403      REAL(wp) ::  alkmean = 2426.     ! mean value of alkalinity ( Glodap ; for Goyet 2391. ) 
     
    363420            zarea          = 1._wp / glob_sum( 'p4zsms', cvol(:,:,:) ) * 1e6               
    364421 
    365             zalksumn = glob_sum( 'p4zsms', trn(:,:,:,jptal) * cvol(:,:,:)  ) * zarea 
    366             zpo4sumn = glob_sum( 'p4zsms', trn(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea * po4r 
    367             zno3sumn = glob_sum( 'p4zsms', trn(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea * rno3 
    368             zsilsumn = glob_sum( 'p4zsms', trn(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea 
     422            zalksumn = glob_sum( 'p4zsms', tr(:,:,:,jptal,Kmm) * cvol(:,:,:)  ) * zarea 
     423            zpo4sumn = glob_sum( 'p4zsms', tr(:,:,:,jppo4,Kmm) * cvol(:,:,:)  ) * zarea * po4r 
     424            zno3sumn = glob_sum( 'p4zsms', tr(:,:,:,jpno3,Kmm) * cvol(:,:,:)  ) * zarea * rno3 
     425            zsilsumn = glob_sum( 'p4zsms', tr(:,:,:,jpsil,Kmm) * cvol(:,:,:)  ) * zarea 
    369426  
    370427            IF(lwp) WRITE(numout,*) '       TALKN mean : ', zalksumn 
    371             trn(:,:,:,jptal) = trn(:,:,:,jptal) * alkmean / zalksumn 
     428            tr(:,:,:,jptal,Kmm) = tr(:,:,:,jptal,Kmm) * alkmean / zalksumn 
    372429 
    373430            IF(lwp) WRITE(numout,*) '       PO4N  mean : ', zpo4sumn 
    374             trn(:,:,:,jppo4) = trn(:,:,:,jppo4) * po4mean / zpo4sumn 
     431            tr(:,:,:,jppo4,Kmm) = tr(:,:,:,jppo4,Kmm) * po4mean / zpo4sumn 
    375432 
    376433            IF(lwp) WRITE(numout,*) '       NO3N  mean : ', zno3sumn 
    377             trn(:,:,:,jpno3) = trn(:,:,:,jpno3) * no3mean / zno3sumn 
     434            tr(:,:,:,jpno3,Kmm) = tr(:,:,:,jpno3,Kmm) * no3mean / zno3sumn 
    378435 
    379436            IF(lwp) WRITE(numout,*) '       SiO3N mean : ', zsilsumn 
    380             trn(:,:,:,jpsil) = MIN( 400.e-6,trn(:,:,:,jpsil) * silmean / zsilsumn ) 
     437            tr(:,:,:,jpsil,Kmm) = MIN( 400.e-6,tr(:,:,:,jpsil,Kmm) * silmean / zsilsumn ) 
    381438            ! 
    382439            ! 
    383440            IF( .NOT. ln_top_euler ) THEN 
    384                zalksumb = glob_sum( 'p4zsms', trb(:,:,:,jptal) * cvol(:,:,:)  ) * zarea 
    385                zpo4sumb = glob_sum( 'p4zsms', trb(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea * po4r 
    386                zno3sumb = glob_sum( 'p4zsms', trb(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea * rno3 
    387                zsilsumb = glob_sum( 'p4zsms', trb(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea 
     441               zalksumb = glob_sum( 'p4zsms', tr(:,:,:,jptal,Kbb) * cvol(:,:,:)  ) * zarea 
     442               zpo4sumb = glob_sum( 'p4zsms', tr(:,:,:,jppo4,Kbb) * cvol(:,:,:)  ) * zarea * po4r 
     443               zno3sumb = glob_sum( 'p4zsms', tr(:,:,:,jpno3,Kbb) * cvol(:,:,:)  ) * zarea * rno3 
     444               zsilsumb = glob_sum( 'p4zsms', tr(:,:,:,jpsil,Kbb) * cvol(:,:,:)  ) * zarea 
    388445  
    389446               IF(lwp) WRITE(numout,*) ' ' 
    390447               IF(lwp) WRITE(numout,*) '       TALKB mean : ', zalksumb 
    391                trb(:,:,:,jptal) = trb(:,:,:,jptal) * alkmean / zalksumb 
     448               tr(:,:,:,jptal,Kbb) = tr(:,:,:,jptal,Kbb) * alkmean / zalksumb 
    392449 
    393450               IF(lwp) WRITE(numout,*) '       PO4B  mean : ', zpo4sumb 
    394                trb(:,:,:,jppo4) = trb(:,:,:,jppo4) * po4mean / zpo4sumb 
     451               tr(:,:,:,jppo4,Kbb) = tr(:,:,:,jppo4,Kbb) * po4mean / zpo4sumb 
    395452 
    396453               IF(lwp) WRITE(numout,*) '       NO3B  mean : ', zno3sumb 
    397                trb(:,:,:,jpno3) = trb(:,:,:,jpno3) * no3mean / zno3sumb 
     454               tr(:,:,:,jpno3,Kbb) = tr(:,:,:,jpno3,Kbb) * no3mean / zno3sumb 
    398455 
    399456               IF(lwp) WRITE(numout,*) '       SiO3B mean : ', zsilsumb 
    400                trb(:,:,:,jpsil) = MIN( 400.e-6,trb(:,:,:,jpsil) * silmean / zsilsumb ) 
     457               tr(:,:,:,jpsil,Kbb) = MIN( 400.e-6,tr(:,:,:,jpsil,Kbb) * silmean / zsilsumb ) 
    401458           ENDIF 
    402459        ENDIF 
     
    407464 
    408465 
    409    SUBROUTINE p4z_chk_mass( kt ) 
     466   SUBROUTINE p4z_chk_mass( kt, Kmm ) 
    410467      !!---------------------------------------------------------------------- 
    411468      !!                  ***  ROUTINE p4z_chk_mass  *** 
     
    415472      !!--------------------------------------------------------------------- 
    416473      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index       
     474      INTEGER, INTENT( in ) ::   Kmm     ! time level indices 
    417475      REAL(wp)             ::  zrdenittot, zsdenittot, znitrpottot 
    418476      CHARACTER(LEN=100)   ::   cltxt 
     
    438496         !   Compute the budget of NO3, ALK, Si, Fer 
    439497         IF( ln_p4z ) THEN 
    440             zwork(:,:,:) =    trn(:,:,:,jpno3) + trn(:,:,:,jpnh4)                      & 
    441                &          +   trn(:,:,:,jpphy) + trn(:,:,:,jpdia)                      & 
    442                &          +   trn(:,:,:,jppoc) + trn(:,:,:,jpgoc)  + trn(:,:,:,jpdoc)  &         
    443                &          +   trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  
     498            zwork(:,:,:) =    tr(:,:,:,jpno3,Kmm) + tr(:,:,:,jpnh4,Kmm)                      & 
     499               &          +   tr(:,:,:,jpphy,Kmm) + tr(:,:,:,jpdia,Kmm)                      & 
     500               &          +   tr(:,:,:,jppoc,Kmm) + tr(:,:,:,jpgoc,Kmm)  + tr(:,:,:,jpdoc,Kmm)  &         
     501               &          +   tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm)  
    444502        ELSE 
    445             zwork(:,:,:) =    trn(:,:,:,jpno3) + trn(:,:,:,jpnh4) + trn(:,:,:,jpnph)   & 
    446                &          +   trn(:,:,:,jpndi) + trn(:,:,:,jpnpi)                      &  
    447                &          +   trn(:,:,:,jppon) + trn(:,:,:,jpgon) + trn(:,:,:,jpdon)   & 
    448                &          + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) ) * no3rat3  
     503            zwork(:,:,:) =    tr(:,:,:,jpno3,Kmm) + tr(:,:,:,jpnh4,Kmm) + tr(:,:,:,jpnph,Kmm)   & 
     504               &          +   tr(:,:,:,jpndi,Kmm) + tr(:,:,:,jpnpi,Kmm)                      &  
     505               &          +   tr(:,:,:,jppon,Kmm) + tr(:,:,:,jpgon,Kmm) + tr(:,:,:,jpdon,Kmm)   & 
     506               &          + ( tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm) ) * no3rat3  
    449507        ENDIF 
    450508        ! 
     
    456514      IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    457515         IF( ln_p4z ) THEN 
    458             zwork(:,:,:) =    trn(:,:,:,jppo4)                                         & 
    459                &          +   trn(:,:,:,jpphy) + trn(:,:,:,jpdia)                      & 
    460                &          +   trn(:,:,:,jppoc) + trn(:,:,:,jpgoc)  + trn(:,:,:,jpdoc)  &         
    461                &          +   trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  
     516            zwork(:,:,:) =    tr(:,:,:,jppo4,Kmm)                                         & 
     517               &          +   tr(:,:,:,jpphy,Kmm) + tr(:,:,:,jpdia,Kmm)                      & 
     518               &          +   tr(:,:,:,jppoc,Kmm) + tr(:,:,:,jpgoc,Kmm)  + tr(:,:,:,jpdoc,Kmm)  &         
     519               &          +   tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm)  
    462520        ELSE 
    463             zwork(:,:,:) =    trn(:,:,:,jppo4) + trn(:,:,:,jppph)                      & 
    464                &          +   trn(:,:,:,jppdi) + trn(:,:,:,jpppi)                      &  
    465                &          +   trn(:,:,:,jppop) + trn(:,:,:,jpgop) + trn(:,:,:,jpdop)   & 
    466                &          + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) ) * po4rat3  
     521            zwork(:,:,:) =    tr(:,:,:,jppo4,Kmm) + tr(:,:,:,jppph,Kmm)                      & 
     522               &          +   tr(:,:,:,jppdi,Kmm) + tr(:,:,:,jpppi,Kmm)                      &  
     523               &          +   tr(:,:,:,jppop,Kmm) + tr(:,:,:,jpgop,Kmm) + tr(:,:,:,jpdop,Kmm)   & 
     524               &          + ( tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm) ) * po4rat3  
    467525        ENDIF 
    468526        ! 
     
    473531      ! 
    474532      IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    475          zwork(:,:,:) =  trn(:,:,:,jpsil) + trn(:,:,:,jpgsi) + trn(:,:,:,jpdsi)  
     533         zwork(:,:,:) =  tr(:,:,:,jpsil,Kmm) + tr(:,:,:,jpgsi,Kmm) + tr(:,:,:,jpdsi,Kmm)  
    476534         ! 
    477535         silbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )   
     
    481539      ! 
    482540      IF( iom_use( "palktot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    483          zwork(:,:,:) =  trn(:,:,:,jpno3) * rno3 + trn(:,:,:,jptal) + trn(:,:,:,jpcal) * 2.               
     541         zwork(:,:,:) =  tr(:,:,:,jpno3,Kmm) * rno3 + tr(:,:,:,jptal,Kmm) + tr(:,:,:,jpcal,Kmm) * 2.               
    484542         ! 
    485543         alkbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )         ! 
     
    489547      ! 
    490548      IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN 
    491          zwork(:,:,:) =   trn(:,:,:,jpfer) + trn(:,:,:,jpnfe) + trn(:,:,:,jpdfe)   & 
    492             &         +   trn(:,:,:,jpbfe) + trn(:,:,:,jpsfe)                      & 
    493             &         + ( trn(:,:,:,jpzoo) + trn(:,:,:,jpmes) )  * ferat3     
     549         zwork(:,:,:) =   tr(:,:,:,jpfer,Kmm) + tr(:,:,:,jpnfe,Kmm) + tr(:,:,:,jpdfe,Kmm)   & 
     550            &         +   tr(:,:,:,jpbfe,Kmm) + tr(:,:,:,jpsfe,Kmm)                      & 
     551            &         + ( tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm) )  * ferat3     
    494552         ! 
    495553         ferbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )   
Note: See TracChangeset for help on using the changeset viewer.