Changeset 4245


Ignore:
Timestamp:
Sep 30, 2019 8:40:37 AM (20 months ago)
Author:
pavelkrc
Message:

Merge branch resler into trunk

Location:
palm/trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk

  • palm/trunk/SOURCE

  • palm/trunk/SOURCE/Makefile

    r4227 r4245  
    2525# -----------------
    2626# $Id$
     27# Remove no longer needed dependencies on surface_mod
     28#
     29# 4227 2019-09-10 18:04:34Z gronemeier
    2730# Add palm_date_time_mod, remove date_and_time_mod
    2831#
  • palm/trunk/SOURCE/biometeorology_mod.f90

    • Property svn:mergeinfo
      •  

        old new  
        66/palm/branches/palm4u/SOURCE/biometeorology_mod.f90:2540-2692
        77/palm/branches/rans/SOURCE/biometeorology_mod.f90:2078-3128
        8 /palm/branches/resler/SOURCE/biometeorology_mod.f90:2023-3320,3337-3474
         8/palm/branches/resler/SOURCE/biometeorology_mod.f90:2023-4244
        99/palm/branches/salsa/SOURCE/biometeorology_mod.f90:2503-3581
        1010/palm/branches/suehring/biometeorology_mod.f90:423-666
        11 /palm/trunk/SOURCE/biometeorology_mod.f90:2503-3336
         11/palm/trunk/SOURCE/biometeorology_mod.f90:2023-3336
  • palm/trunk/SOURCE/check_parameters.f90

  • palm/trunk/SOURCE/indoor_model_mod.f90

    r4242 r4245  
    2626! -----------------
    2727! $Id$
     28!
     29!
     30! 4242 2019-09-27 12:59:10Z suehring
    2831! Bugfix in array index
    2932!
  • palm/trunk/SOURCE/init_3d_model.f90

  • palm/trunk/SOURCE/init_grid.f90

    r4189 r4245  
    2525! -----------------
    2626! $Id$
     27! Store oro_max (building z-offset) in 2D for building surfaces
     28!
     29! 4189 2019-08-26 16:19:38Z suehring
    2730! - Add check for proper setting of namelist parameter topography
    2831! - Set flag to indicate land surfaces in case no topography is provided
     
    13121315       ENDIF
    13131316!
     1317!--    Allocate array for storing terrain height under buildings
     1318       IF ( buildings_f%from_file )  THEN
     1319          ALLOCATE( buildings_f%oro_max(nysg:nyng,nxlg:nxrg) )
     1320          buildings_f%oro_max = buildings_f%fill1
     1321       END IF
     1322!
    13141323!--    Map orography as well as buildings onto grid.
    13151324       DO  i = nxl, nxr
     
    13251334                   nr = MINLOC( ABS( build_ids_final -                         &
    13261335                                     building_id_f%var(j,i) ), DIM = 1 )
     1336!
     1337!--                Save grid-indexed oro_max
     1338                   buildings_f%oro_max(j,i) = oro_max(nr)
    13271339                ENDIF
    13281340             ENDIF
     
    14331445          ENDDO
    14341446       ENDDO
     1447!
     1448!--    Horizontal exchange the oro_max array
     1449       CALL exchange_horiz_2d( buildings_f%oro_max(:,:), nbgp )
    14351450!
    14361451!--    Deallocate temporary arrays required for processing and reading data
  • palm/trunk/SOURCE/netcdf_data_input_mod.f90

    r4226 r4245  
    2525! -----------------
    2626! $Id$
     27! Add reading and processing of building_surface_pars
     28!
     29! 4226 2019-09-10 17:03:24Z suehring
    2730! - Netcdf input routine for dimension length renamed
    2831! - Move offline-nesting-specific checks to nesting_offl_mod
     
    376379       REAL(wp)                              ::  fill1 = -9999.9_wp !< fill values for lod = 1
    377380       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  var_2d             !< 2d variable (lod = 1)
     381       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  oro_max            !< terraing height under particular buildings
    378382    END TYPE build_in
    379383
     
    416420       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  pars_xyz          !< respective parameters, level of detail = 2
    417421    END TYPE pars
     422!
     423!-- Data type for surface parameter lists
     424    TYPE pars_surf
     425       INTEGER(iwp)                                ::  np          !< total number of parameters
     426       INTEGER(iwp)                                ::  nsurf       !< number of local surfaces
     427       INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE ::  index_ji    !< index for beginning and end of surfaces at (j,i)
     428       INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE   ::  coords      !< (k,j,i,norm_z,norm_y,norm_x)
     429                                                                   !< k,j,i:                surface position
     430                                                                   !< norm_z,norm_y,norm_x: surface normal vector
     431
     432       LOGICAL ::  from_file = .FALSE.  !< flag indicating whether an input variable is available and read from file or default values are used
     433
     434       REAL(wp)                              ::  fill = -9999.9_wp !< fill value
     435       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  pars              !< respective parameters per surface
     436    END TYPE pars_surf
    418437!
    419438!-- Define type for global file attributes
     
    551570    TYPE(pars)  ::  water_pars_f               !< input variable for water parameters
    552571
     572    TYPE(pars_surf)  ::  building_surface_pars_f  !< input variable for building surface parameters
     573
    553574    TYPE(chem_emis_att_type)                             ::  chem_emis_att    !< Input Information of Chemistry Emission Data from netcdf 
    554575    TYPE(chem_emis_val_type), ALLOCATABLE, DIMENSION(:)  ::  chem_emis        !< Input Chemistry Emission Data from netcdf 
     
    683704!-- Public variables
    684705    PUBLIC albedo_pars_f, albedo_type_f, basal_area_density_f, buildings_f,    &
    685            building_id_f, building_pars_f, building_type_f,                    &
     706           building_id_f, building_pars_f, building_surface_pars_f,            &
     707           building_type_f,                                                    &
    686708           char_fill,                                                          &
    687709           char_lod,                                                           &
     
    19581980          building_pars_f%from_file = .FALSE.
    19591981       ENDIF
     1982!
     1983!--    Read building surface parameters
     1984       IF ( check_existence( var_names, 'building_surface_pars' ) )  THEN
     1985          building_surface_pars_f%from_file = .TRUE.
     1986          CALL get_attribute( id_surf, char_fill,                              &
     1987                              building_surface_pars_f%fill,                    &
     1988                              .FALSE., 'building_surface_pars' )
     1989!
     1990!--       Read building_surface_pars
     1991          CALL get_variable_surf( id_surf, 'building_surface_pars', &
     1992                                  building_surface_pars_f )
     1993       ELSE
     1994          building_surface_pars_f%from_file = .FALSE.
     1995       ENDIF
    19601996
    19611997!
     
    43024338             ENDIF
    43034339!
    4304 !--       Extrapolate if actual height is above the highest Inifor level
     4340!--       Extrapolate if actual height is above the highest Inifor level by the last value
    43054341          ELSE
    4306              var(k) = var_file(ku) + ( var_file(ku) - var_file(ku-1) ) /       &
    4307                                      ( z_file(ku)   - z_file(ku-1)   ) *       &
    4308                                      ( z_grid(k)    - z_file(ku)     )
    4309 
     4342             var(k) = var_file(ku)
    43104343          ENDIF
    43114344
     
    49654998#endif
    49664999    END SUBROUTINE get_variable_pr
     5000
     5001
     5002!------------------------------------------------------------------------------!
     5003! Description:
     5004! ------------
     5005!> Reads a per-surface pars variable from file. Because all surfaces are stored
     5006!> as flat 1-D array, each PE has to scan the data and find the surface indices
     5007!> belonging to its subdomain. During this scan, it also builds a necessary
     5008!> (j,i) index.
     5009!------------------------------------------------------------------------------!
     5010    SUBROUTINE get_variable_surf( id, variable_name, surf )
     5011#if defined( __netcdf )
     5012
     5013       USE pegrid
     5014
     5015       USE indices,                                            &
     5016           ONLY:  nxl, nxr, nys, nyn, nzb, nzt
     5017
     5018       USE control_parameters,                                 &
     5019           ONLY: dz, message_string
     5020
     5021       USE grid_variables,                                     &
     5022           ONLY: dx, dy
     5023       
     5024       USE basic_constants_and_equations_mod,                  &
     5025           ONLY: pi
     5026
     5027       USE arrays_3d,                                          &
     5028           ONLY:  zu, zw
     5029
     5030       IMPLICIT NONE
     5031
     5032       INTEGER, PARAMETER ::  nsurf_pars_read = 1024**2 !< read buffer size
     5033
     5034       CHARACTER(LEN=*)                          ::  variable_name !< variable name
     5035
     5036       INTEGER(iwp), DIMENSION(6)                ::  coords        !< integer coordinates of surface
     5037       INTEGER(iwp)                              ::  i, j
     5038       INTEGER(iwp)                              ::  isurf         !< netcdf surface index
     5039       INTEGER(iwp)                              ::  is            !< local surface index
     5040       INTEGER(iwp), INTENT(IN)                  ::  id            !< file id
     5041       INTEGER(iwp), DIMENSION(2)                ::  id_dim        !< dimension ids
     5042       INTEGER(iwp)                              ::  id_var        !< variable id
     5043       INTEGER(iwp)                              ::  id_zs         !< zs variable id
     5044       INTEGER(iwp)                              ::  id_ys         !< ys variable id
     5045       INTEGER(iwp)                              ::  id_xs         !< xs variable id
     5046       INTEGER(iwp)                              ::  id_zenith     !< zeith variable id
     5047       INTEGER(iwp)                              ::  id_azimuth    !< azimuth variable id
     5048       INTEGER(iwp)                              ::  is0, isc      !< read surface start and count
     5049       INTEGER(iwp)                              ::  nsurf         !< total number of surfaces in file
     5050       INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  nsurf_ji      !< numbers of surfaces by coords
     5051
     5052       TYPE(pars_surf)                           ::  surf          !< parameters variable to be loaded
     5053       REAL(wp), DIMENSION(:,:), ALLOCATABLE     ::  pars_read     !< read buffer
     5054       REAL(wp), DIMENSION(:), ALLOCATABLE       ::  zs, ys, xs    !< read buffer for zs(s), ys, xs
     5055       REAL(wp), DIMENSION(:), ALLOCATABLE       ::  zenith        !< read buffer for zenith(s)
     5056       REAL(wp), DIMENSION(:), ALLOCATABLE       ::  azimuth       !< read buffer for azimuth(s)
     5057       REAL(wp)                                  ::  oro_max_l     !< maximum terrain height under building
     5058
     5059!
     5060!--    First, inquire variable ID
     5061       nc_stat = NF90_INQ_VARID( id, TRIM( variable_name ), id_var )
     5062       nc_stat = NF90_INQ_VARID( id, 'zs',                  id_zs )
     5063       nc_stat = NF90_INQ_VARID( id, 'ys',                  id_ys )
     5064       nc_stat = NF90_INQ_VARID( id, 'xs',                  id_xs )
     5065       nc_stat = NF90_INQ_VARID( id, 'zenith',              id_zenith )
     5066       nc_stat = NF90_INQ_VARID( id, 'azimuth',             id_azimuth )
     5067!
     5068!--    Inquire dimension sizes
     5069       nc_stat = NF90_INQUIRE_VARIABLE( id, id_var, DIMIDS = id_dim )
     5070       nc_stat = NF90_INQUIRE_DIMENSION( id, id_dim(1), LEN = nsurf )
     5071       nc_stat = NF90_INQUIRE_DIMENSION( id, id_dim(2), LEN = surf%np )
     5072
     5073       ALLOCATE ( pars_read( nsurf_pars_read, surf%np ),        &
     5074                  zs(nsurf_pars_read), ys(nsurf_pars_read),     &
     5075                  xs(nsurf_pars_read), zenith(nsurf_pars_read), &
     5076                  azimuth(nsurf_pars_read),                     &
     5077                  nsurf_ji(nys:nyn, nxl:nxr) )
     5078
     5079       nsurf_ji(:,:) = 0
     5080!
     5081!--    Scan surface coordinates, count local
     5082       is0 = 1
     5083       DO
     5084          isc = MIN(nsurf_pars_read, nsurf - is0 + 1)
     5085          IF ( isc <= 0 )  EXIT
     5086
     5087          nc_stat = NF90_GET_VAR( id, id_ys, ys,     &
     5088                                  start = (/ is0 /), &
     5089                                  count = (/ isc /) )
     5090          nc_stat = NF90_GET_VAR( id, id_xs, xs,     &
     5091                                  start = (/ is0 /), &
     5092                                  count = (/ isc /) )
     5093          nc_stat = NF90_GET_VAR( id, id_zenith, zenith,      &
     5094                                  start = (/ is0 /), &
     5095                                  count = (/ isc /) )
     5096          nc_stat = NF90_GET_VAR( id, id_azimuth, azimuth,    &
     5097                                  start = (/ is0 /), &
     5098                                  count = (/ isc /) )
     5099          CALL handle_error( 'get_variable_surf', 682, 'azimuth' )
     5100         
     5101          DO  isurf = 1, isc
     5102!
     5103!--          Parse coordinates, detect if belongs to subdomain
     5104             coords = transform_coords( xs(isurf), ys(isurf),         &
     5105                                        zenith(isurf), azimuth(isurf) )
     5106             IF ( coords(2) < nys  .OR.  coords(2) > nyn  .OR.  &
     5107                  coords(3) < nxl  .OR.  coords(3) > nxr )  CYCLE
     5108
     5109             nsurf_ji(coords(2), coords(3)) = nsurf_ji(coords(2), coords(3)) + 1
     5110          ENDDO
     5111
     5112          is0 = is0 + isc
     5113       ENDDO
     5114!
     5115!--    Populate reverse index from surface counts
     5116       ALLOCATE ( surf%index_ji( 2, nys:nyn, nxl:nxr ) )
     5117
     5118       isurf = 1
     5119       DO  j = nys, nyn
     5120          DO  i = nxl, nxr
     5121             surf%index_ji(:,j,i) = (/ isurf, isurf + nsurf_ji(j,i) - 1 /)
     5122             isurf = isurf + nsurf_ji(j,i)
     5123          ENDDO
     5124       ENDDO
     5125
     5126       surf%nsurf = isurf - 1
     5127       ALLOCATE( surf%pars( 0:surf%np-1, surf%nsurf ), &
     5128                 surf%coords( 6, surf%nsurf ) )
     5129!
     5130!--    Scan surfaces again, saving pars into allocated structures
     5131       nsurf_ji(:,:) = 0
     5132       is0 = 1
     5133       DO
     5134          isc = MIN(nsurf_pars_read, nsurf - is0 + 1)
     5135          IF ( isc <= 0 )  EXIT
     5136
     5137          nc_stat = NF90_GET_VAR( id, id_var, pars_read(1:isc, 1:surf%np), &
     5138                                  start = (/ is0, 1       /),              &
     5139                                  count = (/ isc, surf%np /) )
     5140          CALL handle_error( 'get_variable_surf', 683, variable_name )
     5141
     5142          nc_stat = NF90_GET_VAR( id, id_zs, zs,                           &
     5143                                  start = (/ is0 /),                       &
     5144                                  count = (/ isc /) )
     5145          nc_stat = NF90_GET_VAR( id, id_ys, ys,                           &
     5146                                  start = (/ is0 /),                       &
     5147                                  count = (/ isc /) )
     5148          nc_stat = NF90_GET_VAR( id, id_xs, xs,                           &
     5149                                  start = (/ is0 /),                       &
     5150                                  count = (/ isc /) )
     5151          nc_stat = NF90_GET_VAR( id, id_zenith, zenith,                   &
     5152                                  start = (/ is0 /),                       &
     5153                                  count = (/ isc /) )
     5154          nc_stat = NF90_GET_VAR( id, id_azimuth, azimuth,                 &
     5155                                  start = (/ is0 /),                       &
     5156                                  count = (/ isc /) )
     5157         
     5158          DO  isurf = 1, isc
     5159!
     5160!--          Parse coordinates, detect if belongs to subdomain
     5161             coords = transform_coords( xs(isurf), ys(isurf),         &
     5162                                        zenith(isurf), azimuth(isurf) )
     5163             IF ( coords(2) < nys  .OR.  coords(2) > nyn  .OR.  &
     5164                  coords(3) < nxl  .OR.  coords(3) > nxr )  CYCLE
     5165!
     5166!--          Determine maximum terrain under building (base z-coordinate). Using
     5167!--          normal vector to locate building inner coordinates.
     5168             oro_max_l = buildings_f%oro_max(coords(2)-coords(5), coords(3)-coords(6))
     5169             IF  ( oro_max_l == buildings_f%fill1 )  THEN
     5170                WRITE( message_string, * ) 'Found building surface on '   // &
     5171                   'non-building coordinates (xs, ys, zenith, azimuth): ',   &
     5172                   xs(isurf), ys(isurf), zenith(isurf), azimuth(isurf)
     5173                CALL message( 'get_variable_surf', 'PA0684', 2, 2, 0, 6, 0 )
     5174             ENDIF
     5175!
     5176!--          Urban layer has no stretching, therefore using dz(1) instead of linear
     5177!--          searching through zu/zw
     5178             coords(1) = NINT((zs(isurf) + oro_max_l) / dz(1) +     &
     5179                              0.5_wp + 0.5_wp * coords(4), KIND=iwp)
     5180!
     5181!--          Save surface entry
     5182             is = surf%index_ji(1, coords(2), coords(3)) + nsurf_ji(coords(2), coords(3))
     5183             surf%pars(:,is) = pars_read(isurf,:)
     5184             surf%coords(:,is) = coords(:)
     5185
     5186             nsurf_ji(coords(2), coords(3)) = nsurf_ji(coords(2), coords(3)) + 1
     5187          ENDDO
     5188
     5189          is0 = is0 + isc
     5190       ENDDO
     5191
     5192       DEALLOCATE( pars_read, zs, ys, xs, zenith, azimuth, nsurf_ji )
     5193
     5194    CONTAINS
     5195
     5196       PURE FUNCTION transform_coords( x, y, zenith, azimuth )
     5197
     5198          REAL(wp), INTENT(in)       ::  x, y    !< surface centre coordinates in metres from origin
     5199          REAL(wp), INTENT(in)       ::  zenith  !< surface normal zenith angle in degrees
     5200          REAL(wp), INTENT(in)       ::  azimuth !< surface normal azimuth angle in degrees
     5201
     5202          INTEGER(iwp), DIMENSION(6) ::  transform_coords !< (k,j,i,norm_z,norm_y,norm_x)
     5203
     5204          transform_coords(4) = NINT(COS(zenith*pi/180._wp), KIND=iwp)
     5205          IF ( transform_coords(4) == 0 )  THEN
     5206             transform_coords(5) = NINT(COS(azimuth*pi/180._wp), KIND=iwp)
     5207             transform_coords(6) = NINT(SIN(azimuth*pi/180._wp), KIND=iwp)
     5208          ELSE
     5209             transform_coords(5) = 0._wp
     5210             transform_coords(6) = 0._wp
     5211          ENDIF
     5212
     5213          transform_coords(1) = -999._wp ! not calculated here
     5214          transform_coords(2) = NINT(y/dy - 0.5_wp + 0.5_wp*transform_coords(5), KIND=iwp)
     5215          transform_coords(3) = NINT(x/dx - 0.5_wp + 0.5_wp*transform_coords(6), KIND=iwp)
     5216
     5217       END FUNCTION transform_coords
     5218
     5219#endif
     5220    END SUBROUTINE get_variable_surf
    49675221
    49685222
  • palm/trunk/SOURCE/pmc_child_mod.f90

    r4182 r4245  
    2626! -----------------
    2727! $Id$
     28!
     29!
     30! 4182 2019-08-22 15:20:23Z scharf
    2831! Corrected "Former revisions" section
    2932!
  • palm/trunk/SOURCE/pmc_parent_mod.f90

    r4213 r4245  
    2626! -----------------
    2727! $Id$
     28!
     29!
     30! 4213 2019-09-02 14:25:56Z suehring
    2831! Allocate array for index_list_2d also for zero-size arrays, in order to 
    2932! avoid errors when array bound checks are enabled
  • palm/trunk/SOURCE/radiation_model_mod.f90

    r4238 r4245  
    2828! -----------------
    2929! $Id$
     30! Initialize explicit per-surface albedos from building_surface_pars
     31!
     32! 4238 2019-09-25 16:06:01Z suehring
    3033! Modify check in order to avoid equality comparisons of floating points
    3134!
     
    257260               albedo_pars_f,                                                  &
    258261               building_type_f,                                                &
     262               building_surface_pars_f,                                        &
    259263               pavement_type_f,                                                &
    260264               vegetation_type_f,                                              &
     
    356360                                   'building (dummy)                     '  & ! 33
    357361                                                         /)
     362!
     363!-- Indices of radiation-related input attributes in building_surface_pars
     364!-- (other are in urban_surface_mod)
     365    INTEGER(iwp) ::  ind_s_alb_b_wall                = 19 !< index for Broadband albedo of wall fraction
     366    INTEGER(iwp) ::  ind_s_alb_l_wall                = 20 !< index for Longwave albedo of wall fraction
     367    INTEGER(iwp) ::  ind_s_alb_s_wall                = 21 !< index for Shortwave albedo of wall fraction
     368    INTEGER(iwp) ::  ind_s_alb_b_win                 = 22 !< index for Broadband albedo of window fraction
     369    INTEGER(iwp) ::  ind_s_alb_l_win                 = 23 !< index for Longwave albedo of window fraction
     370    INTEGER(iwp) ::  ind_s_alb_s_win                 = 24 !< index for Shortwave albedo of window fraction
     371    INTEGER(iwp) ::  ind_s_alb_b_green               = 24 !< index for Broadband albedo of green fraction
     372    INTEGER(iwp) ::  ind_s_alb_l_green               = 25 !< index for Longwave albedo of green fraction
     373    INTEGER(iwp) ::  ind_s_alb_s_green               = 26 !< index for Shortwave albedo of green fraction
    358374
    359375    INTEGER(iwp) :: albedo_type  = 9999999_iwp, &     !< Albedo surface type
     
    14971513
    14981514       INTEGER(iwp) ::  i         !< running index x-direction
     1515       INTEGER(iwp) ::  is        !< running index for input surface elements
    14991516       INTEGER(iwp) ::  ioff      !< offset in x between surface element reference grid point in atmosphere and actual surface
    15001517       INTEGER(iwp) ::  j         !< running index y-direction
    15011518       INTEGER(iwp) ::  joff      !< offset in y between surface element reference grid point in atmosphere and actual surface
     1519       INTEGER(iwp) ::  k         !< running index z-direction
    15021520       INTEGER(iwp) ::  l         !< running index for orientation of vertical surfaces
    15031521       INTEGER(iwp) ::  m         !< running index for surface elements
     
    18871905          ENDIF 
    18881906!
     1907!--       Read explicit albedo values from building surface pars. If present,
     1908!--       they override all less specific albedo values and force a albedo_type
     1909!--       to zero in order to take effect.
     1910          IF ( building_surface_pars_f%from_file )  THEN
     1911             DO  m = 1, surf_usm_h%ns
     1912                i = surf_usm_h%i(m)
     1913                j = surf_usm_h%j(m)
     1914                k = surf_usm_h%k(m)
     1915!
     1916!--             Iterate over surfaces in column, check height and orientation
     1917                DO  is = building_surface_pars_f%index_ji(1,j,i), &
     1918                         building_surface_pars_f%index_ji(2,j,i)
     1919                   IF ( building_surface_pars_f%coords(4,is) == -surf_usm_h%koff .AND. &
     1920                        building_surface_pars_f%coords(1,is) == k )  THEN
     1921
     1922                      IF ( building_surface_pars_f%pars(ind_s_alb_b_wall,is) /=      &
     1923                           building_surface_pars_f%fill )  THEN
     1924                         surf_usm_h%albedo(ind_veg_wall,m) =                         &
     1925                                  building_surface_pars_f%pars(ind_s_alb_b_wall,is)
     1926                         surf_usm_h%albedo_type(ind_veg_wall,m) = 0
     1927                      ENDIF
     1928
     1929                      IF ( building_surface_pars_f%pars(ind_s_alb_b_win,is) /=       &
     1930                           building_surface_pars_f%fill )  THEN
     1931                         surf_usm_h%albedo(ind_wat_win,m) =                          &
     1932                                  building_surface_pars_f%pars(ind_s_alb_b_win,is)
     1933                         surf_usm_h%albedo_type(ind_wat_win,m) = 0
     1934                      ENDIF
     1935
     1936                      IF ( building_surface_pars_f%pars(ind_s_alb_b_green,is) /=     &
     1937                           building_surface_pars_f%fill )  THEN
     1938                         surf_usm_h%albedo(ind_pav_green,m) =                        &
     1939                                  building_surface_pars_f%pars(ind_s_alb_b_green,is)
     1940                         surf_usm_h%albedo_type(ind_pav_green,m) = 0
     1941                      ENDIF
     1942
     1943                      EXIT ! surface was found and processed
     1944                   ENDIF
     1945                ENDDO
     1946             ENDDO
     1947
     1948             DO  l = 0, 3
     1949                DO  m = 1, surf_usm_v(l)%ns
     1950                   i = surf_usm_v(l)%i(m)
     1951                   j = surf_usm_v(l)%j(m)
     1952                   k = surf_usm_v(l)%k(m)
     1953!
     1954!--                Iterate over surfaces in column, check height and orientation
     1955                   DO  is = building_surface_pars_f%index_ji(1,j,i), &
     1956                            building_surface_pars_f%index_ji(2,j,i)
     1957                      IF ( building_surface_pars_f%coords(5,is) == -surf_usm_v(l)%joff .AND. &
     1958                           building_surface_pars_f%coords(6,is) == -surf_usm_v(l)%ioff .AND. &
     1959                           building_surface_pars_f%coords(1,is) == k )  THEN
     1960
     1961                         IF ( building_surface_pars_f%pars(ind_s_alb_b_wall,is) /=      &
     1962                              building_surface_pars_f%fill )  THEN
     1963                            surf_usm_v(l)%albedo(ind_veg_wall,m) =                      &
     1964                                     building_surface_pars_f%pars(ind_s_alb_b_wall,is)
     1965                            surf_usm_v(l)%albedo_type(ind_veg_wall,m) = 0
     1966                         ENDIF
     1967
     1968                         IF ( building_surface_pars_f%pars(ind_s_alb_b_win,is) /=       &
     1969                              building_surface_pars_f%fill )  THEN
     1970                            surf_usm_v(l)%albedo(ind_wat_win,m) =                       &
     1971                                     building_surface_pars_f%pars(ind_s_alb_b_win,is)
     1972                            surf_usm_v(l)%albedo_type(ind_wat_win,m) = 0
     1973                         ENDIF
     1974
     1975                         IF ( building_surface_pars_f%pars(ind_s_alb_b_green,is) /=     &
     1976                              building_surface_pars_f%fill )  THEN
     1977                            surf_usm_v(l)%albedo(ind_pav_green,m) =                     &
     1978                                     building_surface_pars_f%pars(ind_s_alb_b_green,is)
     1979                            surf_usm_v(l)%albedo_type(ind_pav_green,m) = 0
     1980                         ENDIF
     1981
     1982                         EXIT ! surface was found and processed
     1983                      ENDIF
     1984                   ENDDO
     1985                ENDDO
     1986             ENDDO
     1987          ENDIF
     1988!
    18891989!--    Initialization actions for RRTMG
    18901990       ELSEIF ( radiation_scheme == 'rrtmg' )  THEN
     
    22892389             ENDDO
    22902390
     2391          ENDIF
     2392!
     2393!--       Read explicit albedo values from building surface pars. If present,
     2394!--       they override all less specific albedo values and force a albedo_type
     2395!--       to zero in order to take effect.
     2396          IF ( building_surface_pars_f%from_file )  THEN
     2397             DO  m = 1, surf_usm_h%ns
     2398                i = surf_usm_h%i(m)
     2399                j = surf_usm_h%j(m)
     2400                k = surf_usm_h%k(m)
     2401!
     2402!--             Iterate over surfaces in column, check height and orientation
     2403                DO  is = building_surface_pars_f%index_ji(1,j,i), &
     2404                         building_surface_pars_f%index_ji(2,j,i)
     2405                   IF ( building_surface_pars_f%coords(4,is) == -surf_usm_h%koff .AND. &
     2406                        building_surface_pars_f%coords(1,is) == k )  THEN
     2407
     2408                      IF ( building_surface_pars_f%pars(ind_s_alb_b_wall,is) /=      &
     2409                           building_surface_pars_f%fill )  THEN
     2410                         surf_usm_h%albedo(ind_veg_wall,m) =                         &
     2411                                  building_surface_pars_f%pars(ind_s_alb_b_wall,is)
     2412                         surf_usm_h%albedo_type(ind_veg_wall,m) = 0
     2413                      ENDIF
     2414
     2415                      IF ( building_surface_pars_f%pars(ind_s_alb_l_wall,is) /=      &
     2416                           building_surface_pars_f%fill )  THEN
     2417                         surf_usm_h%aldir(ind_veg_wall,m) =                          &
     2418                                  building_surface_pars_f%pars(ind_s_alb_l_wall,is)
     2419                         surf_usm_h%aldif(ind_veg_wall,m) =                          &
     2420                                  building_surface_pars_f%pars(ind_s_alb_l_wall,is)
     2421                         surf_usm_h%albedo_type(ind_veg_wall,m) = 0
     2422                      ENDIF
     2423
     2424                      IF ( building_surface_pars_f%pars(ind_s_alb_s_wall,is) /=      &
     2425                           building_surface_pars_f%fill )  THEN
     2426                         surf_usm_h%asdir(ind_veg_wall,m) =                          &
     2427                                  building_surface_pars_f%pars(ind_s_alb_s_wall,is)
     2428                         surf_usm_h%asdif(ind_veg_wall,m) =                          &
     2429                                  building_surface_pars_f%pars(ind_s_alb_s_wall,is)
     2430                         surf_usm_h%albedo_type(ind_veg_wall,m) = 0
     2431                      ENDIF
     2432
     2433                      IF ( building_surface_pars_f%pars(ind_s_alb_b_win,is) /=       &
     2434                           building_surface_pars_f%fill )  THEN
     2435                         surf_usm_h%albedo(ind_wat_win,m) =                          &
     2436                                  building_surface_pars_f%pars(ind_s_alb_b_win,is)
     2437                         surf_usm_h%albedo_type(ind_wat_win,m) = 0
     2438                      ENDIF
     2439
     2440                      IF ( building_surface_pars_f%pars(ind_s_alb_l_win,is) /=       &
     2441                           building_surface_pars_f%fill )  THEN
     2442                         surf_usm_h%aldir(ind_wat_win,m) =                           &
     2443                                  building_surface_pars_f%pars(ind_s_alb_l_win,is)
     2444                         surf_usm_h%aldif(ind_wat_win,m) =                           &
     2445                                  building_surface_pars_f%pars(ind_s_alb_l_win,is)
     2446                         surf_usm_h%albedo_type(ind_wat_win,m) = 0
     2447                      ENDIF
     2448
     2449                      IF ( building_surface_pars_f%pars(ind_s_alb_s_win,is) /=       &
     2450                           building_surface_pars_f%fill )  THEN
     2451                         surf_usm_h%asdir(ind_wat_win,m) =                           &
     2452                                  building_surface_pars_f%pars(ind_s_alb_s_win,is)
     2453                         surf_usm_h%asdif(ind_wat_win,m) =                           &
     2454                                  building_surface_pars_f%pars(ind_s_alb_s_win,is)
     2455                         surf_usm_h%albedo_type(ind_wat_win,m) = 0
     2456                      ENDIF
     2457
     2458                      IF ( building_surface_pars_f%pars(ind_s_alb_b_green,is) /=     &
     2459                           building_surface_pars_f%fill )  THEN
     2460                         surf_usm_h%albedo(ind_pav_green,m) =                        &
     2461                                  building_surface_pars_f%pars(ind_s_alb_b_green,is)
     2462                         surf_usm_h%albedo_type(ind_pav_green,m) = 0
     2463                      ENDIF
     2464
     2465                      IF ( building_surface_pars_f%pars(ind_s_alb_l_green,is) /=     &
     2466                           building_surface_pars_f%fill )  THEN
     2467                         surf_usm_h%aldir(ind_pav_green,m) =                         &
     2468                                  building_surface_pars_f%pars(ind_s_alb_l_green,is)
     2469                         surf_usm_h%aldif(ind_pav_green,m) =                         &
     2470                                  building_surface_pars_f%pars(ind_s_alb_l_green,is)
     2471                         surf_usm_h%albedo_type(ind_pav_green,m) = 0
     2472                      ENDIF
     2473
     2474                      IF ( building_surface_pars_f%pars(ind_s_alb_s_green,is) /=     &
     2475                           building_surface_pars_f%fill )  THEN
     2476                         surf_usm_h%asdir(ind_pav_green,m) =                         &
     2477                                  building_surface_pars_f%pars(ind_s_alb_s_green,is)
     2478                         surf_usm_h%asdif(ind_pav_green,m) =                         &
     2479                                  building_surface_pars_f%pars(ind_s_alb_s_green,is)
     2480                         surf_usm_h%albedo_type(ind_pav_green,m) = 0
     2481                      ENDIF
     2482
     2483                      EXIT ! surface was found and processed
     2484                   ENDIF
     2485                ENDDO
     2486             ENDDO
     2487
     2488             DO  l = 0, 3
     2489                DO  m = 1, surf_usm_v(l)%ns
     2490                   i = surf_usm_v(l)%i(m)
     2491                   j = surf_usm_v(l)%j(m)
     2492                   k = surf_usm_v(l)%k(m)
     2493!
     2494!--                Iterate over surfaces in column, check height and orientation
     2495                   DO  is = building_surface_pars_f%index_ji(1,j,i), &
     2496                            building_surface_pars_f%index_ji(2,j,i)
     2497                      IF ( building_surface_pars_f%coords(5,is) == -surf_usm_v(l)%joff .AND. &
     2498                           building_surface_pars_f%coords(6,is) == -surf_usm_v(l)%ioff .AND. &
     2499                           building_surface_pars_f%coords(1,is) == k )  THEN
     2500
     2501                         IF ( building_surface_pars_f%pars(ind_s_alb_b_wall,is) /=      &
     2502                              building_surface_pars_f%fill )  THEN
     2503                            surf_usm_v(l)%albedo(ind_veg_wall,m) =                      &
     2504                                     building_surface_pars_f%pars(ind_s_alb_b_wall,is)
     2505                            surf_usm_v(l)%albedo_type(ind_veg_wall,m) = 0
     2506                         ENDIF
     2507
     2508                         IF ( building_surface_pars_f%pars(ind_s_alb_l_wall,is) /=      &
     2509                              building_surface_pars_f%fill )  THEN
     2510                            surf_usm_v(l)%aldir(ind_veg_wall,m) =                       &
     2511                                     building_surface_pars_f%pars(ind_s_alb_l_wall,is)
     2512                            surf_usm_v(l)%aldif(ind_veg_wall,m) =                       &
     2513                                     building_surface_pars_f%pars(ind_s_alb_l_wall,is)
     2514                            surf_usm_v(l)%albedo_type(ind_veg_wall,m) = 0
     2515                         ENDIF
     2516
     2517                         IF ( building_surface_pars_f%pars(ind_s_alb_s_wall,is) /=      &
     2518                              building_surface_pars_f%fill )  THEN
     2519                            surf_usm_v(l)%asdir(ind_veg_wall,m) =                       &
     2520                                     building_surface_pars_f%pars(ind_s_alb_s_wall,is)
     2521                            surf_usm_v(l)%asdif(ind_veg_wall,m) =                       &
     2522                                     building_surface_pars_f%pars(ind_s_alb_s_wall,is)
     2523                            surf_usm_v(l)%albedo_type(ind_veg_wall,m) = 0
     2524                         ENDIF
     2525
     2526                         IF ( building_surface_pars_f%pars(ind_s_alb_b_win,is) /=       &
     2527                              building_surface_pars_f%fill )  THEN
     2528                            surf_usm_v(l)%albedo(ind_wat_win,m) =                       &
     2529                                     building_surface_pars_f%pars(ind_s_alb_b_win,is)
     2530                            surf_usm_v(l)%albedo_type(ind_wat_win,m) = 0
     2531                         ENDIF
     2532
     2533                         IF ( building_surface_pars_f%pars(ind_s_alb_l_win,is) /=       &
     2534                              building_surface_pars_f%fill )  THEN
     2535                            surf_usm_v(l)%aldir(ind_wat_win,m) =                        &
     2536                                     building_surface_pars_f%pars(ind_s_alb_l_win,is)
     2537                            surf_usm_v(l)%aldif(ind_wat_win,m) =                        &
     2538                                     building_surface_pars_f%pars(ind_s_alb_l_win,is)
     2539                            surf_usm_v(l)%albedo_type(ind_wat_win,m) = 0
     2540                         ENDIF
     2541
     2542                         IF ( building_surface_pars_f%pars(ind_s_alb_s_win,is) /=       &
     2543                              building_surface_pars_f%fill )  THEN
     2544                            surf_usm_v(l)%asdir(ind_wat_win,m) =                        &
     2545                                     building_surface_pars_f%pars(ind_s_alb_s_win,is)
     2546                            surf_usm_v(l)%asdif(ind_wat_win,m) =                        &
     2547                                     building_surface_pars_f%pars(ind_s_alb_s_win,is)
     2548                            surf_usm_v(l)%albedo_type(ind_wat_win,m) = 0
     2549                         ENDIF
     2550
     2551                         IF ( building_surface_pars_f%pars(ind_s_alb_b_green,is) /=     &
     2552                              building_surface_pars_f%fill )  THEN
     2553                            surf_usm_v(l)%albedo(ind_pav_green,m) =                     &
     2554                                     building_surface_pars_f%pars(ind_s_alb_b_green,is)
     2555                            surf_usm_v(l)%albedo_type(ind_pav_green,m) = 0
     2556                         ENDIF
     2557
     2558                         IF ( building_surface_pars_f%pars(ind_s_alb_l_green,is) /=     &
     2559                              building_surface_pars_f%fill )  THEN
     2560                            surf_usm_v(l)%aldir(ind_pav_green,m) =                      &
     2561                                     building_surface_pars_f%pars(ind_s_alb_l_green,is)
     2562                            surf_usm_v(l)%aldif(ind_pav_green,m) =                      &
     2563                                     building_surface_pars_f%pars(ind_s_alb_l_green,is)
     2564                            surf_usm_v(l)%albedo_type(ind_pav_green,m) = 0
     2565                         ENDIF
     2566
     2567                         IF ( building_surface_pars_f%pars(ind_s_alb_s_green,is) /=     &
     2568                              building_surface_pars_f%fill )  THEN
     2569                            surf_usm_v(l)%asdir(ind_pav_green,m) =                      &
     2570                                     building_surface_pars_f%pars(ind_s_alb_s_green,is)
     2571                            surf_usm_v(l)%asdif(ind_pav_green,m) =                      &
     2572                                     building_surface_pars_f%pars(ind_s_alb_s_green,is)
     2573                            surf_usm_v(l)%albedo_type(ind_pav_green,m) = 0
     2574                         ENDIF
     2575
     2576                         EXIT ! surface was found and processed
     2577                      ENDIF
     2578                   ENDDO
     2579                ENDDO
     2580             ENDDO
    22912581          ENDIF
    22922582
  • palm/trunk/SOURCE/surface_mod.f90

    r4182 r4245  
    2121! Current revisions:
    2222! ------------------
    23 ! 
     23!
    2424!
    2525! Former revisions:
  • palm/trunk/SOURCE/urban_surface_mod.f90

    r4238 r4245  
    2828! -----------------
    2929! $Id$
     30! Initialize explicit per-surface parameters from building_surface_pars
     31!
     32! 4238 2019-09-25 16:06:01Z suehring
    3033! Indoor-model parameters for some building types adjusted in order to avoid
    3134! unrealistically high indoor temperatures (S. Rissmann)
     
    465468    INTEGER(iwp) ::  ind_z0qh_gfl          = 37   !< index in input list for z0h / z0q, ground floor level
    466469    INTEGER(iwp) ::  ind_green_type_roof   = 118  !< index in input list for type of green roof
    467 
     470!
     471!-- Indices of input attributes in building_surface_pars (except for
     472!-- radiation-related, which are in radiation_model_mod)
     473    INTEGER(iwp) ::  ind_s_wall_frac                 = 0  !< index for wall fraction (0-1)
     474    INTEGER(iwp) ::  ind_s_win_frac                  = 1  !< index for window fraction (0-1)
     475    INTEGER(iwp) ::  ind_s_green_frac_w              = 2  !< index for green fraction on wall (0-1)
     476    INTEGER(iwp) ::  ind_s_green_frac_r              = 3  !< index for green fraction on roof (0-1)
     477    INTEGER(iwp) ::  ind_s_lai_r                     = 4  !< index for leaf area index of green fraction
     478    INTEGER(iwp) ::  ind_s_hc1                       = 5  !< index for heat capacity of wall layer 1
     479    INTEGER(iwp) ::  ind_s_hc2                       = 6  !< index for heat capacity of wall layer 2
     480    INTEGER(iwp) ::  ind_s_hc3                       = 7  !< index for heat capacity of wall layer 3
     481    INTEGER(iwp) ::  ind_s_tc1                       = 8  !< index for thermal conducivity of wall layer 1
     482    INTEGER(iwp) ::  ind_s_tc2                       = 9  !< index for thermal conducivity of wall layer 2
     483    INTEGER(iwp) ::  ind_s_tc3                       = 10 !< index for thermal conducivity of wall layer 3
     484    INTEGER(iwp) ::  ind_s_indoor_target_temp_summer = 11 !< index for indoor target summer temperature
     485    INTEGER(iwp) ::  ind_s_indoor_target_temp_winter = 12 !< index for indoor target winter temperature
     486    INTEGER(iwp) ::  ind_s_emis_wall                 = 13 !< index for emissivity of wall fraction (0-1)
     487    INTEGER(iwp) ::  ind_s_emis_green                = 14 !< index for emissivity of green fraction (0-1)
     488    INTEGER(iwp) ::  ind_s_emis_win                  = 15 !< index for emissivity o f window fraction (0-1)
     489    INTEGER(iwp) ::  ind_s_trans                     = 16 !< index for transmissivity of window fraction (0-1)
     490    INTEGER(iwp) ::  ind_s_z0                        = 17 !< index for roughness length for momentum (m)
     491    INTEGER(iwp) ::  ind_s_z0qh                      = 18 !< index for roughness length for heat (m)
    468492
    469493    REAL(wp)  ::  roof_height_limit = 4.0_wp         !< height for distinguish between land surfaces and roofs
     
    34373461
    34383462        USE netcdf_data_input_mod,                                             &
    3439             ONLY:  building_pars_f, building_type_f, terrain_height_f
     3463            ONLY:  building_pars_f, building_surface_pars_f, building_type_f,  &
     3464                   terrain_height_f
    34403465   
    34413466        IMPLICIT NONE
     
    34773502        INTEGER(iwp) ::  ind_z0              !< index in input list for z0
    34783503        INTEGER(iwp) ::  ind_z0qh            !< index in input list for z0h / z0q
     3504        INTEGER(iwp) ::  is                  !< loop index input surface element
    34793505        INTEGER(iwp) ::  j                   !< loop index y-dirction
    34803506        INTEGER(iwp) ::  k                   !< loop index z-dirction
     
    47054731           ENDDO
    47064732        ENDIF
     4733!
     4734!--     Read building surface pars. If present, they override LOD1-LOD3 building
     4735!--     pars where applicable
     4736        IF ( building_surface_pars_f%from_file )  THEN
     4737           DO  m = 1, surf_usm_h%ns
     4738              i = surf_usm_h%i(m)
     4739              j = surf_usm_h%j(m)
     4740              k = surf_usm_h%k(m)
     4741!
     4742!--           Iterate over surfaces in column, check height and orientation
     4743              DO  is = building_surface_pars_f%index_ji(1,j,i), &
     4744                       building_surface_pars_f%index_ji(2,j,i)
     4745                 IF ( building_surface_pars_f%coords(4,is) == -surf_usm_h%koff .AND.            &
     4746                      building_surface_pars_f%coords(1,is) == k )  THEN
     4747
     4748                    IF ( building_surface_pars_f%pars(ind_s_wall_frac,is) /=                     &
     4749                         building_surface_pars_f%fill )                                          &
     4750                       surf_usm_h%frac(ind_veg_wall,m) =                                         &
     4751                                building_surface_pars_f%pars(ind_s_wall_frac,is)
     4752
     4753                    IF ( building_surface_pars_f%pars(ind_s_green_frac_w,is) /=                  &
     4754                         building_surface_pars_f%fill )                                          &
     4755                       surf_usm_h%frac(ind_pav_green,m) =                                        &
     4756                                building_surface_pars_f%pars(ind_s_green_frac_w,is)
     4757
     4758                    IF ( building_surface_pars_f%pars(ind_s_green_frac_r,is) /=                  &
     4759                         building_surface_pars_f%fill )                                          &
     4760                       surf_usm_h%frac(ind_pav_green,m) =                                        &
     4761                                building_surface_pars_f%pars(ind_s_green_frac_r,is)
     4762                                !TODO clarify: why should _w and _r be on the same surface?
     4763
     4764                    IF ( building_surface_pars_f%pars(ind_s_win_frac,is) /=                      &
     4765                         building_surface_pars_f%fill )                                          &
     4766                       surf_usm_h%frac(ind_wat_win,m) =                                          &
     4767                                building_surface_pars_f%pars(ind_s_win_frac,is)
     4768
     4769                    IF ( building_surface_pars_f%pars(ind_s_lai_r,is) /=                         &
     4770                         building_surface_pars_f%fill )                                          &
     4771                       surf_usm_h%lai(m) =                                                       &
     4772                                building_surface_pars_f%pars(ind_s_lai_r,is)
     4773
     4774                    IF ( building_surface_pars_f%pars(ind_s_hc1,is) /=                           &
     4775                         building_surface_pars_f%fill )  THEN
     4776                       surf_usm_h%rho_c_wall(nzb_wall:nzb_wall+1,m) =                            &
     4777                                building_surface_pars_f%pars(ind_s_hc1,is)
     4778                       surf_usm_h%rho_c_green(nzb_wall:nzb_wall+1,m) =                           &
     4779                                building_surface_pars_f%pars(ind_s_hc1,is)
     4780                       surf_usm_h%rho_c_window(nzb_wall:nzb_wall+1,m) =                          &
     4781                                building_surface_pars_f%pars(ind_s_hc1,is)
     4782                    ENDIF
     4783
     4784                    IF ( building_surface_pars_f%pars(ind_s_hc2,is) /=                           &
     4785                         building_surface_pars_f%fill )  THEN
     4786                       surf_usm_h%rho_c_wall(nzb_wall+2,m) =                                     &
     4787                                building_surface_pars_f%pars(ind_s_hc2,is)
     4788                       surf_usm_h%rho_c_green(nzb_wall+2,m) =                                    &
     4789                                building_surface_pars_f%pars(ind_s_hc2,is)
     4790                       surf_usm_h%rho_c_window(nzb_wall+2,m) =                                   &
     4791                                building_surface_pars_f%pars(ind_s_hc2,is)
     4792                    ENDIF
     4793
     4794                    IF ( building_surface_pars_f%pars(ind_s_hc3,is) /=                           &
     4795                         building_surface_pars_f%fill )  THEN
     4796                       surf_usm_h%rho_c_wall(nzb_wall+3,m) =                                     &
     4797                                building_surface_pars_f%pars(ind_s_hc3,is)
     4798                       surf_usm_h%rho_c_green(nzb_wall+3,m) =                                    &
     4799                                building_surface_pars_f%pars(ind_s_hc3,is)
     4800                       surf_usm_h%rho_c_window(nzb_wall+3,m) =                                   &
     4801                                building_surface_pars_f%pars(ind_s_hc3,is)
     4802                    ENDIF
     4803
     4804                    IF ( building_surface_pars_f%pars(ind_s_tc1,is) /=                           &
     4805                         building_surface_pars_f%fill )  THEN
     4806                       surf_usm_h%lambda_h(nzb_wall:nzb_wall+1,m) =                              &
     4807                                building_surface_pars_f%pars(ind_s_tc1,is)
     4808                       surf_usm_h%lambda_h_green(nzb_wall:nzb_wall+1,m) =                        &
     4809                                building_surface_pars_f%pars(ind_s_tc1,is)
     4810                       surf_usm_h%lambda_h_window(nzb_wall:nzb_wall+1,m) =                       &
     4811                                building_surface_pars_f%pars(ind_s_tc1,is)
     4812                    ENDIF
     4813
     4814                    IF ( building_surface_pars_f%pars(ind_s_tc2,is) /=                           &
     4815                         building_surface_pars_f%fill )  THEN
     4816                       surf_usm_h%lambda_h(nzb_wall+2,m) =                                       &
     4817                                building_surface_pars_f%pars(ind_s_tc2,is)
     4818                       surf_usm_h%lambda_h_green(nzb_wall+2,m) =                                 &
     4819                                building_surface_pars_f%pars(ind_s_tc2,is)
     4820                       surf_usm_h%lambda_h_window(nzb_wall+2,m) =                                &
     4821                                building_surface_pars_f%pars(ind_s_tc2,is)
     4822                    ENDIF
     4823
     4824                    IF ( building_surface_pars_f%pars(ind_s_tc3,is) /=                           &
     4825                         building_surface_pars_f%fill )  THEN
     4826                       surf_usm_h%lambda_h(nzb_wall+3,m) =                                       &
     4827                                building_surface_pars_f%pars(ind_s_tc3,is)
     4828                       surf_usm_h%lambda_h_green(nzb_wall+3,m) =                                 &
     4829                                building_surface_pars_f%pars(ind_s_tc3,is)
     4830                       surf_usm_h%lambda_h_window(nzb_wall+3,m) =                                &
     4831                                building_surface_pars_f%pars(ind_s_tc3,is)
     4832                    ENDIF
     4833
     4834                    IF ( building_surface_pars_f%pars(ind_s_indoor_target_temp_summer,is) /=     &
     4835                         building_surface_pars_f%fill )                                          &
     4836                       surf_usm_h%target_temp_summer(m) =                                        &
     4837                                building_surface_pars_f%pars(ind_s_indoor_target_temp_summer,is)
     4838
     4839                    IF ( building_surface_pars_f%pars(ind_s_indoor_target_temp_winter,is) /=     &
     4840                         building_surface_pars_f%fill )                                          &
     4841                       surf_usm_h%target_temp_winter(m) =                                        &
     4842                                building_surface_pars_f%pars(ind_s_indoor_target_temp_winter,is)
     4843
     4844                    IF ( building_surface_pars_f%pars(ind_s_emis_wall,is) /=                     &
     4845                         building_surface_pars_f%fill )                                          &
     4846                       surf_usm_h%emissivity(ind_veg_wall,m) =                                   &
     4847                                building_surface_pars_f%pars(ind_s_emis_wall,is)
     4848
     4849                    IF ( building_surface_pars_f%pars(ind_s_emis_green,is) /=                    &
     4850                         building_surface_pars_f%fill )                                          &
     4851                       surf_usm_h%emissivity(ind_pav_green,m) =                                  &
     4852                                building_surface_pars_f%pars(ind_s_emis_green,is)
     4853
     4854                    IF ( building_surface_pars_f%pars(ind_s_emis_win,is) /=                      &
     4855                         building_surface_pars_f%fill )                                          &
     4856                       surf_usm_h%emissivity(ind_wat_win,m) =                                    &
     4857                                building_surface_pars_f%pars(ind_s_emis_win,is)
     4858
     4859                    IF ( building_surface_pars_f%pars(ind_s_trans,is) /=                         &
     4860                         building_surface_pars_f%fill )                                          &
     4861                       surf_usm_h%transmissivity(m) =                                            &
     4862                                building_surface_pars_f%pars(ind_s_trans,is)
     4863
     4864                    IF ( building_surface_pars_f%pars(ind_s_z0,is) /=                            &
     4865                         building_surface_pars_f%fill )                                          &
     4866                       surf_usm_h%z0(m) =                                                        &
     4867                                building_surface_pars_f%pars(ind_s_z0,is)
     4868
     4869                    IF ( building_surface_pars_f%pars(ind_s_z0qh,is) /=                          &
     4870                         building_surface_pars_f%fill )  THEN
     4871                       surf_usm_h%z0q(m) =                                                       &
     4872                                building_surface_pars_f%pars(ind_s_z0qh,is)
     4873                       surf_usm_h%z0h(m) =                                                       &
     4874                                building_surface_pars_f%pars(ind_s_z0qh,is)
     4875                    ENDIF
     4876
     4877                    EXIT ! surface was found and processed
     4878                 ENDIF
     4879              ENDDO
     4880           ENDDO
     4881
     4882           DO  l = 0, 3
     4883              DO  m = 1, surf_usm_v(l)%ns
     4884                 i = surf_usm_v(l)%i(m)
     4885                 j = surf_usm_v(l)%j(m)
     4886                 k = surf_usm_v(l)%k(m)
     4887!
     4888!--              Iterate over surfaces in column, check height and orientation
     4889                 DO  is = building_surface_pars_f%index_ji(1,j,i), &
     4890                          building_surface_pars_f%index_ji(2,j,i)
     4891                    IF ( building_surface_pars_f%coords(5,is) == -surf_usm_v(l)%joff .AND.    &
     4892                         building_surface_pars_f%coords(6,is) == -surf_usm_v(l)%ioff .AND.    &
     4893                         building_surface_pars_f%coords(1,is) == k )  THEN
     4894
     4895                       IF ( building_surface_pars_f%pars(ind_s_wall_frac,is) /=                &
     4896                            building_surface_pars_f%fill )                                     &
     4897                          surf_usm_v(l)%frac(ind_veg_wall,m) =                                 &
     4898                                   building_surface_pars_f%pars(ind_s_wall_frac,is)
     4899
     4900                       IF ( building_surface_pars_f%pars(ind_s_green_frac_w,is) /=             &
     4901                            building_surface_pars_f%fill )                                     &
     4902                          surf_usm_v(l)%frac(ind_pav_green,m) =                                &
     4903                                   building_surface_pars_f%pars(ind_s_green_frac_w,is)
     4904
     4905                       IF ( building_surface_pars_f%pars(ind_s_green_frac_r,is) /=             &
     4906                            building_surface_pars_f%fill )                                     &
     4907                          surf_usm_v(l)%frac(ind_pav_green,m) =                                &
     4908                                   building_surface_pars_f%pars(ind_s_green_frac_r,is)
     4909                                   !TODO clarify: why should _w and _r be on the same surface?
     4910
     4911                       IF ( building_surface_pars_f%pars(ind_s_win_frac,is) /=                 &
     4912                            building_surface_pars_f%fill )                                     &
     4913                          surf_usm_v(l)%frac(ind_wat_win,m) =                                  &
     4914                                   building_surface_pars_f%pars(ind_s_win_frac,is)
     4915
     4916                       IF ( building_surface_pars_f%pars(ind_s_lai_r,is) /=                    &
     4917                            building_surface_pars_f%fill )                                     &
     4918                          surf_usm_v(l)%lai(m) =                                               &
     4919                                   building_surface_pars_f%pars(ind_s_lai_r,is)
     4920
     4921                       IF ( building_surface_pars_f%pars(ind_s_hc1,is) /=                      &
     4922                            building_surface_pars_f%fill )  THEN
     4923                          surf_usm_v(l)%rho_c_wall(nzb_wall:nzb_wall+1,m) =                    &
     4924                                   building_surface_pars_f%pars(ind_s_hc1,is)
     4925                          surf_usm_v(l)%rho_c_green(nzb_wall:nzb_wall+1,m) =                   &
     4926                                   building_surface_pars_f%pars(ind_s_hc1,is)
     4927                          surf_usm_v(l)%rho_c_window(nzb_wall:nzb_wall+1,m) =                  &
     4928                                   building_surface_pars_f%pars(ind_s_hc1,is)
     4929                       ENDIF
     4930
     4931                       IF ( building_surface_pars_f%pars(ind_s_hc2,is) /=                      &
     4932                            building_surface_pars_f%fill )  THEN
     4933                          surf_usm_v(l)%rho_c_wall(nzb_wall+2,m) =                             &
     4934                                   building_surface_pars_f%pars(ind_s_hc2,is)
     4935                          surf_usm_v(l)%rho_c_green(nzb_wall+2,m) =                            &
     4936                                   building_surface_pars_f%pars(ind_s_hc2,is)
     4937                          surf_usm_v(l)%rho_c_window(nzb_wall+2,m) =                           &
     4938                                   building_surface_pars_f%pars(ind_s_hc2,is)
     4939                       ENDIF
     4940
     4941                       IF ( building_surface_pars_f%pars(ind_s_hc3,is) /=                      &
     4942                            building_surface_pars_f%fill )  THEN
     4943                          surf_usm_v(l)%rho_c_wall(nzb_wall+3,m) =                             &
     4944                                   building_surface_pars_f%pars(ind_s_hc3,is)
     4945                          surf_usm_v(l)%rho_c_green(nzb_wall+3,m) =                            &
     4946                                   building_surface_pars_f%pars(ind_s_hc3,is)
     4947                          surf_usm_v(l)%rho_c_window(nzb_wall+3,m) =                           &
     4948                                   building_surface_pars_f%pars(ind_s_hc3,is)
     4949                       ENDIF
     4950
     4951                       IF ( building_surface_pars_f%pars(ind_s_tc1,is) /=                      &
     4952                            building_surface_pars_f%fill )  THEN
     4953                          surf_usm_v(l)%lambda_h(nzb_wall:nzb_wall+1,m) =                      &
     4954                                   building_surface_pars_f%pars(ind_s_tc1,is)
     4955                          surf_usm_v(l)%lambda_h_green(nzb_wall:nzb_wall+1,m) =                &
     4956                                   building_surface_pars_f%pars(ind_s_tc1,is)
     4957                          surf_usm_v(l)%lambda_h_window(nzb_wall:nzb_wall+1,m) =               &
     4958                                   building_surface_pars_f%pars(ind_s_tc1,is)
     4959                       ENDIF
     4960
     4961                       IF ( building_surface_pars_f%pars(ind_s_tc2,is) /=                      &
     4962                            building_surface_pars_f%fill )  THEN
     4963                          surf_usm_v(l)%lambda_h(nzb_wall+2,m) =                               &
     4964                                   building_surface_pars_f%pars(ind_s_tc2,is)
     4965                          surf_usm_v(l)%lambda_h_green(nzb_wall+2,m) =                         &
     4966                                   building_surface_pars_f%pars(ind_s_tc2,is)
     4967                          surf_usm_v(l)%lambda_h_window(nzb_wall+2,m) =                        &
     4968                                   building_surface_pars_f%pars(ind_s_tc2,is)
     4969                       ENDIF
     4970
     4971                       IF ( building_surface_pars_f%pars(ind_s_tc3,is) /=                      &
     4972                            building_surface_pars_f%fill )  THEN
     4973                          surf_usm_v(l)%lambda_h(nzb_wall+3,m) =                               &
     4974                                   building_surface_pars_f%pars(ind_s_tc3,is)
     4975                          surf_usm_v(l)%lambda_h_green(nzb_wall+3,m) =                         &
     4976                                   building_surface_pars_f%pars(ind_s_tc3,is)
     4977                          surf_usm_v(l)%lambda_h_window(nzb_wall+3,m) =                        &
     4978                                   building_surface_pars_f%pars(ind_s_tc3,is)
     4979                       ENDIF
     4980
     4981                       IF ( building_surface_pars_f%pars(ind_s_indoor_target_temp_summer,is) /=    &
     4982                            building_surface_pars_f%fill )                                         &
     4983                          surf_usm_v(l)%target_temp_summer(m) =                                    &
     4984                                   building_surface_pars_f%pars(ind_s_indoor_target_temp_summer,is)
     4985
     4986                       IF ( building_surface_pars_f%pars(ind_s_indoor_target_temp_winter,is) /=    &
     4987                            building_surface_pars_f%fill )                                         &
     4988                          surf_usm_v(l)%target_temp_winter(m) =                                    &
     4989                                   building_surface_pars_f%pars(ind_s_indoor_target_temp_winter,is)
     4990
     4991                       IF ( building_surface_pars_f%pars(ind_s_emis_wall,is) /=      &
     4992                            building_surface_pars_f%fill )                           &
     4993                          surf_usm_v(l)%emissivity(ind_veg_wall,m) =                 &
     4994                                   building_surface_pars_f%pars(ind_s_emis_wall,is)
     4995
     4996                       IF ( building_surface_pars_f%pars(ind_s_emis_green,is) /=     &
     4997                            building_surface_pars_f%fill )                           &
     4998                          surf_usm_v(l)%emissivity(ind_pav_green,m) =                &
     4999                                   building_surface_pars_f%pars(ind_s_emis_green,is)
     5000
     5001                       IF ( building_surface_pars_f%pars(ind_s_emis_win,is) /=       &
     5002                            building_surface_pars_f%fill )                           &
     5003                          surf_usm_v(l)%emissivity(ind_wat_win,m) =                  &
     5004                                   building_surface_pars_f%pars(ind_s_emis_win,is)
     5005
     5006                       IF ( building_surface_pars_f%pars(ind_s_trans,is) /=          &
     5007                            building_surface_pars_f%fill )                           &
     5008                          surf_usm_v(l)%transmissivity(m) =                          &
     5009                                   building_surface_pars_f%pars(ind_s_trans,is)
     5010
     5011                       IF ( building_surface_pars_f%pars(ind_s_z0,is) /=             &
     5012                            building_surface_pars_f%fill )                           &
     5013                          surf_usm_v(l)%z0(m) =                                      &
     5014                                   building_surface_pars_f%pars(ind_s_z0,is)
     5015
     5016                       IF ( building_surface_pars_f%pars(ind_s_z0qh,is) /=           &
     5017                            building_surface_pars_f%fill )  THEN
     5018                          surf_usm_v(l)%z0q(m) =                                     &
     5019                                   building_surface_pars_f%pars(ind_s_z0qh,is)
     5020                          surf_usm_v(l)%z0h(m) =                                     &
     5021                                   building_surface_pars_f%pars(ind_s_z0qh,is)
     5022                       ENDIF
     5023
     5024                       EXIT ! surface was found and processed
     5025                    ENDIF
     5026                 ENDDO
     5027              ENDDO
     5028           ENDDO
     5029        ENDIF
    47075030!       
    47085031!--     Read the surface_types array.
  • palm/trunk/UTIL

Note: See TracChangeset for help on using the changeset viewer.