MODULE module_sf_bep_bem 2
!USE module_model_constants
USE module_sf_urban
USE module_sf_bem
! SGClarke 09/11/2008
! Access urban_param.tbl values through calling urban_param_init in module_physics_init
! for CASE (BEPSCHEME) select sf_urban_physics
!
! -----------------------------------------------------------------------
! Dimension for the array used in the BEP module
! -----------------------------------------------------------------------
integer nurbm ! Maximum number of urban classes
parameter (nurbm=3)
integer ndm ! Maximum number of street directions
parameter (ndm=2)
integer nz_um ! Maximum number of vertical levels in the urban grid
parameter(nz_um=18)
integer ng_u ! Number of grid levels in the ground
parameter (ng_u=10)
integer nwr_u ! Number of grid levels in the walls or roofs
parameter (nwr_u=10)
integer nf_u !Number of grid levels in the floors (BEM)
parameter (nf_u=10)
integer ngb_u !Number of grid levels in the ground below building (BEM)
parameter (ngb_u=10)
real dz_u ! Urban grid resolution
parameter (dz_u=5.)
integer nbui_max !maximum number of types of buildings in an urban class
parameter (nbui_max=15) !must be less or equal than nz_um
!---------------------------------------------------------------------------------
!Parameters of the windows. The glasses of windows are considered without films -
!Read the paper of J.Karlsson and A.Roos(2000):"modelling the angular behaviour -
!of the total solar energy transmittance of windows".Solar Energy Vol.69,No.4, -
!pp. 321-329, for more details. -
!---------------------------------------------------------------------------------
integer p_num !number of panes in the windows (1,2 or 3)
parameter (p_num=2)
integer q_num !category number for the windows (q_num= 4, standard glasses)
parameter(q_num=4) !Possible values 1,2,...,10
! The change of ng_u, nwr_u should be done in agreement with the block data
! in the routine "surf_temp"
! -----------------------------------------------------------------------
! Constant used in the BEP module
! -----------------------------------------------------------------------
real vk ! von Karman constant
real g_u ! Gravity acceleration
real pi !
real r ! Perfect gas constant
real cp_u ! Specific heat at constant pressure
real rcp_u !
real sigma !
real p0 ! Reference pressure at the sea level
real cdrag ! Drag force constant
real latent ! Latent heat of vaporization [J/kg] (used in BEM)
parameter(vk=0.40,g_u=9.81,pi=3.141592653,r=287.,cp_u=1004.)
parameter(rcp_u=r/cp_u,sigma=5.67e-08,p0=1.e+5,cdrag=0.4,latent=2.45e+06)
! -----------------------------------------------------------------------
CONTAINS
subroutine BEP_BEM(FRC_URB2D,UTYPE_URB2D,itimestep,dz8w,dt,u_phy,v_phy, & 1,6
th_phy,rho,p_phy,swdown,glw, &
gmt,julday,xlong,xlat, &
declin_urb,cosz_urb2d,omg_urb2d, &
num_urban_layers,num_urban_hi, &
trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d, &
tlev_urb3d,qlev_urb3d,tw1lev_urb3d,tw2lev_urb3d, &
tglev_urb3d,tflev_urb3d,sf_ac_urb3d,lf_ac_urb3d, &
cm_ac_urb3d,sfvent_urb3d,lfvent_urb3d, &
sfwin1_urb3d,sfwin2_urb3d, &
sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d, &
lp_urb2d,hi_urb2d,lb_urb2d,hgt_urb2d, &
a_u,a_v,a_t,a_e,b_u,b_v, &
b_t,b_e,b_q,dlg,dl_u,sf,vl, &
rl_up,rs_abs,emiss,grdflx_urb,qv_phy, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte)
implicit none
!------------------------------------------------------------------------
! Input
!------------------------------------------------------------------------
INTEGER :: ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte, &
itimestep
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: DZ8W
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: P_PHY
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: RHO
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: TH_PHY
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: T_PHY
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: U_PHY
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: V_PHY
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: U
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: V
REAL, DIMENSION( ims:ime , jms:jme ) :: GLW
REAL, DIMENSION( ims:ime , jms:jme ) :: swdown
REAL, DIMENSION( ims:ime, jms:jme ) :: UST
INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: UTYPE_URB2D
REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: FRC_URB2D
REAL, INTENT(IN ) :: GMT
INTEGER, INTENT(IN ) :: JULDAY
REAL, DIMENSION( ims:ime, jms:jme ), &
INTENT(IN ) :: XLAT, XLONG
REAL, INTENT(IN) :: DECLIN_URB
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: COSZ_URB2D
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: OMG_URB2D
INTEGER, INTENT(IN ) :: num_urban_layers
INTEGER, INTENT(IN ) :: num_urban_hi
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: trb_urb4d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1_urb4d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2_urb4d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tgb_urb4d
!New variables used for BEM
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: qv_phy
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tlev_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: qlev_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1lev_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2lev_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tglev_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tflev_urb3d
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lf_ac_urb3d
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sf_ac_urb3d
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: cm_ac_urb3d
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sfvent_urb3d
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lfvent_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin1_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin2_urb3d
!End variables
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw1_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw2_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfr_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfg_urb3d
REAL, DIMENSION( ims:ime, 1:num_urban_hi, jms:jme ), INTENT(IN) :: hi_urb2d
REAL, DIMENSION( ims:ime,jms:jme), INTENT(IN) :: lp_urb2d
REAL, DIMENSION( ims:ime,jms:jme), INTENT(IN) :: lb_urb2d
REAL, DIMENSION( ims:ime,jms:jme), INTENT(IN) :: hgt_urb2d
real z(ims:ime,kms:kme,jms:jme) ! Vertical coordinates
REAL, INTENT(IN ):: DT ! Time step
!------------------------------------------------------------------------
! Output
!------------------------------------------------------------------------
!
! Implicit and explicit components of the source and sink terms at each levels,
! the fluxes can be computed as follow: FX = A*X + B example: t_fluxes = a_t * pt + b_t
real a_u(ims:ime,kms:kme,jms:jme) ! Implicit component for the momemtum in X-direction (center)
real a_v(ims:ime,kms:kme,jms:jme) ! Implicit component for the momemtum in Y-direction (center)
real a_t(ims:ime,kms:kme,jms:jme) ! Implicit component for the temperature
real a_e(ims:ime,kms:kme,jms:jme) ! Implicit component for the TKE
real b_u(ims:ime,kms:kme,jms:jme) ! Explicit component for the momemtum in X-direction (center)
real b_v(ims:ime,kms:kme,jms:jme) ! Explicit component for the momemtum in Y-direction (center)
real b_t(ims:ime,kms:kme,jms:jme) ! Explicit component for the temperature
real b_e(ims:ime,kms:kme,jms:jme) ! Explicit component for the TKE
real b_q(ims:ime,kms:kme,jms:jme) ! Explicit component for the Humidity
real dlg(ims:ime,kms:kme,jms:jme) ! Height above ground (L_ground in formula (24) of the BLM paper).
real dl_u(ims:ime,kms:kme,jms:jme) ! Length scale (lb in formula (22) ofthe BLM paper).
! urban surface and volumes
real sf(ims:ime,kms:kme,jms:jme) ! surface of the urban grid cells
real vl(ims:ime,kms:kme,jms:jme) ! volume of the urban grid cells
! urban fluxes
real rl_up(its:ite,jts:jte) ! upward long wave radiation
real rs_abs(its:ite,jts:jte) ! absorbed short wave radiation
real emiss(its:ite,jts:jte) ! emissivity averaged for urban surfaces
real grdflx_urb(its:ite,jts:jte) ! ground heat flux for urban areas
!------------------------------------------------------------------------
! Local
!------------------------------------------------------------------------
real hi_urb(its:ite,1:nz_um,jts:jte) ! Height histograms of buildings
real hi_urb1D(nz_um) ! Height histograms of buildings
real ss_urb(nz_um,nurbm) ! Probability that a building has an height equal to z
real pb_urb(nz_um) ! Probability that a building has an height greater or equal to z
real hb_u(nz_um) ! Bulding's heights
integer nz_urb(nurbm) ! Number of layer in the urban grid
integer nzurban(nurbm)
! Building parameters
real alag_u(nurbm) ! Ground thermal diffusivity [m^2 s^-1]
real alaw_u(nurbm) ! Wall thermal diffusivity [m^2 s^-1]
real alar_u(nurbm) ! Roof thermal diffusivity [m^2 s^-1]
real csg_u(nurbm) ! Specific heat of the ground material [J m^3 K^-1]
real csw_u(nurbm) ! Specific heat of the wall material [J m^3 K^-1]
real csr_u(nurbm) ! Specific heat of the roof material [J m^3 K^-1]
real twini_u(nurbm) ! Initial temperature inside the building's wall [K]
real trini_u(nurbm) ! Initial temperature inside the building's roof [K]
real tgini_u(nurbm) ! Initial road temperature
!
! Building materials
!
real csg(ng_u) ! Specific heat of the ground material [J m^3 K^-1]
real csw(nwr_u) ! Specific heat of the wall material for the current urban class [J m^3 K^-1]
real csr(nwr_u) ! Specific heat of the roof material for the current urban class [J m^3 K^-1]
real csgb(ngb_u) ! Specific heat of the ground material below the buildings at each ground levels[J m^3 K^-1]
real csf(nf_u) ! Specific heat of the floors materials in the buildings at each levels[J m^3 K^-1]
real alar(nwr_u+1) ! Roof thermal diffusivity for the current urban class [W/m K]
real alaw(nwr_u+1) ! Walls thermal diffusivity for the current urban class [W/m K]
real alag(ng_u) ! Ground thermal diffusivity for the current urban class [m^2 s^-1]
real alagb(ngb_u+1) ! Ground thermal diffusivity below the building at each wall layer [W/m K]
real alaf(nf_u+1) ! Floor thermal diffusivity at each wall layers [W/m K]
real dzr(nwr_u) ! Layer sizes in the roofs [m]
real dzf(nf_u) ! Layer sizes in the floors[m]
real dzw(nwr_u) ! Layer sizes in the walls [m]
real dzgb(ngb_u) ! Layer sizes in the ground below the buildings [m]
!
!New street and radiation parameters
!
real bs(ndm) ! Building width for the current urban class
real ws(ndm) ! Street widths of the current urban class
real strd(ndm) ! Street lengths for the current urban class
real drst(ndm) ! street directions for the current urban class
real ss(nz_um) ! Probability to have a building with height h
real pb(nz_um) ! Probability to have a building with an height equal
!
!New roughness and buildings parameters
!
real z0(ndm,nz_um) ! Roughness lengths "profiles"
real bs_urb(ndm,nurbm) ! Building width
real ws_urb(ndm,nurbm) ! Street width
!
! for twini_u, and trini_u the initial value at the deepest level is kept constant during the simulation
!
! Radiation paramters
real albg_u(nurbm) ! Albedo of the ground
real albw_u(nurbm) ! Albedo of the wall
real albr_u(nurbm) ! Albedo of the roof
real albwin_u(nurbm) ! Albedo of the windows
real emwind_u(nurbm) ! Emissivity of windows
real emg_u(nurbm) ! Emissivity of ground
real emw_u(nurbm) ! Emissivity of wall
real emr_u(nurbm) ! Emissivity of roof
! fww_u,fwg_u,fgw_u,fsw_u,fsg_u are the view factors used to compute the long wave
! and the short wave radiation.
real fww_u(nz_um,nz_um,ndm,nurbm) ! from wall to wall
real fwg_u(nz_um,ndm,nurbm) ! from wall to ground
real fgw_u(nz_um,ndm,nurbm) ! from ground to wall
real fsw_u(nz_um,ndm,nurbm) ! from sky to wall
real fws_u(nz_um,ndm,nurbm) ! from sky to wall
real fsg_u(ndm,nurbm) ! from sky to ground
! Roughness parameters
real z0g_u(nurbm) ! The ground's roughness length
real z0r_u(nurbm) ! The roof's roughness length
! Street parameters
integer nd_u(nurbm) ! Number of street direction for each urban class
real strd_u(ndm,nurbm) ! Street length (fix to greater value to the horizontal length of the cells)
real drst_u(ndm,nurbm) ! Street direction
real ws_u(ndm,nurbm) ! Street width
real bs_u(ndm,nurbm) ! Building width
real h_b(nz_um,nurbm) ! Bulding's heights
real d_b(nz_um,nurbm) ! Probability that a building has an height h_b
real ss_u(nz_um,nurbm) ! Probability that a building has an height equal to z
real pb_u(nz_um,nurbm) ! Probability that a building has an height greater or equal to z
! Grid parameters
integer nz_u(nurbm) ! Number of layer in the urban grid
real z_u(nz_um) ! Height of the urban grid levels
!FS
real cop_u(nurbm)
real pwin_u(nurbm)
real beta_u(nurbm)
integer sw_cond_u(nurbm)
real time_on_u(nurbm)
real time_off_u(nurbm)
real targtemp_u(nurbm)
real gaptemp_u(nurbm)
real targhum_u(nurbm)
real gaphum_u(nurbm)
real perflo_u(nurbm)
real hsesf_u(nurbm)
real hsequip(24)
! 1D array used for the input and output of the routine "urban"
real z1D(kms:kme) ! vertical coordinates
real ua1D(kms:kme) ! wind speed in the x directions
real va1D(kms:kme) ! wind speed in the y directions
real pt1D(kms:kme) ! potential temperature
real da1D(kms:kme) ! air density
real pr1D(kms:kme) ! air pressure
real pt01D(kms:kme) ! reference potential temperature
real zr1D ! zenith angle
real deltar1D ! declination of the sun
real ah1D ! hour angle (it should come from the radiation routine)
real rs1D ! solar radiation
real rld1D ! downward flux of the longwave radiation
real tw1D(2*ndm,nz_um,nwr_u,nbui_max) ! temperature in each layer of the wall
real tg1D(ndm,ng_u) ! temperature in each layer of the ground
real tr1D(ndm,nz_um,nwr_u) ! temperature in each layer of the roof
!
!New variable for BEM
!
real tlev1D(nz_um,nbui_max) ! temperature in each floor and in each different type of building
real qlev1D(nz_um,nbui_max) ! specific humidity in each floor and in each different type of building
real twlev1D(2*ndm,nz_um,nbui_max) ! temperature in each window in each floor in each different type of building
real tglev1D(ndm,ngb_u,nbui_max) ! temperature in each layer of the ground below of a type of building
real tflev1D(ndm,nf_u,nz_um-1,nbui_max)! temperature in each layer of the floors in each building
real lflev1D(nz_um,nz_um) ! latent heat flux due to the air conditioning systems
real sflev1D(nz_um,nz_um) ! sensible heat flux due to the air conditioning systems
real lfvlev1D(nz_um,nz_um) ! latent heat flux due to ventilation
real sfvlev1D(nz_um,nz_um) ! sensible heat flux due to ventilation
real sfwin1D(2*ndm,nz_um,nbui_max) ! sensible heat flux from windows
real consumlev1D(nz_um,nz_um) ! consumption due to the air conditioning systems
real qv1D(kms:kme) ! specific humidity
real meso_urb ! constant to link meso and urban scales [m-2]
real d_urb(nz_um)
real sf_ac
integer ibui,nbui
integer nlev(nz_um)
!
!End new variables
!
real sfw1D(2*ndm,nz_um,nbui_max) ! sensible heat flux from walls
real sfg1D(ndm) ! sensible heat flux from ground (road)
real sfr1D(ndm,nz_um) ! sensible heat flux from roofs
real sf1D(kms:kme) ! surface of the urban grid cells
real vl1D(kms:kme) ! volume of the urban grid cells
real a_u1D(kms:kme) ! Implicit component of the momentum sources or sinks in the X-direction
real a_v1D(kms:kme) ! Implicit component of the momentum sources or sinks in the Y-direction
real a_t1D(kms:kme) ! Implicit component of the heat sources or sinks
real a_e1D(kms:kme) ! Implicit component of the TKE sources or sinks
real b_u1D(kms:kme) ! Explicit component of the momentum sources or sinks in the X-direction
real b_v1D(kms:kme) ! Explicit component of the momentum sources or sinks in the Y-direction
real b_t1D(kms:kme) ! Explicit component of the heat sources or sinks
real b_ac1D(kms:kme)
real b_e1D(kms:kme) ! Explicit component of the TKE sources or sinks
real b_q1D(kms:kme) ! Explicit component of the Humidity sources or sinks
real dlg1D(kms:kme) ! Height above ground (L_ground in formula (24) of the BLM paper).
real dl_u1D(kms:kme) ! Length scale (lb in formula (22) ofthe BLM paper)
real time_bep
! arrays used to collapse indexes
integer ind_zwd(nbui_max,nz_um,nwr_u,ndm)
integer ind_gd(ng_u,ndm)
integer ind_zd(nbui_max,nz_um,ndm)
integer ind_zdf(nz_um,ndm)
integer ind_zrd(nz_um,nwr_u,ndm)
!
integer ind_bd(nbui_max,nz_um)
integer ind_wd(nbui_max,nz_um,ndm)
integer ind_gbd(nbui_max,ngb_u,ndm)
integer ind_fbd(nbui_max,nf_u,nz_um-1,ndm)
!
integer ix,iy,iz,iurb,id,iz_u,iw,ig,ir,ix1,iy1,k
integer it, nint
integer iii
logical first
character(len=80) :: text
data first/.true./
save first,time_bep
save alag_u,alaw_u,alar_u,csg_u,csw_u,csr_u, &
albg_u,albw_u,albr_u,emg_u,emw_u,emr_u, &
z0g_u,z0r_u, nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b,ss_u,pb_u, &
nz_u,z_u,albwin_u,emwind_u,cop_u,pwin_u,beta_u,sw_cond_u, &
time_on_u,time_off_u,targtemp_u,gaptemp_u,targhum_u,gaphum_u, &
perflo_u,hsesf_u,hsequip
!------------------------------------------------------------------------
! Calculation of the momentum, heat and turbulent kinetic fluxes
! produced by buildings
!
! References:
! Martilli, A., Clappier, A., Rotach, M.W.:2002, 'AN URBAN SURFACE EXCHANGE
! PARAMETERISATION FOR MESOSCALE MODELS', Boundary-Layer Meteorolgy 104:
! 261-304
!
! F. Salamanca and A. Martilli, 2009: 'A new Building Energy Model coupled
! with an Urban Canopy Parameterization for urban climate simulations—part II.
! Validation with one dimension off-line simulations'. Theor Appl Climatol
! DOI 10.1007/s00704-009-0143-8
!------------------------------------------------------------------------
!
!prepare the arrays to collapse indexes
if(num_urban_layers.lt.nbui_max*nz_um*ndm*max(nwr_u,ng_u))then
write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*nz_um*ndm*max(nwr_u,ng_u)
stop
endif
!
!New conditions for BEM
!
if(num_urban_layers.lt.nbui_max*nz_um)then !limit for indoor temperature and indoor humidity
write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*nz_um
stop
endif
if(num_urban_layers.lt.nbui_max*nz_um*ndm)then !limit for window temperature
write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*nz_um*ndm
stop
endif
if(num_urban_layers.lt.nbui_max*ndm*ngb_u)then !limit for ground temperature below a building
write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*ndm*ngb_u
stop
endif
if(num_urban_layers.lt.(nz_um-1)*nbui_max*ndm*nf_u)then !limit for floor temperature
write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*ndm*nf_u*(nz_um-1),num_urban_layers
stop
endif
if (ndm.ne.2)then
write(*,*) 'number of directions is not correct',ndm
stop
endif
!
!End of new conditions
!
!
!Initialize collapse indexes
!
ind_zwd=0
ind_gd=0
ind_zd=0
ind_zdf=0
ind_zrd=0
ind_bd=0
ind_wd=0
ind_gbd=0
ind_fbd=0
!
!End initialization indexes
!
iii=0
do ibui=1,nbui_max
do iz_u=1,nz_um
do iw=1,nwr_u
do id=1,ndm
iii=iii+1
ind_zwd(ibui,iz_u,iw,id)=iii
enddo
enddo
enddo
enddo
iii=0
do ig=1,ng_u
do id=1,ndm
iii=iii+1
ind_gd(ig,id)=iii
enddo
enddo
iii=0
do ibui=1,nbui_max
do iz_u=1,nz_um
do id=1,ndm
iii=iii+1
ind_zd(ibui,iz_u,id)=iii
enddo
enddo
enddo
iii=0
do iz_u=1,nz_um
do iw=1,nwr_u
do id=1,ndm
iii=iii+1
ind_zrd(iz_u,iw,id)=iii
enddo
enddo
enddo
!
!New indexes for BEM
!
iii=0
do iz_u=1,nz_um
do id=1,ndm
iii=iii+1
ind_zdf(iz_u,id)=iii
enddo ! id
enddo ! iz_u
iii=0
do ibui=1,nbui_max !Type of building
do iz_u=1,nz_um !vertical levels
iii=iii+1
ind_bd(ibui,iz_u)=iii
enddo !iz_u
enddo !ibui
iii=0
do ibui=1,nbui_max !type of building
do iz_u=1,nz_um !vertical levels
do id=1,ndm !direction
iii=iii+1
ind_wd(ibui,iz_u,id)=iii
enddo !id
enddo !iz_u
enddo !ibui
iii=0
do ibui=1,nbui_max!type of building
do iw=1,ngb_u !layers in the wall (ground below a building)
do id=1,ndm !direction
iii=iii+1
ind_gbd(ibui,iw,id)=iii
enddo !id
enddo !iw
enddo !ibui
iii=0
do ibui=1,nbui_max !type of building
do iw=1,nf_u !layers in the wall (floor)
do iz_u=1,nz_um-1 !vertical levels
do id=1,ndm !direction
iii=iii+1
ind_fbd(ibui,iw,iz_u,id)=iii
enddo !id
enddo !iz_u
enddo !iw
enddo !ibui
!
!End of new indexes
!
if (num_urban_hi.ge.nz_um)then
write(*,*)'nz_um too small, please increase to at least ', num_urban_hi+1
stop
endif
do ix=its,ite
do iy=jts,jte
do iz_u=1,nz_um
hi_urb(ix,iz_u,iy)=0.
enddo
enddo
enddo
do ix=its,ite
do iy=jts,jte
z(ix,kts,iy)=0.
do iz=kts+1,kte+1
z(ix,iz,iy)=z(ix,iz-1,iy)+dz8w(ix,iz-1,iy)
enddo
iii=0
do iz_u=1,num_urban_hi
hi_urb(ix,iz_u,iy)= hi_urb2d(ix,iz_u,iy)
if (hi_urb(ix,iz_u,iy)/=0.) then
iii=iii+1
endif
enddo !iz_u
if (iii.gt.nbui_max) then
write(*,*) 'nbui_max too small, please increase to at least ',iii
stop
endif
enddo
enddo
if (first) then ! True only on first call
call init_para
(alag_u,alaw_u,alar_u,csg_u,csw_u,csr_u,&
twini_u,trini_u,tgini_u,albg_u,albw_u,albr_u,albwin_u,emg_u,emw_u,&
emr_u,emwind_u,z0g_u,z0r_u,nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b, &
cop_u,pwin_u,beta_u,sw_cond_u,time_on_u,time_off_u,targtemp_u, &
gaptemp_u,targhum_u,gaphum_u,perflo_u,hsesf_u,hsequip)
!Initialisation of the urban parameters and calculation of the view factor
call icBEP
(nd_u,h_b,d_b,ss_u,pb_u,nz_u,z_u)
first=.false.
endif ! first
do ix=its,ite
do iy=jts,jte
if (FRC_URB2D(ix,iy).gt.0.) then ! Calling BEP only for existing urban classes.
iurb=UTYPE_URB2D(ix,iy)
hi_urb1D=0.
do iz_u=1,nz_um
hi_urb1D(iz_u)=hi_urb(ix,iz_u,iy)
enddo
call icBEPHI_XY
(iurb,hb_u,hi_urb1D,ss_urb,pb_urb, &
nz_urb(iurb),z_u)
call param
(iurb,nz_u(iurb),nz_urb(iurb),nzurban(iurb), &
nd_u(iurb),csg_u,csg,alag_u,alag,csr_u,csr, &
alar_u,alar,csw_u,csw,alaw_u,alaw, &
ws_u,ws_urb,ws,bs_u,bs_urb,bs,z0g_u,z0r_u,z0, &
strd_u,strd,drst_u,drst,ss_u,ss_urb,ss,pb_u, &
pb_urb,pb,dzw,dzr,dzf,csf,alaf,dzgb,csgb,alagb, &
lp_urb2d(ix,iy),lb_urb2d(ix,iy), &
hgt_urb2d(ix,iy),FRC_URB2D(ix,iy))
!
!We compute the view factors in the icBEP_XY routine
!
call icBEP_XY
(iurb,fww_u,fwg_u,fgw_u,fsw_u,fws_u,fsg_u, &
nd_u(iurb),strd,ws,nzurban(iurb),z_u)
ibui=0
nlev=0
nbui=0
d_urb=0.
do iz=1,nz_um
if(ss_urb(iz,iurb).gt.0) then
ibui=ibui+1
nlev(ibui)=iz-1
d_urb(ibui)=ss_urb(iz,iurb)
nbui=ibui
endif
end do !iz
if (nbui.gt.nbui_max) then
write (*,*) 'nbui_max must be increased to',nbui
stop
endif
do iz= kts,kte
ua1D(iz)=u_phy(ix,iz,iy)
va1D(iz)=v_phy(ix,iz,iy)
pt1D(iz)=th_phy(ix,iz,iy)
da1D(iz)=rho(ix,iz,iy)
pr1D(iz)=p_phy(ix,iz,iy)
!! pt01D(iz)=th_phy(ix,iz,iy)
pt01D(iz)=300.
z1D(iz)=z(ix,iz,iy)
qv1D(iz)=qv_phy(ix,iz,iy)
a_u1D(iz)=0.
a_v1D(iz)=0.
a_t1D(iz)=0.
a_e1D(iz)=0.
b_u1D(iz)=0.
b_v1D(iz)=0.
b_t1D(iz)=0.
b_ac1D(iz)=0.
b_e1D(iz)=0.
enddo
z1D(kte+1)=z(ix,kte+1,iy)
do id=1,ndm
do iz_u=1,nz_um
do iw=1,nwr_u
do ibui=1,nbui_max
!! tw1D(2*id-1,iz_u,iw)=tw1_u(ix,iy,ind_zwd(iz_u,iw,id))
!! tw1D(2*id,iz_u,iw)=tw2_u(ix,iy,ind_zwd(iz_u,iw,id))
tw1D(2*id-1,iz_u,iw,ibui)=tw1_urb4d(ix,ind_zwd(ibui,iz_u,iw,id),iy)
tw1D(2*id,iz_u,iw,ibui)=tw2_urb4d(ix,ind_zwd(ibui,iz_u,iw,id),iy)
enddo
enddo
enddo
enddo
do id=1,ndm
do ig=1,ng_u
!! tg1D(id,ig)=tg_u(ix,iy,ind_gd(ig,id))
tg1D(id,ig)=tgb_urb4d(ix,ind_gd(ig,id),iy)
enddo
do iz_u=1,nz_um
do ir=1,nwr_u
!! tr1D(id,iz_u,ir)=tr_u(ix,iy,ind_zwd(iz_u,ir,id))
tr1D(id,iz_u,ir)=trb_urb4d(ix,ind_zrd(iz_u,ir,id),iy)
enddo
enddo
enddo
!
!Initialize variables for BEM
!
tlev1D=0. !Indoor temperature
qlev1D=0. !Indoor humidity
twlev1D=0. !Window temperature
tglev1D=0. !Ground temperature
tflev1D=0. !Floor temperature
sflev1D=0. !Sensible heat flux from the a.c.
lflev1D=0. !latent heat flux from the a.c.
consumlev1D=0.!consumption of the a.c.
sfvlev1D=0. !Sensible heat flux from natural ventilation
lfvlev1D=0. !Latent heat flux from natural ventilation
sfwin1D=0. !Sensible heat flux from windows
sfw1D=0. !Sensible heat flux from walls
do iz_u=1,nz_um !vertical levels
do ibui=1,nbui_max !Type of building
tlev1D(iz_u,ibui)= tlev_urb3d(ix,ind_bd(ibui,iz_u),iy)
qlev1D(iz_u,ibui)= qlev_urb3d(ix,ind_bd(ibui,iz_u),iy)
enddo !ibui
enddo !iz_u
do id=1,ndm !direction
do iz_u=1,nz_um !vertical levels
do ibui=1,nbui_max !type of building
twlev1D(2*id-1,iz_u,ibui)=tw1lev_urb3d(ix,ind_wd(ibui,iz_u,id),iy)
twlev1D(2*id,iz_u,ibui)=tw2lev_urb3d(ix,ind_wd(ibui,iz_u,id),iy)
sfwin1D(2*id-1,iz_u,ibui)=sfwin1_urb3d(ix,ind_wd(ibui,iz_u,id),iy)
sfwin1D(2*id,iz_u,ibui)=sfwin2_urb3d(ix,ind_wd(ibui,iz_u,id),iy)
enddo !ibui
enddo !iz_u
enddo !id
do id=1,ndm !direction
do iw=1,ngb_u !layer in the wall
do ibui=1,nbui_max !type of building
tglev1D(id,iw,ibui)=tglev_urb3d(ix,ind_gbd(ibui,iw,id),iy)
enddo !ibui
enddo !iw
enddo !id
do id=1,ndm !direction
do iw=1,nf_u !layer in the walls
do iz_u=1,nz_um-1 !verticals levels
do ibui=1,nbui_max !type of building
tflev1D(id,iw,iz_u,ibui)=tflev_urb3d(ix,ind_fbd(ibui,iw,iz_u,id),iy)
enddo !ibui
enddo ! iz_u
enddo !iw
enddo !id
!
!End initialization for BEM
!
do id=1,ndm
do iz=1,nz_um
do ibui=1,nbui_max !type of building
!! sfw1D(2*id-1,iz)=sfw1(ix,iy,ind_zd(iz,id))
!! sfw1D(2*id,iz)=sfw2(ix,iy,ind_zd(iz,id))
sfw1D(2*id-1,iz,ibui)=sfw1_urb3d(ix,ind_zd(ibui,iz,id),iy)
sfw1D(2*id,iz,ibui)=sfw2_urb3d(ix,ind_zd(ibui,iz,id),iy)
enddo
enddo
enddo
do id=1,ndm
!! sfg1D(id)=sfg(ix,iy,id)
sfg1D(id)=sfg_urb3d(ix,id,iy)
enddo
do id=1,ndm
do iz=1,nz_um
!! sfr1D(id,iz)=sfr(ix,iy,ind_zd(iz,id))
sfr1D(id,iz)=sfr_urb3d(ix,ind_zdf(iz,id),iy)
enddo
enddo
rs1D=swdown(ix,iy)
rld1D=glw(ix,iy)
zr1D=acos(COSZ_URB2D(ix,iy))
deltar1D=DECLIN_URB
ah1D=OMG_URB2D(ix,iy)
call BEP1D
(iurb,kms,kme,kts,kte,z1D,dt,ua1D,va1D,pt1D,da1D,pr1D,pt01D, &
zr1D,deltar1D,ah1D,rs1D,rld1D,alagb, &
alag,alaw,alar,alaf,csgb,csg,csw,csr,csf, &
dzr,dzf,dzw,dzgb, &
albg_u(iurb),albw_u(iurb),albr_u(iurb), &
albwin_u(iurb),emg_u(iurb),emw_u(iurb), &
emr_u(iurb),emwind_u(iurb),fww_u,fwg_u, &
fgw_u,fsw_u,fws_u,fsg_u,z0, &
nd_u(iurb),strd,drst,ws,bs_urb,bs,ss,pb, &
nzurban(iurb),z_u,cop_u,pwin_u,beta_u, &
sw_cond_u,time_on_u,time_off_u,targtemp_u, &
gaptemp_u,targhum_u,gaphum_u,perflo_u, &
hsesf_u,hsequip, &
tw1D,tg1D,tr1D,sfw1D,sfg1D,sfr1D, &
a_u1D,a_v1D,a_t1D,a_e1D, &
b_u1D,b_v1D,b_t1D,b_ac1D,b_e1D,b_q1D, &
dlg1D,dl_u1D,sf1D,vl1D,rl_up(ix,iy), &
rs_abs(ix,iy),emiss(ix,iy),grdflx_urb(ix,iy), &
qv1D,tlev1D,qlev1D,sflev1D,lflev1D,consumlev1D, &
sfvlev1D,lfvlev1D,twlev1D,tglev1D,tflev1D,sfwin1D,&
ix,iy)
do ibui=1,nbui_max !type of building
do iz=1,nz_um !vertical levels
do id=1,ndm ! direction
sfw1_urb3d(ix,ind_zd(ibui,iz,id),iy)=sfw1D(2*id-1,iz,ibui)
sfw2_urb3d(ix,ind_zd(ibui,iz,id),iy)=sfw1D(2*id,iz,ibui)
enddo
enddo
enddo
do id=1,ndm
sfg_urb3d(ix,id,iy)=sfg1D(id)
enddo
do id=1,ndm
do iz=1,nz_um
sfr_urb3d(ix,ind_zdf(iz,id),iy)=sfr1D(id,iz)
enddo
enddo
do ibui=1,nbui_max
do iz_u=1,nz_um
do iw=1,nwr_u
do id=1,ndm
tw1_urb4d(ix,ind_zwd(ibui,iz_u,iw,id),iy)=tw1D(2*id-1,iz_u,iw,ibui)
tw2_urb4d(ix,ind_zwd(ibui,iz_u,iw,id),iy)=tw1D(2*id,iz_u,iw,ibui)
enddo
enddo
enddo
enddo
do id=1,ndm
do ig=1,ng_u
tgb_urb4d(ix,ind_gd(ig,id),iy)=tg1D(id,ig)
enddo
do iz_u=1,nz_um
do ir=1,nwr_u
trb_urb4d(ix,ind_zrd(iz_u,ir,id),iy)=tr1D(id,iz_u,ir)
enddo
enddo
enddo
!
!Outputs of BEM
!
do ibui=1,nbui_max !type of building
do iz_u=1,nz_um !vertical levels
tlev_urb3d(ix,ind_bd(ibui,iz_u),iy)=tlev1D(iz_u,ibui)
qlev_urb3d(ix,ind_bd(ibui,iz_u),iy)=qlev1D(iz_u,ibui)
enddo !iz_u
enddo !ibui
do ibui=1,nbui_max !type of building
do iz_u=1,nz_um !vertical levels
do id=1,ndm !direction
tw1lev_urb3d(ix,ind_wd(ibui,iz_u,id),iy)=twlev1D(2*id-1,iz_u,ibui)
tw2lev_urb3d(ix,ind_wd(ibui,iz_u,id),iy)=twlev1D(2*id,iz_u,ibui)
sfwin1_urb3d(ix,ind_wd(ibui,iz_u,id),iy)=sfwin1D(2*id-1,iz_u,ibui)
sfwin2_urb3d(ix,ind_wd(ibui,iz_u,id),iy)=sfwin1D(2*id,iz_u,ibui)
enddo !id
enddo !iz_u
enddo !ibui
do ibui=1,nbui_max !type of building
do iw=1,ngb_u !layers in the walls
do id=1,ndm !direction
tglev_urb3d(ix,ind_gbd(ibui,iw,id),iy)=tglev1D(id,iw,ibui)
enddo !id
enddo !iw
enddo !ibui
do ibui=1,nbui_max !type of building
do iw=1,nf_u !layer in the walls
do iz_u=1,nz_um-1 !verticals levels
do id=1,ndm !direction
tflev_urb3d(ix,ind_fbd(ibui,iw,iz_u,id),iy)=tflev1D(id,iw,iz_u,ibui)
enddo !id
enddo !iz_u
enddo !iw
enddo !ibui
sf_ac_urb3d(ix,iy)=0.
lf_ac_urb3d(ix,iy)=0.
cm_ac_urb3d(ix,iy)=0.
sfvent_urb3d(ix,iy)=0.
lfvent_urb3d(ix,iy)=0.
meso_urb=(1./4.)*FRC_URB2D(ix,iy)/((bs_urb(1,iurb)+ws_urb(1,iurb))*bs_urb(2,iurb))+ &
(1./4.)*FRC_URB2D(ix,iy)/((bs_urb(2,iurb)+ws_urb(2,iurb))*bs_urb(1,iurb))
ibui=0
nlev=0
nbui=0
d_urb=0.
do iz=1,nz_um
if(ss_urb(iz,iurb).gt.0) then
ibui=ibui+1
nlev(ibui)=iz-1
d_urb(ibui)=ss_urb(iz,iurb)
nbui=ibui
endif
end do !iz
do ibui=1,nbui !type of building
do iz_u=1,nlev(ibui) !vertical levels
sf_ac_urb3d(ix,iy)=sf_ac_urb3d(ix,iy)+meso_urb*d_urb(ibui)*sflev1D(iz_u,ibui)
lf_ac_urb3d(ix,iy)=lf_ac_urb3d(ix,iy)+meso_urb*d_urb(ibui)*lflev1D(iz_u,ibui)
cm_ac_urb3d(ix,iy)=cm_ac_urb3d(ix,iy)+meso_urb*d_urb(ibui)*consumlev1D(iz_u,ibui)
sfvent_urb3d(ix,iy)=sfvent_urb3d(ix,iy)+meso_urb*d_urb(ibui)*sfvlev1D(iz_u,ibui)
lfvent_urb3d(ix,iy)=lfvent_urb3d(ix,iy)+meso_urb*d_urb(ibui)*lfvlev1D(iz_u,ibui)
enddo !iz_u
enddo !ibui
!
!Add the latent heat exchanged throughout the ventilation in the lf_ac_urb3d output variable.
!it is only a rint variable
!
! lf_ac_urb3d(ix,iy)=lf_ac_urb3d(ix,iy)+lfvent_urb3d(ix,iy)
!
lf_ac_urb3d(ix,iy)=lf_ac_urb3d(ix,iy)-lfvent_urb3d(ix,iy)
!
!End outputs of bem
!
sf_ac=0.
sf(ix,kts:kte,iy)=0.
vl(ix,kts:kte,iy)=0.
a_u(ix,kts:kte,iy)=0.
a_v(ix,kts:kte,iy)=0.
a_t(ix,kts:kte,iy)=0.
a_e(ix,kts:kte,iy)=0.
b_u(ix,kts:kte,iy)=0.
b_v(ix,kts:kte,iy)=0.
b_t(ix,kts:kte,iy)=0.
b_e(ix,kts:kte,iy)=0.
b_q(ix,kts:kte,iy)=0.
dlg(ix,kts:kte,iy)=0.
dl_u(ix,kts:kte,iy)=0.
do iz= kts,kte
sf(ix,iz,iy)=sf1D(iz)
vl(ix,iz,iy)=vl1D(iz)
a_u(ix,iz,iy)=a_u1D(iz)
a_v(ix,iz,iy)=a_v1D(iz)
a_t(ix,iz,iy)=a_t1D(iz)
a_e(ix,iz,iy)=a_e1D(iz)
b_u(ix,iz,iy)=b_u1D(iz)
b_v(ix,iz,iy)=b_v1D(iz)
b_t(ix,iz,iy)=b_t1D(iz)
sf_ac=sf_ac+b_ac1D(iz)*da1D(iz)*cp_u*dz8w(ix,iz,iy)*vl1D(iz)*FRC_URB2D(ix,iy)
b_e(ix,iz,iy)=b_e1D(iz)
b_q(ix,iz,iy)=b_q1D(iz)
dlg(ix,iz,iy)=dlg1D(iz)
dl_u(ix,iz,iy)=dl_u1D(iz)
enddo
sf(ix,kte+1,iy)=sf1D(kte+1)
endif ! FRC_URB2D
enddo ! iy
enddo ! ix
time_bep=time_bep+dt
print*, 'ss_urb', ss_urb
print*, 'pb_urb', pb_urb
print*, 'nz_urb', nz_urb
print*, 'd_urb', d_urb
return
end subroutine BEP_BEM
! ===6=8===============================================================72
subroutine BEP1D(iurb,kms,kme,kts,kte,z,dt,ua,va,pt,da,pr,pt0, & 2,27
zr,deltar,ah,rs,rld,alagb, &
alag,alaw,alar,alaf,csgb,csg,csw,csr,csf, &
dzr,dzf,dzw,dzgb, &
albg,albw,albr,albwin,emg,emw,emr, &
emwind,fww,fwg,fgw,fsw,fws,fsg,z0, &
ndu,strd,drst,ws,bs_u,bs,ss,pb, &
nzu,z_u,cop_u,pwin_u,beta_u,sw_cond_u, &
time_on_u,time_off_u,targtemp_u, &
gaptemp_u,targhum_u,gaphum_u,perflo_u, &
hsesf_u,hsequip, &
tw,tg,tr,sfw,sfg,sfr, &
a_u,a_v,a_t,a_e, &
b_u,b_v,b_t,b_ac,b_e,b_q, &
dlg,dl_u,sf,vl,rl_up,rs_abs,emiss,grdflx_urb, &
qv,tlev,qlev,sflev,lflev,consumlev, &
sfvlev,lfvlev,twlev,tglev,tflev,sfwin,ix,iy)
! ----------------------------------------------------------------------
! This routine computes the effects of buildings on momentum, heat and
! TKE (turbulent kinetic energy) sources or sinks and on the mixing length.
! It provides momentum, heat and TKE sources or sinks at different levels of a
! mesoscale grid defined by the altitude of its cell interfaces "z" and
! its number of levels "nz".
! The meteorological input parameters (wind, temperature, solar radiation)
! are specified on the "mesoscale grid".
! The inputs concerning the building and street charateristics are defined
! on a "urban grid". The "urban grid" is defined with its number of levels
! "nz_u" and its space step "dz_u".
! The input parameters are interpolated on the "urban grid". The sources or sinks
! are calculated on the "urban grid". Finally the sources or sinks are
! interpolated on the "mesoscale grid".
! Mesoscale grid Urban grid Mesoscale grid
!
! z(4) --- ---
! | |
! | |
! | Interpolation Interpolation |
! | Sources or sinks calculation |
! z(3) --- ---
! | ua ua_u --- uv_a a_u |
! | va va_u | uv_b b_u |
! | pt pt_u --- uh_b a_v |
! z(2) --- | etc... etc...---
! | z_u(1) --- |
! | | |
! z(1) ------------------------------------------------------------
!
! Reference:
! Martilli, A., Clappier, A., Rotach, M.W.:2002, 'AN URBAN SURFACE EXCHANGE
! PARAMETERISATION FOR MESOSCALE MODELS', Boundary-Layer Meteorolgy 104:
! 261-304
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
! Data relative to the "mesoscale grid"
!! integer nz ! Number of vertical levels
integer kms,kme,kts,kte
real z(kms:kme) ! Altitude above the ground of the cell interfaces.
real ua(kms:kme) ! Wind speed in the x direction
real va(kms:kme) ! Wind speed in the y direction
real pt(kms:kme) ! Potential temperature
real da(kms:kme) ! Air density
real pr(kms:kme) ! Air pressure
real pt0(kms:kme) ! Reference potential temperature (could be equal to "pt")
real qv(kms:kme) ! Specific humidity
real dt ! Time step
real zr ! Zenith angle
real deltar ! Declination of the sun
real ah ! Hour angle
real rs ! Solar radiation
real rld ! Downward flux of the longwave radiation
! Data relative to the "urban grid"
integer iurb ! Current urban class
! Radiation parameters
real albg ! Albedo of the ground
real albw ! Albedo of the wall
real albr ! Albedo of the roof
real albwin ! Albedo of the windows
real emwind ! Emissivity of windows
real emg ! Emissivity of ground
real emw ! Emissivity of wall
real emr ! Emissivity of roof
! fww,fwg,fgw,fsw,fsg are the view factors used to compute the long and
! short wave radation.
! The calculation of these factor is explained in the Appendix A of the BLM paper
real fww(nz_um,nz_um,ndm,nurbm) ! from wall to wall
real fwg(nz_um,ndm,nurbm) ! from wall to ground
real fgw(nz_um,ndm,nurbm) ! from ground to wall
real fsw(nz_um,ndm,nurbm) ! from sky to wall
real fws(nz_um,ndm,nurbm) ! from wall to sky
real fsg(ndm,nurbm) ! from sky to ground
! Street parameters
integer ndu ! Number of street direction for each urban class
real bs_u(ndm,nurbm) ! Building width
! Grid parameters
integer nzu ! Number of layer in the urban grid
real z_u(nz_um) ! Height of the urban grid levels
!FS
real cop_u(nurbm)
real pwin_u(nurbm)
real beta_u(nurbm)
integer sw_cond_u(nurbm)
real time_on_u(nurbm)
real time_off_u(nurbm)
real targtemp_u(nurbm)
real gaptemp_u(nurbm)
real targhum_u(nurbm)
real gaphum_u(nurbm)
real perflo_u(nurbm)
real hsesf_u(nurbm)
real hsequip(24)
! ----------------------------------------------------------------------
! INPUT-OUTPUT
! ----------------------------------------------------------------------
! Data relative to the "urban grid" which should be stored from the current time step to the next one
real tw(2*ndm,nz_um,nwr_u,nbui_max) ! Temperature in each layer of the wall [K]
real tr(ndm,nz_um,nwr_u) ! Temperature in each layer of the roof [K]
real tg(ndm,ng_u) ! Temperature in each layer of the ground [K]
real sfw(2*ndm,nz_um,nbui_max) ! Sensible heat flux from walls
real sfg(ndm) ! Sensible heat flux from ground (road)
real sfr(ndm,nz_um) ! Sensible heat flux from roofs
real gfg(ndm) ! Heat flux transferred from the surface of the ground (road) towards the interior
real gfr(ndm,nz_um) ! Heat flux transferred from the surface of the roof towards the interior
real gfw(2*ndm,nz_um,nbui_max) ! Heat flux transfered from the surface of the walls towards the interior
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
! Data relative to the "mesoscale grid"
real sf(kms:kme) ! Surface of the "mesoscale grid" cells taking into account the buildings
real vl(kms:kme) ! Volume of the "mesoscale grid" cells taking into account the buildings
! Implicit and explicit components of the source and sink terms at each levels,
! the fluxes can be computed as follow: FX = A*X + B example: Heat fluxes = a_t * pt + b_t
real a_u(kms:kme) ! Implicit component of the momentum sources or sinks in the X-direction
real a_v(kms:kme) ! Implicit component of the momentum sources or sinks in the Y-direction
real a_t(kms:kme) ! Implicit component of the heat sources or sinks
real a_e(kms:kme) ! Implicit component of the TKE sources or sinks
real b_u(kms:kme) ! Explicit component of the momentum sources or sinks in the X-direction
real b_v(kms:kme) ! Explicit component of the momentum sources or sinks in the Y-direction
real b_t(kms:kme) ! Explicit component of the heat sources or sinks
real b_ac(kms:kme)
real b_e(kms:kme) ! Explicit component of the TKE sources or sinks
real b_q(kms:kme) ! Explicit component of the humidity sources or sinks
real dlg(kms:kme) ! Height above ground (L_ground in formula (24) of the BLM paper).
real dl_u(kms:kme) ! Length scale (lb in formula (22) ofthe BLM paper).
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
real dz(kms:kme) ! vertical space steps of the "mesoscale grid"
! Data interpolated from the "mesoscale grid" to the "urban grid"
real ua_u(nz_um) ! Wind speed in the x direction
real va_u(nz_um) ! Wind speed in the y direction
real pt_u(nz_um) ! Potential temperature
real da_u(nz_um) ! Air density
real pt0_u(nz_um) ! Reference potential temperature
real pr_u(nz_um) ! Air pressure
real qv_u(nz_um) !Specific humidity
! Data defining the building and street charateristics
real alag(ng_u) ! Ground thermal diffusivity for the current urban class [m^2 s^-1]
real csg(ng_u) ! Specific heat of the ground material of the current urban class [J m^3 K^-1]
real csr(nwr_u) ! Specific heat of the roof material for the current urban class [J m^3 K^-1]
real csw(nwr_u) ! Specific heat of the wall material for the current urban class [J m^3 K^-1]
real z0(ndm,nz_um) ! Roughness lengths "profiles"
real ws(ndm) ! Street widths of the current urban class
real bs(ndm) ! Building widths of the current urban class
real strd(ndm) ! Street lengths for the current urban class
real drst(ndm) ! Street directions for the current urban class
real ss(nz_um) ! Probability to have a building with height h
real pb(nz_um) ! Probability to have a building with an height equal
! Solar radiation at each level of the "urban grid"
real rsg(ndm) ! Short wave radiation from the ground
real rsw(2*ndm,nz_um) ! Short wave radiation from the walls
real rlg(ndm) ! Long wave radiation from the ground
real rlw(2*ndm,nz_um) ! Long wave radiation from the walls
! Potential temperature of the surfaces at each level of the "urban grid"
real ptg(ndm) ! Ground potential temperatures
real ptr(ndm,nz_um) ! Roof potential temperatures
real ptw(2*ndm,nz_um,nbui_max) ! Walls potential temperatures
! Explicit and implicit component of the momentum, temperature and TKE sources or sinks on
! vertical surfaces (walls) ans horizontal surfaces (roofs and street)
! The fluxes can be computed as follow: Fluxes of X = A*X + B
! Example: Momentum fluxes on vertical surfaces = uva_u * ua_u + uvb_u
real uhb_u(ndm,nz_um) ! U (wind component) Horizontal surfaces, B (explicit) term
real uva_u(2*ndm,nz_um) ! U (wind component) Vertical surfaces, A (implicit) term
real uvb_u(2*ndm,nz_um) ! U (wind component) Vertical surfaces, B (explicit) term
real vhb_u(ndm,nz_um) ! V (wind component) Horizontal surfaces, B (explicit) term
real vva_u(2*ndm,nz_um) ! V (wind component) Vertical surfaces, A (implicit) term
real vvb_u(2*ndm,nz_um) ! V (wind component) Vertical surfaces, B (explicit) term
real thb_u(ndm,nz_um) ! Temperature Horizontal surfaces, B (explicit) term
real tva_u(2*ndm,nz_um) ! Temperature Vertical surfaces, A (implicit) term
real tvb_u(2*ndm,nz_um) ! Temperature Vertical surfaces, B (explicit) term
real tvb_ac(2*ndm,nz_um)
real ehb_u(ndm,nz_um) ! Energy (TKE) Horizontal surfaces, B (explicit) term
real evb_u(2*ndm,nz_um) ! Energy (TKE) Vertical surfaces, B (explicit) term
real qhb_u(ndm,nz_um) ! Humidity Horizontal surfaces, B (explicit) term
real qvb_u(2*ndm,nz_um) ! Humidity Vertical surfaces, B (explicit) term
!
real rs_abs ! solar radiation absorbed by urban surfaces
real rl_up ! longwave radiation emitted by urban surface to the atmosphere
real emiss ! mean emissivity of the urban surface
real grdflx_urb ! ground heat flux
real dt_int ! internal time step
integer nt_int ! number of internal time step
integer iz,id, it_int
integer iw,ix,iy
!---------------------------------------
!New variables uses in BEM
!----------------------------------------
real tmp_u(nz_um) !Air Temperature [K]
real dzw(nwr_u) !Layer sizes in the walls
real dzr(nwr_u) !Layer sizes in the roofs
real dzf(nf_u) !Layer sizes in the floors
real dzgb(ngb_u) !Layer sizes in the ground below the buildings
real csgb(ngb_u) !Specific heat of the ground material below the buildings
!of the current urban class at each ground levels[J m^3 K^-1]
real csf(nf_u) !Specific heat of the floors materials in the buildings
!of the current urban class at each levels[J m^3 K^-1]
real alar(nwr_u+1) ! Roof thermal diffusivity for the current urban class [W/m K]
real alaw(nwr_u+1) ! Walls thermal diffusivity for the current urban class [W/m K]
real alaf(nf_u+1) ! Floor thermal diffusivity at each wall layers [W/m K]
real alagb(ngb_u+1) ! Ground thermal diffusivity below the building at each wall layer [W/m K]
real sfrb(ndm,nbui_max) ! Sensible heat flux from roofs [W/m²]
real gfrb(ndm,nbui_max) ! Heat flux flowing inside the roofs [W/m²]
real sfwb1D(2*ndm,nz_um) !Sensible heat flux from the walls [W/m²]
real sfwin(2*ndm,nz_um,nbui_max)!Sensible heat flux from windows [W/m²]
real sfwinb1D(2*ndm,nz_um) !Sensible heat flux from windows [W/m²]
real gfwb1D(2*ndm,nz_um) !Heat flux flowing inside the walls [W/m²]
real qlev(nz_um,nbui_max) !specific humidity [kg/kg]
real qlevb1D(nz_um) !specific humidity [kg/kg]
real tlev(nz_um,nbui_max) !Indoor temperature [K]
real tlevb1D(nz_um) !Indoor temperature [K]
real twb1D(2*ndm,nwr_u,nz_um) !Wall temperature in BEM [K]
real twlev(2*ndm,nz_um,nbui_max) !Window temperature in BEM [K]
real twlevb1D(2*ndm,nz_um) !Window temperature in BEM [K]
real tglev(ndm,ngb_u,nbui_max) !Ground temperature below a building in BEM [K]
real tglevb1D(ngb_u) !Ground temperature below a building in BEM [K]
real tflev(ndm,nf_u,nz_um-1,nbui_max)!Floor temperature in BEM[K]
real tflevb1D(nf_u,nz_um-1) !Floor temperature in BEM[K]
real trb(ndm,nwr_u,nbui_max) !Roof temperature in BEM [K]
real trb1D(nwr_u) !Roof temperature in BEM [K]
real sflev(nz_um,nz_um) ! sensible heat flux due to the air conditioning systems [W]
real lflev(nz_um,nz_um) ! latent heat flux due to the air conditioning systems [W]
real consumlev(nz_um,nz_um) ! consumption due to the air conditioning systems [W]
real sflev1D(nz_um) ! sensible heat flux due to the air conditioning systems [W]
real lflev1D(nz_um) ! latent heat flux due to the air conditioning systems [W]
real consumlev1D(nz_um) ! consumption due to the air conditioning systems [W]
real sfvlev(nz_um,nz_um) ! sensible heat flux due to ventilation [W]
real lfvlev(nz_um,nz_um) ! latent heat flux due to ventilation [W]
real sfvlev1D(nz_um) ! sensible heat flux due to ventilation [W]
real lfvlev1D(nz_um) ! Latent heat flux due to ventilation [W]
real ptwin(2*ndm,nz_um,nbui_max) ! window potential temperature
real tw_av(2*ndm,nz_um) ! Averaged temperature of the wall surfaces
real twlev_av(2*ndm,nz_um) ! Averaged temperature of the windows
real sfw_av(2*ndm,nz_um) ! Averaged sensible heat from walls
real sfwind_av(2*ndm,nz_um) ! Averaged sensible heat from windows
integer nbui !Total number of different type of buildings in an urban class
integer nlev(nz_um) !Number of levels in each different type of buildings in an urban class
integer ibui,ily
real :: nhourday ! Number of hours from midnight, local time
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
! Fix some usefull parameters for the computation of the sources or sinks
!
!initialize the variables inside the param routine
!
do iz=kts,kte
dz(iz)=z(iz+1)-z(iz)
end do
! Interpolation on the "urban grid"
call interpol
(kms,kme,kts,kte,nzu,z,z_u,ua,ua_u)
call interpol
(kms,kme,kts,kte,nzu,z,z_u,va,va_u)
call interpol
(kms,kme,kts,kte,nzu,z,z_u,pt,pt_u)
call interpol
(kms,kme,kts,kte,nzu,z,z_u,pt0,pt0_u)
call interpol
(kms,kme,kts,kte,nzu,z,z_u,pr,pr_u)
call interpol
(kms,kme,kts,kte,nzu,z,z_u,da,da_u)
call interpol
(kms,kme,kts,kte,nzu,z,z_u,qv,qv_u)
! Compute the modification of the radiation due to the buildings
call averaging_temp
(tw,twlev,ss,pb,tw_av,twlev_av, &
sfw_av,sfwind_av,sfw,sfwin)
call modif_rad
(iurb,ndu,nzu,z_u,ws, &
drst,strd,ss,pb, &
tw_av,tg,twlev_av,albg,albw, &
emw,emg,pwin_u(iurb),albwin, &
emwind,fww,fwg,fgw,fsw,fsg, &
zr,deltar,ah, &
rs,rld,rsw,rsg,rlw,rlg)
! calculation of the urban albedo and the upward long wave radiation
call upward_rad
(ndu,nzu,ws,bs,sigma,pb,ss, &
tg,emg,albg,rlg,rsg,sfg, &
tw_av,emw,albw,rlw,rsw,sfw_av, &
tr,emr,albr,emwind, &
albwin,twlev_av,pwin_u(iurb),sfwind_av,rld,rs,sfr, &
rs_abs,rl_up,emiss,grdflx_urb)
! Compute the surface temperatures
call surf_temp
(ndu,pr_u,dt, &
rld,rsg,rlg, &
tg,alag,csg,emg,albg,ptg,sfg,gfg)
! Call the BEM (Building Energy Model) routine
do iz=1,nz_um !Compute the outdoor temperature
tmp_u(iz)=pt_u(iz)*(pr_u(iz)/p0)**(rcp_u)
end do
ibui=0
nlev=0
nbui=0
sfrb=0. !Sensible heat flux from roof
gfrb=0. !Heat flux flowing inside the roof
sfwb1D=0. !Sensible heat flux from walls
sfwinb1D=0. !Sensible heat flux from windows
gfwb1D=0. !Heat flux flowing inside the walls[W/m²]
twb1D=0. !Wall temperature
twlevb1D=0. !Window temperature
tglevb1D=0. !Ground temperature below a building
tflevb1D=0. !Floor temperature
trb=0. !Roof temperature
trb1D=0. !Roof temperature
qlevb1D=0. !Indoor humidity
tlevb1D=0. !indoor temperature
sflev1D=0. !Sensible heat flux from the a.c.
lflev1D=0. !Latent heat flux from the a.c.
consumlev1D=0.!Consumption from the a.c.
sfvlev1D=0. !Sensible heat flux from the natural ventilation
lfvlev1D=0. !Latent heat flux from natural ventilation
ptw=0. !Wall potential temperature
ptwin=0. !Window potential temperature
ptr=0. !Roof potential temperature
do iz=1,nz_um
if(ss(iz).gt.0) then
ibui=ibui+1
nlev(ibui)=iz-1
nbui=ibui
do id=1,ndm
sfrb(id,ibui)=sfr(id,iz)
do ily=1,nwr_u
trb(id,ily,ibui)=tr(id,iz,ily)
enddo
enddo
endif
end do !iz
!--------------------------------------------------------------------------------
!Loop over BEM -----------------------------------------------------------------
!--------------------------------------------------------------------------------
!--------------------------------------------------------------------------------
nhourday=ah/PI*180./15.+12.
if (nhourday >= 24) nhourday = nhourday - 24
if (nhourday < 0) nhourday = nhourday + 24
do ibui=1,nbui
do iz=1,nz_um
qlevb1D(iz)=qlev(iz,ibui)
tlevb1D(iz)=tlev(iz,ibui)
enddo
do id=1,ndm
do ily=1,nwr_u
trb1D(ily)=trb(id,ily,ibui)
enddo
do ily=1,ngb_u
tglevb1D(ily)=tglev(id,ily,ibui)
enddo
do ily=1,nf_u
do iz=1,nz_um-1
tflevb1D(ily,iz)=tflev(id,ily,iz,ibui)
enddo
enddo
do iz=1,nz_um
sfwinb1D(2*id-1,iz)=sfwin(2*id-1,iz,ibui)
sfwinb1D(2*id,iz)=sfwin(2*id,iz,ibui)
enddo
do iz=1,nz_um
do ily=1,nwr_u
twb1D(2*id-1,ily,iz)=tw(2*id-1,iz,ily,ibui)
twb1D(2*id,ily,iz)=tw(2*id,iz,ily,ibui)
enddo
sfwb1D(2*id-1,iz)=sfw(2*id-1,iz,ibui)
sfwb1D(2*id,iz)=sfw(2*id,iz,ibui)
twlevb1D(2*id-1,iz)=twlev(2*id-1,iz,ibui)
twlevb1D(2*id,iz)=twlev(2*id,iz,ibui)
enddo
enddo
!print*,'nz_um',nz_um
!print*,'nlev(ibui)',nlev(ibui)
!print*,'nhourday',nhourday
!print*,'dt',dt
!print*, 'bs_u(1,iurb)',bs_u(1,iurb)
!print*, 'bs_u(2,iurb)',bs_u(2,iurb)
!print*, 'dz_u',dz_u
!print*, 'nwr_u',nwr_u
!print*, 'nf_u',nf_u
!print*, 'nwr_u', nwr_u
!print*, 'ngb_u',ngb_u
!print*, 'sfwb1D',sfwb1D
!print*, 'gfwb1D',gfwb1D
!print*, 'sfwinb1D',sfwinb1D
!print*, 'sfrb(1,ibui)',sfrb(1,ibui)
!print*, 'gfrb(1,ibui)',gfrb(1,ibui)
!print*, 'latent',latent
!print*, 'sigma',sigma
!print*, 'albw_u(iurb)',albw
!print*, 'albwin_u(iurb)',albwin
!print*, 'albr_u(iurb)',albr
!print*, 'emr_u(iurb)',emr
!print*, 'emw_u(iurb)',emw
!print*, 'emwind_u(iurb)',emwind
!print*, 'rsw',rsw
!print*, 'rlw',rlw
!print*, 'r',r
!print*, 'cp_u',cp_u
!print*, 'da_u',da_u
!print*, 'tmp_u',tmp_u
!print*, 'qv_u',qv_u
!print*, 'pr_u',pr_u
!print*, 'rs',rs
!print*, 'rld',rld
!print*, 'dzw',dzw
!print*, 'csw',csw
!print*, 'alaw',alaw
!print*, 'pwin_u',pwin_u
!print*, 'cop_u(iurb)',cop_u(iurb)
!print*, 'beta_u(iurb)',beta_u(iurb)
!print*, 'sw_cond_u(iurb)',sw_cond_u(iurb)
!print*, 'time_on_u(iurb)',time_on_u(iurb)
!print*, 'time_off_u(iurb)',time_off_u(iurb)
!print*, 'targtemp_u(iurb)',targtemp_u(iurb)
!print*, 'gaptemp_u(iurb)',gaptemp_u(iurb)
!print*, 'targhum_u(iurb)',targhum_u(iurb)
!print*, 'gaphum_u(iurb)',gaphum_u(iurb)
!print*, 'perflo_u(iurb)',perflo_u(iurb)
!print*, 'hsesf_u(iurb)',hsesf_u(iurb)
!print*, 'hsequip',hsequip
!print*, 'dzf',dzf
!print*, 'csf',csf
!print*, 'alaf',alaf
!print*, 'dzgb',dzgb
!print*, 'csgb',csgb
!print*, 'alagb',alagb
!print*, 'dzr',dzr
!print*, 'csr',csr
!print*, 'alar',alar
!print*, 'tlevb1D',tlevb1D
!print*, 'qlevb1D',qlevb1D
!print*, 'twb1D',twb1D
!print*, 'twlevb1D',twlevb1D
!print*, 'tflevb1D',tflevb1D
!print*, 'tglevb1D',tglevb1D
!print*, 'trb1D',trb1D
!print*, 'sflev1D',sflev1D
!print*, 'lflev1D',lflev1D
!print*, 'consumlev1D',consumlev1D
!print*, 'sfvlev1D',sfvlev1D
!print*, 'lfvlev1D',lfvlev1D
call BEM
(nz_um,nlev(ibui),nhourday,dt,bs_u(1,iurb), &
bs_u(2,iurb),dz_u,nwr_u,nf_u,nwr_u,ngb_u,sfwb1D,gfwb1D, &
sfwinb1D,sfrb(1,ibui),gfrb(1,ibui), &
latent,sigma,albw,albwin,albr, &
emr,emw,emwind,rsw,rlw,r,cp_u, &
da_u,tmp_u,qv_u,pr_u,rs,rld,dzw,csw,alaw,pwin_u(iurb), &
cop_u(iurb),beta_u(iurb),sw_cond_u(iurb),time_on_u(iurb), &
time_off_u(iurb),targtemp_u(iurb),gaptemp_u(iurb), &
targhum_u(iurb),gaphum_u(iurb),perflo_u(iurb), &
hsesf_u(iurb),hsequip, &
dzf,csf,alaf,dzgb,csgb,alagb,dzr,csr, &
alar,tlevb1D,qlevb1D,twb1D,twlevb1D,tflevb1D,tglevb1D, &
trb1D,sflev1D,lflev1D,consumlev1D,sfvlev1D,lfvlev1D)
!print*,'nz_um A',nz_um
!print*,'nlev(ibui) A',nlev(ibui)
!print*,'nhourday A',nhourday
!print*,'dt A',dt
!print*, 'bs_u(1,iurb) A',bs_u(1,iurb)
!print*, 'bs_u(2,iurb) A',bs_u(2,iurb)
!print*, 'dz_u A',dz_u
!print*, 'nwr_u A',nwr_u
!print*, 'nf_u A',nf_u
!print*, 'nwr_u A', nwr_u
!print*, 'ngb_u A',ngb_u
!print*, 'sfwb1D A',sfwb1D
!print*, 'gfwb1D A',gfwb1D
!print*, 'sfwinb1D A',sfwinb1D
!print*, 'sfrb(1,ibui) A',sfrb(1,ibui)
!print*, 'gfrb(1,ibui) A',gfrb(1,ibui)
!print*, 'latent A',latent
!print*, 'sigma A',sigma
!print*, 'albw_u(iurb) A',albw
!print*, 'albwin_u(iurb) A',albwin
!print*, 'albr_u(iurb) A',albr
!print*, 'emr_u(iurb) A',emr
!print*, 'emw_u(iurb) A',emw
!print*, 'emwind_u(iurb) A',emwind
!print*, 'rsw A',rsw
!print*, 'rlw A',rlw
!print*, 'r A',r
!print*, 'cp_u A',cp_u
!print*, 'da_u A',da_u
!print*, 'tmp_u A',tmp_u
!print*, 'qv_u A',qv_u
!print*, 'pr_u A',pr_u
!print*, 'rs A',rs
!print*, 'rld A',rld
!print*, 'dzw A',dzw
!print*, 'csw A',csw
!print*, 'alaw A',alaw
!print*, 'pwin_u A',pwin_u
!print*, 'cop_u(iurb) A',cop_u(iurb)
!print*, 'beta_u(iurb) A',beta_u(iurb)
!print*, 'sw_cond_u(iurb) A',sw_cond_u(iurb)
!print*, 'time_on_u(iurb) A',time_on_u(iurb)
!!print*, 'time_off_u(iurb) A',time_off_u(iurb)
!print*, 'targtemp_u(iurb) A',targtemp_u(iurb)
!print*, 'gaptemp_u(iurb) A ',gaptemp_u(iurb)
!print*, 'targhum_u(iurb) A ',targhum_u(iurb)
!print*, 'gaphum_u(iurb) A',gaphum_u(iurb)
!print*, 'perflo_u(iurb) A',perflo_u(iurb)
!print*, 'hsesf_u(iurb) A',hsesf_u(iurb)
!print*, 'hsequip A',hsequip
!print*, 'dzf A',dzf
!print*, 'csf A',csf
!print*, 'alaf A',alaf
!print*, 'dzgb A',dzgb
!print*, 'csgb A',csgb
!print*, 'alagb A',alagb
!print*, 'dzr A',dzr
!print*, 'csr A',csr
!print*, 'alar A',alar
!print*, 'tlevb1D A',tlevb1D
!print*, 'qlevb1D A',qlevb1D
!print*, 'twb1D A',twb1D
!print*, 'twlevb1D A',twlevb1D
!print*, 'tflevb1D A',tflevb1D
!print*, 'tglevb1D A',tglevb1D
!print*, 'trb1D A',trb1D
!print*, 'sflev1D A',sflev1D
!print*, 'lflev1D A',lflev1D
!print*, 'consumlev1D A',consumlev1D
!print*, 'sfvlev1D A',sfvlev1D
!print*, 'lfvlev1D A',lfvlev1D
!
!Temporal modifications
!
sfrb(2,ibui)=sfrb(1,ibui)
gfrb(2,ibui)=gfrb(1,ibui)
!
!End temporal modifications
!
do iz=1,nz_um
qlev(iz,ibui)=qlevb1D(iz)
tlev(iz,ibui)=tlevb1D(iz)
sflev(iz,ibui)=sflev1D(iz)
lflev(iz,ibui)=lflev1D(iz)
consumlev(iz,ibui)=consumlev1D(iz)
sfvlev(iz,ibui)=sfvlev1D(iz)
lfvlev(iz,ibui)=lfvlev1D(iz)
enddo
do id=1,ndm
do ily=1,nwr_u
trb(id,ily,ibui)=trb1D(ily)
enddo
do ily=1,ngb_u
tglev(id,ily,ibui)=tglevb1D(ily)
enddo
do ily=1,nf_u
do iz=1,nz_um-1
tflev(id,ily,iz,ibui)=tflevb1D(ily,iz)
enddo
enddo
!! do iz=1,nz_um
!! sfwin(2*id-1,iz,ibui)=sfwinb1D(2*id-1,iz)
!! sfwin(2*id,iz,ibui)=sfwinb1D(2*id,iz)
!! enddo
do iz=1,nz_um
do ily=1,nwr_u
tw(2*id-1,iz,ily,ibui)=twb1D(2*id-1,ily,iz)
tw(2*id,iz,ily,ibui)=twb1D(2*id,ily,iz)
enddo
!! sfw(2*id-1,iz,ibui)=sfwb1D(2*id-1,iz)
!! sfw(2*id,iz,ibui)=sfwb1D(2*id,iz)
gfw(2*id-1,iz,ibui)=gfwb1D(2*id-1,iz)
gfw(2*id,iz,ibui)=gfwb1D(2*id,iz)
twlev(2*id-1,iz,ibui)=twlevb1D(2*id-1,iz)
twlev(2*id,iz,ibui)=twlevb1D(2*id,iz)
enddo
enddo
enddo !ibui
!-----------------------------------------------------------------------------
!End loop over BEM -----------------------------------------------------------
!-----------------------------------------------------------------------------
!-----------------------------------------------------------------------------
ibui=0
do iz=1,nz_um
if(ss(iz).gt.0) then
ibui=ibui+1
do id=1,ndm
gfr(id,iz)=gfrb(id,ibui)
sfr(id,iz)=sfrb(id,ibui)
do ily=1,nwr_u
tr(id,iz,ily)=trb(id,ily,ibui)
enddo
ptr(id,iz)=tr(id,iz,nwr_u)*(pr_u(iz)/p0)**(-rcp_u)
enddo
endif
enddo !iz
!Compute the potential temperature for the vertical surfaces of the buildings
do id=1,ndm
do iz=1,nz_um
do ibui=1,nbui
ptw(2*id-1,iz,ibui)=tw(2*id-1,iz,nwr_u,ibui)*(pr_u(iz)/p0)**(-rcp_u)
ptw(2*id,iz,ibui)=tw(2*id,iz,nwr_u,ibui)*(pr_u(iz)/p0)**(-rcp_u)
ptwin(2*id-1,iz,ibui)=twlev(2*id-1,iz,ibui)*(pr_u(iz)/p0)**(-rcp_u)
ptwin(2*id,iz,ibui)=twlev(2*id,iz,ibui)*(pr_u(iz)/p0)**(-rcp_u)
enddo
enddo
enddo
! Compute the implicit and explicit components of the sources or sinks on the "urban grid"
call buildings
(iurb,ndu,nzu,z0,ua_u,va_u, &
pt_u,pt0_u,ptg,ptr,da_u,ptw,ptwin,pwin_u(iurb),drst, &
uva_u,vva_u,uvb_u,vvb_u,tva_u,tvb_u,evb_u,qvb_u,qhb_u, &
uhb_u,vhb_u,thb_u,ehb_u,ss,dt,sfw,sfg,sfr, &
sfwin,pb,bs_u,dz_u,sflev,lflev,sfvlev,lfvlev,tvb_ac)
! Calculation of the sensible heat fluxes for the ground, the wall and roof
! Sensible Heat Flux = density * Cp_U * ( A* potential temperature + B )
! where A and B are the implicit and explicit components of the heat sources or sinks.
! Interpolation on the "mesoscale grid"
call urban_meso
(ndu,kms,kme,kts,kte,nzu,z,dz,z_u,pb,ss,bs,ws,sf, &
vl,uva_u,vva_u,uvb_u,vvb_u,tva_u,tvb_u,evb_u, &
uhb_u,vhb_u,thb_u,ehb_u,qhb_u,qvb_u, &
a_u,a_v,a_t,a_e,b_u,b_v,b_t,b_e,b_q,tvb_ac,b_ac)
! Calculation of the length scale taking into account the buildings effects
call interp_length
(ndu,kms,kme,kts,kte,nzu,z_u,z,ss,ws,bs,dlg,dl_u)
return
end subroutine BEP1D
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine param(iurb,nzu,nzurb,nzurban,ndu, & 2
csg_u,csg,alag_u,alag,csr_u,csr, &
alar_u,alar,csw_u,csw,alaw_u,alaw, &
ws_u,ws_urb,ws,bs_u,bs_urb,bs,z0g_u,z0r_u,z0, &
strd_u,strd,drst_u,drst,ss_u,ss_urb,ss,pb_u, &
pb_urb,pb,dzw,dzr,dzf,csf,alaf,dzgb,csgb,alagb,&
lp_urb,lb_urb,hgt_urb,frc_urb)
! ----------------------------------------------------------------------
! This routine prepare some usefull parameters
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
integer iurb ! Current urban class
integer nzu ! Number of vertical urban levels in the current class
integer ndu ! Number of street direction for the current urban class
integer nzurb ! Number of vertical urban levels in the current class
real alag_u(nurbm) ! Ground thermal diffusivity [m^2 s^-1]
real alar_u(nurbm) ! Roof thermal diffusivity [m^2 s^-1]
real alaw_u(nurbm) ! Wall thermal diffusivity [m^2 s^-1]
real bs_u(ndm,nurbm) ! Building width
real csg_u(nurbm) ! Specific heat of the ground material [J m^3 K^-1]
real csr_u(nurbm) ! Specific heat of the roof material [J m^3 K^-1]
real csw_u(nurbm) ! Specific heat of the wall material [J m^3 K^-1]
real drst_u(ndm,nurbm) ! Street direction
real strd_u(ndm,nurbm) ! Street length
real ws_u(ndm,nurbm) ! Street width
real z0g_u(nurbm) ! The ground's roughness length
real z0r_u(nurbm) ! The roof's roughness length
real ss_u(nz_um,nurbm) ! The probability that a building has an height equal to "z"
real pb_u(nz_um,nurbm) ! The probability that a building has an height greater or equal to "z"
real lp_urb ! Building plan area density
real lb_urb ! Building surface area to plan area ratio
real hgt_urb ! Average building height weighted by building plan area [m]
real frc_urb ! Urban fraction
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real alag(ng_u) ! Ground thermal diffusivity at each ground levels
real csg(ng_u) ! Specific heat of the ground material at each ground levels
real bs(ndm) ! Building width for the current urban class
real drst(ndm) ! street directions for the current urban class
real strd(ndm) ! Street lengths for the current urban class
real ws(ndm) ! Street widths of the current urban class
real z0(ndm,nz_um) ! Roughness lengths "profiles"
real ss(nz_um) ! Probability to have a building with height h
real pb(nz_um) ! Probability to have a building with an height greater or equal to "z"
integer nzurban
!-----------------------------------------------------------------------------
!INPUT/OUTPUT
!-----------------------------------------------------------------------------
real dzw(nwr_u) !Layer sizes in the walls [m]
real dzr(nwr_u) !Layer sizes in the roofs [m]
real dzf(nf_u) !Layer sizes in the floors [m]
real dzgb(ngb_u) !layer sizes in the ground below the buildings [m]
real csr(nwr_u) ! Specific heat of the roof material at each roof levels
real csw(nwr_u) ! Specific heat of the wall material at each wall levels
real csf(nf_u) !Specific heat of the floors materials in the buildings
!of the current urban class [J m^3 K^-1]
real csgb(ngb_u) !Specific heat of the ground material below the buildings
!of the current urban class [J m^3 K^-1]
real alar(nwr_u+1) ! Roof thermal diffusivity at each roof levels [W/ m K]
real alaw(nwr_u+1) ! Wall thermal diffusivity at each wall levels [W/ m K]
real alaf(nf_u+1) ! Floor thermal diffusivity at each wall levels [W/m K]
real alagb(ngb_u+1) ! Ground thermal diffusivity below the building at each wall levels [W/m K]
real bs_urb(ndm,nurbm) ! Building width
real ws_urb(ndm,nurbm) ! Street width
real ss_urb(nz_um,nurbm) ! The probability that a building has an height equal to "z"
real pb_urb(nz_um) ! Probability that a building has an height greater or equal to z
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
integer id,ig,ir,iw,iz,iflo,ihu
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
!
!Initialize variables
!
ss=0.
pb=0.
csg=0.
alag=0.
csgb=0.
alagb=0.
csf=0.
alaf=0.
csr=0.
alar=0.
csw=0.
alaw=0.
z0=0.
ws=0.
bs=0.
bs_urb=0.
ws_urb=0.
strd=0.
drst=0.
nzurban=0
!Define the layer sizes in the walls
dzgb=(/0.2,0.12,0.08,0.05,0.03,0.02,0.02,0.01,0.005,0.0025/)
dzr=(/0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.01,0.005,0.0025/)
dzw=(/0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.01,0.005,0.0025/)
dzf=(/0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02/)
ihu=0
do iz=1,nz_um
if (ss_urb(iz,iurb)/=0.) then
ihu=1
exit
else
continue
endif
enddo
if (ihu==1) then
do iz=1,nzurb+1
ss(iz)=ss_urb(iz,iurb)
pb(iz)=pb_urb(iz)
enddo
nzurban=nzurb
else
do iz=1,nzu+1
ss(iz)=ss_u(iz,iurb)
pb(iz)=pb_u(iz,iurb)
ss_urb(iz,iurb)=ss_u(iz,iurb)
pb_urb(iz)=pb_u(iz,iurb)
end do
nzurban=nzu
endif
do ig=1,ngb_u
csgb(ig) = csg_u(iurb)
alagb(ig)= csg_u(iurb)*alag_u(iurb)
enddo
alagb(ngb_u+1)= csg_u(iurb)*alag_u(iurb)
do iflo=1,nf_u
csf(iflo) = csw_u(iurb)
alaf(iflo)= csw_u(iurb)*alaw_u(iurb)
enddo
alaf(nf_u+1)= csw_u(iurb)*alaw_u(iurb)
do ir=1,nwr_u
csr(ir) = csr_u(iurb)
alar(ir)= csr_u(iurb)*alar_u(iurb)
enddo
alar(nwr_u+1)= csr_u(iurb)*alar_u(iurb)
do iw=1,nwr_u
csw(iw) = csw_u(iurb)
alaw(iw)= csw_u(iurb)*alaw_u(iurb)
enddo
alaw(nwr_u+1)=csw_u(iurb)*alaw_u(iurb)
!------------------------------------------------------------------------
do ig=1,ng_u
csg(ig)=csg_u(iurb)
alag(ig)=alag_u(iurb)
enddo
do id=1,ndu
z0(id,1)=z0g_u(iurb)
do iz=2,nzurban+1
z0(id,iz)=z0r_u(iurb)
enddo
enddo
do id=1,ndu
strd(id)=strd_u(id,iurb)
drst(id)=drst_u(id,iurb)
enddo
do id=1,ndu
if ((hgt_urb<=0.).OR.(lp_urb<=0.).OR.(lb_urb<=0.)) then
ws(id)=ws_u(id,iurb)
bs(id)=bs_u(id,iurb)
bs_urb(id,iurb)=bs_u(id,iurb)
ws_urb(id,iurb)=ws_u(id,iurb)
else if ((lp_urb/frc_urb<1.).and.(lp_urb<lb_urb)) then
bs(id)=2.*hgt_urb*lp_urb/(lb_urb-lp_urb)
ws(id)=2.*hgt_urb*lp_urb*((frc_urb/lp_urb)-1.)/(lb_urb-lp_urb)
bs_urb(id,iurb)=bs(id)
ws_urb(id,iurb)=ws(id)
else
ws(id)=ws_u(id,iurb)
bs(id)=bs_u(id,iurb)
bs_urb(id,iurb)=bs_u(id,iurb)
ws_urb(id,iurb)=ws_u(id,iurb)
endif
enddo
do id=1,ndu
if ((bs(id)<=1.).OR.(bs(id)>=150.)) then
! write(*,*) 'WARNING, WIDTH OF THE BUILDING WRONG',id,bs(id)
! write(*,*) 'WIDTH OF THE STREET',id,ws(id)
bs(id)=bs_u(id,iurb)
ws(id)=ws_u(id,iurb)
bs_urb(id,iurb)=bs_u(id,iurb)
ws_urb(id,iurb)=ws_u(id,iurb)
endif
if ((ws(id)<=1.).OR.(ws(id)>=150.)) then
! write(*,*) 'WARNING, WIDTH OF THE STREET WRONG',id,ws(id)
! write(*,*) 'WIDTH OF THE BUILDING',id,bs(id)
ws(id)=ws_u(id,iurb)
bs(id)=bs_u(id,iurb)
bs_urb(id,iurb)=bs_u(id,iurb)
ws_urb(id,iurb)=ws_u(id,iurb)
endif
enddo
return
end subroutine param
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine interpol(kms,kme,kts,kte,nz_u,z,z_u,c,c_u) 13
! ----------------------------------------------------------------------
! This routine interpolate para
! meters from the "mesoscale grid" to
! the "urban grid".
! See p300 Appendix B.1 of the BLM paper.
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
! Data relative to the "mesoscale grid"
integer kts,kte,kms,kme
real z(kms:kme) ! Altitude of the cell interface
real c(kms:kme) ! Parameter which has to be interpolated
! Data relative to the "urban grid"
integer nz_u ! Number of levels
!! real z_u(nz_u+1) ! Altitude of the cell interface
real z_u(nz_um) ! Altitude of the cell interface
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
!! real c_u(nz_u) ! Interpolated paramters in the "urban grid"
real c_u(nz_um) ! Interpolated paramters in the "urban grid"
! LOCAL:
! ----------------------------------------------------------------------
integer iz_u,iz
real ctot,dz
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
do iz_u=1,nz_u
ctot=0.
do iz=kts,kte
dz=max(min(z(iz+1),z_u(iz_u+1))-max(z(iz),z_u(iz_u)),0.)
ctot=ctot+c(iz)*dz
enddo
c_u(iz_u)=ctot/(z_u(iz_u+1)-z_u(iz_u))
enddo
return
end subroutine interpol
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine averaging_temp(tw,twlev,ss,pb,tw_av,twlev_av, & 1
sfw_av,sfwind_av,sfw,sfwin)
implicit none
!
!INPUT VARIABLES
!
real tw(2*ndm,nz_um,nwr_u,nbui_max) ! Temperature in each layer of the wall [K]
real twlev(2*ndm,nz_um,nbui_max) ! Window temperature in BEM [K]
real pb(nz_um) ! Probability to have a building with an height equal or greater h
real ss(nz_um) ! Probability to have a building with height h
real sfw(2*ndm,nz_um,nbui_max) ! Surface fluxes from the walls
real sfwin(2*ndm,nz_um,nbui_max) ! Surface fluxes from the windows
!
!OUTPUT VARIABLES
!
real tw_av(2*ndm,nz_um) ! Averaged temperature of the wall surfaces
real twlev_av(2*ndm,nz_um) ! Averaged temperature of the windows
real sfw_av(2*ndm,nz_um) ! Averaged sensible heat from walls
real sfwind_av(2*ndm,nz_um) ! Averaged sensible heat from windows
!
!LOCAL VARIABLES
!
real d_urb(nz_um)
integer nlev(nz_um)
integer id,iz
integer nbui,ibui
!
!Initialize Variables
!
tw_av=0.
twlev_av=0.
sfw_av=0.
sfwind_av=0.
ibui=0
nbui=0
nlev=0
d_urb=0.
do iz=1,nz_um
if(ss(iz).gt.0) then
ibui=ibui+1
d_urb(ibui)=ss(iz)
nlev(ibui)=iz-1
nbui=ibui
endif
enddo
do id=1,ndm
do iz=1,nz_um-1
if (pb(iz+1).gt.0) then
do ibui=1,nbui
if (iz.le.nlev(ibui)) then
tw_av(2*id-1,iz)=tw_av(2*id-1,iz)+(d_urb(ibui)/pb(iz+1))*&
tw(2*id-1,iz,nwr_u,ibui)**4
tw_av(2*id,iz)=tw_av(2*id,iz)+(d_urb(ibui)/pb(iz+1))*&
tw(2*id,iz,nwr_u,ibui)**4
twlev_av(2*id-1,iz)=twlev_av(2*id-1,iz)+(d_urb(ibui)/pb(iz+1))*&
twlev(2*id-1,iz,ibui)**4
twlev_av(2*id,iz)=twlev_av(2*id,iz)+(d_urb(ibui)/pb(iz+1))*&
twlev(2*id,iz,ibui)**4
sfw_av(2*id-1,iz)=sfw_av(2*id-1,iz)+(d_urb(ibui)/pb(iz+1))*sfw(2*id-1,iz,ibui)
sfw_av(2*id,iz)=sfw_av(2*id,iz)+(d_urb(ibui)/pb(iz+1))*sfw(2*id,iz,ibui)
sfwind_av(2*id-1,iz)=sfwind_av(2*id-1,iz)+(d_urb(ibui)/pb(iz+1))*sfwin(2*id-1,iz,ibui)
sfwind_av(2*id,iz)=sfwind_av(2*id,iz)+(d_urb(ibui)/pb(iz+1))*sfwin(2*id,iz,ibui)
endif
enddo
tw_av(2*id-1,iz)=tw_av(2*id-1,iz)**(1./4.)
tw_av(2*id,iz)=tw_av(2*id,iz)**(1./4.)
twlev_av(2*id-1,iz)=twlev_av(2*id-1,iz)**(1./4.)
twlev_av(2*id,iz)=twlev_av(2*id,iz)**(1./4.)
endif
enddo !iz
enddo !id
return
end subroutine averaging_temp
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine modif_rad(iurb,nd,nz_u,z,ws,drst,strd,ss,pb, & 2,6
tw,tg,twlev,albg,albw,emw,emg,pwin,albwin, &
emwin,fww,fwg,fgw,fsw,fsg, &
zr,deltar,ah, &
rs,rl,rsw,rsg,rlw,rlg)
! ----------------------------------------------------------------------
! This routine computes the modification of the short wave and
! long wave radiation due to the buildings.
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
integer iurb ! current urban class
integer nd ! Number of street direction for the current urban class
integer nz_u ! Number of layer in the urban grid
real z(nz_um) ! Height of the urban grid levels
real ws(ndm) ! Street widths of the current urban class
real drst(ndm) ! street directions for the current urban class
real strd(ndm) ! Street lengths for the current urban class
real ss(nz_um) ! probability to have a building with height h
real pb(nz_um) ! probability to have a building with an height equal
real tw(2*ndm,nz_um) ! Temperature in each layer of the wall [K]
real tg(ndm,ng_u) ! Temperature in each layer of the ground [K]
real albg ! Albedo of the ground for the current urban class
real albw ! Albedo of the wall for the current urban class
real emg ! Emissivity of ground for the current urban class
real emw ! Emissivity of wall for the current urban class
real fgw(nz_um,ndm,nurbm) ! View factors from ground to wall
real fsg(ndm,nurbm) ! View factors from sky to ground
real fsw(nz_um,ndm,nurbm) ! View factors from sky to wall
real fws(nz_um,ndm,nurbm) ! View factors from wall to sky
real fwg(nz_um,ndm,nurbm) ! View factors from wall to ground
real fww(nz_um,nz_um,ndm,nurbm) ! View factors from wall to wall
real ah ! Hour angle (it should come from the radiation routine)
real zr ! zenith angle
real deltar ! Declination of the sun
real rs ! solar radiation
real rl ! downward flux of the longwave radiation
!
!New variables BEM
!
real twlev(2*ndm,nz_um) ! Window temperature in BEM [K]
real pwin ! Coverage area fraction of windows in the walls of the buildings
real albwin ! Albedo of the windows for the current urban class
real emwin ! Emissivity of the windows for the current urban class
real alb_av ! Averaged albedo (window and wall)
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real rlg(ndm) ! Long wave radiation at the ground
real rlw(2*ndm,nz_um) ! Long wave radiation at the walls
real rsg(ndm) ! Short wave radiation at the ground
real rsw(2*ndm,nz_um) ! Short wave radiation at the walls
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
integer id,iz
! Calculation of the shadow effects
call shadow_mas
(nd,nz_u,zr,deltar,ah,drst,ws,ss,pb,z, &
rs,rsw,rsg)
! Calculation of the reflection effects
do id=1,nd
call long_rad
(iurb,nz_u,id,emw,emg,emwin,pwin,twlev, &
fwg,fww,fgw,fsw,fsg,tg,tw,rlg,rlw,rl,pb)
alb_av=pwin*albwin+(1.-pwin)*albw
call short_rad
(iurb,nz_u,id,alb_av,albg,fwg,fww,fgw,rsg,rsw,pb)
enddo
return
end subroutine modif_rad
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine surf_temp(nd,pr,dt,rl,rsg,rlg, & 2,5
tg,alag,csg,emg,albg,ptg,sfg,gfg)
! ----------------------------------------------------------------------
! Computation of the surface temperatures for walls, ground and roofs
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
integer nd ! Number of street direction for the current urban class
real alag(ng_u) ! Ground thermal diffusivity for the current urban class [m^2 s^-1]
real albg ! Albedo of the ground for the current urban class
real csg(ng_u) ! Specific heat of the ground material of the current urban class [J m^3 K^-1]
real dt ! Time step
real emg ! Emissivity of ground for the current urban class
real pr(nz_um) ! Air pressure
real rl ! Downward flux of the longwave radiation
real rlg(ndm) ! Long wave radiation at the ground
real rsg(ndm) ! Short wave radiation at the ground
real sfg(ndm) ! Sensible heat flux from ground (road)
real gfg(ndm) ! Heat flux transferred from the surface of the ground (road) toward the interior
real tg(ndm,ng_u) ! Temperature in each layer of the ground [K]
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real ptg(ndm) ! Ground potential temperatures
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
integer id,ig,ir,iw,iz
real rtg(ndm) ! Total radiation at ground(road) surface (solar+incoming long+outgoing long)
real tg_tmp(ng_u)
real dzg_u(ng_u) ! Layer sizes in the ground
data dzg_u /0.2,0.12,0.08,0.05,0.03,0.02,0.02,0.01,0.005,0.0025/
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
do id=1,nd
! Calculation for the ground surfaces
do ig=1,ng_u
tg_tmp(ig)=tg(id,ig)
end do
!
call soil_temp
(ng_u,dzg_u,tg_tmp,ptg(id),alag,csg, &
rsg(id),rlg(id),pr(1), &
dt,emg,albg, &
rtg(id),sfg(id),gfg(id))
do ig=1,ng_u
tg(id,ig)=tg_tmp(ig)
end do
end do !id
return
end subroutine surf_temp
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine buildings(iurb,nd,nz,z0,ua_u,va_u,pt_u,pt0_u, & 2,8
ptg,ptr,da_u,ptw,ptwin,pwin, &
drst,uva_u,vva_u,uvb_u,vvb_u, &
tva_u,tvb_u,evb_u,qvb_u,qhb_u, &
uhb_u,vhb_u,thb_u,ehb_u,ss,dt,sfw,sfg,sfr, &
sfwin,pb,bs_u,dz_u,sflev,lflev,sfvlev,lfvlev,tvb_ac)
! ----------------------------------------------------------------------
! This routine computes the sources or sinks of the different quantities
! on the urban grid. The actual calculation is done in the subroutines
! called flux_wall, and flux_flat.
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
integer nd ! Number of street direction for the current urban class
integer nz ! number of vertical space steps
real ua_u(nz_um) ! Wind speed in the x direction on the urban grid
real va_u(nz_um) ! Wind speed in the y direction on the urban grid
real da_u(nz_um) ! air density on the urban grid
real drst(ndm) ! Street directions for the current urban class
real dz
real pt_u(nz_um) ! Potential temperature on the urban grid
real pt0_u(nz_um) ! reference potential temperature on the urban grid
real ptg(ndm) ! Ground potential temperatures
real ptr(ndm,nz_um) ! Roof potential temperatures
real ptw(2*ndm,nz_um,nbui_max) ! Walls potential temperatures
real ss(nz_um) ! probability to have a building with height h
real pb(nz_um)
real z0(ndm,nz_um) ! Roughness lengths "profiles"
real dt ! time step
integer iurb !Urban class
!
!New variables (BEM)
!
real bs_u(ndm,nurbm) ! Building width [m]
real dz_u ! Urban grid resolution
real sflev(nz_um,nz_um) ! sensible heat flux due to the air conditioning systems [W]
real lflev(nz_um,nz_um) ! latent heat flux due to the air conditioning systems [W]
real sfvlev(nz_um,nz_um) ! sensible heat flux due to ventilation [W]
real lfvlev(nz_um,nz_um) ! latent heat flux due to ventilation [W]
real qvb_u(2*ndm,nz_um)
real qhb_u(ndm,nz_um)
real ptwin(2*ndm,nz_um,nbui_max) ! window potential temperature
real pwin
real tvb_ac(2*ndm,nz_um)
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
! Explicit and implicit component of the momentum, temperature and TKE sources or sinks on
! vertical surfaces (walls) and horizontal surfaces (roofs and street)
! The fluxes can be computed as follow: Fluxes of X = A*X + B
! Example: Momentum fluxes on vertical surfaces = uva_u * ua_u + uvb_u
real uhb_u(ndm,nz_um) ! U (wind component) Horizontal surfaces, B (explicit) term
real uva_u(2*ndm,nz_um) ! U (wind component) Vertical surfaces, A (implicit) term
real uvb_u(2*ndm,nz_um) ! U (wind component) Vertical surfaces, B (explicit) term
real vhb_u(ndm,nz_um) ! V (wind component) Horizontal surfaces, B (explicit) term
real vva_u(2*ndm,nz_um) ! V (wind component) Vertical surfaces, A (implicit) term
real vvb_u(2*ndm,nz_um) ! V (wind component) Vertical surfaces, B (explicit) term
real thb_u(ndm,nz_um) ! Temperature Horizontal surfaces, B (explicit) term
real tva_u(2*ndm,nz_um) ! Temperature Vertical surfaces, A (implicit) term
real tvb_u(2*ndm,nz_um) ! Temperature Vertical surfaces, B (explicit) term
real ehb_u(ndm,nz_um) ! Energy (TKE) Horizontal surfaces, B (explicit) term
real evb_u(2*ndm,nz_um) ! Energy (TKE) Vertical surfaces, B (explicit) term
real sfw(2*ndm,nz_um,nbui_max) ! sensible heat flux from walls
real sfwin(2*ndm,nz_um,nbui_max) ! sensible heat flux form windows
real sfr(ndm,nz_um) ! sensible heat flux from roof
real sfg(ndm) ! sensible heat flux from street
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
real d_urb(nz_um)
real uva_tmp
real vva_tmp
real uvb_tmp
real vvb_tmp
real evb_tmp
integer nlev(nz_um)
integer id,iz,ibui,nbui
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
dz=dz_u
ibui=0
nbui=0
nlev=0
d_urb=0.
uva_u=0.
uvb_u=0.
vhb_u=0.
vva_u=0.
vvb_u=0.
thb_u=0.
tva_u=0.
tvb_u=0.
tvb_ac=0.
ehb_u=0.
evb_u=0.
qvb_u=0.
qhb_u=0.
do iz=1,nz_um
if(ss(iz).gt.0) then
ibui=ibui+1
d_urb(ibui)=ss(iz)
nlev(ibui)=iz-1
nbui=ibui
endif
enddo
do id=1,nd
! Calculation at the ground surfaces
call flux_flat
(dz,z0(id,1),ua_u(1),va_u(1),pt_u(1),pt0_u(1), &
ptg(id),uhb_u(id,1), &
vhb_u(id,1),sfg(id),ehb_u(id,1),da_u(1))
thb_u(id,1)=- sfg(id)/(da_u(1)*cp_u)
! Calculation at the roof surfaces
do iz=2,nz
if(ss(iz).gt.0)then
call flux_flat
(dz,z0(id,iz),ua_u(iz), &
va_u(iz),pt_u(iz),pt0_u(iz), &
ptr(id,iz),uhb_u(id,iz), &
vhb_u(id,iz),sfr(id,iz),ehb_u(id,iz),da_u(iz))
thb_u(id,iz)=- sfr(id,iz)/(da_u(iz)*cp_u)
else
uhb_u(id,iz) = 0.0
vhb_u(id,iz) = 0.0
thb_u(id,iz) = 0.0
ehb_u(id,iz) = 0.0
endif
end do
! Calculation at the wall surfaces
do ibui=1,nbui
do iz=1,nlev(ibui)
call flux_wall
(ua_u(iz),va_u(iz),pt_u(iz),da_u(iz), &
ptw(2*id-1,iz,ibui),ptwin(2*id-1,iz,ibui), &
uva_tmp,vva_tmp, &
uvb_tmp,vvb_tmp, &
sfw(2*id-1,iz,ibui),sfwin(2*id-1,iz,ibui), &
evb_tmp,drst(id),dt)
if (pb(iz+1).gt.0.) then
uva_u(2*id-1,iz)=uva_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*uva_tmp
vva_u(2*id-1,iz)=vva_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*vva_tmp
uvb_u(2*id-1,iz)=uvb_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*uvb_tmp
vvb_u(2*id-1,iz)=vvb_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*vvb_tmp
evb_u(2*id-1,iz)=evb_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*evb_tmp
tvb_u(2*id-1,iz)=tvb_u(2*id-1,iz)-(d_urb(ibui)/pb(iz+1))* &
(sfw(2*id-1,iz,ibui)*(1.-pwin)+sfwin(2*id-1,iz,ibui)*pwin)/ &
da_u(iz)/cp_u-(1./4.)*(d_urb(ibui)/pb(iz+1))*(sfvlev(iz,ibui)-sflev(iz,ibui))/&
(dz*bs_u(id,iurb))/da_u(iz)/cp_u
tvb_ac(2*id-1,iz)=tvb_ac(2*id-1,iz)-(1./4.)*(d_urb(ibui)/pb(iz+1))*(-sflev(iz,ibui))/&
(dz*bs_u(id,iurb))/da_u(iz)/cp_u
qvb_u(2*id-1,iz)=qvb_u(2*id-1,iz)-(1./4.)*(d_urb(ibui)/pb(iz+1))*(lfvlev(iz,ibui)-lflev(iz,ibui))/&
(dz*bs_u(id,iurb))/da_u(iz)/latent
endif
call flux_wall
(ua_u(iz),va_u(iz),pt_u(iz),da_u(iz), &
ptw(2*id,iz,ibui),ptwin(2*id,iz,ibui), &
uva_tmp,vva_tmp, &
uvb_tmp,vvb_tmp, &
sfw(2*id,iz,ibui),sfwin(2*id,iz,ibui), &
evb_tmp,drst(id),dt)
if (pb(iz+1).gt.0.) then
uva_u(2*id,iz)=uva_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*uva_tmp
vva_u(2*id,iz)=vva_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*vva_tmp
uvb_u(2*id,iz)=uvb_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*uvb_tmp
vvb_u(2*id,iz)=vvb_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*vvb_tmp
evb_u(2*id,iz)=evb_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*evb_tmp
tvb_u(2*id,iz)=tvb_u(2*id,iz)-(d_urb(ibui)/pb(iz+1))* &
(sfw(2*id,iz,ibui)*(1.-pwin)+sfwin(2*id,iz,ibui)*pwin)/ &
da_u(iz)/cp_u-(1./4.)*(d_urb(ibui)/pb(iz+1))*(sfvlev(iz,ibui)-sflev(iz,ibui))/&
(dz*bs_u(id,iurb))/da_u(iz)/cp_u
tvb_ac(2*id,iz)=tvb_ac(2*id,iz)-(1./4.)*(d_urb(ibui)/pb(iz+1))*(-sflev(iz,ibui))/&
(dz*bs_u(id,iurb))/da_u(iz)/cp_u
qvb_u(2*id,iz)=qvb_u(2*id,iz)-(1./4.)*(d_urb(ibui)/pb(iz+1))*(lfvlev(iz,ibui)-lflev(iz,ibui))/&
(dz*bs_u(id,iurb))/da_u(iz)/latent
endif
!
enddo !iz
enddo !ibui
end do !id
return
end subroutine buildings
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine urban_meso(nd,kms,kme,kts,kte,nz_u,z,dz,z_u,pb,ss,bs,ws,sf,vl, & 2
uva_u,vva_u,uvb_u,vvb_u,tva_u,tvb_u,evb_u, &
uhb_u,vhb_u,thb_u,ehb_u,qhb_u,qvb_u, &
a_u,a_v,a_t,a_e,b_u,b_v,b_t,b_e,b_q,tvb_ac,b_ac)
! ----------------------------------------------------------------------
! This routine interpolates the parameters from the "urban grid" to the
! "mesoscale grid".
! See p300-301 Appendix B.2 of the BLM paper.
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
! Data relative to the "mesoscale grid"
integer kms,kme,kts,kte
real z(kms:kme) ! Altitude above the ground of the cell interface
real dz(kms:kme) ! Vertical space steps
! Data relative to the "uban grid"
integer nz_u ! Number of layer in the urban grid
integer nd ! Number of street direction for the current urban class
real bs(ndm) ! Building widths of the current urban class
real ws(ndm) ! Street widths of the current urban class
real z_u(nz_um) ! Height of the urban grid levels
real pb(nz_um) ! Probability to have a building with an height equal
real ss(nz_um) ! Probability to have a building with height h
real uhb_u(ndm,nz_um) ! U (x-wind component) Horizontal surfaces, B (explicit) term
real uva_u(2*ndm,nz_um) ! U (x-wind component) Vertical surfaces, A (implicit) term
real uvb_u(2*ndm,nz_um) ! U (x-wind component) Vertical surfaces, B (explicit) term
real vhb_u(ndm,nz_um) ! V (y-wind component) Horizontal surfaces, B (explicit) term
real vva_u(2*ndm,nz_um) ! V (y-wind component) Vertical surfaces, A (implicit) term
real vvb_u(2*ndm,nz_um) ! V (y-wind component) Vertical surfaces, B (explicit) term
real thb_u(ndm,nz_um) ! Temperature Horizontal surfaces, B (explicit) term
real tva_u(2*ndm,nz_um) ! Temperature Vertical surfaces, A (implicit) term
real tvb_u(2*ndm,nz_um) ! Temperature Vertical surfaces, B (explicit) term
real tvb_ac(2*ndm,nz_um)
real ehb_u(ndm,nz_um) ! Energy (TKE) Horizontal surfaces, B (explicit) term
real evb_u(2*ndm,nz_um) ! Energy (TKE) Vertical surfaces, B (explicit) term
!
!New variables for BEM
!
real qhb_u(ndm,nz_um)
real qvb_u(2*ndm,nz_um)
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
! Data relative to the "mesoscale grid"
real sf(kms:kme) ! Surface of the "mesoscale grid" cells taking into account the buildings
real vl(kms:kme) ! Volume of the "mesoscale grid" cells taking into account the buildings
real a_u(kms:kme) ! Implicit component of the momentum sources or sinks in the X-direction
real a_v(kms:kme) ! Implicit component of the momentum sources or sinks in the Y-direction
real a_t(kms:kme) ! Implicit component of the heat sources or sinks
real a_e(kms:kme) ! Implicit component of the TKE sources or sinks
real b_u(kms:kme) ! Explicit component of the momentum sources or sinks in the X-direction
real b_v(kms:kme) ! Explicit component of the momentum sources or sinks in the Y-direction
real b_t(kms:kme) ! Explicit component of the heat sources or sinks
real b_ac(kms:kme)
real b_e(kms:kme) ! Explicit component of the TKE sources or sinks
real b_q(kms:kme) ! Explicit component of the humidity sources or sinks
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
real dzz
real fact
integer id,iz,iz_u
real se,sr,st,su,sv,sq
real uet(kms:kme) ! Contribution to TKE due to walls
real veb,vta,vtb,vte,vtot,vua,vub,vva,vvb,vqb,vtb_ac
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
! initialisation
do iz=kts,kte
a_u(iz)=0.
a_v(iz)=0.
a_t(iz)=0.
a_e(iz)=0.
b_u(iz)=0.
b_v(iz)=0.
b_e(iz)=0.
b_t(iz)=0.
b_ac(iz)=0.
uet(iz)=0.
b_q(iz)=0.
end do
! horizontal surfaces
do iz=kts,kte
sf(iz)=0.
vl(iz)=0.
enddo
sf(kte+1)=0.
do id=1,nd
do iz=kts+1,kte+1
sr=0.
do iz_u=2,nz_u
if(z(iz).lt.z_u(iz_u).and.z(iz).ge.z_u(iz_u-1))then
sr=pb(iz_u)
endif
enddo
sf(iz)=sf(iz)+((ws(id)+(1.-sr)*bs(id))/(ws(id)+bs(id)))/nd
enddo
enddo
! volume
do iz=kts,kte
do id=1,nd
vtot=0.
do iz_u=1,nz_u
dzz=max(min(z_u(iz_u+1),z(iz+1))-max(z_u(iz_u),z(iz)),0.)
vtot=vtot+pb(iz_u+1)*dzz
enddo
vtot=vtot/(z(iz+1)-z(iz))
vl(iz)=vl(iz)+(1.-vtot*bs(id)/(ws(id)+bs(id)))/nd
enddo
enddo
! horizontal surface impact
do id=1,nd
fact=1./vl(kts)/dz(kts)*ws(id)/(ws(id)+bs(id))/nd
b_t(kts)=b_t(kts)+thb_u(id,1)*fact
b_u(kts)=b_u(kts)+uhb_u(id,1)*fact
b_v(kts)=b_v(kts)+vhb_u(id,1)*fact
b_e(kts)=b_e(kts)+ehb_u(id,1)*fact*(z_u(2)-z_u(1))
b_q(kts)=b_q(kts)+qhb_u(id,1)*fact
do iz=kts,kte
st=0.
su=0.
sv=0.
se=0.
sq=0.
do iz_u=2,nz_u
if(z(iz).le.z_u(iz_u).and.z(iz+1).gt.z_u(iz_u))then
st=st+ss(iz_u)*thb_u(id,iz_u)
su=su+ss(iz_u)*uhb_u(id,iz_u)
sv=sv+ss(iz_u)*vhb_u(id,iz_u)
se=se+ss(iz_u)*ehb_u(id,iz_u)*(z_u(iz_u+1)-z_u(iz_u))
sq=sq+ss(iz_u)*qhb_u(id,iz_u)
endif
enddo
fact=bs(id)/(ws(id)+bs(id))/vl(iz)/dz(iz)/nd
b_t(iz)=b_t(iz)+st*fact
b_u(iz)=b_u(iz)+su*fact
b_v(iz)=b_v(iz)+sv*fact
b_e(iz)=b_e(iz)+se*fact
b_q(iz)=b_q(iz)+sq*fact
enddo
enddo
! vertical surface impact
do iz=kts,kte
uet(iz)=0.
do id=1,nd
vtb=0.
vtb_ac=0.
vta=0.
vua=0.
vub=0.
vva=0.
vvb=0.
veb=0.
vte=0.
vqb=0.
do iz_u=1,nz_u
dzz=max(min(z_u(iz_u+1),z(iz+1))-max(z_u(iz_u),z(iz)),0.)
fact=dzz/(ws(id)+bs(id))
vtb=vtb+pb(iz_u+1)* &
(tvb_u(2*id-1,iz_u)+tvb_u(2*id,iz_u))*fact
vtb_ac=vtb_ac+pb(iz_u+1)* &
(tvb_ac(2*id-1,iz_u)+tvb_ac(2*id,iz_u))*fact
vta=vta+pb(iz_u+1)* &
(tva_u(2*id-1,iz_u)+tva_u(2*id,iz_u))*fact
vua=vua+pb(iz_u+1)* &
(uva_u(2*id-1,iz_u)+uva_u(2*id,iz_u))*fact
vva=vva+pb(iz_u+1)* &
(vva_u(2*id-1,iz_u)+vva_u(2*id,iz_u))*fact
vub=vub+pb(iz_u+1)* &
(uvb_u(2*id-1,iz_u)+uvb_u(2*id,iz_u))*fact
vvb=vvb+pb(iz_u+1)* &
(vvb_u(2*id-1,iz_u)+vvb_u(2*id,iz_u))*fact
veb=veb+pb(iz_u+1)* &
(evb_u(2*id-1,iz_u)+evb_u(2*id,iz_u))*fact
vqb=vqb+pb(iz_u+1)* &
(qvb_u(2*id-1,iz_u)+qvb_u(2*id,iz_u))*fact
enddo
fact=1./vl(iz)/dz(iz)/nd
b_t(iz)=b_t(iz)+vtb*fact
b_ac(iz)=b_ac(iz)+vtb_ac*fact
a_t(iz)=a_t(iz)+vta*fact
a_u(iz)=a_u(iz)+vua*fact
a_v(iz)=a_v(iz)+vva*fact
b_u(iz)=b_u(iz)+vub*fact
b_v(iz)=b_v(iz)+vvb*fact
b_e(iz)=b_e(iz)+veb*fact
uet(iz)=uet(iz)+vte*fact
b_q(iz)=b_q(iz)+vqb*fact
enddo
enddo
return
end subroutine urban_meso
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine interp_length(nd,kms,kme,kts,kte,nz_u,z_u,z,ss,ws,bs, & 2
dlg,dl_u)
! ----------------------------------------------------------------------
! Calculation of the length scales
! See p272-274 formula (22) and (24) of the BLM paper
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
integer kms,kme,kts,kte
real z(kms:kme) ! Altitude above the ground of the cell interface
integer nd ! Number of street direction for the current urban class
integer nz_u ! Number of levels in the "urban grid"
real z_u(nz_um) ! Height of the urban grid levels
real bs(ndm) ! Building widths of the current urban class
real ss(nz_um) ! Probability to have a building with height h
real ws(ndm) ! Street widths of the current urban class
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real dlg(kms:kme) ! Height above ground (L_ground in formula (24) of the BLM paper).
real dl_u(kms:kme) ! Length scale (lb in formula (22) ofthe BLM paper).
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
real dlgtmp
integer id,iz,iz_u
real sftot
real ulu,ssl
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
do iz=kts,kte
ulu=0.
ssl=0.
do id=1,nd
do iz_u=2,nz_u
if(z_u(iz_u).gt.z(iz))then
ulu=ulu+ss(iz_u)/z_u(iz_u)/nd
ssl=ssl+ss(iz_u)/nd
endif
enddo
enddo
if(ulu.ne.0)then
dl_u(iz)=ssl/ulu
else
dl_u(iz)=0.
endif
enddo
do iz=kts,kte
dlg(iz)=0.
do id=1,nd
sftot=ws(id)
dlgtmp=ws(id)/((z(iz)+z(iz+1))/2.)
do iz_u=1,nz_u
if((z(iz)+z(iz+1))/2..gt.z_u(iz_u))then
dlgtmp=dlgtmp+ss(iz_u)*bs(id)/ &
((z(iz)+z(iz+1))/2.-z_u(iz_u))
sftot=sftot+ss(iz_u)*bs(id)
endif
enddo
dlg(iz)=dlg(iz)+dlgtmp/sftot/nd
enddo
dlg(iz)=1./dlg(iz)
enddo
return
end subroutine interp_length
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine shadow_mas(nd,nz_u,zr,deltar,ah,drst,ws,ss,pb,z, & 2,4
rs,rsw,rsg)
! ----------------------------------------------------------------------
! Modification of short wave radiation to take into account
! the shadow produced by the buildings
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
integer nd ! Number of street direction for the current urban class
integer nz_u ! number of vertical layers defined in the urban grid
real ah ! Hour angle (it should come from the radiation routine)
real deltar ! Declination of the sun
real drst(ndm) ! street directions for the current urban class
real rs ! solar radiation
real ss(nz_um) ! probability to have a building with height h
real pb(nz_um) ! Probability that a building has an height greater or equal to h
real ws(ndm) ! Street width of the current urban class
real z(nz_um) ! Height of the urban grid levels
real zr ! zenith angle
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real rsg(ndm) ! Short wave radiation at the ground
real rsw(2*ndm,nz_um) ! Short wave radiation at the walls
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
integer id,iz,jz
real aae,aaw,bbb,phix,rd,rtot,wsd
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
if(rs.eq.0.or.sin(zr).eq.1)then
do id=1,nd
rsg(id)=0.
do iz=1,nz_u
rsw(2*id-1,iz)=0.
rsw(2*id,iz)=0.
enddo
enddo
else
!test
if(abs(sin(zr)).gt.1.e-10)then
if(cos(deltar)*sin(ah)/sin(zr).ge.1)then
bbb=pi/2.
elseif(cos(deltar)*sin(ah)/sin(zr).le.-1)then
bbb=-pi/2.
else
bbb=asin(cos(deltar)*sin(ah)/sin(zr))
endif
else
if(cos(deltar)*sin(ah).ge.0)then
bbb=pi/2.
elseif(cos(deltar)*sin(ah).lt.0)then
bbb=-pi/2.
endif
endif
phix=zr
do id=1,nd
rsg(id)=0.
aae=bbb-drst(id)
aaw=bbb-drst(id)+pi
do iz=1,nz_u
rsw(2*id-1,iz)=0.
rsw(2*id,iz)=0.
if(pb(iz+1).gt.0.)then
do jz=1,nz_u
if(abs(sin(aae)).gt.1.e-10)then
call shade_wall
(z(iz),z(iz+1),z(jz+1),phix,aae, &
ws(id),rd)
rsw(2*id-1,iz)=rsw(2*id-1,iz)+rs*rd*ss(jz+1)/pb(iz+1)
endif
if(abs(sin(aaw)).gt.1.e-10)then
call shade_wall
(z(iz),z(iz+1),z(jz+1),phix,aaw, &
ws(id),rd)
rsw(2*id,iz)=rsw(2*id,iz)+rs*rd*ss(jz+1)/pb(iz+1)
endif
enddo
endif
enddo
if(abs(sin(aae)).gt.1.e-10)then
wsd=abs(ws(id)/sin(aae))
do jz=1,nz_u
rd=max(0.,wsd-z(jz+1)*tan(phix))
rsg(id)=rsg(id)+rs*rd*ss(jz+1)/wsd
enddo
rtot=0.
do iz=1,nz_u
rtot=rtot+(rsw(2*id,iz)+rsw(2*id-1,iz))* &
(z(iz+1)-z(iz))
enddo
rtot=rtot+rsg(id)*ws(id)
else
rsg(id)=rs
endif
enddo
endif
return
end subroutine shadow_mas
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine shade_wall(z1,z2,hu,phix,aa,ws,rd) 4
! ----------------------------------------------------------------------
! This routine computes the effects of a shadow induced by a building of
! height hu, on a portion of wall between z1 and z2. See equation A10,
! and correction described below formula A11, and figure A1. Basically rd
! is the ratio between the horizontal surface illuminated and the portion
! of wall. Referring to figure A1, multiplying radiation flux density on
! a horizontal surface (rs) by x1-x2 we have the radiation energy per
! unit time. Dividing this by z2-z1, we obtain the radiation flux
! density reaching the portion of the wall between z2 and z1
! (everything is assumed in 2D)
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
real aa ! Angle between the sun direction and the face of the wall (A12)
real hu ! Height of the building that generates the shadow
real phix ! Solar zenith angle
real ws ! Width of the street
real z1 ! Height of the level z(iz)
real z2 ! Height of the level z(iz+1)
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real rd ! Ratio between (x1-x2)/(z2-z1), see Fig. 1A.
! Multiplying rd by rs (radiation flux
! density on a horizontal surface) gives
! the radiation flux density on the
! portion of wall between z1 and z2.
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
real x1,x2 ! x1,x2 see Fig. A1.
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
x1=min((hu-z1)*tan(phix),max(0.,ws/sin(aa)))
x2=max((hu-z2)*tan(phix),0.)
rd=max(0.,sin(aa)*(max(0.,x1-x2))/(z2-z1))
return
end subroutine shade_wall
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine long_rad(iurb,nz_u,id,emw,emg,emwin,pwin,twlev,& 2,2
fwg,fww,fgw,fsw,fsg,tg,tw,rlg,rlw,rl,pb)
! ----------------------------------------------------------------------
! This routine computes the effects of the reflections of long-wave
! radiation in the street canyon by solving the system
! of 2*nz_u+1 eqn. in 2*nz_u+1
! unkonwn defined in A4, A5 and A6 of the paper (pages 295 and 296).
! The system is solved by solving A X= B,
! with A matrix B vector, and X solution.
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
real emg ! Emissivity of ground for the current urban class
real emw ! Emissivity of wall for the current urban class
real fgw(nz_um,ndm,nurbm) ! View factors from ground to wall
real fsg(ndm,nurbm) ! View factors from sky to ground
real fsw(nz_um,ndm,nurbm) ! View factors from sky to wall
real fwg(nz_um,ndm,nurbm) ! View factors from wall to ground
real fww(nz_um,nz_um,ndm,nurbm) ! View factors from wall to wall
integer id ! Current street direction
integer iurb ! Current urban class
integer nz_u ! Number of layer in the urban grid
real pb(nz_um) ! Probability to have a building with an height equal
real rl ! Downward flux of the longwave radiation
real tg(ndm,ng_u) ! Temperature in each layer of the ground [K]
real tw(2*ndm,nz_um) ! Temperature in each layer of the wall [K]
!
!New Variables for BEM
!
real twlev(2*ndm,nz_um) ! Window temperature in BEM [K]
real emwin ! Emissivity of windows
real pwin ! Coverage area fraction of windows in the walls of the buildings (BEM)
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real rlg(ndm) ! Long wave radiation at the ground
real rlw(2*ndm,nz_um) ! Long wave radiation at the walls
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
integer i,j
real aaa(2*nz_um+1,2*nz_um+1) ! terms of the matrix
real bbb(2*nz_um+1) ! terms of the vector
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
! west wall
do i=1,nz_u
do j=1,nz_u
aaa(i,j)=0.
enddo
aaa(i,i)=1.
do j=nz_u+1,2*nz_u
aaa(i,j)=-(1.-emw*(1.-pwin)-emwin*pwin)* &
fww(j-nz_u,i,id,iurb)*pb(j-nz_u+1)
enddo
!! aaa(i,2*nz_u+1)=-(1.-emg)*fgw(i,id,iurb)*pb(i+1)
aaa(i,2*nz_u+1)=-(1.-emg)*fgw(i,id,iurb)
bbb(i)=fsw(i,id,iurb)*rl+emg*fgw(i,id,iurb)*sigma*tg(id,ng_u)**4
do j=1,nz_u
bbb(i)=bbb(i)+pb(j+1)*sigma*fww(j,i,id,iurb)* &
(emw*(1.-pwin)*tw(2*id,j)**4+emwin*pwin*twlev(2*id,j)**4)+ &
fww(j,i,id,iurb)*rl*(1.-pb(j+1))
enddo
enddo
! east wall
do i=1+nz_u,2*nz_u
do j=1,nz_u
aaa(i,j)=-(1.-emw*(1.-pwin)-emwin*pwin)*fww(j,i-nz_u,id,iurb)*pb(j+1)
enddo
do j=1+nz_u,2*nz_u
aaa(i,j)=0.
enddo
aaa(i,i)=1.
!! aaa(i,2*nz_u+1)=-(1.-emg)*fgw(i-nz_u,id,iurb)*pb(i-nz_u+1)
aaa(i,2*nz_u+1)=-(1.-emg)*fgw(i-nz_u,id,iurb)
bbb(i)=fsw(i-nz_u,id,iurb)*rl+ &
emg*fgw(i-nz_u,id,iurb)*sigma*tg(id,ng_u)**4
do j=1,nz_u
bbb(i)=bbb(i)+pb(j+1)*sigma*fww(j,i-nz_u,id,iurb)* &
(emw*(1.-pwin)*tw(2*id-1,j)**4+emwin*pwin*twlev(2*id-1,j)**4)+&
fww(j,i-nz_u,id,iurb)*rl*(1.-pb(j+1))
enddo
enddo
! ground
do j=1,nz_u
aaa(2*nz_u+1,j)=-(1.-emw*(1.-pwin)-emwin*pwin)* &
fwg(j,id,iurb)*pb(j+1)
enddo
do j=nz_u+1,2*nz_u
aaa(2*nz_u+1,j)=-(1.-emw*(1.-pwin)-emwin*pwin)* &
fwg(j-nz_u,id,iurb)*pb(j-nz_u+1)
enddo
aaa(2*nz_u+1,2*nz_u+1)=1.
bbb(2*nz_u+1)=fsg(id,iurb)*rl
do i=1,nz_u
bbb(2*nz_u+1)=bbb(2*nz_u+1)+sigma*fwg(i,id,iurb)*pb(i+1)* &
(emw*(1.-pwin)*(tw(2*id-1,i)**4+tw(2*id,i)**4)+ &
emwin*pwin*(twlev(2*id-1,i)**4+twlev(2*id,i)**4))+ &
2.*fwg(i,id,iurb)*(1.-pb(i+1))*rl
enddo
call gaussj
(aaa,2*nz_u+1,bbb,2*nz_um+1)
do i=1,nz_u
rlw(2*id-1,i)=bbb(i)
enddo
do i=nz_u+1,2*nz_u
rlw(2*id,i-nz_u)=bbb(i)
enddo
rlg(id)=bbb(2*nz_u+1)
return
end subroutine long_rad
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine short_rad(iurb,nz_u,id,albw, & 2,2
albg,fwg,fww,fgw,rsg,rsw,pb)
! ----------------------------------------------------------------------
! This routine computes the effects of the reflections of short-wave
! (solar) radiation in the street canyon by solving the system
! of 2*nz_u+1 eqn. in 2*nz_u+1
! unkonwn defined in A4, A5 and A6 of the paper (pages 295 and 296).
! The system is solved by solving A X= B,
! with A matrix B vector, and X solution.
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
real albg ! Albedo of the ground for the current urban class
real albw ! Albedo of the wall for the current urban class
real fgw(nz_um,ndm,nurbm) ! View factors from ground to wall
real fwg(nz_um,ndm,nurbm) ! View factors from wall to ground
real fww(nz_um,nz_um,ndm,nurbm) ! View factors from wall to wall
integer id ! current street direction
integer iurb ! current urban class
integer nz_u ! Number of layer in the urban grid
real pb(nz_um) ! probability to have a building with an height equal
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real rsg(ndm) ! Short wave radiation at the ground
real rsw(2*ndm,nz_um) ! Short wave radiation at the walls
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
integer i,j
real aaa(2*nz_um+1,2*nz_um+1) ! terms of the matrix
real bbb(2*nz_um+1) ! terms of the vector
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
! west wall
do i=1,nz_u
do j=1,nz_u
aaa(i,j)=0.
enddo
aaa(i,i)=1.
do j=nz_u+1,2*nz_u
aaa(i,j)=-albw*fww(j-nz_u,i,id,iurb)*pb(j-nz_u+1)
enddo
aaa(i,2*nz_u+1)=-albg*fgw(i,id,iurb)
bbb(i)=rsw(2*id-1,i)
enddo
! east wall
do i=1+nz_u,2*nz_u
do j=1,nz_u
aaa(i,j)=-albw*fww(j,i-nz_u,id,iurb)*pb(j+1)
enddo
do j=1+nz_u,2*nz_u
aaa(i,j)=0.
enddo
aaa(i,i)=1.
aaa(i,2*nz_u+1)=-albg*fgw(i-nz_u,id,iurb)
bbb(i)=rsw(2*id,i-nz_u)
enddo
! ground
do j=1,nz_u
aaa(2*nz_u+1,j)=-albw*fwg(j,id,iurb)*pb(j+1)
enddo
do j=nz_u+1,2*nz_u
aaa(2*nz_u+1,j)=-albw*fwg(j-nz_u,id,iurb)*pb(j-nz_u+1)
enddo
aaa(2*nz_u+1,2*nz_u+1)=1.
bbb(2*nz_u+1)=rsg(id)
call gaussj
(aaa,2*nz_u+1,bbb,2*nz_um+1)
do i=1,nz_u
rsw(2*id-1,i)=bbb(i)
enddo
do i=nz_u+1,2*nz_u
rsw(2*id,i-nz_u)=bbb(i)
enddo
rsg(id)=bbb(2*nz_u+1)
return
end subroutine short_rad
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine gaussj(a,n,b,np) 4,4
! ----------------------------------------------------------------------
! This routine solve a linear system of n equations of the form
! A X = B
! where A is a matrix a(i,j)
! B a vector and X the solution
! In output b is replaced by the solution
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
integer np
real a(np,np)
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real b(np)
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
integer nmax
parameter (nmax=150)
real big,dum
integer i,icol,irow
integer j,k,l,ll,n
integer ipiv(nmax)
real pivinv
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
do j=1,n
ipiv(j)=0.
enddo
do i=1,n
big=0.
do j=1,n
if(ipiv(j).ne.1)then
do k=1,n
if(ipiv(k).eq.0)then
if(abs(a(j,k)).ge.big)then
big=abs(a(j,k))
irow=j
icol=k
endif
elseif(ipiv(k).gt.1)then
CALL wrf_error_fatal
('singular matrix in gaussj')
endif
enddo
endif
enddo
ipiv(icol)=ipiv(icol)+1
if(irow.ne.icol)then
do l=1,n
dum=a(irow,l)
a(irow,l)=a(icol,l)
a(icol,l)=dum
enddo
dum=b(irow)
b(irow)=b(icol)
b(icol)=dum
endif
if(a(icol,icol).eq.0) CALL wrf_error_fatal
('singular matrix in gaussj')
pivinv=1./a(icol,icol)
a(icol,icol)=1
do l=1,n
a(icol,l)=a(icol,l)*pivinv
enddo
b(icol)=b(icol)*pivinv
do ll=1,n
if(ll.ne.icol)then
dum=a(ll,icol)
a(ll,icol)=0.
do l=1,n
a(ll,l)=a(ll,l)-a(icol,l)*dum
enddo
b(ll)=b(ll)-b(icol)*dum
endif
enddo
enddo
return
end subroutine gaussj
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine soil_temp(nz,dz,temp,pt,ala,cs, & 5,2
rs,rl,press,dt,em,alb,rt,sf,gf)
! ----------------------------------------------------------------------
! This routine solves the Fourier diffusion equation for heat in
! the material (wall, roof, or ground). Resolution is done implicitely.
! Boundary conditions are:
! - fixed temperature at the interior
! - energy budget at the surface
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
integer nz ! Number of layers
real ala(nz) ! Thermal diffusivity in each layers [m^2 s^-1]
real alb ! Albedo of the surface
real cs(nz) ! Specific heat of the material [J m^3 K^-1]
real dt ! Time step
real em ! Emissivity of the surface
real press ! Pressure at ground level
real rl ! Downward flux of the longwave radiation
real rs ! Solar radiation
real sf ! Sensible heat flux at the surface
real temp(nz) ! Temperature in each layer [K]
real dz(nz) ! Layer sizes [m]
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real gf ! Heat flux transferred from the surface toward the interior
real pt ! Potential temperature at the surface
real rt ! Total radiation at the surface (solar+incoming long+outgoing long)
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
integer iz
real a(nz,3)
real alpha
real c(nz)
real cddz(nz+2)
real tsig
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
tsig=temp(nz)
alpha=(1.-alb)*rs+em*rl-em*sigma*(tsig**4)+sf
! Compute cddz=2*cd/dz
cddz(1)=ala(1)/dz(1)
do iz=2,nz
cddz(iz)=2.*ala(iz)/(dz(iz)+dz(iz-1))
enddo
! cddz(nz+1)=ala(nz+1)/dz(nz)
a(1,1)=0.
a(1,2)=1.
a(1,3)=0.
c(1)=temp(1)
do iz=2,nz-1
a(iz,1)=-cddz(iz)*dt/dz(iz)
a(iz,2)=1+dt*(cddz(iz)+cddz(iz+1))/dz(iz)
a(iz,3)=-cddz(iz+1)*dt/dz(iz)
c(iz)=temp(iz)
enddo
a(nz,1)=-dt*cddz(nz)/dz(nz)
a(nz,2)=1.+dt*cddz(nz)/dz(nz)
a(nz,3)=0.
c(nz)=temp(nz)+dt*alpha/cs(nz)/dz(nz)
call invert
(nz,a,c,temp)
pt=temp(nz)*(press/1.e+5)**(-rcp_u)
rt=(1.-alb)*rs+em*rl-em*sigma*(tsig**4)
! gf=-cddz(nz)*(temp(nz)-temp(nz-1))*cs(nz)
gf=(1.-alb)*rs+em*rl-em*sigma*(tsig**4)+sf
return
end subroutine soil_temp
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine invert(n,a,c,x) 4
! ----------------------------------------------------------------------
! Inversion and resolution of a tridiagonal matrix
! A X = C
! ----------------------------------------------------------------------
implicit none
! ----------------------------------------------------------------------
! INPUT:
! ----------------------------------------------------------------------
integer n
real a(n,3) ! a(*,1) lower diagonal (Ai,i-1)
! a(*,2) principal diagonal (Ai,i)
! a(*,3) upper diagonal (Ai,i+1)
real c(n)
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
real x(n)
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
integer i
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
do i=n-1,1,-1
c(i)=c(i)-a(i,3)*c(i+1)/a(i+1,2)
a(i,2)=a(i,2)-a(i,3)*a(i+1,1)/a(i+1,2)
enddo
do i=2,n
c(i)=c(i)-a(i,1)*c(i-1)/a(i-1,2)
enddo
do i=1,n
x(i)=c(i)/a(i,2)
enddo
return
end subroutine invert
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine flux_wall(ua,va,pt,da,ptw,ptwin,uva,vva,uvb,vvb, & 4
sfw,sfwin,evb,drst,dt)
! ----------------------------------------------------------------------
! This routine computes the surface sources or sinks of momentum, tke,
! and heat from vertical surfaces (walls).
! ----------------------------------------------------------------------
implicit none
! INPUT:
! -----
real drst ! street directions for the current urban class
real da ! air density
real pt ! potential temperature
real ptw ! Walls potential temperatures
real ptwin ! Windows potential temperatures
real ua ! wind speed
real va ! wind speed
real dt !time step
! OUTPUT:
! ------
! Explicit and implicit component of the momentum, temperature and TKE sources or sinks on
! vertical surfaces (walls).
! The fluxes can be computed as follow: Fluxes of X = A*X + B
! Example: Momentum fluxes on vertical surfaces = uva_u * ua_u + uvb_u
real uva ! U (wind component) Vertical surfaces, A (implicit) term
real uvb ! U (wind component) Vertical surfaces, B (explicit) term
real vva ! V (wind component) Vertical surfaces, A (implicit) term
real vvb ! V (wind component) Vertical surfaces, B (explicit) term
real tva ! Temperature Vertical surfaces, A (implicit) term
real tvb ! Temperature Vertical surfaces, B (explicit) term
real evb ! Energy (TKE) Vertical surfaces, B (explicit) term
real sfw ! Surfaces fluxes from the walls
real sfwin ! Surfaces fluxes from the windows
! LOCAL:
! -----
real hc
real hcwin
real u_ort
real vett
! -------------------------
! END VARIABLES DEFINITIONS
! -------------------------
vett=(ua**2+va**2)**.5
u_ort=abs((cos(drst)*ua-sin(drst)*va))
uva=-cdrag*u_ort/2.*cos(drst)*cos(drst)
vva=-cdrag*u_ort/2.*sin(drst)*sin(drst)
uvb=cdrag*u_ort/2.*sin(drst)*cos(drst)*va
vvb=cdrag*u_ort/2.*sin(drst)*cos(drst)*ua
if (vett.lt.4.88) then
hc=5.678*(1.09+0.23*(vett/0.3048))
else
hc=5.678*0.53*((vett/0.3048)**0.78)
endif
if (hc.gt.da*cp_u/dt)then
hc=da*cp_u/dt
endif
if (vett.lt.4.88) then
hcwin=5.678*(0.99+0.21*(vett/0.3048))
else
hcwin=5.678*0.50*((vett/0.3048)**0.78)
endif
if (hcwin.gt.da*cp_u/dt) then
hcwin=da*cp_u/dt
endif
! tvb=hc*ptw/da/cp_u
! tva=-hc/da/cp_u
!!!!!!!!!!!!!!!!!!!!
! explicit
sfw=hc*(pt-ptw)
sfwin=hcwin*(pt-ptwin)
evb=cdrag*(abs(u_ort)**3.)/2.
return
end subroutine flux_wall
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine flux_flat(dz,z0,ua,va,pt,pt0,ptg, & 4
uhb,vhb,sf,ehb,da)
! ----------------------------------------------------------------------
! Calculation of the flux at the ground
! Formulation of Louis (Louis, 1979)
! ----------------------------------------------------------------------
implicit none
real dz ! first vertical level
real pt ! potential temperature
real pt0 ! reference potential temperature
real ptg ! ground potential temperature
real ua ! wind speed
real va ! wind speed
real z0 ! Roughness length
real da ! air density
! ----------------------------------------------------------------------
! OUTPUT:
! ----------------------------------------------------------------------
! Explicit component of the momentum, temperature and TKE sources or sinks on horizontal
! surfaces (roofs and street)
! The fluxes can be computed as follow: Fluxes of X = B
! Example: Momentum fluxes on horizontal surfaces = uhb_u
real uhb ! U (wind component) Horizontal surfaces, B (explicit) term
real vhb ! V (wind component) Horizontal surfaces, B (explicit) term
! real thb ! Temperature Horizontal surfaces, B (explicit) term
real tva ! Temperature Vertical surfaces, A (implicit) term
real tvb ! Temperature Vertical surfaces, B (explicit) term
real ehb ! Energy (TKE) Horizontal surfaces, B (explicit) term
real sf
! ----------------------------------------------------------------------
! LOCAL:
! ----------------------------------------------------------------------
real aa
real al
real buu
real c
real fbuw
real fbpt
real fh
real fm
real ric
real tstar
real ustar
real utot
real wstar
real zz
real b,cm,ch,rr,tol
parameter(b=9.4,cm=7.4,ch=5.3,rr=0.74,tol=.001)
! ----------------------------------------------------------------------
! END VARIABLES DEFINITIONS
! ----------------------------------------------------------------------
! computation of the ground temperature
utot=(ua**2+va**2)**.5
!!!! Louis formulation
!
! compute the bulk Richardson Number
zz=dz/2.
! if(tstar.lt.0.)then
! wstar=(-ustar*tstar*g*hii/pt)**(1./3.)
! else
! wstar=0.
! endif
!
! if (utot.le.0.7*wstar) utot=max(0.7*wstar,0.00001)
utot=max(utot,0.01)
ric=2.*g_u*zz*(pt-ptg)/((pt+ptg)*(utot**2))
aa=vk/log(zz/z0)
! determine the parameters fm and fh for stable, neutral and unstable conditions
if(ric.gt.0)then
fm=1/(1+0.5*b*ric)**2
fh=fm
else
c=b*cm*aa*aa*(zz/z0)**.5
fm=1-b*ric/(1+c*(-ric)**.5)
c=c*ch/cm
fh=1-b*ric/(1+c*(-ric)**.5)
endif
fbuw=-aa*aa*utot*utot*fm
fbpt=-aa*aa*utot*(pt-ptg)*fh/rr
ustar=(-fbuw)**.5
tstar=-fbpt/ustar
al=(vk*g_u*tstar)/(pt*ustar*ustar)
buu=-g_u/pt0*ustar*tstar
uhb=-ustar*ustar*ua/utot
vhb=-ustar*ustar*va/utot
sf= ustar*tstar*da*cp_u
! thb= 0.
ehb=buu
!!!!!!!!!!!!!!!
return
end subroutine flux_flat
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine icBEP (nd_u,h_b,d_b,ss_u,pb_u,nz_u,z_u) 2
implicit none
! Street parameters
integer nd_u(nurbm) ! Number of street direction for each urban class
real h_b(nz_um,nurbm) ! Bulding's heights [m]
real d_b(nz_um,nurbm) ! The probability that a building has an height h_b
! -----------------------------------------------------------------------
! Output
!------------------------------------------------------------------------
real ss_u(nz_um,nurbm) ! The probability that a building has an height equal to z
real pb_u(nz_um,nurbm) ! The probability that a building has an height greater or equal to z
! Grid parameters
integer nz_u(nurbm) ! Number of layer in the urban grid
real z_u(nz_um) ! Height of the urban grid levels
! -----------------------------------------------------------------------
! Local
!------------------------------------------------------------------------
integer iz_u,id,ilu,iurb
real dtot
real hbmax
! -----------------------------------------------------------------------
! This routine initialise the urban paramters for the BEP module
!------------------------------------------------------------------------
!
!Initialize variables
!
nz_u=0
z_u=0.
ss_u=0.
pb_u=0.
! Computation of the urban levels height
z_u(1)=0.
do iz_u=1,nz_um-1
z_u(iz_u+1)=z_u(iz_u)+dz_u
enddo
! Normalisation of the building density
do iurb=1,nurbm
dtot=0.
do ilu=1,nz_um
dtot=dtot+d_b(ilu,iurb)
enddo
do ilu=1,nz_um
d_b(ilu,iurb)=d_b(ilu,iurb)/dtot
enddo
enddo
! Compute the view factors, pb and ss
do iurb=1,nurbm
hbmax=0.
nz_u(iurb)=0
do ilu=1,nz_um
if(h_b(ilu,iurb).gt.hbmax)hbmax=h_b(ilu,iurb)
enddo
do iz_u=1,nz_um-1
if(z_u(iz_u+1).gt.hbmax)go to 10
enddo
10 continue
nz_u(iurb)=iz_u+1
do id=1,nd_u(iurb)
do iz_u=1,nz_u(iurb)
ss_u(iz_u,iurb)=0.
do ilu=1,nz_um
if(z_u(iz_u).le.h_b(ilu,iurb) &
.and.z_u(iz_u+1).gt.h_b(ilu,iurb))then
ss_u(iz_u,iurb)=ss_u(iz_u,iurb)+d_b(ilu,iurb)
endif
enddo
enddo
pb_u(1,iurb)=1.
do iz_u=1,nz_u(iurb)
pb_u(iz_u+1,iurb)=max(0.,pb_u(iz_u,iurb)-ss_u(iz_u,iurb))
enddo
enddo
end do
return
end subroutine icBEP
! ===6=8===============================================================72
! ===6=8===============================================================72
subroutine view_factors(iurb,nz_u,id,dxy,z,ws,fww,fwg,fgw,fsg,fsw,fws) 2,26
implicit none
! -----------------------------------------------------------------------
! Input
!------------------------------------------------------------------------
integer iurb ! Number of the urban class
integer nz_u ! Number of levels in the urban grid
integer id ! Street direction number
real ws ! Street width
real z(nz_um) ! Height of the urban grid levels
real dxy ! Street lenght
! -----------------------------------------------------------------------
! Output
!------------------------------------------------------------------------
! fww,fwg,fgw,fsw,fsg are the view factors used to compute the long wave
! and the short wave radation. They are the part of radiation from a surface
! or from the sky to another surface.
real fww(nz_um,nz_um,ndm,nurbm) ! from wall to wall
real fwg(nz_um,ndm,nurbm) ! from wall to ground
real fgw(nz_um,ndm,nurbm) ! from ground to wall
real fsw(nz_um,ndm,nurbm) ! from sky to wall
real fws(nz_um,ndm,nurbm) ! from wall to sky
real fsg(ndm,nurbm) ! from sky to ground
! -----------------------------------------------------------------------
! Local
!------------------------------------------------------------------------
integer jz,iz
real hut
real f1,f2,f12,f23,f123,ftot
real fprl,fnrm
real a1,a2,a3,a4,a12,a23,a123
! -----------------------------------------------------------------------
! This routine calculates the view factors
!------------------------------------------------------------------------
hut=z(nz_u+1)
do jz=1,nz_u
! radiation from wall to wall
do iz=1,nz_u
call fprls
(fprl,dxy,abs(z(jz+1)-z(iz )),ws)
f123=fprl
call fprls
(fprl,dxy,abs(z(jz+1)-z(iz+1)),ws)
f23=fprl
call fprls
(fprl,dxy,abs(z(jz )-z(iz )),ws)
f12=fprl
call fprls
(fprl,dxy,abs(z(jz )-z(iz+1)),ws)
f2 = fprl
a123=dxy*(abs(z(jz+1)-z(iz )))
a12 =dxy*(abs(z(jz )-z(iz )))
a23 =dxy*(abs(z(jz+1)-z(iz+1)))
a1 =dxy*(abs(z(iz+1)-z(iz )))
a2 =dxy*(abs(z(jz )-z(iz+1)))
a3 =dxy*(abs(z(jz+1)-z(jz )))
ftot=0.5*(a123*f123-a23*f23-a12*f12+a2*f2)/a1
fww(iz,jz,id,iurb)=ftot*a1/a3
enddo
! radiation from ground to wall
call fnrms
(fnrm,z(jz+1),dxy,ws)
f12=fnrm
call fnrms
(fnrm,z(jz) ,dxy,ws)
f1=fnrm
a1 = ws*dxy
a12= ws*dxy
a4=(z(jz+1)-z(jz))*dxy
ftot=(a12*f12-a12*f1)/a1
fgw(jz,id,iurb)=ftot*a1/a4
! radiation from sky to wall
call fnrms
(fnrm,hut-z(jz) ,dxy,ws)
f12 = fnrm
call fnrms
(fnrm,hut-z(jz+1),dxy,ws)
f1 =fnrm
a1 = ws*dxy
a12= ws*dxy
a4 = (z(jz+1)-z(jz))*dxy
ftot=(a12*f12-a12*f1)/a1
fsw(jz,id,iurb)=ftot*a1/a4
enddo
! radiation from wall to sky
do iz=1,nz_u
call fnrms
(fnrm,ws,dxy,hut-z(iz))
f12=fnrm
call fnrms
(fnrm,ws,dxy,hut-z(iz+1))
f1=fnrm
a1 = (z(iz+1)-z(iz))*dxy
a2 = (hut-z(iz+1))*dxy
a12= (hut-z(iz))*dxy
a4 = ws*dxy
ftot=(a12*f12-a2*f1)/a1
fws(iz,id,iurb)=ftot*a1/a4
enddo
!!!!!!!!!!!!!
do iz=1,nz_u
! radiation from wall to ground
call fnrms
(fnrm,ws,dxy,z(iz+1))
f12=fnrm
call fnrms
(fnrm,ws,dxy,z(iz ))
f1 =fnrm
a1= (z(iz+1)-z(iz) )*dxy
a2 = z(iz)*dxy
a12= z(iz+1)*dxy
a4 = ws*dxy
ftot=(a12*f12-a2*f1)/a1
fwg(iz,id,iurb)=ftot*a1/a4
enddo
! radiation from sky to ground
call fprls
(fprl,dxy,ws,hut)
fsg(id,iurb)=fprl
return
end subroutine view_factors
! ===6=8===============================================================72
! ===6=8===============================================================72
SUBROUTINE fprls (fprl,a,b,c) 10
implicit none
real a,b,c
real x,y
real fprl
x=a/c
y=b/c
if(a.eq.0.or.b.eq.0.)then
fprl=0.
else
fprl=log( ( (1.+x**2)*(1.+y**2)/(1.+x**2+y**2) )**.5)+ &
y*((1.+x**2)**.5)*atan(y/((1.+x**2)**.5))+ &
x*((1.+y**2)**.5)*atan(x/((1.+y**2)**.5))- &
y*atan(y)-x*atan(x)
fprl=fprl*2./(pi*x*y)
endif
return
end subroutine fprls
! ===6=8===============================================================72
! ===6=8===============================================================72
SUBROUTINE fnrms (fnrm,a,b,c) 16
implicit none
real a,b,c
real x,y,z,a1,a2,a3,a4,a5,a6
real fnrm
x=a/b
y=c/b
z=x**2+y**2
if(y.eq.0.or.x.eq.0)then
fnrm=0.
else
a1=log( (1.+x*x)*(1.+y*y)/(1.+z) )
a2=y*y*log(y*y*(1.+z)/z/(1.+y*y) )
a3=x*x*log(x*x*(1.+z)/z/(1.+x*x) )
a4=y*atan(1./y)
a5=x*atan(1./x)
a6=sqrt(z)*atan(1./sqrt(z))
fnrm=0.25*(a1+a2+a3)+a4+a5-a6
fnrm=fnrm/(pi*y)
endif
return
end subroutine fnrms
! ===6=8===============================================================72
SUBROUTINE init_para(alag_u,alaw_u,alar_u,csg_u,csw_u,csr_u,& 2,1
twini_u,trini_u,tgini_u,albg_u,albw_u,albr_u,albwin_u,emg_u,emw_u,&
emr_u,emwind_u,z0g_u,z0r_u,nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b, &
cop_u,pwin_u,beta_u,sw_cond_u,time_on_u,time_off_u,targtemp_u, &
gaptemp_u, targhum_u,gaphum_u,perflo_u,hsesf_u,hsequip)
! initialization routine, where the variables from the table are read
implicit none
integer iurb ! urban class number
! Building parameters
real alag_u(nurbm) ! Ground thermal diffusivity [m^2 s^-1]
real alaw_u(nurbm) ! Wall thermal diffusivity [m^2 s^-1]
real alar_u(nurbm) ! Roof thermal diffusivity [m^2 s^-1]
real csg_u(nurbm) ! Specific heat of the ground material [J m^3 K^-1]
real csw_u(nurbm) ! Specific heat of the wall material [J m^3 K^-1]
real csr_u(nurbm) ! Specific heat of the roof material [J m^3 K^-1]
real twini_u(nurbm) ! Temperature inside the buildings behind the wall [K]
real trini_u(nurbm) ! Temperature inside the buildings behind the roof [K]
real tgini_u(nurbm) ! Initial road temperature
! Radiation parameters
real albg_u(nurbm) ! Albedo of the ground
real albw_u(nurbm) ! Albedo of the wall
real albr_u(nurbm) ! Albedo of the roof
real albwin_u(nurbm) ! Albedo of the window
real emg_u(nurbm) ! Emissivity of ground
real emw_u(nurbm) ! Emissivity of wall
real emr_u(nurbm) ! Emissivity of roof
real emwind_u(nurbm) ! Emissivity of windows
! Roughness parameters
real z0g_u(nurbm) ! The ground's roughness length
real z0r_u(nurbm) ! The roof's roughness length
! Street parameters
integer nd_u(nurbm) ! Number of street direction for each urban class
real strd_u(ndm,nurbm) ! Street length (fix to greater value to the horizontal length of the cells)
real drst_u(ndm,nurbm) ! Street direction [degree]
real ws_u(ndm,nurbm) ! Street width [m]
real bs_u(ndm,nurbm) ! Building width [m]
real h_b(nz_um,nurbm) ! Bulding's heights [m]
real d_b(nz_um,nurbm) ! The probability that a building has an height h_b
integer i,iu
integer nurb ! number of urban classes used
real, intent(out) :: cop_u(nurbm)
real, intent(out) :: pwin_u(nurbm)
real, intent(out) :: beta_u(nurbm)
integer, intent(out) :: sw_cond_u(nurbm)
real, intent(out) :: time_on_u(nurbm)
real, intent(out) :: time_off_u(nurbm)
real, intent(out) :: targtemp_u(nurbm)
real, intent(out) :: gaptemp_u(nurbm)
real, intent(out) :: targhum_u(nurbm)
real, intent(out) :: gaphum_u(nurbm)
real, intent(out) :: perflo_u(nurbm)
real, intent(out) :: hsesf_u(nurbm)
real, intent(out) :: hsequip(24)
!
!Initialize some variables
!
h_b=0.
d_b=0.
nurb=ICATE
do iu=1,nurb
nd_u(iu)=0
enddo
csw_u=CAPB_TBL / (( 1.0 / 4.1868 ) * 1.E-6)
csr_u=CAPR_TBL / (( 1.0 / 4.1868 ) * 1.E-6)
csg_u=CAPG_TBL / (( 1.0 / 4.1868 ) * 1.E-6)
do i=1,icate
alaw_u(i)=AKSB_TBL(i) / csw_u(i) / (( 1.0 / 4.1868 ) * 1.E-2)
alar_u(i)=AKSR_TBL(i) / csr_u(i) / (( 1.0 / 4.1868 ) * 1.E-2)
alag_u(i)=AKSG_TBL(i) / csg_u(i) / (( 1.0 / 4.1868 ) * 1.E-2)
enddo
twini_u=TBLEND_TBL
trini_u=TRLEND_TBL
tgini_u=TGLEND_TBL
albw_u=ALBB_TBL
albr_u=ALBR_TBL
albg_u=ALBG_TBL
emw_u=EPSB_TBL
emr_u=EPSR_TBL
emg_u=EPSG_TBL
z0r_u=Z0R_TBL
z0g_u=Z0G_TBL
nd_u=NUMDIR_TBL
!FS
cop_u = cop_tbl
pwin_u = pwin_tbl
beta_u = beta_tbl
sw_cond_u = sw_cond_tbl
time_on_u = time_on_tbl
time_off_u = time_off_tbl
targtemp_u = targtemp_tbl
gaptemp_u = gaptemp_tbl
targhum_u = targhum_tbl
gaphum_u = gaphum_tbl
perflo_u = perflo_tbl
hsesf_u = hsesf_tbl
hsequip = hsequip_tbl
do iu=1,icate
if(ndm.lt.nd_u(iu))then
write(*,*)'ndm too small in module_sf_bep_bem, please increase to at least ', nd_u(iu)
write(*,*)'remember also that num_urban_layers should be equal or greater than nz_um*ndm*nwr-u!'
stop
endif
do i=1,nd_u(iu)
drst_u(i,iu)=STREET_DIRECTION_TBL(i,iu) * pi/180.
ws_u(i,iu)=STREET_WIDTH_TBL(i,iu)
bs_u(i,iu)=BUILDING_WIDTH_TBL(i,iu)
enddo
enddo
do iu=1,ICATE
if(nz_um.lt.numhgt_tbl(iu)+3)then
write(*,*)'nz_um too small in module_sf_bep, please increase to at least ',numhgt_tbl(iu)+3
write(*,*)'remember also that num_urban_layers should be equal or greater than nz_um*ndm*nwr-u!'
stop
endif
do i=1,NUMHGT_TBL(iu)
h_b(i,iu)=HEIGHT_BIN_TBL(i,iu)
d_b(i,iu)=HPERCENT_BIN_TBL(i,iu)
enddo
enddo
do i=1,ndm
do iu=1,nurbm
strd_u(i,iu)=100000.
enddo
enddo
do iu=1,nurb
emwind_u(iu)=0.9
call albwindow
(albwin_u(iu))
enddo
return
end subroutine init_para
!==============================================================
!==============================================================
!====6=8===============================================================72
!====6=8===============================================================72
subroutine upward_rad(ndu,nzu,ws,bs,sigma,pb,ss, & 2
tg,emg_u,albg_u,rlg,rsg,sfg, &
tw,emw_u,albw_u,rlw,rsw,sfw, &
tr,emr_u,albr_u,emwind,albwind,twlev,pwin, &
sfwind,rld,rs, sfr, &
rs_abs,rl_up,emiss,grdflx_urb)
!
! IN this surboutine we compute the upward longwave flux, and the albedo
! needed for the radiation scheme
!
implicit none
!
!INPUT VARIABLES
!
real rsw(2*ndm,nz_um) ! Short wave radiation at the wall for a given canyon direction [W/m2]
real rlw(2*ndm,nz_um) ! Long wave radiation at the walls for a given canyon direction [W/m2]
real rsg(ndm) ! Short wave radiation at the canyon for a given canyon direction [W/m2]
real rlg(ndm) ! Long wave radiation at the ground for a given canyon direction [W/m2]
real rs ! Short wave radiation at the horizontal surface from the sun [W/m²]
real sfw(2*ndm,nz_um) ! Sensible heat flux from walls [W/m²]
real sfg(ndm) ! Sensible heat flux from ground (road) [W/m²]
real sfr(ndm,nz_um) ! Sensible heat flux from roofs [W/m²]
real rld ! Long wave radiation from the sky [W/m²]
real albg_u ! albedo of the ground/street
real albw_u ! albedo of the walls
real albr_u ! albedo of the roof
real ws(ndm) ! width of the street
real bs(ndm)
! building size
real pb(nz_um) ! Probability to have a building with an height equal or higher
integer nzu
real ss(nz_um) ! Probability to have a building of a given height
real sigma
real emg_u ! emissivity of the street
real emw_u ! emissivity of the wall
real emr_u ! emissivity of the roof
real tw(2*ndm,nz_um) ! Temperature in each layer of the wall [K]
real tr(ndm,nz_um,nwr_u) ! Temperature in each layer of the roof [K]
real tg(ndm,ng_u) ! Temperature in each layer of the ground [K]
integer id ! street direction
integer ndu ! number of street directions
!
!New variables BEM
!
real emwind !Emissivity of the windows
real albwind !Albedo of the windows
real twlev(2*ndm,nz_um) !Averaged Temperature of the windows
real pwin !Coverage area fraction of the windows
real gflwin !Heat stored for the windows
real sfwind(2*ndm,nz_um) !Sensible heat flux from windows [W/m²]
!OUTPUT/INPUT
real rs_abs ! absrobed solar radiationfor this street direction
real rl_up ! upward longwave radiation for this street direction
real emiss ! mean emissivity
real grdflx_urb ! ground heat flux
!LOCAL
integer iz,iw
real rl_inc,rl_emit
real gfl
integer ix,iy,iwrong
iwrong=1
do iz=1,nzu+1
do id=1,ndu
do iw=1,nwr_u
if(tr(id,iz,iw).lt.100.)then
write(*,*)'in upward_rad ',iz,id,iw,tr(id,iz,iw)
iwrong=0
endif
enddo
enddo
enddo
if(iwrong.eq.0)stop
rl_up=0.
rs_abs=0.
rl_inc=0.
emiss=0.
rl_emit=0.
grdflx_urb=0.
do id=1,ndu
rl_emit=rl_emit-( emg_u*sigma*(tg(id,ng_u)**4.)+(1-emg_u)*rlg(id))*ws(id)/(ws(id)+bs(id))/ndu
rl_inc=rl_inc+rlg(id)*ws(id)/(ws(id)+bs(id))/ndu
rs_abs=rs_abs+(1.-albg_u)*rsg(id)*ws(id)/(ws(id)+bs(id))/ndu
gfl=(1.-albg_u)*rsg(id)+emg_u*rlg(id)-emg_u*sigma*(tg(id,ng_u)**4.)+sfg(id)
grdflx_urb=grdflx_urb-gfl*ws(id)/(ws(id)+bs(id))/ndu
do iz=2,nzu
rl_emit=rl_emit-(emr_u*sigma*(tr(id,iz,nwr_u)**4.)+(1-emr_u)*rld)*ss(iz)*bs(id)/(ws(id)+bs(id))/ndu
rl_inc=rl_inc+rld*ss(iz)*bs(id)/(ws(id)+bs(id))/ndu
rs_abs=rs_abs+(1.-albr_u)*rs*ss(iz)*bs(id)/(ws(id)+bs(id))/ndu
gfl=(1.-albr_u)*rs+emr_u*rld-emr_u*sigma*(tr(id,iz,nwr_u)**4.)+sfr(id,iz)
grdflx_urb=grdflx_urb-gfl*ss(iz)*bs(id)/(ws(id)+bs(id))/ndu
enddo
do iz=1,nzu
rl_emit=rl_emit-(emw_u*(1.-pwin)*sigma*(tw(2*id-1,iz)**4.+tw(2*id,iz)**4.)+ &
(emwind*pwin*sigma*(twlev(2*id-1,iz)**4.+twlev(2*id,iz)**4.))+ &
((1.-emw_u)*(1.-pwin)+pwin*(1.-emwind))*(rlw(2*id-1,iz)+rlw(2*id,iz)))* &
dz_u*pb(iz+1)/(ws(id)+bs(id))/ndu
rl_inc=rl_inc+((rlw(2*id-1,iz)+rlw(2*id,iz)))*dz_u*pb(iz+1)/(ws(id)+bs(id))/ndu
rs_abs=rs_abs+(((1.-albw_u)*(1.-pwin)+(1.-albwind)*pwin)*(rsw(2*id-1,iz)+rsw(2*id,iz)))*&
dz_u*pb(iz+1)/(ws(id)+bs(id))/ndu
gfl=(1.-albw_u)*(rsw(2*id-1,iz)+rsw(2*id,iz)) +emw_u*( rlw(2*id-1,iz)+rlw(2*id,iz) ) &
-emw_u*sigma*( tw(2*id-1,iz)**4.+tw(2*id,iz)**4. )+(sfw(2*id-1,iz)+sfw(2*id,iz))
gflwin=(1.-albwind)*(rsw(2*id-1,iz)+rsw(2*id,iz)) +emwind*(rlw(2*id-1,iz)+rlw(2*id,iz)) &
-emwind*sigma*( twlev(2*id-1,iz)**4.+twlev(2*id,iz)**4.)+(sfwind(2*id-1,iz)+sfwind(2*id,iz))
grdflx_urb=grdflx_urb-(gfl*(1.-pwin)+pwin*gflwin)*dz_u*pb(iz+1)/(ws(id)+bs(id))/ndu
enddo
enddo
emiss=(emg_u+emw_u+emr_u)/3.
rl_up=(rl_inc+rl_emit)-rld
return
END SUBROUTINE upward_rad
!====6=8===============================================================72
!====6=8===============================================================72
! ===6================================================================72
! ===6================================================================72
subroutine albwindow(albwin) 1,2
!-------------------------------------------------------------------
implicit none
! -------------------------------------------------------------------
!Based on the
!paper of J.Karlsson and A.Roos(2000):"modelling the angular behaviour
!of the total solar energy transmittance of windows"
!Solar Energy Vol.69,No.4,pp. 321-329.
! -------------------------------------------------------------------
!Input
!-----
!Output
!------
real albwin ! albedo of the window
!Local
!-----
real a,b,c !Polynomial coefficients
real alfa,delta,gama !Polynomial powers
real g0 !transmittance when the angle
!of incidence is normal to the surface.
real asup,ainf
real fonc
!Constants
!--------------------
real epsilon !accuracy of the integration
parameter (epsilon=1.e-07)
real n1,n2 !Index of refraction for glasses and air
parameter(n1=1.,n2=1.5)
integer intg,k
!--------------------------------------------------------------------
if (q_num.eq.0) then
write(*,*) 'Category parameter of the windows no valid'
stop
endif
g0=4.*n1*n2/((n1+n2)*(n1+n2))
a=8.
b=0.25/q_num
c=1.-a-b
alfa =5.2 + (0.7*q_num)
delta =2.
gama =(5.26+0.06*p_num)+(0.73+0.04*p_num)*q_num
intg=1
!----------------------------------------------------------------------
100 asup=0.
ainf=0.
do k=1,intg
call foncs
(fonc,(pi*k/intg),a,b,c,alfa,delta,gama)
asup=asup+(pi/intg)*fonc
enddo
intg=intg+1
do k=1,intg
call foncs
(fonc,(pi*k/intg),a,b,c,alfa,delta,gama)
ainf=ainf+(pi/intg)*fonc
enddo
if(abs(asup-ainf).lt.epsilon) then
albwin=1-g0+(g0/2.)*asup
else
goto 100
endif
!----------------------------------------------------------------------
return
end subroutine albwindow
!====================================================================72
!====================================================================72
subroutine foncs(fonc,x,aa,bb,cc,alf,delt,gam) 2
implicit none
!
real x,aa,bb,cc
real alf,delt,gam
real fonc
fonc=(((aa*(x**alf))/(pi**alf))+ &
((bb*(x**delt))/(pi**delt))+ &
((cc*(x**gam))/(pi**gam)))*sin(x)
return
end subroutine foncs
!====================================================================72
!====================================================================72
subroutine icBEP_XY(iurb,fww_u,fwg_u,fgw_u,fsw_u, & 2,2
fws_u,fsg_u,ndu,strd,ws,nzu,z_u)
implicit none
! Street parameters
integer ndu ! Number of street direction for each urban class
integer iurb
real strd(ndm) ! Street length (fix to greater value to the horizontal length of the cells)
real ws(ndm) ! Street width [m]
! Grid parameters
integer nzu ! Number of layer in the urban grid
real z_u(nz_um) ! Height of the urban grid levels
! -----------------------------------------------------------------------
! Output
!------------------------------------------------------------------------
! fww_u,fwg_u,fgw_u,fsw_u,fsg_u are the view factors used to compute the long wave
! and the short wave radation. They are the part of radiation from a surface
! or from the sky to another surface.
real fww_u(nz_um,nz_um,ndm,nurbm) ! from wall to wall
real fwg_u(nz_um,ndm,nurbm) ! from wall to ground
real fgw_u(nz_um,ndm,nurbm) ! from ground to wall
real fsw_u(nz_um,ndm,nurbm) ! from sky to wall
real fws_u(nz_um,ndm,nurbm) ! from sky to wall
real fsg_u(ndm,nurbm) ! from sky to ground
! -----------------------------------------------------------------------
! Local
!------------------------------------------------------------------------
integer id
! -----------------------------------------------------------------------
! This routine compute the view factors
!------------------------------------------------------------------------
!
!Initialize
!
fww_u=0.
fwg_u=0.
fgw_u=0.
fsw_u=0.
fws_u=0.
fsg_u=0.
do id=1,ndu
call view_factors
(iurb,nzu,id,strd(id),z_u,ws(id), &
fww_u,fwg_u,fgw_u,fsg_u,fsw_u,fws_u)
enddo
return
end subroutine icBEP_XY
!====================================================================72
!====================================================================72
subroutine icBEPHI_XY(iurb,hb_u,hi_urb1D,ss_u,pb_u,nzu,z_u) 2
implicit none
!-----------------------------------------------------------------------
! Inputs
!-----------------------------------------------------------------------
! Street parameters
!
real hi_urb1D(nz_um) ! The probability that a building has an height h_b
integer iurb ! Number of the urban class
!
! Grid parameters
!
real z_u(nz_um) ! Height of the urban grid levels
! -----------------------------------------------------------------------
! Output
!------------------------------------------------------------------------
real ss_u(nz_um,nurbm) ! The probability that a building has an height equal to z
real pb_u(nz_um) ! The probability that a building has an height greater or equal to z
!
! Grid parameters
!
integer nzu ! Number of layer in the urban grid
! -----------------------------------------------------------------------
! Local
!------------------------------------------------------------------------
real hb_u(nz_um) ! Bulding's heights [m]
integer iz_u,id,ilu
real dtot
real hbmax
!------------------------------------------------------------------------
!Initialize variables
!
nzu=0
ss_u=0.
pb_u=0.
! Normalisation of the building density
dtot=0.
hb_u=0.
do ilu=1,nz_um
dtot=dtot+hi_urb1D(ilu)
enddo
do ilu=1,nz_um
if (hi_urb1D(ilu)<0.) then
! write(*,*) 'WARNING, HI_URB1D(ilu) < 0 IN BEP_BEM'
go to 20
endif
enddo
if (dtot.gt.0.) then
continue
else
! write(*,*) 'WARNING, HI_URB1D <= 0 IN BEP_BEM'
go to 20
endif
do ilu=1,nz_um
hi_urb1D(ilu)=hi_urb1D(ilu)/dtot
enddo
hb_u(1)=dz_u
do ilu=2,nz_um
hb_u(ilu)=dz_u+hb_u(ilu-1)
enddo
! Compute pb and ss
hbmax=0.
do ilu=1,nz_um
if (hi_urb1D(ilu)>0.and.hi_urb1D(ilu)<=1.) then
hbmax=hb_u(ilu)
endif
enddo
do iz_u=1,nz_um-1
if(z_u(iz_u+1).gt.hbmax)go to 10
enddo
10 continue
nzu=iz_u+1
if ((nzu+1).gt.nz_um) then
write(*,*) 'error, nz_um has to be increased to at least',nzu+1
stop
endif
do iz_u=1,nzu
ss_u(iz_u,iurb)=0.
do ilu=1,nz_um
if(z_u(iz_u).le.hb_u(ilu) &
.and.z_u(iz_u+1).gt.hb_u(ilu))then
ss_u(iz_u,iurb)=ss_u(iz_u,iurb)+hi_urb1D(ilu)
endif
enddo
enddo
pb_u(1)=1.
do iz_u=1,nzu
pb_u(iz_u+1)=max(0.,pb_u(iz_u)-ss_u(iz_u,iurb))
enddo
20 continue
return
end subroutine icBEPHI_XY
!====================================================================72
!====================================================================72
END MODULE module_sf_bep_bem