Ignore:
Timestamp:
Oct 19, 2018 12:34:59 PM (6 years ago)
Author:
kanani
Message:

merge fixes of radiation branch (r3362) to trunk

File:
1 edited

Legend:

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

    r3372 r3378  
    2828! -----------------
    2929! $Id$
     30! merge from radiation branch (r3362) into trunk
     31! (moh.hefny):
     32! - removed read/write_svf_on_init and read_dist_max_svf (not used anymore)
     33! - bugfix nzut > nzpt in calculating maxboxes
     34!
     35! 3372 2018-10-18 14:03:19Z raasch
    3036! bugfix: kind type of 2nd argument of mpi_win_allocate changed, misplaced
    3137!         __parallel directive
     
    619625                radiation_interactions = .FALSE.,     & !< flag to activiate RTM (TRUE only if vertical urban/land surface and trees exist)
    620626                surface_reflections = .TRUE.,         & !< flag to switch the calculation of radiation interaction between surfaces.
    621                                                         !< When it switched off, only the effect of buildings and trees shadow will
     627                                                        !< When it switched off, only the effect of buildings and trees shadow
    622628                                                        !< will be considered. However fewer SVFs are expected.
    623629                radiation_interactions_on = .TRUE.      !< namelist flag to force RTM activiation regardless to vertical urban/land surface and trees
     
    776782                                             rrtm_swhr,      & !< RRTM output of shortwave radiation heating rate (K/d)
    777783                                             rrtm_swhrc,     & !< RRTM output of incoming shortwave clear sky radiation heating rate (K/d)
    778                                              rrtm_dirdflux,  & !< RRTM output of incoming direct shortwave (W/m)
    779                                              rrtm_difdflux     !< RRTM output of incoming diffuse shortwave (W/m)
     784                                             rrtm_dirdflux,  & !< RRTM output of incoming direct shortwave (W/m2)
     785                                             rrtm_difdflux     !< RRTM output of incoming diffuse shortwave (W/m2)
    780786
    781787    REAL(wp), DIMENSION(1) ::                rrtm_aldif,     & !< surface albedo for longwave diffuse radiation
     
    987993    INTEGER(iwp), PARAMETER                        ::  gasize = 100000  !< initial size of growing arrays
    988994    REAL(wp), PARAMETER                            ::  grow_factor = 1.4_wp !< growth factor of growing arrays
    989     REAL(wp)                                       ::  dist_max_svf = -9999.0 !< maximum distance to calculate the minimum svf to be considered. It is
    990                                                                         !< used to avoid very small SVFs resulting from too far surfaces with mutual visibility
    991995    INTEGER(iwp)                                   ::  nsvfl            !< number of svf for local processor
    992996    INTEGER(iwp)                                   ::  ncsfl            !< no. of csf in local processor
     
    11581162           skip_time_do_radiation, time_radiation, unscheduled_radiation_calls,&
    11591163           zenith, calc_zenith, sun_direction, sun_dir_lat, sun_dir_lon,       &
    1160            write_svf_on_init, read_svf_on_init,                                &
    1161            nrefsteps, dist_max_svf, nsvfl, svf,                                &
     1164           nrefsteps, nsvfl, svf,                                              &
    11621165           svfsurf, surfinsw, surfinlw, surfins, surfinl, surfinswdir,         &
    11631166           surfinswdif, surfoutsw, surfoutlw, surfinlwdif, rad_sw_in_dir,      &
     
    11671170           iup_u, inorth_u, isouth_u, ieast_u, iwest_u,                        &
    11681171           iup_l, inorth_l, isouth_l, ieast_l, iwest_l,                        &
    1169            nsurf_type, nzub, nzut, nzpt, nzu, pch, nsurf,                      &
     1172           nsurf_type, nzub, nzut, nzu, pch, nsurf,                            &
    11701173           idsvf, ndsvf, idcsf, ndcsf, kdcsf, pct,                             &
    11711174           radiation_interactions, startwall, startland, endland, endwall,     &
     
    29102913                                  radiation_scheme, skip_time_do_radiation,    &
    29112914                                  sw_radiation, unscheduled_radiation_calls,   &
    2912                                   read_svf_on_init, write_svf_on_init,         &
    29132915                                  max_raytracing_dist, min_irrf_value,         &
    29142916                                  nrefsteps, raytrace_mpi_rma,                 &
    2915                                   dist_max_svf,                                &
    29162917                                  surface_reflections, svfnorm_report_thresh,  &
    29172918                                  radiation_interactions_on,                   &
     
    29292930                                  max_raytracing_dist, min_irrf_value,         &
    29302931                                  nrefsteps, raytrace_mpi_rma,                 &
    2931                                   dist_max_svf,                                &
    29322932                                  surface_reflections, svfnorm_report_thresh,  &
    29332933                                  radiation_interactions_on,                   &
     
    46294629     REAL(wp), PARAMETER               :: alpha = 0._wp      !< grid rotation (TODO: add to namelist or remove)
    46304630     REAL(wp)                          :: pc_box_area, pc_abs_frac, pc_abs_eff
    4631 !     REAL(wp)                          ::  count_surfaces    !< number of all surfaces in model domain
    4632 !     REAL(wp)                          ::  count_surfaces_l  !< number of all surfaces in sub-domain
    4633 !     REAL(wp)                          ::  pt_surf_urb       !< mean surface temperature of all surfaces in model domain, temporal work-around
    4634 !     REAL(wp)                          ::  pt_surf_urb_l     !< mean surface temperature of all surfaces in sub-domain, temporal work-around
    4635 
    46364631     REAL(wp), DIMENSION(0:nsurf_type) :: facearea
    46374632     REAL(wp)                          :: pabsswl  = 0.0_wp  !< total absorbed SW radiation energy in local processor (W)
     
    46864681!--         precompute effective box depth with prototype Leaf Area Density
    46874682            pc_box_dimshift = MAXLOC(ABS(sunorig), 1) - 1
    4688             CALL box_absorb(CSHIFT((/dz(1),dy,dx/), pc_box_dimshift),      &
     4683            CALL box_absorb(CSHIFT((/dz(1),dy,dx/), pc_box_dimshift),       &
    46894684                                60, prototype_lad,                          &
    46904685                                CSHIFT(ABS(sunorig), pc_box_dimshift),      &
    46914686                                pc_box_area, pc_abs_frac)
    4692             pc_box_area = pc_box_area * ABS(sunorig(pc_box_dimshift+1) / sunorig(1))
     4687            pc_box_area = pc_box_area * ABS(sunorig(pc_box_dimshift+1)      &
     4688                          / sunorig(1))
    46934689            pc_abs_eff = LOG(1._wp - pc_abs_frac) / prototype_lad
    46944690         ENDIF
     
    48384834           j = surfl(iy, isurf)
    48394835           i = surfl(ix, isurf)
    4840            surfinswdir(isurf) = rad_sw_in_dir(j,i) * costheta(surfl(id, isurf)) * dsitrans(isurf, isd) / zenith(0)
     4836           surfinswdir(isurf) = rad_sw_in_dir(j,i) *                        &
     4837                costheta(surfl(id, isurf)) * dsitrans(isurf, isd) / zenith(0)
    48414838        ENDDO
    48424839!
     
    52485245      t_rad_urb = ( (pemitlw - pabslw + emissivity_urb*pinlw) / &
    52495246           (emissivity_urb*sigma_sb * area_hor) )**0.25_wp
    5250 !
    5251 !--  It has been turned out that the effective radiative temperature is far
    5252 !--  too high during nighttime, resulting in unphysical radiative forcing
    5253 !--  with wrong signs. For the moment, as a work-around, compute the mean
    5254 !--  surface temperature from all surface elements, resulting in more
    5255 !--  physically meaningful radiative forcings.           
    5256 !      pt_surf_urb_l    = 0.0_wp
    5257 !      count_surfaces_l = 0.0_wp
    5258 !      DO  m = 1, surf_lsm_h%ns
    5259 !         k                = surf_lsm_h%k(m)
    5260 !         pt_surf_urb_l    = pt_surf_urb_l + surf_lsm_h%pt_surface(m)            &
    5261 !                            * exner(k)
    5262 !         count_surfaces_l = count_surfaces_l + 1.0_wp
    5263 !      ENDDO
    5264 !      DO  m = 1, surf_usm_h%ns
    5265 !         k                = surf_usm_h%k(m)
    5266 !         pt_surf_urb_l    = pt_surf_urb_l + surf_usm_h%pt_surface(m)            &
    5267 !                            * exner(k)
    5268 !         count_surfaces_l = count_surfaces_l + 1.0_wp
    5269 !      ENDDO
    5270 !      DO  l = 0, 3
    5271 !         DO  m = 1, surf_lsm_v(l)%ns
    5272 !            k                = surf_lsm_v(l)%k(m)
    5273 !            pt_surf_urb_l    = pt_surf_urb_l + surf_lsm_v(l)%pt_surface(m)      &
    5274 !                            * exner(k)
    5275 !            count_surfaces_l = count_surfaces_l + 1.0_wp
    5276 !         ENDDO
    5277 !         DO  m = 1, surf_usm_v(l)%ns
    5278 !            k                = surf_usm_v(l)%k(m)
    5279 !            pt_surf_urb_l    = pt_surf_urb_l + surf_usm_v(l)%pt_surface(m) * exner(k)
    5280 !            count_surfaces_l = count_surfaces_l + 1.0_wp
    5281 !         ENDDO
    5282 !      ENDDO
    5283 !     
    5284 !      pt_surf_urb    = 0.0_wp
    5285 !      count_surfaces = 0.0_wp
    5286 !     
    5287 ! #if defined( __parallel )
    5288 !      CALL MPI_ALLREDUCE( count_surfaces_l, count_surfaces, 1, MPI_REAL,        &
    5289 !                          MPI_SUM, comm2d, ierr)
    5290 !      CALL MPI_ALLREDUCE( pt_surf_urb_l,  pt_surf_urb,      1, MPI_REAL,        &
    5291 !                          MPI_SUM, comm2d, ierr)
    5292 ! #else
    5293 !      count_surfaces_l = count_surfaces
    5294 !      pt_surf_urb_l    = pt_surf_urb
    5295 ! #endif     
    5296 !
    5297 !      t_rad_urb = pt_surf_urb / count_surfaces
    5298      
    52995247
    53005248    CONTAINS
     
    54695417#endif
    54705418
    5471 
    5472        !INTEGER(iwp), DIMENSION(1:4,inorth_b:iwest_b)  ::  ijdb                               !< start and end of the local domain border coordinates (set in code)
    5473        !LOGICAL, DIMENSION(inorth_b:iwest_b)           ::  isborder                           !< is PE on the border of the domain in four corresponding directions
    5474 
    54755419!
    54765420!--    Find nzub, nzut, nzu via wall_flag_0 array (nzb_s_inner will be
     
    55665510!--    check max_raytracing_dist relative to urban surface layer height
    55675511       mrl = 2.0_wp * nzu * dz(1)
     5512!--    set max_raytracing_dist to double the urban surface layer height, if not set
    55685513       IF ( max_raytracing_dist == -999.0_wp ) THEN
    55695514          max_raytracing_dist = mrl
     5515       ENDIF
     5516!--    check if max_raytracing_dist set too low (here we only warn the user. Other
     5517!      option is to correct the value again to double the urban surface layer height)
     5518       IF ( max_raytracing_dist  <  mrl ) THEN
     5519          WRITE(message_string, '(a,f6.1)') 'Max_raytracing_dist is set less than ', &
     5520               'double the urban surface layer height, i.e. ', mrl
     5521          CALL message('radiation_interaction_init', 'PA0521', 0, 0, -1, 6, 0)
    55705522       ENDIF
    55715523!        IF ( max_raytracing_dist <= mrl ) THEN
     
    63036255               ENDDO
    63046256
    6305                !
    6306                !--Advance itarget indices
     6257!
     6258!--            Advance itarget indices
    63076259               itarg0 = itarg1 + 1
    63086260               itarg1 = itarg1 + nzn
     
    74677419!--     
    74687420         maxboxes = (ntrack + MAX(CEILING(origin(1)-.5_wp) - nzub,          &
    7469                                   nzpt - CEILING(origin(1)-.5_wp))) * nrays
     7421                                  nzut - CEILING(origin(1)-.5_wp))) * nrays
    74707422         IF ( ncsfl + maxboxes > ncsfla )  THEN
    74717423!--         use this code for growing by fixed exponential increments (equivalent to case where ncsfl always increases by 1)
     
    82848236!> It is called outside from usm_urban_surface_mod whenever the radiation fluxes
    82858237!> are needed.
     8238!>
     8239!> This routine is not used so far. However, it may serve as an interface for radiation
     8240!> fluxes of urban and land surfaces
    82868241!>
    82878242!> TODO:
Note: See TracChangeset for help on using the changeset viewer.