Ignore:
Timestamp:
Oct 26, 2015 4:17:44 PM (8 years ago)
Author:
maronga
Message:

various bugfixes and modifications of the atmosphere-land-surface-radiation interaction. Completely re-written routine to calculate surface fluxes (surface_layer_fluxes.f90) that replaces prandtl_fluxes. Minor formatting corrections and renamings

File:
1 edited

Legend:

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

    r1683 r1691  
    1414! PALM. If not, see <http://www.gnu.org/licenses/>.
    1515!
    16 ! Copyright 1997-2014 Leibniz Universitaet Hannover
     16! Copyright 1997-2015 Leibniz Universitaet Hannover
    1717!--------------------------------------------------------------------------------!
    1818!
    1919! Current revisions:
    2020! -----------------
    21 !
     21! Added skip_time_do_lsm to allow for spin-ups without LSM. Various bugfixes:
     22! Soil temperatures are now defined at the edges of the layers, calculation of
     23! shb_eb corrected, prognostic equation for skin temperature corrected. Surface
     24! fluxes are now directly transfered to atmosphere
    2225!
    2326! Former revisions:
     
    7376!> DALES and UCLA-LES models.
    7477!>
    75 !> @todo Check dewfall parametrization for fog simulations.
    76 !> @todo Consider partial absorption of the net shortwave radiation by the surface layer.
    77 !> @todo Allow for water surfaces, check performance for bare soils.
    78 !> @todo Invert indices (running from -3 to 0. Currently: nzb_soil=0, nzt_soil=3)).
    79 !> @todo Implement surface runoff model (required when performing long-term LES with
    80 !>       considerable precipitation.
     78!> @todo Consider partial absorption of the net shortwave radiation by the
     79!>       surface layer.
     80!> @todo Allow for water surfaces
     81!> @todo Invert indices (running from -3 to 0. Currently: nzb_soil=0,
     82!>       nzt_soil=3)).
     83!> @todo Implement surface runoff model (required when performing long-term LES
     84!>       with considerable precipitation.
    8185!>
    82 !> @note  No time step criterion is required as long as the soil layers do not become
    83 !>        too thin.
     86!> @note  No time step criterion is required as long as the soil layers do not
     87!>        become too thin.
    8488!------------------------------------------------------------------------------!
    8589 MODULE land_surface_model_mod
    8690 
    87      USE arrays_3d,                                                            &
    88          ONLY:  pt, pt_p, q_p, qsws, rif, shf, ts, us, z0, z0h
    89 
    90      USE cloud_parameters,                                                     &
    91          ONLY:  cp, l_d_r, l_v, precipitation_rate, rho_l, r_d, r_v
    92 
    93      USE control_parameters,                                                   &
    94          ONLY:  cloud_physics, dt_3d, humidity, intermediate_timestep_count,   &
    95                 initializing_actions, intermediate_timestep_count_max,         &
    96                 max_masks, precipitation, pt_surface, rho_surface,             &
    97                 roughness_length, surface_pressure, timestep_scheme, tsc,      &
    98                 z0h_factor, time_since_reference_point
    99 
    100      USE indices,                                                              &
    101          ONLY:  nbgp, nxlg, nxrg, nyng, nysg, nzb, nzb_s_inner
    102 
    103      USE kinds
     91    USE arrays_3d,                                                             &
     92        ONLY:  hyp, pt, pt_p, q, q_p, ql, qsws, rif, shf, ts, us, vpt, z0, z0h
     93
     94    USE cloud_parameters,                                                      &
     95        ONLY:  cp, hyrho, l_d_cp, l_d_r, l_v, prr, pt_d_t, rho_l, r_d, r_v
     96
     97    USE control_parameters,                                                    &
     98        ONLY:  cloud_physics, dt_3d, humidity, intermediate_timestep_count,    &
     99               initializing_actions, intermediate_timestep_count_max,          &
     100               max_masks, precipitation, pt_surface, rho_surface,              &
     101               roughness_length, surface_pressure, timestep_scheme, tsc,       &
     102               z0h_factor, time_since_reference_point
     103
     104    USE indices,                                                               &
     105        ONLY:  nbgp, nxlg, nxrg, nyng, nysg, nzb, nzb_s_inner
     106
     107    USE kinds
    104108
    105109    USE netcdf_control,                                                        &
    106110        ONLY:  dots_label, dots_num, dots_unit
    107111
    108      USE radiation_model_mod,                                                  &
    109          ONLY:  radiation_scheme, rad_net, rad_sw_in, sigma_sb
    110 
    111      USE statistics,                                                           &
    112          ONLY:  hom, statistic_regions
     112    USE pegrid
     113
     114    USE radiation_model_mod,                                                   &
     115        ONLY:  force_radiation_call, radiation_scheme, rad_net, rad_sw_in,     &
     116               rad_lw_out, sigma_sb
     117       
     118#if defined ( __rrtmg )
     119    USE radiation_model_mod,                                                   &
     120        ONLY:  rrtm_lwuflx_dt, rrtm_idrv
     121#endif
     122
     123    USE statistics,                                                            &
     124        ONLY:  hom, statistic_regions
    113125
    114126    IMPLICIT NONE
     
    144156                    soil_type = 3    !< soil type, 0: user-defined, 1-6: generic (see list)
    145157
    146     LOGICAL :: conserve_water_content = .TRUE., & !< open or closed bottom surface for the soil model
    147                dewfall = .TRUE.,                & !< allow/inhibit dewfall
    148                land_surface = .FALSE.             !< flag parameter indicating wheather the lsm is used
     158    LOGICAL :: conserve_water_content = .TRUE.,  & !< open or closed bottom surface for the soil model
     159               dewfall = .TRUE.,                 & !< allow/inhibit dewfall
     160               force_radiation_call_l = .FALSE., & !< flag parameter for unscheduled radiation model calls
     161               land_surface = .FALSE.              !< flag parameter indicating wheather the lsm is used
    149162
    150163!   value 9999999.9_wp -> generic available or user-defined value must be set
     
    160173                hydraulic_conductivity = 9999999.9_wp,  & !< NAMELIST gamma_w_sat
    161174                ke = 0.0_wp,                            & !< Kersten number
     175                lambda_h_sat = 0.0_wp,                  & !< heat conductivity for saturated soil
    162176                lambda_surface_stable = 9999999.9_wp,   & !< NAMELIST lambda_surface_s
    163177                lambda_surface_unstable = 9999999.9_wp, & !< NAMELIST lambda_surface_u
     
    174188                rd_d_rv,                                & !< r_d / r_v
    175189                saturation_moisture = 9999999.9_wp,     & !< NAMELIST m_sat
     190                skip_time_do_lsm = 0.0_wp,              & !< LSM is not called before this time
    176191                vegetation_coverage = 9999999.9_wp,     & !< NAMELIST c_veg
    177192                wilting_point = 9999999.9_wp,           & !< NAMELIST m_wilt
    178193                z0_eb  = 9999999.9_wp,                  & !< NAMELIST z0 (lsm_par)
    179                 z0h_eb = 9999999.9_wp                    !< NAMELIST z0h (lsm_par)
     194                z0h_eb = 9999999.9_wp                     !< NAMELIST z0h (lsm_par)
    180195
    181196    REAL(wp), DIMENSION(nzb_soil:nzt_soil) :: &
    182               ddz_soil,                     & !< 1/dz_soil
    183               ddz_soil_stag,                & !< 1/dz_soil_stag
    184               dz_soil,                      & !< soil grid spacing (center-center)
    185               dz_soil_stag,                 & !< soil grid spacing (edge-edge)
    186               root_extr = 0.0_wp,           & !< root extraction
     197              ddz_soil_stag,                  & !< 1/dz_soil_stag
     198              dz_soil_stag,                   & !< soil grid spacing (center-center)
     199              root_extr = 0.0_wp,             & !< root extraction
    187200              root_fraction = (/9999999.9_wp, 9999999.9_wp,    &
    188201                                9999999.9_wp, 9999999.9_wp /), & !< distribution of root surface area to the individual soil layers
     
    191204
    192205    REAL(wp), DIMENSION(nzb_soil:nzt_soil+1) ::   &
    193               soil_temperature = (/290.0_wp, 287.0_wp, 285.0_wp,  283.0_wp,    &
    194                                    283.0_wp /) !< soil temperature (K)
     206              soil_temperature = (/290.0_wp, 287.0_wp, 285.0_wp,  283.0_wp,    & !< soil temperature (K)
     207                                   283.0_wp /),                                &                                   
     208              ddz_soil,                                                        & !< 1/dz_soil
     209              dz_soil                                                            !< soil grid spacing (edge-edge)
    195210
    196211#if defined( __nopointer )
     
    218233!
    219234!-- Energy balance variables               
    220     REAL(wp), DIMENSION(:,:), ALLOCATABLE ::                                   &
     235    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
    221236              alpha_vg,         & !< coef. of Van Genuchten
    222237              c_liq,            & !< liquid water coverage (of vegetated area)
     
    232247              lai,              & !< leaf area index
    233248              lai_av,           & !< average of lai
    234               lambda_h_sat,     & !< heat conductivity for dry soil
    235               lambda_surface_s,    & !< coupling between surface and soil (depends on vegetation type)
    236               lambda_surface_u,    & !< coupling between surface and soil (depends on vegetation type)
     249              lambda_surface_s, & !< coupling between surface and soil (depends on vegetation type)
     250              lambda_surface_u, & !< coupling between surface and soil (depends on vegetation type)
    237251              l_vg,             & !< coef. of Van Genuchten
    238252              m_fc,             & !< soil moisture at field capacity (m3/m3)
     
    253267              r_a_av,           & !< avergae of r_a
    254268              r_canopy,         & !< canopy resistance
    255               r_soil,           & !< soil resitance
     269              r_soil,           & !< soil resistance
    256270              r_soil_min,       & !< minimum soil resistance
    257271              r_s,              & !< total surface resistance (combination of r_soil and r_canopy)
    258               r_s_av,           & !< avergae of r_s
     272              r_s_av,           & !< average of r_s
    259273              r_canopy_min,     & !< minimum canopy (stomatal) resistance
    260274              shf_eb,           & !< surface flux of sensible heat
    261275              shf_eb_av           !< average of shf_eb
     276
    262277
    263278    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::                                 &
     
    472487           lsm_swap_timelevel, l_vangenuchten, min_canopy_resistance,          &
    473488           min_soil_resistance, n_vangenuchten, residual_moisture, rho_cp,     &
    474            rho_lv, root_fraction, saturation_moisture, soil_moisture,          &
    475            soil_temperature, soil_type, soil_type_name, vegetation_coverage,   &
    476            veg_type, veg_type_name, wilting_point, z0_eb, z0h_eb
     489           rho_lv, root_fraction, saturation_moisture, skip_time_do_lsm,       &
     490           soil_moisture, soil_temperature, soil_type, soil_type_name,         &
     491           vegetation_coverage, veg_type, veg_type_name, wilting_point, z0_eb, &
     492           z0h_eb
    477493
    478494!
     
    483499           zs
    484500
    485 
    486501!
    487502!-- Public 2D output variables
     
    490505           qsws_soil_eb, qsws_soil_eb_av, qsws_veg_eb, qsws_veg_eb_av,         &
    491506           r_a, r_a_av, r_s, r_s_av, shf_eb, shf_eb_av
    492 
    493507
    494508!
     
    565579       ALLOCATE ( lai(nysg:nyng,nxlg:nxrg) )
    566580       ALLOCATE ( l_vg(nysg:nyng,nxlg:nxrg) )
    567        ALLOCATE ( lambda_h_sat(nysg:nyng,nxlg:nxrg) )
    568581       ALLOCATE ( lambda_surface_u(nysg:nyng,nxlg:nxrg) )
    569582       ALLOCATE ( lambda_surface_s(nysg:nyng,nxlg:nxrg) )
     
    612625       INTEGER(iwp) ::  k !< running index
    613626
     627       REAL(wp) :: pt_1   !< potential temperature at first grid level
     628
    614629
    615630!
    616631!--    Calculate Exner function
    617        exn       = ( surface_pressure / 1000.0_wp )**0.286_wp
     632       exn = ( surface_pressure / 1000.0_wp )**0.286_wp
    618633
    619634
     
    674689!
    675690!--    Calculate grid spacings. Temperature and moisture are defined at
    676 !--    the center of the soil layers, whereas gradients/fluxes are defined
    677 !--    at the edges (_stag)
    678        dz_soil_stag(nzb_soil) = zs(nzb_soil)
    679 
    680        DO k = nzb_soil+1, nzt_soil
    681           dz_soil_stag(k) = zs(k) - zs(k-1)
     691!--    the edges of the soil layers (_stag), whereas gradients/fluxes are defined
     692!--    at the centers
     693       dz_soil(nzb_soil) = zs(nzb_soil)
     694
     695       DO  k = nzb_soil+1, nzt_soil
     696          dz_soil(k) = zs(k) - zs(k-1)
    682697       ENDDO
    683 
    684        DO k = nzb_soil, nzt_soil-1
    685           dz_soil(k) = 0.5 * (dz_soil_stag(k+1) + dz_soil_stag(k))
     698       dz_soil(nzt_soil+1) = dz_soil(nzt_soil)
     699
     700       DO  k = nzb_soil, nzt_soil-1
     701          dz_soil_stag(k) = 0.5_wp * (dz_soil(k+1) + dz_soil(k))
    686702       ENDDO
    687        dz_soil(nzt_soil) = dz_soil_stag(nzt_soil)
     703       dz_soil_stag(nzt_soil) = dz_soil(nzt_soil)
    688704
    689705       ddz_soil      = 1.0_wp / dz_soil
     
    752768!--       (make sure that the soil moisture does not drop below the permanent
    753769!--       wilting point) -> problems with devision by zero)
    754           DO k = nzb_soil, nzt_soil
     770          DO  k = nzb_soil, nzt_soil
    755771             t_soil(k,:,:)    = soil_temperature(k)
    756772             m_soil(k,:,:)    = MAX(soil_moisture(k),m_wilt(:,:))
     
    761777!
    762778!--       Calculate surface temperature
    763           t_surface = pt_surface * exn
     779          t_surface   = pt_surface * exn
     780          t_surface_p = t_surface
    764781
    765782!
     
    770787                k = nzb_s_inner(j,i)
    771788
     789                IF ( cloud_physics )  THEN
     790                   pt_1 = pt(k+1,j,i) + l_d_cp * pt_d_t(k+1) * ql(k+1,j,i)
     791                ELSE
     792                   pt_1 = pt(k+1,j,i)
     793                ENDIF
     794
    772795!
    773796!--             Assure that r_a cannot be zero at model start
    774                 IF ( pt(k+1,j,i) == pt(k,j,i) )  pt(k+1,j,i) = pt(k+1,j,i)     &
    775                                                  + 1.0E-10_wp
    776 
    777                 us(j,i) = 0.1_wp
    778                 ts(j,i) = (pt(k+1,j,i) - pt(k,j,i)) / r_a(j,i)
     797                IF ( pt_1 == pt(k,j,i) )  pt_1 = pt_1 + 1.0E-10_wp
     798
     799                us(j,i)  = 0.1_wp
     800                ts(j,i)  = (pt_1 - pt(k,j,i)) / r_a(j,i)
    779801                shf(j,i) = - us(j,i) * ts(j,i)
    780802             ENDDO
     
    794816       ENDIF
    795817
    796 !
    797 !--    Calculate saturation soil heat conductivity
    798        lambda_h_sat(:,:) = lambda_h_sm ** (1.0_wp - m_sat(:,:)) *              &
    799                            lambda_h_water ** m_sat(:,:)
    800 
    801 
    802 
    803 
    804        DO k = nzb_soil, nzt_soil
     818       DO  k = nzb_soil, nzt_soil
    805819          root_fr(k,:,:) = root_fraction(k)
    806820       ENDDO
     
    838852
    839853          IF ( ANY( root_fraction == 9999999.9_wp ) )  THEN
    840              DO k = nzb_soil, nzt_soil
     854             DO  k = nzb_soil, nzt_soil
    841855                root_fr(k,:,:) = root_distribution(k,veg_type)
    842856                root_fraction(k) = root_distribution(k,veg_type)
     
    886900
    887901!
    888 !--    Calculate humidity at the surface
    889        IF ( humidity )  THEN
    890           CALL calc_q_surface
    891        ENDIF
    892 
    893 
    894 
    895 !
    896902!--    Add timeseries for land surface model
    897 
    898        dots_label(dots_num+1) = "ghf_eb"
    899        dots_label(dots_num+2) = "shf_eb"
    900        dots_label(dots_num+3) = "qsws_eb"
    901        dots_label(dots_num+4) = "qsws_liq_eb"
    902        dots_label(dots_num+5) = "qsws_soil_eb"
    903        dots_label(dots_num+6) = "qsws_veg_eb"
    904        dots_unit(dots_num+1:dots_num+6) = "W/m2"
    905 
    906        dots_label(dots_num+7) = "r_a"
    907        dots_label(dots_num+8) = "r_s"
    908        dots_unit(dots_num+7:dots_num+8) = "s/m"
    909 
    910903       dots_soil = dots_num + 1
    911904       dots_num  = dots_num + 8
     905
     906       dots_label(dots_soil) = "ghf_eb"
     907       dots_label(dots_soil+1) = "shf_eb"
     908       dots_label(dots_soil+2) = "qsws_eb"
     909       dots_label(dots_soil+3) = "qsws_liq_eb"
     910       dots_label(dots_soil+4) = "qsws_soil_eb"
     911       dots_label(dots_soil+5) = "qsws_veg_eb"
     912       dots_label(dots_soil+6) = "r_a"
     913       dots_label(dots_soil+7) = "r_s"
     914
     915       dots_unit(dots_soil:dots_soil+5) = "W/m2"
     916       dots_unit(dots_soil+6:dots_soil+7) = "s/m"
    912917
    913918       RETURN
     
    921926! ------------
    922927!> Solver for the energy balance at the surface.
    923 !> @note Surface fluxes are calculated in the land surface model, but these are
    924 !>       not used in the atmospheric code. The fluxes are calculated afterwards in
    925 !>       prandtl_fluxes using the surface values of temperature and humidity as
    926 !>       provided by the land surface model. In this way, the fluxes in the land
    927 !>       surface model are not equal to the ones calculated in prandtl_fluxes
    928928!------------------------------------------------------------------------------!
    929929    SUBROUTINE lsm_energy_balance
     
    940940                   f3,          & !< resistance correction term 3
    941941                   m_min,       & !< minimum soil moisture
    942                    T_1,         & !< actual temperature at first grid point
    943942                   e,           & !< water vapour pressure
    944943                   e_s,         & !< water vapour saturation pressure
     
    954953                   f_shf,       & !< factor for shf_eb
    955954                   lambda_surface, & !< Current value of lambda_surface
    956                    m_liq_eb_max   !< maxmimum value of the liq. water reservoir
    957 
     955                   m_liq_eb_max,   & !< maxmimum value of the liq. water reservoir
     956                   pt_1,        & !< potential temperature at first grid level
     957                   qv_1           !< specific humidity at first grid level
    958958
    959959!
     
    961961       exn = ( surface_pressure / 1000.0_wp )**0.286_wp
    962962
    963        
    964 
    965        DO i = nxlg, nxrg
    966           DO j = nysg, nyng
     963       DO  i = nxlg, nxrg
     964          DO  j = nysg, nyng
    967965             k = nzb_s_inner(j,i)
    968966
     
    980978!--          time step is used here. Note that this formulation is the
    981979!--          equivalent to the ECMWF formulation using drag coefficients
    982              r_a(j,i) = (pt(k+1,j,i) - pt(k,j,i)) / (ts(j,i) * us(j,i) +       &
    983                          1.0E-20_wp)
     980             IF ( cloud_physics )  THEN
     981                pt_1 = pt(k+1,j,i) + l_d_cp * pt_d_t(k+1) * ql(k+1,j,i)
     982                qv_1 = q(k+1,j,i) - ql(k+1,j,i)
     983             ELSE
     984                pt_1 = pt(k+1,j,i)
     985                qv_1 = q(k+1,j,i)
     986             ENDIF
     987
     988             r_a(j,i) = (pt_1 - pt(k,j,i)) / (ts(j,i) * us(j,i) + 1.0E-20_wp)
    984989
    985990!
     
    10021007!--          f2 = 0 for very dry soils
    10031008             m_total = 0.0_wp
    1004              DO ks = nzb_soil, nzt_soil
     1009             DO  ks = nzb_soil, nzt_soil
    10051010                 m_total = m_total + root_fr(ks,j,i)                           &
    10061011                           * MAX(m_soil(ks,j,i),m_wilt(j,i))
    10071012             ENDDO
    10081013
    1009              IF ( m_total .GT. m_wilt(j,i) .AND. m_total .LT. m_fc(j,i) )  THEN
     1014             IF ( m_total > m_wilt(j,i) .AND. m_total < m_fc(j,i) )  THEN
    10101015                f2 = ( m_total - m_wilt(j,i) ) / (m_fc(j,i) - m_wilt(j,i) )
    1011              ELSEIF ( m_total .GE. m_fc(j,i) )  THEN
     1016             ELSEIF ( m_total >= m_fc(j,i) )  THEN
    10121017                f2 = 1.0_wp
    10131018             ELSE
     
    10251030!
    10261031!--             Calculate vapour pressure
    1027                 e  = q_p(k+1,j,i) * surface_pressure / 0.622_wp
     1032                e  = qv_1 * surface_pressure / 0.622_wp
    10281033                f3 = EXP ( -g_d(j,i) * (e_s - e) )
    10291034             ELSE
     
    10671072!--          In case of dewfall, set evapotranspiration to zero
    10681073!--          All super-saturated water is then removed from the air
    1069              IF ( humidity .AND. dewfall .AND. q_s .LE. q_p(k+1,j,i) )  THEN
     1074             IF ( humidity .AND. q_s <= qv_1 )  THEN
    10701075                r_canopy(j,i) = 0.0_wp
    10711076                r_soil(j,i)   = 0.0_wp
    1072              ENDIF 
     1077             ENDIF
    10731078
    10741079!
     
    10851090!--          If soil moisture is below wilting point, plants do no longer
    10861091!--          transpirate.
    1087 !              IF ( m_soil(k,j,i) .LT. m_wilt(j,i) )  THEN
     1092!              IF ( m_soil(k,j,i) < m_wilt(j,i) )  THEN
    10881093!                 f_qsws_veg = 0.0_wp
    10891094!              ENDIF
     
    10941099!--          air.
    10951100             IF ( humidity )  THEN
    1096                 IF ( q_s .LE. q_p(k+1,j,i) )  THEN
     1101                IF ( q_s <= qv_1 )  THEN
    10971102                   IF ( .NOT. dewfall )  THEN
    10981103                      f_qsws_veg  = 0.0_wp
     
    11141119             dq_s_dt = 0.622_wp * e_s_dt / surface_pressure
    11151120
    1116              T_1 = pt_p(k+1,j,i) * exn
    1117 
    11181121!
    11191122!--          Add LW up so that it can be removed in prognostic equation
    1120              rad_net_l(j,i) = rad_net(j,i) + sigma_sb * t_surface(j,i) ** 4
     1123             rad_net_l(j,i) = rad_net(j,i) + rad_lw_out(nzb,j,i)
     1124
    11211125
    11221126             IF ( humidity )  THEN
    1123 
     1127#if defined ( __rrtmg )
    11241128!
    11251129!--             Numerator of the prognostic equation
    1126                 coef_1 = rad_net_l(j,i) + 3.0_wp * sigma_sb * t_surface(j,i) ** 4&
    1127                          + f_shf / exn * T_1 + f_qsws * ( q_p(k+1,j,i) - q_s   &
     1130                coef_1 = rad_net_l(j,i) + rrtm_lwuflx_dt(0,nzb)                &
     1131                         * t_surface(j,i) - rad_lw_out(nzb,j,i)                &
     1132                         + f_shf * pt_1 + f_qsws * ( qv_1 - q_s                &
    11281133                         + dq_s_dt * t_surface(j,i) ) + lambda_surface         &
    11291134                         * t_soil(nzb_soil,j,i)
     
    11311136!
    11321137!--             Denominator of the prognostic equation
    1133                 coef_2 = 4.0_wp * sigma_sb * t_surface(j,i) ** 3 + f_qsws      &
    1134                          * dq_s_dt + lambda_surface + f_shf / exn
    1135 
     1138                coef_2 = rrtm_lwuflx_dt(0,nzb) + f_qsws * dq_s_dt              &
     1139                         + lambda_surface + f_shf / exn
     1140#else
     1141
     1142!
     1143!--             Numerator of the prognostic equation
     1144                coef_1 = rad_net_l(j,i) + 3.0_wp * sigma_sb                    &
     1145                         * t_surface(j,i) ** 4                                 &
     1146                         + f_shf * pt_1 + f_qsws * ( qv_1                      &
     1147                         - q_s + dq_s_dt * t_surface(j,i) )                    &
     1148                         + lambda_surface * t_soil(nzb_soil,j,i)
     1149
     1150!
     1151!--                Denominator of the prognostic equation
     1152                   coef_2 = 4.0_wp * sigma_sb * t_surface(j,i) ** 3 + f_qsws   &
     1153                            * dq_s_dt + lambda_surface + f_shf / exn
     1154 
     1155#endif
    11361156             ELSE
    11371157
     1158#if defined ( __rrtmg )
    11381159!
    11391160!--             Numerator of the prognostic equation
    1140                 coef_1 = rad_net_l(j,i) + 3.0_wp * sigma_sb * t_surface(j,i) ** 4&
    1141                          + f_shf / exn * T_1 + lambda_surface                  &
     1161                coef_1 = rad_net_l(j,i) + rrtm_lwuflx_dt(0,nzb)                &
     1162                         * t_surface(j,i) - rad_lw_out(nzb,j,i)                &
     1163                         + f_shf * pt_1  + lambda_surface                      &
    11421164                         * t_soil(nzb_soil,j,i)
     1165
     1166!
     1167!--             Denominator of the prognostic equation
     1168                coef_2 = rrtm_lwuflx_dt(0,nzb) + lambda_surface + f_shf / exn
     1169#else
     1170
     1171!
     1172!--             Numerator of the prognostic equation
     1173                coef_1 = rad_net_l(j,i) + 3.0_wp * sigma_sb                    &
     1174                          * t_surface(j,i) ** 4 + f_shf * pt_1                 &
     1175                          + lambda_surface * t_soil(nzb_soil,j,i)
    11431176
    11441177!
     
    11461179                coef_2 = 4.0_wp * sigma_sb * t_surface(j,i) ** 3               &
    11471180                         + lambda_surface + f_shf / exn
    1148 
    1149              ENDIF
     1181#endif
     1182             ENDIF
     1183
    11501184
    11511185             tend = 0.0_wp
     
    11591193!
    11601194!--          Add RK3 term
    1161              t_surface_p(j,i) = t_surface_p(j,i) + dt_3d * tsc(3)              &
    1162                                 * tt_surface_m(j,i)
    1163 
    1164 !
    1165 !--          Calculate true tendency
    1166              tend = (t_surface_p(j,i) - t_surface(j,i) - dt_3d * tsc(3)        &
    1167                     * tt_surface_m(j,i)) / (dt_3d  * tsc(2))
    1168 !
    1169 !--          Calculate t_surface tendencies for the next Runge-Kutta step
    1170              IF ( timestep_scheme(1:5) == 'runge' )  THEN
    1171                 IF ( intermediate_timestep_count == 1 )  THEN
    1172                    tt_surface_m(j,i) = tend
    1173                 ELSEIF ( intermediate_timestep_count <                         &
    1174                          intermediate_timestep_count_max )  THEN
    1175                    tt_surface_m(j,i) = -9.5625_wp * tend + 5.3125_wp           &
    1176                                        * tt_surface_m(j,i)
     1195             IF ( c_surface /= 0.0_wp )  THEN
     1196
     1197                t_surface_p(j,i) = t_surface_p(j,i) + dt_3d * tsc(3)           &
     1198                                   * tt_surface_m(j,i)
     1199
     1200!
     1201!--             Calculate true tendency
     1202                tend = (t_surface_p(j,i) - t_surface(j,i) - dt_3d * tsc(3)     &
     1203                       * tt_surface_m(j,i)) / (dt_3d  * tsc(2))
     1204!
     1205!--             Calculate t_surface tendencies for the next Runge-Kutta step
     1206                IF ( timestep_scheme(1:5) == 'runge' )  THEN
     1207                   IF ( intermediate_timestep_count == 1 )  THEN
     1208                      tt_surface_m(j,i) = tend
     1209                   ELSEIF ( intermediate_timestep_count <                      &
     1210                            intermediate_timestep_count_max )  THEN
     1211                      tt_surface_m(j,i) = -9.5625_wp * tend + 5.3125_wp        &
     1212                                          * tt_surface_m(j,i)
     1213                   ENDIF
    11771214                ENDIF
    1178              ENDIF
    1179 
    1180              pt_p(k,j,i) = t_surface_p(j,i) / exn
     1215
     1216             ENDIF
     1217
     1218!
     1219!--          In case of fast changes in the skin temperature, it is required to
     1220!--          update the radiative fluxes in order to keep the solution stable
     1221             IF ( ABS( t_surface_p(j,i) - t_surface(j,i) ) > 0.2_wp )  THEN
     1222                force_radiation_call_l = .TRUE.
     1223             ENDIF
     1224
     1225             pt(k,j,i) = t_surface_p(j,i) / exn
     1226
    11811227!
    11821228!--          Calculate fluxes
    1183              rad_net_l(j,i)   = rad_net_l(j,i) + 3.0_wp * sigma_sb                 &
    1184                               * t_surface(j,i)**4 - 4.0_wp * sigma_sb          &
    1185                               * t_surface(j,i)**3 * t_surface_p(j,i)
     1229#if defined ( __rrtmg )
     1230             rad_net_l(j,i)   = rad_net_l(j,i) + rrtm_lwuflx_dt(0,nzb)         &
     1231                                * t_surface(j,i) - rad_lw_out(nzb,j,i)         &
     1232                                - rrtm_lwuflx_dt(0,nzb) * t_surface_p(j,i)
     1233
     1234             IF ( rrtm_idrv == 1 )  THEN
     1235                rad_net(j,i) = rad_net_l(j,i)
     1236                rad_lw_out(nzb,j,i) = rad_lw_out(nzb,j,i)                      &
     1237                                      + rrtm_lwuflx_dt(0,nzb)                  &
     1238                                      * ( t_surface_p(j,i) - t_surface(j,i) )
     1239             ENDIF
     1240#else
     1241             rad_net_l(j,i)   = rad_net_l(j,i) + 3.0_wp * sigma_sb             &
     1242                                * t_surface(j,i)**4 - 4.0_wp * sigma_sb        &
     1243                                * t_surface(j,i)**3 * t_surface_p(j,i)
     1244             rad_net(j,i) = rad_net_l(j,i)
     1245#endif
     1246
    11861247             ghf_eb(j,i)    = lambda_surface * (t_surface_p(j,i)               &
    11871248                              - t_soil(nzb_soil,j,i))
    1188              shf_eb(j,i)    = - f_shf  * ( pt_p(k+1,j,i) - pt_p(k,j,i) )
     1249
     1250             shf_eb(j,i)    = - f_shf * ( pt_1 - pt(k,j,i) )
     1251
     1252             shf(j,i) = shf_eb(j,i) / rho_cp
    11891253
    11901254             IF ( humidity )  THEN
    1191                 qsws_eb(j,i)  = - f_qsws    * ( q_p(k+1,j,i) - q_s + dq_s_dt   &
     1255                qsws_eb(j,i)  = - f_qsws    * ( qv_1 - q_s + dq_s_dt           &
    11921256                                * t_surface(j,i) - dq_s_dt * t_surface_p(j,i) )
    11931257
    1194                 qsws_veg_eb(j,i)  = - f_qsws_veg  * ( q_p(k+1,j,i) - q_s       &
     1258                qsws(j,i) = qsws_eb(j,i) / rho_lv
     1259
     1260                qsws_veg_eb(j,i)  = - f_qsws_veg  * ( qv_1 - q_s               &
    11951261                                    + dq_s_dt * t_surface(j,i) - dq_s_dt       &
    11961262                                    * t_surface_p(j,i) )
    11971263
    1198                 qsws_soil_eb(j,i) = - f_qsws_soil * ( q_p(k+1,j,i) - q_s       &
     1264                qsws_soil_eb(j,i) = - f_qsws_soil * ( qv_1 - q_s               &
    11991265                                    + dq_s_dt * t_surface(j,i) - dq_s_dt       &
    12001266                                    * t_surface_p(j,i) )
    12011267
    1202                 qsws_liq_eb(j,i)  = - f_qsws_liq  * ( q_p(k+1,j,i) - q_s       &
     1268                qsws_liq_eb(j,i)  = - f_qsws_liq  * ( qv_1 - q_s               &
    12031269                                    + dq_s_dt * t_surface(j,i) - dq_s_dt       &
    12041270                                    * t_surface_p(j,i) )
    12051271             ENDIF
    1206 
    12071272!
    12081273!--          Calculate the true surface resistance
    1209              IF ( qsws_eb(j,i) .EQ. 0.0_wp )  THEN
     1274             IF ( qsws_eb(j,i) == 0.0_wp )  THEN
    12101275                r_s(j,i) = 1.0E10_wp
    12111276             ELSE
    1212                 r_s(j,i) = - rho_lv * ( q_p(k+1,j,i) - q_s + dq_s_dt           &
     1277                r_s(j,i) = - rho_lv * ( qv_1 - q_s + dq_s_dt                   &
    12131278                           * t_surface(j,i) - dq_s_dt * t_surface_p(j,i) )     &
    12141279                           / qsws_eb(j,i) - r_a(j,i)
     
    12281293!--                Add precipitation to liquid water reservoir, if possible.
    12291294!--                Otherwise, add the water to bare soil fraction.
    1230                    IF ( m_liq_eb(j,i) .EQ. m_liq_eb_max )  THEN
     1295                   IF ( m_liq_eb(j,i) /= m_liq_eb_max )  THEN
    12311296                      qsws_liq_eb(j,i) = qsws_liq_eb(j,i)                      &
    1232                                        + c_veg(j,i) * precipitation_rate(j,i)  &
     1297                                       + c_veg(j,i) * prr(k,j,i) * hyrho(k)    &
    12331298                                       * 0.001_wp * rho_l * l_v
    12341299                   ELSE
    12351300                      qsws_soil_eb(j,i) = qsws_soil_eb(j,i)                    &
    1236                                         + c_veg(j,i) * precipitation_rate(j,i) &
     1301                                        + c_veg(j,i) * prr(k,j,i) * hyrho(k)  &
    12371302                                        * 0.001_wp * rho_l * l_v
    12381303                   ENDIF
     
    12411306!--                coverage.
    12421307                   qsws_soil_eb(j,i) = qsws_soil_eb(j,i) * (1.0_wp             &
    1243                                        - c_veg(j,i)) * precipitation_rate(j,i) &
     1308                                       - c_veg(j,i)) * prr(k,j,i) * hyrho(k)  &
    12441309                                       * 0.001_wp * rho_l * l_v
    12451310                ENDIF
     1311
    12461312!
    12471313!--             If the air is saturated, check the reservoir water level
    1248                 IF ( q_s .LE. q_p(k+1,j,i))  THEN
     1314                IF ( qsws_eb(j,i) < 0.0_wp )  THEN
     1315
    12491316!
    12501317!--                Check if reservoir is full (avoid values > m_liq_eb_max)
     
    12521319!--                case qsws_veg_eb is zero anyway (because c_liq = 1),       
    12531320!--                so that tend is zero and no further check is needed
    1254                    IF ( m_liq_eb(j,i) .EQ. m_liq_eb_max )  THEN
     1321                   IF ( m_liq_eb(j,i) == m_liq_eb_max )  THEN
    12551322                      qsws_soil_eb(j,i) = qsws_soil_eb(j,i)                    &
    12561323                                           + qsws_liq_eb(j,i)
     
    12621329!--                let the water enter the liquid water reservoir as dew on the
    12631330!--                plant
    1264                    IF ( qsws_veg_eb(j,i) .LT. 0.0_wp )  THEN
     1331                   IF ( qsws_veg_eb(j,i) < 0.0_wp )  THEN
    12651332                      qsws_liq_eb(j,i) = qsws_liq_eb(j,i) + qsws_veg_eb(j,i)
    12661333                      qsws_veg_eb(j,i) = 0.0_wp
     
    13011368       ENDDO
    13021369
     1370#if defined( __parallel )
     1371!
     1372!--    Make a logical OR for all processes. Force radiation call if at
     1373!--    least one processor
     1374       IF ( intermediate_timestep_count == intermediate_timestep_count_max-1 )&
     1375       THEN
     1376
     1377          IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
     1378          CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call,    &
     1379                              1, MPI_LOGICAL, MPI_LOR, comm2d, ierr )
     1380#else
     1381          force_radiation_call = force_radiation_call_l
     1382#endif
     1383          force_radiation_call_l = .FALSE.
     1384       ENDIF
     1385
     1386
    13031387    END SUBROUTINE lsm_energy_balance
    13041388
     
    13221406
    13231407       REAL(wp), DIMENSION(nzb_soil:nzt_soil) :: gamma_temp,  & !< temp. gamma
    1324                                                lambda_temp, & !< temp. lambda
    1325                                                tend           !< tendency
    1326 
    1327        DO i = nxlg, nxrg   
    1328           DO j = nysg, nyng
    1329              DO k = nzb_soil, nzt_soil
     1408                                                 lambda_temp, & !< temp. lambda
     1409                                                 tend           !< tendency
     1410
     1411       DO  i = nxlg, nxrg
     1412          DO  j = nysg, nyng
     1413             DO  k = nzb_soil, nzt_soil
    13301414!
    13311415!--             Calculate volumetric heat capacity of the soil, taking into
     
    13351419
    13361420!
    1337 !--             Calculate soil heat conductivity at the center of the soil 
     1421!--             Calculate soil heat conductivity at the center of the soil
    13381422!--             layers
     1423                lambda_h_sat = lambda_h_sm ** (1.0_wp - m_sat(j,i)) *          &
     1424                               lambda_h_water ** m_soil(k,j,i)
     1425
    13391426                ke = 1.0_wp + LOG10(MAX(0.1_wp,m_soil(k,j,i) / m_sat(j,i)))
    1340                 lambda_temp(k) = ke * (lambda_h_sat(j,i) + lambda_h_dry) +     &
     1427
     1428                lambda_temp(k) = ke * (lambda_h_sat - lambda_h_dry) +          &
    13411429                                 lambda_h_dry
    13421430
     
    13461434!--          Calculate soil heat conductivity (lambda_h) at the _stag level
    13471435!--          using linear interpolation
    1348              DO k = nzb_soil, nzt_soil-1
    1349                  
    1350                 lambda_h(k,j,i) = lambda_temp(k) +                             &
    1351                                   ( lambda_temp(k+1) - lambda_temp(k) )        &
    1352                                   * 0.5 * dz_soil_stag(k) * ddz_soil(k+1)
    1353 
     1436             DO  k = nzb_soil, nzt_soil-1
     1437                lambda_h(k,j,i) = ( lambda_temp(k+1) + lambda_temp(k) ) * 0.5_wp
    13541438             ENDDO
    13551439             lambda_h(nzt_soil,j,i) = lambda_temp(nzt_soil)
     
    13581442!--          Prognostic equation for soil temperature t_soil
    13591443             tend(:) = 0.0_wp
    1360              tend(0) = (1.0_wp/rho_c_total(nzb_soil,j,i)) *                    &
     1444             tend(nzb_soil) = (1.0_wp/rho_c_total(nzb_soil,j,i)) *             &
    13611445                       ( lambda_h(nzb_soil,j,i) * ( t_soil(nzb_soil+1,j,i)     &
    1362                          - t_soil(nzb_soil,j,i) ) * ddz_soil(nzb_soil       &
     1446                         - t_soil(nzb_soil,j,i) ) * ddz_soil(nzb_soil+1)       &
    13631447                         + ghf_eb(j,i) ) * ddz_soil_stag(nzb_soil)
    13641448
    1365              DO  k = 1, nzt_soil
     1449
     1450
     1451
     1452             DO  k = nzb_soil+1, nzt_soil
    13661453                tend(k) = (1.0_wp/rho_c_total(k,j,i))                          &
    13671454                          * (   lambda_h(k,j,i)                                &
    13681455                              * ( t_soil(k+1,j,i) - t_soil(k,j,i) )            &
    1369                               * ddz_soil(k                                  &
     1456                              * ddz_soil(k+1)                                  &
    13701457                              - lambda_h(k-1,j,i)                              &
    13711458                              * ( t_soil(k,j,i) - t_soil(k-1,j,i) )            &
    1372                               * ddz_soil(k-1)                                  &
     1459                              * ddz_soil(k                                  &
    13731460                            ) * ddz_soil_stag(k)
    13741461             ENDDO
     
    13961483
    13971484
    1398              DO k = nzb_soil, nzt_soil
     1485             DO  k = nzb_soil, nzt_soil
    13991486
    14001487!
     
    14141501                              / (n_vg(j,i)-1.0_wp)) - 1.0_wp                   &
    14151502                          )**(1.0_wp/n_vg(j,i)) / alpha_vg(j,i)
     1503
    14161504
    14171505                   gamma_temp(k) = gamma_w_sat(j,i) * ( ( (1.0_wp +            &
     
    14381526!--             using linear interpolation. To do: replace this with
    14391527!--             ECMWF-IFS Eq. 8.81
    1440                 DO k = nzb_soil, nzt_soil-1
     1528                DO  k = nzb_soil, nzt_soil-1
    14411529                     
    1442                    lambda_w(k,j,i) = lambda_temp(k) +                          &
    1443                                      ( lambda_temp(k+1) - lambda_temp(k) )     &
    1444                                      * 0.5_wp * dz_soil_stag(k) * ddz_soil(k+1)
    1445                    gamma_w(k,j,i)  = gamma_temp(k) +                           &
    1446                                      ( gamma_temp(k+1) - gamma_temp(k) )       &
    1447                                      * 0.5_wp * dz_soil_stag(k) * ddz_soil(k+1)                 
     1530                   lambda_w(k,j,i) = ( lambda_temp(k+1) + lambda_temp(k) )     &
     1531                                     * 0.5_wp
     1532                   gamma_w(k,j,i)  = ( gamma_temp(k+1) + gamma_temp(k) )       &
     1533                                     * 0.5_wp
    14481534
    14491535                ENDDO
     
    14571543                   gamma_w(nzt_soil,j,i) = 0.0_wp
    14581544                ELSE
    1459                    gamma_w(nzt_soil,j,i) = lambda_temp(nzt_soil)
     1545                   gamma_w(nzt_soil,j,i) = gamma_temp(nzt_soil)
    14601546                ENDIF     
    14611547
     
    14701556
    14711557!
    1472 !--             Calculate the root extraction (ECMWF 7.69, modified so that the
    1473 !--             sum of root_extr = 1). The energy balance solver guarantees a
    1474 !--             positive transpiration, so that there is no need for an
    1475 !--             additional check.
    1476 
    1477                 m_total = 0.0_wp
    1478                 DO k = nzb_soil, nzt_soil
    1479                     IF ( m_soil(k,j,i) .GT. m_wilt(j,i) )  THEN
     1558!--             Calculate the root extraction (ECMWF 7.69, the sum of root_extr
     1559!--             = 1). The energy balance solver guarantees a positive
     1560!--             transpiration, so that there is no need for an additional check.
     1561                DO  k = nzb_soil, nzt_soil
     1562                    IF ( m_soil(k,j,i) > m_wilt(j,i) )  THEN
    14801563                       m_total = m_total + root_fr(k,j,i) * m_soil(k,j,i)
    14811564                    ENDIF
    14821565                ENDDO 
    14831566
    1484                 DO k = nzb_soil, nzt_soil
    1485                    IF ( m_soil(k,j,i) .GT. m_wilt(j,i) )  THEN
    1486                       root_extr(k) = root_fr(k,j,i) * m_soil(k,j,i) / m_total
    1487                    ELSE
    1488                       root_extr(k) = 0.0_wp
    1489                    ENDIF
    1490                 ENDDO
     1567                IF ( m_total > 0.0_wp )  THEN
     1568                   DO  k = nzb_soil, nzt_soil
     1569                      IF ( m_soil(k,j,i) > m_wilt(j,i) )  THEN
     1570                         root_extr(k) = root_fr(k,j,i) * m_soil(k,j,i) / m_total
     1571                      ELSE
     1572                         root_extr(k) = 0.0_wp
     1573                      ENDIF
     1574                   ENDDO
     1575                ENDIF
    14911576
    14921577!
     
    14951580                tend(nzb_soil) = ( lambda_w(nzb_soil,j,i) * (                  &
    14961581                            m_soil(nzb_soil+1,j,i) - m_soil(nzb_soil,j,i) )    &
    1497                             * ddz_soil(nzb_soil) - gamma_w(nzb_soil,j,i) - (  &
     1582                            * ddz_soil(nzb_soil+1) - gamma_w(nzb_soil,j,i) - ( &
    14981583                            root_extr(nzb_soil) * qsws_veg_eb(j,i)             &
    14991584                            + qsws_soil_eb(j,i) ) * drho_l_lv )                &
     
    15021587                DO  k = nzb_soil+1, nzt_soil-1
    15031588                   tend(k) = ( lambda_w(k,j,i) * ( m_soil(k+1,j,i)             &
    1504                                - m_soil(k,j,i) ) * ddz_soil(k) - gamma_w(k,j,i)&
    1505                                - lambda_w(k-1,j,i) * (m_soil(k,j,i) -          &
    1506                                m_soil(k-1,j,i)) * ddz_soil(k-1)                &
    1507                                + gamma_w(k-1,j,i) - (root_extr(k)              &
    1508                                * qsws_veg_eb(j,i) * drho_l_lv)                 &
     1589                             - m_soil(k,j,i) ) * ddz_soil(k+1) - gamma_w(k,j,i)&
     1590                             - lambda_w(k-1,j,i) * (m_soil(k,j,i) -            &
     1591                             m_soil(k-1,j,i)) * ddz_soil(k)                    &
     1592                             + gamma_w(k-1,j,i) - (root_extr(k)                &
     1593                             * qsws_veg_eb(j,i) * drho_l_lv)                   &
    15091594                             ) * ddz_soil_stag(k)
    15101595
     
    15141599                                        * (m_soil(nzt_soil,j,i)                &
    15151600                                        - m_soil(nzt_soil-1,j,i))              &
    1516                                         * ddz_soil(nzt_soil-1)                 &
     1601                                        * ddz_soil(nzt_soil                 &
    15171602                                        + gamma_w(nzt_soil-1,j,i) - (          &
    15181603                                          root_extr(nzt_soil)                  &
     
    15731658       REAL(wp) :: resistance    !< aerodynamic and soil resistance term
    15741659
    1575        DO i = nxlg, nxrg   
    1576           DO j = nysg, nyng
     1660       DO  i = nxlg, nxrg   
     1661          DO  j = nysg, nyng
    15771662             k = nzb_s_inner(j,i)
    15781663
    15791664!
    15801665!--          Calculate water vapour pressure at saturation
    1581              e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surface(j,i)     &
    1582                                               - 273.16_wp ) / ( t_surface(j,i) &
    1583                                               - 35.86_wp ) )
     1666             e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surface_p(j,i)   &
     1667                   - 273.16_wp ) / ( t_surface_p(j,i) - 35.86_wp ) )
    15841668
    15851669!
     
    15871671             q_s = 0.622_wp * e_s / surface_pressure
    15881672
    1589 
    15901673             resistance = r_a(j,i) / (r_a(j,i) + r_s(j,i))
    15911674
    15921675!
    15931676!--          Calculate specific humidity at surface
    1594              q_p(k,j,i) = resistance * q_s + (1.0_wp - resistance)             &
    1595                           * q_p(k+1,j,i)
     1677             IF ( cloud_physics )  THEN
     1678                q(k,j,i) = resistance * q_s + (1.0_wp - resistance)            &
     1679                             * ( q(k+1,j,i) - ql(k+1,j,i) )
     1680             ELSE
     1681                q(k,j,i) = resistance * q_s + (1.0_wp - resistance)            &
     1682                             * q(k+1,j,i)
     1683             ENDIF
     1684
     1685!
     1686!--          Update virtual potential temperature
     1687             vpt(k,j,i) = pt(k,j,i) * ( 1.0_wp + 0.61_wp * q(k,j,i) )
    15961688
    15971689          ENDDO
Note: See TracChangeset for help on using the changeset viewer.