MODULE module_sf_bep 2 !USE module_model_constants USE module_sf_urban ! 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) real dz_u ! Urban grid resolution parameter (dz_u=5.) ! 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 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) ! ----------------------------------------------------------------------- CONTAINS subroutine BEP(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, & 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, & 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 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 ! integer nx,ny,nz ! Number of points in the mesocsale grid real z(ims:ime,kms:kme,jms:jme) ! Vertical coordinates REAL, INTENT(IN ):: DT ! Time step ! real zr(ims:ime,jms:jme) ! Solar zenith angle ! real deltar(ims:ime,jms:jme) ! Declination of the sun ! real ah(ims:ime,jms:jme) ! Hour angle ! real rs(ims:ime,jms:jme) ! Solar radiation !------------------------------------------------------------------------ ! Output !------------------------------------------------------------------------ ! real tsk(ims:ime,jms:jme) ! Average of surface temperatures (roads and roofs) ! ! 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 hb_u(nz_um) ! Bulding's heights real ss_urb(nz_um) ! 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 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 csr(nwr_u) ! Specific heat of the roof material [J m^3 K^-1] real csw(nwr_u) ! Specific heat of the wall material [J m^3 K^-1] real alag(ng_u) ! Ground thermal diffusivity [m^2 s^-1] real alaw(nwr_u) ! Wall thermal diffusivity [m^2 s^-1] real alar(nwr_u) ! Roof thermal diffusivity [m^2 s^-1] ! ! for twini_u, and trini_u the initial value at the deepest level is kept constant during the simulation ! ! 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 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 radation. 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 ! Roughness parameters real z0(ndm,nz_um) ! Roughness lengths "profiles" ! 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 ! ! Street parameters ! real bs(ndm) ! Building width real ws(ndm) ! Street width real drst(ndm) ! street directions real strd(ndm) ! Street lengths 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 ! Grid parameters integer nz_u(nurbm) ! Number of layer in the urban grid real z_u(nz_um) ! Height of the urban grid levels ! 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) ! 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 real sfw1D(2*ndm,nz_um) ! 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_e1D(kms:kme) ! Explicit component of the TKE 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(nz_um,nwr_u,ndm) integer ind_gd(ng_u,ndm) integer ind_zd(nz_um,ndm) ! integer ix,iy,iz,iurb,id,iz_u,iw,ig,ir,ix1,iy1,k integer it, nint integer iii real time_h,tempo 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 !------------------------------------------------------------------------ ! Calculation of the momentum, heat and turbulent kinetic fluxes ! produced by builgings ! ! Reference: ! Martilli, A., Clappier, A., Rotach, M.W.:2002, 'AN URBAN SURFACE EXCHANGE ! PARAMETERISATION FOR MESOSCALE MODELS', Boundary-Layer Meteorolgy 104: ! 261-304 !------------------------------------------------------------------------ !prepare the arrays to collapse indexes if(num_urban_layers.lt.nz_um*ndm*nwr_u)then write(*,*)'num_urban_layers too small, please increase to at least ', nz_um*ndm*nwr_u stop endif iii=0 do iz_u=1,nz_um do iw=1,nwr_u do id=1,ndm iii=iii+1 ind_zwd(iz_u,iw,id)=iii 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 iz_u=1,nz_um do id=1,ndm iii=iii+1 ind_zd(iz_u,id)=iii enddo enddo 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 !iz do iz_u=1,num_urban_hi hi_urb(ix,iz_u,iy)= hi_urb2d(ix,iz_u,iy) enddo !iz_u 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,emg_u,emw_u,& emr_u,z0g_u,z0r_u,nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b) ! Initialisation of the urban parameters and calculation of the view factors 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(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,bs_u,bs,z0g_u,z0r_u,z0, & strd_u,strd,drst_u,drst,ss_u,ss_urb,ss,pb_u, & pb_urb,pb,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) 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) 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_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 ! 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)) if(ind_zwd(iz_u,iw,id).gt.num_urban_layers)write(*,*)'ind_zwd too big w',ind_zwd(iz_u,iw,id) tw1D(2*id-1,iz_u,iw)=tw1_urb4d(ix,ind_zwd(iz_u,iw,id),iy) tw1D(2*id,iz_u,iw)=tw2_urb4d(ix,ind_zwd(iz_u,iw,id),iy) 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)) if(ind_zwd(iz_u,ir,id).gt.num_urban_layers)write(*,*)'ind_zwd too big r',ind_zwd(iz_u,ir,id) tr1D(id,iz_u,ir)=trb_urb4d(ix,ind_zwd(iz_u,ir,id),iy) enddo enddo enddo do id=1,ndm do iz=1,nz_um ! 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)=sfw1_urb3d(ix,ind_zd(iz,id),iy) sfw1D(2*id,iz)=sfw2_urb3d(ix,ind_zd(iz,id),iy) 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_zd(iz,id),iy) enddo enddo rs1D=swdown(ix,iy) rld1D=glw(ix,iy) time_h=(itimestep*dt)/3600.+gmt zr1D=acos(COSZ_URB2D(ix,iy)) deltar1D=DECLIN_URB ah1D=OMG_URB2D(ix,iy) ! call angle(xlong(ix,iy),xlat(ix,iy),julday,time_h,zr1D,deltar1D,ah1D) ! write(*,*) 'entro en BEP1D' call BEP1D(iurb,kms,kme,kts,kte,z1D,dt,ua1D,va1D,pt1D,da1D,pr1D,pt01D, & zr1D,deltar1D,ah1D,rs1D,rld1D, & alag,alaw,alar,csg,csw,csr, & albg_u(iurb),albw_u(iurb),albr_u(iurb), & emg_u(iurb),emw_u(iurb),emr_u(iurb), & fww_u,fwg_u,fgw_u,fsw_u, & fws_u,fsg_u,z0, & nd_u(iurb),strd,drst,ws,bs,ss,pb, & nzurban(iurb),z_u, & tw1D,tg1D,tr1D,sfw1D,sfg1D,sfr1D, & a_u1D,a_v1D,a_t1D,a_e1D, & b_u1D,b_v1D,b_t1D,b_e1D, & dlg1D,dl_u1D,sf1D,vl1D,rl_up(ix,iy), & rs_abs(ix,iy),emiss(ix,iy),grdflx_urb(ix,iy)) ! write(*,*) 'salgo de BEP1D' do id=1,ndm do iz=1,nz_um sfw1_urb3d(ix,ind_zd(iz,id),iy)=sfw1D(2*id-1,iz) sfw2_urb3d(ix,ind_zd(iz,id),iy)=sfw1D(2*id,iz) 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_zd(iz,id),iy)=sfr1D(id,iz) enddo enddo ! do id=1,ndm do iz_u=1,nz_um do iw=1,nwr_u tw1_urb4d(ix,ind_zwd(iz_u,iw,id),iy)=tw1D(2*id-1,iz_u,iw) tw2_urb4d(ix,ind_zwd(iz_u,iw,id),iy)=tw1D(2*id,iz_u,iw) 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_zwd(iz_u,ir,id),iy)=tr1D(id,iz_u,ir) enddo enddo enddo 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) b_e(ix,iz,iy)=b_e1D(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 return end subroutine BEP ! ===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, & alag,alaw,alar,csg,csw,csr, & albg,albw,albr,emg,emw,emr, & fww,fwg,fgw,fsw,fws,fsg,z0, & ndu,strd,drst,ws,bs,ss,pb, & nzu,z_u, & tw,tg,tr,sfw,sfg,sfr, & a_u,a_v,a_t,a_e, & b_u,b_v,b_t,b_e, & dlg,dl_u,sf,vl,rl_up,rs_abs,emiss,grdflx_urb) ! ---------------------------------------------------------------------- ! 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 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 ! Building parameters real alag(ng_u) ! Ground thermal diffusivity [m^2 s^-1] real alaw(nwr_u) ! Wall thermal diffusivity [m^2 s^-1] real alar(nwr_u) ! Roof thermal diffusivity [m^2 s^-1] 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 [J m^3 K^-1] real csr(nwr_u) ! Specific heat of the roof material [J m^3 K^-1] ! Radiation parameters real albg ! Albedo of the ground real albw ! Albedo of the wall real albr ! Albedo of the roof 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 ! Roughness parameters real z0(ndm,nz_um) ! Roughness lengths "profiles" ! Street parameters integer ndu ! Number of street direction for each urban class real strd(ndm) ! Street length (set to a greater value then the horizontal length of the cells) real drst(ndm) ! Street direction real ws(ndm) ! Street width real bs(ndm) ! Building width real ss(nz_um) ! The probability that a building has an height equal to "z" real pb(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 real z_u(nz_um) ! Height of the urban grid levels ! ---------------------------------------------------------------------- ! 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) ! 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) ! 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) ! 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_e(kms:kme) ! Explicit component of the TKE 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 ! 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) ! 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 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 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 integer iz,id integer iw,ix,iy ! ---------------------------------------------------------------------- ! END VARIABLES DEFINITIONS ! ---------------------------------------------------------------------- ! Fix some usefull parameters for the computation of the sources or sinks 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) ! Compute the modification of the radiation due to the buildings call modif_rad(iurb,ndu,nzu,z_u,ws, & drst,strd,ss,pb, & tw,tg,albg,albw,emw,emg, & 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,emw,albw,rlw,rsw,sfw, & tr,emr,albr,rld,rs,sfr, & rs_abs,rl_up,emiss,grdflx_urb) ! Compute the surface temperatures call surf_temp(nzu,ndu,pr_u,dt,ss, & rs,rld,rsg,rlg,rsw,rlw, & tg,alag,csg,emg,albg,ptg,sfg,gfg, & tr,alar,csr,emr,albr,ptr,sfr,gfr, & tw,alaw,csw,emw,albw,ptw,sfw,gfw) ! Compute the implicit and explicit components of the sources or sinks on the "urban grid" call buildings(ndu,nzu,z0,ua_u,va_u, & pt_u,pt0_u,ptg,ptr,da_u,ptw,drst, & uva_u,vva_u,uvb_u,vvb_u,tva_u,tvb_u,evb_u, & uhb_u,vhb_u,thb_u,ehb_u,ss,dt) ! 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. ! ! do id=1,ndu sfg(id)=-da_u(1)*cp_u*thb_u(id,1) do iz=2,nzu sfr(id,iz)=-da_u(iz)*cp_u*thb_u(id,iz) enddo do iz=1,nzu sfw(2*id-1,iz)=-da_u(iz)*cp_u*(tvb_u(2*id-1,iz)+ & tva_u(2*id-1,iz)*pt_u(iz)) sfw(2*id,iz)=-da_u(iz)*cp_u*(tvb_u(2*id,iz)+ & tva_u(2*id,iz)*pt_u(iz)) enddo enddo ! 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,emw,albw,rlw,rsw,sfw, & !! tr,emr,albr,rld,rs,sfr, & !! rs_abs,rl_up,emiss,grdflx_urb) ! 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, & a_u,a_v,a_t,a_e,b_u,b_v,b_t,b_e) ! computation of the mean road temperature tsk (this value could be used ! to replace the surface temperature in the radiation routines, if needed). ! 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,bs_u,bs,z0g_u,z0r_u,z0, & strd_u,strd,drst_u,drst,ss_u,ss_urb,ss,pb_u, & pb_urb,pb,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 nzurb ! Number of vertical urban levels in the current class integer ndu ! Number of street direction for the current urban 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 ss_urb(nz_um) ! The probability that a building has an height equal to "z" real pb_urb(nz_um) ! 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 alar(nwr_u) ! Roof thermal diffusivity at each roof levels real alaw(nwr_u) ! Wall thermal diffusivity at each wall levels real csg(ng_u) ! Specific heat of the ground material at each ground levels 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 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 equal integer nzurban ! ---------------------------------------------------------------------- ! LOCAL: ! ---------------------------------------------------------------------- integer id,ig,ir,iw,iz,ihu ! ---------------------------------------------------------------------- ! END VARIABLES DEFINITIONS ! ---------------------------------------------------------------------- ! !Initialize ! ss=0. pb=0. csg=0. alag=0. csr=0. alar=0. csw=0. alaw=0. z0=0. ws=0. bs=0. strd=0. drst=0. nzurban=0 ihu=0 do iz=1,nz_um if (ss_urb(iz)/=0.) then ihu=1 exit else continue endif enddo if (ihu==1) then do iz=1,nzurb+1 ss(iz)=ss_urb(iz) 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) end do nzurban=nzu endif do id=1,ndu z0(id,1)=z0g_u(iurb) do iz=2,nzurban+1 z0(id,iz)=z0r_u(iurb) enddo enddo do ig=1,ng_u csg(ig)=csg_u(iurb) alag(ig)=alag_u(iurb) enddo do ir=1,nwr_u csr(ir)=csr_u(iurb) alar(ir)=alar_u(iurb) enddo do iw=1,nwr_u csw(iw)=csw_u(iurb) alaw(iw)=alaw_u(iurb) 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) 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) else ws(id)=ws_u(id,iurb) bs(id)=bs_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) 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) bs(id)=bs_u(id,iurb) ws(id)=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 modif_rad(iurb,nd,nz_u,z,ws,drst,strd,ss,pb, & 2,6 tw,tg,albg,albw,emw,emg, & 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,nwr_u) ! 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 ! ---------------------------------------------------------------------- ! 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, & fwg,fww,fgw,fsw,fsg,tg,tw,rlg,rlw,rl,pb) call short_rad(iurb,nz_u,id,albw,albg,fwg,fww,fgw,rsg,rsw,pb) enddo return end subroutine modif_rad ! ===6=8===============================================================72 ! ===6=8===============================================================72 subroutine surf_temp(nz_u,nd,pr,dt,ss,rs,rl,rsg,rlg,rsw,rlw, & 2,5 tg,alag,csg,emg,albg,ptg,sfg,gfg, & tr,alar,csr,emr,albr,ptr,sfr,gfr, & tw,alaw,csw,emw,albw,ptw,sfw,gfw) ! ---------------------------------------------------------------------- ! Computation of the surface temperatures for walls, ground and roofs ! ---------------------------------------------------------------------- implicit none ! ---------------------------------------------------------------------- ! INPUT: ! ---------------------------------------------------------------------- integer nz_u ! Number of vertical layers defined in the urban grid 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 alar(nwr_u) ! Roof thermal diffusivity for the current urban class [m^2 s^-1] real alaw(nwr_u) ! Wall thermal diffusivity for the current urban class [m^2 s^-1] real albg ! Albedo of the ground for the current urban class real albr ! Albedo of the roof for the current urban class real albw ! Albedo of the wall 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 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 dt ! Time step real emg ! Emissivity of ground for the current urban class real emr ! Emissivity of roof for the current urban class real emw ! Emissivity of wall for the current urban class real pr(nz_um) ! Air pressure real rs ! Solar radiation real rl ! Downward flux of the longwave radiation 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 real sfg(ndm) ! Sensible heat flux from ground (road) real sfr(ndm,nz_um) ! Sensible heat flux from roofs real sfw(2*ndm,nz_um) ! Sensible heat flux from walls real gfg(ndm) ! Heat flux transferred from the surface of the ground (road) toward the interior real gfr(ndm,nz_um) ! Heat flux transferred from the surface of the roof toward the interior real gfw(2*ndm,nz_um) ! Heat flux transfered from the surface of the walls toward the interior real ss(nz_um) ! Probability to have a building with height h real tg(ndm,ng_u) ! Temperature in each layer of the ground [K] real tr(ndm,nz_um,nwr_u) ! Temperature in each layer of the roof [K] real tw(2*ndm,nz_um,nwr_u) ! Temperature in each layer of the wall [K] ! ---------------------------------------------------------------------- ! OUTPUT: ! ---------------------------------------------------------------------- real ptg(ndm) ! Ground potential temperatures real ptr(ndm,nz_um) ! Roof potential temperatures real ptw(2*ndm,nz_um) ! Walls potential temperatures ! ---------------------------------------------------------------------- ! LOCAL: ! ---------------------------------------------------------------------- integer id,ig,ir,iw,iz real rtg(ndm) ! Total radiation at ground(road) surface (solar+incoming long+outgoing long) real rtr(ndm,nz_um) ! Total radiation at roof surface (solar+incoming long+outgoing long) real rtw(2*ndm,nz_um) ! Radiation at walls surface (solar+incoming long+outgoing long) real tg_tmp(ng_u) real tr_tmp(nwr_u) real tw_tmp(nwr_u) real dzg_u(ng_u) ! Layer sizes in the ground real dzr_u(nwr_u) ! Layers sizes in the roof real dzw_u(nwr_u) ! Layer sizes in the wall data dzg_u /0.2,0.12,0.08,0.05,0.03,0.02,0.02,0.01,0.005,0.0025/ data dzr_u /0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.01,0.005,0.0025/ data dzw_u /0.02,0.02,0.02,0.02,0.02,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 ! Calculation for the roofs surfaces do iz=2,nz_u if(ss(iz).gt.0.)then do ir=1,nwr_u tr_tmp(ir)=tr(id,iz,ir) end do call soil_temp(nwr_u,dzr_u,tr_tmp,ptr(id,iz), & alar,csr,rs,rl,pr(iz),dt,emr,albr, & rtr(id,iz),sfr(id,iz),gfr(id,iz)) do ir=1,nwr_u tr(id,iz,ir)=tr_tmp(ir) end do end if end do !iz ! Calculation for the walls surfaces do iz=1,nz_u do iw=1,nwr_u tw_tmp(iw)=tw(2*id-1,iz,iw) end do call soil_temp(nwr_u,dzw_u,tw_tmp,ptw(2*id-1,iz),alaw, & csw, & rsw(2*id-1,iz),rlw(2*id-1,iz), & pr(iz),dt,emw, & albw,rtw(2*id-1,iz),sfw(2*id-1,iz),gfw(2*id-1,iz)) do iw=1,nwr_u tw(2*id-1,iz,iw)=tw_tmp(iw) end do do iw=1,nwr_u tw_tmp(iw)=tw(2*id,iz,iw) end do call soil_temp(nwr_u,dzw_u,tw_tmp,ptw(2*id,iz),alaw, & csw, & rsw(2*id,iz),rlw(2*id,iz), & pr(iz),dt,emw, & albw,rtw(2*id,iz),sfw(2*id,iz),gfw(2*id,iz)) do iw=1,nwr_u tw(2*id,iz,iw)=tw_tmp(iw) end do end do !iz end do !id return end subroutine surf_temp ! ===6=8===============================================================72 ! ===6=8===============================================================72 subroutine buildings(nd,nz,z0,ua_u,va_u,pt_u,pt0_u, & 2,8 ptg,ptr,da_u,ptw, & drst,uva_u,vva_u,uvb_u,vvb_u, & tva_u,tvb_u,evb_u, & uhb_u,vhb_u,thb_u,ehb_u,ss,dt) ! ---------------------------------------------------------------------- ! 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) ! Walls potential temperatures real ss(nz_um) ! probability to have a building with height h real z0(ndm,nz_um) ! Roughness lengths "profiles" real dt ! time step ! ---------------------------------------------------------------------- ! 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 ! ---------------------------------------------------------------------- ! LOCAL: ! ---------------------------------------------------------------------- integer id,iz ! ---------------------------------------------------------------------- ! END VARIABLES DEFINITIONS ! ---------------------------------------------------------------------- dz=dz_u 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),thb_u(id,1),ehb_u(id,1)) ! 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),thb_u(id,iz),ehb_u(id,iz)) 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 iz=1,nz call flux_wall(ua_u(iz),va_u(iz),pt_u(iz),da_u(iz), & ptw(2*id-1,iz), & uva_u(2*id-1,iz),vva_u(2*id-1,iz), & uvb_u(2*id-1,iz),vvb_u(2*id-1,iz), & tva_u(2*id-1,iz),tvb_u(2*id-1,iz), & evb_u(2*id-1,iz),drst(id),dt) call flux_wall(ua_u(iz),va_u(iz),pt_u(iz),da_u(iz), & ptw(2*id,iz), & uva_u(2*id,iz),vva_u(2*id,iz), & uvb_u(2*id,iz),vvb_u(2*id,iz), & tva_u(2*id,iz),tvb_u(2*id,iz), & evb_u(2*id,iz),drst(id),dt) ! end do end do 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, & a_u,a_v,a_t,a_e,b_u,b_v,b_t,b_e) ! ---------------------------------------------------------------------- ! 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 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 ! ---------------------------------------------------------------------- ! 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_e(kms:kme) ! Explicit component of the TKE sources or sinks ! ---------------------------------------------------------------------- ! LOCAL: ! ---------------------------------------------------------------------- real dzz real fact integer id,iz,iz_u real se,sr,st,su,sv real uet(kms:kme) ! Contribution to TKE due to walls real veb,vta,vtb,vte,vtot,vua,vub,vva,vvb ! ---------------------------------------------------------------------- ! 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. uet(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)) do iz=kts,kte st=0. su=0. sv=0. se=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)) 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 enddo enddo ! vertical surface impact do iz=kts,kte uet(iz)=0. do id=1,nd vtb=0. vta=0. vua=0. vub=0. vva=0. vvb=0. veb=0. vte=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 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 enddo fact=1./vl(iz)/dz(iz)/nd b_t(iz)=b_t(iz)+vtb*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 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, & 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,nwr_u) ! Temperature in each layer of the wall [K] ! ---------------------------------------------------------------------- ! 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)*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)*emw*sigma*fww(j,i,id,iurb)* & tw(2*id,j,nwr_u)**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)*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)*emw*sigma*fww(j,i-nz_u,id,iurb)* & tw(2*id-1,j,nwr_u)**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)*fwg(j,id,iurb)*pb(j+1) enddo do j=nz_u+1,2*nz_u aaa(2*nz_u+1,j)=-(1.-emw)*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)+emw*sigma*fwg(i,id,iurb)*pb(i+1)* & (tw(2*id-1,i,nwr_u)**4+tw(2*id,i,nwr_u)**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,uva,vva,uvb,vvb, & 4 tva,tvb,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 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 ! LOCAL: ! ----- real hc 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 hc=5.678*(1.09+0.23*(vett/0.3048)) if(hc.gt.da*cp_u/dt)then hc=da*cp_u/dt endif ! tvb=hc*ptw/da/cp_u ! tva=-hc/da/cp_u !!!!!!!!!!!!!!!!!!!! ! explicit tvb=hc*ptw/da/cp_u-hc/da/cp_u*pt !c tva = 0. !c 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,thb,ehb) ! ---------------------------------------------------------------------- ! Calculation of the flux at the ground ! Formulation of Louis (Louis, 1979) ! ---------------------------------------------------------------------- implicit none ! ---------------------------------------------------------------------- ! INPUT: ! ---------------------------------------------------------------------- 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 ! ---------------------------------------------------------------------- ! 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 ! ---------------------------------------------------------------------- ! 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 thb=-ustar*tstar ! 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 ! z_u=0. nz_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,emg_u,emw_u,& emr_u,z0g_u,z0r_u,nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b) ! 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 emg_u(nurbm) ! Emissivity of ground real emw_u(nurbm) ! Emissivity of wall real emr_u(nurbm) ! Emissivity of roof ! 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 ! !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 do iu=1,icate if(ndm.lt.nd_u(iu))then write(*,*)'ndm too small in module_sf_bep, 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 return END SUBROUTINE init_para !============================================================== !============================================================== subroutine angle(along,alat,day,realt,zr,deltar,ah) ! ---------------- ! ! Computation of the solar angles ! schayes (1982,atm. env. , p1407) ! Inputs !======================== ! along=longitud ! alat=latitude ! day=julian day (from the beginning of the year) ! realt= time GMT in hours ! Outputs !============================ ! zr=solar zenith angle ! deltar=declination angle ! ah=hour angle !=============================== implicit none real along,alat, realt, zr, deltar, ah, arg real rad,om,radh,initt, pii, drad, alongt, cphi, sphi real c1, c2, c3, s1, s2, s3, delta, rmsr2, cd, sid real et, ahor, chor, coznt integer day data rad,om,radh,initt/0.0174533,0.0172142,0.26179939,0/ zr=0. deltar=0. ah=0. pii = 3.14159265358979312 drad = pii/180. alongt=along/15. cphi=cos(alat*drad) sphi=sin(alat*drad) ! ! declination ! arg=om*day c1=cos(arg) c2=cos(2.*arg) c3=cos(3.*arg) s1=sin(arg) s2=sin(2.*arg) s3=sin(3.*arg) delta=0.33281-22.984*c1-0.3499*c2-0.1398*c3+3.7872*s1+0.03205*s2+0.07187*s3 rmsr2=(1./(1.-0.01673*c1))**2 deltar=delta*rad cd=cos(deltar) sid=sin(deltar) ! ! time equation in hours ! et=0.0072*c1-0.0528*c2-0.0012*c3-0.1229*s1-0.1565*s2-0.0041*s3 ! ! ! hour angle ! ! ifh=0 ! ahor=realt-12.+ifh+et+alongt ahor=realt-12.+et+alongt ah=ahor*radh chor=cos(ah) ! ! zenith angle ! coznt=sphi*sid+cphi*cd*chor zr=acos(coznt) return END SUBROUTINE angle ! !====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,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,nwr_u) ! 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 !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 if(tw(2*id-1,iz,iw).lt.100.) then write(*,*)'in upward_rad ',iz,id,iw,tw(2*id-1,iz,iw) iwrong=0 endif if(tw(2*id,iz,iw).lt.100.) then write(*,*)'in upward_rad ',iz,id,iw,tw(2*id,iz,iw) iwrong=0 endif enddo enddo enddo do id=1,ndu do iw=1,ng_u if(tg(id,iw).lt.100.) then write(*,*)'in upward_rad ',id,iw,tg(id,iw) iwrong=0 endif 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*sigma*( tw(2*id-1,iz,nwr_u)**4.+tw(2*id,iz,nwr_u)**4. )+ & (1-emw_u)*( 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)*( 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,nwr_u)**4.+tw(2*id,iz,nwr_u)**4. )+(sfw(2*id-1,iz)+sfw(2*id,iz)) grdflx_urb=grdflx_urb-gfl*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=8===============================================================72 ! ===6=8===============================================================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 ! ===6=8===============================================================72 ! ===6=8===============================================================72 subroutine icBEPHI_XY(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 ! ! Grid parameters ! real z_u(nz_um) ! Height of the urban grid levels ! ----------------------------------------------------------------------- ! Output !------------------------------------------------------------------------ real ss_u(nz_um) ! 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' go to 20 endif enddo if (dtot.gt.0.) then continue else ! write(*,*) 'WARNING, HI_URB1D <= 0 IN BEP' 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)=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)=ss_u(iz_u)+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)) enddo 20 continue return end subroutine icBEPHI_XY ! ===6=8===============================================================72 ! ===6=8===============================================================72 END MODULE module_sf_bep