Ignore:
Timestamp:
Aug 17, 2011 2:13:26 PM (13 years ago)
Author:
suehring
Message:

Bugfix in ws-scheme concerning OpenMP paralellization.

File:
1 edited

Legend:

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

    r710 r736  
    44! Current revisions:
    55! -----------------
    6 !
     6! Bugfix: determination of first thread index i for WS-scheme
    77!
    88! Former revisions:
     
    147147
    148148    CHARACTER (LEN=9) ::  time_to_string
    149     INTEGER ::  i, j, k
     149    INTEGER ::  i, i_omp_start, j, k, tn = 0
    150150    REAL    ::  sat, sbt
    151151
     
    172172!
    173173!-- u-tendency terms with no communication
     174    i_omp_start = nxlu
    174175    DO  i = nxlu, nxr
    175176       DO  j = nys, nyn
     
    179180             tend(:,j,i) = 0.0
    180181             IF ( ws_scheme_mom )  THEN
    181                  CALL advec_u_ws( i, j )
     182                 CALL advec_u_ws( i, j, i_omp_start, tn )
    182183             ELSE
    183184                 CALL advec_u_pw( i, j )
     
    257258!
    258259!-- v-tendency terms with no communication
     260    i_omp_start = nxl
    259261    DO  i = nxl, nxr
    260262       DO  j = nysv, nyn
     
    264266             tend(:,j,i) = 0.0
    265267             IF ( ws_scheme_mom )  THEN
    266                  CALL advec_v_ws( i, j )
     268                 CALL advec_v_ws( i, j, i_omp_start, tn )
    267269             ELSE
    268270                 CALL advec_v_pw( i, j )
     
    348350             tend(:,j,i) = 0.0
    349351             IF ( ws_scheme_mom )  THEN
    350                  CALL advec_w_ws( i, j )
     352                 CALL advec_w_ws( i, j, i_omp_start, tn )
    351353             ELSE 
    352354                 CALL advec_w_pw( i, j )
     
    453455                IF ( ws_scheme_sca )  THEN
    454456                   CALL advec_s_ws( i, j, pt, 'pt', flux_s_pt, &
    455                                  diss_s_pt, flux_l_pt, diss_l_pt )
     457                                 diss_s_pt, flux_l_pt, diss_l_pt, i_omp_start, tn )
    456458                ELSE
    457459                    CALL advec_s_pw( i, j, pt )
     
    574576                   IF ( ws_scheme_sca )  THEN
    575577                       CALL advec_s_ws( i, j, sa, 'sa', flux_s_sa,  &
    576                                     diss_s_sa, flux_l_sa, diss_l_sa )
     578                                    diss_s_sa, flux_l_sa, diss_l_sa, i_omp_start, tn )
    577579                   ELSE
    578580                       CALL advec_s_pw( i, j, sa )
     
    673675                   IF ( ws_scheme_sca )  THEN
    674676                       CALL advec_s_ws( i, j, q, 'q', flux_s_q, &
    675                                    diss_s_q, flux_l_q, diss_l_q )
     677                                   diss_s_q, flux_l_q, diss_l_q, i_omp_start, tn )
    676678                   ELSE
    677679                       CALL advec_s_pw( i, j, q )
     
    813815                      IF ( ws_scheme_sca )  THEN
    814816                          CALL advec_s_ws( i, j, e, 'e', flux_s_e, &
    815                                       diss_s_e, flux_l_e, diss_l_e )
     817                                      diss_s_e, flux_l_e, diss_l_e, i_omp_start, tn )
    816818                      ELSE
    817819                          CALL advec_s_pw( i, j, e )
     
    916918
    917919    CHARACTER (LEN=9) ::  time_to_string
    918     INTEGER ::  i, j, k
     920    INTEGER ::  i, i_omp_start, j, k, omp_get_thread_num, tn = 0
     921    LOGICAL ::  loop_start
    919922
    920923
     
    934937         intermediate_timestep_count == 1 )  CALL ws_statistics
    935938
    936 
    937939!
    938940!-- Loop over all prognostic equations
    939 !$OMP PARALLEL private (i,j,k)
     941!$OMP PARALLEL private (i,i_omp_start,j,k,loop_start,tn)
     942
     943!$  tn = omp_get_thread_num()
     944    loop_start = .TRUE.
    940945!$OMP DO
    941946    DO  i = nxl, nxr
     947
     948!
     949!--    Store the first loop index. It differs for each thread and is required
     950!--    later in advec_ws
     951       IF ( loop_start )  THEN
     952          loop_start  = .FALSE.
     953          i_omp_start = i
     954       ENDIF
     955 
    942956       DO  j = nys, nyn
    943957!
     
    948962             IF ( tsc(2) == 2.0  .OR.  timestep_scheme(1:5) == 'runge' )  THEN
    949963                IF ( ws_scheme_mom )  THEN
    950     !               CALL local_diss( i, j, u)    ! dissipation control
    951                    CALL advec_u_ws( i, j )
     964                   IF ( outflow_l .AND. i_omp_start == nxl )  THEN
     965!                     CALL local_diss( i, j, u)    ! dissipation control
     966                      CALL advec_u_ws( i, j, i_omp_start + 1, tn )
     967                   ELSE
     968                      CALL advec_u_ws( i, j, i_omp_start, tn )
     969                   ENDIF
    952970                ELSE
    953971                   CALL advec_u_pw( i, j )
    954972                ENDIF
    955             ELSE
     973             ELSE
    956974                CALL advec_u_up( i, j )
    957975             ENDIF
     
    10171035                IF ( ws_scheme_mom )  THEN
    10181036                 !   CALL local_diss( i, j, v)
    1019                     CALL advec_v_ws( i, j )
     1037                    CALL advec_v_ws( i, j, i_omp_start, tn )
    10201038                ELSE
    10211039                    CALL advec_v_pw( i, j )
     
    10811099             IF ( ws_scheme_mom )  THEN
    10821100             !   CALL local_diss( i, j, w)
    1083                 CALL advec_w_ws( i, j )
     1101                CALL advec_w_ws( i, j, i_omp_start, tn )
    10841102             ELSE
    10851103                CALL advec_w_pw( i, j )
     
    11451163       !            CALL local_diss( i, j, pt )
    11461164                   CALL advec_s_ws( i, j, pt, 'pt', flux_s_pt, &
    1147                              diss_s_pt, flux_l_pt, diss_l_pt )
     1165                             diss_s_pt, flux_l_pt, diss_l_pt, i_omp_start, tn )
    11481166                ELSE
    11491167                   CALL advec_s_pw( i, j, pt )
     
    12271245            !        CALL local_diss( i, j, sa )
    12281246                    CALL advec_s_ws( i, j, sa, 'sa', flux_s_sa,  &
    1229                                 diss_s_sa, flux_l_sa, diss_l_sa  )
     1247                                diss_s_sa, flux_l_sa, diss_l_sa, i_omp_start, tn  )
    12301248                ELSE
    12311249                    CALL advec_s_pw( i, j, sa )
     
    12851303          !         CALL local_diss( i, j, q )
    12861304                   CALL advec_s_ws( i, j, q, 'q', flux_s_q, &
    1287                                 diss_s_q, flux_l_q, diss_l_q )
     1305                                diss_s_q, flux_l_q, diss_l_q, i_omp_start, tn )
    12881306                ELSE
    12891307                   CALL advec_s_pw( i, j, q )
     
    13611379                 !    CALL local_diss( i, j, e )
    13621380                     CALL advec_s_ws( i, j, e, 'e', flux_s_e, &
    1363                                 diss_s_e, flux_l_e, diss_l_e )
     1381                                diss_s_e, flux_l_e, diss_l_e , i_omp_start, tn )
    13641382                 ELSE
    13651383                     CALL advec_s_pw( i, j, e )
Note: See TracChangeset for help on using the changeset viewer.