Changeset 4713 for palm/trunk/SOURCE


Ignore:
Timestamp:
Sep 29, 2020 12:02:05 PM (4 years ago)
Author:
pavelkrc
Message:

Correct and improve OpenMP parallelization, fix numerical instabilities

Location:
palm/trunk/SOURCE
Files:
3 edited

Legend:

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

    r4694 r4713  
    2525! -----------------
    2626! $Id$
     27! - Optimize calculation in case of calc_soil_moisture=false
     28! - Improve OMP parallelization
     29! - Do not calculate surface prognostic temperature for water surfaces (avoid numerical
     30!   instabilities)
     31! Author: J. Resler
     32!
     33! 4694 2020-09-23 15:09:19Z pavelkrc
    2734! Fix reading of surface data from MPI restart file
    2835!
     
    17341741    i_off = surf%ioff
    17351742
    1736     !$OMP PARALLEL PRIVATE (m, i, j, k, lambda_h_sat, ke, lambda_soil, lambda_surface,             &
     1743    !$OMP PARALLEL PRIVATE (m, i, j, k, lambda_h_sat, ke, lambda_soil, lambda_surface, ueff,       &
    17371744    !$OMP&                  c_surface_tmp, f1,m_total, f2, e_s, e, f3, m_min, m_liq_max, q_s,      &
    17381745    !$OMP&                  f_qsws_veg, f_qsws_soil, f_qsws_liq, f_shf, f_qsws, e_s_dt, dq_s_dt,   &
     
    20382045!--    Implicit solution when the surface layer has no heat capacity,
    20392046!--    otherwise use RK3 scheme.
    2040        surf_t_surface_p%var_1d(m) = ( coef_1 * dt_3d * tsc(2) + c_surface_tmp *&
    2041                           surf_t_surface%var_1d(m) ) / ( c_surface_tmp + coef_2&
     2047       IF ( surf%water_surface(m) )  THEN
     2048!
     2049!--       water temperature is fixed (avoid numerical inaccuracies)
     2050          surf_t_surface_p%var_1d(m) = surf_t_surface%var_1d(m)
     2051       ELSE
     2052          surf_t_surface_p%var_1d(m) = ( coef_1 * dt_3d * tsc(2) + c_surface_tmp * &
     2053                          surf_t_surface%var_1d(m) ) / ( c_surface_tmp + coef_2    &
    20422054                                             * dt_3d * tsc(2) )
    2043 
     2055       ENDIF
    20442056!
    20452057!--    Add RK3 term
     
    55455557       ENDIF
    55465558
    5547        !$OMP PARALLEL PRIVATE (m, k, lambda_temp, lambda_h_sat, ke, tend, gamma_temp, h_vg, m_total)
     5559       !$OMP PARALLEL PRIVATE (m, k, lambda_temp, lambda_h_sat, ke, tend, gamma_temp, h_vg,       &
     5560       !$OMP&                  m_total, root_extr)
    55485561       !$OMP DO SCHEDULE (STATIC)
    55495562       DO  m = 1, surf%ns
     
    56365649
    56375650
    5638              DO  k = nzb_soil, nzt_soil
    5639 
    5640 !
    5641 !--             In order to prevent water tranport through paved surfaces,
    5642 !--             conductivity and diffusivity are set to zero
    5643                 IF ( surf%pavement_surface(m)  .AND.                           &
    5644                      k <= surf%nzt_pavement(m) )  THEN
    5645                    lambda_temp(k) = 0.0_wp
    5646                    gamma_temp(k)  = 0.0_wp
    5647 
    5648                 ELSE
    5649 
    5650 !
    5651 !--                Calculate soil diffusivity at the center of the soil layers
    5652                    lambda_temp(k) = (- b_ch * surf%gamma_w_sat(k,m) * psi_sat  &
    5653                                     / surf%m_sat(k,m) ) * (                    &
    5654                                     MAX( surf_m_soil%var_2d(k,m),              &
    5655                                     surf%m_wilt(k,m) ) / surf%m_sat(k,m) )**(  &
    5656                                     b_ch + 2.0_wp )
    5657 
    5658 !
    5659 !--                Parametrization of Van Genuchten
    5660 !--                Calculate the hydraulic conductivity after Van Genuchten (1980)
    5661                    h_vg = ( ( ( surf%m_res(k,m) - surf%m_sat(k,m) ) /          &
    5662                               ( surf%m_res(k,m) -                              &
    5663                                 MAX( surf_m_soil%var_2d(k,m), surf%m_wilt(k,m) )&
    5664                               )                                                &
    5665                             )**(                                               &
    5666                           surf%n_vg(k,m) / ( surf%n_vg(k,m) - 1.0_wp )         &
    5667                                ) - 1.0_wp                                      &
    5668                           )**( 1.0_wp / surf%n_vg(k,m) ) / surf%alpha_vg(k,m)
    5669 
    5670                    gamma_temp(k) = surf%gamma_w_sat(k,m) * ( ( ( 1.0_wp +      &
    5671                           ( surf%alpha_vg(k,m) * h_vg )**surf%n_vg(k,m)        &
    5672                                                                   )**(         &
    5673                               1.0_wp - 1.0_wp / surf%n_vg(k,m)) - (            &
    5674                           surf%alpha_vg(k,m) * h_vg )**( surf%n_vg(k,m)        &
    5675                               - 1.0_wp) )**2 )                                 &
    5676                               / ( ( 1.0_wp + ( surf%alpha_vg(k,m) * h_vg       &
    5677                               )**surf%n_vg(k,m) )**( ( 1.0_wp  - 1.0_wp        &
    5678                               / surf%n_vg(k,m) ) *                             &
    5679                               ( surf%l_vg(k,m) + 2.0_wp) ) )
    5680 
    5681                 ENDIF
    5682 
    5683              ENDDO
    5684 
    5685 
    56865651             IF ( calc_soil_moisture )  THEN
    56875652
     5653                DO  k = nzb_soil, nzt_soil
     5654   !
     5655   !--             In order to prevent water tranport through paved surfaces,
     5656   !--             conductivity and diffusivity are set to zero
     5657                   IF ( surf%pavement_surface(m)  .AND.                           &
     5658                        k <= surf%nzt_pavement(m) )  THEN
     5659                      lambda_temp(k) = 0.0_wp
     5660                      gamma_temp(k)  = 0.0_wp
     5661
     5662                   ELSE
     5663
     5664   !
     5665   !--                Calculate soil diffusivity at the center of the soil layers
     5666                      lambda_temp(k) = (- b_ch * surf%gamma_w_sat(k,m) * psi_sat  &
     5667                                       / surf%m_sat(k,m) ) * (                    &
     5668                                       MAX( surf_m_soil%var_2d(k,m),              &
     5669                                       surf%m_wilt(k,m) ) / surf%m_sat(k,m) )**(  &
     5670                                       b_ch + 2.0_wp )
     5671
     5672   !
     5673   !--                Parametrization of Van Genuchten
     5674   !--                Calculate the hydraulic conductivity after Van Genuchten (1980)
     5675                      h_vg = ( ( ( surf%m_res(k,m) - surf%m_sat(k,m) ) /          &
     5676                                 ( surf%m_res(k,m) -                              &
     5677                                   MAX( surf_m_soil%var_2d(k,m), surf%m_wilt(k,m) )&
     5678                                 )                                                &
     5679                               )**(                                               &
     5680                             surf%n_vg(k,m) / ( surf%n_vg(k,m) - 1.0_wp )         &
     5681                                  ) - 1.0_wp                                      &
     5682                             )**( 1.0_wp / surf%n_vg(k,m) ) / surf%alpha_vg(k,m)
     5683
     5684                      gamma_temp(k) = surf%gamma_w_sat(k,m) * ( ( ( 1.0_wp +      &
     5685                             ( surf%alpha_vg(k,m) * h_vg )**surf%n_vg(k,m)        &
     5686                                                                     )**(         &
     5687                                 1.0_wp - 1.0_wp / surf%n_vg(k,m)) - (            &
     5688                             surf%alpha_vg(k,m) * h_vg )**( surf%n_vg(k,m)        &
     5689                                 - 1.0_wp) )**2 )                                 &
     5690                                 / ( ( 1.0_wp + ( surf%alpha_vg(k,m) * h_vg       &
     5691                                 )**surf%n_vg(k,m) )**( ( 1.0_wp  - 1.0_wp        &
     5692                                 / surf%n_vg(k,m) ) *                             &
     5693                                 ( surf%l_vg(k,m) + 2.0_wp) ) )
     5694
     5695                   ENDIF
     5696
     5697                ENDDO
    56885698!
    56895699!--             Prognostic equation for soil moisture content. Only performed,
     
    71577167                ALLOCATE( t_soil_h(1)%var_2d(nzb_soil:nzt_soil+1,              &
    71587168                                          1:surf_lsm_h(1)%ns) )
    7159              write(9,*) surf_lsm_h(1)%ns
    71607169             READ ( 13 )  tmp_walltype_h_2d(1)%var_2d
    71617170          ENDIF
     
    77537762!       REAL(wp) :: re_0 !< near-surface roughness Reynolds number
    77547763
     7764       !$OMP DO PRIVATE (m, i, j) SCHEDULE (STATIC) REDUCTION(.OR.:flag_exceed_z0, flag_exceed_z0h)
    77557765       DO  m = 1, surf_lsm_h(0)%ns
    77567766!--       only upward facin horizontal surfaces are considered for water surface processing
    7757           i   = surf_lsm_h(0)%i(m)
    7758           j   = surf_lsm_h(0)%j(m)
    77597767
    77607768          IF ( surf_lsm_h(0)%water_surface(m) )  THEN
    7761 
     7769             i   = surf_lsm_h(0)%i(m)
     7770             j   = surf_lsm_h(0)%j(m)
    77627771!
    77637772!--          Disabled: FLake parameterization. Ideally, the Charnock
     
    78137822          ENDIF
    78147823       ENDDO
     7824       !$OMP END DO
    78157825#if defined( __parallel )
    78167826       CALL MPI_ALLREDUCE( MPI_IN_PLACE, flag_exceed_z0, 1, MPI_LOGICAL,       &
  • palm/trunk/SOURCE/radiation_model_mod.f90

    r4708 r4713  
    2828! -----------------
    2929! $Id$
     30! Correct OpenMP parallelization including cycles with cumulative variables (J. Resler)
     31!
     32! 4708 2020-09-28 17:42:58Z suehring
    3033! - Bugfix, correct mapping of RRTMG heating rates, as well as incoming/outgoing
    3134!   radiation onto the topography-following grid
     
    59675970     REAL(wp)                          ::  pabs_pc_lwdifl     !< total absorbed LW radiation in plant canopy from sky in local processor (W)
    59685971     REAL(wp)                          ::  pabs_pc_lwdif      !< total absorbed LW radiation in plant canopy from sky in all processors (W)
    5969 
     5972!-   rotation related variables
    59705973     REAL(wp)                          ::  sun_direct_factor  !< factor for direct normal radiation from direct horizontal
    59715974     REAL(wp)                          ::  sin_rot            !< sine of rotation_angle
     
    60726075!--  Set up thermal radiation from surfaces
    60736076     mm = 1
     6077!--  following code depends on the order of the execution
     6078!--  do not parallelize by OpenMP
    60746079     DO  i = nxl, nxr
    60756080        DO  j = nys, nyn
     
    61596164
    61606165     IF ( surface_reflections)  THEN
     6166        !$OMP DO PRIVATE (i, j, k, isvf, isurf, isurfsrc) SCHEDULE (STATIC)
    61616167        DO  isvf = 1, nsvfl
    61626168           isurf = svfsurf(1, isvf)
     
    61736179           ENDIF
    61746180        ENDDO
     6181        !$OMP END DO
    61756182     ENDIF
    61766183!
    61776184!--  diffuse radiation using sky view factor
     6185     !$OMP DO PRIVATE (i, j, d, isurf) REDUCTION(+:pinswl, pinlwl) SCHEDULE (STATIC)
    61786186     DO isurf = 1, nsurfl
    61796187        j = surfl(iy, isurf)
     
    61936201        ENDIF
    61946202     ENDDO
     6203     !$OMP END DO
    61956204!
    61966205!--  MRT diffuse irradiance
     6206     !$OMP DO PRIVATE (i, j, imrt) SCHEDULE (STATIC)
    61976207     DO  imrt = 1, nmrtbl
    61986208        j = mrtbl(iy, imrt)
     
    62016211        mrtinlw(imrt) = mrtsky(imrt) * rad_lw_in_diff(j,i)
    62026212     ENDDO
     6213     !$OMP END DO
    62036214!
    62046215!--  Direct radiation
     
    62186229        isd = dsidir_rev(j, i)
    62196230!-- TODO: check if isd = -1 to report that this solar position is not precalculated
     6231        !$OMP DO PRIVATE (i, j, d, isurf)  REDUCTION(+:pinswl) SCHEDULE (STATIC)
    62206232        DO isurf = 1, nsurfl
    62216233           j = surfl(iy, isurf)
     
    62276239           pinswl = pinswl + surfinswdir(isurf) * facearea(d)
    62286240        ENDDO
     6241        !$OMP END DO
    62296242!
    62306243!--     MRT direct irradiance
     6244        !$OMP DO PRIVATE (i, j, imrt) SCHEDULE (STATIC)
    62316245        DO  imrt = 1, nmrtbl
    62326246           j = mrtbl(iy, imrt)
     
    62356249                                     * sun_direct_factor / 4.0_wp ! normal to sphere
    62366250        ENDDO
     6251        !$OMP END DO
    62376252     ENDIF
    62386253!
    62396254!--  MRT first pass thermal
     6255     !$OMP DO PRIVATE (imrtf, imrt, isurfsrc) SCHEDULE (STATIC)
    62406256     DO  imrtf = 1, nmrtf
    62416257        imrt = mrtfsurf(1, imrtf)
     
    62436259        mrtinlw(imrt) = mrtinlw(imrt) + mrtf(imrtf) * surfoutl(isurfsrc)
    62446260     ENDDO
     6261     !$OMP END DO
    62456262!
    62466263!--  Absorption in each local plant canopy grid box from the first atmospheric
     
    62526269         pcbinlw(:) = 0.0_wp
    62536270
     6271         !$OMP DO PRIVATE (icsf, ipcgb, i, j, k, kk, isurfsrc, pc_abs_frac, pcrad, asrc)          &
     6272         !$OMP&   REDUCTION(+:pinswl, pinlwl, pabslwl, pemitlwl, pabs_pc_lwdifl) SCHEDULE (STATIC)
    62546273         DO icsf = 1, ncsfl
    62556274             ipcgb = csfsurf(1, icsf)
     
    63096328             ENDIF
    63106329         ENDDO
     6330         !$OMP END DO
    63116331
    63126332         pcbinsw(:) = pcbinswdir(:) + pcbinswdif(:)
     
    63626382     ENDIF
    63636383
    6364 !-- Next passes of radiation interactions:
     6384!--  Next passes of radiation interactions:
    63656385!--  radiation reflections
    63666386
     
    64046424!
    64056425!--      Reflected radiation
     6426         !$OMP DO PRIVATE (isvf, isurf, isurfsrc) SCHEDULE (STATIC)
    64066427         DO isvf = 1, nsvfl
    64076428             isurf = svfsurf(1, isvf)
     
    64146435             ENDIF
    64156436         ENDDO
     6437         !$OMP END DO
    64166438!
    64176439!--      NOTE: PC absorbtion and MRT from reflected can both be done at once
     
    64216443!
    64226444!--      Radiation absorbed by plant canopy
     6445         !$OMP DO PRIVATE (icsf, ipcgb, isurfsrc, asrc) SCHEDULE (STATIC)
    64236446         DO  icsf = 1, ncsfl
    64246447             ipcgb = csfsurf(1, icsf)
     
    64356458             ENDIF
    64366459         ENDDO
     6460         !$OMP END DO
    64376461!
    64386462!--      MRT reflected
     6463         !$OMP DO PRIVATE (imrtf, imrt, isurfsrc) SCHEDULE (STATIC)
    64396464         DO  imrtf = 1, nmrtf
    64406465            imrt = mrtfsurf(1, imrtf)
     
    64436468            mrtinlw(imrt) = mrtinlw(imrt) + mrtf(imrtf) * surfoutl(isurfsrc)
    64446469         ENDDO
     6470         !$OMP END DO
    64456471
    64466472         IF ( trace_fluxes_above >= 0.0_wp )  THEN
     
    64646490     IF ( npcbl > 0 )  THEN
    64656491         pcm_heating_rate(:,:,:) = 0.0_wp
     6492         !$OMP DO PRIVATE (ipcgb, i, j, k, kk) REDUCTION(+:pabsswl) SCHEDULE (STATIC)
    64666493         DO ipcgb = 1, npcbl
    64676494             j = pcbl(iy, ipcgb)
     
    64766503             pabsswl = pabsswl + pcbinsw(ipcgb)
    64776504         ENDDO
     6505         !$OMP END DO
    64786506
    64796507         IF ( humidity .AND. plant_canopy_transpiration ) THEN
     
    64816509             pcm_transpiration_rate(:,:,:) = 0.0_wp
    64826510             pcm_latent_rate(:,:,:) = 0.0_wp
     6511             !$OMP DO PRIVATE (ipcgb, i, j, k, kk) SCHEDULE (STATIC)
    64836512             DO ipcgb = 1, npcbl
    64846513                 i = pcbl(ix, ipcgb)
     
    64906519                                                   pcm_transpiration_rate(kk,j,i),  &
    64916520                                                   pcm_latent_rate(kk,j,i) )
    6492               ENDDO
     6521             ENDDO
     6522             !$OMP END DO
    64936523         ENDIF
    64946524     ENDIF
     
    65066536!    and claculate relevant radiation model-RTM coupling terms
    65076537     mm = 1
     6538!--  following code depends on the order of the execution
     6539!--  do not parallelize by OpenMP
    65086540     DO  i = nxl, nxr
    65096541        DO  j = nys, nyn
     
    65986630     ENDDO
    65996631
     6632     !$OMP DO PRIVATE (i, d) REDUCTION(+:pabsswl, pabslwl, pemitlwl, pabs_surf_lwdifl) &
     6633     !$OMP&   SCHEDULE (STATIC)
    66006634     DO  i = 1, nsurfl
    66016635        d  = surfl(id, i)
     
    66126646                           emiss_surf(i) * facearea(d) * surfinlwdif(i)
    66136647     ENDDO
     6648     !$OMP END DO
    66146649
    66156650     DO l = 0, 1
     6651        !$OMP DO PRIVATE (m) SCHEDULE (STATIC)
    66166652        DO  m = 1, surf_usm_h(l)%ns
    66176653           surf_usm_h(l)%surfhf(m) = surf_usm_h(l)%rad_sw_in(m)  +          &
     
    66206656                                  surf_usm_h(l)%rad_lw_out(m)
    66216657        ENDDO
     6658        !$OMP END DO
     6659        !$OMP DO PRIVATE (m) SCHEDULE (STATIC)
    66226660        DO  m = 1, surf_lsm_h(l)%ns
    66236661           surf_lsm_h(l)%surfhf(m) = surf_lsm_h(l)%rad_sw_in(m)  +          &
     
    66266664                                  surf_lsm_h(l)%rad_lw_out(m)
    66276665        ENDDO
     6666        !$OMP END DO
    66286667     ENDDO
     6668
    66296669     DO  l = 0, 3
     6670        !$OMP DO PRIVATE (m) SCHEDULE (STATIC)
    66306671!--     urban
    66316672        DO  m = 1, surf_usm_v(l)%ns
     
    66356676                                     surf_usm_v(l)%rad_lw_out(m)
    66366677        ENDDO
     6678        !$OMP END DO
    66376679!--     land
     6680        !$OMP DO PRIVATE (m) SCHEDULE (STATIC)
    66386681        DO  m = 1, surf_lsm_v(l)%ns
    66396682           surf_lsm_v(l)%surfhf(m) = surf_lsm_v(l)%rad_sw_in(m)  +          &
     
    66436686
    66446687        ENDDO
     6688        !$OMP END DO
    66456689     ENDDO
    66466690!
  • palm/trunk/SOURCE/urban_surface_mod.f90

    r4701 r4713  
    2727! -----------------
    2828! $Id$
     29! - Do not change original fractions in USM energy balance
     30! - Correct OpenMP parallelization
     31! Author: J. Resler
     32!
     33! 4701 2020-09-27 11:02:15Z maronga
    2934! Corrected parameter 33 for building_type 2 (ground floor window emissivity
    3035!
     
    67636768!
    67646769!-- First, treat horizontal surface elements
    6765     !$OMP PARALLEL PRIVATE (m, i, j, k, lambda_surface, lambda_surface_window,                      &
    6766     !$OMP&                  lambda_surface_green, qv1, rho_cp, rho_lv, drho_l_lv, f_shf,            &
    6767     !$OMP&                  f_shf_window, f_shf_green, m_total, f1, f2, e_s, e, f3, f_qsws_veg,    &
    6768     !$OMP&                  q_s, f_qsws_liq, f_qsws, e_s_dt, dq_s_dt, coef_1, coef_window_1,        &
    6769     !$OMP&                  coef_green_1, coef_2, coef_window_2, coef_green_2, stend_wall,          &
    6770     !$OMP&                  stend_window, stend_green, tend, m_liq_max)
     6770    !$OMP PARALLEL PRIVATE (m, i, j, k, frac_win, frac_wall, frac_green, lambda_surface, ueff,    &
     6771    !$OMP&                  lambda_surface_window, lambda_surface_green, qv1, rho_cp, rho_lv,     &
     6772    !$OMP&                  drho_l_lv, f_shf, f_shf_window, f_shf_green, m_total, f1, f2, e_s, e, &
     6773    !$OMP&                  f3, f_qsws_veg, q_s, f_qsws_liq, f_qsws, e_s_dt, dq_s_dt, coef_1,     &
     6774    !$OMP&                  coef_window_1, coef_green_1, coef_2, coef_window_2, coef_green_2,     &
     6775    !$OMP&                  stend_wall, stend_window, stend_green, tend, m_liq_max)
    67716776    !$OMP DO SCHEDULE (STATIC)
    67726777    DO  m = 1, surf%ns
     
    67756780!--    Note, this is a temporary fix and needs to be removed later.
    67766781       IF ( during_spinup )  THEN
    6777           frac_win                         = surf%frac(m,ind_wat_win)
    6778           frac_wall                        = surf%frac(m,ind_veg_wall)
    6779           frac_green                       = surf%frac(m,ind_pav_green)
    6780           surf%frac(m,ind_wat_win)   = 0.0_wp
    6781           surf%frac(m,ind_veg_wall)  = 1.0_wp
    6782           surf%frac(m,ind_pav_green) = 0.0_wp
     6782          frac_win   = 0.0_wp
     6783          frac_wall  = 1.0_wp
     6784          frac_green = 0.0_wp
     6785       ELSE
     6786          frac_win   = surf%frac(m,ind_wat_win)
     6787          frac_wall  = surf%frac(m,ind_veg_wall)
     6788          frac_green = surf%frac(m,ind_pav_green)
    67836789       ENDIF
    67846790!
     
    68036809       rho_cp  = c_p * hyp(k) / ( r_d * surf%pt1(m) * exner(k) )
    68046810
    6805        IF ( surf%frac(m,ind_pav_green) > 0.0_wp )  THEN
     6811       IF ( frac_green > 0.0_wp )  THEN
    68066812!
    68076813!--       Calculate frequently used parameters
     
    68436849!--           to calculation of roughness relative to concrete. Note, wind velocity is limited
    68446850!--           to avoid division by zero. The nominator can become <= 0.0 for values z0 < 3*10E-4.
    6845               ueff        = MAX ( SQRT( ( ( u(k,j,i) + u(k,j,i+1) ) * 0.5_wp )**2 +                  &
    6846                                         ( ( v(k,j,i) + v(k,j+1,i) ) * 0.5_wp )**2 +                  &
    6847                                         ( ( w(k,j,i) + w(k-1,j,i) ) * 0.5_wp )**2 ),                 &
    6848                                   ( ( 4.0_wp + 0.1_wp )                                              &
    6849                                     / ( surf%z0(m) * d_roughness_concrete )                 &
    6850                                    - 11.8_wp ) / 4.2_wp                                              &
     6851              ueff        = MAX ( SQRT( ( ( u(k,j,i) + u(k,j,i+1) ) * 0.5_wp )**2 +               &
     6852                                        ( ( v(k,j,i) + v(k,j+1,i) ) * 0.5_wp )**2 +               &
     6853                                        ( ( w(k,j,i) + w(k-1,j,i) ) * 0.5_wp )**2 ),              &
     6854                                  ( ( 4.0_wp + 0.1_wp )                                           &
     6855                                    / ( surf%z0(m) * d_roughness_concrete )                       &
     6856                                   - 11.8_wp ) / 4.2_wp                                           &
    68516857                                 )
    68526858
    6853               surf%r_a(m) = rho_cp / ( surf%z0(m) * d_roughness_concrete            &
     6859              surf%r_a(m) = rho_cp / ( surf%z0(m) * d_roughness_concrete                          &
    68546860                                     * ( 11.8_wp + 4.2_wp * ueff )  - 4.0_wp  )
    68556861       ENDIF
     
    68696875       f_shf_green   = rho_cp / surf%r_a_green(m)
    68706876
    6871        IF ( surf%frac(m,ind_pav_green) > 0.0_wp )  THEN
     6877       IF ( frac_green > 0.0_wp )  THEN
    68726878!
    68736879!--       Adapted from LSM:
     
    68766882
    68776883!--       f1: Correction for incoming shortwave radiation (stomata close at night)
    6878           f1 = MIN( 1.0_wp, ( 0.004_wp * surf%rad_sw_in(m) + 0.05_wp ) /                     &
     6884          f1 = MIN( 1.0_wp, ( 0.004_wp * surf%rad_sw_in(m) + 0.05_wp ) /                          &
    68796885                    (0.81_wp * ( 0.004_wp * surf%rad_sw_in(m) + 1.0_wp ) ) )
    68806886!
     
    69146920!--       obsolete, as r_canopy is not used below.
    69156921!--       To do: check for very dry soil -> r_canopy goes to infinity
    6916           surf%r_canopy(m) = surf%r_canopy_min(m) /                                    &
     6922          surf%r_canopy(m) = surf%r_canopy_min(m) /                                               &
    69176923                                  ( surf%lai(m) * f1 * f2 * f3 + 1.0E-20_wp )
    69186924!
     
    69686974               + f_shf * surf%pt1(m) + lambda_surface * t_wall%val(nzb_wall,m)
    69696975
    6970        IF ( ( .NOT. during_spinup ) .AND. (surf%frac(m,ind_wat_win) > 0.0_wp ) )  THEN
     6976       IF ( ( .NOT. during_spinup ) .AND. (frac_win > 0.0_wp ) )  THEN
    69716977          coef_window_1 = surf%rad_net_l(m) +  ( 3.0_wp + 1.0_wp )                                &
    69726978                          * surf%emissivity(m,ind_wat_win) * sigma_sb                             &
     
    69746980                          + lambda_surface_window * t_window%val(nzb_wall,m)
    69756981       ENDIF
    6976        IF ( ( humidity ) .AND. ( surf%frac(m,ind_pav_green) > 0.0_wp ) )  THEN
     6982       IF ( ( humidity ) .AND. ( frac_green > 0.0_wp ) )  THEN
    69776983          coef_green_1 = surf%rad_net_l(m) + ( 3.0_wp + 1.0_wp )                                  &
    69786984                         * surf%emissivity(m,ind_pav_green) * sigma_sb                            &
     
    69906996       coef_2 = 4.0_wp * surf%emissivity(m,ind_veg_wall) * sigma_sb * t_surf_wall%val(m)**3       &
    69916997                + lambda_surface + f_shf / exner(k)
    6992        IF ( ( .NOT. during_spinup ) .AND. ( surf%frac(m,ind_wat_win) > 0.0_wp ) )  THEN
     6998       IF ( ( .NOT. during_spinup ) .AND. ( frac_win > 0.0_wp ) )  THEN
    69936999          coef_window_2 = 4.0_wp * surf%emissivity(m,ind_wat_win) * sigma_sb *                    &
    69947000                          t_surf_window%val(m)**3 + lambda_surface_window + f_shf_window / exner(k)
    69957001       ENDIF
    6996        IF ( ( humidity ) .AND. ( surf%frac(m,ind_pav_green) > 0.0_wp ) )  THEN
     7002       IF ( ( humidity ) .AND. ( frac_green > 0.0_wp ) )  THEN
    69977003          coef_green_2 = 4.0_wp * surf%emissivity(m,ind_pav_green) * sigma_sb *                   &
    69987004                         t_surf_green%val(m)**3 + f_qsws * dq_s_dt + lambda_surface_green         &
     
    70077013                            * t_surf_wall%val(m) )                                                &
    70087014                            / ( surf%c_surface(m) + coef_2 * dt_3d * tsc(2) )
    7009        IF ( ( .NOT. during_spinup ) .AND. (surf%frac(m,ind_wat_win) > 0.0_wp) )  THEN
     7015       IF ( ( .NOT. during_spinup ) .AND. (frac_win > 0.0_wp) )  THEN
    70107016          t_surf_window_p%val(m) = ( coef_window_1 * dt_3d * tsc(2) +                             &
    70117017                                   surf%c_surface_window(m) * t_surf_window%val(m) ) /            &
     
    70277033!--    vpt_surface, which is, due to the lack of moisture on roofs, simply assumed to be the surface
    70287034!--    temperature.
    7029        surf%pt_surface(m) = ( surf%frac(m,ind_veg_wall) * t_surf_wall_p%val(m)                    &
    7030                                  + surf%frac(m,ind_wat_win) * t_surf_window_p%val(m)              &
    7031                                  + surf%frac(m,ind_pav_green) * t_surf_green_p%val(m)             &
     7035       surf%pt_surface(m) = ( frac_wall * t_surf_wall_p%val(m)                                    &
     7036                                 + frac_win * t_surf_window_p%val(m)                              &
     7037                                 + frac_green * t_surf_green_p%val(m)                             &
    70327038                             ) / exner(k)
    70337039
     
    70697075!--    Calculate new fluxes
    70707076!--    Rad_net_l is never used!
    7071        surf%rad_net_l(m) = surf%rad_net_l(m) + surf%frac(m,ind_veg_wall)                          &
     7077       surf%rad_net_l(m) = surf%rad_net_l(m) + frac_wall                                          &
    70727078                                 * sigma_sb * surf%emissivity(m,ind_veg_wall)                     &
    70737079                                 * ( t_surf_wall_p%val(m)**4 - t_surf_wall%val(m)**4 )            &
    7074                                  + surf%frac(m,ind_wat_win) * sigma_sb                            &
     7080                                 + frac_win * sigma_sb                                            &
    70757081                                 * surf%emissivity(m,ind_wat_win)                                 &
    70767082                                 * ( t_surf_window_p%val(m)**4 - t_surf_window%val(m)**4 )        &
    7077                                  + surf%frac(m,ind_pav_green) * sigma_sb                          &
     7083                                 + frac_green * sigma_sb                                          &
    70787084                                 * surf%emissivity(m,ind_pav_green)                               &
    70797085                                 * ( t_surf_green_p%val(m)**4 - t_surf_green%val(m)**4 )
     
    70887094!--    Ground/wall/roof surface heat flux
    70897095       surf%wshf_eb(m)   = - f_shf  * ( surf%pt1(m) - t_surf_wall_p%val(m) / exner(k) )           &
    7090                                  * surf%frac(m,ind_veg_wall) - f_shf_window                       &
     7096                                 * frac_wall - f_shf_window                                       &
    70917097                                 * ( surf%pt1(m) - t_surf_window_p%val(m) / exner(k) )            &
    7092                                  * surf%frac(m,ind_wat_win) - f_shf_green                         &
     7098                                 * frac_win - f_shf_green                                         &
    70937099                                 * ( surf%pt1(m) - t_surf_green_p%val(m) / exner(k) )             &
    7094                                  * surf%frac(m,ind_pav_green)
     7100                                 * frac_green
    70957101!
    70967102!--    Store kinematic surface heat fluxes for utilization in other processes diffusion_s,
     
    71037109       ENDIF
    71047110
    7105        IF ( humidity .AND.  surf%frac(m,ind_pav_green) > 0.0_wp )  THEN!
     7111       IF ( humidity .AND.  frac_green > 0.0_wp )  THEN!
    71067112!--       Calculate true surface resistance
    71077113          IF ( upward ) THEN
     
    71257131                IF ( m_liq_usm_h(l)%val(m) /= m_liq_max )  THEN
    71267132                   surf%qsws_liq(m) = surf%qsws_liq(m)                                            &
    7127                                             + surf%frac(m,ind_pav_green)                          &
     7133                                            + frac_green                                          &
    71287134                                            * prr(k+k_off,j+j_off,i+i_off) * hyrho(k+k_off)       &
    71297135                                            * 0.001_wp * rho_l * l_v
     
    71917197       ELSE
    71927198          surf%r_s(m) = 1.0E10_wp
    7193        ENDIF
    7194 !
    7195 !--    During spinup green and window fraction are set to zero. Here, the original values are
    7196 !--    restored.
    7197        IF ( during_spinup )  THEN
    7198           surf%frac(m,ind_wat_win)   = frac_win
    7199           surf%frac(m,ind_veg_wall)  = frac_wall
    7200           surf%frac(m,ind_pav_green) = frac_green
    72017199       ENDIF
    72027200
Note: See TracChangeset for help on using the changeset viewer.