Changeset 801


Ignore:
Timestamp:
Jan 10, 2012 5:30:36 PM (11 years ago)
Author:
suehring
Message:

Bugfix concerning OpenMP parallelization. Calculation of turbulent fluxes in advec_ws is now thread-safe.

Location:
palm/trunk/SOURCE
Files:
3 edited

Legend:

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

    r744 r801  
    44! Current revisions:
    55! ------------------
     6! Bugfix concerning OpenMP parallelization. Summation of sums_wsus_ws_l,
     7! sums_wsvs_ws_l, sums_us2_ws_l, sums_vs2_ws_l, sums_ws2_ws_l, sums_wspts_ws_l,
     8! sums_wsqs_ws_l, sums_wssas_ws_l is now thread-safe by adding an additional
     9! dimension.
    610!
    711! Former revisions:
     
    135139       IF ( ws_scheme_mom )  THEN
    136140
    137           ALLOCATE( sums_wsus_ws_l(nzb:nzt+1), sums_wsvs_ws_l(nzb:nzt+1),  &
    138                     sums_us2_ws_l(nzb:nzt+1),  sums_vs2_ws_l(nzb:nzt+1),   &
    139                     sums_ws2_ws_l(nzb:nzt+1) )
     141          ALLOCATE( sums_wsus_ws_l(nzb:nzt+1,0:threads_per_task-1),  &
     142                    sums_wsvs_ws_l(nzb:nzt+1,0:threads_per_task-1),  &
     143                    sums_us2_ws_l(nzb:nzt+1,0:threads_per_task-1),   &
     144                    sums_vs2_ws_l(nzb:nzt+1,0:threads_per_task-1),   &
     145                    sums_ws2_ws_l(nzb:nzt+1,0:threads_per_task-1) )
    140146
    141147          sums_wsus_ws_l = 0.0
     
    149155       IF ( ws_scheme_sca )  THEN
    150156
    151           ALLOCATE( sums_wspts_ws_l(nzb:nzt+1) )
     157          ALLOCATE( sums_wspts_ws_l(nzb:nzt+1,0:threads_per_task-1) )
    152158          sums_wspts_ws_l = 0.0
    153159
    154160          IF ( humidity .OR. passive_scalar )  THEN
    155              ALLOCATE( sums_wsqs_ws_l(nzb:nzt+1) )
     161             ALLOCATE( sums_wsqs_ws_l(nzb:nzt+1,0:threads_per_task-1) )
    156162             sums_wsqs_ws_l = 0.0
    157163          ENDIF
    158164
    159165          IF ( ocean )  THEN
    160              ALLOCATE( sums_wssas_ws_l(nzb:nzt+1) )
     166             ALLOCATE( sums_wssas_ws_l(nzb:nzt+1,0:threads_per_task-1) )
    161167             sums_wssas_ws_l = 0.0
    162168          ENDIF
     
    643649
    644650             DO  k = nzb_s_inner(j,i), nzt
    645                 sums_wspts_ws_l(k) = sums_wspts_ws_l(k) +                      &
     651                sums_wspts_ws_l(k,tn) = sums_wspts_ws_l(k,tn) +                      &
    646652                                       ( flux_t(k) + diss_t(k) )               &
    647653                                 * weight_substep(intermediate_timestep_count)
     
    651657
    652658             DO  k = nzb_s_inner(j,i), nzt
    653                 sums_wssas_ws_l(k) = sums_wssas_ws_l(k) +                      &
     659                sums_wssas_ws_l(k,tn) = sums_wssas_ws_l(k,tn) +                      &
    654660                                       ( flux_t(k) + diss_t(k) )               &
    655661                                 * weight_substep(intermediate_timestep_count)
     
    659665
    660666             DO  k = nzb_s_inner(j,i), nzt
    661                 sums_wsqs_ws_l(k)  = sums_wsqs_ws_l(k) +                       &
     667                sums_wsqs_ws_l(k,tn)  = sums_wsqs_ws_l(k,tn) +                       &
    662668                                      ( flux_t(k) + diss_t(k) )                &
    663669                                 * weight_substep(intermediate_timestep_count)
     
    905911!--        Statistical Evaluation of u'u'. The factor has to be applied for
    906912!--        right evaluation when gallilei_trans = .T. .
    907            sums_us2_ws_l(k) = sums_us2_ws_l(k)                                &
     913           sums_us2_ws_l(k,tn) = sums_us2_ws_l(k,tn)                                &
    908914             + ( flux_r(k) *                                                  &
    909915               ( u_comp(k) - 2.0 * hom(k,1,1,0) )                             &
     
    914920             *   weight_substep(intermediate_timestep_count)
    915921       ENDDO
    916        sums_us2_ws_l(nzb_u_inner(j,i)) = sums_us2_ws_l(nzb_u_inner(j,i)+1)
     922       sums_us2_ws_l(nzb_u_inner(j,i),tn) = sums_us2_ws_l(nzb_u_inner(j,i)+1,tn)
    917923                                           
    918924
     
    10001006!--    sum up the vertical momentum fluxes
    10011007       DO  k = nzb_u_inner(j,i), nzt
    1002           sums_wsus_ws_l(k) = sums_wsus_ws_l(k)                               &
     1008          sums_wsus_ws_l(k,tn) = sums_wsus_ws_l(k,tn)                               &
    10031009              + ( flux_t(k) + diss_t(k) )                                     &
    10041010              *   weight_substep(intermediate_timestep_count)
     
    12431249!--        right evaluation when gallilei_trans = .T. .
    12441250
    1245            sums_vs2_ws_l(k) = sums_vs2_ws_l(k)                                &
     1251           sums_vs2_ws_l(k,tn) = sums_vs2_ws_l(k,tn)                                &
    12461252             + ( flux_n(k)                                                    &
    12471253             * ( v_comp(k) - 2.0 * hom(k,1,2,0) )                             &
     
    12531259
    12541260       ENDDO
    1255        sums_vs2_ws_l(nzb_v_inner(j,i)) = sums_vs2_ws_l(nzb_v_inner(j,i)+1
     1261       sums_vs2_ws_l(nzb_v_inner(j,i),tn) = sums_vs2_ws_l(nzb_v_inner(j,i)+1,tn
    12561262                                           
    12571263!
     
    13351341             
    13361342       DO  k = nzb_v_inner(j,i), nzt
    1337           sums_wsvs_ws_l(k) = sums_wsvs_ws_l(k)                               &
     1343          sums_wsvs_ws_l(k,tn) = sums_wsvs_ws_l(k,tn)                               &
    13381344                 + ( flux_t(k) + diss_t(k) )                                  &
    13391345                 *   weight_substep(intermediate_timestep_count)
     
    16671673       
    16681674       DO  k = nzb_w_inner(j,i), nzt
    1669            sums_ws2_ws_l(k)  = sums_ws2_ws_l(k)                               &
     1675           sums_ws2_ws_l(k,tn)  = sums_ws2_ws_l(k,tn)                               &
    16701676                 + ( flux_t(k) + diss_t(k) )                                  &
    16711677                 *   weight_substep(intermediate_timestep_count)
     
    16891695       IMPLICIT NONE
    16901696
    1691        INTEGER ::  i, j, k
    1692 
     1697       INTEGER ::  i, j, k, tn = 0
    16931698       REAL, DIMENSION(:,:,:), POINTER ::  sk
    16941699       REAL    :: flux_d, diss_d, u_comp, v_comp
     
    20392044               CASE ( 'pt' )
    20402045                 DO  k = nzb_s_inner(j,i), nzt
    2041                    sums_wspts_ws_l(k) = sums_wspts_ws_l(k)                    &
     2046                   sums_wspts_ws_l(k,tn) = sums_wspts_ws_l(k,tn)                    &
    20422047                      + ( flux_t(k) + diss_t(k) )                             &
    20432048                      *   weight_substep(intermediate_timestep_count)
     
    20452050               CASE ( 'sa' )
    20462051                 DO  k = nzb_s_inner(j,i), nzt
    2047                    sums_wssas_ws_l(k) = sums_wssas_ws_l(k)                    &
     2052                   sums_wssas_ws_l(k,tn) = sums_wssas_ws_l(k,tn)                    &
    20482053                      + ( flux_t(k) + diss_t(k) )                             &
    20492054                      *   weight_substep(intermediate_timestep_count)
     
    20512056               CASE ( 'q' )
    20522057                 DO  k = nzb_s_inner(j,i), nzt
    2053                    sums_wsqs_ws_l(k) = sums_wsqs_ws_l(k)                      &
     2058                   sums_wsqs_ws_l(k,tn) = sums_wsqs_ws_l(k,tn)                      &
    20542059                      + ( flux_t(k) + diss_t(k) )                             &
    20552060                      *   weight_substep(intermediate_timestep_count)
     
    20782083       IMPLICIT NONE
    20792084
    2080        INTEGER ::  i, j, k
     2085       INTEGER ::  i, j, k, tn = 0
    20812086       REAL    ::  gu, gv, flux_d, diss_d, v_comp, w_comp
    20822087       REAL, DIMENSION(nzb+1:nzt) :: swap_flux_y_local_u, swap_diss_y_local_u
     
    23322337               swap_diss_y_local_u(k)   = diss_n(k)
    23332338                     
    2334                sums_us2_ws_l(k)  = sums_us2_ws_l(k)                            &
     2339               sums_us2_ws_l(k,tn)  = sums_us2_ws_l(k,tn)                            &
    23352340                 + ( flux_r(k)                                                 &
    23362341                 * ( u_comp(k) - 2.0 * hom(k,1,1,0) )                          &
     
    23412346                 *   weight_substep(intermediate_timestep_count)
    23422347            ENDDO
    2343             sums_us2_ws_l(nzb_u_inner(j,i)) = sums_us2_ws_l(nzb_u_inner(j,i)+1)
     2348            sums_us2_ws_l(nzb_u_inner(j,i),tn) = sums_us2_ws_l(nzb_u_inner(j,i)+1,tn)
    23442349         ENDDO
    23452350       ENDDO
     
    24342439!-- at last vertical momentum flux is accumulated
    24352440            DO  k = nzb_u_inner(j,i), nzt
    2436                sums_wsus_ws_l(k) = sums_wsus_ws_l(k)                           &
     2441               sums_wsus_ws_l(k,tn) = sums_wsus_ws_l(k,tn)                           &
    24372442                              + ( flux_t(k) + diss_t(k) )                      &
    24382443                              *   weight_substep(intermediate_timestep_count)
     
    24602465
    24612466
    2462        INTEGER ::  i, j, k
     2467       INTEGER ::  i, j, k, tn = 0
    24632468       REAL    ::  gu, gv, flux_l, flux_s, flux_d, diss_l, diss_s, diss_d,    &
    24642469                   u_comp, w_comp
     
    27112716               swap_diss_y_local_v(k)   = diss_n(k)   
    27122717
    2713                sums_vs2_ws_l(k) = sums_vs2_ws_l(k)                             &
     2718               sums_vs2_ws_l(k,tn) = sums_vs2_ws_l(k,tn)                             &
    27142719                  + ( flux_n(k) * ( v_comp(k) - 2.0 * hom(k,1,2,0) )           &
    27152720                  / ( v_comp(k) - gv + 1.0E-20 )                               &
     
    27182723                  *   weight_substep(intermediate_timestep_count)
    27192724            ENDDO
    2720             sums_vs2_ws_l(nzb_v_inner(j,i)) = sums_vs2_ws_l(nzb_v_inner(j,i)+1)
     2725            sums_vs2_ws_l(nzb_v_inner(j,i),tn) = sums_vs2_ws_l(nzb_v_inner(j,i)+1,tn)
    27212726         ENDDO
    27222727       ENDDO
     
    28082813!-          At last vertical momentum flux is accumulated.
    28092814            DO  k = nzb_v_inner(j,i), nzt
    2810                sums_wsvs_ws_l(k) = sums_wsvs_ws_l(k)                           &
     2815               sums_wsvs_ws_l(k,tn) = sums_wsvs_ws_l(k,tn)                           &
    28112816                               + ( flux_t(k) + diss_t(k) )                     &
    28122817                               *   weight_substep(intermediate_timestep_count)
    28132818            ENDDO
    2814             sums_vs2_ws_l(nzb_v_inner(j,i)) = sums_vs2_ws_l(nzb_v_inner(j,i)+1)
     2819            sums_vs2_ws_l(nzb_v_inner(j,i),tn) = sums_vs2_ws_l(nzb_v_inner(j,i)+1,tn)
    28152820          ENDDO
    28162821       ENDDO
     
    28332838       IMPLICIT NONE
    28342839
    2835        INTEGER ::  i, j, k
     2840       INTEGER ::  i, j, k, tn = 0
    28362841       REAL    ::  gu, gv, flux_d, diss_d, u_comp, v_comp, w_comp
    28372842       REAL    ::  flux_t(nzb:nzt+1), diss_t(nzb:nzt+1)
     
    31843189!--         at last vertical momentum flux is accumulated
    31853190            DO  k = nzb_w_inner(j,i), nzt
    3186                sums_ws2_ws_l(k)  = sums_ws2_ws_l(k)                            &
     3191               sums_ws2_ws_l(k,tn)  = sums_ws2_ws_l(k,tn)                            &
    31873192                               + ( flux_t(k) + diss_t(k) )                     &
    31883193                               *   weight_substep(intermediate_timestep_count)
  • palm/trunk/SOURCE/flow_statistics.f90

    r744 r801  
    44! Current revisions:
    55! -----------------
    6 ! Calculation of turbulent fluxes with WS-scheme only for the whole model
    7 ! domain, not for user-defined subregions.
     6! Calculation of turbulent fluxes in advec_ws is now thread-safe.
    87!
    98! Former revisions:
     
    179178!--       the corresponding fluxes has to satisfiy the same bc.
    180179          IF ( ocean )  THEN
    181              sums_us2_ws_l(nzt+1) = sums_us2_ws_l(nzt)
    182              sums_vs2_ws_l(nzt+1) = sums_vs2_ws_l(nzt)   
     180             sums_us2_ws_l(nzt+1,:) = sums_us2_ws_l(nzt,:)
     181             sums_vs2_ws_l(nzt+1,:) = sums_vs2_ws_l(nzt,:)   
    183182          ENDIF
    184183
     
    186185!         
    187186!--          Swap the turbulent quantities evaluated in advec_ws.
    188              sums_l(:,13,i) = sums_wsus_ws_l(:)       ! w*u*
    189              sums_l(:,15,i) = sums_wsvs_ws_l(:)       ! w*v*
    190              sums_l(:,30,i) = sums_us2_ws_l(:)        ! u*2
    191              sums_l(:,31,i) = sums_vs2_ws_l(:)        ! v*2
    192              sums_l(:,32,i) = sums_ws2_ws_l(:)        ! w*2
     187             sums_l(:,13,i) = sums_wsus_ws_l(:,i)       ! w*u*
     188             sums_l(:,15,i) = sums_wsvs_ws_l(:,i)       ! w*v*
     189             sums_l(:,30,i) = sums_us2_ws_l(:,i)        ! u*2
     190             sums_l(:,31,i) = sums_vs2_ws_l(:,i)        ! v*2
     191             sums_l(:,32,i) = sums_ws2_ws_l(:,i)        ! w*2
    193192             sums_l(:,34,i) = sums_l(:,34,i) + 0.5 *                        &
    194                               ( sums_us2_ws_l(:) + sums_vs2_ws_l(:) +       &
    195                                 sums_ws2_ws_l(:) )    ! e*
     193                              ( sums_us2_ws_l(:,i) + sums_vs2_ws_l(:,i) +   &
     194                                sums_ws2_ws_l(:,i) )    ! e*
    196195             DO  k = nzb, nzt
    197                 sums_l(nzb+5,pr_palm,i) = sums_l(nzb+5,pr_palm,i) + 0.5 * (  &
    198                                                       sums_us2_ws_l(k) +     &
    199                                                       sums_vs2_ws_l(k) +     &
    200                                                       sums_ws2_ws_l(k) )
     196                sums_l(nzb+5,pr_palm,i) = sums_l(nzb+5,pr_palm,i) + 0.5 * ( &
     197                                                      sums_us2_ws_l(k,i) +  &
     198                                                      sums_vs2_ws_l(k,i) +  &
     199                                                      sums_ws2_ws_l(k,i) )
    201200             ENDDO
    202201          ENDDO
     
    207206
    208207          DO  i = 0, threads_per_task-1
    209              sums_l(:,17,i) = sums_wspts_ws_l(:)      ! w*pt* from advec_s_ws
    210              IF ( ocean ) sums_l(:,66,i) = sums_wssas_ws_l(:) ! w*sa*
     208             sums_l(:,17,i) = sums_wspts_ws_l(:,i)      ! w*pt* from advec_s_ws
     209             IF ( ocean ) sums_l(:,66,i) = sums_wssas_ws_l(:,i) ! w*sa*
    211210             IF ( humidity .OR. passive_scalar ) sums_l(:,49,i) =              &
    212                                                    sums_wsqs_ws_l(:) !w*q*
     211                                                   sums_wsqs_ws_l(:,i) !w*q*
    213212          ENDDO
    214213
  • palm/trunk/SOURCE/modules.f90

    r792 r801  
    77! particle arrays (particles, parrticles_temp) implemented as pointers,
    88! +particles_1, particles_2, sort_count
     9!
     10! Dimesion of sums_wsus_ws_l, ! sums_wsvs_ws_l, sums_us2_ws_l, sums_vs2_ws_l,
     11! sums_ws2_ws_l, sums_wspts_ws_l, sums_wsqs_ws_l, sums_wssas_ws_l increased.
     12! for thread-safe summation in advec_ws.
    913!
    1014! Former revisions:
     
    14391443    REAL ::     u_max, v_max, w_max
    14401444    REAL, DIMENSION(:), ALLOCATABLE       ::  sums_divnew_l, sums_divold_l,   &
     1445                                              weight_substep, weight_pres
     1446    REAL, DIMENSION(:,:), ALLOCATABLE     ::  sums, sums_wsts_bc_l, ts_value, &
    14411447                                              sums_wsus_ws_l, sums_wsvs_ws_l, &
    14421448                                              sums_us2_ws_l, sums_vs2_ws_l,   &
    14431449                                              sums_ws2_ws_l,                  &
    14441450                                              sums_wspts_ws_l,                &
    1445                                               sums_wssas_ws_l,sums_wsqs_ws_l, &                 
    1446                                               weight_substep, weight_pres
    1447     REAL, DIMENSION(:,:), ALLOCATABLE     ::  sums, sums_wsts_bc_l, ts_value
     1451                                              sums_wssas_ws_l,sums_wsqs_ws_l
    14481452    REAL, DIMENSION(:,:,:), ALLOCATABLE   ::  hom_sum, rmask, spectrum_x, &
    14491453                                              spectrum_y, sums_l, sums_l_l, &
Note: See TracChangeset for help on using the changeset viewer.