Ignore:
Timestamp:
Sep 30, 2020 10:27:40 PM (4 years ago)
Author:
pavelkrc
Message:

Fixes and optimizations of OpenMP parallelization, formatting of OpenMP directives

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/radiation_model_mod.f90

    r4713 r4717  
    2828! -----------------
    2929! $Id$
     30! Fixes and optimizations of OpenMP parallelization, formatting of OpenMP
     31! directives (J. Resler)
     32!
     33! 4713 2020-09-29 12:02:05Z pavelkrc
    3034! Correct OpenMP parallelization including cycles with cumulative variables (J. Resler)
    3135!
     
    59545958     REAL(wp)                          ::  asrc               !< area of source face
    59555959     REAL(wp)                          ::  pcrad              !< irradiance from plant canopy
     5960     REAL(wp)                          ::  temp               !< temporary variable for calculation
    59565961!-   variables for coupling the radiation modle (e.g. RRTMG) and RTM
    59575962     REAL(wp)                          ::  pabsswl            !< total absorbed SW radiation energy in local processor (W)
     
    61646169
    61656170     IF ( surface_reflections)  THEN
    6166         !$OMP DO PRIVATE (i, j, k, isvf, isurf, isurfsrc) SCHEDULE (STATIC)
     6171        !$OMP PARALLEL DO PRIVATE (i, j, k, isvf, isurf, isurfsrc, temp) SCHEDULE (STATIC)
    61676172        DO  isvf = 1, nsvfl
    61686173           isurf = svfsurf(1, isvf)
     
    61746179!--        For surface-to-surface factors we calculate thermal radiation in 1st pass
    61756180           IF ( plant_lw_interact )  THEN
    6176               surfinl(isurf) = surfinl(isurf) + svf(1,isvf) * svf(2,isvf) * surfoutl(isurfsrc)
     6181              temp = svf(1,isvf) * svf(2,isvf) * surfoutl(isurfsrc)
    61776182           ELSE
    6178               surfinl(isurf) = surfinl(isurf) + svf(1,isvf) * surfoutl(isurfsrc)
     6183              temp = svf(1,isvf) * surfoutl(isurfsrc)
    61796184           ENDIF
     6185           !$OMP ATOMIC
     6186           surfinl(isurf) = surfinl(isurf) + temp
    61806187        ENDDO
    6181         !$OMP END DO
    61826188     ENDIF
    61836189!
    61846190!--  diffuse radiation using sky view factor
    6185      !$OMP DO PRIVATE (i, j, d, isurf) REDUCTION(+:pinswl, pinlwl) SCHEDULE (STATIC)
     6191     !$OMP PARALLEL DO PRIVATE (i, j, d, isurf) REDUCTION(+:pinswl, pinlwl) SCHEDULE (STATIC)
    61866192     DO isurf = 1, nsurfl
    61876193        j = surfl(iy, isurf)
     
    61936199        IF ( plant_lw_interact )  THEN
    61946200           surfinlwdif(isurf) = rad_lw_in_diff(j,i) * skyvft(isurf)
    6195 !-         update received LW energy for RTM coupling
    6196            pinlwl = pinlwl + surfinlwdif(isurf) * facearea(d)
    61976201        ELSE
    61986202           surfinlwdif(isurf) = rad_lw_in_diff(j,i) * skyvf(isurf)
    6199 !-         update received LW energy for RTM coupling
    6200            pinlwl = pinlwl + surfinlwdif(isurf) * facearea(d)
    62016203        ENDIF
     6204!-      update received LW energy for RTM coupling
     6205        pinlwl = pinlwl + surfinlwdif(isurf) * facearea(d)
    62026206     ENDDO
    6203      !$OMP END DO
    62046207!
    62056208!--  MRT diffuse irradiance
    6206      !$OMP DO PRIVATE (i, j, imrt) SCHEDULE (STATIC)
     6209     !$OMP PARALLEL DO PRIVATE (i, j, imrt) SCHEDULE (STATIC)
    62076210     DO  imrt = 1, nmrtbl
    62086211        j = mrtbl(iy, imrt)
     
    62116214        mrtinlw(imrt) = mrtsky(imrt) * rad_lw_in_diff(j,i)
    62126215     ENDDO
    6213      !$OMP END DO
    62146216!
    62156217!--  Direct radiation
     
    62296231        isd = dsidir_rev(j, i)
    62306232!-- TODO: check if isd = -1 to report that this solar position is not precalculated
    6231         !$OMP DO PRIVATE (i, j, d, isurf)  REDUCTION(+:pinswl) SCHEDULE (STATIC)
     6233        !$OMP PARALLEL DO PRIVATE (i, j, d, isurf)  REDUCTION(+:pinswl) SCHEDULE (STATIC)
    62326234        DO isurf = 1, nsurfl
    62336235           j = surfl(iy, isurf)
     
    62366238           surfinswdir(isurf) = rad_sw_in_dir(j,i) *                        &
    62376239                costheta(surfl(id, isurf)) * dsitrans(isurf, isd) * sun_direct_factor
    6238 !-        update received SW energy for RTM coupling
     6240!--        update received SW energy for RTM coupling
    62396241           pinswl = pinswl + surfinswdir(isurf) * facearea(d)
    62406242        ENDDO
    6241         !$OMP END DO
    62426243!
    62436244!--     MRT direct irradiance
    6244         !$OMP DO PRIVATE (i, j, imrt) SCHEDULE (STATIC)
     6245        !$OMP PARALLEL DO PRIVATE (i, j, imrt) SCHEDULE (STATIC)
    62456246        DO  imrt = 1, nmrtbl
    62466247           j = mrtbl(iy, imrt)
     
    62496250                                     * sun_direct_factor / 4.0_wp ! normal to sphere
    62506251        ENDDO
    6251         !$OMP END DO
    62526252     ENDIF
    62536253!
    62546254!--  MRT first pass thermal
    6255      !$OMP DO PRIVATE (imrtf, imrt, isurfsrc) SCHEDULE (STATIC)
     6255     !$OMP PARALLEL DO PRIVATE (imrtf, imrt, isurfsrc, temp) SCHEDULE (STATIC)
    62566256     DO  imrtf = 1, nmrtf
    62576257        imrt = mrtfsurf(1, imrtf)
    62586258        isurfsrc = mrtfsurf(2, imrtf)
    6259         mrtinlw(imrt) = mrtinlw(imrt) + mrtf(imrtf) * surfoutl(isurfsrc)
     6259        temp = mrtf(imrtf) * surfoutl(isurfsrc)
     6260        !$OMP ATOMIC
     6261        mrtinlw(imrt) = mrtinlw(imrt) + temp
    62606262     ENDDO
    6261      !$OMP END DO
    62626263!
    62636264!--  Absorption in each local plant canopy grid box from the first atmospheric
     
    62696270         pcbinlw(:) = 0.0_wp
    62706271
    6271          !$OMP DO PRIVATE (icsf, ipcgb, i, j, k, kk, isurfsrc, pc_abs_frac, pcrad, asrc)          &
     6272         !$OMP PARALLEL DO PRIVATE (icsf, ipcgb, i, j, k, kk, isurfsrc, pc_abs_frac, pcrad, asrc) &
    62726273         !$OMP&   REDUCTION(+:pinswl, pinlwl, pabslwl, pemitlwl, pabs_pc_lwdifl) SCHEDULE (STATIC)
    62736274         DO icsf = 1, ncsfl
     
    63286329             ENDIF
    63296330         ENDDO
    6330          !$OMP END DO
    63316331
    63326332         pcbinsw(:) = pcbinswdir(:) + pcbinswdif(:)
     
    64246424!
    64256425!--      Reflected radiation
    6426          !$OMP DO PRIVATE (isvf, isurf, isurfsrc) SCHEDULE (STATIC)
     6426         !$OMP PARALLEL DO PRIVATE (isvf, isurf, isurfsrc) SCHEDULE (STATIC)
    64276427         DO isvf = 1, nsvfl
    64286428             isurf = svfsurf(1, isvf)
     
    64356435             ENDIF
    64366436         ENDDO
    6437          !$OMP END DO
    64386437!
    64396438!--      NOTE: PC absorbtion and MRT from reflected can both be done at once
     
    64436442!
    64446443!--      Radiation absorbed by plant canopy
    6445          !$OMP DO PRIVATE (icsf, ipcgb, isurfsrc, asrc) SCHEDULE (STATIC)
     6444         !$OMP PARALLEL DO PRIVATE (icsf, ipcgb, isurfsrc, asrc, temp) SCHEDULE (STATIC)
    64466445         DO  icsf = 1, ncsfl
    64476446             ipcgb = csfsurf(1, icsf)
     
    64536452!--          stored within `csf'
    64546453             asrc = facearea(surf(id, isurfsrc))
    6455              pcbinsw(ipcgb) = pcbinsw(ipcgb) + csf(1,icsf) * surfouts(isurfsrc) * asrc
     6454             temp = csf(1,icsf) * surfouts(isurfsrc) * asrc
     6455             !$OMP ATOMIC
     6456             pcbinsw(ipcgb) = pcbinsw(ipcgb) + temp
    64566457             IF ( plant_lw_interact )  THEN
    6457                 pcbinlw(ipcgb) = pcbinlw(ipcgb) + csf(1,icsf) * surfoutl(isurfsrc) * asrc
     6458                temp = csf(1,icsf) * surfoutl(isurfsrc) * asrc
     6459                !$OMP ATOMIC
     6460                pcbinlw(ipcgb) = pcbinlw(ipcgb) + temp
    64586461             ENDIF
    64596462         ENDDO
    6460          !$OMP END DO
    64616463!
    64626464!--      MRT reflected
    6463          !$OMP DO PRIVATE (imrtf, imrt, isurfsrc) SCHEDULE (STATIC)
     6465         !$OMP PARALLEL DO PRIVATE (imrtf, imrt, isurfsrc, temp) SCHEDULE (STATIC)
    64646466         DO  imrtf = 1, nmrtf
    64656467            imrt = mrtfsurf(1, imrtf)
    64666468            isurfsrc = mrtfsurf(2, imrtf)
    6467             mrtinsw(imrt) = mrtinsw(imrt) + mrtft(imrtf) * surfouts(isurfsrc)
    6468             mrtinlw(imrt) = mrtinlw(imrt) + mrtf(imrtf) * surfoutl(isurfsrc)
     6469            temp = mrtft(imrtf) * surfouts(isurfsrc)
     6470            !$OMP ATOMIC
     6471            mrtinsw(imrt) = mrtinsw(imrt) + temp
     6472            temp = mrtf(imrtf) * surfoutl(isurfsrc)
     6473            !$OMP ATOMIC
     6474            mrtinlw(imrt) = mrtinlw(imrt) + temp
    64696475         ENDDO
    6470          !$OMP END DO
    64716476
    64726477         IF ( trace_fluxes_above >= 0.0_wp )  THEN
     
    64906495     IF ( npcbl > 0 )  THEN
    64916496         pcm_heating_rate(:,:,:) = 0.0_wp
    6492          !$OMP DO PRIVATE (ipcgb, i, j, k, kk) REDUCTION(+:pabsswl) SCHEDULE (STATIC)
     6497         !$OMP PARALLEL DO PRIVATE (ipcgb, i, j, k, kk) REDUCTION(+:pabsswl) SCHEDULE (STATIC)
    64936498         DO ipcgb = 1, npcbl
    64946499             j = pcbl(iy, ipcgb)
     
    65036508             pabsswl = pabsswl + pcbinsw(ipcgb)
    65046509         ENDDO
    6505          !$OMP END DO
    65066510
    65076511         IF ( humidity .AND. plant_canopy_transpiration ) THEN
     
    65096513             pcm_transpiration_rate(:,:,:) = 0.0_wp
    65106514             pcm_latent_rate(:,:,:) = 0.0_wp
    6511              !$OMP DO PRIVATE (ipcgb, i, j, k, kk) SCHEDULE (STATIC)
     6515             !$OMP PARALLEL DO PRIVATE (ipcgb, i, j, k, kk) SCHEDULE (STATIC)
    65126516             DO ipcgb = 1, npcbl
    65136517                 i = pcbl(ix, ipcgb)
     
    65206524                                                   pcm_latent_rate(kk,j,i) )
    65216525             ENDDO
    6522              !$OMP END DO
    65236526         ENDIF
    65246527     ENDIF
     
    66306633     ENDDO
    66316634
    6632      !$OMP DO PRIVATE (i, d) REDUCTION(+:pabsswl, pabslwl, pemitlwl, pabs_surf_lwdifl) &
    6633      !$OMP&   SCHEDULE (STATIC)
     6635     !$OMP PARALLEL DO PRIVATE (i, d) REDUCTION(+:pabsswl, pabslwl, pemitlwl, pabs_surf_lwdifl) &
     6636     !$OMP&            SCHEDULE (STATIC)
    66346637     DO  i = 1, nsurfl
    66356638        d  = surfl(id, i)
     
    66466649                           emiss_surf(i) * facearea(d) * surfinlwdif(i)
    66476650     ENDDO
    6648      !$OMP END DO
    66496651
    66506652     DO l = 0, 1
    6651         !$OMP DO PRIVATE (m) SCHEDULE (STATIC)
     6653        !$OMP PARALLEL DO PRIVATE (m) SCHEDULE (STATIC)
    66526654        DO  m = 1, surf_usm_h(l)%ns
    66536655           surf_usm_h(l)%surfhf(m) = surf_usm_h(l)%rad_sw_in(m)  +          &
     
    66566658                                  surf_usm_h(l)%rad_lw_out(m)
    66576659        ENDDO
    6658         !$OMP END DO
    6659         !$OMP DO PRIVATE (m) SCHEDULE (STATIC)
     6660        !$OMP PARALLEL DO PRIVATE (m) SCHEDULE (STATIC)
    66606661        DO  m = 1, surf_lsm_h(l)%ns
    66616662           surf_lsm_h(l)%surfhf(m) = surf_lsm_h(l)%rad_sw_in(m)  +          &
     
    66646665                                  surf_lsm_h(l)%rad_lw_out(m)
    66656666        ENDDO
    6666         !$OMP END DO
    66676667     ENDDO
    66686668
    66696669     DO  l = 0, 3
    6670         !$OMP DO PRIVATE (m) SCHEDULE (STATIC)
    66716670!--     urban
     6671        !$OMP PARALLEL DO PRIVATE (m) SCHEDULE (STATIC)
    66726672        DO  m = 1, surf_usm_v(l)%ns
    66736673           surf_usm_v(l)%surfhf(m) = surf_usm_v(l)%rad_sw_in(m)  +          &
     
    66766676                                     surf_usm_v(l)%rad_lw_out(m)
    66776677        ENDDO
    6678         !$OMP END DO
    66796678!--     land
    6680         !$OMP DO PRIVATE (m) SCHEDULE (STATIC)
     6679        !$OMP PARALLEL DO PRIVATE (m) SCHEDULE (STATIC)
    66816680        DO  m = 1, surf_lsm_v(l)%ns
    66826681           surf_lsm_v(l)%surfhf(m) = surf_lsm_v(l)%rad_sw_in(m)  +          &
     
    66866685
    66876686        ENDDO
    6688         !$OMP END DO
    66896687     ENDDO
    66906688!
Note: See TracChangeset for help on using the changeset viewer.