Ignore:
Timestamp:
May 30, 2017 5:47:52 PM (7 years ago)
Author:
suehring
Message:

Adjustments according new topography and surface-modelling concept implemented

File:
1 edited

Legend:

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

    r2156 r2232  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! Adjustments to new topography and surface concept
    2323!
    2424! Former revisions:
     
    402402
    403403       USE indices,                                                            &
    404            ONLY:  nxlg, nxrg, nysg, nyng, nzb_s_inner, nzt
     404           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0
    405405
    406406       USE kinds
     
    416416       DO  i = nxlg, nxrg
    417417          DO  j = nysg, nyng
    418              DO  k = nzb_s_inner(j,i)+1, nzt
     418             DO  k = nzb+1, nzt
    419419                IF ( qr(k,j,i) <= eps_sb )  THEN
    420420                   qr(k,j,i) = 0.0_wp
     
    422422                ELSE
    423423                   IF ( nr(k,j,i) * xrmin > qr(k,j,i) * hyrho(k) )  THEN
    424                       nr(k,j,i) = qr(k,j,i) * hyrho(k) / xrmin
     424                      nr(k,j,i) = qr(k,j,i) * hyrho(k) / xrmin *               &
     425                                       MERGE( 1.0_wp, 0.0_wp,                  &           
     426                                              BTEST( wall_flags_0(k,j,i), 0 ) )
    425427                   ELSEIF ( nr(k,j,i) * xrmax < qr(k,j,i) * hyrho(k) )  THEN
    426                       nr(k,j,i) = qr(k,j,i) * hyrho(k) / xrmax
     428                      nr(k,j,i) = qr(k,j,i) * hyrho(k) / xrmax *               &
     429                                       MERGE( 1.0_wp, 0.0_wp,                  &           
     430                                              BTEST( wall_flags_0(k,j,i), 0 ) )
    427431                   ENDIF
    428432                ENDIF
     
    459463
    460464       USE indices,                                                            &
    461            ONLY:  nxlg, nxrg, nysg, nyng, nzb_s_inner, nzt
     465           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0
    462466
    463467       USE kinds
     
    472476       REAL(wp)     ::  autocon           !<
    473477       REAL(wp)     ::  dissipation       !<
     478       REAL(wp)     ::  flag              !< flag to mask topography grid points
    474479       REAL(wp)     ::  k_au              !<
    475480       REAL(wp)     ::  l_mix             !<
     
    487492       DO  i = nxlg, nxrg
    488493          DO  j = nysg, nyng
    489              DO  k = nzb_s_inner(j,i)+1, nzt
     494             DO  k = nzb+1, nzt
     495!
     496!--             Predetermine flag to mask topography
     497                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
    490498
    491499                IF ( qc(k,j,i) > eps_sb )  THEN
     
    554562                   autocon = MIN( autocon, qc(k,j,i) / dt_micro )
    555563
    556                    qr(k,j,i) = qr(k,j,i) + autocon * dt_micro
    557                    qc(k,j,i) = qc(k,j,i) - autocon * dt_micro
    558                    nr(k,j,i) = nr(k,j,i) + autocon / x0 * hyrho(k) * dt_micro
     564                   qr(k,j,i) = qr(k,j,i) + autocon * dt_micro * flag
     565                   qc(k,j,i) = qc(k,j,i) - autocon * dt_micro * flag
     566                   nr(k,j,i) = nr(k,j,i) + autocon / x0 * hyrho(k) * dt_micro  &
     567                                                              * flag
    559568
    560569                ENDIF
     
    583592
    584593       USE indices,                                                            &
    585            ONLY:  nxlg, nxrg, nyng, nysg, nzb_s_inner, nzt
     594           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0
    586595
    587596       USE kinds
     
    590599       IMPLICIT NONE
    591600
    592        INTEGER(iwp) ::  i !<
    593        INTEGER(iwp) ::  j !<
    594        INTEGER(iwp) ::  k !<
     601       INTEGER(iwp) ::  i      !<
     602       INTEGER(iwp) ::  j      !<
     603       INTEGER(iwp) ::  k      !<
     604       INTEGER(iwp) ::  k_wall !< topgraphy top index
    595605
    596606       REAL(wp)    ::  dqdt_precip !<
     607       REAL(wp)    ::  flag        !< flag to mask topography grid points
    597608
    598609       DO  i = nxlg, nxrg
    599610          DO  j = nysg, nyng
    600              DO  k = nzb_s_inner(j,i)+1, nzt
     611!
     612!--          Determine vertical index of topography top
     613             k_wall = MAXLOC(                                                  &
     614                          MERGE( 1, 0,                                         &
     615                                 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 )    &
     616                               ), DIM = 1                                      &
     617                            ) - 1
     618             DO  k = nzb+1, nzt
     619!
     620!--             Predetermine flag to mask topography
     621                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
    601622
    602623                IF ( qc(k,j,i) > ql_crit )  THEN
     
    606627                ENDIF
    607628
    608                 qc(k,j,i) = qc(k,j,i) - dqdt_precip * dt_micro
    609                 q(k,j,i)  = q(k,j,i)  - dqdt_precip * dt_micro
     629                qc(k,j,i) = qc(k,j,i) - dqdt_precip * dt_micro * flag
     630                q(k,j,i)  = q(k,j,i)  - dqdt_precip * dt_micro * flag
    610631                pt(k,j,i) = pt(k,j,i) + dqdt_precip * dt_micro * l_d_cp *      &
    611                                         pt_d_t(k)
     632                                        pt_d_t(k)              * flag
    612633
    613634!
    614635!--             Compute the rain rate (stored on surface grid point)
    615                 prr(nzb_s_inner(j,i),j,i) = prr(nzb_s_inner(j,i),j,i) +        &
    616                                             dqdt_precip * dzw(k)
     636                prr(k_wall,j,i) = prr(k_wall,j,i) + dqdt_precip * dzw(k) * flag
    617637
    618638             ENDDO
     
    643663
    644664       USE indices,                                                            &
    645            ONLY:  nxlg, nxrg, nysg, nyng, nzb_s_inner, nzt
     665           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0
    646666
    647667       USE kinds
     
    654674
    655675       REAL(wp)     ::  accr              !<
     676       REAL(wp)     ::  flag              !< flag to mask topography grid points
    656677       REAL(wp)     ::  k_cr              !<
    657678       REAL(wp)     ::  phi_ac            !<
     
    662683       DO  i = nxlg, nxrg
    663684          DO  j = nysg, nyng
    664              DO  k = nzb_s_inner(j,i)+1, nzt
     685             DO  k = nzb+1, nzt
     686!
     687!--             Predetermine flag to mask topography
     688                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
    665689
    666690                IF ( ( qc(k,j,i) > eps_sb )  .AND.  ( qr(k,j,i) > eps_sb ) )  THEN
     
    690714                   accr = MIN( accr, qc(k,j,i) / dt_micro )
    691715
    692                    qr(k,j,i) = qr(k,j,i) + accr * dt_micro
    693                    qc(k,j,i) = qc(k,j,i) - accr * dt_micro
     716                   qr(k,j,i) = qr(k,j,i) + accr * dt_micro * flag
     717                   qc(k,j,i) = qc(k,j,i) - accr * dt_micro * flag
    694718
    695719                ENDIF
     
    724748
    725749       USE indices,                                                            &
    726            ONLY:  nxlg, nxrg, nysg, nyng, nzb_s_inner, nzt
     750           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0
    727751
    728752       USE kinds
     
    736760       REAL(wp)     ::  breakup           !<
    737761       REAL(wp)     ::  dr                !<
     762       REAL(wp)     ::  flag              !< flag to mask topography grid points
    738763       REAL(wp)     ::  phi_br            !<
    739764       REAL(wp)     ::  selfcoll          !<
     
    743768       DO  i = nxlg, nxrg
    744769          DO  j = nysg, nyng
    745              DO  k = nzb_s_inner(j,i)+1, nzt
     770             DO  k = nzb+1, nzt
     771!
     772!--             Predetermine flag to mask topography
     773                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     774
    746775                IF ( qr(k,j,i) > eps_sb )  THEN
    747776!
     
    763792
    764793                   selfcoll = MAX( breakup - selfcoll, -nr(k,j,i) / dt_micro )
    765                    nr(k,j,i) = nr(k,j,i) + selfcoll * dt_micro
     794                   nr(k,j,i) = nr(k,j,i) + selfcoll * dt_micro * flag
    766795
    767796                ENDIF
     
    796825
    797826       USE indices,                                                            &
    798            ONLY:  nxlg, nxrg, nysg, nyng, nzb_s_inner, nzt
     827           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0
    799828
    800829       USE kinds
     
    812841       REAL(wp)     ::  evap_nr           !<
    813842       REAL(wp)     ::  f_vent            !<
     843       REAL(wp)     ::  flag              !< flag to mask topography grid points
    814844       REAL(wp)     ::  g_evap            !<
    815845       REAL(wp)     ::  lambda_r          !<
     
    828858       DO  i = nxlg, nxrg
    829859          DO  j = nysg, nyng
    830              DO  k = nzb_s_inner(j,i)+1, nzt
     860             DO  k = nzb+1, nzt
     861!
     862!--             Predetermine flag to mask topography
     863                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     864
    831865                IF ( qr(k,j,i) > eps_sb )  THEN
    832866!
     
    916950                                     -nr(k,j,i) / dt_micro )
    917951
    918                       qr(k,j,i) = qr(k,j,i) + evap    * dt_micro
    919                       nr(k,j,i) = nr(k,j,i) + evap_nr * dt_micro
     952                      qr(k,j,i) = qr(k,j,i) + evap    * dt_micro * flag
     953                      nr(k,j,i) = nr(k,j,i) + evap_nr * dt_micro * flag
    920954
    921955                   ENDIF
     
    951985
    952986       USE indices,                                                            &
    953            ONLY:  nxlg, nxrg, nysg, nyng, nzb, nzb_s_inner, nzt
     987           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0
    954988
    955989       USE kinds
     
    965999       INTEGER(iwp) ::  k             !<
    9661000
    967        REAL(wp), DIMENSION(nzb:nzt+1) :: sed_qc !<
     1001       REAL(wp)                       ::  flag   !< flag to mask topography grid points
     1002       REAL(wp), DIMENSION(nzb:nzt+1) ::  sed_qc !<
    9681003
    9691004       CALL cpu_log( log_point_s(59), 'sed_cloud', 'start' )
     
    9731008       DO  i = nxlg, nxrg
    9741009          DO  j = nysg, nyng
    975              DO  k = nzt, nzb_s_inner(j,i)+1, -1
     1010             DO  k = nzt, nzb+1, -1
     1011!
     1012!--             Predetermine flag to mask topography
     1013                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
    9761014
    9771015                IF ( qc(k,j,i) > eps_sb )  THEN
    9781016                   sed_qc(k) = sed_qc_const * nc_const**( -2.0_wp / 3.0_wp ) * &
    979                                ( qc(k,j,i) * hyrho(k) )**( 5.0_wp / 3.0_wp )
     1017                               ( qc(k,j,i) * hyrho(k) )**( 5.0_wp / 3.0_wp ) * &
     1018                                                                           flag
    9801019                ELSE
    9811020                   sed_qc(k) = 0.0_wp
     
    9841023                sed_qc(k) = MIN( sed_qc(k), hyrho(k) * dzu(k+1) * q(k,j,i) /   &
    9851024                                            dt_micro + sed_qc(k+1)             &
    986                                )
     1025                               ) * flag
    9871026
    9881027                q(k,j,i)  = q(k,j,i)  + ( sed_qc(k+1) - sed_qc(k) ) *          &
    989                                         ddzu(k+1) / hyrho(k) * dt_micro
     1028                                        ddzu(k+1) / hyrho(k) * dt_micro * flag
    9901029                qc(k,j,i) = qc(k,j,i) + ( sed_qc(k+1) - sed_qc(k) ) *          &
    991                                         ddzu(k+1) / hyrho(k) * dt_micro
     1030                                        ddzu(k+1) / hyrho(k) * dt_micro * flag
    9921031                pt(k,j,i) = pt(k,j,i) - ( sed_qc(k+1) - sed_qc(k) ) *          &
    9931032                                        ddzu(k+1) / hyrho(k) * l_d_cp *        &
    994                                         pt_d_t(k) * dt_micro
     1033                                        pt_d_t(k) * dt_micro            * flag
    9951034
    9961035!
     
    9981037                IF ( call_microphysics_at_all_substeps )  THEN
    9991038                   prr(k,j,i) = prr(k,j,i) +  sed_qc(k) / hyrho(k)             &
    1000                                 * weight_substep(intermediate_timestep_count)
     1039                                * weight_substep(intermediate_timestep_count)  &
     1040                                * flag
    10011041                ELSE
    1002                    prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k)
     1042                   prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) * flag
    10031043                ENDIF
    10041044
     
    10321072
    10331073       USE indices,                                                            &
    1034            ONLY:  nxlg, nxrg, nysg, nyng, nzb, nzb_s_inner, nzt
     1074           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0
    10351075
    10361076       USE kinds
     
    10391079           ONLY:  weight_substep
    10401080
     1081       USE surface_mod,                                                        &
     1082           ONLY :  bc_h
     1083       
    10411084       IMPLICIT NONE
    10421085
    1043        INTEGER(iwp) ::  i                          !<
    1044        INTEGER(iwp) ::  j                          !<
    1045        INTEGER(iwp) ::  k                          !<
    1046        INTEGER(iwp) ::  k_run                      !<
     1086       INTEGER(iwp) ::  i             !< running index x direction
     1087       INTEGER(iwp) ::  j             !< running index y direction
     1088       INTEGER(iwp) ::  k             !< running index z direction
     1089       INTEGER(iwp) ::  k_run         !<
     1090       INTEGER(iwp) ::  l             !< running index of surface type
     1091       INTEGER(iwp) ::  m             !< running index surface elements
     1092       INTEGER(iwp) ::  surf_e        !< End index of surface elements at (j,i)-gridpoint
     1093       INTEGER(iwp) ::  surf_s        !< Start index of surface elements at (j,i)-gridpoint
    10471094
    10481095       REAL(wp)     ::  c_run                      !<
     
    10521099       REAL(wp)     ::  dr                         !<
    10531100       REAL(wp)     ::  flux                       !<
     1101       REAL(wp)     ::  flag                       !< flag to mask topography grid points
    10541102       REAL(wp)     ::  lambda_r                   !<
    10551103       REAL(wp)     ::  mu_r                       !<
     
    10711119       DO  i = nxlg, nxrg
    10721120          DO  j = nysg, nyng
    1073              DO  k = nzb_s_inner(j,i)+1, nzt
     1121             DO  k = nzb+1, nzt
     1122!
     1123!--             Predetermine flag to mask topography
     1124                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     1125
    10741126                IF ( qr(k,j,i) > eps_sb )  THEN
    10751127!
     
    10931145                                                  ( mu_r + 1.0_wp ) )          &
    10941146                                              )                                &
    1095                                 )
     1147                                ) * flag
    10961148
    10971149                   w_qr(k) = MAX( 0.1_wp, MIN( 20.0_wp,                        &
     
    11011153                                                  ( mu_r + 4.0_wp ) )          &
    11021154                                             )                                 &
    1103                                 )
     1155                                ) * flag
    11041156                ELSE
    11051157                   w_nr(k) = 0.0_wp
     
    11081160             ENDDO
    11091161!
    1110 !--          Adjust boundary values
    1111              w_nr(nzb_s_inner(j,i)) = w_nr(nzb_s_inner(j,i)+1)
    1112              w_qr(nzb_s_inner(j,i)) = w_qr(nzb_s_inner(j,i)+1)
     1162!--          Adjust boundary values using surface data type.
     1163!--          Upward-facing
     1164             surf_s = bc_h(0)%start_index(j,i)   
     1165             surf_e = bc_h(0)%end_index(j,i)
     1166             DO  m = surf_s, surf_e
     1167                k         = bc_h(0)%k(m)
     1168                w_nr(k-1) = w_nr(k)
     1169                w_qr(k-1) = w_qr(k)
     1170             ENDDO
     1171!
     1172!--          Downward-facing
     1173             surf_s = bc_h(1)%start_index(j,i)   
     1174             surf_e = bc_h(1)%end_index(j,i)
     1175             DO  m = surf_s, surf_e
     1176                k         = bc_h(1)%k(m)
     1177                w_nr(k+1) = w_nr(k)
     1178                w_qr(k+1) = w_qr(k)
     1179             ENDDO
     1180!
     1181!--          Model top boundary value
    11131182             w_nr(nzt+1) = 0.0_wp
    11141183             w_qr(nzt+1) = 0.0_wp
    11151184!
    11161185!--          Compute Courant number
    1117              DO  k = nzb_s_inner(j,i)+1, nzt
     1186             DO  k = nzb+1, nzt
     1187!
     1188!--             Predetermine flag to mask topography
     1189                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     1190
    11181191                c_nr(k) = 0.25_wp * ( w_nr(k-1) +                              &
    11191192                                      2.0_wp * w_nr(k) + w_nr(k+1) ) *         &
    1120                           dt_micro * ddzu(k)
     1193                          dt_micro * ddzu(k) * flag
    11211194                c_qr(k) = 0.25_wp * ( w_qr(k-1) +                              &
    11221195                                      2.0_wp * w_qr(k) + w_qr(k+1) ) *         &
    1123                           dt_micro * ddzu(k)
     1196                          dt_micro * ddzu(k) * flag
    11241197             ENDDO
    11251198!
     
    11271200             IF ( limiter_sedimentation )  THEN
    11281201
    1129                 DO k = nzb_s_inner(j,i)+1, nzt
     1202                DO k = nzb+1, nzt
     1203!
     1204!--                Predetermine flag to mask topography
     1205                   flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     1206
    11301207                   d_mean = 0.5_wp * ( qr(k+1,j,i) - qr(k-1,j,i) )
    11311208                   d_min  = qr(k,j,i) - MIN( qr(k+1,j,i), qr(k,j,i), qr(k-1,j,i) )
     
    11341211                   qr_slope(k) = SIGN(1.0_wp, d_mean) * MIN ( 2.0_wp * d_min,  &
    11351212                                                              2.0_wp * d_max,  &
    1136                                                               ABS( d_mean ) )
     1213                                                              ABS( d_mean ) )  &
     1214                                                      * flag
    11371215
    11381216                   d_mean = 0.5_wp * ( nr(k+1,j,i) - nr(k-1,j,i) )
     
    11561234!
    11571235!--          Compute sedimentation flux
    1158              DO  k = nzt, nzb_s_inner(j,i)+1, -1
    1159 !
    1160 !--             Sum up all rain drop number densities which contribute to the flux
     1236             DO  k = nzt, nzb+1, -1
     1237!
     1238!--             Predetermine flag to mask topography
     1239                flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     1240!
     1241!--             Sum up all rain drop number densities which contribute to the flux
    11611242!--             through k-1/2
    11621243                flux  = 0.0_wp
     
    11671248                   flux  = flux + hyrho(k_run) *                               &
    11681249                           ( nr(k_run,j,i) + nr_slope(k_run) *                 &
    1169                            ( 1.0_wp - c_run ) * 0.5_wp ) * c_run * dzu(k_run)
    1170                    z_run = z_run + dzu(k_run)
    1171                    k_run = k_run + 1
    1172                    c_run = MIN( 1.0_wp, c_nr(k_run) - z_run * ddzu(k_run) )
     1250                           ( 1.0_wp - c_run ) * 0.5_wp ) * c_run * dzu(k_run)  &
     1251                                              * flag
     1252                   z_run = z_run + dzu(k_run) * flag
     1253                   k_run = k_run + 1          * flag
     1254                   c_run = MIN( 1.0_wp, c_nr(k_run) - z_run * ddzu(k_run) )    &
     1255                                              * flag
    11731256                ENDDO
    11741257!
     
    11801263                          )
    11811264
    1182                 sed_nr(k) = flux / dt_micro
     1265                sed_nr(k) = flux / dt_micro * flag
    11831266                nr(k,j,i) = nr(k,j,i) + ( sed_nr(k+1) - sed_nr(k) ) *          &
    1184                                         ddzu(k+1) / hyrho(k) * dt_micro
     1267                                        ddzu(k+1) / hyrho(k) * dt_micro * flag
    11851268!
    11861269!--             Sum up all rain water content which contributes to the flux
     
    11951278                   flux  = flux + hyrho(k_run) * ( qr(k_run,j,i) +             &
    11961279                                  qr_slope(k_run) * ( 1.0_wp - c_run ) *       &
    1197                                   0.5_wp ) * c_run * dzu(k_run)
    1198                    z_run = z_run + dzu(k_run)
    1199                    k_run = k_run + 1
    1200                    c_run = MIN( 1.0_wp, c_qr(k_run) - z_run * ddzu(k_run) )
     1280                                  0.5_wp ) * c_run * dzu(k_run) * flag
     1281                   z_run = z_run + dzu(k_run)                   * flag
     1282                   k_run = k_run + 1                            * flag
     1283                   c_run = MIN( 1.0_wp, c_qr(k_run) - z_run * ddzu(k_run) )    &
     1284                                                                * flag
    12011285
    12021286                ENDDO
     
    12091293                          )
    12101294
    1211                 sed_qr(k) = flux / dt_micro
     1295                sed_qr(k) = flux / dt_micro * flag
    12121296
    12131297                qr(k,j,i) = qr(k,j,i) + ( sed_qr(k+1) - sed_qr(k) ) *          &
    1214                                         ddzu(k+1) / hyrho(k) * dt_micro
     1298                                        ddzu(k+1) / hyrho(k) * dt_micro * flag
    12151299                q(k,j,i)  = q(k,j,i)  + ( sed_qr(k+1) - sed_qr(k) ) *          &
    1216                                         ddzu(k+1) / hyrho(k) * dt_micro
     1300                                        ddzu(k+1) / hyrho(k) * dt_micro * flag
    12171301                pt(k,j,i) = pt(k,j,i) - ( sed_qr(k+1) - sed_qr(k) ) *          &
    12181302                                        ddzu(k+1) / hyrho(k) * l_d_cp *        &
    1219                                         pt_d_t(k) * dt_micro
     1303                                        pt_d_t(k) * dt_micro            * flag
    12201304!
    12211305!--             Compute the rain rate
    12221306                IF ( call_microphysics_at_all_substeps )  THEN
    12231307                   prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k)             &
    1224                                 * weight_substep(intermediate_timestep_count)
     1308                                * weight_substep(intermediate_timestep_count) &
     1309                                * flag
    12251310                ELSE
    1226                    prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k)
     1311                   prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k) * flag
    12271312                ENDIF
    12281313
     
    12561341
    12571342       USE indices,                                                            &
    1258            ONLY:  nxl, nxr, nys, nyn, nzb_s_inner
     1343           ONLY:  nxl, nxr, nys, nyn, nzb, nzt, wall_flags_0
    12591344
    12601345       USE kinds
    12611346
     1347       USE surface_mod,                                                        &
     1348           ONLY :  bc_h
     1349
    12621350       IMPLICIT NONE
    12631351
    1264        INTEGER(iwp) ::  i                          !:
    1265        INTEGER(iwp) ::  j                          !:
    1266 
     1352       INTEGER(iwp) ::  i             !< running index x direction
     1353       INTEGER(iwp) ::  j             !< running index y direction
     1354       INTEGER(iwp) ::  k             !< running index y direction
     1355       INTEGER(iwp) ::  m             !< running index surface elements
     1356       INTEGER(iwp) ::  surf_e        !< End index of surface elements at (j,i)-gridpoint
     1357       INTEGER(iwp) ::  surf_s        !< Start index of surface elements at (j,i)-gridpoint
    12671358
    12681359       IF ( ( dt_do2d_xy - time_do2d_xy ) < precipitation_amount_interval .AND.&
     
    12701361            intermediate_timestep_count == intermediate_timestep_count_max ) ) &
    12711362       THEN
    1272 
    1273           DO  i = nxl, nxr
    1274              DO  j = nys, nyn
    1275 
    1276                 precipitation_amount(j,i) = precipitation_amount(j,i) +        &
    1277                                             prr(nzb_s_inner(j,i)+1,j,i) *      &
    1278                                             hyrho(nzb_s_inner(j,i)+1) * dt_3d
    1279 
    1280              ENDDO
     1363!
     1364!--       Run over all upward-facing surface elements, i.e. non-natural,
     1365!--       natural and urban
     1366          DO  m = 1, bc_h(0)%ns
     1367             i = bc_h(0)%i(m)           
     1368             j = bc_h(0)%j(m)
     1369             k = bc_h(0)%k(m)
     1370             precipitation_amount(j,i) = precipitation_amount(j,i) +           &
     1371                                               prr(k,j,i) * hyrho(k) * dt_3d
    12811372          ENDDO
     1373
    12821374       ENDIF
    12831375
     
    14101502
    14111503       USE indices,                                                            &
    1412            ONLY:  nzb_s_inner, nzt
     1504           ONLY:  nzb, nzt, wall_flags_0
    14131505
    14141506       USE kinds
     
    14201512       INTEGER(iwp) ::  k                 !<
    14211513
    1422        DO  k = nzb_s_inner(j,i)+1, nzt
     1514       REAL(wp) ::  flag                  !< flag to indicate first grid level above surface
     1515
     1516       DO  k = nzb+1, nzt
     1517!
     1518!--       Predetermine flag to mask topography
     1519          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
    14231520
    14241521          IF ( qr_1d(k) <= eps_sb )  THEN
     
    14311528!--          too big weights of rain drops (Stevens and Seifert, 2008).
    14321529             IF ( nr_1d(k) * xrmin > qr_1d(k) * hyrho(k) )  THEN
    1433                 nr_1d(k) = qr_1d(k) * hyrho(k) / xrmin
     1530                nr_1d(k) = qr_1d(k) * hyrho(k) / xrmin * flag
    14341531             ELSEIF ( nr_1d(k) * xrmax < qr_1d(k) * hyrho(k) )  THEN
    1435                 nr_1d(k) = qr_1d(k) * hyrho(k) / xrmax
     1532                nr_1d(k) = qr_1d(k) * hyrho(k) / xrmax * flag
    14361533             ENDIF
    14371534
     
    14631560
    14641561       USE indices,                                                            &
    1465            ONLY:  nzb_s_inner, nzt
     1562           ONLY:  nzb, nzt, wall_flags_0
    14661563
    14671564       USE kinds
     
    14761573       REAL(wp)     ::  autocon           !<
    14771574       REAL(wp)     ::  dissipation       !<
     1575       REAL(wp)     ::  flag              !< flag to indicate first grid level above surface
    14781576       REAL(wp)     ::  k_au              !<
    14791577       REAL(wp)     ::  l_mix             !<
     
    14871585       REAL(wp)     ::  xc                !<
    14881586
    1489        DO  k = nzb_s_inner(j,i)+1, nzt
     1587       DO  k = nzb+1, nzt
     1588!
     1589!--       Predetermine flag to mask topography
     1590          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
    14901591
    14911592          IF ( qc_1d(k) > eps_sb )  THEN
     
    15511652             autocon = MIN( autocon, qc_1d(k) / dt_micro )
    15521653
    1553              qr_1d(k) = qr_1d(k) + autocon * dt_micro
    1554              qc_1d(k) = qc_1d(k) - autocon * dt_micro
    1555              nr_1d(k) = nr_1d(k) + autocon / x0 * hyrho(k) * dt_micro
     1654             qr_1d(k) = qr_1d(k) + autocon * dt_micro                 * flag
     1655             qc_1d(k) = qc_1d(k) - autocon * dt_micro                 * flag
     1656             nr_1d(k) = nr_1d(k) + autocon / x0 * hyrho(k) * dt_micro * flag
    15561657
    15571658          ENDIF
     
    15751676
    15761677       USE indices,                                                            &
    1577            ONLY:  nzb_s_inner, nzt
     1678           ONLY:  nzb, nzb_max, nzt, wall_flags_0
    15781679
    15791680       USE kinds
     
    15821683       IMPLICIT NONE
    15831684
    1584        INTEGER(iwp) ::  i !<
    1585        INTEGER(iwp) ::  j !<
    1586        INTEGER(iwp) ::  k !<
     1685       INTEGER(iwp) ::  i      !<
     1686       INTEGER(iwp) ::  j      !<
     1687       INTEGER(iwp) ::  k      !<
     1688       INTEGER(iwp) ::  k_wall !< topography top index
    15871689
    15881690       REAL(wp)    ::  dqdt_precip !<
    1589 
    1590        DO  k = nzb_s_inner(j,i)+1, nzt
     1691       REAL(wp)    ::  flag              !< flag to indicate first grid level above surface
     1692
     1693!
     1694!--    Determine vertical index of topography top
     1695       k_wall = MAXLOC(                                                        &
     1696                        MERGE( 1, 0,                                           &
     1697                               BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 )      &
     1698                             ), DIM = 1                                        &
     1699                      ) - 1
     1700       DO  k = nzb+1, nzt
     1701!
     1702!--       Predetermine flag to mask topography
     1703          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
    15911704
    15921705          IF ( qc_1d(k) > ql_crit )  THEN
     
    15961709          ENDIF
    15971710
    1598           qc_1d(k) = qc_1d(k) - dqdt_precip * dt_micro
    1599           q_1d(k)  = q_1d(k)  - dqdt_precip * dt_micro
    1600           pt_1d(k) = pt_1d(k) + dqdt_precip * dt_micro * l_d_cp * pt_d_t(k)
     1711          qc_1d(k) = qc_1d(k) - dqdt_precip * dt_micro * flag
     1712          q_1d(k)  = q_1d(k)  - dqdt_precip * dt_micro * flag
     1713          pt_1d(k) = pt_1d(k) + dqdt_precip * dt_micro * l_d_cp * pt_d_t(k) * flag
    16011714
    16021715!
    16031716!--       Compute the rain rate (stored on surface grid point)
    1604           prr(nzb_s_inner(j,i),j,i) = prr(nzb_s_inner(j,i),j,i) +              &
    1605                                       dqdt_precip * dzw(k)
     1717          prr(k_wall,j,i) = prr(k_wall,j,i) + dqdt_precip * dzw(k) * flag
    16061718
    16071719       ENDDO
     
    16261738
    16271739       USE indices,                                                            &
    1628            ONLY:  nzb_s_inner, nzt
     1740           ONLY:  nzb, nzt, wall_flags_0
    16291741
    16301742       USE kinds
     
    16371749
    16381750       REAL(wp)     ::  accr              !<
     1751       REAL(wp)     ::  flag              !< flag to indicate first grid level above surface
    16391752       REAL(wp)     ::  k_cr              !<
    16401753       REAL(wp)     ::  phi_ac            !<
    16411754       REAL(wp)     ::  tau_cloud         !<
    16421755
    1643        DO  k = nzb_s_inner(j,i)+1, nzt
     1756       DO  k = nzb+1, nzt
     1757!
     1758!--       Predetermine flag to mask topography
     1759          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     1760
    16441761          IF ( ( qc_1d(k) > eps_sb )  .AND.  ( qr_1d(k) > eps_sb ) )  THEN
    16451762!
     
    16671784             accr = MIN( accr, qc_1d(k) / dt_micro )
    16681785
    1669              qr_1d(k) = qr_1d(k) + accr * dt_micro
    1670              qc_1d(k) = qc_1d(k) - accr * dt_micro
     1786             qr_1d(k) = qr_1d(k) + accr * dt_micro * flag
     1787             qc_1d(k) = qc_1d(k) - accr * dt_micro * flag
    16711788
    16721789          ENDIF
     
    16911808
    16921809       USE indices,                                                            &
    1693            ONLY:  nzb_s_inner, nzt
     1810           ONLY:  nzb, nzt, wall_flags_0
    16941811
    16951812       USE kinds
     
    17031820       REAL(wp)     ::  breakup           !<
    17041821       REAL(wp)     ::  dr                !<
     1822       REAL(wp)     ::  flag              !< flag to indicate first grid level above surface
    17051823       REAL(wp)     ::  phi_br            !<
    17061824       REAL(wp)     ::  selfcoll          !<
    17071825
    1708        DO  k = nzb_s_inner(j,i)+1, nzt
     1826       DO  k = nzb+1, nzt
     1827!
     1828!--       Predetermine flag to mask topography
     1829          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     1830
    17091831          IF ( qr_1d(k) > eps_sb )  THEN
    17101832!
     
    17241846
    17251847             selfcoll = MAX( breakup - selfcoll, -nr_1d(k) / dt_micro )
    1726              nr_1d(k) = nr_1d(k) + selfcoll * dt_micro
     1848             nr_1d(k) = nr_1d(k) + selfcoll * dt_micro * flag
    17271849
    17281850          ENDIF
     
    17501872
    17511873       USE indices,                                                            &
    1752            ONLY:  nzb_s_inner, nzt
     1874           ONLY:  nzb, nzt, wall_flags_0
    17531875
    17541876       USE kinds
     
    17661888       REAL(wp)     ::  evap_nr           !<
    17671889       REAL(wp)     ::  f_vent            !<
     1890       REAL(wp)     ::  flag              !< flag to indicate first grid level above surface
    17681891       REAL(wp)     ::  g_evap            !<
    17691892       REAL(wp)     ::  lambda_r          !<
     
    17781901       REAL(wp)     ::  xr                !<
    17791902
    1780        DO  k = nzb_s_inner(j,i)+1, nzt
     1903       DO  k = nzb+1, nzt
     1904!
     1905!--       Predetermine flag to mask topography
     1906          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     1907
    17811908          IF ( qr_1d(k) > eps_sb )  THEN
    17821909!
     
    18621989                               -nr_1d(k) / dt_micro )
    18631990
    1864                 qr_1d(k) = qr_1d(k) + evap    * dt_micro
    1865                 nr_1d(k) = nr_1d(k) + evap_nr * dt_micro
     1991                qr_1d(k) = qr_1d(k) + evap    * dt_micro * flag
     1992                nr_1d(k) = nr_1d(k) + evap_nr * dt_micro * flag
    18661993
    18671994             ENDIF
     
    18912018
    18922019       USE indices,                                                            &
    1893            ONLY:  nzb, nzb_s_inner, nzt
     2020           ONLY:  nzb, nzb, nzt, wall_flags_0
    18942021
    18952022       USE kinds
     
    19042031       INTEGER(iwp) ::  k             !<
    19052032
    1906        REAL(wp), DIMENSION(nzb:nzt+1) :: sed_qc  !<
     2033       REAL(wp)                       ::  flag    !< flag to indicate first grid level above surface
     2034       REAL(wp), DIMENSION(nzb:nzt+1) ::  sed_qc  !<
    19072035
    19082036       sed_qc(nzt+1) = 0.0_wp
    19092037
    1910        DO  k = nzt, nzb_s_inner(j,i)+1, -1
     2038       DO  k = nzt, nzb+1, -1
     2039!
     2040!--       Predetermine flag to mask topography
     2041          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     2042
    19112043          IF ( qc_1d(k) > eps_sb )  THEN
    19122044             sed_qc(k) = sed_qc_const * nc_1d(k)**( -2.0_wp / 3.0_wp ) *       &
    1913                          ( qc_1d(k) * hyrho(k) )**( 5.0_wp / 3.0_wp )
     2045                         ( qc_1d(k) * hyrho(k) )**( 5.0_wp / 3.0_wp )  * flag
    19142046          ELSE
    19152047             sed_qc(k) = 0.0_wp
     
    19182050          sed_qc(k) = MIN( sed_qc(k), hyrho(k) * dzu(k+1) * q_1d(k) /          &
    19192051                                      dt_micro + sed_qc(k+1)                   &
    1920                          )
     2052                         ) * flag
    19212053
    19222054          q_1d(k)  = q_1d(k)  + ( sed_qc(k+1) - sed_qc(k) ) * ddzu(k+1) /      &
    1923                                 hyrho(k) * dt_micro
     2055                                hyrho(k) * dt_micro * flag
    19242056          qc_1d(k) = qc_1d(k) + ( sed_qc(k+1) - sed_qc(k) ) * ddzu(k+1) /      &
    1925                                 hyrho(k) * dt_micro
     2057                                hyrho(k) * dt_micro * flag
    19262058          pt_1d(k) = pt_1d(k) - ( sed_qc(k+1) - sed_qc(k) ) * ddzu(k+1) /      &
    1927                                 hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro
     2059                                hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro * flag
    19282060
    19292061!
    19302062!--       Compute the precipitation rate of cloud (fog) droplets
    19312063          IF ( call_microphysics_at_all_substeps )  THEN
    1932              prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) *               &
    1933                              weight_substep(intermediate_timestep_count)
     2064             prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) *                  &
     2065                              weight_substep(intermediate_timestep_count) * flag
    19342066          ELSE
    1935              prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k)
     2067             prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) * flag
    19362068          ENDIF
    19372069
     
    19592091
    19602092       USE indices,                                                            &
    1961            ONLY:  nzb, nzb_s_inner, nzt
     2093           ONLY:  nzb, nzb, nzt, wall_flags_0
    19622094
    19632095       USE kinds
     
    19662098           ONLY:  weight_substep
    19672099
     2100       USE surface_mod,                                                        &
     2101           ONLY :  bc_h
     2102       
    19682103       IMPLICIT NONE
    19692104
    1970        INTEGER(iwp) ::  i                          !<
    1971        INTEGER(iwp) ::  j                          !<
    1972        INTEGER(iwp) ::  k                          !<
    1973        INTEGER(iwp) ::  k_run                      !<
     2105       INTEGER(iwp) ::  i             !< running index x direction
     2106       INTEGER(iwp) ::  j             !< running index y direction
     2107       INTEGER(iwp) ::  k             !< running index z direction
     2108       INTEGER(iwp) ::  k_run         !<
     2109       INTEGER(iwp) ::  m             !< running index surface elements
     2110       INTEGER(iwp) ::  surf_e        !< End index of surface elements at (j,i)-gridpoint
     2111       INTEGER(iwp) ::  surf_s        !< Start index of surface elements at (j,i)-gridpoint
    19742112
    19752113       REAL(wp)     ::  c_run                      !<
     
    19792117       REAL(wp)     ::  dr                         !<
    19802118       REAL(wp)     ::  flux                       !<
     2119       REAL(wp)     ::  flag                       !< flag to indicate first grid level above surface
    19812120       REAL(wp)     ::  lambda_r                   !<
    19822121       REAL(wp)     ::  mu_r                       !<
     
    19942133!
    19952134!--    Compute velocities
    1996        DO  k = nzb_s_inner(j,i)+1, nzt
     2135       DO  k = nzb+1, nzt
     2136!
     2137!--       Predetermine flag to mask topography
     2138          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     2139
    19972140          IF ( qr_1d(k) > eps_sb )  THEN
    19982141!
     
    20132156                                            ( mu_r + 1.0_wp ) )                &
    20142157                                        )                                      &
    2015                           )
     2158                          ) * flag
    20162159             w_qr(k) = MAX( 0.1_wp, MIN( 20.0_wp,                              &
    20172160                                         a_term - b_term * ( 1.0_wp +          &
     
    20192162                                            ( mu_r + 4.0_wp ) )                &
    20202163                                       )                                       &
    2021                           )
     2164                          ) * flag
    20222165          ELSE
    20232166             w_nr(k) = 0.0_wp
     
    20262169       ENDDO
    20272170!
    2028 !--    Adjust boundary values
    2029        w_nr(nzb_s_inner(j,i)) = w_nr(nzb_s_inner(j,i)+1)
    2030        w_qr(nzb_s_inner(j,i)) = w_qr(nzb_s_inner(j,i)+1)
     2171!--    Adjust boundary values using surface data type.
     2172!--    Upward facing non-natural
     2173       surf_s = bc_h(0)%start_index(j,i)   
     2174       surf_e = bc_h(0)%end_index(j,i)
     2175       DO  m = surf_s, surf_e
     2176          k         = bc_h(0)%k(m)
     2177          w_nr(k-1) = w_nr(k)
     2178          w_qr(k-1) = w_qr(k)
     2179       ENDDO
     2180!
     2181!--    Downward facing non-natural
     2182       surf_s = bc_h(1)%start_index(j,i)   
     2183       surf_e = bc_h(1)%end_index(j,i)
     2184       DO  m = surf_s, surf_e
     2185          k         = bc_h(1)%k(m)
     2186          w_nr(k+1) = w_nr(k)
     2187          w_qr(k+1) = w_qr(k)
     2188       ENDDO
     2189!
     2190!--    Neumann boundary condition at model top
    20312191       w_nr(nzt+1) = 0.0_wp
    20322192       w_qr(nzt+1) = 0.0_wp
    20332193!
    20342194!--    Compute Courant number
    2035        DO  k = nzb_s_inner(j,i)+1, nzt
     2195       DO  k = nzb+1, nzt
     2196!
     2197!--       Predetermine flag to mask topography
     2198          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     2199
    20362200          c_nr(k) = 0.25_wp * ( w_nr(k-1) + 2.0_wp * w_nr(k) + w_nr(k+1) ) *   &
    2037                     dt_micro * ddzu(k)
     2201                    dt_micro * ddzu(k) * flag
    20382202          c_qr(k) = 0.25_wp * ( w_qr(k-1) + 2.0_wp * w_qr(k) + w_qr(k+1) ) *   &
    2039                     dt_micro * ddzu(k)
     2203                    dt_micro * ddzu(k) * flag
    20402204       ENDDO
    20412205!
     
    20432207       IF ( limiter_sedimentation )  THEN
    20442208
    2045           DO k = nzb_s_inner(j,i)+1, nzt
     2209          DO k = nzb+1, nzt
     2210!
     2211!--          Predetermine flag to mask topography
     2212             flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     2213
    20462214             d_mean = 0.5_wp * ( qr_1d(k+1) - qr_1d(k-1) )
    20472215             d_min  = qr_1d(k) - MIN( qr_1d(k+1), qr_1d(k), qr_1d(k-1) )
     
    20502218             qr_slope(k) = SIGN(1.0_wp, d_mean) * MIN ( 2.0_wp * d_min,        &
    20512219                                                        2.0_wp * d_max,        &
    2052                                                         ABS( d_mean ) )
     2220                                                        ABS( d_mean ) ) * flag
    20532221
    20542222             d_mean = 0.5_wp * ( nr_1d(k+1) - nr_1d(k-1) )
     
    20582226             nr_slope(k) = SIGN(1.0_wp, d_mean) * MIN ( 2.0_wp * d_min,        &
    20592227                                                        2.0_wp * d_max,        &
    2060                                                         ABS( d_mean ) )
     2228                                                        ABS( d_mean ) ) * flag
    20612229          ENDDO
    20622230
     
    20722240!
    20732241!--    Compute sedimentation flux
    2074        DO  k = nzt, nzb_s_inner(j,i)+1, -1
    2075 !
    2076 !--       Sum up all rain drop number densities which contribute to the flux
     2242       DO  k = nzt, nzb+1, -1
     2243!
     2244!--       Predetermine flag to mask topography
     2245          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     2246!
     2247!--       Sum up all rain drop number densities which contribute to the flux
    20772248!--       through k-1/2
    20782249          flux  = 0.0_wp
     
    20832254             flux  = flux + hyrho(k_run) *                                     &
    20842255                     ( nr_1d(k_run) + nr_slope(k_run) * ( 1.0_wp - c_run ) *   &
    2085                      0.5_wp ) * c_run * dzu(k_run)
    2086              z_run = z_run + dzu(k_run)
    2087              k_run = k_run + 1
    2088              c_run = MIN( 1.0_wp, c_nr(k_run) - z_run * ddzu(k_run) )
     2256                     0.5_wp ) * c_run * dzu(k_run) * flag
     2257             z_run = z_run + dzu(k_run)            * flag
     2258             k_run = k_run + 1                     * flag
     2259             c_run = MIN( 1.0_wp, c_nr(k_run) - z_run * ddzu(k_run) ) * flag
    20892260          ENDDO
    20902261!
     
    20942265                      hyrho(k) * dzu(k+1) * nr_1d(k) + sed_nr(k+1) * dt_micro )
    20952266
    2096           sed_nr(k) = flux / dt_micro
     2267          sed_nr(k) = flux / dt_micro * flag
    20972268          nr_1d(k)  = nr_1d(k) + ( sed_nr(k+1) - sed_nr(k) ) * ddzu(k+1) /     &
    2098                                     hyrho(k) * dt_micro
     2269                                    hyrho(k) * dt_micro * flag
    20992270!
    21002271!--       Sum up all rain water content which contributes to the flux
     
    21092280             flux  = flux + hyrho(k_run) *                                     &
    21102281                     ( qr_1d(k_run) + qr_slope(k_run) * ( 1.0_wp - c_run ) *   &
    2111                      0.5_wp ) * c_run * dzu(k_run)
    2112              z_run = z_run + dzu(k_run)
    2113              k_run = k_run + 1
    2114              c_run = MIN( 1.0_wp, c_qr(k_run) - z_run * ddzu(k_run) )
     2282                     0.5_wp ) * c_run * dzu(k_run) * flag
     2283             z_run = z_run + dzu(k_run)            * flag
     2284             k_run = k_run + 1                     * flag
     2285             c_run = MIN( 1.0_wp, c_qr(k_run) - z_run * ddzu(k_run) ) * flag
    21152286
    21162287          ENDDO
     
    21202291                      hyrho(k) * dzu(k) * qr_1d(k) + sed_qr(k+1) * dt_micro )
    21212292
    2122           sed_qr(k) = flux / dt_micro
     2293          sed_qr(k) = flux / dt_micro * flag
    21232294
    21242295          qr_1d(k) = qr_1d(k) + ( sed_qr(k+1) - sed_qr(k) ) * ddzu(k+1) /      &
    2125                                 hyrho(k) * dt_micro
     2296                                hyrho(k) * dt_micro * flag
    21262297          q_1d(k)  = q_1d(k)  + ( sed_qr(k+1) - sed_qr(k) ) * ddzu(k+1) /      &
    2127                                 hyrho(k) * dt_micro
     2298                                hyrho(k) * dt_micro * flag
    21282299          pt_1d(k) = pt_1d(k) - ( sed_qr(k+1) - sed_qr(k) ) * ddzu(k+1) /      &
    2129                                 hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro
     2300                                hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro * flag
    21302301!
    21312302!--       Compute the rain rate
    21322303          IF ( call_microphysics_at_all_substeps )  THEN
    21332304             prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k)                    &
    2134                           * weight_substep(intermediate_timestep_count)
     2305                          * weight_substep(intermediate_timestep_count) * flag
    21352306          ELSE
    2136              prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k)
     2307             prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k) * flag
    21372308          ENDIF
    21382309
     
    21622333
    21632334       USE indices,                                                            &
    2164            ONLY:  nzb_s_inner
     2335           ONLY:  nzb, nzt, wall_flags_0
    21652336
    21662337       USE kinds
    21672338
     2339       USE surface_mod,                                                        &
     2340           ONLY :  bc_h
     2341
    21682342       IMPLICIT NONE
    21692343
    2170        INTEGER(iwp) ::  i                          !:
    2171        INTEGER(iwp) ::  j                          !:
    2172 
     2344       INTEGER(iwp) ::  i             !< running index x direction
     2345       INTEGER(iwp) ::  j             !< running index y direction
     2346       INTEGER(iwp) ::  k             !< running index z direction
     2347       INTEGER(iwp) ::  m             !< running index surface elements
     2348       INTEGER(iwp) ::  surf_e        !< End index of surface elements at (j,i)-gridpoint
     2349       INTEGER(iwp) ::  surf_s        !< Start index of surface elements at (j,i)-gridpoint
    21732350
    21742351       IF ( ( dt_do2d_xy - time_do2d_xy ) < precipitation_amount_interval .AND.&
     
    21772354       THEN
    21782355
    2179           precipitation_amount(j,i) = precipitation_amount(j,i) +              &
    2180                                       prr(nzb_s_inner(j,i)+1,j,i) *            &
    2181                                       hyrho(nzb_s_inner(j,i)+1) * dt_3d
     2356          surf_s = bc_h(0)%start_index(j,i)   
     2357          surf_e = bc_h(0)%end_index(j,i)
     2358          DO  m = surf_s, surf_e
     2359             k                         = bc_h(0)%k(m)
     2360             precipitation_amount(j,i) = precipitation_amount(j,i) +           &
     2361                                               prr(k,j,i) * hyrho(k) * dt_3d
     2362          ENDDO
     2363
    21822364       ENDIF
    21832365
Note: See TracChangeset for help on using the changeset viewer.