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 7698 for trunk/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90 – NEMO

Ignore:
Timestamp:
2017-02-18T10:02:03+01:00 (7 years ago)
Author:
mocavero
Message:

update trunk with OpenMP parallelization

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90

    r6497 r7698  
    171171      !!---------------------------------------------------------------------- 
    172172      INTEGER, INTENT(in) ::   kt   ! ocean time step 
     173      INTEGER             ::   jk, jj, ji   
    173174      !!---------------------------------------------------------------------- 
    174175      ! 
     
    179180      ! 
    180181      IF( kt /= nit000 ) THEN   ! restore before value to compute tke 
    181          avt (:,:,:) = avt_k (:,:,:)  
    182          avm (:,:,:) = avm_k (:,:,:)  
    183          avmu(:,:,:) = avmu_k(:,:,:)  
    184          avmv(:,:,:) = avmv_k(:,:,:)  
     182!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     183         DO jk = 1, jpk 
     184            DO jj = 1, jpj 
     185               DO ji = 1, jpi 
     186                  avt (ji,jj,jk) = avt_k (ji,jj,jk)  
     187                  avm (ji,jj,jk) = avm_k (ji,jj,jk)  
     188                  avmu(ji,jj,jk) = avmu_k(ji,jj,jk)  
     189                  avmv(ji,jj,jk) = avmv_k(ji,jj,jk)  
     190               END DO 
     191            END DO 
     192         END DO 
    185193      ENDIF  
    186194      ! 
     
    189197      CALL tke_avn      ! now avt, avm, avmu, avmv 
    190198      ! 
    191       avt_k (:,:,:) = avt (:,:,:)  
    192       avm_k (:,:,:) = avm (:,:,:)  
    193       avmu_k(:,:,:) = avmu(:,:,:)  
    194       avmv_k(:,:,:) = avmv(:,:,:)  
     199!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     200         DO jk = 1, jpk 
     201            DO jj = 1, jpj 
     202               DO ji = 1, jpi 
     203                  avt_k (ji,jj,jk) = avt (ji,jj,jk)  
     204                  avm_k (ji,jj,jk) = avm (ji,jj,jk)  
     205                  avmu_k(ji,jj,jk) = avmu(ji,jj,jk)  
     206                  avmv_k(ji,jj,jk) = avmv(ji,jj,jk)  
     207               END DO 
     208            END DO 
     209         END DO 
    195210      ! 
    196211#if defined key_agrif 
     
    253268      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    254269      IF ( ln_isfcav ) THEN 
     270!$OMP PARALLEL DO schedule(static) private(jj, ji) 
    255271         DO jj = 2, jpjm1            ! en(mikt(ji,jj))   = rn_emin 
    256272            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    259275         END DO 
    260276      END IF 
     277!$OMP PARALLEL DO schedule(static) private(jj, ji) 
    261278      DO jj = 2, jpjm1            ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
    262279         DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    293310         ! 
    294311         !                        !* total energy produce by LC : cumulative sum over jk 
    295          zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * gdepw_n(:,:,1) * e3w_n(:,:,1) 
     312!$OMP PARALLEL 
     313!$OMP DO schedule(static) private(jj, ji) 
     314         DO jj =1, jpj 
     315            DO ji=1, jpi 
     316               zpelc(ji,jj,1) =  MAX( rn2b(ji,jj,1), 0._wp ) * gdepw_n(ji,jj,1) * e3w_n(ji,jj,1) 
     317            END DO 
     318         END DO 
    296319         DO jk = 2, jpk 
    297             zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * gdepw_n(:,:,jk) * e3w_n(:,:,jk) 
     320!$OMP DO schedule(static) private(jj, ji) 
     321            DO jj =1, jpj 
     322               DO ji=1, jpi 
     323                  zpelc(ji,jj,jk)  = zpelc(ji,jj,jk-1) + MAX( rn2b(ji,jj,jk), 0._wp ) * gdepw_n(ji,jj,jk) * e3w_n(ji,jj,jk) 
     324               END DO 
     325            END DO 
    298326         END DO 
    299327         !                        !* finite Langmuir Circulation depth 
    300328         zcof = 0.5 * 0.016 * 0.016 / ( zrhoa * zcdrag ) 
    301          imlc(:,:) = mbkt(:,:) + 1       ! Initialization to the number of w ocean point (=2 over land) 
     329!$OMP DO schedule(static) private(jj,ji) 
     330            DO jj = 1, jpj 
     331               DO ji = 1, jpi 
     332                  imlc(ji,jj) = mbkt(ji,jj) + 1       ! Initialization to the number of w ocean point (=2 over land) 
     333               END DO 
     334            END DO 
    302335         DO jk = jpkm1, 2, -1 
     336!$OMP DO schedule(static) private(jj, ji, zus) 
    303337            DO jj = 1, jpj               ! Last w-level at which zpelc>=0.5*us*us  
    304338               DO ji = 1, jpi            !      with us=0.016*wind(starting from jpk-1) 
     
    309343         END DO 
    310344         !                               ! finite LC depth 
     345!$OMP DO schedule(static) private(jj, ji) 
    311346         DO jj = 1, jpj  
    312347            DO ji = 1, jpi 
     
    315350         END DO 
    316351         zcof = 0.016 / SQRT( zrhoa * zcdrag ) 
     352!$OMP DO schedule(static) private(jk, jj, ji, zus, zind, zwlc) 
    317353         DO jk = 2, jpkm1         !* TKE Langmuir circulation source term added to en 
    318354            DO jj = 2, jpjm1 
     
    328364            END DO 
    329365         END DO 
     366!$OMP END PARALLEL 
    330367         ! 
    331368      ENDIF 
     
    338375      !                     ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    339376      ! 
     377!$OMP PARALLEL DO schedule(static) private(jk, jj, ji) 
    340378      DO jk = 2, jpkm1           !* Shear production at uw- and vw-points (energy conserving form) 
    341379         DO jj = 1, jpjm1 
     
    356394         ! Note that zesh2 is also computed in the next loop. 
    357395         ! We decided to compute it twice to keep code readability and avoid an IF case in the DO loops 
     396!$OMP PARALLEL DO schedule(static) private(jk, jj, ji, zesh2, zri) 
    358397         DO jk = 2, jpkm1 
    359398            DO jj = 2, jpjm1 
     
    372411      ENDIF 
    373412      !          
     413!$OMP PARALLEL 
     414!$OMP DO schedule(static) private(jk, jj, ji, zcof, zzd_up, zzd_lw, zesh2) 
    374415      DO jk = 2, jpkm1           !* Matrix and right hand side in en 
    375416         DO jj = 2, jpjm1 
     
    405446      !                          !* Matrix inversion from level 2 (tke prescribed at level 1) 
    406447      DO jk = 3, jpkm1                             ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 
     448!$OMP DO schedule(static) private(jj, ji) 
    407449         DO jj = 2, jpjm1 
    408450            DO ji = fs_2, fs_jpim1    ! vector opt. 
     
    411453         END DO 
    412454      END DO 
     455!$OMP DO schedule(static) private(jj, ji) 
    413456      DO jj = 2, jpjm1                             ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 
    414457         DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    417460      END DO 
    418461      DO jk = 3, jpkm1 
     462!$OMP DO schedule(static) private(jj, ji) 
    419463         DO jj = 2, jpjm1 
    420464            DO ji = fs_2, fs_jpim1    ! vector opt. 
     
    423467         END DO 
    424468      END DO 
     469!$OMP DO schedule(static) private(jj, ji) 
    425470      DO jj = 2, jpjm1                             ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 
    426471         DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    429474      END DO 
    430475      DO jk = jpk-2, 2, -1 
     476!$OMP DO schedule(static) private(jj, ji) 
    431477         DO jj = 2, jpjm1 
    432478            DO ji = fs_2, fs_jpim1    ! vector opt. 
     
    435481         END DO 
    436482      END DO 
     483!$OMP DO schedule(static) private(jk,jj, ji) 
    437484      DO jk = 2, jpkm1                             ! set the minimum value of tke 
    438485         DO jj = 2, jpjm1 
     
    442489         END DO 
    443490      END DO 
     491!$OMP END PARALLEL 
    444492 
    445493      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    450498       
    451499      IF( nn_etau == 1 ) THEN           !* penetration below the mixed layer (rn_efr fraction) 
     500!$OMP PARALLEL DO schedule(static) private(jk, jj, ji) 
    452501         DO jk = 2, jpkm1 
    453502            DO jj = 2, jpjm1 
     
    459508         END DO 
    460509      ELSEIF( nn_etau == 2 ) THEN       !* act only at the base of the mixed layer (jk=nmln)  (rn_efr fraction) 
     510!$OMP PARALLEL DO schedule(static) private(jj, ji, jk) 
    461511         DO jj = 2, jpjm1 
    462512            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    467517         END DO 
    468518      ELSEIF( nn_etau == 3 ) THEN       !* penetration belox the mixed layer (HF variability) 
     519!$OMP PARALLEL DO schedule(static) private(jk, jj, ji, ztx2, zty2, ztau, zdif) 
    469520         DO jk = 2, jpkm1 
    470521            DO jj = 2, jpjm1 
     
    545596      ! 
    546597      ! initialisation of interior minimum value (avoid a 2d loop with mikt) 
    547       zmxlm(:,:,:)  = rmxl_min     
    548       zmxld(:,:,:)  = rmxl_min 
     598!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     599      DO jk = 1, jpk 
     600         DO jj = 1, jpj 
     601            DO ji = 1, jpi 
     602               zmxlm(ji,jj,jk)  = rmxl_min     
     603               zmxld(ji,jj,jk)  = rmxl_min 
     604            END DO 
     605         END DO 
     606      END DO 
    549607      ! 
    550608      IF( ln_mxl0 ) THEN            ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 
     609!$OMP PARALLEL DO schedule(static) private(jj, ji, zraug) 
    551610         DO jj = 2, jpjm1 
    552611            DO ji = fs_2, fs_jpim1 
     
    556615         END DO 
    557616      ELSE  
    558          zmxlm(:,:,1) = rn_mxl0 
     617!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     618         DO jj = 1, jpj 
     619            DO ji = 1, jpi 
     620               zmxlm(ji,jj,1) = rn_mxl0 
     621            END DO 
     622         END DO 
    559623      ENDIF 
    560624      ! 
     625!$OMP PARALLEL 
     626!$OMP DO schedule(static) private(jk, jj, ji, zrn2) 
    561627      DO jk = 2, jpkm1              ! interior value : l=sqrt(2*e/n^2) 
    562628         DO jj = 2, jpjm1 
     
    570636      !                     !* Physical limits for the mixing length 
    571637      ! 
    572       zmxld(:,:, 1 ) = zmxlm(:,:,1)   ! surface set to the minimum value  
    573       zmxld(:,:,jpk) = rmxl_min       ! last level  set to the minimum value 
     638!$OMP DO schedule(static) private(jj,ji) 
     639      DO jj = 1, jpj 
     640         DO ji = 1, jpi 
     641            zmxld(ji,jj, 1 ) = zmxlm(ji,jj,1)   ! surface set to the minimum value  
     642            zmxld(ji,jj,jpk) = rmxl_min       ! last level  set to the minimum value 
     643         END DO 
     644      END DO 
     645!$OMP END PARALLEL 
    574646      ! 
    575647      SELECT CASE ( nn_mxl ) 
     
    578650      ! where wmask = 0 set zmxlm == e3w_n 
    579651      CASE ( 0 )           ! bounded by the distance to surface and bottom 
     652!$OMP PARALLEL DO schedule(static) private(jk, jj, ji, zemxl) 
    580653         DO jk = 2, jpkm1 
    581654            DO jj = 2, jpjm1 
     
    591664         ! 
    592665      CASE ( 1 )           ! bounded by the vertical scale factor 
     666!$OMP PARALLEL DO schedule(static) private(jk, jj, ji, zemxl) 
    593667         DO jk = 2, jpkm1 
    594668            DO jj = 2, jpjm1 
     
    602676         ! 
    603677      CASE ( 2 )           ! |dk[xml]| bounded by e3t : 
     678!$OMP PARALLEL 
    604679         DO jk = 2, jpkm1         ! from the surface to the bottom : 
     680!$OMP DO schedule(static) private(jj, ji) 
    605681            DO jj = 2, jpjm1 
    606682               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    610686         END DO 
    611687         DO jk = jpkm1, 2, -1     ! from the bottom to the surface : 
     688!$OMP DO schedule(static) private(jj, ji, zemxl) 
    612689            DO jj = 2, jpjm1 
    613690               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    618695            END DO 
    619696         END DO 
     697!$OMP END PARALLEL 
    620698         ! 
    621699      CASE ( 3 )           ! lup and ldown, |dk[xml]| bounded by e3t : 
     700!$OMP PARALLEL 
    622701         DO jk = 2, jpkm1         ! from the surface to the bottom : lup 
     702!$OMP DO schedule(static) private(jj, ji) 
    623703            DO jj = 2, jpjm1 
    624704               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    628708         END DO 
    629709         DO jk = jpkm1, 2, -1     ! from the bottom to the surface : ldown 
     710!$OMP DO schedule(static) private(jj, ji) 
    630711            DO jj = 2, jpjm1 
    631712               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    634715            END DO 
    635716         END DO 
     717!$OMP DO schedule(static) private(jk, jj, ji, zemlm, zemlp) 
    636718         DO jk = 2, jpkm1 
    637719            DO jj = 2, jpjm1 
     
    644726            END DO 
    645727         END DO 
     728!$OMP END PARALLEL 
    646729         ! 
    647730      END SELECT 
    648731      ! 
    649732# if defined key_c1d 
    650       e_dis(:,:,:) = zmxld(:,:,:)      ! c1d configuration : save mixing and dissipation turbulent length scales 
    651       e_mix(:,:,:) = zmxlm(:,:,:) 
     733!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     734      DO jk = 1, jpk 
     735         DO jj = 1, jpj 
     736            DO ji = 1, jpi 
     737               e_dis(ji,jj,jk) = zmxld(ji,jj,jk)      ! c1d configuration : save mixing and dissipation turbulent length scales 
     738               e_mix(ji,jj,jk) = zmxlm(ji,jj,jk) 
     739            END DO 
     740         END DO 
     741      END DO 
    652742# endif 
    653743 
     
    655745      !                     !  Vertical eddy viscosity and diffusivity  (avmu, avmv, avt) 
    656746      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     747!$OMP PARALLEL DO schedule(static) private(jk, jj, ji, zsqen, zav) 
    657748      DO jk = 1, jpkm1            !* vertical eddy viscosity & diffivity at w-points 
    658749         DO jj = 2, jpjm1 
     
    668759      CALL lbc_lnk( avm, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    669760      ! 
     761!$OMP PARALLEL DO schedule(static) private(jk, jj, ji) 
    670762      DO jk = 2, jpkm1            !* vertical eddy viscosity at wu- and wv-points 
    671763         DO jj = 2, jpjm1 
     
    679771      ! 
    680772      IF( nn_pdl == 1 ) THEN      !* Prandtl number case: update avt 
     773!$OMP PARALLEL DO schedule(static) private(jk, jj, ji) 
    681774         DO jk = 2, jpkm1 
    682775            DO jj = 2, jpjm1 
     
    798891         SELECT CASE( nn_htau )             ! Choice of the depth of penetration 
    799892         CASE( 0 )                                 ! constant depth penetration (here 10 meters) 
    800             htau(:,:) = 10._wp 
     893!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     894            DO jj = 1, jpj 
     895               DO ji = 1, jpi 
     896                  htau(ji,jj) = 10._wp 
     897               END DO 
     898            END DO 
    801899         CASE( 1 )                                 ! F(latitude) : 0.5m to 30m poleward of 40 degrees 
    802             htau(:,:) = MAX(  0.5_wp, MIN( 30._wp, 45._wp* ABS( SIN( rpi/180._wp * gphit(:,:) ) ) )   )             
     900!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     901            DO jj = 1, jpj 
     902               DO ji = 1, jpi 
     903                  htau(ji,jj) = MAX(  0.5_wp, MIN( 30._wp, 45._wp* ABS( SIN( rpi/180._wp * gphit(ji,jj) ) ) )   )             
     904               END DO 
     905            END DO 
    803906         END SELECT 
    804907      ENDIF 
    805908      !                               !* set vertical eddy coef. to the background value 
     909!$OMP PARALLEL 
     910!$OMP DO schedule(static) private(jk,jj,ji) 
    806911      DO jk = 1, jpk 
    807          avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    808          avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    809          avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
    810          avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
    811       END DO 
    812       dissl(:,:,:) = 1.e-12_wp 
     912         DO jj = 1, jpj 
     913            DO ji = 1, jpi 
     914               avt (ji,jj,jk) = avtb(jk) * wmask (ji,jj,jk) 
     915               avm (ji,jj,jk) = avmb(jk) * wmask (ji,jj,jk) 
     916               avmu(ji,jj,jk) = avmb(jk) * wumask(ji,jj,jk) 
     917               avmv(ji,jj,jk) = avmb(jk) * wvmask(ji,jj,jk) 
     918            END DO 
     919         END DO 
     920      END DO 
     921!$OMP END DO NOWAIT 
     922!$OMP DO schedule(static) private(jk,jj,ji) 
     923      DO jk = 1, jpk 
     924         DO jj = 1, jpj 
     925            DO ji = 1, jpi 
     926               dissl(ji,jj,jk) = 1.e-12_wp 
     927            END DO 
     928         END DO 
     929      END DO 
     930!$OMP END PARALLEL 
    813931      !                               
    814932      CALL tke_rst( nit000, 'READ' )  !* read or initialize all required files 
     
    830948     CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    831949     ! 
    832      INTEGER ::   jit, jk   ! dummy loop indices 
     950     INTEGER ::   jit, jk, jj, ji   ! dummy loop indices 
    833951     INTEGER ::   id1, id2, id3, id4, id5, id6   ! local integers 
    834952     !!---------------------------------------------------------------------- 
     
    857975           ELSE                                     ! No TKE array found: initialisation 
    858976              IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without tke scheme, en computed by iterative loop' 
    859               en (:,:,:) = rn_emin * tmask(:,:,:) 
     977!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     978              DO jk = 1, jpk 
     979                 DO jj = 1, jpj 
     980                    DO ji = 1, jpi 
     981                       en (ji,jj,jk) = rn_emin * tmask(ji,jj,jk) 
     982                    END DO 
     983                 END DO 
     984              END DO 
    860985              CALL tke_avn                               ! recompute avt, avm, avmu, avmv and dissl (approximation) 
    861986              ! 
    862               avt_k (:,:,:) = avt (:,:,:) 
    863               avm_k (:,:,:) = avm (:,:,:) 
    864               avmu_k(:,:,:) = avmu(:,:,:) 
    865               avmv_k(:,:,:) = avmv(:,:,:) 
     987!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     988              DO jk = 1, jpk 
     989                 DO jj = 1, jpj 
     990                    DO ji = 1, jpi 
     991                       avt_k (ji,jj,jk) = avt (ji,jj,jk) 
     992                       avm_k (ji,jj,jk) = avm (ji,jj,jk) 
     993                       avmu_k(ji,jj,jk) = avmu(ji,jj,jk) 
     994                       avmv_k(ji,jj,jk) = avmv(ji,jj,jk) 
     995                    END DO 
     996                 END DO 
     997              END DO 
    866998              ! 
    867999              DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_tke( jit )   ;   END DO 
    8681000           ENDIF 
    8691001        ELSE                                   !* Start from rest 
    870            en(:,:,:) = rn_emin * tmask(:,:,:) 
     1002!$OMP PARALLEL 
     1003!$OMP DO schedule(static) private(jk,jj,ji) 
     1004           DO jk = 1, jpk 
     1005              DO jj = 1, jpj 
     1006                 DO ji = 1, jpi 
     1007                    en(ji,jj,jk) = rn_emin * tmask(ji,jj,jk) 
     1008                 END DO 
     1009              END DO 
     1010           END DO 
     1011!$OMP END DO NOWAIT 
     1012!$OMP DO schedule(static) private(jk) 
    8711013           DO jk = 1, jpk                           ! set the Kz to the background value 
    872               avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    873               avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    874               avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
    875               avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
     1014              DO jj = 1, jpj 
     1015                 DO ji = 1, jpi 
     1016                    avt (ji,jj,jk) = avtb(jk) * wmask (ji,jj,jk) 
     1017                    avm (ji,jj,jk) = avmb(jk) * wmask (ji,jj,jk) 
     1018                    avmu(ji,jj,jk) = avmb(jk) * wumask(ji,jj,jk) 
     1019                    avmv(ji,jj,jk) = avmb(jk) * wvmask(ji,jj,jk) 
     1020                 END DO 
     1021              END DO 
    8761022           END DO 
     1023!$OMP END PARALLEL 
    8771024        ENDIF 
    8781025        ! 
Note: See TracChangeset for help on using the changeset viewer.