Ignore:
Timestamp:
Mar 26, 2013 6:16:16 PM (11 years ago)
Author:
hoffmann
Message:

optimization of two-moments cloud physics

File:
1 edited

Legend:

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

    r1107 r1115  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! microphyical tendencies are calculated in microphysics_control in an optimized
     23! way; unrealistic values are prevented; bugfix in evaporation; some reformatting
    2324!
    2425! Former revisions:
     
    3536! 1065 2012-11-22 17:42:36Z hoffmann
    3637! Sedimentation process implemented according to Stevens and Seifert (2008).
    37 ! Turbulence effects on autoconversion and accretion added (Seifert, Nuijens 
     38! Turbulence effects on autoconversion and accretion added (Seifert, Nuijens
    3839! and Stevens, 2010).
    3940!
     
    4849
    4950    PRIVATE
    50     PUBLIC dsd_properties, autoconversion, accretion, selfcollection_breakup, &
    51            evaporation_rain, sedimentation_cloud, sedimentation_rain
    52 
    53     INTERFACE dsd_properties
    54        MODULE PROCEDURE dsd_properties
    55        MODULE PROCEDURE dsd_properties_ij
    56     END INTERFACE dsd_properties
     51    PUBLIC microphysics_control
     52
     53    INTERFACE microphysics_control
     54       MODULE PROCEDURE microphysics_control
     55       MODULE PROCEDURE microphysics_control_ij
     56    END INTERFACE microphysics_control
     57
     58    INTERFACE adjust_cloud
     59       MODULE PROCEDURE adjust_cloud
     60       MODULE PROCEDURE adjust_cloud_ij
     61    END INTERFACE adjust_cloud
    5762
    5863    INTERFACE autoconversion
     
    9297! Call for all grid points
    9398!------------------------------------------------------------------------------!
    94     SUBROUTINE dsd_properties
    95 
    96        USE arrays_3d
    97        USE cloud_parameters
    98        USE constants
    99        USE indices
     99    SUBROUTINE microphysics_control
     100
     101       USE arrays_3d
     102       USE control_parameters
     103       USE indices
     104       USE statistics
    100105
    101106       IMPLICIT NONE
     
    106111       DO  i = nxl, nxr
    107112          DO  j = nys, nyn
    108              DO  k = nzb_2d(j,i)+1, nzt
     113             DO  k = nzb_s_inner(j,i)+1, nzt
    109114
    110115             ENDDO
     
    112117       ENDDO
    113118
    114     END SUBROUTINE dsd_properties
    115 
    116 
    117     SUBROUTINE autoconversion
    118 
    119        USE arrays_3d
    120        USE cloud_parameters
    121        USE constants
     119    END SUBROUTINE microphysics_control
     120
     121    SUBROUTINE adjust_cloud
     122
     123       USE arrays_3d
     124       USE cloud_parameters
    122125       USE indices
    123126
     
    129132       DO  i = nxl, nxr
    130133          DO  j = nys, nyn
    131              DO  k = nzb_2d(j,i)+1, nzt
     134             DO  k = nzb_s_inner(j,i)+1, nzt
    132135
    133136             ENDDO
     
    135138       ENDDO
    136139
    137     END SUBROUTINE autoconversion
    138 
    139 
    140     SUBROUTINE accretion
    141 
    142        USE arrays_3d
    143        USE cloud_parameters
    144        USE constants
     140    END SUBROUTINE adjust_cloud
     141
     142
     143    SUBROUTINE autoconversion
     144
     145       USE arrays_3d
     146       USE cloud_parameters
     147       USE control_parameters
     148       USE grid_variables
    145149       USE indices
    146150
     
    152156       DO  i = nxl, nxr
    153157          DO  j = nys, nyn
    154              DO  k = nzb_2d(j,i)+1, nzt
     158             DO  k = nzb_s_inner(j,i)+1, nzt
    155159
    156160             ENDDO
     
    158162       ENDDO
    159163
    160     END SUBROUTINE accretion
    161 
    162 
    163     SUBROUTINE selfcollection_breakup
    164 
    165        USE arrays_3d
    166        USE cloud_parameters
    167        USE constants
     164    END SUBROUTINE autoconversion
     165
     166
     167    SUBROUTINE accretion
     168
     169       USE arrays_3d
     170       USE cloud_parameters
     171       USE control_parameters
    168172       USE indices
    169173
     
    175179       DO  i = nxl, nxr
    176180          DO  j = nys, nyn
    177              DO  k = nzb_2d(j,i)+1, nzt
     181             DO  k = nzb_s_inner(j,i)+1, nzt
    178182
    179183             ENDDO
     
    181185       ENDDO
    182186
    183     END SUBROUTINE selfcollection_breakup
    184 
    185 
    186     SUBROUTINE evaporation_rain
    187 
    188        USE arrays_3d
    189        USE cloud_parameters
    190        USE constants
     187    END SUBROUTINE accretion
     188
     189
     190    SUBROUTINE selfcollection_breakup
     191
     192       USE arrays_3d
     193       USE cloud_parameters
     194       USE control_parameters
    191195       USE indices
    192196
     
    198202       DO  i = nxl, nxr
    199203          DO  j = nys, nyn
    200              DO  k = nzb_2d(j,i)+1, nzt
     204             DO  k = nzb_s_inner(j,i)+1, nzt
    201205
    202206             ENDDO
     
    204208       ENDDO
    205209
    206     END SUBROUTINE evaporation_rain
    207 
    208 
    209     SUBROUTINE sedimentation_cloud
     210    END SUBROUTINE selfcollection_breakup
     211
     212
     213    SUBROUTINE evaporation_rain
    210214
    211215       USE arrays_3d
    212216       USE cloud_parameters
    213217       USE constants
     218       USE control_parameters
    214219       USE indices
    215220
     
    221226       DO  i = nxl, nxr
    222227          DO  j = nys, nyn
    223              DO  k = nzb_2d(j,i)+1, nzt
     228             DO  k = nzb_s_inner(j,i)+1, nzt
    224229
    225230             ENDDO
     
    227232       ENDDO
    228233
    229     END SUBROUTINE sedimentation_cloud
    230 
    231 
    232     SUBROUTINE sedimentation_rain
     234    END SUBROUTINE evaporation_rain
     235
     236
     237    SUBROUTINE sedimentation_cloud
    233238
    234239       USE arrays_3d
    235240       USE cloud_parameters
    236241       USE constants
     242       USE control_parameters
    237243       USE indices
    238244
     
    244250       DO  i = nxl, nxr
    245251          DO  j = nys, nyn
    246              DO  k = nzb_2d(j,i)+1, nzt
     252             DO  k = nzb_s_inner(j,i)+1, nzt
     253
     254             ENDDO
     255          ENDDO
     256       ENDDO
     257
     258    END SUBROUTINE sedimentation_cloud
     259
     260
     261    SUBROUTINE sedimentation_rain
     262
     263       USE arrays_3d
     264       USE cloud_parameters
     265       USE constants
     266       USE control_parameters
     267       USE indices
     268       USE statistics
     269
     270       IMPLICIT NONE
     271
     272       INTEGER ::  i, j, k
     273
     274 
     275       DO  i = nxl, nxr
     276          DO  j = nys, nyn
     277             DO  k = nzb_s_inner(j,i)+1, nzt
    247278
    248279             ENDDO
     
    256287! Call for grid point i,j
    257288!------------------------------------------------------------------------------!
    258     SUBROUTINE dsd_properties_ij( i, j )
    259 
    260        USE arrays_3d
    261        USE cloud_parameters
    262        USE constants
    263        USE indices
    264        USE control_parameters
    265        USE user
    266    
    267        IMPLICIT NONE
    268 
    269        INTEGER ::  i, j, k
    270 
    271        DO  k = nzb_2d(j,i)+1, nzt
     289
     290    SUBROUTINE microphysics_control_ij( i, j )
     291
     292       USE arrays_3d
     293       USE cloud_parameters
     294       USE control_parameters
     295       USE statistics
     296
     297       IMPLICIT NONE
     298
     299       INTEGER ::  i, j
     300
     301       dt_micro = dt_3d * weight_pres(intermediate_timestep_count)
     302!
     303!--    Adjust unrealistic values
     304       IF ( precipitation )  CALL adjust_cloud( i,j )
     305!
     306!--    Use 1-d arrays
     307       q_1d(:)  = q(:,j,i)
     308       pt_1d(:) = pt(:,j,i)
     309       qc_1d(:) = qc(:,j,i)
     310       nc_1d(:) = nc_const
     311       IF ( precipitation )  THEN
     312          qr_1d(:) = qr(:,j,i)
     313          nr_1d(:) = nr(:,j,i)
     314       ENDIF
     315!
     316!--    Compute cloud physics
     317       IF ( precipitation )  THEN
     318          CALL autoconversion( i,j )
     319          CALL accretion( i,j )
     320          CALL selfcollection_breakup( i,j )
     321          CALL evaporation_rain( i,j )
     322          CALL sedimentation_rain( i,j )
     323       ENDIF
     324
     325       IF ( drizzle )  CALL sedimentation_cloud( i,j )
     326!
     327!--    Derive tendencies
     328       tend_q(:,j,i)  = ( q_1d(:) - q(:,j,i) ) / dt_micro
     329       tend_pt(:,j,i) = ( pt_1d(:) - pt(:,j,i) ) / dt_micro
     330       IF ( precipitation )  THEN
     331          tend_qr(:,j,i) = ( qr_1d(:) - qr(:,j,i) ) / dt_micro
     332          tend_nr(:,j,i) = ( nr_1d(:) - nr(:,j,i) ) / dt_micro
     333       ENDIF
     334
     335    END SUBROUTINE microphysics_control_ij
     336
     337    SUBROUTINE adjust_cloud_ij( i, j )
     338
     339       USE arrays_3d
     340       USE cloud_parameters
     341       USE indices
     342
     343       IMPLICIT NONE
     344
     345       INTEGER ::  i, j, k
     346!
     347!--    Adjust number of raindrops to avoid nonlinear effects in
     348!--    sedimentation and evaporation of rain drops due to too small or
     349!--    too big weights of rain drops (Stevens and Seifert, 2008).
     350!--    The same procedure is applied to cloud droplets if they are determined
     351!--    prognostically. 
     352       DO  k = nzb_s_inner(j,i)+1, nzt
    272353
    273354          IF ( qr(k,j,i) <= eps_sb )  THEN
    274355             qr(k,j,i) = 0.0
     356             nr(k,j,i) = 0.0
    275357          ELSE
    276358!
     
    283365                nr(k,j,i) = qr(k,j,i) * hyrho(k) / xrmax
    284366             ENDIF
    285              xr(k) = hyrho(k) * qr(k,j,i) / nr(k,j,i)
    286 !
    287 !--          Weight averaged diameter of rain drops:
    288              dr(k) = ( hyrho(k) * qr(k,j,i) / nr(k,j,i) *                     &
    289                        dpirho_l )**( 1.0 / 3.0 )
    290 !
    291 !--          Shape parameter of gamma distribution (Milbrandt and Yau, 2005;
    292 !--          Stevens and Seifert, 2008):
    293              mu_r(k) = 10.0 * ( 1.0 + TANH( 1.2E3 * ( dr(k) - 1.4E-3 ) ) )
    294 !
    295 !--          Slope parameter of gamma distribution (Seifert, 2008):
    296              lambda_r(k) = ( ( mu_r(k) + 3.0 ) * ( mu_r(k) + 2.0 ) *          &
    297                              ( mu_r(k) + 1.0 ) )**( 1.0 / 3.0 ) / dr(k)
     367
    298368          ENDIF
    299        ENDDO
    300 
    301     END SUBROUTINE dsd_properties_ij
     369
     370       ENDDO
     371
     372    END SUBROUTINE adjust_cloud_ij
    302373
    303374
     
    306377       USE arrays_3d
    307378       USE cloud_parameters
    308        USE constants
    309        USE indices
    310        USE control_parameters
    311        USE statistics
     379       USE control_parameters
    312380       USE grid_variables
    313    
    314        IMPLICIT NONE
    315 
    316        INTEGER ::  i, j, k
    317        REAL    ::  k_au, autocon, phi_au, tau_cloud, xc, nu_c, rc,   &
    318                    l_mix, re_lambda, alpha_cc, r_cc, sigma_cc, epsilon
     381       USE indices
     382
     383       IMPLICIT NONE
     384
     385       INTEGER ::  i, j, k
     386       REAL    ::  alpha_cc, autocon, epsilon, k_au, l_mix, nu_c, phi_au,      &
     387                   r_cc, rc, re_lambda, selfcoll, sigma_cc, tau_cloud, xc                     
    319388
    320389
    321390       k_au = k_cc / ( 20.0 * x0 )
    322391
    323        DO  k = nzb_2d(j,i)+1, nzt
    324 
    325           IF ( ql(k,j,i) > 0.0 )  THEN
     392       DO  k = nzb_s_inner(j,i)+1, nzt
     393
     394          IF ( qc_1d(k) > eps_sb )  THEN
    326395!
    327396!--          Intern time scale of coagulation (Seifert and Beheng, 2006):
    328 !--          (1.0 - ql(k,j,i) / ( ql(k,j,i) + qr(k,j,i) ))
    329              tau_cloud = 1.0 - ql(k,j,i) / ( ql(k,j,i) + qr(k,j,i) + 1.0E-20 )
     397!--          (1.0 - qc(k,j,i) / ( qc(k,j,i) + qr_1d(k) ))
     398             tau_cloud = 1.0 - qc_1d(k) / ( qr_1d(k) + qc_1d(k) )
    330399!
    331400!--          Universal function for autoconversion process
     
    335404!--          Shape parameter of gamma distribution (Geoffroy et al., 2010):
    336405!--          (Use constant nu_c = 1.0 instead?)
    337              nu_c      = 1.0 !MAX( 0.0, 1580.0 * hyrho(k) * ql(k,j,i) - 0.28 )
     406             nu_c      = 1.0 !MAX( 0.0, 1580.0 * hyrho(k) * qc(k,j,i) - 0.28 )
    338407!
    339408!--          Mean weight of cloud droplets:
    340              xc        = hyrho(k) * ql(k,j,i) / nc
     409             xc = hyrho(k) * qc_1d(k) / nc_1d(k)
    341410!
    342411!--          Parameterized turbulence effects on autoconversion (Seifert,
     
    371440!
    372441!--          Autoconversion rate (Seifert and Beheng, 2006):
    373              autocon   = k_au * ( nu_c + 2.0 ) * ( nu_c + 4.0 ) /              &
    374                          ( nu_c + 1.0 )**2 * ql(k,j,i)**2 * xc**2 *            &
    375                          ( 1.0 + phi_au / ( 1.0 - tau_cloud )**2 ) *           &
    376                          rho_surface
    377              autocon   = MIN( autocon, ql(k,j,i) / ( dt_3d *                   &
    378                               weight_substep(intermediate_timestep_count) ) )
    379 !
    380 !--          Tendencies for q, qr, nr, pt:
    381              tend_qr(k,j,i) = tend_qr(k,j,i) + autocon
    382              tend_q(k,j,i)  = tend_q(k,j,i)  - autocon
    383              tend_nr(k,j,i) = tend_nr(k,j,i) + autocon / x0 * hyrho(k)
    384              tend_pt(k,j,i) = tend_pt(k,j,i) + autocon * l_d_cp * pt_d_t(k)
     442             autocon = k_au * ( nu_c + 2.0 ) * ( nu_c + 4.0 ) /    &
     443                       ( nu_c + 1.0 )**2 * qc_1d(k)**2 * xc**2 *   &
     444                       ( 1.0 + phi_au / ( 1.0 - tau_cloud )**2 ) * &
     445                       rho_surface
     446             autocon = MIN( autocon, qc_1d(k) / dt_micro )
     447
     448             qr_1d(k) = qr_1d(k) + autocon * dt_micro
     449             qc_1d(k) = qc_1d(k) - autocon * dt_micro
     450             nr_1d(k) = nr_1d(k) + autocon / x0 * hyrho(k) * dt_micro
    385451
    386452          ENDIF
     
    395461       USE arrays_3d
    396462       USE cloud_parameters
    397        USE constants
    398        USE indices
    399        USE control_parameters
    400        USE statistics
    401        
    402        IMPLICIT NONE
    403 
    404        INTEGER ::  i, j, k
    405        REAL    ::  accr, phi_ac, tau_cloud, k_cr
    406 
    407        DO  k = nzb_2d(j,i)+1, nzt
    408 
    409           IF ( ( ql(k,j,i) > 0.0 )  .AND.  ( qr(k,j,i) > eps_sb ) )  THEN
     463       USE control_parameters
     464       USE indices
     465
     466       IMPLICIT NONE
     467
     468       INTEGER ::  i, j, k
     469       REAL    ::  accr, k_cr, phi_ac, tau_cloud, xc
     470
     471       DO  k = nzb_s_inner(j,i)+1, nzt
     472          IF ( ( qc_1d(k) > eps_sb )  .AND.  ( qr_1d(k) > eps_sb ) )  THEN
    410473!
    411474!--          Intern time scale of coagulation (Seifert and Beheng, 2006):
    412              tau_cloud = 1.0 - ql(k,j,i) / ( ql(k,j,i) + qr(k,j,i) + 1.0E-20)
     475             tau_cloud = 1.0 - qc_1d(k) / ( qc_1d(k) + qr_1d(k) )
    413476!
    414477!--          Universal function for accretion process
     
    421484!--          convert the dissipation (diss) from m2 s-3 to cm2 s-3.
    422485             IF ( turbulence )  THEN
    423                 k_cr = k_cr0 * ( 1.0 + 0.05 *                            &
     486                k_cr = k_cr0 * ( 1.0 + 0.05 *                             &
    424487                                 MIN( 600.0, diss(k,j,i) * 1.0E4 )**0.25 )
    425488             ELSE
     
    428491!
    429492!--          Accretion rate (Seifert and Beheng, 2006):
    430              accr = k_cr * ql(k,j,i) * qr(k,j,i) * phi_ac *              &
     493             accr = k_cr * qc_1d(k) * qr_1d(k) * phi_ac *                 &
    431494                    SQRT( rho_surface * hyrho(k) )
    432              accr = MIN( accr, ql(k,j,i) / ( dt_3d *                     &
    433                     weight_substep(intermediate_timestep_count) ) )
    434 !
    435 !--          Tendencies for q, qr, pt:
    436              tend_qr(k,j,i) = tend_qr(k,j,i) + accr
    437              tend_q(k,j,i)  = tend_q(k,j,i)  - accr
    438              tend_pt(k,j,i) = tend_pt(k,j,i) + accr * l_d_cp * pt_d_t(k)
     495             accr = MIN( accr, qc_1d(k) / dt_micro )
     496
     497             qr_1d(k) = qr_1d(k) + accr * dt_micro
     498             qc_1d(k) = qc_1d(k) - accr * dt_micro
    439499
    440500          ENDIF
     
    449509       USE arrays_3d
    450510       USE cloud_parameters
    451        USE constants
    452        USE indices
    453        USE control_parameters
    454        USE statistics
     511       USE control_parameters
     512       USE indices
    455513   
    456514       IMPLICIT NONE
    457515
    458516       INTEGER ::  i, j, k
    459        REAL    ::  selfcoll, breakup, phi_br, phi_sc
    460 
    461 
    462        DO  k = nzb_2d(j,i)+1, nzt
    463 
    464           IF ( qr(k,j,i) > eps_sb )  THEN
    465 !
    466 !--          Selfcollection rate (Seifert and Beheng, 2006):
    467 !--          pirho_l**( 1.0 / 3.0 ) is necessary to convert [lambda_r] = m-1 to
    468 !--          kg**( 1.0 / 3.0 ).
    469              phi_sc = 1.0 !( 1.0 + kappa_rr / lambda_r(k) *                        &
    470                       !pirho_l**( 1.0 / 3.0 ) )**( -9 )
    471 
    472              selfcoll = k_rr * nr(k,j,i) * qr(k,j,i) * phi_sc *               &
     517       REAL    ::  breakup, dr, phi_br, selfcoll
     518
     519       DO  k = nzb_s_inner(j,i)+1, nzt
     520          IF ( qr_1d(k) > eps_sb )  THEN
     521!
     522!--          Selfcollection rate (Seifert and Beheng, 2001):
     523             selfcoll = k_rr * nr_1d(k) * qr_1d(k) *         &
    473524                        SQRT( hyrho(k) * rho_surface )
    474525!
     526!--          Weight averaged diameter of rain drops:
     527             dr = ( hyrho(k) * qr_1d(k) / nr_1d(k) * dpirho_l )**( 1.0 / 3.0 )
     528!
    475529!--          Collisional breakup rate (Seifert, 2008):
    476              IF ( dr(k) >= 0.3E-3 )  THEN
    477                 phi_br  = k_br * ( dr(k) - 1.1E-3 )
     530             IF ( dr >= 0.3E-3 )  THEN
     531                phi_br  = k_br * ( dr - 1.1E-3 )
    478532                breakup = selfcoll * ( phi_br + 1.0 )
    479533             ELSE
     
    481535             ENDIF
    482536
    483              selfcoll =  MAX( breakup - selfcoll, -nr(k,j,i) / ( dt_3d *      &
    484                               weight_substep(intermediate_timestep_count) ) )
    485 !
    486 !--          Tendency for nr:
    487              tend_nr(k,j,i) = tend_nr(k,j,i) + selfcoll
     537             selfcoll = MAX( breakup - selfcoll, -nr_1d(k) / dt_micro )
     538             nr_1d(k) = nr_1d(k) + selfcoll * dt_micro
    488539
    489540          ENDIF         
    490 
    491541       ENDDO
    492542
     
    502552       USE cloud_parameters
    503553       USE constants
    504        USE indices
    505        USE control_parameters
    506        USE statistics
    507 
    508        IMPLICIT NONE
    509 
    510        INTEGER ::  i, j, k
    511        REAL    ::  evap, alpha, e_s, q_s, t_l, sat, temp, g_evap, f_vent, &
    512                    mu_r_2, mu_r_5d2, nr_0
    513 
    514 
    515        DO  k = nzb_2d(j,i)+1, nzt
    516 
    517           IF ( qr(k,j,i) > eps_sb )  THEN
     554       USE control_parameters
     555       USE indices
     556
     557       IMPLICIT NONE
     558
     559       INTEGER ::  i, j, k
     560       REAL    ::  alpha, dr, e_s, evap, evap_nr, f_vent, g_evap, lambda_r, &
     561                   mu_r, mu_r_2, mu_r_5d2, nr_0, q_s, sat, t_l, temp, xr
     562
     563       DO  k = nzb_s_inner(j,i)+1, nzt
     564          IF ( qr_1d(k) > eps_sb )  THEN
    518565!
    519566!--          Actual liquid water temperature:
    520              t_l = t_d_pt(k) * pt(k,j,i)
     567             t_l = t_d_pt(k) * pt_1d(k)
    521568!
    522569!--          Saturation vapor pressure at t_l:
     
    526573             q_s = 0.622 * e_s / ( hyp(k) - 0.378 * e_s )
    527574             alpha = 0.622 * l_d_r * l_d_cp / ( t_l * t_l )
    528              q_s = q_s * ( 1.0 + alpha * q(k,j,i) ) / ( 1.0 + alpha * q_s )
     575             q_s = q_s * ( 1.0 + alpha * q_1d(k) ) / ( 1.0 + alpha * q_s )
    529576!
    530577!--          Supersaturation:
    531              sat = MIN( 0.0, ( q(k,j,i) - ql(k,j,i) ) / q_s - 1.0 )
     578             sat = MIN( 0.0, ( q_1d(k) - qr_1d(k) - qc_1d(k) ) / q_s - 1.0 )
    532579!
    533580!--          Actual temperature:
    534              temp = t_l + l_d_cp * ql(k,j,i)
    535 !
    536 !--         
    537              g_evap = ( l_v / ( r_v * temp ) - 1.0 ) * l_v /                  &
    538                       ( thermal_conductivity_l * temp ) + rho_l * r_v * temp /&
    539                       ( diff_coeff_l * e_s )
    540              g_evap = 1.0 / g_evap
     581             temp = t_l + l_d_cp * ( qc_1d(k) + qr_1d(k) )
     582   
     583             g_evap = 1.0 / ( ( l_v / ( r_v * temp ) - 1.0 ) * l_v /   &
     584                      ( thermal_conductivity_l * temp ) + r_v * temp / &
     585                      ( diff_coeff_l * e_s ) )
     586!
     587!--          Mean weight of rain drops
     588             xr = hyrho(k) * qr_1d(k) / nr_1d(k)
     589!
     590!--          Weight averaged diameter of rain drops:
     591             dr = ( xr * dpirho_l )**( 1.0 / 3.0 )
    541592!
    542593!--          Compute ventilation factor and intercept parameter
    543594!--          (Seifert and Beheng, 2006; Seifert, 2008):
    544595             IF ( ventilation_effect )  THEN
    545                 mu_r_2   = mu_r(k) + 2.0
    546                 mu_r_5d2 = mu_r(k) + 2.5
     596!
     597!--             Shape parameter of gamma distribution (Milbrandt and Yau, 2005;
     598!--             Stevens and Seifert, 2008):
     599                mu_r = 10.0 * ( 1.0 + TANH( 1.2E3 * ( dr - 1.4E-3 ) ) )
     600!
     601!--             Slope parameter of gamma distribution (Seifert, 2008):
     602                lambda_r = ( ( mu_r + 3.0 ) * ( mu_r + 2.0 ) *       &
     603                             ( mu_r + 1.0 ) )**( 1.0 / 3.0 ) / dr
     604
     605                mu_r_2   = mu_r + 2.0
     606                mu_r_5d2 = mu_r + 2.5
    547607                f_vent = a_vent * gamm( mu_r_2 ) *                            &
    548                          lambda_r(k)**( -mu_r_2 ) +                           &
     608                         lambda_r**( -mu_r_2 ) +                              &
    549609                         b_vent * schmidt_p_1d3 *                             &
    550610                         SQRT( a_term / kin_vis_air ) * gamm( mu_r_5d2 ) *    &
    551                          lambda_r(k)**( -mu_r_5d2 ) *                         &
     611                         lambda_r**( -mu_r_5d2 ) *                            &
    552612                         ( 1.0 - 0.5 * ( b_term / a_term ) *                  &
    553                          ( lambda_r(k) /                                      &
    554                          (       c_term + lambda_r(k) ) )**mu_r_5d2 -         &
     613                         ( lambda_r /                                         &
     614                         (       c_term + lambda_r ) )**mu_r_5d2 -            &
    555615                                 0.125 * ( b_term / a_term )**2 *             &
    556                          ( lambda_r(k) /                                      &
    557                          ( 2.0 * c_term + lambda_r(k) ) )**mu_r_5d2 -         &
     616                         ( lambda_r /                                         &
     617                         ( 2.0 * c_term + lambda_r ) )**mu_r_5d2 -            &
    558618                                 0.0625 * ( b_term / a_term )**3 *            &
    559                          ( lambda_r(k) /                                      &
    560                          ( 3.0 * c_term + lambda_r(k) ) )**mu_r_5d2 -         &
     619                         ( lambda_r /                                         &
     620                         ( 3.0 * c_term + lambda_r ) )**mu_r_5d2 -            &
    561621                                 0.0390625 * ( b_term / a_term )**4 *         &
    562                          ( lambda_r(k) /                                      &
    563                          ( 4.0 * c_term + lambda_r(k) ) )**mu_r_5d2 )
    564                 nr_0   = nr(k,j,i) * lambda_r(k)**( mu_r(k) + 1.0 ) /         &
    565                          gamm( mu_r(k) + 1.0 )
     622                         ( lambda_r /                                         &
     623                         ( 4.0 * c_term + lambda_r ) )**mu_r_5d2 )
     624                nr_0   = nr_1d(k) * lambda_r**( mu_r + 1.0 ) /                &
     625                         gamm( mu_r + 1.0 )
    566626             ELSE
    567627                f_vent = 1.0
    568                 nr_0   = nr(k,j,i) * dr(k)
     628                nr_0   = nr_1d(k) * dr
    569629             ENDIF
    570630!
     
    572632             evap = 2.0 * pi * nr_0 * g_evap * f_vent * sat /    &
    573633                    hyrho(k)
    574              evap = MAX( evap, -qr(k,j,i) / ( dt_3d *            &
    575                          weight_substep(intermediate_timestep_count) ) )
    576 !
    577 !--          Tendencies for q, qr, nr, pt:
    578              tend_qr(k,j,i) = tend_qr(k,j,i) + evap
    579              tend_q(k,j,i)  = tend_q(k,j,i)  - evap
    580              tend_nr(k,j,i) = tend_nr(k,j,i) + c_evap * evap / xr(k) * hyrho(k)
    581              tend_pt(k,j,i) = tend_pt(k,j,i) + evap * l_d_cp * pt_d_t(k)
    582 
     634
     635             evap    = MAX( evap, -qr_1d(k) / dt_micro )
     636             evap_nr = MAX( c_evap * evap / xr * hyrho(k), &
     637                            -nr_1d(k) / dt_micro )
     638
     639             qr_1d(k) = qr_1d(k) + evap * dt_micro
     640             nr_1d(k) = nr_1d(k) + evap_nr * dt_micro
    583641          ENDIF         
    584642
     
    593651       USE cloud_parameters
    594652       USE constants
    595        USE indices
    596        USE control_parameters
     653       USE control_parameters
     654       USE indices
    597655       
    598656       IMPLICIT NONE
    599657
    600658       INTEGER ::  i, j, k
    601        REAL    ::  sed_q_const, sigma_gc = 1.3, k_st = 1.2E8
     659       REAL    ::  sed_qc_const
     660
     661       REAL, DIMENSION(nzb:nzt+1) :: sed_qc
    602662
    603663!
    604664!--    Sedimentation of cloud droplets (Heus et al., 2010):
    605        sed_q_const = k_st * ( 3.0 / ( 4.0 * pi * rho_l ))**( 2.0 / 3.0 ) *    &
     665       sed_qc_const = k_st * ( 3.0 / ( 4.0 * pi * rho_l ))**( 2.0 / 3.0 ) *   &
    606666                     EXP( 5.0 * LOG( sigma_gc )**2 )
    607667
    608        sed_q = 0.0
    609 
    610        DO  k = nzb_2d(j,i)+1, nzt
    611           IF ( ql(k,j,i) > 0.0 )  THEN
    612              sed_q(k) = sed_q_const * nc**( -2.0 / 3.0 ) *                    &
    613                         ( ql(k,j,i) * hyrho(k) )**( 5.0 / 3.0 )
     668       sed_qc(nzt+1) = 0.0
     669
     670       DO  k = nzt, nzb_s_inner(j,i)+1, -1
     671          IF ( qc_1d(k) > eps_sb )  THEN
     672             sed_qc(k) = sed_qc_const * nc_1d(k)**( -2.0 / 3.0 ) * &
     673                        ( qc_1d(k) * hyrho(k) )**( 5.0 / 3.0 )
     674          ELSE
     675             sed_qc(k) = 0.0
    614676          ENDIF
    615        ENDDO
    616 !
    617 !--    Tendency for q, pt:
    618        DO  k = nzb_2d(j,i)+1, nzt
    619           tend_q(k,j,i)  = tend_q(k,j,i) + ( sed_q(k+1) - sed_q(k) ) *        &
    620                            ddzu(k+1) / hyrho(k)
    621           tend_pt(k,j,i) = tend_pt(k,j,i) - ( sed_q(k+1) - sed_q(k) ) *       &
    622                            ddzu(k+1) / hyrho(k) * l_d_cp * pt_d_t(k)
     677
     678          sed_qc(k) = MIN( sed_qc(k), hyrho(k) * dzu(k+1) * q_1d(k) /     &
     679                                      dt_micro + sed_qc(k+1) )
     680
     681          q_1d(k)  = q_1d(k)  + ( sed_qc(k+1) - sed_qc(k) ) * ddzu(k+1) /  &
     682                                hyrho(k) * dt_micro
     683          qc_1d(k) = qc_1d(k) + ( sed_qc(k+1) - sed_qc(k) ) * ddzu(k+1) / &
     684                                hyrho(k) * dt_micro
     685          pt_1d(k) = pt_1d(k) - ( sed_qc(k+1) - sed_qc(k) ) * ddzu(k+1) / &
     686                                hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro
     687
    623688       ENDDO
    624689
     
    631696       USE cloud_parameters
    632697       USE constants
    633        USE indices
    634        USE control_parameters
     698       USE control_parameters
     699       USE indices
    635700       USE statistics
    636701       
     
    638703
    639704       INTEGER ::  i, j, k, k_run
    640        REAL    ::  c_run, d_max, d_mean, d_min, dt_sedi, flux, z_run
    641 
    642        REAL, DIMENSION(nzb:nzt) :: c_nr, c_qr, nr_slope, qr_slope, w_nr, w_qr
    643 
     705       REAL    ::  c_run, d_max, d_mean, d_min, dr, dt_sedi, flux, lambda_r,  &
     706                   mu_r, z_run
     707
     708       REAL, DIMENSION(nzb:nzt+1) :: c_nr, c_qr, d_nr, d_qr, nr_slope,        &
     709                                     qr_slope, sed_nr, sed_qr, w_nr, w_qr
    644710!
    645711!--    Computation of sedimentation flux. Implementation according to Stevens
    646712!--    and Seifert (2008).
    647713       IF ( intermediate_timestep_count == 1 )  prr(:,j,i) = 0.0
    648 
    649        dt_sedi = dt_3d * weight_substep(intermediate_timestep_count)
    650 
    651        w_nr = 0.0
    652        w_qr = 0.0
    653714!
    654715!--    Compute velocities
    655716       DO  k = nzb_s_inner(j,i)+1, nzt
    656           IF ( qr(k,j,i) > eps_sb )  THEN
     717          IF ( qr_1d(k) > eps_sb )  THEN
     718!
     719!--          Weight averaged diameter of rain drops:
     720             dr = ( hyrho(k) * qr_1d(k) / nr_1d(k) * dpirho_l )**( 1.0 / 3.0 )
     721!
     722!--          Shape parameter of gamma distribution (Milbrandt and Yau, 2005;
     723!--          Stevens and Seifert, 2008):
     724             mu_r = 10.0 * ( 1.0 + TANH( 1.2E3 * ( dr - 1.4E-3 ) ) )
     725!
     726!--          Slope parameter of gamma distribution (Seifert, 2008):
     727             lambda_r = ( ( mu_r + 3.0 ) * ( mu_r + 2.0 ) *          &
     728                        ( mu_r + 1.0 ) )**( 1.0 / 3.0 ) / dr
     729
    657730             w_nr(k) = MAX( 0.1, MIN( 20.0, a_term - b_term * ( 1.0 +          &
    658                        c_term / lambda_r(k) )**( -1.0 * ( mu_r(k) + 1.0 ) ) ) )
     731                       c_term / lambda_r )**( -1.0 * ( mu_r + 1.0 ) ) ) )
    659732             w_qr(k) = MAX( 0.1, MIN( 20.0, a_term - b_term * ( 1.0 +          &
    660                        c_term / lambda_r(k) )**( -1.0 * ( mu_r(k) + 4.0 ) ) ) )
     733                       c_term / lambda_r )**( -1.0 * ( mu_r + 4.0 ) ) ) )
    661734          ELSE
    662735             w_nr(k) = 0.0
     
    666739!
    667740!--    Adjust boundary values
    668        w_nr(nzb_2d(j,i)) = w_nr(nzb_2d(j,i)+1)
    669        w_qr(nzb_2d(j,i)) = w_qr(nzb_2d(j,i)+1)
    670        w_nr(nzt) = w_nr(nzt-1)
    671        w_qr(nzt) = w_qr(nzt-1)
     741       w_nr(nzb_s_inner(j,i)) = w_nr(nzb_s_inner(j,i)+1)
     742       w_qr(nzb_s_inner(j,i)) = w_qr(nzb_s_inner(j,i)+1)
     743       w_nr(nzt+1) = 0.0
     744       w_qr(nzt+1) = 0.0
    672745!
    673746!--    Compute Courant number
    674        DO  k = nzb_s_inner(j,i)+1, nzt-1
     747       DO  k = nzb_s_inner(j,i)+1, nzt
    675748          c_nr(k) = 0.25 * ( w_nr(k-1) + 2.0 * w_nr(k) + w_nr(k+1) ) * &
    676                     dt_sedi * ddzu(k)
     749                    dt_micro * ddzu(k)
    677750          c_qr(k) = 0.25 * ( w_qr(k-1) + 2.0 * w_qr(k) + w_qr(k+1) ) * &
    678                     dt_sedi * ddzu(k)
    679        ENDDO
     751                    dt_micro * ddzu(k)
     752       ENDDO     
    680753!
    681754!--    Limit slopes with monotonized centered (MC) limiter (van Leer, 1977):
    682755       IF ( limiter_sedimentation )  THEN
    683756
    684           qr(nzb_s_inner(j,i),j,i) = 0.0
    685           nr(nzb_s_inner(j,i),j,i) = 0.0
    686           qr(nzt,j,i) = 0.0
    687           nr(nzt,j,i) = 0.0
    688 
    689           DO k = nzb_s_inner(j,i)+1, nzt-1
    690              d_mean = 0.5 * ( qr(k+1,j,i) + qr(k-1,j,i) )
    691              d_min  = qr(k,j,i) - MIN( qr(k+1,j,i), qr(k,j,i), qr(k-1,j,i) )
    692              d_max  = MAX( qr(k+1,j,i), qr(k,j,i), qr(k-1,j,i) ) - qr(k,j,i)
     757          DO k = nzb_s_inner(j,i)+1, nzt
     758             d_mean = 0.5 * ( qr_1d(k+1) + qr_1d(k-1) )
     759             d_min  = qr_1d(k) - MIN( qr_1d(k+1), qr_1d(k), qr_1d(k-1) )
     760             d_max  = MAX( qr_1d(k+1), qr_1d(k), qr_1d(k-1) ) - qr_1d(k)
    693761
    694762             qr_slope(k) = SIGN(1.0, d_mean) * MIN ( 2.0 * d_min, 2.0 * d_max, &
    695763                                                     ABS( d_mean ) )
    696764
    697              d_mean = 0.5 * ( nr(k+1,j,i) + nr(k-1,j,i) )
    698              d_min  = nr(k,j,i) - MIN( nr(k+1,j,i), nr(k,j,i), nr(k-1,j,i) )
    699              d_max  = MAX( nr(k+1,j,i), nr(k,j,i), nr(k-1,j,i) ) - nr(k,j,i)
     765             d_mean = 0.5 * ( nr_1d(k+1) + nr_1d(k-1) )
     766             d_min  = nr_1d(k) - MIN( nr_1d(k+1), nr_1d(k), nr_1d(k-1) )
     767             d_max  = MAX( nr_1d(k+1), nr_1d(k), nr_1d(k-1) ) - nr_1d(k)
    700768
    701769             nr_slope(k) = SIGN(1.0, d_mean) * MIN ( 2.0 * d_min, 2.0 * d_max, &
     
    709777
    710778       ENDIF
     779
     780       sed_nr(nzt+1) = 0.0
     781       sed_qr(nzt+1) = 0.0
    711782!
    712783!--    Compute sedimentation flux
    713        DO  k = nzt-2, nzb_s_inner(j,i)+1, -1
     784       DO  k = nzt, nzb_s_inner(j,i)+1, -1
    714785!
    715786!--       Sum up all rain drop number densities which contribute to the flux
     
    719790          k_run = k
    720791          c_run = MIN( 1.0, c_nr(k) )
    721           DO WHILE ( c_run > 0.0  .AND.  k_run <= nzt-1 )
     792          DO WHILE ( c_run > 0.0  .AND.  k_run <= nzt )
    722793             flux  = flux + hyrho(k_run) *                                    &
    723                      ( nr(k_run,j,i) + nr_slope(k_run) * ( 1.0 - c_run ) *    &
     794                     ( nr_1d(k_run) + nr_slope(k_run) * ( 1.0 - c_run ) *     &
    724795                     0.5 ) * c_run * dzu(k_run)
    725796             z_run = z_run + dzu(k_run)
     
    731802!--       available
    732803          flux = MIN( flux,                                                   &
    733                       hyrho(k) * dzu(k) * nr(k,j,i) + sed_nr(k+1) * dt_sedi )
    734 
    735           sed_nr(k)      = flux / dt_sedi
    736           tend_nr(k,j,i) = tend_nr(k,j,i) + ( sed_nr(k+1) - sed_nr(k) ) *     &
    737                                             ddzu(k+1) / hyrho(k)
     804                      hyrho(k) * dzu(k+1) * nr_1d(k) + sed_nr(k+1) * dt_micro )
     805
     806          sed_nr(k) = flux / dt_micro
     807          nr_1d(k)  = nr_1d(k) + ( sed_nr(k+1) - sed_nr(k) ) * ddzu(k+1) /    &
     808                                 hyrho(k) * dt_micro
    738809!
    739810!--       Sum up all rain water content which contributes to the flux
     
    747818
    748819             flux  = flux + hyrho(k_run) *                                    &
    749                      ( qr(k_run,j,i) + qr_slope(k_run) * ( 1.0 - c_run ) *    &
     820                     ( qr_1d(k_run) + qr_slope(k_run) * ( 1.0 - c_run ) *    &
    750821                     0.5 ) * c_run * dzu(k_run)
    751822             z_run = z_run + dzu(k_run)
     
    757828!--       It is not allowed to sediment more rain water content than available
    758829          flux = MIN( flux,                                                   &
    759                       hyrho(k) * dzu(k) * qr(k,j,i) + sed_qr(k+1) * dt_sedi )
    760 
    761           sed_qr(k)      = flux / dt_sedi
    762           tend_qr(k,j,i) = tend_qr(k,j,i) + ( sed_qr(k+1) - sed_qr(k) ) *     &
    763                                             ddzu(k+1) / hyrho(k)
     830                      hyrho(k) * dzu(k) * qr_1d(k) + sed_qr(k+1) * dt_micro )
     831
     832          sed_qr(k) = flux / dt_micro
     833
     834          qr_1d(k) = qr_1d(k) + ( sed_qr(k+1) - sed_qr(k) ) * ddzu(k+1) / &
     835                                hyrho(k) * dt_micro
     836          q_1d(k)  = q_1d(k)  + ( sed_qr(k+1) - sed_qr(k) ) * ddzu(k+1) / &
     837                                hyrho(k) * dt_micro
     838          pt_1d(k) = pt_1d(k) - ( sed_qr(k+1) - sed_qr(k) ) * ddzu(k+1) / &
     839                                hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro
    764840!
    765841!--       Compute the rain rate
    766842          prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k) *                    &
    767                        weight_substep(intermediate_timestep_count)
    768        ENDDO
     843                       weight_substep(intermediate_timestep_count)
     844       ENDDO
     845
    769846!
    770847!--    Precipitation amount
     
    774851
    775852          precipitation_amount(j,i) = precipitation_amount(j,i) +   &
    776                                       prr(nzb_2d(j,i)+1,j,i) *      &
    777                                       hyrho(nzb_2d(j,i)+1) * dt_3d
     853                                      prr(nzb_s_inner(j,i)+1,j,i) *      &
     854                                      hyrho(nzb_s_inner(j,i)+1) * dt_3d
    778855       ENDIF
    779856
Note: See TracChangeset for help on using the changeset viewer.