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/LIM_SRC_3/limistate.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/LIM_SRC_3/limistate.F90

    r7646 r7698  
    8686      REAL(wp), POINTER, DIMENSION(:,:)   :: zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini !data from namelist or nc file 
    8787      REAL(wp), POINTER, DIMENSION(:,:,:) :: zh_i_ini, za_i_ini                         !data by cattegories to fill 
    88       INTEGER , POINTER, DIMENSION(:)     :: itest 
     88      INTEGER , DIMENSION(4)     :: itest 
    8989      !-------------------------------------------------------------------- 
    9090 
     
    9292      CALL wrk_alloc( jpi, jpj,      zht_i_ini, zat_i_ini, zvt_i_ini, zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
    9393      CALL wrk_alloc( jpi, jpj,      zswitch ) 
    94       Call wrk_alloc( 4,             itest ) 
    9594 
    9695      IF(lwp) WRITE(numout,*) 
     
    106105      ! init surface temperature 
    107106      DO jl = 1, jpl 
    108          t_su  (:,:,jl) = rt0 * tmask(:,:,1) 
    109          tn_ice(:,:,jl) = rt0 * tmask(:,:,1) 
     107!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     108         DO jj = 1, jpj 
     109            DO ji = 1, jpi 
     110               t_su  (ji,jj,jl) = rt0 * tmask(ji,jj,1) 
     111               tn_ice(ji,jj,jl) = rt0 * tmask(ji,jj,1) 
     112            END DO 
     113         END DO 
    110114      END DO 
    111115 
    112116      ! init basal temperature (considered at freezing point) 
    113117      CALL eos_fzp( sss_m(:,:), t_bo(:,:) ) 
    114       t_bo(:,:) = ( t_bo(:,:) + rt0 ) * tmask(:,:,1)  
     118!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     119      DO jj = 1, jpj 
     120         DO ji = 1, jpi 
     121            t_bo(ji,jj) = ( t_bo(ji,jj) + rt0 ) * tmask(ji,jj,1)  
     122         END DO 
     123      END DO 
    115124 
    116125 
     
    122131         IF( ln_limini_file )THEN 
    123132         ! 
    124             zht_i_ini(:,:)  = si(jp_hti)%fnow(:,:,1) 
    125             zht_s_ini(:,:)  = si(jp_hts)%fnow(:,:,1) 
    126             zat_i_ini(:,:)  = si(jp_ati)%fnow(:,:,1) 
    127             zts_u_ini(:,:)  = si(jp_tsu)%fnow(:,:,1) 
    128             ztm_i_ini(:,:)  = si(jp_tmi)%fnow(:,:,1) 
    129             zsm_i_ini(:,:)  = si(jp_smi)%fnow(:,:,1) 
    130             ! 
    131             WHERE( zat_i_ini(:,:) > 0._wp ) ; zswitch(:,:) = tmask(:,:,1)  
    132             ELSEWHERE                       ; zswitch(:,:) = 0._wp 
    133             END WHERE 
    134             ! 
     133!$OMP PARALLEL DO schedule(static) private(jj,ji) 
     134            DO jj = 1, jpj 
     135               DO ji = 1, jpi 
     136                  zht_i_ini(ji,jj)  = si(jp_hti)%fnow(ji,jj,1) 
     137                  zht_s_ini(ji,jj)  = si(jp_hts)%fnow(ji,jj,1) 
     138                  zat_i_ini(ji,jj)  = si(jp_ati)%fnow(ji,jj,1) 
     139                  zts_u_ini(ji,jj)  = si(jp_tsu)%fnow(ji,jj,1) 
     140                  ztm_i_ini(ji,jj)  = si(jp_tmi)%fnow(ji,jj,1) 
     141                  zsm_i_ini(ji,jj)  = si(jp_smi)%fnow(ji,jj,1) 
     142                  ! 
     143                  IF  ( zat_i_ini(ji,jj) > 0._wp ) THEN ; zswitch(ji,jj) = tmask(ji,jj,1)  
     144                  ELSE                                ; zswitch(ji,jj) = 0._wp 
     145                  END IF 
     146               END DO 
     147            END DO 
     148         ! 
    135149         ELSE ! ln_limini_file = F 
    136150 
     
    139153            !-------------------------------------------------------------------- 
    140154            ! no ice if sst <= t-freez + ttest 
    141             WHERE( ( sst_m(:,:) - (t_bo(:,:) - rt0) ) * tmask(:,:,1) >= rn_thres_sst ) ; zswitch(:,:) = 0._wp  
    142             ELSEWHERE                                                                  ; zswitch(:,:) = tmask(:,:,1) 
    143             END WHERE 
     155!$OMP PARALLEL 
     156!$OMP DO schedule(static) private(jj,ji) 
     157            DO jj = 1, jpj 
     158               DO ji = 1, jpi 
     159                  IF ( ( sst_m(ji,jj) - (t_bo(ji,jj) - rt0) ) * tmask(ji,jj,1) >= rn_thres_sst ) THEN 
     160                     zswitch(ji,jj) = 0._wp  
     161                  ELSE 
     162                     zswitch(ji,jj) = tmask(ji,jj,1) 
     163                  END IF 
     164               END DO 
     165            END DO 
    144166 
    145167            !----------------------------- 
     
    147169            !----------------------------- 
    148170            ! assign initial thickness, concentration, snow depth and salinity to an hemisphere-dependent array 
     171!$OMP DO schedule(static) private(jj,ji) 
    149172            DO jj = 1, jpj 
    150173               DO ji = 1, jpi 
     
    166189               END DO 
    167190            END DO 
     191!$OMP END PARALLEL 
    168192            ! 
    169193         ENDIF ! ln_limini_file 
    170194          
    171          zvt_i_ini(:,:) = zht_i_ini(:,:) * zat_i_ini(:,:)   ! ice volume 
     195!$OMP PARALLEL 
     196!$OMP DO schedule(static) private(jj,ji) 
     197         DO jj = 1, jpj 
     198            DO ji = 1, jpi 
     199               zvt_i_ini(ji,jj) = zht_i_ini(ji,jj) * zat_i_ini(ji,jj)   ! ice volume 
     200            END DO 
     201         END DO 
    172202         !--------------------------------------------------------------------- 
    173203         ! 3.2) Distribute ice concentration and thickness into the categories 
     
    176206         ! then we check whether the distribution fullfills 
    177207         ! volume and area conservation, positivity and ice categories bounds 
    178          zh_i_ini(:,:,:) = 0._wp  
    179          za_i_ini(:,:,:) = 0._wp 
     208         DO jl = 1, jpl 
     209!$OMP DO schedule(static) private(jj,ji) 
     210            DO jj = 1, jpj 
     211               DO ji = 1, jpi 
     212                  zh_i_ini(ji,jj,jl) = 0._wp  
     213                  za_i_ini(ji,jj,jl) = 0._wp 
     214               END DO 
     215            END DO 
     216         END DO 
    180217         ! 
     218!$OMP DO schedule(static) private(jj,ji,jl0,jl,i_fill,zarg,zV,zdv,zconv,itest) 
    181219         DO jj = 1, jpj 
    182220            DO ji = 1, jpi 
     
    289327            END DO    
    290328         END DO    
     329!$OMP END PARALLEL 
    291330 
    292331         !--------------------------------------------------------------------- 
     
    296335         ! Ice concentration, thickness and volume, ice salinity, ice age, surface temperature 
    297336         DO jl = 1, jpl ! loop over categories 
     337!$OMP PARALLEL DO schedule(static) private(jj,ji) 
    298338            DO jj = 1, jpj 
    299339               DO ji = 1, jpi 
     
    333373         ENDIF 
    334374             
     375!$OMP PARALLEL 
    335376         ! Snow temperature and heat content 
    336377         DO jk = 1, nlay_s 
    337378            DO jl = 1, jpl ! loop over categories 
     379!$OMP DO schedule(static) private(jj,ji) 
    338380               DO jj = 1, jpj 
    339381                  DO ji = 1, jpi 
     
    352394         DO jk = 1, nlay_i 
    353395            DO jl = 1, jpl ! loop over categories 
     396!$OMP DO schedule(static) private(jj,ji) 
    354397               DO jj = 1, jpj 
    355398                  DO ji = 1, jpi 
     
    370413         END DO 
    371414 
    372          tn_ice (:,:,:) = t_su (:,:,:) 
     415         DO jl = 1, jpl 
     416!$OMP DO schedule(static) private(jj,ji) 
     417            DO jj = 1, jpj 
     418               DO ji = 1, jpi 
     419                  tn_ice (ji,jj,jl) = t_su (ji,jj,jl) 
     420               END DO 
     421            END DO 
     422         END DO 
     423!$OMP END PARALLEL 
    373424 
    374425      ELSE ! if ln_limini=false 
    375          a_i  (:,:,:) = 0._wp 
    376          v_i  (:,:,:) = 0._wp 
    377          v_s  (:,:,:) = 0._wp 
    378          smv_i(:,:,:) = 0._wp 
    379          oa_i (:,:,:) = 0._wp 
    380          ht_i (:,:,:) = 0._wp 
    381          ht_s (:,:,:) = 0._wp 
    382          sm_i (:,:,:) = 0._wp 
    383          o_i  (:,:,:) = 0._wp 
    384  
    385          e_i(:,:,:,:) = 0._wp 
    386          e_s(:,:,:,:) = 0._wp 
     426!$OMP PARALLEL 
     427         DO jl = 1, jpl 
     428!$OMP DO schedule(static) private(jj,ji) 
     429            DO jj = 1, jpj 
     430               DO ji = 1, jpi 
     431                  a_i  (ji,jj,jl) = 0._wp 
     432                  v_i  (ji,jj,jl) = 0._wp 
     433                  v_s  (ji,jj,jl) = 0._wp 
     434                  smv_i(ji,jj,jl) = 0._wp 
     435                  oa_i (ji,jj,jl) = 0._wp 
     436                  ht_i (ji,jj,jl) = 0._wp 
     437                  ht_s (ji,jj,jl) = 0._wp 
     438                  sm_i (ji,jj,jl) = 0._wp 
     439                  o_i  (ji,jj,jl) = 0._wp 
     440               END DO 
     441            END DO 
     442         END DO 
     443 
     444         DO jk = 1, nlay_i 
     445            DO jl = 1, jpl 
     446!$OMP DO schedule(static) private(jj,ji) 
     447               DO jj = 1, jpj 
     448                  DO ji = 1, jpi 
     449                     e_i(ji,jj,jl,jk) = 0._wp 
     450                  END DO 
     451               END DO 
     452            END DO 
     453         END DO 
     454         DO jk = 1, nlay_s 
     455            DO jl = 1, jpl 
     456!$OMP DO schedule(static) private(jj,ji) 
     457               DO jj = 1, jpj 
     458                  DO ji = 1, jpi 
     459                     e_s(ji,jj,jl,jk) = 0._wp 
     460                  END DO 
     461               END DO 
     462            END DO 
     463         END DO 
    387464 
    388465         DO jl = 1, jpl 
    389466            DO jk = 1, nlay_i 
    390                t_i(:,:,jk,jl) = rt0 * tmask(:,:,1) 
     467!$OMP DO schedule(static) private(jj,ji) 
     468               DO jj = 1, jpj 
     469                  DO ji = 1, jpi 
     470                     t_i(ji,jj,jk,jl) = rt0 * tmask(ji,jj,1) 
     471                  END DO 
     472               END DO 
    391473            END DO 
    392474            DO jk = 1, nlay_s 
    393                t_s(:,:,jk,jl) = rt0 * tmask(:,:,1) 
    394             END DO 
    395          END DO 
     475!$OMP DO schedule(static) private(jj,ji) 
     476               DO jj = 1, jpj 
     477                  DO ji = 1, jpi 
     478                     t_s(ji,jj,jk,jl) = rt0 * tmask(ji,jj,1) 
     479                  END DO 
     480               END DO 
     481            END DO 
     482         END DO 
     483!$OMP END PARALLEL 
    396484 
    397485      ENDIF ! ln_limini 
    398486       
    399       at_i (:,:) = 0.0_wp 
     487!$OMP PARALLEL 
     488!$OMP DO schedule(static) private(jj,ji) 
     489      DO jj = 1, jpj 
     490         DO ji = 1, jpi 
     491            at_i (ji,jj) = 0.0_wp 
     492         END DO 
     493      END DO 
    400494      DO jl = 1, jpl 
    401          at_i (:,:) = at_i (:,:) + a_i (:,:,jl) 
     495!$OMP DO schedule(static) private(jj,ji) 
     496         DO jj = 1, jpj 
     497            DO ji = 1, jpi 
     498               at_i (ji,jj) = at_i (ji,jj) + a_i (ji,jj,jl) 
     499            END DO 
     500         END DO 
    402501      END DO 
    403502      ! 
    404       !-------------------------------------------------------------------- 
    405       ! 4) Global ice variables for output diagnostics                    |  
    406       !-------------------------------------------------------------------- 
    407       u_ice (:,:)     = 0._wp 
    408       v_ice (:,:)     = 0._wp 
    409       stress1_i(:,:)  = 0._wp 
    410       stress2_i(:,:)  = 0._wp 
    411       stress12_i(:,:) = 0._wp 
    412  
    413       !-------------------------------------------------------------------- 
    414       ! 5) Moments for advection 
    415       !-------------------------------------------------------------------- 
    416  
    417       sxopw (:,:) = 0._wp  
    418       syopw (:,:) = 0._wp  
    419       sxxopw(:,:) = 0._wp  
    420       syyopw(:,:) = 0._wp  
    421       sxyopw(:,:) = 0._wp 
    422  
    423       sxice (:,:,:)  = 0._wp   ;   sxsn (:,:,:)  = 0._wp   ;   sxa  (:,:,:)  = 0._wp 
    424       syice (:,:,:)  = 0._wp   ;   sysn (:,:,:)  = 0._wp   ;   sya  (:,:,:)  = 0._wp 
    425       sxxice(:,:,:)  = 0._wp   ;   sxxsn(:,:,:)  = 0._wp   ;   sxxa (:,:,:)  = 0._wp 
    426       syyice(:,:,:)  = 0._wp   ;   syysn(:,:,:)  = 0._wp   ;   syya (:,:,:)  = 0._wp 
    427       sxyice(:,:,:)  = 0._wp   ;   sxysn(:,:,:)  = 0._wp   ;   sxya (:,:,:)  = 0._wp 
    428  
    429       sxc0  (:,:,:)  = 0._wp   ;   sxe  (:,:,:,:)= 0._wp    
    430       syc0  (:,:,:)  = 0._wp   ;   sye  (:,:,:,:)= 0._wp    
    431       sxxc0 (:,:,:)  = 0._wp   ;   sxxe (:,:,:,:)= 0._wp    
    432       syyc0 (:,:,:)  = 0._wp   ;   syye (:,:,:,:)= 0._wp    
    433       sxyc0 (:,:,:)  = 0._wp   ;   sxye (:,:,:,:)= 0._wp    
    434  
    435       sxsal  (:,:,:)  = 0._wp 
    436       sysal  (:,:,:)  = 0._wp 
    437       sxxsal (:,:,:)  = 0._wp 
    438       syysal (:,:,:)  = 0._wp 
    439       sxysal (:,:,:)  = 0._wp 
    440  
    441       sxage  (:,:,:)  = 0._wp 
    442       syage  (:,:,:)  = 0._wp 
    443       sxxage (:,:,:)  = 0._wp 
    444       syyage (:,:,:)  = 0._wp 
    445       sxyage (:,:,:)  = 0._wp 
     503!$OMP DO schedule(static) private(jj,ji) 
     504      DO jj = 1, jpj 
     505         DO ji = 1, jpi 
     506            !-------------------------------------------------------------------- 
     507            ! 4) Global ice variables for output diagnostics                    |  
     508            !-------------------------------------------------------------------- 
     509            u_ice (ji,jj)     = 0._wp 
     510            v_ice (ji,jj)     = 0._wp 
     511            stress1_i(ji,jj)  = 0._wp 
     512            stress2_i(ji,jj)  = 0._wp 
     513            stress12_i(ji,jj) = 0._wp 
     514 
     515            !-------------------------------------------------------------------- 
     516            ! 5) Moments for advection 
     517            !-------------------------------------------------------------------- 
     518 
     519            sxopw (ji,jj) = 0._wp  
     520            syopw (ji,jj) = 0._wp  
     521            sxxopw(ji,jj) = 0._wp  
     522            syyopw(ji,jj) = 0._wp  
     523            sxyopw(ji,jj) = 0._wp 
     524         END DO 
     525      END DO 
     526 
     527      DO jl = 1, jpl 
     528!$OMP DO schedule(static) private(jj,ji) 
     529         DO jj = 1, jpj 
     530            DO ji = 1, jpi 
     531               sxice (ji,jj,jl)  = 0._wp   ;   sxsn (ji,jj,jl)  = 0._wp   ;   sxa  (ji,jj,jl)  = 0._wp 
     532               syice (ji,jj,jl)  = 0._wp   ;   sysn (ji,jj,jl)  = 0._wp   ;   sya  (ji,jj,jl)  = 0._wp 
     533               sxxice(ji,jj,jl)  = 0._wp   ;   sxxsn(ji,jj,jl)  = 0._wp   ;   sxxa (ji,jj,jl)  = 0._wp 
     534               syyice(ji,jj,jl)  = 0._wp   ;   syysn(ji,jj,jl)  = 0._wp   ;   syya (ji,jj,jl)  = 0._wp 
     535               sxyice(ji,jj,jl)  = 0._wp   ;   sxysn(ji,jj,jl)  = 0._wp   ;   sxya (ji,jj,jl)  = 0._wp 
     536 
     537               sxc0  (ji,jj,jl)  = 0._wp    
     538               syc0  (ji,jj,jl)  = 0._wp    
     539               sxxc0 (ji,jj,jl)  = 0._wp    
     540               syyc0 (ji,jj,jl)  = 0._wp    
     541               sxyc0 (ji,jj,jl)  = 0._wp    
     542 
     543               sxsal  (ji,jj,jl)  = 0._wp 
     544               sysal  (ji,jj,jl)  = 0._wp 
     545               sxxsal (ji,jj,jl)  = 0._wp 
     546               syysal (ji,jj,jl)  = 0._wp 
     547               sxysal (ji,jj,jl)  = 0._wp 
     548 
     549               sxage  (ji,jj,jl)  = 0._wp 
     550               syage  (ji,jj,jl)  = 0._wp 
     551               sxxage (ji,jj,jl)  = 0._wp 
     552               syyage (ji,jj,jl)  = 0._wp 
     553               sxyage (ji,jj,jl)  = 0._wp 
     554            END DO 
     555         END DO 
     556      END DO 
     557 
     558      DO jl = 1, jpl 
     559         DO jk = 1, nlay_i 
     560!$OMP DO schedule(static) private(jj,ji) 
     561            DO jj = 1, jpj 
     562               DO ji = 1, jpi 
     563                  sxe  (ji,jj,jk,jl)= 0._wp 
     564                  sye  (ji,jj,jk,jl)= 0._wp 
     565                  sxxe (ji,jj,jk,jl)= 0._wp 
     566                  syye (ji,jj,jk,jl)= 0._wp 
     567                  sxye (ji,jj,jk,jl)= 0._wp 
     568               END DO 
     569            END DO 
     570         END DO 
     571      END DO 
     572!$OMP END PARALLEL 
     573 
    446574 
    447575!!!clem 
     
    453581      CALL wrk_dealloc( jpi, jpj,      zht_i_ini, zat_i_ini, zvt_i_ini, zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
    454582      CALL wrk_dealloc( jpi, jpj,      zswitch ) 
    455       Call wrk_dealloc( 4,             itest ) 
    456583 
    457584   END SUBROUTINE lim_istate 
Note: See TracChangeset for help on using the changeset viewer.