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 13469 for NEMO/branches/2020/temporary_r4_trunk/src/OCE/ZDF/zdftke.F90 – NEMO

Ignore:
Timestamp:
2020-09-15T12:49:18+02:00 (4 years ago)
Author:
smasson
Message:

r4_trunk: first change of DO loops for routines to be merged, see #2523

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/temporary_r4_trunk/src/OCE/ZDF/zdftke.F90

    r13466 r13469  
    231231      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    232232      ! 
    233       DO jj = 2, jpjm1            ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
    234          DO ji = fs_2, fs_jpim1   ! vector opt. 
     233      DO_2D_00_00 
    235234!! clem: this should be the right formulation but it makes the model unstable unless drags are calculated implicitly 
    236235!!       one way around would be to increase zbbirau  
    237236!!          en(ji,jj,1) = MAX( rn_emin0, ( ( 1._wp - fr_i(ji,jj) ) * zbbrau + & 
    238237!!             &                                     fr_i(ji,jj)   * zbbirau ) * taum(ji,jj) ) * tmask(ji,jj,1) 
    239             en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 
    240          END DO 
    241       END DO 
     238         en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 
     239      END_2D 
    242240      ! 
    243241      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    251249      IF( .NOT.ln_drg_OFF ) THEN    !== friction used as top/bottom boundary condition on TKE 
    252250         ! 
    253          DO jj = 2, jpjm1              ! bottom friction 
    254             DO ji = fs_2, fs_jpim1     ! vector opt. 
    255                zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
    256                zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
    257                !                       ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0) 
    258                zebot = - 0.001875_wp * rCdU_bot(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mbkt(ji,jj))+ub(ji-1,jj,mbkt(ji,jj)) ) )**2  & 
    259                   &                                           + ( zmskv*( vb(ji,jj,mbkt(ji,jj))+vb(ji,jj-1,mbkt(ji,jj)) ) )**2  ) 
    260                en(ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * ssmask(ji,jj) 
    261             END DO 
    262          END DO 
     251         DO_2D_00_00 
     252            zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     253            zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
     254            !                       ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0) 
     255            zebot = - 0.001875_wp * rCdU_bot(ji,jj) * SQRT(  ( zmsku*( uu(ji,jj,mbkt(ji,jj),Nnn)+uu(ji-1,jj,mbkt(ji,jj),Nnn) ) )**2  & 
     256               &                                           + ( zmskv*( vv(ji,jj,mbkt(ji,jj),Nnn)+vv(ji,jj-1,mbkt(ji,jj),Nnn) ) )**2  ) 
     257            en(ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * ssmask(ji,jj) 
     258         END_2D 
    263259         IF( ln_isfcav ) THEN       ! top friction 
    264             DO jj = 2, jpjm1 
    265                DO ji = fs_2, fs_jpim1   ! vector opt. 
    266                   zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
    267                   zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) 
    268                   !                             ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000.  (CAUTION CdU<0) 
    269                   zetop = - 0.001875_wp * rCdU_top(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2  & 
    270                      &                                           + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2  ) 
    271                   en(ji,jj,mikt(ji,jj)) = en(ji,jj,1)           * tmask(ji,jj,1) &      
    272                      &                  + MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1)) * ssmask(ji,jj) 
    273                END DO 
    274             END DO 
     260            DO_2D_00_00 
     261               zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
     262               zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) 
     263               !                             ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000.  (CAUTION CdU<0) 
     264               zetop = - 0.001875_wp * rCdU_top(ji,jj) * SQRT(  ( zmsku*( uu(ji,jj,mikt(ji,jj),Nnn)+uu(ji-1,jj,mikt(ji,jj),Nnn) ) )**2  & 
     265                  &                                           + ( zmskv*( vv(ji,jj,mikt(ji,jj),Nnn)+vv(ji,jj-1,mikt(ji,jj),Nnn) ) )**2  ) 
     266               en(ji,jj,mikt(ji,jj)) = en(ji,jj,1)           * tmask(ji,jj,1) &      
     267                  &                  + MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1)) * ssmask(ji,jj) 
     268            END_2D 
    275269         ENDIF 
    276270         ! 
     
    289283         zcof = 0.5 * 0.016 * 0.016 / ( zrhoa * zcdrag ) 
    290284         imlc(:,:) = mbkt(:,:) + 1       ! Initialization to the number of w ocean point (=2 over land) 
    291          DO jk = jpkm1, 2, -1 
    292             DO jj = 1, jpj               ! Last w-level at which zpelc>=0.5*us*us  
    293                DO ji = 1, jpi            !      with us=0.016*wind(starting from jpk-1) 
    294                   zus  = zcof * taum(ji,jj) 
    295                   IF( zpelc(ji,jj,jk) > zus )   imlc(ji,jj) = jk 
    296                END DO 
    297             END DO 
    298          END DO 
     285         DO_3D_11_11( jpkm1, 2, -1 ) 
     286            zus  = zcof * taum(ji,jj) 
     287            IF( zpelc(ji,jj,jk) > zus )   imlc(ji,jj) = jk 
     288         END_3D 
    299289         !                               ! finite LC depth 
    300          DO jj = 1, jpj  
    301             DO ji = 1, jpi 
    302                zhlc(ji,jj) = pdepw(ji,jj,imlc(ji,jj)) 
    303             END DO 
    304          END DO 
     290         DO_2D_11_11 
     291            zhlc(ji,jj) = pdepw(ji,jj,imlc(ji,jj)) 
     292         END_2D 
    305293         zcof = 0.016 / SQRT( zrhoa * zcdrag ) 
    306          DO jj = 2, jpjm1 
    307             DO ji = fs_2, fs_jpim1   ! vector opt. 
    308                zus  = zcof * SQRT( taum(ji,jj) )           ! Stokes drift 
    309                zus3(ji,jj) = MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 
    310             END DO 
    311          END DO          
    312          DO jk = 2, jpkm1         !* TKE Langmuir circulation source term added to en 
    313             DO jj = 2, jpjm1 
    314                DO ji = fs_2, fs_jpim1   ! vector opt. 
    315                   IF ( zus3(ji,jj) /= 0._wp ) THEN                
    316                      ! vertical velocity due to LC    
    317                      IF ( pdepw(ji,jj,jk) - zhlc(ji,jj) < 0 .AND. wmask(ji,jj,jk) /= 0. ) THEN 
    318                         !                                           ! vertical velocity due to LC 
    319                         zwlc = rn_lc * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) 
    320                         !                                           ! TKE Langmuir circulation source term 
    321                         en(ji,jj,jk) = en(ji,jj,jk) + rdt * zus3(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) 
    322                      ENDIF 
    323                   ENDIF 
    324                END DO 
    325             END DO 
    326          END DO 
     294         DO_2D_00_00 
     295            zus  = zcof * SQRT( taum(ji,jj) )           ! Stokes drift 
     296            zus3(ji,jj) = MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 
     297         END_2D 
     298         DO_3D_00_00( 2, jpkm1 ) 
     299            IF ( zus3(ji,jj) /= 0._wp ) THEN                
     300               ! vertical velocity due to LC    
     301               IF ( pdepw(ji,jj,jk) - zhlc(ji,jj) < 0 .AND. wmask(ji,jj,jk) /= 0. ) THEN 
     302                  !                                           ! vertical velocity due to LC 
     303                  zwlc = rn_lc * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) 
     304                  !                                           ! TKE Langmuir circulation source term 
     305                  en(ji,jj,jk) = en(ji,jj,jk) + rdt * zus3(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) 
     306               ENDIF 
     307            ENDIF 
     308         END_3D 
    327309         ! 
    328310      ENDIF 
     
    336318      ! 
    337319      IF( nn_pdl == 1 ) THEN      !* Prandtl number = F( Ri ) 
    338          DO jk = 2, jpkm1 
    339             DO jj = 2, jpjm1 
    340                DO ji = 2, jpim1 
    341                   !                             ! local Richardson number 
    342                   zri = MAX( rn2b(ji,jj,jk), 0._wp ) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 
    343                   !                             ! inverse of Prandtl number 
    344                   apdlr(ji,jj,jk) = MAX(  0.1_wp,  ri_cri / MAX( ri_cri , zri )  ) 
    345                END DO 
    346             END DO 
    347          END DO 
     320         DO_3D_00_00( 2, jpkm1 ) 
     321            !                             ! local Richardson number 
     322            zri = MAX( rn2b(ji,jj,jk), 0._wp ) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 
     323            !                             ! inverse of Prandtl number 
     324            apdlr(ji,jj,jk) = MAX(  0.1_wp,  ri_cri / MAX( ri_cri , zri )  ) 
     325         END_3D 
    348326      ENDIF 
    349327      !          
    350       DO jk = 2, jpkm1           !* Matrix and right hand side in en 
    351          DO jj = 2, jpjm1 
    352             DO ji = fs_2, fs_jpim1   ! vector opt. 
    353                zcof   = zfact1 * tmask(ji,jj,jk) 
    354                !                                   ! A minimum of 2.e-5 m2/s is imposed on TKE vertical 
    355                !                                   ! eddy coefficient (ensure numerical stability) 
    356                zzd_up = zcof * MAX(  p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk  ) , 2.e-5_wp  )   &  ! upper diagonal 
    357                   &          /    (  p_e3t(ji,jj,jk  ) * p_e3w(ji,jj,jk  )  ) 
    358                zzd_lw = zcof * MAX(  p_avm(ji,jj,jk  ) + p_avm(ji,jj,jk-1) , 2.e-5_wp  )   &  ! lower diagonal 
    359                   &          /    (  p_e3t(ji,jj,jk-1) * p_e3w(ji,jj,jk  )  ) 
    360                ! 
    361                zd_up(ji,jj,jk) = zzd_up            ! Matrix (zdiag, zd_up, zd_lw) 
    362                zd_lw(ji,jj,jk) = zzd_lw 
    363                zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * wmask(ji,jj,jk) 
    364                ! 
    365                !                                   ! right hand side in en 
    366                en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  p_sh2(ji,jj,jk)                          &   ! shear 
    367                   &                                 - p_avt(ji,jj,jk) * rn2(ji,jj,jk)          &   ! stratification 
    368                   &                                 + zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk)  &   ! dissipation 
    369                   &                                ) * wmask(ji,jj,jk) 
    370             END DO 
    371          END DO 
    372       END DO 
     328      DO_3D_00_00( 2, jpkm1 ) 
     329         zcof   = zfact1 * tmask(ji,jj,jk) 
     330         !                                   ! A minimum of 2.e-5 m2/s is imposed on TKE vertical 
     331         !                                   ! eddy coefficient (ensure numerical stability) 
     332         zzd_up = zcof * MAX(  p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk  ) , 2.e-5_wp  )   &  ! upper diagonal 
     333            &          /    (  p_e3t(ji,jj,jk  ) * p_e3w(ji,jj,jk  )  ) 
     334         zzd_lw = zcof * MAX(  p_avm(ji,jj,jk  ) + p_avm(ji,jj,jk-1) , 2.e-5_wp  )   &  ! lower diagonal 
     335            &          /    (  p_e3t(ji,jj,jk-1) * p_e3w(ji,jj,jk  )  ) 
     336         ! 
     337         zd_up(ji,jj,jk) = zzd_up            ! Matrix (zdiag, zd_up, zd_lw) 
     338         zd_lw(ji,jj,jk) = zzd_lw 
     339         zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * wmask(ji,jj,jk) 
     340         ! 
     341         !                                   ! right hand side in en 
     342         en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  p_sh2(ji,jj,jk)                          &   ! shear 
     343            &                                 - p_avt(ji,jj,jk) * rn2(ji,jj,jk)          &   ! stratification 
     344            &                                 + zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk)  &   ! dissipation 
     345            &                                ) * wmask(ji,jj,jk) 
     346      END_3D 
    373347      !                          !* Matrix inversion from level 2 (tke prescribed at level 1) 
    374       DO jk = 3, jpkm1                             ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 
    375          DO jj = 2, jpjm1 
    376             DO ji = fs_2, fs_jpim1    ! vector opt. 
    377                zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    378             END DO 
    379          END DO 
    380       END DO 
    381       DO jj = 2, jpjm1                             ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 
    382          DO ji = fs_2, fs_jpim1   ! vector opt. 
    383             zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1)    ! Surface boudary conditions on tke 
    384          END DO 
    385       END DO 
    386       DO jk = 3, jpkm1 
    387          DO jj = 2, jpjm1 
    388             DO ji = fs_2, fs_jpim1    ! vector opt. 
    389                zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) *zd_lw(ji,jj,jk-1) 
    390             END DO 
    391          END DO 
    392       END DO 
    393       DO jj = 2, jpjm1                             ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 
    394          DO ji = fs_2, fs_jpim1   ! vector opt. 
    395             en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1) 
    396          END DO 
    397       END DO 
    398       DO jk = jpk-2, 2, -1 
    399          DO jj = 2, jpjm1 
    400             DO ji = fs_2, fs_jpim1    ! vector opt. 
    401                en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    402             END DO 
    403          END DO 
    404       END DO 
    405       DO jk = 2, jpkm1                             ! set the minimum value of tke 
    406          DO jj = 2, jpjm1 
    407             DO ji = fs_2, fs_jpim1   ! vector opt. 
    408                en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk) 
    409             END DO 
    410          END DO 
    411       END DO 
     348      DO_3D_00_00( 3, jpkm1 ) 
     349         zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
     350      END_3D 
     351      DO_2D_00_00 
     352         zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1)    ! Surface boudary conditions on tke 
     353      END_2D 
     354      DO_3D_00_00( 3, jpkm1 ) 
     355         zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) *zd_lw(ji,jj,jk-1) 
     356      END_3D 
     357      DO_2D_00_00 
     358         en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1) 
     359      END_2D 
     360      DO_3D_00_00( jpk-2, 2, -1 ) 
     361         en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
     362      END_3D 
     363      DO_3D_00_00( 2, jpkm1 ) 
     364         en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk) 
     365      END_3D 
    412366      ! 
    413367      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    419373       
    420374      IF( nn_etau == 1 ) THEN           !* penetration below the mixed layer (rn_efr fraction) 
    421          DO jk = 2, jpkm1                       ! nn_eice=0 : ON below sea-ice ; nn_eice>0 : partly OFF 
    422             DO jj = 2, jpjm1 
    423                DO ji = fs_2, fs_jpim1   ! vector opt. 
    424                   en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    425                      &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    426                END DO 
    427             END DO 
    428          END DO 
     375         DO_3D_00_00( 2, jpkm1 ) 
     376            en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
     377               &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     378         END_3D 
    429379      ELSEIF( nn_etau == 2 ) THEN       !* act only at the base of the mixed layer (jk=nmln)  (rn_efr fraction) 
    430          DO jj = 2, jpjm1 
    431             DO ji = fs_2, fs_jpim1   ! vector opt. 
    432                jk = nmln(ji,jj) 
    433                en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    434                   &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    435             END DO 
    436          END DO 
     380         DO_2D_00_00 
     381            jk = nmln(ji,jj) 
     382            en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
     383               &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     384         END_2D 
    437385      ELSEIF( nn_etau == 3 ) THEN       !* penetration belox the mixed layer (HF variability) 
    438          DO jk = 2, jpkm1 
    439             DO jj = 2, jpjm1 
    440                DO ji = fs_2, fs_jpim1   ! vector opt. 
    441                   ztx2 = utau(ji-1,jj  ) + utau(ji,jj) 
    442                   zty2 = vtau(ji  ,jj-1) + vtau(ji,jj) 
    443                   ztau = 0.5_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1)    ! module of the mean stress  
    444                   zdif = taum(ji,jj) - ztau                            ! mean of modulus - modulus of the mean  
    445                   zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add )  ! apply some modifications... 
    446                   en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    447                      &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    448                END DO 
    449             END DO 
    450          END DO 
     386         DO_3D_00_00( 2, jpkm1 ) 
     387            ztx2 = utau(ji-1,jj  ) + utau(ji,jj) 
     388            zty2 = vtau(ji  ,jj-1) + vtau(ji,jj) 
     389            ztau = 0.5_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1)    ! module of the mean stress  
     390            zdif = taum(ji,jj) - ztau                            ! mean of modulus - modulus of the mean  
     391            zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add )  ! apply some modifications... 
     392            en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
     393               &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     394         END_3D 
    451395      ENDIF 
    452396      ! 
     
    515459         zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
    516460#if ! defined key_si3 && ! defined key_cice 
    517          DO jj = 2, jpjm1                     ! No sea-ice 
    518             DO ji = fs_2, fs_jpim1 
    519                zmxlm(ji,jj,1) =  zraug * taum(ji,jj) * tmask(ji,jj,1) 
    520             END DO 
    521          END DO 
     461         DO_2D_00_00 
     462            zmxlm(ji,jj,1) =  zraug * taum(ji,jj) * tmask(ji,jj,1) 
     463         END_2D 
    522464#else 
    523465 
     
    525467         ! 
    526468         CASE( 0 )                      ! No scaling under sea-ice 
    527             DO jj = 2, jpjm1 
    528                DO ji = fs_2, fs_jpim1 
    529                   zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) 
    530                END DO 
    531             END DO 
     469            DO_2D_00_00 
     470               zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) 
     471            END_2D 
    532472            ! 
    533473         CASE( 1 )                      ! scaling with constant sea-ice thickness 
    534             DO jj = 2, jpjm1 
    535                DO ji = fs_2, fs_jpim1 
    536                   zmxlm(ji,jj,1) =  ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
    537                      &                          fr_i(ji,jj)   * rn_mxlice           ) * tmask(ji,jj,1) 
    538                END DO 
    539             END DO 
     474            DO_2D_00_00 
     475               zmxlm(ji,jj,1) =  ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
     476                  &                          fr_i(ji,jj)   * rn_mxlice           ) * tmask(ji,jj,1) 
     477            END_2D 
    540478            ! 
    541479         CASE( 2 )                      ! scaling with mean sea-ice thickness 
    542             DO jj = 2, jpjm1 
    543                DO ji = fs_2, fs_jpim1 
     480            DO_2D_00_00 
    544481#if defined key_si3 
    545                   zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
    546                      &                         fr_i(ji,jj)   * hm_i(ji,jj) * 2._wp ) * tmask(ji,jj,1) 
     482               zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
     483                  &                         fr_i(ji,jj)   * hm_i(ji,jj) * 2._wp ) * tmask(ji,jj,1) 
    547484#elif defined key_cice 
    548                   zmaxice = MAXVAL( h_i(ji,jj,:) ) 
    549                   zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
    550                      &                         fr_i(ji,jj)   * zmaxice             ) * tmask(ji,jj,1) 
     485               zmaxice = MAXVAL( h_i(ji,jj,:) ) 
     486               zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
     487                  &                         fr_i(ji,jj)   * zmaxice             ) * tmask(ji,jj,1) 
    551488#endif 
    552                END DO 
    553             END DO 
     489            END_2D 
    554490            ! 
    555491         CASE( 3 )                      ! scaling with max sea-ice thickness 
    556             DO jj = 2, jpjm1 
    557                DO ji = fs_2, fs_jpim1 
    558                   zmaxice = MAXVAL( h_i(ji,jj,:) ) 
    559                   zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
    560                      &                         fr_i(ji,jj)   * zmaxice             ) * tmask(ji,jj,1) 
    561                END DO 
    562             END DO 
     492            DO_2D_00_00 
     493               zmaxice = MAXVAL( h_i(ji,jj,:) ) 
     494               zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
     495                  &                         fr_i(ji,jj)   * zmaxice             ) * tmask(ji,jj,1) 
     496            END_2D 
    563497            ! 
    564498         END SELECT 
    565499#endif 
    566500         ! 
    567          DO jj = 2, jpjm1 
    568             DO ji = fs_2, fs_jpim1 
    569                zmxlm(ji,jj,1) = MAX( rn_mxl0, zmxlm(ji,jj,1) ) 
    570             END DO 
    571          END DO 
     501         DO_2D_00_00 
     502            zmxlm(ji,jj,1) = MAX( rn_mxl0, zmxlm(ji,jj,1) ) 
     503         END_2D 
    572504         ! 
    573505      ELSE 
     
    575507      ENDIF 
    576508      ! 
    577       DO jk = 2, jpkm1              ! interior value : l=sqrt(2*e/n^2) 
    578          DO jj = 2, jpjm1 
    579             DO ji = fs_2, fs_jpim1   ! vector opt. 
    580                zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
    581                zmxlm(ji,jj,jk) = MAX(  rmxl_min,  SQRT( 2._wp * en(ji,jj,jk) / zrn2 )  ) 
    582             END DO 
    583          END DO 
    584       END DO 
     509      DO_3D_00_00( 2, jpkm1 ) 
     510         zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
     511         zmxlm(ji,jj,jk) = MAX(  rmxl_min,  SQRT( 2._wp * en(ji,jj,jk) / zrn2 )  ) 
     512      END_3D 
    585513      ! 
    586514      !                     !* Physical limits for the mixing length 
     
    594522      ! where wmask = 0 set zmxlm == p_e3w 
    595523      CASE ( 0 )           ! bounded by the distance to surface and bottom 
    596          DO jk = 2, jpkm1 
    597             DO jj = 2, jpjm1 
    598                DO ji = fs_2, fs_jpim1   ! vector opt. 
    599                   zemxl = MIN( pdepw(ji,jj,jk) - pdepw(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
    600                   &            pdepw(ji,jj,mbkt(ji,jj)+1) - pdepw(ji,jj,jk) ) 
    601                   ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 
    602                   zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
    603                   zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
    604                END DO 
    605             END DO 
    606          END DO 
     524         DO_3D_00_00( 2, jpkm1 ) 
     525            zemxl = MIN( pdepw(ji,jj,jk) - pdepw(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
     526            &            pdepw(ji,jj,mbkt(ji,jj)+1) - pdepw(ji,jj,jk) ) 
     527            ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 
     528            zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
     529            zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
     530         END_3D 
    607531         ! 
    608532      CASE ( 1 )           ! bounded by the vertical scale factor 
    609          DO jk = 2, jpkm1 
    610             DO jj = 2, jpjm1 
    611                DO ji = fs_2, fs_jpim1   ! vector opt. 
    612                   zemxl = MIN( p_e3w(ji,jj,jk), zmxlm(ji,jj,jk) ) 
    613                   zmxlm(ji,jj,jk) = zemxl 
    614                   zmxld(ji,jj,jk) = zemxl 
    615                END DO 
    616             END DO 
    617          END DO 
     533         DO_3D_00_00( 2, jpkm1 ) 
     534            zemxl = MIN( p_e3w(ji,jj,jk), zmxlm(ji,jj,jk) ) 
     535            zmxlm(ji,jj,jk) = zemxl 
     536            zmxld(ji,jj,jk) = zemxl 
     537         END_3D 
    618538         ! 
    619539      CASE ( 2 )           ! |dk[xml]| bounded by e3t : 
    620          DO jk = 2, jpkm1         ! from the surface to the bottom : 
    621             DO jj = 2, jpjm1 
    622                DO ji = fs_2, fs_jpim1   ! vector opt. 
    623                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    624                END DO 
    625             END DO 
    626          END DO 
    627          DO jk = jpkm1, 2, -1     ! from the bottom to the surface : 
    628             DO jj = 2, jpjm1 
    629                DO ji = fs_2, fs_jpim1   ! vector opt. 
    630                   zemxl = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    631                   zmxlm(ji,jj,jk) = zemxl 
    632                   zmxld(ji,jj,jk) = zemxl 
    633                END DO 
    634             END DO 
    635          END DO 
     540         DO_3D_00_00( 2, jpkm1 ) 
     541            zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     542         END_3D 
     543         DO_3D_00_00( jpkm1, 2, -1 ) 
     544            zemxl = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     545            zmxlm(ji,jj,jk) = zemxl 
     546            zmxld(ji,jj,jk) = zemxl 
     547         END_3D 
    636548         ! 
    637549      CASE ( 3 )           ! lup and ldown, |dk[xml]| bounded by e3t : 
    638          DO jk = 2, jpkm1         ! from the surface to the bottom : lup 
    639             DO jj = 2, jpjm1 
    640                DO ji = fs_2, fs_jpim1   ! vector opt. 
    641                   zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    642                END DO 
    643             END DO 
    644          END DO 
    645          DO jk = jpkm1, 2, -1     ! from the bottom to the surface : ldown 
    646             DO jj = 2, jpjm1 
    647                DO ji = fs_2, fs_jpim1   ! vector opt. 
    648                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    649                END DO 
    650             END DO 
    651          END DO 
    652          DO jk = 2, jpkm1 
    653             DO jj = 2, jpjm1 
    654                DO ji = fs_2, fs_jpim1   ! vector opt. 
    655                   zemlm = MIN ( zmxld(ji,jj,jk),  zmxlm(ji,jj,jk) ) 
    656                   zemlp = SQRT( zmxld(ji,jj,jk) * zmxlm(ji,jj,jk) ) 
    657                   zmxlm(ji,jj,jk) = zemlm 
    658                   zmxld(ji,jj,jk) = zemlp 
    659                END DO 
    660             END DO 
    661          END DO 
     550         DO_3D_00_00( 2, jpkm1 ) 
     551            zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     552         END_3D 
     553         DO_3D_00_00( jpkm1, 2, -1 ) 
     554            zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     555         END_3D 
     556         DO_3D_00_00( 2, jpkm1 ) 
     557            zemlm = MIN ( zmxld(ji,jj,jk),  zmxlm(ji,jj,jk) ) 
     558            zemlp = SQRT( zmxld(ji,jj,jk) * zmxlm(ji,jj,jk) ) 
     559            zmxlm(ji,jj,jk) = zemlm 
     560            zmxld(ji,jj,jk) = zemlp 
     561         END_3D 
    662562         ! 
    663563      END SELECT 
     
    666566      !                     !  Vertical eddy viscosity and diffusivity  (avm and avt) 
    667567      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    668       DO jk = 1, jpkm1            !* vertical eddy viscosity & diffivity at w-points 
    669          DO jj = 2, jpjm1 
    670             DO ji = fs_2, fs_jpim1   ! vector opt. 
    671                zsqen = SQRT( en(ji,jj,jk) ) 
    672                zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen 
    673                p_avm(ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk) 
    674                p_avt(ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
    675                dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk) 
    676             END DO 
    677          END DO 
    678       END DO 
     568      DO_3D_00_00( 1, jpkm1 ) 
     569         zsqen = SQRT( en(ji,jj,jk) ) 
     570         zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen 
     571         p_avm(ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk) 
     572         p_avt(ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
     573         dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk) 
     574      END_3D 
    679575      ! 
    680576      ! 
    681577      IF( nn_pdl == 1 ) THEN      !* Prandtl number case: update avt 
    682          DO jk = 2, jpkm1 
    683             DO jj = 2, jpjm1 
    684                DO ji = fs_2, fs_jpim1   ! vector opt. 
    685                   p_avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
    686               END DO 
    687             END DO 
    688          END DO 
     578         DO_3D_00_00( 2, jpkm1 ) 
     579            p_avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
     580         END_3D 
    689581      ENDIF 
    690582      ! 
Note: See TracChangeset for help on using the changeset viewer.