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/p4zsed.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/p4zsed.F90

    r7646 r7698  
    3232   !!---------------------------------------------------------------------- 
    3333   !! NEMO/TOP 3.3 , NEMO Consortium (2010) 
    34    !! $Id$  
     34   !! $Id$ 
    3535   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    3636   !!---------------------------------------------------------------------- 
     
    8484 
    8585 
    86       zdenit2d(:,:) = 0.e0 
    87       zbureff (:,:) = 0.e0 
    88       zwork1  (:,:) = 0.e0 
    89       zwork2  (:,:) = 0.e0 
    90       zwork3  (:,:) = 0.e0 
    91       zsedsi  (:,:) = 0.e0 
    92       zsedcal (:,:) = 0.e0 
    93       zsedc   (:,:) = 0.e0 
    94  
     86!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     87      DO jj = 1, jpj 
     88         DO ji = 1, jpi 
     89            zdenit2d(ji,jj) = 0.e0 
     90            zbureff (ji,jj) = 0.e0 
     91            zwork1  (ji,jj) = 0.e0 
     92            zwork2  (ji,jj) = 0.e0 
     93            zwork3  (ji,jj) = 0.e0 
     94            zsedsi  (ji,jj) = 0.e0 
     95            zsedcal (ji,jj) = 0.e0 
     96            zsedc   (ji,jj) = 0.e0 
     97         END DO 
     98      END DO 
    9599 
    96100      ! Iron input/uptake due to sea ice : Crude parameterization based on Lancelot et al. 
     
    100104         CALL wrk_alloc( jpi, jpj, zironice ) 
    101105         !                                               
     106!$OMP PARALLEL  
     107!$OMP DO schedule(static) private(jj,ji,zdep,zwflux,zfminus,zfplus) 
    102108         DO jj = 1, jpj 
    103109            DO ji = 1, jpi 
     
    110116         END DO 
    111117         ! 
    112          tra(:,:,1,jpfer) = tra(:,:,1,jpfer) + zironice(:,:)  
     118!$OMP DO schedule(static) private(jj,ji) 
     119      DO jj = 1, jpj 
     120         DO ji = 1, jpi 
     121            tra(ji,jj,1,jpfer) = tra(ji,jj,1,jpfer) + zironice(ji,jj) 
     122         END DO 
     123      END DO 
     124!$OMP END PARALLEL 
    113125         !  
    114126         IF( lk_iomput .AND. knt == nrdttrc .AND. iom_use( "Ironice" ) )   & 
     
    127139         !                                              ! Iron and Si deposition at the surface 
    128140         IF( ln_solub ) THEN 
    129             zirondep(:,:,1) = solub(:,:) * dust(:,:) * mfrac * rfact2 / e3t_n(:,:,1) / 55.85 + 3.e-10 * r1_ryyss  
     141!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     142           DO jj = 1, jpj 
     143              DO ji = 1, jpi 
     144                 zirondep(ji,jj,1) = solub(ji,jj) * dust(ji,jj) * mfrac * rfact2 / e3t_n(ji,jj,1) / 55.85 + 3.e-10 * r1_ryyss 
     145              END DO 
     146           END DO 
    130147         ELSE 
    131             zirondep(:,:,1) = dustsolub  * dust(:,:) * mfrac * rfact2 / e3t_n(:,:,1) / 55.85 + 3.e-10 * r1_ryyss  
     148!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     149           DO jj = 1, jpj 
     150              DO ji = 1, jpi 
     151                 zirondep(ji,jj,1) = dustsolub  * dust(ji,jj) * mfrac * rfact2 / e3t_n(ji,jj,1) / 55.85 + 3.e-10 * r1_ryyss 
     152              END DO 
     153           END DO 
    132154         ENDIF 
    133          zsidep(:,:)   = 8.8 * 0.075 * dust(:,:) * mfrac * rfact2 / e3t_n(:,:,1) / 28.1  
    134          zpdep (:,:,1) = 0.1 * 0.021 * dust(:,:) * mfrac * rfact2 / e3t_n(:,:,1) / 31. / po4r  
     155!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     156         DO jj = 1, jpj 
     157            DO ji = 1, jpi 
     158               zsidep(ji,jj) = 8.8 * 0.075 * dust(ji,jj) * mfrac * rfact2 / e3t_n(ji,jj,1) / 28.1 
     159               zpdep (ji,jj,1) = 0.1 * 0.021 * dust(ji,jj) * mfrac * rfact2 / e3t_n(ji,jj,1) / 31. / po4r 
     160            END DO 
     161         END DO 
    135162         !                                              ! Iron solubilization of particles in the water column 
    136163         !                                              ! dust in kg/m2/s ---> 1/55.85 to put in mol/Fe ;  wdust in m/j 
    137164         zwdust = 0.03 * rday / ( wdust * 55.85 ) / ( 270. * rday ) 
     165!$OMP PARALLEL  
     166!$OMP DO schedule(static) private(jk,jj,ji) 
    138167         DO jk = 2, jpkm1 
    139             zirondep(:,:,jk) = dust(:,:) * mfrac * zwdust * rfact2 * EXP( -gdept_n(:,:,jk) / 540. ) 
    140             zpdep   (:,:,jk) = zirondep(:,:,jk) * 0.023 
     168            DO jj = 1, jpj 
     169               DO ji = 1, jpi 
     170                  zirondep(ji,jj,jk) = dust(ji,jj) * mfrac * zwdust * rfact2 * EXP( -gdept_n(ji,jj,jk) / 540. ) 
     171                  zpdep   (ji,jj,jk) = zirondep(ji,jj,jk) * 0.023 
     172               END DO 
     173            END DO 
    141174         END DO 
    142175         !                                              ! Iron solubilization of particles in the water column 
    143          tra(:,:,1,jpsil) = tra(:,:,1,jpsil) + zsidep  (:,:) 
    144          tra(:,:,:,jppo4) = tra(:,:,:,jppo4) + zpdep   (:,:,:) 
    145          tra(:,:,:,jpfer) = tra(:,:,:,jpfer) + zirondep(:,:,:)  
     176!$OMP DO schedule(static) private(jj,ji) 
     177         DO jj = 1, jpj 
     178            DO ji = 1, jpi 
     179               tra(ji,jj,1,jpsil) = tra(ji,jj,1,jpsil) + zsidep  (ji,jj) 
     180            END DO 
     181         END DO 
     182!$OMP DO schedule(static) private(jk,jj,ji) 
     183         DO jk = 1, jpk 
     184            DO jj = 1, jpj 
     185               DO ji = 1, jpi 
     186                  tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zpdep   (ji,jj,jk) 
     187                  tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zirondep(ji,jj,jk) 
     188               END DO 
     189            END DO 
     190         END DO 
     191!$OMP END PARALLEL  
    146192         !  
    147193         IF( lk_iomput ) THEN 
     
    161207      ! ---------------------------------------------------------- 
    162208      IF( ln_river ) THEN 
     209!$OMP PARALLEL DO schedule(static) private(jj,ji,jk) 
    163210         DO jj = 1, jpj 
    164211            DO ji = 1, jpi 
     
    174221         ENDDO 
    175222         IF( ln_p5z ) THEN 
     223!$OMP PARALLEL DO schedule(static) private(jj,ji,jk) 
    176224            DO jj = 1, jpj 
    177225               DO ji = 1, jpi 
     
    189237      ! ---------------------------------------------------------- 
    190238      IF( ln_ndepo ) THEN 
    191          tra(:,:,1,jpno3) = tra(:,:,1,jpno3) + nitdep(:,:) * rfact2 
    192          tra(:,:,1,jptal) = tra(:,:,1,jptal) - rno3 * nitdep(:,:) * rfact2 
     239!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     240         DO jj = 1, jpj 
     241            DO ji = 1, jpi 
     242               tra(ji,jj,1,jpno3) = tra(ji,jj,1,jpno3) + nitdep(ji,jj) * rfact2 
     243               tra(ji,jj,1,jptal) = tra(ji,jj,1,jptal) - rno3 * nitdep(ji,jj) * rfact2 
     244            ENDDO 
     245         ENDDO 
    193246      ENDIF 
    194247 
     
    196249      ! ------------------------------------------------------ 
    197250      IF( ln_ironsed ) THEN 
    198                          tra(:,:,:,jpfer) = tra(:,:,:,jpfer) + ironsed(:,:,:) * rfact2 
    199          IF( ln_ligand ) tra(:,:,:,jpfep) = tra(:,:,:,jpfep) + ( ironsed(:,:,:) * fep_rats ) * rfact2 
     251!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     252         DO jk = 1, jpk 
     253            DO jj = 1, jpj 
     254               DO ji = 1, jpi 
     255                  tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + ironsed(ji,jj,jk) * rfact2 
     256               END DO 
     257            END DO 
     258         END DO 
     259 
     260         IF( ln_ligand ) THEN 
     261!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     262            DO jk = 1, jpk 
     263               DO jj = 1, jpj 
     264                  DO ji = 1, jpi 
     265                     tra(ji,jj,jk,jpfep) = tra(ji,jj,jk,jpfep) + ( ironsed(ji,jj,jk) * fep_rats ) * rfact2 
     266                  END DO 
     267               END DO 
     268            END DO 
     269         END IF 
    200270         ! 
    201271         IF( lk_iomput .AND. knt == nrdttrc .AND. iom_use( "Ironsed" ) )   & 
     
    206276      ! ------------------------------------------------------ 
    207277      IF( ln_hydrofe ) THEN 
    208             tra(:,:,:,jpfer) = tra(:,:,:,jpfer) + hydrofe(:,:,:) * rfact2 
     278!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     279         DO jk = 1, jpk 
     280            DO jj = 1, jpj 
     281               DO ji = 1, jpi 
     282                  tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + hydrofe(ji,jj,jk) * rfact2 
     283               END DO 
     284            END DO 
     285         END DO 
    209286         IF( ln_ligand ) THEN 
    210             tra(:,:,:,jpfep) = tra(:,:,:,jpfep) + ( hydrofe(:,:,:) * fep_rath ) * rfact2 
    211             tra(:,:,:,jplgw) = tra(:,:,:,jplgw) + ( hydrofe(:,:,:) * lgw_rath ) * rfact2 
     287!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
     288            DO jk = 1, jpk 
     289               DO jj = 1, jpj 
     290                  DO ji = 1, jpi 
     291                     tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + ( hydrofe(ji,jj,jk) * fep_rath ) * rfact2 
     292                     tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + ( hydrofe(ji,jj,jk) * lgw_rath ) * rfact2 
     293                  END DO 
     294               END DO 
     295            END DO 
    212296         ENDIF 
    213297         ! 
     
    218302      ! OA: Warning, the following part is necessary to avoid CFL problems above the sediments 
    219303      ! -------------------------------------------------------------------- 
     304!$OMP PARALLEL DO schedule(static) private(jj,ji,ikt,zdep) 
    220305      DO jj = 1, jpj 
    221306         DO ji = 1, jpi 
     
    229314      ! 
    230315      IF( ln_ligand ) THEN 
     316!$OMP PARALLEL DO schedule(static) private(jj,ji,ikt,zdep) 
    231317         DO jj = 1, jpj 
    232318            DO ji = 1, jpi 
     
    242328         ! Computation of the fraction of organic matter that is permanently buried from Dunne's model 
    243329         ! ------------------------------------------------------- 
     330!$OMP PARALLEL 
     331!$OMP DO schedule(static) private(jj,ji,ikt,zflx,zo2,zno3,zdep) 
    244332         DO jj = 1, jpj 
    245333            DO ji = 1, jpi 
     
    267355           ! The factor for calcite comes from the alkalinity effect 
    268356           ! ------------------------------------------------------------- 
     357!$OMP DO schedule(static) private(jj,ji,ikt,zfactcal) 
    269358           DO jj = 1, jpj 
    270359              DO ji = 1, jpi 
     
    280369            END DO 
    281370         END DO 
     371!$OMP END PARALLEL 
    282372         zsumsedsi  = glob_sum( zwork1(:,:) * e1e2t(:,:) ) * r1_rday 
    283373         zsumsedpo4 = glob_sum( zwork2(:,:) * e1e2t(:,:) ) * r1_rday 
     
    291381      IF( .NOT.lk_sed )  zrivsil =  1._wp - ( sumdepsi + rivdsiinput * r1_ryyss ) / ( zsumsedsi + rtrn ) 
    292382 
     383!$OMP PARALLEL DO schedule(static) private(jj,ji,ikt,zdep,zwsc,zsiloss,zcaloss)  
    293384      DO jj = 1, jpj 
    294385         DO ji = 1, jpi 
     
    305396      ! 
    306397      IF( .NOT.lk_sed ) THEN 
     398!$OMP PARALLEL DO schedule(static) private(jj,ji,ikt,zdep,zwsc,zsiloss,zcaloss,zfactcal,zrivalk) 
    307399         DO jj = 1, jpj 
    308400            DO ji = 1, jpi 
     
    325417      ENDIF 
    326418      ! 
     419!$OMP PARALLEL DO schedule(static) private(jj,ji,ikt,zdep,zws3,zws4) 
    327420      DO jj = 1, jpj 
    328421         DO ji = 1, jpi 
     
    339432      ! 
    340433      IF( ln_ligand ) THEN 
     434!$OMP PARALLEL DO schedule(static) private(jj,ji,ikt,zdep,zwssfep) 
    341435         DO jj = 1, jpj 
    342436            DO ji = 1, jpi 
     
    350444      ! 
    351445      IF( ln_p5z ) THEN 
     446!$OMP PARALLEL DO schedule(static) private(jj,ji,ikt,zdep,zws3,zws4) 
    352447         DO jj = 1, jpj 
    353448            DO ji = 1, jpi 
     
    367462         ! The 0.5 factor in zpdenit and zdenitt is to avoid negative NO3 concentration after both denitrification 
    368463         ! in the sediments and just above the sediments. Not very clever, but simpliest option. 
     464!$OMP PARALLEL DO schedule(static) private(jj,ji,ikt,zdep,zws3,zws4,zrivno3,zwstpoc,zpdenit,z1pdenit,zolimit,zdenitt,zwstpop,zwstpon) 
    369465         DO jj = 1, jpj 
    370466            DO ji = 1, jpi 
     
    402498      ! Small source iron from particulate inorganic iron 
    403499      !----------------------------------- 
     500!$OMP PARALLEL DO schedule(static) private(jk,jj,ji) 
    404501      DO jk = 1, jpkm1 
    405          zlight (:,:,jk) =  ( 1.- EXP( -etot_ndcy(:,:,jk) / diazolight ) ) * ( 1. - fr_i(:,:) )  
    406          zsoufer(:,:,jk) = zlight(:,:,jk) * 2E-11 / ( 2E-11 + biron(:,:,jk) ) 
     502         DO jj = 1, jpj 
     503            DO ji = 1, jpi 
     504               zlight (ji,jj,jk) =  ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) )  
     505               zsoufer(ji,jj,jk) = zlight(ji,jj,jk) * 2E-11 / ( 2E-11 + biron(ji,jj,jk) ) 
     506           END DO 
     507         END DO 
    407508      ENDDO 
    408509      IF( ln_p4z ) THEN 
     510!$OMP PARALLEL DO schedule(static) private(jk,jj,ji,zlim,zfact,ztrfer,ztrpo4s) 
    409511         DO jk = 1, jpkm1 
    410512            DO jj = 1, jpj 
     
    423525         END DO 
    424526      ELSE       ! p5z 
     527!$OMP PARALLEL DO schedule(static) private(jk,jj,ji,ztemp,zmudia,xdianh4,xdiano3,zlim,zfact,ztrfer,ztrdp) 
    425528         DO jk = 1, jpkm1 
    426529            DO jj = 1, jpj 
     
    448551      ! ---------------------------------------- 
    449552      IF( ln_p4z ) THEN 
     553!$OMP PARALLEL DO schedule(static) private(jk,jj,ji,zfact) 
    450554         DO jk = 1, jpkm1 
    451555            DO jj = 1, jpj 
     
    462566         END DO 
    463567      ELSE    ! p5z 
     568!$OMP PARALLEL DO schedule(static) private(jk,jj,ji,zfact) 
    464569         DO jk = 1, jpkm1 
    465570            DO jj = 1, jpj 
     
    497602            IF( iom_use("Nfix"   ) ) CALL iom_put( "Nfix", nitrpot(:,:,:) * nitrfix * zfact * tmask(:,:,:) )  ! nitrogen fixation  
    498603            IF( iom_use("INTNFIX") ) THEN   ! nitrogen fixation rate in ocean ( vertically integrated ) 
    499                zwork1(:,:) = 0. 
     604!$OMP PARALLEL 
     605!$OMP DO schedule(static) private(jj,ji)  
     606               DO jj = 1, jpj 
     607                  DO ji = 1, jpi 
     608                     zwork1(ji,jj) = 0. 
     609                  END DO 
     610               ENDDO 
    500611               DO jk = 1, jpkm1 
    501                  zwork1(:,:) = zwork1(:,:) + nitrpot(:,:,jk) * nitrfix * zfact * e3t_n(:,:,jk) * tmask(:,:,jk) 
     612!$OMP DO schedule(static) private(jj,ji)  
     613                  DO jj = 1, jpj 
     614                     DO ji = 1, jpi 
     615                        zwork1(ji,jj) = zwork1(ji,jj) + nitrpot(ji,jj,jk) * nitrfix * zfact * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 
     616                     END DO 
     617                  END DO 
    502618               ENDDO 
     619!$OMP END PARALLEL 
    503620               CALL iom_put( "INTNFIX" , zwork1 )  
    504621            ENDIF 
Note: See TracChangeset for help on using the changeset viewer.