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

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

File:
1 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)
Note: See TracChangeset for help on using the changeset viewer.