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/DOM/domzgr.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/DOM/domzgr.F90

    r7646 r7698  
    7272      INTEGER, DIMENSION(:,:), INTENT(out) ::   k_top, k_bot   ! ocean first and last level indices 
    7373      ! 
    74       INTEGER  ::   jk                  ! dummy loop index 
     74      INTEGER  ::   ji, jj, jk                  ! dummy loop index 
    7575      INTEGER  ::   ioptio, ibat, ios   ! local integer 
    7676      REAL(wp) ::   zrefdep             ! depth of the reference level (~10m) 
     
    114114!!gm to be remove when removing the OLD definition of e3 scale factors so that gde3w disappears 
    115115      ! Compute gde3w_0 (vertical sum of e3w) 
    116       gde3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 
     116!$OMP PARALLEL 
     117!$OMP DO schedule(static) private(jj, ji) 
     118      DO jj = 1, jpj 
     119         DO ji = 1, jpi 
     120            gde3w_0(ji,jj,1) = 0.5_wp * e3w_0(ji,jj,1) 
     121         END DO 
     122      END DO 
    117123      DO jk = 2, jpk 
    118          gde3w_0(:,:,jk) = gde3w_0(:,:,jk-1) + e3w_0(:,:,jk) 
    119       END DO 
     124!$OMP DO schedule(static) private(jj, ji) 
     125         DO jj = 1, jpj 
     126            DO ji = 1, jpi 
     127               gde3w_0(ji,jj,jk) = gde3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk) 
     128            END DO 
     129         END DO 
     130      END DO 
     131!$OMP END PARALLEL 
    120132      ! 
    121133      IF(lwp) THEN                     ! Control print 
     
    190202      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top , k_bot               ! first & last ocean level 
    191203      ! 
    192       INTEGER  ::   jk     ! dummy loop index 
     204      INTEGER  ::   jk, jj, ji   ! dummy loop index 
    193205      INTEGER  ::   inum   ! local logical unit 
    194206      REAL(WP) ::   z_zco, z_zps, z_sco, z_cav 
     
    254266      !                          !* ocean top and bottom level 
    255267      CALL iom_get( inum, jpdom_data, 'top_level'    , z2d  , lrowattr=ln_use_jattr )   ! 1st wet T-points (ISF) 
    256       k_top(:,:) = INT( z2d(:,:) ) 
     268!$OMP PARALLEL DO schedule(static) private(jj, ji) 
     269      DO jj = 1, jpj 
     270         DO ji = 1, jpi 
     271            k_top(ji,jj) = INT( z2d(ji,jj) ) 
     272         END DO 
     273      END DO 
    257274      CALL iom_get( inum, jpdom_data, 'bottom_level' , z2d  , lrowattr=ln_use_jattr )   ! last wet T-points 
    258       k_bot(:,:) = INT( z2d(:,:) ) 
     275!$OMP PARALLEL DO schedule(static) private(jj, ji) 
     276      DO jj = 1, jpj 
     277         DO ji = 1, jpi 
     278            k_bot(ji,jj) = INT( z2d(ji,jj) ) 
     279         END DO 
     280      END DO 
    259281      ! 
    260282      ! bathymetry with orography (wetting and drying only) 
     
    295317      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~' 
    296318      ! 
    297       mikt(:,:) = MAX( k_top(:,:) , 1 )    ! top    ocean k-index of T-level (=1 over land) 
    298       ! 
    299       mbkt(:,:) = MAX( k_bot(:,:) , 1 )    ! bottom ocean k-index of T-level (=1 over land) 
    300   
     319!$OMP PARALLEL 
     320!$OMP DO schedule(static) private(jj, ji) 
     321      DO jj = 1, jpj 
     322         DO ji = 1, jpi 
     323            mikt(ji,jj) = MAX( k_top(ji,jj) , 1 )    ! top    ocean k-index of T-level (=1 over land) 
     324            ! 
     325            mbkt(ji,jj) = MAX( k_bot(ji,jj) , 1 )    ! bottom ocean k-index of T-level (=1 over land) 
     326         END DO 
     327      END DO 
    301328      !                                    ! N.B.  top     k-index of W-level = mikt 
    302329      !                                    !       bottom  k-index of W-level = mbkt+1 
     330!$OMP DO schedule(static) private(jj, ji) 
    303331      DO jj = 1, jpjm1 
    304332         DO ji = 1, jpim1 
     
    312340      END DO 
    313341      ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
    314       zk(:,:) = REAL( miku(:,:), wp )   ;   CALL lbc_lnk( zk, 'U', 1. )   ;   miku(:,:) = MAX( INT( zk(:,:) ), 1 ) 
    315       zk(:,:) = REAL( mikv(:,:), wp )   ;   CALL lbc_lnk( zk, 'V', 1. )   ;   mikv(:,:) = MAX( INT( zk(:,:) ), 1 ) 
    316       zk(:,:) = REAL( mikf(:,:), wp )   ;   CALL lbc_lnk( zk, 'F', 1. )   ;   mikf(:,:) = MAX( INT( zk(:,:) ), 1 ) 
    317       ! 
    318       zk(:,:) = REAL( mbku(:,:), wp )   ;   CALL lbc_lnk( zk, 'U', 1. )   ;   mbku(:,:) = MAX( INT( zk(:,:) ), 1 ) 
    319       zk(:,:) = REAL( mbkv(:,:), wp )   ;   CALL lbc_lnk( zk, 'V', 1. )   ;   mbkv(:,:) = MAX( INT( zk(:,:) ), 1 ) 
     342!$OMP DO schedule(static) private(jj, ji) 
     343      DO jj = 1, jpj 
     344         DO ji = 1, jpi 
     345            zk(ji,jj) = REAL( miku(ji,jj), wp ) 
     346         END DO 
     347      END DO 
     348!$OMP END PARALLEL 
     349      CALL lbc_lnk( zk, 'U', 1. ) 
     350!$OMP PARALLEL 
     351!$OMP DO schedule(static) private(jj, ji) 
     352      DO jj = 1, jpj 
     353         DO ji = 1, jpi 
     354            miku(ji,jj) = MAX( INT( zk(ji,jj) ), 1 ) 
     355         END DO 
     356      END DO 
     357!$OMP DO schedule(static) private(jj, ji) 
     358      DO jj = 1, jpj 
     359         DO ji = 1, jpi 
     360            zk(ji,jj) = REAL( mikv(ji,jj), wp ) 
     361         END DO 
     362      END DO 
     363!$OMP END PARALLEL 
     364      CALL lbc_lnk( zk, 'V', 1. ) 
     365!$OMP PARALLEL 
     366!$OMP DO schedule(static) private(jj, ji) 
     367      DO jj = 1, jpj 
     368         DO ji = 1, jpi 
     369            mikv(ji,jj) = MAX( INT( zk(ji,jj) ), 1 ) 
     370         END DO 
     371      END DO 
     372!$OMP DO schedule(static) private(jj, ji) 
     373      DO jj = 1, jpj 
     374         DO ji = 1, jpi 
     375            zk(ji,jj) = REAL( mikf(ji,jj), wp ) 
     376         END DO 
     377      END DO 
     378!$OMP END PARALLEL 
     379      CALL lbc_lnk( zk, 'F', 1. ) 
     380!$OMP PARALLEL 
     381!$OMP DO schedule(static) private(jj, ji) 
     382      DO jj = 1, jpj 
     383         DO ji = 1, jpi 
     384            mikf(ji,jj) = MAX( INT( zk(ji,jj) ), 1 ) 
     385         END DO 
     386      END DO 
     387      ! 
     388!$OMP DO schedule(static) private(jj, ji) 
     389      DO jj = 1, jpj 
     390         DO ji = 1, jpi 
     391            zk(ji,jj) = REAL( mbku(ji,jj), wp ) 
     392         END DO 
     393      END DO 
     394!$OMP END PARALLEL 
     395      CALL lbc_lnk( zk, 'U', 1. ) 
     396!$OMP PARALLEL 
     397!$OMP DO schedule(static) private(jj, ji) 
     398      DO jj = 1, jpj 
     399         DO ji = 1, jpi 
     400            mbku(ji,jj) = MAX( INT( zk(ji,jj) ), 1 ) 
     401         END DO 
     402      END DO 
     403!$OMP DO schedule(static) private(jj, ji) 
     404      DO jj = 1, jpj 
     405         DO ji = 1, jpi 
     406            zk(ji,jj) = REAL( mbkv(ji,jj), wp ) 
     407         END DO 
     408      END DO 
     409!$OMP END PARALLEL 
     410      CALL lbc_lnk( zk, 'V', 1. ) 
     411!$OMP PARALLEL DO schedule(static) private(jj, ji) 
     412      DO jj = 1, jpj 
     413         DO ji = 1, jpi 
     414            mbkv(ji,jj) = MAX( INT( zk(ji,jj) ), 1 ) 
     415         END DO 
     416      END DO 
    320417      ! 
    321418      CALL wrk_dealloc( jpi,jpj,   zk ) 
Note: See TracChangeset for help on using the changeset viewer.