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 8279 for branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90 – NEMO

Ignore:
Timestamp:
2017-07-04T17:46:48+02:00 (7 years ago)
Author:
mocavero
Message:

Implementation of OMP coarse-grained parallelization on ZDF new package

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90

    r8056 r8279  
    220220      ! 
    221221      IF( nn_timing == 1 )  CALL timing_start('tke_tke') 
     222 
    222223      ! 
    223224      zbbrau = rn_ebb / rau0       ! Local constant initialisation 
     
    231232      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    232233      IF ( ln_isfcav ) THEN 
    233          DO jj = k_Jstr, k_Jend            ! en(mikt(ji,jj))   = rn_emin 
    234             DO ji = k_Istr, k_Iend 
     234         DO jj = tnldj, tnlej            ! en(mikt(ji,jj))   = rn_emin 
     235            DO ji = tnldi, tnlei 
    235236               en(ji,jj,mikt(ji,jj)) = rn_emin * tmask(ji,jj,1) 
    236237            END DO 
    237238         END DO 
    238239      END IF 
    239       DO jj = k_Jstr, k_Jend            ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
    240          DO ji = k_Istr, k_Iend 
     240      DO jj = tnldj, tnlej            ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
     241         DO ji = tnldi, tnlei 
    241242            en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 
    242243         END DO 
     
    254255      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    255256      !                     en(bot)   = (rn_ebb0/rau0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin) 
    256 !!    DO jj = k_Jstr, k_Jend 
    257 !!       DO ji = k_Jstr, k_Iend 
     257!!    DO jj = tnldj, tnlej 
     258!!       DO ji = tnldj, tnlei 
    258259!!          ztx2 = bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj)) + & 
    259260!!                 bfrua(ji  ,jj) * ub(ji  ,jj,mbku(ji  ,jj) ) 
     
    281282         imlc(WRK_2D) = mbkt(WRK_2D) + 1       ! Initialization to the number of w ocean point (=2 over land) 
    282283         DO jk = jpkm1, 2, -1 
    283             DO jj = k_Jstr, k_Jend               ! Last w-level at which zpelc>=0.5*us*us  
    284                DO ji = k_Istr, k_Iend            !      with us=0.016*wind(starting from jpk-1) 
     284            DO jj = tnldj, tnlej               ! Last w-level at which zpelc>=0.5*us*us  
     285               DO ji = tnldi, tnlei            !      with us=0.016*wind(starting from jpk-1) 
    285286                  zus  = zcof * taum(ji,jj) 
    286287                  IF( zpelc(ji,jj,jk) > zus )   imlc(ji,jj) = jk 
     
    289290         END DO 
    290291         !                               ! finite LC depth 
    291          DO jj = k_Jstr, k_Jend  
    292             DO ji = k_Istr, k_Iend 
     292         DO jj = tnldj, tnlej  
     293            DO ji = tnldi, tnlei 
    293294               zhlc(ji,jj) = pdepw(ji,jj,imlc(ji,jj)) 
    294295            END DO 
     
    296297         zcof = 0.016 / SQRT( zrhoa * zcdrag ) 
    297298         DO jk = 2, jpkm1         !* TKE Langmuir circulation source term added to en 
    298             DO jj = k_Jstr, k_Jend 
    299                DO ji = k_Istr, k_Iend 
     299            DO jj = tnldj, tnlej 
     300               DO ji = tnldi, tnlei 
    300301                  zus  = zcof * SQRT( taum(ji,jj) )           ! Stokes drift 
    301302                  !                                           ! vertical velocity due to LC 
     
    320321      IF( nn_pdl == 1 ) THEN      !* Prandtl number = F( Ri ) 
    321322         DO jk = 2, jpkm1 
    322             DO jj = k_Jstr, k_Jend 
    323                DO ji = k_Istr, k_Iend 
     323            DO jj = tnldj, tnlej 
     324               DO ji = tnldi, tnlei 
    324325                  !                             ! local Richardson number 
    325326                  zri = MAX( rn2b(ji,jj,jk), 0._wp ) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 
     
    332333      !          
    333334      DO jk = 2, jpkm1           !* Matrix and right hand side in en 
    334          DO jj = k_Jstr, k_Jend 
    335             DO ji = k_Istr, k_Iend 
     335         DO jj = tnldj, tnlej 
     336            DO ji = tnldi, tnlei 
    336337               zcof   = zfact1 * tmask(ji,jj,jk) 
    337338               !                                   ! A minimum of 2.e-5 m2/s is imposed on TKE vertical 
     
    356357      !                          !* Matrix inversion from level 2 (tke prescribed at level 1) 
    357358      DO jk = 3, jpkm1                             ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 
    358          DO jj = k_Jstr, k_Jend 
    359             DO ji = k_Istr, k_Iend 
     359         DO jj = tnldj, tnlej 
     360            DO ji = tnldi, tnlei 
    360361               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    361362            END DO 
    362363         END DO 
    363364      END DO 
    364       DO jj = k_Jstr, k_Jend                             ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 
    365          DO ji = k_Istr, k_Iend 
     365      DO jj = tnldj, tnlej                             ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 
     366         DO ji = tnldi, tnlei 
    366367            zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1)    ! Surface boudary conditions on tke 
    367368         END DO 
    368369      END DO 
    369370      DO jk = 3, jpkm1 
    370          DO jj = k_Jstr, k_Jend 
    371             DO ji = k_Istr, k_Iend 
     371         DO jj = tnldj, tnlej 
     372            DO ji = tnldi, tnlei 
    372373               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) 
    373374            END DO 
    374375         END DO 
    375376      END DO 
    376       DO jj = k_Jstr, k_Jend                             ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 
    377          DO ji = k_Istr, k_Iend 
     377      DO jj = tnldj, tnlej                             ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 
     378         DO ji = tnldi, tnlei 
    378379            en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1) 
    379380         END DO 
    380381      END DO 
    381382      DO jk = jpk-2, 2, -1 
    382          DO jj = k_Jstr, k_Jend 
    383             DO ji = k_Istr, k_Iend 
     383         DO jj = tnldj, tnlej 
     384            DO ji = tnldi, tnlei 
    384385               en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    385386            END DO 
     
    387388      END DO 
    388389      DO jk = 2, jpkm1                             ! set the minimum value of tke 
    389          DO jj = k_Jstr, k_Jend 
    390             DO ji = k_Istr, k_Iend 
     390         DO jj = tnldj, tnlej 
     391            DO ji = tnldi, tnlei 
    391392               en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk) 
    392393            END DO 
     
    402403      IF( nn_etau == 1 ) THEN           !* penetration below the mixed layer (rn_efr fraction) 
    403404         DO jk = 2, jpkm1 
    404             DO jj = k_Jstr, k_Jend 
    405                DO ji = k_Istr, k_Iend 
     405            DO jj = tnldj, tnlej 
     406               DO ji = tnldi, tnlei 
    406407                  en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    407408                     &                                 * MAX(0.,1._wp - 2.*fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     
    410411         END DO 
    411412      ELSEIF( nn_etau == 2 ) THEN       !* act only at the base of the mixed layer (jk=nmln)  (rn_efr fraction) 
    412          DO jj = k_Jstr, k_Jend 
    413             DO ji = k_Istr, k_Iend 
     413         DO jj = tnldj, tnlej 
     414            DO ji = tnldi, tnlei 
    414415               jk = nmln(ji,jj) 
    415416               en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
     
    419420      ELSEIF( nn_etau == 3 ) THEN       !* penetration belox the mixed layer (HF variability) 
    420421         DO jk = 2, jpkm1 
    421             DO jj = k_Jstr, k_Jend 
    422                DO ji = k_Istr, k_Iend 
     422            DO jj = tnldj, tnlej 
     423               DO ji = tnldi, tnlei 
    423424                  ztx2 = utau(ji-1,jj  ) + utau(ji,jj) 
    424425                  zty2 = vtau(ji  ,jj-1) + vtau(ji,jj) 
     
    433434      ENDIF 
    434435      ! 
     436 
    435437      IF( nn_timing == 1 )  CALL timing_stop('tke_tke') 
    436438      ! 
     
    498500      IF( ln_mxl0 ) THEN            ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 
    499501         zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
    500          DO jj = k_Jstr, k_Jend 
    501             DO ji = k_Istr, k_Iend 
     502         DO jj = tnldj, tnlej 
     503            DO ji = tnldi, tnlei 
    502504               zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 
    503505            END DO 
     
    508510      ! 
    509511      DO jk = 2, jpkm1              ! interior value : l=sqrt(2*e/n^2) 
    510          DO jj = k_Jstr, k_Jend 
    511             DO ji = k_Istr, k_Iend 
     512         DO jj = tnldj, tnlej 
     513            DO ji = tnldi, tnlei 
    512514               zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
    513515               zmxlm(ji,jj,jk) = MAX(  rmxl_min,  SQRT( 2._wp * en(ji,jj,jk) / zrn2 )  ) 
     
    527529      CASE ( 0 )           ! bounded by the distance to surface and bottom 
    528530         DO jk = 2, jpkm1 
    529             DO jj = k_Jstr, k_Jend 
    530                DO ji = k_Istr, k_Iend 
     531            DO jj = tnldj, tnlej 
     532               DO ji = tnldi, tnlei 
    531533                  zemxl = MIN( pdepw(ji,jj,jk) - pdepw(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
    532534                  &            pdepw(ji,jj,mbkt(ji,jj)+1) - pdepw(ji,jj,jk) ) 
     
    540542      CASE ( 1 )           ! bounded by the vertical scale factor 
    541543         DO jk = 2, jpkm1 
    542             DO jj = k_Jstr, k_Jend 
    543                DO ji = k_Istr, k_Iend 
     544            DO jj = tnldj, tnlej 
     545               DO ji = tnldi, tnlei 
    544546                  zemxl = MIN( p_e3w(ji,jj,jk), zmxlm(ji,jj,jk) ) 
    545547                  zmxlm(ji,jj,jk) = zemxl 
     
    551553      CASE ( 2 )           ! |dk[xml]| bounded by e3t : 
    552554         DO jk = 2, jpkm1         ! from the surface to the bottom : 
    553             DO jj = k_Jstr, k_Jend 
    554                DO ji = k_Istr, k_Iend 
     555            DO jj = tnldj, tnlej 
     556               DO ji = tnldi, tnlei 
    555557                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    556558               END DO 
     
    558560         END DO 
    559561         DO jk = jpkm1, 2, -1     ! from the bottom to the surface : 
    560             DO jj = k_Jstr, k_Jend 
    561                DO ji = k_Istr, k_Iend 
     562            DO jj = tnldj, tnlej 
     563               DO ji = tnldi, tnlei 
    562564                  zemxl = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    563565                  zmxlm(ji,jj,jk) = zemxl 
     
    569571      CASE ( 3 )           ! lup and ldown, |dk[xml]| bounded by e3t : 
    570572         DO jk = 2, jpkm1         ! from the surface to the bottom : lup 
    571             DO jj = k_Jstr, k_Jend 
    572                DO ji = k_Istr, k_Iend 
     573            DO jj = tnldj, tnlej 
     574               DO ji = tnldi, tnlei 
    573575                  zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    574576               END DO 
     
    576578         END DO 
    577579         DO jk = jpkm1, 2, -1     ! from the bottom to the surface : ldown 
    578             DO jj = k_Jstr, k_Jend 
    579                DO ji = k_Istr, k_Iend 
     580            DO jj = tnldj, tnlej 
     581               DO ji = tnldi, tnlei 
    580582                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    581583               END DO 
     
    583585         END DO 
    584586         DO jk = 2, jpkm1 
    585             DO jj = k_Jstr, k_Jend 
    586                DO ji = k_Istr, k_Iend 
     587            DO jj = tnldj, tnlej 
     588               DO ji = tnldi, tnlei 
    587589                  zemlm = MIN ( zmxld(ji,jj,jk),  zmxlm(ji,jj,jk) ) 
    588590                  zemlp = SQRT( zmxld(ji,jj,jk) * zmxlm(ji,jj,jk) ) 
     
    600602      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    601603      DO jk = 1, jpkm1            !* vertical eddy viscosity & diffivity at w-points 
    602          DO jj = k_Jstr, k_Jend 
    603             DO ji = k_Istr, k_Iend 
     604         DO jj = tnldj, tnlej 
     605            DO ji = tnldi, tnlei 
    604606               zsqen = SQRT( en(ji,jj,jk) ) 
    605607               zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen 
     
    614616      IF( nn_pdl == 1 ) THEN      !* Prandtl number case: update avt 
    615617         DO jk = 2, jpkm1 
    616             DO jj = k_Jstr, k_Jend 
    617                DO ji = k_Istr, k_Iend 
     618            DO jj = tnldj, tnlej 
     619               DO ji = tnldi, tnlei 
    618620                  p_avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
    619621              END DO 
Note: See TracChangeset for help on using the changeset viewer.