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/TOP_SRC/PISCES/P4Z/p4zsms.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/TOP_SRC/PISCES/P4Z/p4zsms.F90

    r7646 r7698  
    9999      IF( ( neuler == 0 .AND. kt == nittrc000 ) .OR. ln_top_euler ) THEN 
    100100         DO jn = jp_pcs0, jp_pcs1              !   SMS on tracer without Asselin time-filter 
    101             trb(:,:,:,jn) = trn(:,:,:,jn) 
     101!$OMP PARALLEL DO schedule(static) private(jk, jj, ji) 
     102            DO jk = 1, jpk 
     103               DO jj = 1, jpj 
     104                  DO ji = 1, jpi 
     105                     trb(ji,jj,jk,jn) = trn(ji,jj,jk,jn) 
     106                  END DO 
     107               END DO 
     108            END DO 
    102109         END DO 
    103110      ENDIF 
     
    125132         CALL p4z_flx( kt, jnt )   ! Compute surface fluxes 
    126133         ! 
    127          xnegtr(:,:,:) = 1.e0 
     134!$OMP PARALLEL 
     135!$OMP DO schedule(static) private(jk, jj, ji) 
     136         DO jk = 1, jpk 
     137            DO jj = 1, jpj 
     138               DO ji = 1, jpi 
     139                  xnegtr(ji,jj,jk) = 1.e0 
     140               END DO 
     141            END DO 
     142         END DO 
    128143         DO jn = jp_pcs0, jp_pcs1 
     144!$OMP DO schedule(static) private(jk, jj, ji, ztra) 
    129145            DO jk = 1, jpk 
    130146               DO jj = 1, jpj 
     
    141157         !                                !  
    142158         DO jn = jp_pcs0, jp_pcs1 
    143            trb(:,:,:,jn) = trb(:,:,:,jn) + xnegtr(:,:,:) * tra(:,:,:,jn) 
     159!$OMP DO schedule(static) private(jk, jj, ji) 
     160            DO jk = 1, jpk 
     161               DO jj = 1, jpj 
     162                  DO ji = 1, jpi 
     163                     trb(ji,jj,jk,jn) = trb(ji,jj,jk,jn) + xnegtr(ji,jj,jk) * tra(ji,jj,jk,jn) 
     164                  END DO 
     165               END DO 
     166            END DO 
    144167         END DO 
    145168        ! 
    146169         DO jn = jp_pcs0, jp_pcs1 
    147             tra(:,:,:,jn) = 0._wp 
    148          END DO 
     170!$OMP DO schedule(static) private(jk, jj, ji) 
     171            DO jk = 1, jpk 
     172               DO jj = 1, jpj 
     173                  DO ji = 1, jpi 
     174                     tra(ji,jj,jk,jn) = 0._wp 
     175                  END DO 
     176               END DO 
     177            END DO 
     178         END DO 
     179!$OMP END PARALLEL 
    149180         ! 
    150181         IF( ln_top_euler ) THEN 
    151182            DO jn = jp_pcs0, jp_pcs1 
    152                trn(:,:,:,jn) = trb(:,:,:,jn) 
     183!$OMP PARALLEL DO schedule(static) private(jk, jj, ji) 
     184               DO jk = 1, jpk 
     185                  DO jj = 1, jpj 
     186                     DO ji = 1, jpi 
     187                        trn(ji,jj,jk,jn) = trb(ji,jj,jk,jn) 
     188                     END DO 
     189                  END DO 
     190               END DO 
    153191            END DO 
    154192         ENDIF 
     
    349387      ! 
    350388      INTEGER, INTENT( in )  ::     kt ! time step 
     389      INTEGER ::   ji, jj, jk 
    351390      ! 
    352391      REAL(wp) ::  alkmean = 2426.     ! mean value of alkalinity ( Glodap ; for Goyet 2391. ) 
     
    357396      REAL(wp) :: zarea, zalksumn, zpo4sumn, zno3sumn, zsilsumn 
    358397      REAL(wp) :: zalksumb, zpo4sumb, zno3sumb, zsilsumb 
     398      REAL(wp), POINTER, DIMENSION(:,:,:) :: zctrn_jptal, zctrn_jppo4, zctrn_jppo3, zctrn_jpsil !workspace arrays 
     399      REAL(wp), POINTER, DIMENSION(:,:,:) :: zctrb_jptal, zctrb_jppo4, zctrb_jppo3, zctrb_jpsil !workspace arrays 
    359400      !!--------------------------------------------------------------------- 
    360401 
     
    366407      IF( cn_cfg == "orca" .AND. .NOT. lk_c1d ) THEN      ! ORCA configuration (not 1D) ! 
    367408         !                                                ! --------------------------- ! 
     409         CALL wrk_alloc( jpi, jpj, jpk, zctrn_jptal, zctrn_jppo4, zctrn_jppo3, zctrn_jpsil ) 
     410         CALL wrk_alloc( jpi, jpj, jpk, zctrb_jptal, zctrb_jppo4, zctrb_jppo3, zctrb_jpsil ) 
     411 
    368412         ! set total alkalinity, phosphate, nitrate & silicate 
    369413         zarea          = 1._wp / glob_sum( cvol(:,:,:) ) * 1e6               
    370414 
    371          zalksumn = glob_sum( trn(:,:,:,jptal) * cvol(:,:,:)  ) * zarea 
    372          zpo4sumn = glob_sum( trn(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea * po4r 
    373          zno3sumn = glob_sum( trn(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea * rno3 
    374          zsilsumn = glob_sum( trn(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea 
    375   
    376          IF(lwp) WRITE(numout,*) '       TALKN mean : ', zalksumn 
    377          trn(:,:,:,jptal) = trn(:,:,:,jptal) * alkmean / zalksumn 
    378  
    379          IF(lwp) WRITE(numout,*) '       PO4N  mean : ', zpo4sumn 
    380          trn(:,:,:,jppo4) = trn(:,:,:,jppo4) * po4mean / zpo4sumn 
    381  
    382          IF(lwp) WRITE(numout,*) '       NO3N  mean : ', zno3sumn 
    383          trn(:,:,:,jpno3) = trn(:,:,:,jpno3) * no3mean / zno3sumn 
    384  
    385          IF(lwp) WRITE(numout,*) '       SiO3N mean : ', zsilsumn 
    386          trn(:,:,:,jpsil) = MIN( 400.e-6,trn(:,:,:,jpsil) * silmean / zsilsumn ) 
     415!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     416         DO jk = 1, jpk 
     417            DO jj = 1, jpj 
     418               DO ji = 1, jpi 
     419                  zctrn_jptal(ji,jj,jk) = trn(ji,jj,jk,jptal) * cvol(ji,jj,jk) 
     420                  zctrn_jppo4(ji,jj,jk) = trn(ji,jj,jk,jppo4) * cvol(ji,jj,jk) 
     421                  zctrn_jppo3(ji,jj,jk) = trn(ji,jj,jk,jpno3) * cvol(ji,jj,jk) 
     422                  zctrn_jpsil(ji,jj,jk) = trn(ji,jj,jk,jpsil) * cvol(ji,jj,jk) 
     423               END DO 
     424            END DO 
     425         END DO 
     426 
     427         zalksumn = glob_sum( zctrn_jptal(:,:,:)  ) * zarea 
     428         zpo4sumn = glob_sum( zctrn_jppo4(:,:,:)  ) * zarea * po4r 
     429         zno3sumn = glob_sum( zctrn_jppo3(:,:,:)  ) * zarea * rno3 
     430         zsilsumn = glob_sum( zctrn_jpsil(:,:,:)  ) * zarea 
     431 
     432!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     433         DO jk = 1, jpk 
     434            DO jj = 1, jpj 
     435               DO ji = 1, jpi 
     436                  trn(ji,jj,jk,jpsil) = MIN( 400.e-6,trn(ji,jj,jk,jpsil) * silmean / zsilsumn ) 
     437                  trn(ji,jj,jk,jptal) = trn(ji,jj,jk,jptal) * alkmean / zalksumn 
     438                  trn(ji,jj,jk,jppo4) = trn(ji,jj,jk,jppo4) * po4mean / zpo4sumn 
     439                  trn(ji,jj,jk,jpno3) = trn(ji,jj,jk,jpno3) * no3mean / zno3sumn 
     440               END DO 
     441            END DO 
     442         END DO 
     443 
     444         IF(lwp) THEN 
     445                WRITE(numout,*) '       TALKN mean : ', zalksumn 
     446                WRITE(numout,*) '       PO4N  mean : ', zpo4sumn 
     447                WRITE(numout,*) '       NO3N  mean : ', zno3sumn 
     448                WRITE(numout,*) '       SiO3N mean : ', zsilsumn 
     449         END IF 
    387450         ! 
    388451         ! 
    389452         IF( .NOT. ln_top_euler ) THEN 
    390             zalksumb = glob_sum( trb(:,:,:,jptal) * cvol(:,:,:)  ) * zarea 
    391             zpo4sumb = glob_sum( trb(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea * po4r 
    392             zno3sumb = glob_sum( trb(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea * rno3 
    393             zsilsumb = glob_sum( trb(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea 
    394   
    395             IF(lwp) WRITE(numout,*) ' ' 
    396             IF(lwp) WRITE(numout,*) '       TALKB mean : ', zalksumb 
    397             trb(:,:,:,jptal) = trb(:,:,:,jptal) * alkmean / zalksumb 
    398  
    399             IF(lwp) WRITE(numout,*) '       PO4B  mean : ', zpo4sumb 
    400             trb(:,:,:,jppo4) = trb(:,:,:,jppo4) * po4mean / zpo4sumb 
    401  
    402             IF(lwp) WRITE(numout,*) '       NO3B  mean : ', zno3sumb 
    403             trb(:,:,:,jpno3) = trb(:,:,:,jpno3) * no3mean / zno3sumb 
    404  
    405             IF(lwp) WRITE(numout,*) '       SiO3B mean : ', zsilsumb 
    406             trb(:,:,:,jpsil) = MIN( 400.e-6,trb(:,:,:,jpsil) * silmean / zsilsumb ) 
     453!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     454            DO jk = 1, jpk 
     455               DO jj = 1, jpj 
     456                  DO ji = 1, jpi 
     457                     zctrb_jptal(ji,jj,jk) = trb(ji,jj,jk,jptal) * cvol(ji,jj,jk) 
     458                     zctrb_jppo4(ji,jj,jk) = trb(ji,jj,jk,jppo4) * cvol(ji,jj,jk) 
     459                     zctrb_jppo3(ji,jj,jk) = trb(ji,jj,jk,jpno3) * cvol(ji,jj,jk) 
     460                     zctrb_jpsil(ji,jj,jk) = trb(ji,jj,jk,jpsil) * cvol(ji,jj,jk) 
     461                  END DO 
     462               END DO 
     463            END DO 
     464 
     465            zalksumb = glob_sum( zctrb_jptal(:,:,:)  ) * zarea 
     466            zpo4sumb = glob_sum( zctrb_jppo4(:,:,:)  ) * zarea * po4r 
     467            zno3sumb = glob_sum( zctrb_jppo3(:,:,:)  ) * zarea * rno3 
     468            zsilsumb = glob_sum( zctrb_jpsil(:,:,:)  ) * zarea 
     469 
     470!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     471            DO jk = 1, jpk 
     472               DO jj = 1, jpj 
     473                  DO ji = 1, jpi 
     474                     trb(ji,jj,jk,jpsil) = MIN( 400.e-6,trb(ji,jj,jk,jpsil) * silmean / zsilsumb ) 
     475                     trb(ji,jj,jk,jptal) = trb(ji,jj,jk,jptal) * alkmean / zalksumb 
     476                     trb(ji,jj,jk,jppo4) = trb(ji,jj,jk,jppo4) * po4mean / zpo4sumb 
     477                     trb(ji,jj,jk,jpno3) = trb(ji,jj,jk,jpno3) * no3mean / zno3sumb 
     478                  END DO 
     479               END DO 
     480            END DO 
     481 
     482            IF(lwp) THEN 
     483                WRITE(numout,*) ' ' 
     484                WRITE(numout,*) '       TALKB mean : ', zalksumb 
     485                WRITE(numout,*) '       PO4B  mean : ', zpo4sumb 
     486                WRITE(numout,*) '       NO3B  mean : ', zno3sumb 
     487                WRITE(numout,*) '       SiO3B mean : ', zsilsumb 
     488            END IF 
    407489        ENDIF 
     490        ! 
     491        CALL wrk_dealloc( jpi, jpj, jpk, zctrb_jptal, zctrb_jppo4, zctrb_jppo3, zctrb_jpsil ) 
     492        CALL wrk_dealloc( jpi, jpj, jpk, zctrn_jptal, zctrn_jppo4, zctrn_jppo3, zctrn_jpsil ) 
    408493        ! 
    409494      ENDIF 
Note: See TracChangeset for help on using the changeset viewer.