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/LIM_SRC_3/limvar.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/LIM_SRC_3/limvar.F90

    r7646 r7698  
    8080      !!------------------------------------------------------------------ 
    8181      INTEGER, INTENT( in ) ::   kn     ! =1 at_i & vt only ; = what is needed 
     82      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ze_s, ze_i 
    8283      ! 
    8384      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
    8485      !!------------------------------------------------------------------ 
    8586 
     87      CALL wrk_alloc( jpi, jpj, nlay_s, ze_s ) 
     88      CALL wrk_alloc( jpi, jpj, nlay_i, ze_i ) 
    8689      ! integrated values 
    87       vt_i (:,:) = SUM( v_i, dim=3 ) 
    88       vt_s (:,:) = SUM( v_s, dim=3 ) 
    89       at_i (:,:) = SUM( a_i, dim=3 ) 
    90       et_s(:,:)  = SUM( SUM( e_s(:,:,:,:), dim=4 ), dim=3 ) 
    91       et_i(:,:)  = SUM( SUM( e_i(:,:,:,:), dim=4 ), dim=3 ) 
     90!$OMP PARALLEL 
     91!$OMP DO schedule(static) private(jj, ji) 
     92      DO jj = 1, jpj 
     93         DO ji = 1, jpi 
     94            vt_i (ji,jj) = 0._wp 
     95            vt_s (ji,jj) = 0._wp 
     96            at_i (ji,jj) = 0._wp 
     97            et_s(ji,jj)  = 0._wp 
     98            et_i(ji,jj)  = 0._wp 
     99         END DO 
     100      END DO 
     101      DO jl = 1, jpl 
     102!$OMP DO schedule(static) private(jj, ji) 
     103         DO jj = 1, jpj 
     104            DO ji = 1, jpi 
     105               vt_i (ji,jj) = vt_i (ji,jj) + v_i (ji,jj,jl) 
     106               vt_s (ji,jj) = vt_s (ji,jj) + v_s (ji,jj,jl) 
     107               at_i (ji,jj) = at_i (ji,jj) + a_i (ji,jj,jl) 
     108            END DO 
     109         END DO 
     110      END DO 
     111      DO jk = 1, nlay_s 
     112!$OMP DO schedule(static) private(jj, ji) 
     113         DO jj = 1, jpj 
     114            DO ji = 1, jpi 
     115               ze_s(ji,jj,jk)  = 0._wp 
     116            END DO 
     117         END DO 
     118      END DO 
     119      DO jk = 1, nlay_i 
     120!$OMP DO schedule(static) private(jj, ji) 
     121         DO jj = 1, jpj 
     122            DO ji = 1, jpi 
     123               ze_i(ji,jj,jk)  = 0._wp 
     124            END DO 
     125         END DO 
     126      END DO 
     127      DO jl = 1, jpl 
     128         DO jk = 1, nlay_s 
     129!$OMP DO schedule(static) private(jj, ji) 
     130            DO jj = 1, jpj 
     131               DO ji = 1, jpi 
     132                  ze_s(ji,jj,jk)  = ze_s(ji,jj,jk) + e_s(ji,jj,jk,jl) 
     133               END DO 
     134            END DO 
     135         END DO 
     136      END DO 
     137      DO jl = 1, jpl 
     138         DO jk = 1, nlay_i 
     139!$OMP DO schedule(static) private(jj, ji) 
     140            DO jj = 1, jpj 
     141               DO ji = 1, jpi 
     142                  ze_i(ji,jj,jk)  = ze_i(ji,jj,jk) + e_i(ji,jj,jk,jl) 
     143               END DO 
     144            END DO 
     145         END DO 
     146      END DO 
     147      DO jk = 1, nlay_s 
     148!$OMP DO schedule(static) private(jj, ji) 
     149         DO jj = 1, jpj 
     150            DO ji = 1, jpi 
     151               et_s(ji,jj)  = et_s(ji,jj) + ze_s(ji,jj,jk) 
     152            END DO 
     153         END DO 
     154      END DO 
     155      DO jk = 1, nlay_i 
     156!$OMP DO schedule(static) private(jj, ji) 
     157         DO jj = 1, jpj 
     158            DO ji = 1, jpi 
     159               et_i(ji,jj)  = et_i(ji,jj) + ze_i(ji,jj,jk) 
     160            END DO 
     161         END DO 
     162      END DO 
    92163 
    93164      ! open water fraction 
     165!$OMP DO schedule(static) private(jj, ji) 
    94166      DO jj = 1, jpj 
    95167         DO ji = 1, jpi 
     
    97169         END DO 
    98170      END DO 
     171!$OMP END PARALLEL 
    99172 
    100173      IF( kn > 1 ) THEN 
    101174 
     175!$OMP PARALLEL 
    102176         ! mean ice/snow thickness 
     177!$OMP DO schedule(static) private(jj,ji,rswitch) 
    103178         DO jj = 1, jpj 
    104179            DO ji = 1, jpi 
     
    110185 
    111186         ! mean temperature (K), salinity and age 
    112          smt_i(:,:) = 0._wp 
    113          tm_i(:,:)  = 0._wp 
    114          tm_su(:,:) = 0._wp 
    115          om_i (:,:) = 0._wp 
     187!$OMP DO schedule(static) private(jj,ji) 
     188         DO jj = 1, jpj 
     189            DO ji = 1, jpi 
     190               smt_i(ji,jj) = 0._wp 
     191               tm_i(ji,jj)  = 0._wp 
     192               tm_su(ji,jj) = 0._wp 
     193               om_i (ji,jj) = 0._wp 
     194            ENDDO 
     195         ENDDO 
    116196         DO jl = 1, jpl 
    117197             
     198!$OMP DO schedule(static) private(jj,ji,rswitch) 
    118199            DO jj = 1, jpj 
    119200               DO ji = 1, jpi 
     
    125206             
    126207            DO jk = 1, nlay_i 
     208!$OMP DO schedule(static) private(jj,ji,rswitch) 
    127209               DO jj = 1, jpj 
    128210                  DO ji = 1, jpi 
     
    136218            END DO 
    137219         END DO 
     220!$OMP END PARALLEL 
    138221         tm_i  = tm_i  + rt0 
    139222         tm_su = tm_su + rt0 
    140223         ! 
    141224      ENDIF 
     225      CALL wrk_dealloc( jpi, jpj, nlay_s, ze_s ) 
     226      CALL wrk_dealloc( jpi, jpj, nlay_i, ze_i ) 
    142227      ! 
    143228   END SUBROUTINE lim_var_agg 
     
    159244      ! Ice thickness, snow thickness, ice salinity, ice age 
    160245      !------------------------------------------------------- 
    161       DO jl = 1, jpl 
     246!$OMP PARALLEL 
     247      DO jl = 1, jpl 
     248!$OMP DO schedule(static) private(jj,ji,rswitch) 
    162249         DO jj = 1, jpj 
    163250            DO ji = 1, jpi 
     
    168255      END DO 
    169256      ! Force the upper limit of ht_i to always be < hi_max (99 m). 
     257!$OMP DO schedule(static) private(jj,ji,rswitch) 
    170258      DO jj = 1, jpj 
    171259         DO ji = 1, jpi 
     
    177265 
    178266      DO jl = 1, jpl 
     267!$OMP DO schedule(static) private(jj,ji,rswitch) 
    179268         DO jj = 1, jpj 
    180269            DO ji = 1, jpi 
     
    188277      IF(  nn_icesal == 2  )THEN 
    189278         DO jl = 1, jpl 
     279!$OMP DO schedule(static) private(jj,ji,rswitch) 
    190280            DO jj = 1, jpj 
    191281               DO ji = 1, jpi 
     
    198288         END DO 
    199289      ENDIF 
     290!$OMP END PARALLEL 
    200291 
    201292      CALL lim_var_salprof      ! salinity profile 
     
    204295      ! Ice temperatures 
    205296      !------------------- 
     297!$OMP PARALLEL 
    206298      DO jl = 1, jpl 
    207299         DO jk = 1, nlay_i 
     300!$OMP DO schedule(static) private(jj,ji,rswitch,zq_i,ztmelts,zaaa,zbbb,zccc,zdiscrim) 
    208301            DO jj = 1, jpj 
    209302               DO ji = 1, jpi 
     
    231324      DO jl = 1, jpl 
    232325         DO jk = 1, nlay_s 
     326!$OMP DO schedule(static) private(jj,ji,rswitch,zq_s) 
    233327            DO jj = 1, jpj 
    234328               DO ji = 1, jpi 
     
    245339 
    246340      ! integrated values 
    247       vt_i (:,:) = SUM( v_i, dim=3 ) 
    248       vt_s (:,:) = SUM( v_s, dim=3 ) 
    249       at_i (:,:) = SUM( a_i, dim=3 ) 
    250  
     341!$OMP DO schedule(static) private(jj, ji) 
     342      DO jj = 1, jpj 
     343         DO ji = 1, jpi 
     344            vt_i (ji,jj) = 0._wp 
     345            vt_s (ji,jj) = 0._wp 
     346            at_i (ji,jj) = 0._wp 
     347         END DO 
     348      END DO 
     349      DO jl = 1, jpl 
     350!$OMP DO schedule(static) private(jj, ji) 
     351         DO jj = 1, jpj 
     352            DO ji = 1, jpi 
     353               vt_i (ji,jj) = vt_i (ji,jj) + v_i (ji,jj,jl) 
     354               vt_s (ji,jj) = vt_s (ji,jj) + v_s (ji,jj,jl) 
     355               at_i (ji,jj) = at_i (ji,jj) + a_i (ji,jj,jl) 
     356            END DO 
     357         END DO 
     358      END DO 
     359!$OMP END PARALLEL 
    251360      ! 
    252361   END SUBROUTINE lim_var_glo2eqv 
     
    300409      !--------------------------------------- 
    301410      IF(  nn_icesal == 1  )  THEN 
    302          s_i (:,:,:,:) = rn_icesal 
    303          sm_i(:,:,:)   = rn_icesal 
     411!$OMP PARALLEL 
     412         DO jl = 1, jpl 
     413            DO jk = 1, nlay_i 
     414!$OMP DO schedule(static) private(jj, ji) 
     415               DO jj = 1, jpj 
     416                  DO ji = 1, jpi 
     417                     s_i (ji,jj,jk,jl) = rn_icesal 
     418                  END DO 
     419               END DO 
     420            END DO 
     421         END DO 
     422         DO jl = 1, jpl  
     423!$OMP DO schedule(static) private(jj, ji) 
     424            DO jj = 1, jpj 
     425               DO ji = 1, jpi 
     426                  sm_i(ji,jj,jl)   = rn_icesal 
     427               END DO 
     428            END DO 
     429         END DO 
     430!$OMP END PARALLEL 
    304431      ENDIF 
    305432 
     
    309436      IF(  nn_icesal == 2  ) THEN 
    310437         ! 
    311          DO jk = 1, nlay_i 
    312             s_i(:,:,jk,:)  = sm_i(:,:,:) 
     438!$OMP PARALLEL 
     439         DO jl = 1, jpl 
     440            DO jk = 1, nlay_i 
     441!$OMP DO schedule(static) private(jj, ji) 
     442               DO jj = 1, jpj 
     443                  DO ji = 1, jpi 
     444                     s_i(ji,jj,jk,jl)  = sm_i(ji,jj,jl) 
     445                  END DO 
     446               END DO 
     447!$OMP END DO NOWAIT 
     448            END DO 
    313449         END DO 
    314450         ! 
    315451         DO jl = 1, jpl                               ! Slope of the linear profile  
     452!$OMP DO schedule(static) private(jj,ji,rswitch) 
    316453            DO jj = 1, jpj 
    317454               DO ji = 1, jpi 
     
    320457               END DO 
    321458            END DO 
     459!$OMP END DO NOWAIT 
    322460         END DO 
    323461         ! 
     
    325463         zfac1 = zsi1  / ( zsi1 - zsi0 ) 
    326464         ! 
    327          zalpha(:,:,:) = 0._wp 
    328465         DO jl = 1, jpl 
     466!$OMP DO schedule(static) private(jj, ji) 
     467            DO jj = 1, jpj 
     468               DO ji = 1, jpi 
     469                  zalpha(ji,jj,jl) = 0._wp 
     470               END DO 
     471            END DO 
     472         END DO 
     473         DO jl = 1, jpl 
     474!$OMP DO schedule(static) private(jj,ji,zswi0,zswi01,rswitch) 
    329475            DO jj = 1, jpj 
    330476               DO ji = 1, jpi 
     
    345491         DO jl = 1, jpl 
    346492            DO jk = 1, nlay_i 
     493!$OMP DO schedule(static) private(jj,ji,zs_zero) 
    347494               DO jj = 1, jpj 
    348495                  DO ji = 1, jpi 
     
    357504            END DO 
    358505         END DO 
     506!$OMP END PARALLEL 
    359507         ! 
    360508      ENDIF ! nn_icesal 
     
    366514      IF(  nn_icesal == 3  ) THEN      ! Schwarzacher (1959) multiyear salinity profile (mean = 2.30) 
    367515         ! 
    368          sm_i(:,:,:) = 2.30_wp 
     516!$OMP PARALLEL 
     517         DO jl = 1, jpl 
     518!$OMP DO schedule(static) private(jj,ji) 
     519            DO jj = 1, jpj 
     520               DO ji = 1, jpi 
     521                  sm_i(ji,jj,jl) = 2.30_wp 
     522               END DO 
     523            END DO 
     524!$OMP END DO NOWAIT 
     525         END DO 
    369526         ! 
    370527         DO jl = 1, jpl 
     
    372529               zargtemp  = ( REAL(jk,wp) - 0.5_wp ) * r1_nlay_i 
    373530               zsal =  1.6_wp * (  1._wp - COS( rpi * zargtemp**(0.407_wp/(0.573_wp+zargtemp)) )  ) 
    374                s_i(:,:,jk,jl) =  zsal 
    375             END DO 
    376          END DO 
     531!$OMP DO schedule(static) private(jj,ji) 
     532               DO jj = 1, jpj 
     533                  DO ji = 1, jpi 
     534                     s_i(ji,jj,jk,jl) =  zsal 
     535                  END DO 
     536               END DO 
     537            END DO 
     538         END DO 
     539!$OMP END PARALLEL 
    377540         ! 
    378541      ENDIF ! nn_icesal 
     
    396559      !!------------------------------------------------------------------ 
    397560      ! 
    398       bvm_i(:,:)   = 0._wp 
    399       bv_i (:,:,:) = 0._wp 
     561!$OMP PARALLEL 
     562!$OMP DO schedule(static) private(jj,ji) 
     563      DO jj = 1, jpj 
     564         DO ji = 1, jpi 
     565            bvm_i(ji,jj) = 0._wp 
     566         END DO 
     567      END DO 
     568      DO jl = 1, jpl 
     569!$OMP DO schedule(static) private(jj,ji) 
     570         DO jj = 1, jpj 
     571            DO ji = 1, jpi 
     572               bv_i (ji,jj,jl) = 0._wp 
     573            END DO 
     574         END DO 
     575      END DO 
    400576      DO jl = 1, jpl 
    401577         DO jk = 1, nlay_i 
     578!$OMP DO schedule(static) private(jj,ji,rswitch) 
    402579            DO jj = 1, jpj 
    403580               DO ji = 1, jpi 
     
    409586         END DO 
    410587          
     588!$OMP DO schedule(static) private(jj,ji,rswitch) 
    411589         DO jj = 1, jpj 
    412590            DO ji = 1, jpi 
     
    416594         END DO 
    417595      END DO 
     596!$OMP END PARALLEL 
    418597      ! 
    419598   END SUBROUTINE lim_var_bv 
     
    518697      REAL(wp) ::   zsal, zvi, zvs, zei, zes 
    519698      !!------------------------------------------------------------------- 
    520       at_i (:,:) = 0._wp 
    521       DO jl = 1, jpl 
    522          at_i(:,:) = at_i(:,:) + a_i(:,:,jl) 
     699!$OMP PARALLEL 
     700!$OMP DO schedule(static) private(jj,ji) 
     701      DO jj = 1, jpj 
     702         DO ji = 1, jpi 
     703            at_i (ji,jj) = 0._wp 
     704         END DO 
     705      END DO 
     706      DO jl = 1, jpl 
     707!$OMP DO schedule(static) private(jj,ji) 
     708         DO jj = 1, jpj 
     709            DO ji = 1, jpi 
     710               at_i(ji,jj) = at_i(ji,jj) + a_i(ji,jj,jl) 
     711            END DO 
     712         END DO 
    523713      END DO 
    524714 
     
    529719         !----------------------------------------------------------------- 
    530720         DO jk = 1, nlay_i 
     721!$OMP DO schedule(static) private(jj,ji,rswitch,zei) 
    531722            DO jj = 1 , jpj 
    532723               DO ji = 1 , jpi 
     
    545736         END DO 
    546737 
     738!$OMP DO schedule(static) private(jj,ji,rswitch,zsal,zvi,zvs,zes) 
    547739         DO jj = 1 , jpj 
    548740            DO ji = 1 , jpi 
     
    583775 
    584776      ! to be sure that at_i is the sum of a_i(jl) 
    585       at_i (:,:) = 0._wp 
    586       DO jl = 1, jpl 
    587          at_i(:,:) = at_i(:,:) + a_i(:,:,jl) 
     777!$OMP DO schedule(static) private(jj,ji) 
     778      DO jj = 1, jpj 
     779         DO ji = 1, jpi 
     780            at_i (ji,jj) = 0._wp 
     781         END DO 
     782      END DO 
     783      DO jl = 1, jpl 
     784!$OMP DO schedule(static) private(jj,ji) 
     785         DO jj = 1, jpj 
     786            DO ji = 1, jpi 
     787               at_i(ji,jj) = at_i(ji,jj) + a_i(ji,jj,jl) 
     788            END DO 
     789         END DO 
    588790      END DO 
    589791 
    590792      ! open water = 1 if at_i=0 
     793!$OMP DO schedule(static) private(jj,ji,rswitch) 
    591794      DO jj = 1, jpj 
    592795         DO ji = 1, jpi 
     
    595798         END DO 
    596799      END DO 
     800!$OMP END PARALLEL 
    597801 
    598802      ! 
Note: See TracChangeset for help on using the changeset viewer.