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 9176 for branches/UKMO/dev_r5518_GO6_package_OMP/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90 – NEMO

Ignore:
Timestamp:
2018-01-04T13:30:03+01:00 (6 years ago)
Author:
andmirek
Message:

#2001: OMP directives

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_GO6_package_OMP/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90

    r6498 r9176  
    172172      fsdept_b(:,:,1) = 0.5_wp * fse3w_b(:,:,1) 
    173173      fsdepw_b(:,:,1) = 0.0_wp 
    174  
     174!$OPM PARALLEL 
    175175      DO jk = 2, jpk 
     176!$OMP DO PRIVATE(zcoef) 
    176177         DO jj = 1,jpj 
    177178            DO ji = 1,jpi 
     
    189190            END DO 
    190191         END DO 
     192!$OMP END DO 
    191193      END DO 
     194!$OPM PARALLEL 
    192195 
    193196      ! Before depth and Inverse of the local depth of the water column at u- and v- points 
     
    214217         ENDIF 
    215218         IF ( ln_vvl_zstar_at_eqtor ) THEN 
     219!$OMP PARALLEL DO 
    216220            DO jj = 1, jpj 
    217221               DO ji = 1, jpi 
     
    273277      !!---------------------------------------------------------------------- 
    274278      REAL(wp), POINTER, DIMENSION(:,:,:) :: ze3t 
    275       REAL(wp), POINTER, DIMENSION(:,:  ) :: zht, z_scale, zwu, zwv, zhdiv 
     279      REAL(wp),     DIMENSION(jpi, jpj  ) :: zht, z_scale, zwu, zwv, zhdiv 
    276280      !! * Arguments 
    277281      INTEGER, INTENT( in )                  :: kt                    ! time step 
     
    285289      !!---------------------------------------------------------------------- 
    286290      IF( nn_timing == 1 )  CALL timing_start('dom_vvl_sf_nxt') 
    287       CALL wrk_alloc( jpi, jpj, zht, z_scale, zwu, zwv, zhdiv ) 
     291!     CALL wrk_alloc( jpi, jpj, zht, z_scale, zwu, zwv, zhdiv ) 
    288292      CALL wrk_alloc( jpi, jpj, jpk, ze3t                     ) 
    289293 
     
    306310                                                       ! z_star coordinate and barotropic z-tilde part ! 
    307311      !                                                ! --------------------------------------------- ! 
    308  
    309       z_scale(:,:) = ( ssha(:,:) - sshb(:,:) ) * ssmask(:,:) / ( ht_0(:,:) + sshn(:,:) + 1. - ssmask(:,:) ) 
     312!$OMP PARALLEL 
     313!$OMP DO 
     314      DO jj = 1, jpj  
     315         z_scale(:,jj) = ( ssha(:,jj) - sshb(:,jj) ) * ssmask(:,jj) / ( ht_0(:,jj) + sshn(:,jj) + 1. - ssmask(:,jj) ) 
     316      END DO 
     317!$OMP END DO 
     318!$OMP DO 
    310319      DO jk = 1, jpkm1 
    311320         ! formally this is the same as fse3t_a = e3t_0*(1+ssha/ht_0) 
    312321         fse3t_a(:,:,jk) = fse3t_b(:,:,jk) + fse3t_n(:,:,jk) * z_scale(:,:) * tmask(:,:,jk) 
    313322      END DO 
     323!$OMP END DO 
     324!$OMP END PARALLEL 
    314325 
    315326      IF( ln_vvl_ztilde .OR. ln_vvl_layer .AND. ll_do_bclinic ) THEN   ! z_tilde or layer coordinate ! 
     
    323334         zhdiv(:,:) = 0. 
    324335         zht(:,:)   = 0. 
     336!$OMP PARALLEL DO REDUCTION(+:zhdiv, zht) 
    325337         DO jk = 1, jpkm1 
    326338            zhdiv(:,:) = zhdiv(:,:) + fse3t_n(:,:,jk) * hdivn(:,:,jk) 
    327339            zht  (:,:) = zht  (:,:) + fse3t_n(:,:,jk) * tmask(:,:,jk) 
    328340         END DO 
    329          zhdiv(:,:) = zhdiv(:,:) / ( zht(:,:) + 1. - tmask_i(:,:) ) 
     341!$OMP DO 
     342      DO jj = 1, jpj 
     343         zhdiv(:,jj) = zhdiv(:,jj) / ( zht(:,jj) + 1. - tmask_i(:,jj) ) 
     344      END DO 
     345!$OMP END DO 
    330346 
    331347         ! 2 - Low frequency baroclinic horizontal divergence  (z-tilde case only) 
     
    333349         IF( ln_vvl_ztilde ) THEN 
    334350            IF( kt .GT. nit000 ) THEN 
     351!$OMP PARALLEL DO 
    335352               DO jk = 1, jpkm1 
    336353                  hdiv_lf(:,:,jk) = hdiv_lf(:,:,jk) - rdt * frq_rst_hdv(:,:)   & 
     
    347364         ! ---------------------------------- 
    348365         IF( ln_vvl_ztilde ) THEN     ! z_tilde case 
     366!$OMP PARALLEL DO 
    349367            DO jk = 1, jpkm1 
    350368               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - ( fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) - hdiv_lf(:,:,jk) ) 
    351369            END DO 
    352370         ELSE                         ! layer case 
     371!$OMP PARALLEL DO 
    353372            DO jk = 1, jpkm1 
    354373               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) -   fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) * tmask(:,:,jk) 
     
    359378         ! ------------------ 
    360379         IF( ln_vvl_ztilde ) THEN 
     380!$OMP PARALLEL DO 
    361381            DO jk = 1, jpk 
    362382               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - frq_rst_e3t(:,:) * tilde_e3t_b(:,:,jk) 
     
    369389         zwv(:,:) = 0.0_wp 
    370390         ! a - first derivative: diffusive fluxes 
     391!$OMP PARALLEL  
     392!$OMP DO 
    371393         DO jk = 1, jpkm1 
    372394            DO jj = 1, jpjm1 
     
    376398                  vn_td(ji,jj,jk) = rn_ahe3 * vmask(ji,jj,jk) * re1v_e2v(ji,jj) &  
    377399                                  & * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji  ,jj+1,jk) ) 
     400               END DO 
     401            END DO 
     402         END DO 
     403!$OMP END DO 
     404!$OMP DO REDUCTION(+:zwu, zwv) 
     405         DO jk = 1, jpkm1 
     406            DO jj = 1, jpjm1 
     407               DO ji = 1, fs_jpim1   ! vector opt. 
    378408                  zwu(ji,jj) = zwu(ji,jj) + un_td(ji,jj,jk) 
    379409                  zwv(ji,jj) = zwv(ji,jj) + vn_td(ji,jj,jk) 
     
    381411            END DO 
    382412         END DO 
     413!$OMP END DO 
     414!$OMP END PARALLEL 
    383415         ! b - correction for last oceanic u-v points 
     416!$OMP PARALLEL DO 
    384417         DO jj = 1, jpj 
    385418            DO ji = 1, jpi 
     
    389422         END DO 
    390423         ! c - second derivative: divergence of diffusive fluxes 
     424!$OMP PARALLEL DO 
    391425         DO jk = 1, jpkm1 
    392426            DO jj = 2, jpjm1 
     
    413447         ENDIF 
    414448         CALL lbc_lnk( tilde_e3t_a(:,:,:), 'T', 1._wp ) 
    415          tilde_e3t_a(:,:,:) = tilde_e3t_b(:,:,:) + z2dt * tmask(:,:,:) * tilde_e3t_a(:,:,:) 
    416  
     449!$OMP PARALLEL DO 
     450         DO jk = 1, jpk 
     451            tilde_e3t_a(:,:,jk) = tilde_e3t_b(:,:,jk) + z2dt * tmask(:,:,jk) * tilde_e3t_a(:,:,jk) 
     452         ENDDO 
    417453         ! Maximum deformation control 
    418454         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    419455         ze3t(:,:,jpk) = 0.0_wp 
    420          DO jk = 1, jpkm1 
    421             ze3t(:,:,jk) = tilde_e3t_a(:,:,jk) / e3t_0(:,:,jk) * tmask(:,:,jk) * tmask_i(:,:) 
    422          END DO 
     456!$OMP PARALLEL DO 
     457         DO jk = 1, jpkm1 
     458            DO jj = 1, jpj 
     459!dir$ IVDEP 
     460               DO ji = 1, jpi 
     461                  ze3t(ji, jj ,jk) = tilde_e3t_a(ji, jj ,jk) / e3t_0(ji, jj ,jk) * tmask(ji, jj ,jk) * tmask_i(ji, jj) 
     462               ENDDO 
     463             ENDDO 
     464         END DO 
     465!$OMP PARALLEL 
     466!$OMP DO 
     467         DO jk = 1, jpkm1 
     468                  ze3t(:, : ,jk) = tilde_e3t_a(:, : ,jk) / e3t_0(:, : ,jk) * tmask_i(:, :) 
     469         END DO 
     470!$OMP END DO 
     471!$OMP DO 
     472         DO jk = 1, jpkm1  
     473                  ze3t(:, : ,jk) = ze3t(:, : ,jk) * tmask(:, : ,jk)  
     474         END DO 
     475!$OMP END DO 
     476!$OMP END PARALLEL 
     477 
    423478         z_tmax = MAXVAL( ze3t(:,:,:) ) 
    424479         IF( lk_mpp )   CALL mpp_max( z_tmax )                 ! max over the global domain 
     
    448503         ! - ML - end test 
    449504         ! - ML - Imposing these limits will cause a baroclinicity error which is corrected for below 
    450          tilde_e3t_a(:,:,:) = MIN( tilde_e3t_a(:,:,:),   rn_zdef_max * e3t_0(:,:,:) ) 
    451          tilde_e3t_a(:,:,:) = MAX( tilde_e3t_a(:,:,:), - rn_zdef_max * e3t_0(:,:,:) ) 
    452  
     505!$OMP PARALLEL DO 
     506         DO jk =1, jpk 
     507            tilde_e3t_a(:,:,jk) = MIN( tilde_e3t_a(:,:,jk),   rn_zdef_max * e3t_0(:,:,jk) ) 
     508            tilde_e3t_a(:,:,jk) = MAX( tilde_e3t_a(:,:,jk), - rn_zdef_max * e3t_0(:,:,jk) ) 
     509         ENDDO 
    453510         ! 
    454511         ! "tilda" change in the after scale factor 
    455512         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     513!$OMP PARALLEL DO 
    456514         DO jk = 1, jpkm1 
    457515            dtilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - tilde_e3t_b(:,:,jk) 
     
    464522         !        (keep in mind that the idea is to reduce Eulerian velocity as much as possible) 
    465523         zht(:,:) = 0. 
     524!$OMP PARALLEL DO REDUCTION(+:zht) 
    466525         DO jk = 1, jpkm1 
    467526            zht(:,:)  = zht(:,:) + tilde_e3t_a(:,:,jk) * tmask(:,:,jk) 
    468527         END DO 
    469528         z_scale(:,:) =  - zht(:,:) / ( ht_0(:,:) + sshn(:,:) + 1. - ssmask(:,:) ) 
     529!$OMP PARALLEL DO 
    470530         DO jk = 1, jpkm1 
    471531            dtilde_e3t_a(:,:,jk) = dtilde_e3t_a(:,:,jk) + fse3t_n(:,:,jk) * z_scale(:,:) * tmask(:,:,jk) 
     
    476536      IF( ln_vvl_ztilde .OR. ln_vvl_layer )  THEN   ! z_tilde or layer coordinate ! 
    477537      !                                           ! ---baroclinic part--------- ! 
     538!$OMP PARALLEL DO 
    478539         DO jk = 1, jpkm1 
    479540            fse3t_a(:,:,jk) = fse3t_a(:,:,jk) + dtilde_e3t_a(:,:,jk) * tmask(:,:,jk) 
     
    491552         ! 
    492553         zht(:,:) = 0.0_wp 
     554!$OMP PARALLEL DO REDUCTION(+:zht) 
    493555         DO jk = 1, jpkm1 
    494556            zht(:,:) = zht(:,:) + fse3t_n(:,:,jk) * tmask(:,:,jk) 
     
    499561         ! 
    500562         zht(:,:) = 0.0_wp 
     563!$OMP PARALLEL DO REDUCTION(+:zht) 
    501564         DO jk = 1, jpkm1 
    502565            zht(:,:) = zht(:,:) + fse3t_a(:,:,jk) * tmask(:,:,jk) 
     
    507570         ! 
    508571         zht(:,:) = 0.0_wp 
     572!$OMP PARALLEL DO REDUCTION(+:zht) 
    509573         DO jk = 1, jpkm1 
    510574            zht(:,:) = zht(:,:) + fse3t_b(:,:,jk) * tmask(:,:,jk) 
     
    540604      hu_a(:,:) = 0._wp                        ! Ocean depth at U-points 
    541605      hv_a(:,:) = 0._wp                        ! Ocean depth at V-points 
     606 
    542607      DO jk = 1, jpkm1 
    543608         hu_a(:,:) = hu_a(:,:) + fse3u_a(:,:,jk) * umask(:,:,jk) 
     
    545610      END DO 
    546611      !                                        ! Inverse of the local depth 
    547       hur_a(:,:) = 1._wp / ( hu_a(:,:) + 1._wp - umask_i(:,:) ) * umask_i(:,:) 
    548       hvr_a(:,:) = 1._wp / ( hv_a(:,:) + 1._wp - vmask_i(:,:) ) * vmask_i(:,:) 
    549  
    550       CALL wrk_dealloc( jpi, jpj, zht, z_scale, zwu, zwv, zhdiv ) 
     612!$OMP PARALLEL DO 
     613      DO jj = 1, jpj 
     614         hur_a(:,jj) = 1._wp / ( hu_a(:,jj) + 1._wp - umask_i(:,jj) ) * umask_i(:,jj) 
     615         hvr_a(:,jj) = 1._wp / ( hv_a(:,jj) + 1._wp - vmask_i(:,jj) ) * vmask_i(:,jj) 
     616      ENDDO 
     617 
     618!     CALL wrk_dealloc( jpi, jpj, zht, z_scale, zwu, zwv, zhdiv ) 
    551619      CALL wrk_dealloc( jpi, jpj, jpk, ze3t                     ) 
    552620 
     
    603671            tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) 
    604672         ELSE 
    605             tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) &  
     673!$OMP PARALLEL DO 
     674            DO jk = 1,jpk 
     675               tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) &  
    606676            &         + atfp * ( tilde_e3t_b(:,:,:) - 2.0_wp * tilde_e3t_n(:,:,:) + tilde_e3t_a(:,:,:) ) 
     677            ENDDO 
    607678         ENDIF 
    608679         tilde_e3t_n(:,:,:) = tilde_e3t_a(:,:,:) 
     
    636707      fsdepw_n(:,:,1) = 0.0_wp 
    637708      fsde3w_n(:,:,1) = fsdept_n(:,:,1) - sshn(:,:) 
    638  
     709!$OMP PARALLEL SHARED(jk) 
    639710      DO jk = 2, jpk 
     711!$OMP DO PRIVATE(zcoef) 
    640712         DO jj = 1,jpj 
    641713            DO ji = 1,jpi 
     
    649721            END DO 
    650722         END DO 
     723!$OMP END DO 
    651724      END DO 
     725!$OMP END PARALLEL 
    652726 
    653727      ! Local depth and Inverse of the local depth of the water column at u- and v- points 
     
    663737      ! -------------------------------------------- 
    664738      ht(:,:) = 0. 
     739!$OMP PARALLEL DO REDUCTION(+:ht) 
    665740      DO jk = 1, jpkm1 
    666741         ht(:,:) = ht(:,:) + fse3t_n(:,:,jk) * tmask(:,:,jk) 
     
    705780         !               ! ------------------------------------- ! 
    706781         ! horizontal surface weighted interpolation 
     782!$OMP PARALLEL DO 
    707783         DO jk = 1, jpk 
    708784            DO jj = 1, jpjm1 
     
    718794         ! boundary conditions 
    719795         CALL lbc_lnk( pe3_out(:,:,:), 'U', 1._wp ) 
    720          pe3_out(:,:,:) = pe3_out(:,:,:) + e3u_0(:,:,:) 
     796!$OMP PARALLEL DO 
     797         DO jk = 1, jpk 
     798            pe3_out(:,:,jk) = pe3_out(:,:,jk) + e3u_0(:,:,jk) 
     799         ENDDO 
    721800         !               ! ------------------------------------- ! 
    722801      CASE( 'V' )        ! interpolation from T-point to V-point ! 
    723802         !               ! ------------------------------------- ! 
    724803         ! horizontal surface weighted interpolation 
     804!$OMP PARALLEL DO 
    725805         DO jk = 1, jpk 
    726806            DO jj = 1, jpjm1 
     
    736816         ! boundary conditions 
    737817         CALL lbc_lnk( pe3_out(:,:,:), 'V', 1._wp ) 
    738          pe3_out(:,:,:) = pe3_out(:,:,:) + e3v_0(:,:,:) 
     818!$OMP PARALLEL DO 
     819         DO jk = 1, jpk 
     820            pe3_out(:,:,jk) = pe3_out(:,:,jk) + e3v_0(:,:,jk) 
     821         ENDDO 
    739822         !               ! ------------------------------------- ! 
    740823      CASE( 'F' )        ! interpolation from U-point to F-point ! 
    741824         !               ! ------------------------------------- ! 
    742825         ! horizontal surface weighted interpolation 
     826!$OMP PARALLEL DO 
    743827         DO jk = 1, jpk 
    744828            DO jj = 1, jpjm1 
     
    754838         ! boundary conditions 
    755839         CALL lbc_lnk( pe3_out(:,:,:), 'F', 1._wp ) 
    756          pe3_out(:,:,:) = pe3_out(:,:,:) + e3f_0(:,:,:) 
     840!$OMP PARALLEL DO 
     841         DO jk = 1, jpk 
     842            pe3_out(:,:,jk) = pe3_out(:,:,jk) + e3f_0(:,:,jk) 
     843         ENDDO 
    757844         !               ! ------------------------------------- ! 
    758845      CASE( 'W' )        ! interpolation from T-point to W-point ! 
     
    761848         pe3_out(:,:,1) = e3w_0(:,:,1) + pe3_in(:,:,1) - e3t_0(:,:,1) 
    762849         ! - ML - The use of mask in this formaula enables the special treatment of the last w- point without indirect adressing 
     850!$OMP PARALLEL DO 
    763851         DO jk = 2, jpk 
    764852            pe3_out(:,:,jk) = e3w_0(:,:,jk) + ( 1.0_wp - 0.5_wp * tmask(:,:,jk) ) * ( pe3_in(:,:,jk-1) - e3t_0(:,:,jk-1) )   & 
     
    771859         pe3_out(:,:,1) = e3uw_0(:,:,1) + pe3_in(:,:,1) - e3u_0(:,:,1) 
    772860         ! - ML - The use of mask in this formaula enables the special treatment of the last w- point without indirect adressing 
     861!$OMP PARALLEL DO 
    773862         DO jk = 2, jpk 
    774863            pe3_out(:,:,jk) = e3uw_0(:,:,jk) + ( 1.0_wp - 0.5_wp * umask(:,:,jk) ) * ( pe3_in(:,:,jk-1) - e3u_0(:,:,jk-1) )   & 
     
    781870         pe3_out(:,:,1) = e3vw_0(:,:,1) + pe3_in(:,:,1) - e3v_0(:,:,1) 
    782871         ! - ML - The use of mask in this formaula enables the special treatment of the last w- point without indirect adressing 
     872!$OMP PARALLEL DO 
    783873         DO jk = 2, jpk 
    784874            pe3_out(:,:,jk) = e3vw_0(:,:,jk) + ( 1.0_wp - 0.5_wp * vmask(:,:,jk) ) * ( pe3_in(:,:,jk-1) - e3v_0(:,:,jk-1) )   & 
     
    857947               IF(lwp) write(numout,*) 'Compute scale factor from sshn' 
    858948               IF(lwp) write(numout,*) 'neuler is forced to 0' 
     949!$OMP PARALLEL DO 
    859950               DO jk=1,jpk 
    860951                  fse3t_n(:,:,jk) =  e3t_0(:,:,jk) * ( ht_0(:,:) + sshn(:,:) ) & 
Note: See TracChangeset for help on using the changeset viewer.