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/SOL/solpcg.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/SOL/solpcg.F90

    r6486 r9176  
    9494      REAL(wp), DIMENSION(2) ::   zsum 
    9595      REAL(wp), POINTER, DIMENSION(:,:) ::   zgcr 
     96      REAL(wp),     DIMENSION(jpi, jpj) ::   tmp1, tmp2 
    9697      !!---------------------------------------------------------------------- 
    9798      ! 
     
    109110      ! gcr   = gcb-a.gcx 
    110111      ! gcdes = gcr 
     112!$OMP PARALLEL DO PRIVATE(zgcad) 
    111113      DO jj = 2, jpjm1 
    112114         DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    120122         END DO 
    121123      END DO 
     124!$OMP END PARALLEL DO  
    122125 
    123126      ! rnorme = (gcr,gcr) 
    124       rnorme = glob_sum(  gcr(:,:) * gcdmat(:,:) * gcr(:,:)  ) 
    125  
     127      tmp1 = 0. 
     128!$OMP PARALLEL DO  
     129      DO jj = 2, jpjm1 
     130         DO ji = fs_2, fs_jpim1   ! vector opt. 
     131            tmp1(ji, jj) = gcr(ji, jj) * gcdmat(ji, jj) * gcr(ji, jj) 
     132         END DO 
     133      END DO       
     134!$OMP END PARALLEL DO 
     135      rnorme = glob_sum(  tmp1(:,:)  ) 
    126136      CALL lbc_lnk( gcdes, c_solver_pt, 1. )   ! lateral boundary condition 
    127137 
    128138      ! gccd = matrix . gcdes 
     139      gccd = 0. 
     140!$OMP PARALLEL DO  
    129141      DO jj = 2, jpjm1 
    130142         DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    134146         END DO 
    135147      END DO  
    136  
     148!$OMP END PARALLEL DO 
    137149      ! alph = (gcr,gcr)/(gcdes,gccd) 
    138       radd = glob_sum(  gcdes(:,:) * gcdmat(:,:) * gccd(:,:)  ) 
     150!$OMP PARALLEL DO  
     151      DO jj = 1, jpj 
     152         DO ji = 1, jpi 
     153            tmp1(ji, jj) = gcdes(ji, jj) * gcdmat(ji, jj) * gccd(ji, jj) 
     154         END DO 
     155      END DO       
     156!$OMP END PARALLEL DO 
     157      radd = glob_sum(  tmp1  ) 
    139158      alph = rnorme /radd 
    140159 
    141160      ! gcx = gcx + alph * gcdes 
    142161      ! gcr = gcr - alph * gccd 
     162!$OMP PARALLEL DO 
    143163      DO jj = 2, jpjm1 
    144164         DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    147167         END DO 
    148168      END DO 
    149  
     169!$OMP END PARALLEL DO 
    150170      ! Algorithm wtih Eijkhout rearrangement 
    151171      ! ------------------------------------- 
     
    158178 
    159179         ! zgcr = matrix . gcr 
     180!$OMP PARALLEL DO 
    160181         DO jj = 2, jpjm1 
    161182            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    168189         ! rnorme = (gcr,gcr) 
    169190         rr = rnorme 
    170  
    171          ! zgcad = (zgcr,gcr)  
    172          zsum(1) = glob_sum(gcr(:,:) * gcdmat(:,:) * gcr(:,:)) 
    173          zsum(2) = glob_sum(gcr(:,:) * gcdmat(:,:) * zgcr(:,:) * bmask(:,:)) 
     191          
     192         ! zgcad = (zgcr,gcr) 
     193      tmp2 = 0. 
     194!$OMP PARALLEL 
     195!$OMP DO  
     196      DO jj = 1, jpj 
     197         DO ji = 1, jpi 
     198            tmp2(ji, jj) = gcr(ji, jj) * gcdmat(ji, jj) 
     199            tmp1(ji, jj) = tmp2(ji, jj) * gcr(ji, jj) 
     200         END DO 
     201      END DO       
     202!$OMP END DO 
     203!$OMP DO  
     204!DIR$ IVDEP 
     205      DO jj = 1, jpj 
     206!DIR$ IVDEP 
     207         DO ji = 1, jpi 
     208            tmp2(ji, jj) = tmp2(ji, jj) * zgcr(ji, jj) * bmask(ji, jj) 
     209         END DO 
     210      END DO       
     211!$OMP END DO 
     212!$OMP END PARALLEL 
     213  
     214!        zsum(1) = glob_sum(gcr(:,:) * gcdmat(:,:) * gcr(:,:)) 
     215!        zsum(2) = glob_sum(gcr(:,:) * gcdmat(:,:) * zgcr(:,:) * bmask(:,:)) 
     216         zsum = glob_asum_2d(tmp1, tmp2) 
    174217 
    175218         !!RB we should gather the 2 glob_sum 
     
    190233         ! gcx = gcx + alph * gcdes 
    191234         ! gcr = gcr - alph * gccd 
     235!$OMP PARALLEL DO 
    192236         DO jj = 2, jpjm1 
    193237            DO ji = fs_2, fs_jpim1   ! vector opt. 
Note: See TracChangeset for help on using the changeset viewer.