<p><b>laura@ucar.edu</b> 2011-01-13 16:30:40 -0700 (Thu, 13 Jan 2011)</p><p>One more for Noah Land Surface Model<br>
</p><hr noshade><pre><font color="gray">Added: branches/atmos_physics/src/core_physics/physics_wrf/module_sf_bep_bem.F
===================================================================
--- branches/atmos_physics/src/core_physics/physics_wrf/module_sf_bep_bem.F                                (rev 0)
+++ branches/atmos_physics/src/core_physics/physics_wrf/module_sf_bep_bem.F        2011-01-13 23:30:40 UTC (rev 686)
@@ -0,0 +1,4101 @@
+MODULE module_sf_bep_bem
+
+!USE module_model_constants
+ USE module_sf_urban
+ USE module_sf_bem
+
+! SGClarke 09/11/2008
+! Access urban_param.tbl values through calling urban_param_init in module_physics_init
+! for CASE (BEPSCHEME) select sf_urban_physics
+!
+! -----------------------------------------------------------------------
+!  Dimension for the array used in the BEP module
+! -----------------------------------------------------------------------
+
+      integer nurbm           ! Maximum number of urban classes    
+      parameter (nurbm=3)
+
+      integer ndm             ! Maximum number of street directions 
+      parameter (ndm=2)
+
+      integer nz_um           ! Maximum number of vertical levels in the urban grid
+      parameter(nz_um=13)
+
+      integer ng_u            ! Number of grid levels in the ground
+      parameter (ng_u=10)
+      integer nwr_u            ! Number of grid levels in the walls or roofs
+      parameter (nwr_u=10)
+
+      integer nf_u             !Number of grid levels in the floors (BEM)
+      parameter (nf_u=10)
+
+      integer ngb_u            !Number of grid levels in the ground below building (BEM)
+      parameter (ngb_u=10)
+
+      real dz_u                ! Urban grid resolution
+      parameter (dz_u=5.) 
+
+      integer nbui_max         !maximum number of types of buildings in an urban class
+      parameter (nbui_max=4)   !must be less or equal than nz_um 
+
+!---------------------------------------------------------------------------------
+!Parameters of the windows. The glasses of windows are considered without films  -
+!Read the paper of J.Karlsson and A.Roos(2000):&quot;modelling the angular behaviour  -
+!of the total solar energy transmittance of windows&quot;.Solar Energy Vol.69,No.4,   -
+!pp. 321-329, for more details.                                                  -
+!---------------------------------------------------------------------------------
+      integer p_num            !number of panes in the windows (1,2 or 3)
+      parameter (p_num=2)
+      integer q_num            !category number for the windows (q_num= 4, standard glasses)
+      parameter(q_num=4)       !Possible values 1,2,...,10
+
+
+! The change of ng_u, nwr_u should be done in agreement with the block data
+!  in the routine &quot;surf_temp&quot; 
+! -----------------------------------------------------------------------
+!  Constant used in the BEP module
+! -----------------------------------------------------------------------
+           
+      real vk                 ! von Karman constant
+      real g_u                ! Gravity acceleration
+      real pi                 !
+      real r                  ! Perfect gas constant
+      real cp_u               ! Specific heat at constant pressure
+      real rcp_u              !
+      real sigma              !
+      real p0                 ! Reference pressure at the sea level
+      real cdrag              ! Drag force constant
+      real latent             ! Latent heat of vaporization [J/kg] (used in BEM)
+      parameter(vk=0.40,g_u=9.81,pi=3.141592653,r=287.,cp_u=1004.)        
+      parameter(rcp_u=r/cp_u,sigma=5.67e-08,p0=1.e+5,cdrag=0.4,latent=2.45e+06)
+
+! -----------------------------------------------------------------------     
+
+
+
+
+   CONTAINS

+      subroutine BEP_BEM(FRC_URB2D,UTYPE_URB2D,itimestep,dz8w,dt,u_phy,v_phy,      &amp;
+                      th_phy,rho,p_phy,swdown,glw,                                 &amp;
+                      gmt,julday,xlong,xlat,                                       &amp;
+                      declin_urb,cosz_urb2d,omg_urb2d,                             &amp;
+                      num_urban_layers,                                            &amp;
+                      trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d,                     &amp;
+                      tlev_urb3d,qlev_urb3d,tw1lev_urb3d,tw2lev_urb3d,             &amp;
+                      tglev_urb3d,tflev_urb3d,sf_ac_urb3d,lf_ac_urb3d,             &amp;
+                      cm_ac_urb3d,sfvent_urb3d,lfvent_urb3d,                       &amp;
+                      sfwin1_urb3d,sfwin2_urb3d,                                   &amp;
+                      sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d,                   &amp;
+                      a_u,a_v,a_t,a_e,b_u,b_v,                                     &amp;
+                      b_t,b_e,b_q,dlg,dl_u,sf,vl,                                  &amp;
+                      rl_up,rs_abs,emiss,grdflx_urb,qv_phy,                        &amp;
+                      ids,ide, jds,jde, kds,kde,                                   &amp;
+                      ims,ime, jms,jme, kms,kme,                                   &amp;
+                      its,ite, jts,jte, kts,kte)                    
+
+      implicit none
+
+!------------------------------------------------------------------------
+!     Input
+!------------------------------------------------------------------------
+   INTEGER ::                       ids,ide, jds,jde, kds,kde,  &amp;
+                                    ims,ime, jms,jme, kms,kme,  &amp;
+                                    its,ite, jts,jte, kts,kte,  &amp;
+                                    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 ),                           &amp;
+         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
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: trb_urb4d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1_urb4d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2_urb4d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tgb_urb4d
+!New variables used for BEM
+   REAL, DIMENSION( ims:ime, kms:kme, jms:jme ):: qv_phy
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tlev_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: qlev_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1lev_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2lev_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tglev_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tflev_urb3d
+   REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lf_ac_urb3d
+   REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sf_ac_urb3d
+   REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: cm_ac_urb3d
+   REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sfvent_urb3d
+   REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lfvent_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin1_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin2_urb3d
+!End variables
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw1_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw2_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfr_urb3d
+   REAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfg_urb3d
+
+   real z(ims:ime,kms:kme,jms:jme)            ! Vertical coordinates
+   REAL, INTENT(IN )::   DT      ! Time step
+
+!      
+!------------------------------------------------------------------------
+!     Output
+!------------------------------------------------------------------------ 
+!
+!    Implicit and explicit components of the source and sink terms at each levels,
+!     the fluxes can be computed as follow: FX = A*X + B   example: t_fluxes = a_t * pt + b_t
+      real a_u(ims:ime,kms:kme,jms:jme)         ! Implicit component for the momemtum in X-direction (center)
+      real a_v(ims:ime,kms:kme,jms:jme)         ! Implicit component for the momemtum in Y-direction (center)
+      real a_t(ims:ime,kms:kme,jms:jme)         ! Implicit component for the temperature
+      real a_e(ims:ime,kms:kme,jms:jme)         ! Implicit component for the TKE
+      real b_u(ims:ime,kms:kme,jms:jme)         ! Explicit component for the momemtum in X-direction (center)
+      real b_v(ims:ime,kms:kme,jms:jme)         ! Explicit component for the momemtum in Y-direction (center)
+      real b_t(ims:ime,kms:kme,jms:jme)         ! Explicit component for the temperature
+      real b_e(ims:ime,kms:kme,jms:jme)         ! Explicit component for the TKE
+      real b_q(ims:ime,kms:kme,jms:jme)         ! Explicit component for the Humidity
+      real dlg(ims:ime,kms:kme,jms:jme)         ! Height above ground (L_ground in formula (24) of the BLM paper). 
+      real dl_u(ims:ime,kms:kme,jms:jme)        ! Length scale (lb in formula (22) ofthe BLM paper).
+! urban surface and volumes        
+      real sf(ims:ime,kms:kme,jms:jme)           ! surface of the urban grid cells
+      real vl(ims:ime,kms:kme,jms:jme)             ! volume of the urban grid cells
+! urban fluxes
+      real rl_up(ims:ime,jms:jme) ! upward long wave radiation
+      real rs_abs(ims:ime,jms:jme) ! absorbed short wave radiation
+      real emiss(ims:ime,jms:jme)  ! emissivity averaged for urban surfaces
+      real grdflx_urb(ims:ime,jms:jme)  ! ground heat flux for urban areas
+!------------------------------------------------------------------------
+!     Local
+!------------------------------------------------------------------------
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!    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
+!
+! for twini_u, and trini_u the initial value at the deepest level is kept constant during the simulation
+!
+!    Radiation paramters
+      real albg_u(nurbm)                      ! Albedo of the ground
+      real albw_u(nurbm)                      ! Albedo of the wall
+      real albr_u(nurbm)                      ! Albedo of the roof
+      real albwin_u(nurbm)                    ! Albedo of the windows
+      real emwind_u(nurbm)                    ! Emissivity of windows
+      real emg_u(nurbm)                       ! Emissivity of ground
+      real emw_u(nurbm)                       ! Emissivity of wall
+      real emr_u(nurbm)                       ! Emissivity of roof
+
+!   fww,fwg,fgw,fsw,fsg are the view factors used to compute the long wave
+!   and the short wave radation. 
+      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 sky to wall
+      real fsg(ndm,nurbm)                     !  from sky to ground
+
+!    Roughness parameters
+      real z0g_u(nurbm)         ! The ground's roughness length
+      real z0r_u(nurbm)         ! The roof's roughness length
+
+!    Street parameters
+      integer nd_u(nurbm)       ! Number of street direction for each urban class 
+      real strd_u(ndm,nurbm)    ! Street length (fix to greater value to the horizontal length of the cells)
+      real drst_u(ndm,nurbm)    ! Street direction
+      real ws_u(ndm,nurbm)      ! Street width
+      real bs_u(ndm,nurbm)      ! Building width
+      real h_b(nz_um,nurbm)     ! Bulding's heights
+      real d_b(nz_um,nurbm)     ! Probability that a building has an height h_b
+      real ss_u(nz_um,nurbm)  ! Probability that a building has an height equal to z
+      real pb_u(nz_um,nurbm)  ! Probability that a building has an height greater or equal to z
+
+
+!    Grid parameters
+      integer nz_u(nurbm)       ! Number of layer in the urban grid
+      
+      real z_u(nz_um)         ! Height of the urban grid levels
+
+!   MT
+      real cop_u(nurbm)
+      real pwin_u(nurbm)
+      real beta_u(nurbm)
+      integer sw_cond_u(nurbm)
+      real time_on_u(nurbm)
+      real time_off_u(nurbm)
+      real targtemp_u(nurbm)
+      real gaptemp_u(nurbm)
+      real targhum_u(nurbm)
+      real gaphum_u(nurbm)
+      real perflo_u(nurbm)
+      real hsesf_u(nurbm)
+      real hsequip(24)
+
+! 1D array used for the input and output of the routine &quot;urban&quot;
+
+      real z1D(kms:kme)               ! vertical coordinates
+      real ua1D(kms:kme)                ! wind speed in the x directions
+      real va1D(kms:kme)                ! wind speed in the y directions
+      real pt1D(kms:kme)                ! potential temperature
+      real da1D(kms:kme)                ! air density
+      real pr1D(kms:kme)                ! air pressure
+      real pt01D(kms:kme)               ! reference potential temperature
+      real zr1D                    ! zenith angle
+      real deltar1D                ! declination of the sun
+      real ah1D                    ! hour angle (it should come from the radiation routine)
+      real rs1D                    ! solar radiation
+      real rld1D                   ! downward flux of the longwave radiation
+
+      real tw1D(2*ndm,nz_um,nwr_u,nbui_max) ! temperature in each layer of the wall
+      real tg1D(ndm,ng_u)                   ! temperature in each layer of the ground
+      real tr1D(ndm,nz_um,nwr_u)   ! temperature in each layer of the roof
+!
+!New variable for BEM
+!
+      real tlev1D(nz_um,nbui_max)            ! temperature in each floor and in each different type of building
+      real qlev1D(nz_um,nbui_max)            ! specific humidity in each floor and in each different type of building
+      real twlev1D(2*ndm,nz_um,nbui_max)     ! temperature in each window in each floor in each different type of building
+      real tglev1D(ndm,ngb_u,nbui_max)       ! temperature in each layer of the ground below of a type of building
+      real tflev1D(ndm,nf_u,nz_um-1,nbui_max)! temperature in each layer of the floors in each building
+      real lflev1D(nz_um,nz_um)           ! latent heat flux due to the air conditioning systems
+      real sflev1D(nz_um,nz_um)           ! sensible heat flux due to the air conditioning systems
+      real lfvlev1D(nz_um,nz_um)          ! latent heat flux due to ventilation
+      real sfvlev1D(nz_um,nz_um)          ! sensible heat flux due to ventilation
+      real sfwin1D(2*ndm,nz_um,nbui_max)     ! sensible heat flux from windows
+      real consumlev1D(nz_um,nz_um)       ! consumption due to the air conditioning systems
+      real qv1D(kms:kme)                  ! specific humidity
+      real meso_urb                       ! constant to link meso and urban scales [m¯2]
+      real d_urb(nz_um)    
+      real sf_ac
+      integer ibui,nbui
+      integer nlev(nz_um)
+!
+!End new variables
+!
+
+      real sfw1D(2*ndm,nz_um,nbui_max)      ! sensible heat flux from walls
+      real sfg1D(ndm)              ! sensible heat flux from ground (road)
+      real sfr1D(ndm,nz_um)      ! sensible heat flux from roofs
+      real sf1D(kms:kme)              ! surface of the urban grid cells
+      real vl1D(kms:kme)                ! volume of the urban grid cells
+      real a_u1D(kms:kme)               ! Implicit component of the momentum sources or sinks in the X-direction
+      real a_v1D(kms:kme)               ! Implicit component of the momentum sources or sinks in the Y-direction
+      real a_t1D(kms:kme)               ! Implicit component of the heat sources or sinks
+      real a_e1D(kms:kme)               ! Implicit component of the TKE sources or sinks
+      real b_u1D(kms:kme)               ! Explicit component of the momentum sources or sinks in the X-direction
+      real b_v1D(kms:kme)               ! Explicit component of the momentum sources or sinks in the Y-direction
+      real b_t1D(kms:kme)               ! Explicit component of the heat sources or sinks
+      real b_ac1D(kms:kme)
+      real b_e1D(kms:kme)               ! Explicit component of the TKE sources or sinks
+      real b_q1D(kms:kme)               ! Explicit component of the Humidity sources or sinks
+      real dlg1D(kms:kme)               ! Height above ground (L_ground in formula (24) of the BLM paper). 
+      real dl_u1D(kms:kme)              ! Length scale (lb in formula (22) ofthe BLM paper)
+      real time_bep
+! arrays used to collapse indexes
+      integer ind_zwd(nbui_max,nz_um,nwr_u,ndm)
+      integer ind_gd(ng_u,ndm)
+      integer ind_zd(nbui_max,nz_um,ndm)
+      integer ind_zdf(nz_um,ndm)
+      integer ind_zrd(nz_um,nwr_u,ndm)
+!
+      integer ind_bd(nbui_max,nz_um)
+      integer ind_wd(nbui_max,nz_um,ndm)
+      integer ind_gbd(nbui_max,ngb_u,ndm)  
+      integer ind_fbd(nbui_max,nf_u,nz_um-1,ndm)
+!
+      integer ix,iy,iz,iurb,id,iz_u,iw,ig,ir,ix1,iy1,k
+      integer it, nint
+      integer iii
+      real 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,                      &amp;
+          albg_u,albw_u,albr_u,emg_u,emw_u,emr_u,fww,fwg,fgw,fsw,fws,fsg, &amp;
+          z0g_u,z0r_u, nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b,ss_u,pb_u,  &amp;
+          nz_u,z_u,albwin_u,emwind_u ,                                  &amp;
+          cop_u, pwin_u, beta_u, sw_cond_u, time_on_u, time_off_u, targtemp_u,  &amp;
+          gaptemp_u, targhum_u, gaphum_u, perflo_u, hsesf_u, hsequip
+
+!------------------------------------------------------------------------
+!    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
+!
+! F. Salamanca and A. Martilli, 2009: 'A new Building Energy Model coupled 
+! with an Urban Canopy Parameterization for urban climate simulations_part II. 
+! Validation with one dimension off-line simulations'. Theor Appl Climatol
+! DOI 10.1007/s00704-009-0143-8 
+!------------------------------------------------------------------------
+!prepare the arrays to collapse indexes
+      if(num_urban_layers.lt.nbui_max*nz_um*ndm*max(nwr_u,ng_u))then
+        write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*nz_um*ndm*max(nwr_u,ng_u)
+        stop
+      endif
+!
+!New conditions for BEM
+!
+      if(num_urban_layers.lt.nbui_max*nz_um)then !limit for indoor temperature and indoor humidity
+        write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*nz_um
+        stop
+      endif
+
+      if(num_urban_layers.lt.nbui_max*nz_um*ndm)then !limit for window temperature
+        write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*nz_um*ndm
+        stop
+      endif
+
+      if(num_urban_layers.lt.nbui_max*ndm*ngb_u)then !limit for ground temperature below a building
+        write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*ndm*ngb_u
+        stop
+      endif
+
+      if(num_urban_layers.lt.(nz_um-1)*nbui_max*ndm*nf_u)then !limit for floor temperature 
+        write(*,*)'num_urban_layers too small, please increase to at least ', nbui_max*ndm*nf_u*(nz_um-1),num_urban_layers
+        stop
+      endif
+
+      if (ndm.ne.2)then
+         write(*,*) 'number of directions is not correct',ndm
+         stop
+      endif
+
+!
+!End of new conditions
+!
+!
+!Initialize collapse indexes
+!
+      ind_zwd=0       
+      ind_gd=0
+      ind_zd=0
+      ind_zdf=0
+      ind_zrd=0
+      ind_bd=0
+      ind_wd=0
+      ind_gbd=0
+      ind_fbd=0
+!
+!End initialization indexes
+!
+
+      iii=0
+      do ibui=1,nbui_max
+      do iz_u=1,nz_um
+      do iw=1,nwr_u
+      do id=1,ndm
+       iii=iii+1
+       ind_zwd(ibui,iz_u,iw,id)=iii
+      enddo
+      enddo
+      enddo
+      enddo
+      
+      iii=0
+      do ig=1,ng_u
+      do id=1,ndm
+       iii=iii+1
+       ind_gd(ig,id)=iii
+      enddo
+      enddo
+      
+      iii=0
+      do ibui=1,nbui_max
+      do iz_u=1,nz_um
+      do id=1,ndm
+       iii=iii+1
+       ind_zd(ibui,iz_u,id)=iii
+      enddo
+      enddo
+      enddo
+      
+      iii=0
+      do iz_u=1,nz_um
+      do iw=1,nwr_u
+      do id=1,ndm
+       iii=iii+1
+       ind_zrd(iz_u,iw,id)=iii
+      enddo
+      enddo
+      enddo
+      
+!
+!New indexes for BEM
+!
+      iii=0
+      do iz_u=1,nz_um
+      do id=1,ndm
+         iii=iii+1
+         ind_zdf(iz_u,id)=iii
+      enddo ! id
+      enddo ! iz_u
+      
+      iii=0
+      do ibui=1,nbui_max  !Type of building
+      do iz_u=1,nz_um     !vertical levels
+         iii=iii+1
+         ind_bd(ibui,iz_u)=iii
+      enddo !iz_u
+      enddo !ibui
+      
+      
+      iii=0
+      do ibui=1,nbui_max !type of building
+      do iz_u=1,nz_um !vertical levels
+      do id=1,ndm !direction
+         iii=iii+1
+         ind_wd(ibui,iz_u,id)=iii
+      enddo !id
+      enddo !iz_u
+      enddo !ibui
+      
+      iii=0
+      do ibui=1,nbui_max!type of building
+      do iw=1,ngb_u !layers in the wall (ground below a building)
+      do id=1,ndm !direction
+         iii=iii+1
+         ind_gbd(ibui,iw,id)=iii  
+      enddo !id
+      enddo !iw 
+      enddo !ibui    
+      
+      iii=0
+      do ibui=1,nbui_max !type of building
+      do iw=1,nf_u !layers in the wall (floor)
+      do iz_u=1,nz_um-1 !vertical levels
+      do id=1,ndm  !direction
+         iii=iii+1
+         ind_fbd(ibui,iw,iz_u,id)=iii
+      enddo !id
+      enddo !iz_u
+      enddo !iw
+      enddo !ibui
+      
+!
+!End of new indexes
+!      
+
+      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
+      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,&amp;
+                twini_u,trini_u,tgini_u,albg_u,albw_u,albr_u,albwin_u,emg_u,emw_u,&amp;
+                emr_u,emwind_u,z0g_u,z0r_u,nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b,&amp;
+                cop_u, pwin_u, beta_u, sw_cond_u, time_on_u, time_off_u, &amp;
+                targtemp_u, gaptemp_u, targhum_u, gaphum_u, perflo_u, hsesf_u, hsequip)
+
+!Initialisation of the urban parameters and calculation of the view factor
+       call icBEP(fww,fwg,fgw,fsw,fws,fsg,                         &amp; 
+                 z0g_u,z0r_u,                                      &amp; 
+                 nd_u,strd_u,ws_u,bs_u,h_b,d_b,ss_u,pb_u,          &amp; 
+                 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)
+         ibui=0
+         nlev=0
+         nbui=0
+         d_urb=0.
+         do iz=1,nz_um                   
+         if(ss_u(iz,iurb).gt.0) then                
+           ibui=ibui+1                                
+           nlev(ibui)=iz-1
+           d_urb(ibui)=ss_u(iz,iurb)
+           nbui=ibui
+         endif          
+         end do  !iz
+         if (nbui.gt.nbui_max) then
+            write (*,*) 'nbui_max must be increased to',nbui
+            stop
+         endif
+
+       do iz= kts,kte
+          ua1D(iz)=u_phy(ix,iz,iy)
+          va1D(iz)=v_phy(ix,iz,iy)
+          pt1D(iz)=th_phy(ix,iz,iy)
+          da1D(iz)=rho(ix,iz,iy)
+          pr1D(iz)=p_phy(ix,iz,iy)
+!          pt01D(iz)=th_phy(ix,iz,iy)
+          pt01D(iz)=300.
+          z1D(iz)=z(ix,iz,iy)
+          qv1D(iz)=qv_phy(ix,iz,iy)
+          a_u1D(iz)=0.
+          a_v1D(iz)=0.
+          a_t1D(iz)=0.
+          a_e1D(iz)=0.
+          b_u1D(iz)=0.
+          b_v1D(iz)=0.
+          b_t1D(iz)=0.
+          b_ac1D(iz)=0.
+          b_e1D(iz)=0.           
+         enddo
+         z1D(kte+1)=z(ix,kte+1,iy)
+
+         do id=1,ndm
+         do iz_u=1,nz_um
+         do iw=1,nwr_u
+         do ibui=1,nbui_max
+          tw1D(2*id-1,iz_u,iw,ibui)=tw1_urb4d(ix,ind_zwd(ibui,iz_u,iw,id),iy)
+          tw1D(2*id,iz_u,iw,ibui)=tw2_urb4d(ix,ind_zwd(ibui,iz_u,iw,id),iy)
+         enddo
+         enddo
+         enddo
+         enddo
+        
+         do id=1,ndm
+          do ig=1,ng_u
+            tg1D(id,ig)=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)=trb_urb4d(ix,ind_zrd(iz_u,ir,id),iy)
+          enddo
+          enddo
+         enddo
+!
+!Initialize variables for BEM
+!
+         tlev1D=0.  !Indoor temperature
+         qlev1D=0.  !Indoor humidity
+
+         twlev1D=0. !Window temperature
+         tglev1D=0. !Ground temperature
+         tflev1D=0. !Floor temperature
+
+         sflev1D=0.    !Sensible heat flux from the a.c.
+         lflev1D=0.    !latent heat flux from the a.c.
+         consumlev1D=0.!consumption of the a.c.
+         sfvlev1D=0.   !Sensible heat flux from natural ventilation
+         lfvlev1D=0.   !Latent heat flux from natural ventilation
+         sfwin1D=0.    !Sensible heat flux from windows
+         sfw1D=0.      !Sensible heat flux from walls         
+
+         do iz_u=1,nz_um    !vertical levels
+         do ibui=1,nbui_max !Type of building
+            tlev1D(iz_u,ibui)= tlev_urb3d(ix,ind_bd(ibui,iz_u),iy)  
+            qlev1D(iz_u,ibui)= qlev_urb3d(ix,ind_bd(ibui,iz_u),iy)  
+         enddo !ibui
+         enddo !iz_u
+
+         do id=1,ndm  !direction
+            do iz_u=1,nz_um !vertical levels
+               do ibui=1,nbui_max !type of building
+                  twlev1D(2*id-1,iz_u,ibui)=tw1lev_urb3d(ix,ind_wd(ibui,iz_u,id),iy)
+                  twlev1D(2*id,iz_u,ibui)=tw2lev_urb3d(ix,ind_wd(ibui,iz_u,id),iy)
+                  sfwin1D(2*id-1,iz_u,ibui)=sfwin1_urb3d(ix,ind_wd(ibui,iz_u,id),iy)
+                  sfwin1D(2*id,iz_u,ibui)=sfwin2_urb3d(ix,ind_wd(ibui,iz_u,id),iy)
+               enddo !ibui  
+            enddo !iz_u
+         enddo !id
+
+         do id=1,ndm !direction
+            do iw=1,ngb_u !layer in the wall
+               do ibui=1,nbui_max !type of building
+                  tglev1D(id,iw,ibui)=tglev_urb3d(ix,ind_gbd(ibui,iw,id),iy)
+               enddo !ibui
+            enddo !iw
+         enddo !id
+       
+         do id=1,ndm !direction
+            do iw=1,nf_u !layer in the walls
+               do iz_u=1,nz_um-1 !verticals levels
+                  do ibui=1,nbui_max !type of building
+                     tflev1D(id,iw,iz_u,ibui)=tflev_urb3d(ix,ind_fbd(ibui,iw,iz_u,id),iy)
+                  enddo !ibui
+               enddo ! iz_u
+             enddo !iw
+         enddo !id
+
+!
+!End initialization for BEM
+!         
+
+         do id=1,ndm
+         do iz=1,nz_um
+         do ibui=1,nbui_max !type of building
+          sfw1D(2*id-1,iz,ibui)=sfw1_urb3d(ix,ind_zd(ibui,iz,id),iy)
+          sfw1D(2*id,iz,ibui)=sfw2_urb3d(ix,ind_zd(ibui,iz,id),iy)
+         enddo
+         enddo
+         enddo
+         
+         do id=1,ndm
+          sfg1D(id)=sfg_urb3d(ix,id,iy)
+         enddo
+         
+         do id=1,ndm
+         do iz=1,nz_um
+          sfr1D(id,iz)=sfr_urb3d(ix,ind_zdf(iz,id),iy)
+         enddo
+         enddo
+         
+         rs1D=swdown(ix,iy)
+         rld1D=glw(ix,iy)
+
+         zr1D=acos(COSZ_URB2D(ix,iy))
+         deltar1D=DECLIN_URB
+         ah1D=OMG_URB2D(ix,iy)       
+
+         call BEP1D(iurb,kms,kme,kts,kte,z1D,dt,ua1D,va1D,pt1D,da1D,pr1D,pt01D,  &amp;
+                   zr1D,deltar1D,ah1D,rs1D,rld1D,                   &amp; 
+                   alag_u,alaw_u,alar_u,csg_u,csw_u,csr_u,          &amp; 
+                   albg_u,albw_u,albr_u,albwin_u,emg_u,emw_u,emr_u, &amp; 
+                   emwind_u,fww,fwg,fgw,fsw,fws,fsg,                &amp; 
+                   z0g_u,z0r_u,                                     &amp; 
+                   nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b,ss_u,pb_u,  &amp; 
+                   nz_u,z_u,                                        &amp; 
+                   cop_u,pwin_u,beta_u,sw_cond_u,time_on_u,         &amp;
+                   time_off_u,targtemp_u,gaptemp_u,targhum_u,       &amp;
+                   gaphum_u, perflo_u, hsesf_u, hsequip,            &amp;
+                   tw1D,tg1D,tr1D,sfw1D,sfg1D,sfr1D,                &amp; 
+                   a_u1D,a_v1D,a_t1D,a_e1D,                         &amp; 
+                   b_u1D,b_v1D,b_t1D,b_ac1D,b_e1D,b_q1D,            &amp; 
+                   dlg1D,dl_u1D,sf1D,vl1D,rl_up(ix,iy),             &amp;
+                   rs_abs(ix,iy),emiss(ix,iy),grdflx_urb(ix,iy),    &amp;
+                   qv1D,tlev1D,qlev1D,sflev1D,lflev1D,consumlev1D,  &amp;
+                   sfvlev1D,lfvlev1D,twlev1D,tglev1D,tflev1D,sfwin1D,&amp;
+                   ix,iy)                            
+
+         do id=1,ndm ! direction 
+            do iz=1,nz_um   !vertical levels
+               do ibui=1,nbui_max !type of building
+                  sfw1_urb3d(ix,ind_zd(ibui,iz,id),iy)=sfw1D(2*id-1,iz,ibui) 
+                  sfw2_urb3d(ix,ind_zd(ibui,iz,id),iy)=sfw1D(2*id,iz,ibui) 
+               enddo
+            enddo
+         enddo
+         do id=1,ndm
+          sfg_urb3d(ix,id,iy)=sfg1D(id) 
+         enddo
+         
+         do id=1,ndm
+         do iz=1,nz_um
+          sfr_urb3d(ix,ind_zdf(iz,id),iy)=sfr1D(id,iz)
+         enddo
+         enddo
+         
+         do id=1,ndm
+         do iz_u=1,nz_um
+         do iw=1,nwr_u
+         do ibui=1,nbui_max
+          tw1_urb4d(ix,ind_zwd(ibui,iz_u,iw,id),iy)=tw1D(2*id-1,iz_u,iw,ibui)
+          tw2_urb4d(ix,ind_zwd(ibui,iz_u,iw,id),iy)=tw1D(2*id,iz_u,iw,ibui)
+         enddo
+         enddo
+         enddo
+         enddo
+         
+         do id=1,ndm
+            do ig=1,ng_u
+               tgb_urb4d(ix,ind_gd(ig,id),iy)=tg1D(id,ig)
+            enddo
+            do iz_u=1,nz_um
+               do ir=1,nwr_u
+                  trb_urb4d(ix,ind_zrd(iz_u,ir,id),iy)=tr1D(id,iz_u,ir)
+               enddo
+            enddo
+         enddo
+!
+!Outputs of BEM
+!
+         do ibui=1,nbui_max !type of building
+         do iz_u=1,nz_um !vertical levels
+            tlev_urb3d(ix,ind_bd(ibui,iz_u),iy)=tlev1D(iz_u,ibui)  
+            qlev_urb3d(ix,ind_bd(ibui,iz_u),iy)=qlev1D(iz_u,ibui)  
+         enddo !iz_u
+         enddo !ibui
+         do id=1,ndm !direction
+         do iz_u=1,nz_um !vertical levels
+         do ibui=1,nbui_max !type of building
+               tw1lev_urb3d(ix,ind_wd(ibui,iz_u,id),iy)=twlev1D(2*id-1,iz_u,ibui)
+               tw2lev_urb3d(ix,ind_wd(ibui,iz_u,id),iy)=twlev1D(2*id,iz_u,ibui)
+               sfwin1_urb3d(ix,ind_wd(ibui,iz_u,id),iy)=sfwin1D(2*id-1,iz_u,ibui)
+               sfwin2_urb3d(ix,ind_wd(ibui,iz_u,id),iy)=sfwin1D(2*id,iz_u,ibui)
+            enddo !ibui  
+         enddo !iz_u
+         enddo !id
+        
+         do id=1,ndm !direction
+            do iw=1,ngb_u !layers in the walls
+               do ibui=1,nbui_max  !type of building
+                  tglev_urb3d(ix,ind_gbd(ibui,iw,id),iy)=tglev1D(id,iw,ibui)
+               enddo !ibui
+            enddo !iw
+         enddo !id
+
+         do id=1,ndm   !direction 
+            do iw=1,nf_u !layer in the walls
+               do iz_u=1,nz_um-1 !verticals levels
+                  do ibui=1,nbui_max  !type of building
+                     tflev_urb3d(ix,ind_fbd(ibui,iw,iz_u,id),iy)=tflev1D(id,iw,iz_u,ibui)
+                  enddo !ibui
+               enddo !iz_u
+             enddo !iw
+         enddo !id
+         sf_ac_urb3d(ix,iy)=0.
+         lf_ac_urb3d(ix,iy)=0.
+         cm_ac_urb3d(ix,iy)=0.
+         sfvent_urb3d(ix,iy)=0.
+         lfvent_urb3d(ix,iy)=0.
+
+         meso_urb=(1./4.)*FRC_URB2D(ix,iy)/((bs_u(1,iurb)+ws_u(1,iurb))*bs_u(2,iurb))+ &amp;
+                  (1./4.)*FRC_URB2D(ix,iy)/((bs_u(2,iurb)+ws_u(2,iurb))*bs_u(1,iurb))
+
+                  
+         ibui=0
+         nlev=0
+         nbui=0
+         d_urb=0.
+         do iz=1,nz_um                   
+         if(ss_u(iz,iurb).gt.0) then                
+           ibui=ibui+1                                
+           nlev(ibui)=iz-1
+           d_urb(ibui)=ss_u(iz,iurb)
+           nbui=ibui
+         endif          
+         end do  !iz
+
+         do ibui=1,nbui       !type of building   
+         do iz_u=1,nlev(ibui) !vertical levels                    
+               sf_ac_urb3d(ix,iy)=sf_ac_urb3d(ix,iy)+meso_urb*d_urb(ibui)*sflev1D(iz_u,ibui)
+               lf_ac_urb3d(ix,iy)=lf_ac_urb3d(ix,iy)+meso_urb*d_urb(ibui)*lflev1D(iz_u,ibui)
+               cm_ac_urb3d(ix,iy)=cm_ac_urb3d(ix,iy)+meso_urb*d_urb(ibui)*consumlev1D(iz_u,ibui)
+               sfvent_urb3d(ix,iy)=sfvent_urb3d(ix,iy)+meso_urb*d_urb(ibui)*sfvlev1D(iz_u,ibui)
+               lfvent_urb3d(ix,iy)=lfvent_urb3d(ix,iy)+meso_urb*d_urb(ibui)*lfvlev1D(iz_u,ibui)            
+         enddo !iz_u
+         enddo !ibui
+!
+!Add the latent heat exchanged throughout the ventilation in the lf_ac_urb3d output variable. 
+!it is only a print variable
+!
+!        lf_ac_urb3d(ix,iy)=lf_ac_urb3d(ix,iy)+lfvent_urb3d(ix,iy)
+!
+
+         lf_ac_urb3d(ix,iy)=lf_ac_urb3d(ix,iy)-lfvent_urb3d(ix,iy)        
+
+!
+!End outputs of bem
+!
+
+        sf_ac=0.
+        do iz= kts,kte
+          sf(ix,iz,iy)=sf1D(iz)
+          vl(ix,iz,iy)=vl1D(iz)
+          a_u(ix,iz,iy)=a_u1D(iz)
+          a_v(ix,iz,iy)=a_v1D(iz)
+          a_t(ix,iz,iy)=a_t1D(iz)
+          a_e(ix,iz,iy)=a_e1D(iz)
+          b_u(ix,iz,iy)=b_u1D(iz)
+          b_v(ix,iz,iy)=b_v1D(iz)
+          b_t(ix,iz,iy)=b_t1D(iz)
+          sf_ac=sf_ac+b_ac1D(iz)*da1D(iz)*cp_u*dz8w(ix,iz,iy)*vl1D(iz)*FRC_URB2D(ix,iy)
+          b_e(ix,iz,iy)=b_e1D(iz)
+          b_q(ix,iz,iy)=b_q1D(iz)
+          dlg(ix,iz,iy)=dlg1D(iz)
+          dl_u(ix,iz,iy)=dl_u1D(iz)
+         enddo
+         sf(ix,kte+1,iy)=sf1D(kte+1)
+
+         endif ! FRC_URB2D
+   
+      enddo  ! iy
+      enddo  ! ix
+
+        time_bep=time_bep+dt
+
+      return
+      end subroutine BEP_BEM
+            
+! ===6=8===============================================================72
+
+      subroutine BEP1D(iurb,kms,kme,kts,kte,z,dt,ua,va,pt,da,pr,pt0,   &amp;  
+                      zr,deltar,ah,rs,rld,                             &amp; 
+                      alag_u,alaw_u,alar_u,csg_u,csw_u,csr_u,          &amp; 
+                      albg_u,albw_u,albr_u,albwin_u,emg_u,emw_u,emr_u, &amp; 
+                      emwind_u,fww,fwg,fgw,fsw,fws,fsg,                &amp; 
+                      z0g_u,z0r_u,                                     &amp; 
+                      nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b,ss_u,pb_u,  &amp; 
+                      nz_u,z_u,                                        &amp; 
+                      cop_u,pwin_u,beta_u,sw_cond_u,time_on_u,         &amp;
+                      time_off_u,targtemp_u,gaptemp_u,targhum_u,       &amp;
+                      gaphum_u, perflo_u, hsesf_u, hsequip,            &amp;
+                      tw,tg,tr,sfw,sfg,sfr,                            &amp; 
+                      a_u,a_v,a_t,a_e,                                 &amp;
+                      b_u,b_v,b_t,b_ac,b_e,b_q,                        &amp; 
+                      dlg,dl_u,sf,vl,rl_up,rs_abs,emiss,grdflx_urb,    &amp;
+                      qv,tlev,qlev,sflev,lflev,consumlev,              &amp;
+                      sfvlev,lfvlev,twlev,tglev,tflev,sfwin,ix,iy)                             
+
+! ----------------------------------------------------------------------
+! This routine computes the effects of buildings on momentum, heat and
+!  TKE (turbulent kinetic energy) sources or sinks and on the mixing length.
+! It provides momentum, heat and TKE sources or sinks at different levels of a
+!  mesoscale grid defined by the altitude of its cell interfaces &quot;z&quot; and
+!  its number of levels &quot;nz&quot;.
+! The meteorological input parameters (wind, temperature, solar radiation)
+!  are specified on the &quot;mesoscale grid&quot;.
+! The inputs concerning the building and street charateristics are defined
+!  on a &quot;urban grid&quot;. The &quot;urban grid&quot; is defined with its number of levels
+!  &quot;nz_u&quot; and its space step &quot;dz_u&quot;.
+! The input parameters are interpolated on the &quot;urban grid&quot;. The sources or sinks
+!  are calculated on the &quot;urban grid&quot;. Finally the sources or sinks are 
+!  interpolated on the &quot;mesoscale grid&quot;.

+
+!  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 &quot;mesoscale grid&quot;
+
+      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 &quot;pt&quot;)
+      real qv(kms:kme)              ! Specific humidity
+      real dt                    ! Time step
+      real zr                    ! Zenith angle
+      real deltar                ! Declination of the sun
+      real ah                    ! Hour angle
+      real rs                    ! Solar radiation
+      real rld                   ! Downward flux of the longwave radiation
+
+! Data relative to the &quot;urban grid&quot;
+
+      integer iurb               ! Current urban class
+
+!    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]
+
+!    Radiation parameters
+      real albg_u(nurbm)         ! Albedo of the ground
+      real albw_u(nurbm)         ! Albedo of the wall
+      real albr_u(nurbm)         ! Albedo of the roof
+      real albwin_u(nurbm)       ! Albedo of the windows
+      real emwind_u(nurbm)       ! Emissivity of windows
+      real emg_u(nurbm)          ! Emissivity of ground
+      real emw_u(nurbm)          ! Emissivity of wall
+      real emr_u(nurbm)          ! Emissivity of roof
+
+!    fww,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 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 (set to a greater value then 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)        ! The probability that a building has an height &quot;h_b&quot;
+      real ss_u(nz_um,nurbm)     ! The probability that a building has an height equal to &quot;z&quot;
+      real pb_u(nz_um,nurbm)     ! The probability that a building has an height greater or equal to &quot;z&quot;
+        
+!    Grid parameters
+      integer nz_u(nurbm)     ! Number of layer in the urban grid
+      real z_u(nz_um)       ! Height of the urban grid levels
+
+!   MT
+      real cop_u(nurbm)
+      real pwin_u(nurbm)
+      real beta_u(nurbm)
+      integer sw_cond_u(nurbm)
+      real time_on_u(nurbm)
+      real time_off_u(nurbm)
+      real targtemp_u(nurbm)
+      real gaptemp_u(nurbm)
+      real targhum_u(nurbm)
+      real gaphum_u(nurbm)
+      real perflo_u(nurbm)
+      real hsesf_u(nurbm)
+      real hsequip(24)
+
+! ----------------------------------------------------------------------
+! INPUT-OUTPUT
+! ----------------------------------------------------------------------
+
+! Data relative to the &quot;urban grid&quot; which should be stored from the current time step to the next one
+
+      real tw(2*ndm,nz_um,nwr_u,nbui_max)  ! Temperature in each layer of the wall [K]
+      real tr(ndm,nz_um,nwr_u)  ! Temperature in each layer of the roof [K]
+      real tg(ndm,ng_u)          ! Temperature in each layer of the ground [K]
+      real sfw(2*ndm,nz_um,nbui_max)      ! Sensible heat flux from walls
+      real sfg(ndm)              ! Sensible heat flux from ground (road)
+      real sfr(ndm,nz_um)      ! Sensible heat flux from roofs
+      real gfg(ndm)             ! Heat flux transferred from the surface of the ground (road) towards the interior
+      real gfr(ndm,nz_um)     ! Heat flux transferred from the surface of the roof towards the interior
+      real gfw(2*ndm,nz_um,nbui_max)     ! Heat flux transfered from the surface of the walls towards the interior
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+
+! Data relative to the &quot;mesoscale grid&quot;
+
+      real sf(kms:kme)             ! Surface of the &quot;mesoscale grid&quot; cells taking into account the buildings
+      real vl(kms:kme)               ! Volume of the &quot;mesoscale grid&quot; cells taking into account the buildings
+     
+!    Implicit and explicit components of the source and sink terms at each levels,
+!     the fluxes can be computed as follow: FX = A*X + B   example: Heat fluxes = a_t * pt + b_t
+      real a_u(kms:kme)              ! Implicit component of the momentum sources or sinks in the X-direction
+      real a_v(kms:kme)              ! Implicit component of the momentum sources or sinks in the Y-direction
+      real a_t(kms:kme)              ! Implicit component of the heat sources or sinks
+      real a_e(kms:kme)              ! Implicit component of the TKE sources or sinks
+      real b_u(kms:kme)              ! Explicit component of the momentum sources or sinks in the X-direction
+      real b_v(kms:kme)              ! Explicit component of the momentum sources or sinks in the Y-direction
+      real b_t(kms:kme)              ! Explicit component of the heat sources or sinks
+      real b_ac(kms:kme)
+      real b_e(kms:kme)              ! Explicit component of the TKE sources or sinks
+      real b_q(kms:kme)              ! Explicit component of the humidity sources or sinks
+      real dlg(kms:kme)              ! Height above ground (L_ground in formula (24) of the BLM paper). 
+      real dl_u(kms:kme)             ! Length scale (lb in formula (22) ofthe BLM paper).
+      
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+
+      real dz(kms:kme)               ! vertical space steps of the &quot;mesoscale grid&quot;
+
+! Data interpolated from the &quot;mesoscale grid&quot; to the &quot;urban grid&quot;
+
+      real ua_u(nz_um)          ! Wind speed in the x direction
+      real va_u(nz_um)          ! Wind speed in the y direction
+      real pt_u(nz_um)          ! Potential temperature
+      real da_u(nz_um)          ! Air density
+      real pt0_u(nz_um)         ! Reference potential temperature
+      real pr_u(nz_um)          ! Air pressure
+      real qv_u(nz_um)          !Specific humidity
+
+! Data defining the building and street charateristics
+
+      real alag(ng_u)           ! Ground thermal diffusivity for the current urban class [m^2 s^-1] 
+      
+      real csg(ng_u)            ! Specific heat of the ground material of the current urban class [J m^3 K^-1]
+      real csr(nwr_u)            ! Specific heat of the roof material for the current urban class [J m^3 K^-1]
+      real csw(nwr_u)            ! Specific heat of the wall material for the current urban class [J m^3 K^-1]
+
+      real z0(ndm,nz_um)      ! Roughness lengths &quot;profiles&quot;
+      real ws(ndm)              ! Street widths of the current urban class
+      real bs(ndm)              ! Building widths of the current urban class
+      real strd(ndm)            ! Street lengths for the current urban class
+      real drst(ndm)            ! Street directions for the current urban class
+      real ss(nz_um)          ! Probability to have a building with height h
+      real pb(nz_um)          ! Probability to have a building with an height equal
+
+! Solar radiation at each level of the &quot;urban grid&quot;
+
+      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 &quot;urban grid&quot;
+
+      real ptg(ndm)             ! Ground potential temperatures 
+      real ptr(ndm,nz_um)     ! Roof potential temperatures 
+      real ptw(2*ndm,nz_um,nbui_max)     ! Walls potential temperatures 
+

+! Explicit and implicit component of the momentum, temperature and TKE sources or sinks on
+! vertical surfaces (walls) ans horizontal surfaces (roofs and street)
+! The fluxes can be computed as follow: Fluxes of X = A*X + B
+! Example: Momentum fluxes on vertical surfaces = uva_u * ua_u + uvb_u
+
+      real uhb_u(ndm,nz_um)   ! U (wind component) Horizontal surfaces, B (explicit) term
+      real uva_u(2*ndm,nz_um)   ! U (wind component)   Vertical surfaces, A (implicit) term
+      real uvb_u(2*ndm,nz_um)   ! U (wind component)   Vertical surfaces, B (explicit) term
+      real vhb_u(ndm,nz_um)   ! V (wind component) Horizontal surfaces, B (explicit) term
+      real vva_u(2*ndm,nz_um)   ! V (wind component)   Vertical surfaces, A (implicit) term
+      real vvb_u(2*ndm,nz_um)   ! V (wind component)   Vertical surfaces, B (explicit) term
+      real thb_u(ndm,nz_um)   ! Temperature        Horizontal surfaces, B (explicit) term
+      real tva_u(2*ndm,nz_um)   ! Temperature          Vertical surfaces, A (implicit) term
+      real tvb_u(2*ndm,nz_um)   ! Temperature          Vertical surfaces, B (explicit) term
+      real tvb_ac(2*ndm,nz_um)
+      real ehb_u(ndm,nz_um)   ! Energy (TKE)       Horizontal surfaces, B (explicit) term
+      real evb_u(2*ndm,nz_um)   ! Energy (TKE)         Vertical surfaces, B (explicit) term
+      real qhb_u(ndm,nz_um)     ! Humidity      Horizontal surfaces, B (explicit) term
+      real qvb_u(2*ndm,nz_um)   ! Humidity      Vertical surfaces, B (explicit) term      
+!
+      real rs_abs ! solar radiation absorbed by urban surfaces 
+      real rl_up ! longwave radiation emitted by urban surface to the atmosphere 
+      real emiss ! mean emissivity of the urban surface
+      real grdflx_urb ! ground heat flux
+      real dt_int ! internal time step
+      integer nt_int ! number of internal time step
+      integer iz,id, it_int
+      integer iw,ix,iy
+
+!---------------------------------------
+!New variables uses in BEM
+!----------------------------------------
+   
+      real tmp_u(nz_um)     !Air Temperature [K]
+
+      real dzw(nwr_u)       !Layer sizes in the walls
+      real dzr(nwr_u)       !Layer sizes in the roofs
+      real dzf(nf_u)        !Layer sizes in the floors
+      real dzgb(ngb_u)      !Layer sizes in the ground below the buildings
+
+      real csgb(ngb_u)      !Specific heat of the ground material below the buildings 
+                            !of the current urban class at each ground levels[J m^3 K^-1]
+      real csf(nf_u)        !Specific heat of the floors materials in the buildings 
+                            !of the current urban class at each levels[J m^3 K^-1]
+      real alar(nwr_u+1)    ! Roof thermal diffusivity for the current urban class [W/m K]
+      real alaw(nwr_u+1)    ! Walls thermal diffusivity for the current urban class [W/m K] 
+      real alaf(nf_u+1)     ! Floor thermal diffusivity at each wall layers [W/m K]     
+      real alagb(ngb_u+1)   ! Ground thermal diffusivity below the building at each wall layer [W/m K] 
+
+      real sfrb(ndm,nbui_max)        ! Sensible heat flux from roofs [W/m²]
+      real gfrb(ndm,nbui_max)        ! Heat flux flowing inside the roofs [W/m²]
+      real sfwb1D(2*ndm,nz_um)    !Sensible heat flux from the walls [W/m²] 
+      real sfwin(2*ndm,nz_um,nbui_max)!Sensible heat flux from windows [W/m²]
+      real sfwinb1D(2*ndm,nz_um)  !Sensible heat flux from windows [W/m²]
+      real gfwb1D(2*ndm,nz_um)    !Heat flux flowing inside the walls [W/m²]
+
+      real qlev(nz_um,nbui_max)      !specific humidity [kg/kg]
+      real qlevb1D(nz_um)         !specific humidity [kg/kg] 
+      real tlev(nz_um,nbui_max)      !Indoor temperature [K]
+      real tlevb1D(nz_um)         !Indoor temperature [K]
+      real twb1D(2*ndm,nwr_u,nz_um)     !Wall temperature in BEM [K]      
+      real twlev(2*ndm,nz_um,nbui_max)     !Window temperature in BEM [K]
+      real twlevb1D(2*ndm,nz_um)        !Window temperature in BEM [K]
+      real tglev(ndm,ngb_u,nbui_max)        !Ground temperature below a building in BEM [K]
+      real tglevb1D(ngb_u)               !Ground temperature below a building in BEM [K]
+      real tflev(ndm,nf_u,nz_um-1,nbui_max)!Floor temperature in BEM[K]
+      real tflevb1D(nf_u,nz_um-1)       !Floor temperature in BEM[K]
+      real trb(ndm,nwr_u,nbui_max)         !Roof temperature in BEM [K]
+      real trb1D(nwr_u)                 !Roof temperature in BEM [K]
+      
+      real sflev(nz_um,nz_um)     ! sensible heat flux due to the air conditioning systems [W]
+      real lflev(nz_um,nz_um)     ! latent heat flux due to the air conditioning systems  [W]
+      real consumlev(nz_um,nz_um) ! consumption due to the air conditioning systems [W]
+      real sflev1D(nz_um)         ! sensible heat flux due to the air conditioning systems [W]
+      real lflev1D(nz_um)         ! latent heat flux due to the air conditioning systems  [W]
+      real consumlev1D(nz_um)     ! consumption due to the air conditioning systems [W]
+      real sfvlev(nz_um,nz_um)    ! sensible heat flux due to ventilation [W]
+      real lfvlev(nz_um,nz_um)    ! latent heat flux due to ventilation [W]
+      real sfvlev1D(nz_um)        ! sensible heat flux due to ventilation [W]
+      real lfvlev1D(nz_um)        ! Latent heat flux due to ventilation [W]
+
+      real ptwin(2*ndm,nz_um,nbui_max)  ! window potential temperature
+      real tw_av(2*ndm,nz_um)        ! Averaged temperature of the wall surfaces
+      real twlev_av(2*ndm,nz_um)     ! Averaged temperature of the windows
+      real sfw_av(2*ndm,nz_um)       ! Averaged sensible heat from walls
+      real sfwind_av(2*ndm,nz_um)    ! Averaged sensible heat from windows
+
+      integer nbui                !Total number of different type of buildings in an urban class
+      integer nlev(nz_um)         !Number of levels in each different type of buildings in an urban class
+      integer ibui,ily  
+      real :: nhourday   ! Number of hours from midnight, local time
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ----------------------------------------------------------------------
+
+! Fix some usefull parameters for the computation of the sources or sinks
+!
+!initialize inside param
+!
+!      ss=0.
+!      pb=0.
+
+      do iz=kts,kte
+         dz(iz)=z(iz+1)-z(iz)
+      end do
+      call param(iurb,nz_u(iurb),nd_u(iurb),                          &amp;
+                       csg_u,csg,alag_u,alag,csr_u,csr,               &amp;
+                       alar_u,alar,csw_u,csw,alaw_u,alaw,             &amp;
+                       ws_u,ws,bs_u,bs,z0g_u,z0r_u,z0,                &amp;
+                       strd_u,strd,drst_u,drst,ss_u,ss,pb_u,pb,       &amp;
+                       dzw,dzr,dzf,csf,alaf,dzgb,csgb,alagb)
+
+! Interpolation on the &quot;urban grid&quot;
+
+      call interpol(kms,kme,kts,kte,nz_u(iurb),z,z_u,ua,ua_u)
+      call interpol(kms,kme,kts,kte,nz_u(iurb),z,z_u,va,va_u)
+      call interpol(kms,kme,kts,kte,nz_u(iurb),z,z_u,pt,pt_u)
+      call interpol(kms,kme,kts,kte,nz_u(iurb),z,z_u,pt0,pt0_u)
+      call interpol(kms,kme,kts,kte,nz_u(iurb),z,z_u,pr,pr_u)
+      call interpol(kms,kme,kts,kte,nz_u(iurb),z,z_u,da,da_u)
+      call interpol(kms,kme,kts,kte,nz_u(iurb),z,z_u,qv,qv_u)
+                   
+! Compute the modification of the radiation due to the buildings
+
+      call averaging_temp(tw,twlev,ss,pb,tw_av,twlev_av, &amp;
+                          sfw_av,sfwind_av,sfw,sfwin)
+      call modif_rad(iurb,nd_u(iurb),nz_u(iurb),z_u,ws,           &amp;
+                    drst,strd,ss,pb,                              &amp;
+                    tw_av,tg,twlev_av,albg_u(iurb),albw_u(iurb),  &amp;
+                    emw_u(iurb),emg_u(iurb),pwin_u(iurb),albwin_u(iurb),  &amp;
+                    emwind_u(iurb),fww,fwg,fgw,fsw,fsg,           &amp;
+                    zr,deltar,ah,                                 &amp;
+                    rs,rld,rsw,rsg,rlw,rlg)                       
+
+! calculation of the urban albedo and the upward long wave radiation
+
+       call upward_rad(nd_u(iurb),nz_u(iurb),ws,bs,sigma,pb,ss,                &amp;
+                       tg,emg_u(iurb),albg_u(iurb),rlg,rsg,sfg,                &amp; 
+                       tw_av,emw_u(iurb),albw_u(iurb),rlw,rsw,sfw_av,          &amp; 
+                       tr,emr_u(iurb),albr_u(iurb),emwind_u(iurb),             &amp;
+                       albwin_u(iurb),twlev_av,pwin_u(iurb),sfwind_av,rld,rs,sfr,      &amp; 
+                       rs_abs,rl_up,emiss,grdflx_urb)               
+
+! Compute the surface temperatures
+      
+      call surf_temp(nd_u(iurb),pr_u,dt,              &amp; 
+                    rld,rsg,rlg,                      &amp;
+                    tg,alag,csg,emg_u(iurb),albg_u(iurb),ptg,sfg,gfg)
+
+
+! Call the BEM (Building Energy Model) routine 
+       
+       do iz=1,nz_um !Compute the outdoor temperature 
+         tmp_u(iz)=pt_u(iz)*(pr_u(iz)/p0)**(rcp_u) 
+       end do
+
+       ibui=0
+       nlev=0
+       nbui=0
+     
+       sfrb=0.     !Sensible heat flux from roof
+       gfrb=0.     !Heat flux flowing inside the roof
+       sfwb1D=0.   !Sensible heat flux from walls
+       sfwinb1D=0. !Sensible heat flux from windows
+       gfwb1D=0.   !Heat flux flowing inside the walls[W/m²]
+
+
+       twb1D=0.    !Wall temperature
+       twlevb1D=0. !Window temperature
+       tglevb1D=0. !Ground temperature below a building
+       tflevb1D=0. !Floor temperature     
+       trb=0.      !Roof temperature
+       trb1D=0.    !Roof temperature
+
+       qlevb1D=0. !Indoor humidity
+       tlevb1D=0. !indoor temperature
+
+       sflev1D=0.    !Sensible heat flux from the a.c.
+       lflev1D=0.    !Latent heat flux from the a.c.
+       consumlev1D=0.!Consumption from the a.c.
+       sfvlev1D=0.   !Sensible heat flux from the natural ventilation
+       lfvlev1D=0.   !Latent heat flux from natural ventilation
+
+       ptw=0.        !Wall potential temperature
+       ptwin=0.      !Window potential temperature
+       ptr=0.        !Roof potential temperature
+       
+       do iz=1,nz_um                   
+         if(ss(iz).gt.0) then                
+           ibui=ibui+1                                
+           nlev(ibui)=iz-1
+           nbui=ibui
+           do id=1,ndm
+              sfrb(id,ibui)=sfr(id,iz)
+              do ily=1,nwr_u
+                 trb(id,ily,ibui)=tr(id,iz,ily)
+              enddo
+           enddo
+         endif          
+       end do  !iz    
+!--------------------------------------------------------------------------------
+!Loop over BEM  -----------------------------------------------------------------
+!--------------------------------------------------------------------------------
+!--------------------------------------------------------------------------------
+   
+       nhourday=ah/PI*180./15.+12.
+       if (nhourday &gt;= 24) nhourday = nhourday - 24
+       if (nhourday &lt; 0)  nhourday = nhourday + 24
+
+        do ibui=1,nbui
+         
+          do iz=1,nz_um
+             qlevb1D(iz)=qlev(iz,ibui)
+             tlevb1D(iz)=tlev(iz,ibui) 
+          enddo
+             
+          do id=1,ndm
+
+             do ily=1,nwr_u
+                trb1D(ily)=trb(id,ily,ibui)
+             enddo
+             do ily=1,ngb_u
+                tglevb1D(ily)=tglev(id,ily,ibui) 
+             enddo
+              
+             do ily=1,nf_u
+             do iz=1,nz_um-1
+               tflevb1D(ily,iz)=tflev(id,ily,iz,ibui)
+             enddo
+             enddo
+            
+             do iz=1,nz_um
+                sfwinb1D(2*id-1,iz)=sfwin(2*id-1,iz,ibui)
+                sfwinb1D(2*id,iz)=sfwin(2*id,iz,ibui)
+             enddo
+            
+             do iz=1,nz_um
+                do ily=1,nwr_u
+                   twb1D(2*id-1,ily,iz)=tw(2*id-1,iz,ily,ibui)
+                   twb1D(2*id,ily,iz)=tw(2*id,iz,ily,ibui)
+                enddo
+                sfwb1D(2*id-1,iz)=sfw(2*id-1,iz,ibui)
+                sfwb1D(2*id,iz)=sfw(2*id,iz,ibui)
+                twlevb1D(2*id-1,iz)=twlev(2*id-1,iz,ibui)
+                twlevb1D(2*id,iz)=twlev(2*id,iz,ibui)
+             enddo
+          enddo   
+
+          call BEM(nz_um,nlev(ibui),nhourday,dt,bs_u(1,iurb),                   &amp;
+                   bs_u(2,iurb),dz_u,nwr_u,nf_u,nwr_u,ngb_u,sfwb1D,gfwb1D,      &amp;
+                   sfwinb1D,sfrb(1,ibui),gfrb(1,ibui),                          &amp;
+                   latent,sigma,albw_u(iurb),albwin_u(iurb),albr_u(iurb),       &amp;
+                        emr_u(iurb),emw_u(iurb),emwind_u(iurb),rsw,rlw,r,cp_u,       &amp;
+                        da_u,tmp_u,qv_u,pr_u,rs,rld,dzw,csw,alaw,pwin_u(iurb),       &amp;
+                   cop_u(iurb),beta_u(iurb),sw_cond_u(iurb),time_on_u(iurb),    &amp;
+                   time_off_u(iurb),targtemp_u(iurb),gaptemp_u(iurb),           &amp;
+                   targhum_u(iurb),gaphum_u(iurb),perflo_u(iurb),hsesf_u(iurb), &amp;
+                   hsequip,                                                     &amp;
+                        dzf,csf,alaf,dzgb,csgb,alagb,dzr,csr,                        &amp;
+                        alar,tlevb1D,qlevb1D,twb1D,twlevb1D,tflevb1D,tglevb1D,       &amp;
+                        trb1D,sflev1D,lflev1D,consumlev1D,sfvlev1D,lfvlev1D)
+                    
+        
+!
+!Temporal modifications
+!
+         sfrb(2,ibui)=sfrb(1,ibui)
+         gfrb(2,ibui)=gfrb(1,ibui)
+!
+!End temporal modifications  
+!        
+           do iz=1,nz_um
+             qlev(iz,ibui)=qlevb1D(iz)
+             tlev(iz,ibui)=tlevb1D(iz)
+             sflev(iz,ibui)=sflev1D(iz)
+             lflev(iz,ibui)=lflev1D(iz)
+             consumlev(iz,ibui)=consumlev1D(iz)
+             sfvlev(iz,ibui)=sfvlev1D(iz)
+             lfvlev(iz,ibui)=lfvlev1D(iz)
+           enddo

+           do id=1,ndm
+              do ily=1,nwr_u
+                 trb(id,ily,ibui)=trb1D(ily)
+              enddo   
+              do ily=1,ngb_u
+                 tglev(id,ily,ibui)=tglevb1D(ily) 
+              enddo
+
+              do ily=1,nf_u
+              do iz=1,nz_um-1
+                 tflev(id,ily,iz,ibui)=tflevb1D(ily,iz)
+              enddo
+              enddo
+           
+
+             do iz=1,nz_um
+                do ily=1,nwr_u
+                   tw(2*id-1,iz,ily,ibui)=twb1D(2*id-1,ily,iz)
+                   tw(2*id,iz,ily,ibui)=twb1D(2*id,ily,iz)
+                enddo
+                gfw(2*id-1,iz,ibui)=gfwb1D(2*id-1,iz)
+                gfw(2*id,iz,ibui)=gfwb1D(2*id,iz)
+                twlev(2*id-1,iz,ibui)=twlevb1D(2*id-1,iz)
+                twlev(2*id,iz,ibui)=twlevb1D(2*id,iz)
+             enddo
+           enddo       
+
+        enddo !ibui     
+
+!-----------------------------------------------------------------------------
+!End loop over BEM -----------------------------------------------------------
+!-----------------------------------------------------------------------------
+!-----------------------------------------------------------------------------
+
+       ibui=0
+       do iz=1,nz_um                   
+         if(ss(iz).gt.0) then                
+           ibui=ibui+1        
+           do id=1,ndm        
+              gfr(id,iz)=gfrb(id,ibui)
+              sfr(id,iz)=sfrb(id,ibui)
+              do ily=1,nwr_u
+                 tr(id,iz,ily)=trb(id,ily,ibui)
+              enddo
+              ptr(id,iz)=tr(id,iz,nwr_u)*(pr_u(iz)/p0)**(-rcp_u)
+           enddo
+         endif
+       enddo !iz
+
+!Compute the potential temperature for the vertical surfaces of the buildings
+      
+       do id=1,ndm
+          do iz=1,nz_um
+             do ibui=1,nbui
+                ptw(2*id-1,iz,ibui)=tw(2*id-1,iz,nwr_u,ibui)*(pr_u(iz)/p0)**(-rcp_u) 
+                ptw(2*id,iz,ibui)=tw(2*id,iz,nwr_u,ibui)*(pr_u(iz)/p0)**(-rcp_u) 
+                ptwin(2*id-1,iz,ibui)=twlev(2*id-1,iz,ibui)*(pr_u(iz)/p0)**(-rcp_u) 
+                ptwin(2*id,iz,ibui)=twlev(2*id,iz,ibui)*(pr_u(iz)/p0)**(-rcp_u) 
+             enddo
+          enddo
+       enddo
+             
+! Compute the implicit and explicit components of the sources or sinks on the &quot;urban grid&quot;
+     
+      call buildings(iurb,nd_u(iurb),nz_u(iurb),z0,ua_u,va_u,                 &amp; 
+                     pt_u,pt0_u,ptg,ptr,da_u,ptw,ptwin,pwin_u(iurb),drst,     &amp;                      
+                     uva_u,vva_u,uvb_u,vvb_u,tva_u,tvb_u,evb_u,qvb_u,qhb_u,   &amp; 
+                     uhb_u,vhb_u,thb_u,ehb_u,ss,dt,sfw,sfg,sfr,               &amp;
+                     sfwin,pb,bs_u,dz_u,sflev,lflev,sfvlev,lfvlev,tvb_ac)  
+     
+! Calculation of the sensible heat fluxes for the ground, the wall and roof
+! Sensible Heat Flux = density * Cp_U * ( A* potential temperature + B )
+! where A and B are the implicit and explicit components of the heat sources or sinks.
+
+      
+! Interpolation on the &quot;mesoscale grid&quot;
+
+      call urban_meso(nd_u(iurb),kms,kme,kts,kte,nz_u(iurb),z,dz,z_u,pb,ss,bs,ws,sf, &amp; 
+                     vl,uva_u,vva_u,uvb_u,vvb_u,tva_u,tvb_u,evb_u,                   &amp;
+                     uhb_u,vhb_u,thb_u,ehb_u,qhb_u,qvb_u,                            &amp;
+                     a_u,a_v,a_t,a_e,b_u,b_v,b_t,b_e,b_q,tvb_ac,b_ac)                    
+       
+
+! Calculation of the length scale taking into account the buildings effects
+
+      call interp_length(nd_u(iurb),kms,kme,kts,kte,nz_u(iurb),z_u,z,ss,ws,bs,dlg,dl_u)
+
+      return
+      end subroutine BEP1D
+
+! ===6=8===============================================================72
+! ===6=8===============================================================72
+
+       subroutine param(iurb,nz,nd,                                   &amp;
+                       csg_u,csg,alag_u,alag,csr_u,csr,               &amp;
+                       alar_u,alar,csw_u,csw,alaw_u,alaw,             &amp;
+                       ws_u,ws,bs_u,bs,z0g_u,z0r_u,z0,                &amp;  
+                       strd_u,strd,drst_u,drst,ss_u,ss,pb_u,pb,       &amp;
+                       dzw,dzr,dzf,csf,alaf,dzgb,csgb,alagb)        
+
+! ----------------------------------------------------------------------
+!    This routine prepare some usefull parameters       
+! ----------------------------------------------------------------------
+
+      implicit none
+
+  
+! ----------------------------------------------------------------------
+! INPUT:
+! ----------------------------------------------------------------------
+      integer iurb                 ! Current urban class
+      integer nz                   ! Number of vertical urban levels in the current class
+      integer nd                   ! 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 &quot;z&quot;
+      real pb_u(nz_um,nurbm)       ! The probability that a building has an height greater or equal to &quot;z&quot;
+     
+
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+      real alag(ng_u)           ! Ground thermal diffusivity at each ground levels
+      real csg(ng_u)            ! Specific heat of the ground material at each ground levels
+      real bs(ndm)              ! Building width for the current urban class
+      real drst(ndm)            ! street directions for the current urban class
+      real strd(ndm)            ! Street lengths for the current urban class
+      real ws(ndm)              ! Street widths of the current urban class
+      real z0(ndm,nz_um)      ! Roughness lengths &quot;profiles&quot;
+      real ss(nz_um)          ! Probability to have a building with height h
+      real pb(nz_um)          ! Probability to have a building with an height greater or equal to &quot;z&quot;
+
+!-----------------------------------------------------------------------------
+!INPUT/OUTPUT
+!-----------------------------------------------------------------------------
+
+      real dzw(nwr_u)       !Layer sizes in the walls [m]
+      real dzr(nwr_u)       !Layer sizes in the roofs [m]
+      real dzf(nf_u)        !Layer sizes in the floors [m]
+      real dzgb(ngb_u)      !layer sizes in the ground below the buildings [m]
+
+      real csr(nwr_u)       ! Specific heat of the roof material at each roof levels
+      real csw(nwr_u)       ! Specific heat of the wall material at each wall levels
+
+      real csf(nf_u)        !Specific heat of the floors materials in the buildings 
+                            !of the current urban class [J m^3 K^-1]
+      real csgb(ngb_u)      !Specific heat of the ground material below the buildings 
+                            !of the current urban class [J m^3 K^-1]
+      real alar(nwr_u+1)    ! Roof thermal diffusivity at each roof levels [W/ m K]
+      real alaw(nwr_u+1)    ! Wall thermal diffusivity at each wall levels [W/ m K]
+      real alaf(nf_u+1)     ! Floor thermal diffusivity at each wall levels [W/m K]
+      real alagb(ngb_u+1)   ! Ground thermal diffusivity below the building at each wall levels [W/m K]
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+      integer id,ig,ir,iw,iz,iflo
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ----------------------------------------------------------------------  
+!Define the layer sizes in the walls
+        
+      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.
+      csgb=0.
+      alagb=0.
+      csf=0.
+      alaf=0.

+      dzgb=(/0.2,0.12,0.08,0.05,0.03,0.02,0.02,0.01,0.005,0.0025/)
+      dzr=(/0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.01,0.005,0.0025/)   
+      dzw=(/0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.01,0.005,0.0025/)
+      dzf=(/0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02/)   
+      
+      do ig=1,ngb_u
+        csgb(ig) = csg_u(iurb)
+        alagb(ig)= csg_u(iurb)*alag_u(iurb)
+      enddo
+      alagb(ngb_u+1)= csg_u(iurb)*alag_u(iurb)
+      
+      do iflo=1,nf_u
+        csf(iflo) = csw_u(iurb)
+        alaf(iflo)= csw_u(iurb)*alaw_u(iurb) 
+      enddo
+      alaf(nf_u+1)= csw_u(iurb)*alaw_u(iurb) 
+     
+      do ir=1,nwr_u
+        csr(ir) = csr_u(iurb)
+        alar(ir)= csr_u(iurb)*alar_u(iurb)
+      enddo
+      alar(nwr_u+1)= csr_u(iurb)*alar_u(iurb)
+
+      do iw=1,nwr_u
+        csw(iw) = csw_u(iurb)
+        alaw(iw)= csw_u(iurb)*alaw_u(iurb)
+      enddo
+      alaw(nwr_u+1)=csw_u(iurb)*alaw_u(iurb) 
+
+!------------------------------------------------------------------------  
+        
+      do iz=1,nz+1
+         ss(iz)=ss_u(iz,iurb)
+         pb(iz)=pb_u(iz,iurb)
+      end do
+                 
+       do ig=1,ng_u
+        csg(ig)=csg_u(iurb)
+        alag(ig)=alag_u(iurb)
+       enddo
+       
+       do id=1,nd
+        z0(id,1)=z0g_u(iurb)
+        do iz=2,nz+1
+         z0(id,iz)=z0r_u(iurb)
+        enddo
+       enddo
+      
+       do id=1,nd
+        ws(id)=ws_u(id,iurb)
+        bs(id)=bs_u(id,iurb)
+        strd(id)=strd_u(id,iurb)
+        drst(id)=drst_u(id,iurb)     
+       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)
+
+! ----------------------------------------------------------------------
+!  This routine interpolate para
+!  meters from the &quot;mesoscale grid&quot; to
+!  the &quot;urban grid&quot;.
+!  See p300 Appendix B.1 of the BLM paper.
+! ----------------------------------------------------------------------
+
+      implicit none
+
+! ----------------------------------------------------------------------
+! INPUT:
+! ----------------------------------------------------------------------
+! Data relative to the &quot;mesoscale grid&quot;
+      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 &quot;urban grid&quot;
+      integer nz_u          ! Number of levels
+      real z_u(nz_um)      ! Altitude of the cell interface
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+      real c_u(nz_um)        ! Interpolated paramters in the &quot;urban grid&quot;
+       
+! LOCAL:
+! ----------------------------------------------------------------------
+      integer iz_u,iz
+      real ctot,dz
+
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ----------------------------------------------------------------------
+
+       do iz_u=1,nz_u
+        ctot=0.
+        do iz=kts,kte
+         dz=max(min(z(iz+1),z_u(iz_u+1))-max(z(iz),z_u(iz_u)),0.)
+         ctot=ctot+c(iz)*dz
+        enddo
+        c_u(iz_u)=ctot/(z_u(iz_u+1)-z_u(iz_u))
+       enddo
+       
+       return
+       end subroutine interpol
+         
+! ===6=8===============================================================72       
+! ===6=8===============================================================72    
+
+      subroutine  averaging_temp(tw,twlev,ss,pb,tw_av,twlev_av,&amp;
+                                 sfw_av,sfwind_av,sfw,sfwin) 
+
+      implicit none
+!
+!INPUT VARIABLES
+!
+      real tw(2*ndm,nz_um,nwr_u,nbui_max)        ! Temperature in each layer of the wall [K]
+      real twlev(2*ndm,nz_um,nbui_max)     ! Window temperature in BEM [K]
+      real pb(nz_um)                    ! Probability to have a building with an height equal or greater h
+      real ss(nz_um)                    ! Probability to have a building with height h
+      real sfw(2*ndm,nz_um,nbui_max)             ! Surface fluxes from the walls
+      real sfwin(2*ndm,nz_um,nbui_max)     ! Surface fluxes from the windows
+!
+!OUTPUT VARIABLES
+!
+      real tw_av(2*ndm,nz_um)           ! Averaged temperature of the wall surfaces
+      real twlev_av(2*ndm,nz_um)        ! Averaged temperature of the windows
+      real sfw_av(2*ndm,nz_um)          ! Averaged sensible heat from walls
+      real sfwind_av(2*ndm,nz_um)       ! Averaged sensible heat from windows
+!
+!LOCAL VARIABLES
+!
+      real d_urb(nz_um)    
+      integer nlev(nz_um)            
+      integer id,iz
+      integer nbui,ibui
+!
+!Initialize Variables
+!
+      tw_av=0.
+      twlev_av=0.
+      sfw_av=0.
+      sfwind_av=0.
+      ibui=0
+      nbui=0
+      nlev=0
+      d_urb=0.
+
+      do iz=1,nz_um                   
+         if(ss(iz).gt.0) then                
+           ibui=ibui+1
+           d_urb(ibui)=ss(iz)
+           nlev(ibui)=iz-1
+           nbui=ibui                               
+         endif
+      enddo
+
+      do id=1,ndm
+         do iz=1,nz_um-1
+            if (pb(iz+1).gt.0) then
+                do ibui=1,nbui
+                   if (iz.le.nlev(ibui)) then
+                      tw_av(2*id-1,iz)=tw_av(2*id-1,iz)+(d_urb(ibui)/pb(iz+1))*&amp;
+                                       tw(2*id-1,iz,nwr_u,ibui)**4
+                      tw_av(2*id,iz)=tw_av(2*id,iz)+(d_urb(ibui)/pb(iz+1))*&amp;
+                                     tw(2*id,iz,nwr_u,ibui)**4
+                      twlev_av(2*id-1,iz)=twlev_av(2*id-1,iz)+(d_urb(ibui)/pb(iz+1))*&amp;
+                                          twlev(2*id-1,iz,ibui)**4
+                      twlev_av(2*id,iz)=twlev_av(2*id,iz)+(d_urb(ibui)/pb(iz+1))*&amp;
+                                        twlev(2*id,iz,ibui)**4
+                      sfw_av(2*id-1,iz)=sfw_av(2*id-1,iz)+(d_urb(ibui)/pb(iz+1))*sfw(2*id-1,iz,ibui)
+                      sfw_av(2*id,iz)=sfw_av(2*id,iz)+(d_urb(ibui)/pb(iz+1))*sfw(2*id,iz,ibui)
+                      sfwind_av(2*id-1,iz)=sfwind_av(2*id-1,iz)+(d_urb(ibui)/pb(iz+1))*sfwin(2*id-1,iz,ibui)
+                      sfwind_av(2*id,iz)=sfwind_av(2*id,iz)+(d_urb(ibui)/pb(iz+1))*sfwin(2*id,iz,ibui)
+                   endif
+                enddo
+                tw_av(2*id-1,iz)=tw_av(2*id-1,iz)**(1./4.)
+                tw_av(2*id,iz)=tw_av(2*id,iz)**(1./4.)
+                twlev_av(2*id-1,iz)=twlev_av(2*id-1,iz)**(1./4.)
+                twlev_av(2*id,iz)=twlev_av(2*id,iz)**(1./4.)
+            endif
+         enddo !iz         
+      enddo !id
+      return
+      end subroutine averaging_temp
+! ===6=8===============================================================72       
+! ===6=8===============================================================72    
+
+      subroutine modif_rad(iurb,nd,nz_u,z,ws,drst,strd,ss,pb,    &amp;
+                          tw,tg,twlev,albg,albw,emw,emg,pwin,albwin,   &amp;
+                          emwin,fww,fwg,fgw,fsw,fsg,             &amp;
+                          zr,deltar,ah,                          &amp;    
+                          rs,rl,rsw,rsg,rlw,rlg)                       

+! ----------------------------------------------------------------------
+! This routine computes the modification of the short wave and 
+!  long wave radiation due to the buildings.
+! ----------------------------------------------------------------------
+
+      implicit none


+! ----------------------------------------------------------------------
+! INPUT:
+! ----------------------------------------------------------------------
+      integer iurb              ! current urban class
+      integer nd                ! Number of street direction for the current urban class
+      integer nz_u              ! Number of layer in the urban grid
+      real z(nz_um)           ! Height of the urban grid levels
+      real ws(ndm)              ! Street widths of the current urban class
+      real drst(ndm)            ! street directions for the current urban class
+      real strd(ndm)            ! Street lengths for the current urban class
+      real ss(nz_um)          ! probability to have a building with height h
+      real pb(nz_um)          ! probability to have a building with an height equal
+      real tw(2*ndm,nz_um)    ! Temperature in each layer of the wall [K]
+      real tg(ndm,ng_u)         ! Temperature in each layer of the ground [K]
+      real albg                 ! Albedo of the ground for the current urban class
+      real albw                 ! Albedo of the wall for the current urban class
+      real emg                  ! Emissivity of ground for the current urban class
+      real emw                  ! Emissivity of wall for the current urban class
+      real fgw(nz_um,ndm,nurbm)       ! View factors from ground to wall
+      real fsg(ndm,nurbm)             ! View factors from sky to ground
+      real fsw(nz_um,ndm,nurbm)       ! View factors from sky to wall
+      real fws(nz_um,ndm,nurbm)       ! View factors from wall to sky
+      real fwg(nz_um,ndm,nurbm)       ! View factors from wall to ground
+      real fww(nz_um,nz_um,ndm,nurbm) ! View factors from wall to wall
+      real ah                   ! Hour angle (it should come from the radiation routine)
+      real zr                   ! zenith angle
+      real deltar               ! Declination of the sun
+      real rs                   ! solar radiation
+      real rl                   ! downward flux of the longwave radiation
+!
+!New variables BEM
+!
+      real twlev(2*ndm,nz_um)         ! Window temperature in BEM [K]
+      real pwin                       ! Coverage area fraction of windows in the walls of the buildings 
+      real albwin                     ! Albedo of the windows for the current urban class
+      real emwin                      ! Emissivity of the windows for the current urban class
+      real alb_av                     ! Averaged albedo (window and wall)
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+      real rlg(ndm)             ! Long wave radiation at the ground
+      real rlw(2*ndm,nz_um)     ! Long wave radiation at the walls
+      real rsg(ndm)             ! Short wave radiation at the ground
+      real rsw(2*ndm,nz_um)     ! Short wave radiation at the walls
+
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+
+      integer id,iz
+
+!  Calculation of the shadow effects
+
+      call shadow_mas(nd,nz_u,zr,deltar,ah,drst,ws,ss,pb,z,  &amp;
+                      rs,rsw,rsg)
+
+! Calculation of the reflection effects          
+      do id=1,nd
+         call long_rad(iurb,nz_u,id,emw,emg,emwin,pwin,twlev,      &amp;
+                      fwg,fww,fgw,fsw,fsg,tg,tw,rlg,rlw,rl,pb)
+
+         alb_av=pwin*albwin+(1.-pwin)*albw
+         
+         call short_rad(iurb,nz_u,id,alb_av,albg,fwg,fww,fgw,rsg,rsw,pb)
+  
+      enddo
+      return
+      end subroutine modif_rad
+
+
+! ===6=8===============================================================72  
+! ===6=8===============================================================72     
+
+      subroutine surf_temp(nd,pr,dt,rl,rsg,rlg,  &amp;
+                           tg,alag,csg,emg,albg,ptg,sfg,gfg) 
+
+! ----------------------------------------------------------------------
+! Computation of the surface temperatures for walls, ground and roofs 
+! ----------------------------------------------------------------------
+
+      implicit none
+                  
+! ----------------------------------------------------------------------
+! INPUT:
+! ----------------------------------------------------------------------
+      
+      integer nd                ! Number of street direction for the current urban class
+      real alag(ng_u)           ! Ground thermal diffusivity for the current urban class [m^2 s^-1] 
+
+      real albg                 ! Albedo of the ground for the current urban class
+
+      real csg(ng_u)            ! Specific heat of the ground material of the current urban class [J m^3 K^-1]
+
+      real dt                   ! Time step
+      real emg                  ! Emissivity of ground for the current urban class
+
+      real pr(nz_um)            ! Air pressure
+      real rl                   ! Downward flux of the longwave radiation
+      real rlg(ndm)             ! Long wave radiation at the ground
+      real rsg(ndm)             ! Short wave radiation at the ground
+      real sfg(ndm)             ! Sensible heat flux from ground (road)
+
+      real gfg(ndm)             ! Heat flux transferred from the surface of the ground (road) toward the interior
+
+      real tg(ndm,ng_u)         ! Temperature in each layer of the ground [K]
+
+      
+
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+      real ptg(ndm)             ! Ground potential temperatures 
+
+
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+      integer id,ig,ir,iw,iz
+
+      real rtg(ndm)             ! Total radiation at ground(road) surface (solar+incoming long+outgoing long)
+
+      real tg_tmp(ng_u)
+
+
+      real dzg_u(ng_u)          ! Layer sizes in the ground
+      
+      data dzg_u /0.2,0.12,0.08,0.05,0.03,0.02,0.02,0.01,0.005,0.0025/
+
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ----------------------------------------------------------------------
+
+        
+   
+      do id=1,nd
+
+!      Calculation for the ground surfaces
+       do ig=1,ng_u
+        tg_tmp(ig)=tg(id,ig)
+       end do
+!                
+       call soil_temp(ng_u,dzg_u,tg_tmp,ptg(id),alag,csg,      &amp;
+                     rsg(id),rlg(id),pr(1),                    &amp;
+                     dt,emg,albg,                              &amp;
+                     rtg(id),sfg(id),gfg(id))    
+       do ig=1,ng_u
+        tg(id,ig)=tg_tmp(ig)
+       end do
+        
+      end do !id
+      
+      return
+      end subroutine surf_temp
+     
+! ===6=8===============================================================72     
+! ===6=8===============================================================72  
+
+      subroutine buildings(iurb,nd,nz,z0,ua_u,va_u,pt_u,pt0_u,       &amp;
+                        ptg,ptr,da_u,ptw,ptwin,pwin,                 &amp;
+                        drst,uva_u,vva_u,uvb_u,vvb_u,                &amp;
+                        tva_u,tvb_u,evb_u,qvb_u,qhb_u,               &amp;
+                        uhb_u,vhb_u,thb_u,ehb_u,ss,dt,sfw,sfg,sfr,   &amp;
+                        sfwin,pb,bs_u,dz_u,sflev,lflev,sfvlev,lfvlev,tvb_ac)                  
+
+! ----------------------------------------------------------------------
+! This routine computes the sources or sinks of the different quantities 
+! on the urban grid. The actual calculation is done in the subroutines 
+! called flux_wall, and flux_flat.
+! ----------------------------------------------------------------------
+
+      implicit none
+
+        
+! ----------------------------------------------------------------------
+! INPUT:
+! ----------------------------------------------------------------------
+      integer nd                ! Number of street direction for the current urban class
+      integer nz                ! number of vertical space steps
+      real ua_u(nz_um)          ! Wind speed in the x direction on the urban grid
+      real va_u(nz_um)          ! Wind speed in the y direction on the urban grid
+      real da_u(nz_um)          ! air density on the urban grid
+      real drst(ndm)            ! Street directions for the current urban class
+      real dz
+      real pt_u(nz_um)          ! Potential temperature on the urban grid
+      real pt0_u(nz_um)         ! reference potential temperature on the urban grid
+      real ptg(ndm)             ! Ground potential temperatures 
+      real ptr(ndm,nz_um)       ! Roof potential temperatures 
+      real ptw(2*ndm,nz_um,nbui_max)     ! Walls potential temperatures 
+      real ss(nz_um)            ! probability to have a building with height h
+      real pb(nz_um)
+      real z0(ndm,nz_um)        ! Roughness lengths &quot;profiles&quot;
+      real dt ! time step
+      integer iurb              !Urban class
+
+!
+!New variables (BEM)
+!
+      real bs_u(ndm,nurbm)    ! Building width [m]
+      real dz_u               ! Urban grid resolution
+      real sflev(nz_um,nz_um)     ! sensible heat flux due to the air conditioning systems  [W]
+      real lflev(nz_um,nz_um)     ! latent heat flux due to the air conditioning systems  [W]
+      real sfvlev(nz_um,nz_um)    ! sensible heat flux due to ventilation [W]
+      real lfvlev(nz_um,nz_um)    ! latent heat flux due to ventilation [W]
+      real qvb_u(2*ndm,nz_um)
+      real qhb_u(ndm,nz_um)
+      real ptwin(2*ndm,nz_um,nbui_max)  ! window potential temperature
+      real pwin
+      real tvb_ac(2*ndm,nz_um)
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+! Explicit and implicit component of the momentum, temperature and TKE sources or sinks on
+! vertical surfaces (walls) and horizontal surfaces (roofs and street)
+! The fluxes can be computed as follow: Fluxes of X = A*X + B
+!  Example: Momentum fluxes on vertical surfaces = uva_u * ua_u + uvb_u
+
+      real uhb_u(ndm,nz_um)   ! U (wind component) Horizontal surfaces, B (explicit) term
+      real uva_u(2*ndm,nz_um)   ! U (wind component)   Vertical surfaces, A (implicit) term
+      real uvb_u(2*ndm,nz_um)   ! U (wind component)   Vertical surfaces, B (explicit) term
+      real vhb_u(ndm,nz_um)   ! V (wind component) Horizontal surfaces, B (explicit) term
+      real vva_u(2*ndm,nz_um)   ! V (wind component)   Vertical surfaces, A (implicit) term
+      real vvb_u(2*ndm,nz_um)   ! V (wind component)   Vertical surfaces, B (explicit) term
+      real thb_u(ndm,nz_um)   ! Temperature        Horizontal surfaces, B (explicit) term
+      real tva_u(2*ndm,nz_um)   ! Temperature          Vertical surfaces, A (implicit) term
+      real tvb_u(2*ndm,nz_um)   ! Temperature          Vertical surfaces, B (explicit) term
+      real ehb_u(ndm,nz_um)   ! Energy (TKE)       Horizontal surfaces, B (explicit) term
+      real evb_u(2*ndm,nz_um)   ! Energy (TKE)         Vertical surfaces, B (explicit) term
+      real sfw(2*ndm,nz_um,nbui_max)   ! sensible heat flux from walls
+      real sfwin(2*ndm,nz_um,nbui_max) ! sensible heat flux form windows
+      real sfr(ndm,nz_um)           ! sensible heat flux from roof
+      real sfg(ndm)                 ! sensible heat flux from street
+
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+      real d_urb(nz_um)
+      real uva_tmp
+      real vva_tmp
+      real uvb_tmp
+      real vvb_tmp 
+      real evb_tmp     
+      integer nlev(nz_um)
+      integer id,iz,ibui,nbui
+
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ----------------------------------------------------------------------
+      dz=dz_u
+      ibui=0
+      nbui=0
+      nlev=0
+      d_urb=0.
+      
+      uva_u=0.
+      uvb_u=0.
+      vhb_u=0.
+      vva_u=0.
+      vvb_u=0.
+      thb_u=0.
+      tva_u=0.
+      tvb_u=0.
+      tvb_ac=0.
+      ehb_u=0.
+      evb_u=0.
+      qvb_u=0.
+      qhb_u=0.
+
+      do iz=1,nz_um                   
+         if(ss(iz).gt.0) then                
+           ibui=ibui+1
+           d_urb(ibui)=ss(iz)
+           nlev(ibui)=iz-1
+           nbui=ibui                               
+         endif
+      enddo
+      if (nbui.gt.nbui_max) then
+         write(*,*) 'nbui_max must be increased to',nbui
+         stop
+      endif
+      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),  &amp;
+                       ptg(id),uhb_u(id,1),                            &amp; 
+                       vhb_u(id,1),sfg(id),ehb_u(id,1),da_u(1))          
+         thb_u(id,1)=- sfg(id)/(da_u(1)*cp_u)  
+              
+!        Calculation at the roof surfaces    
+
+         do iz=2,nz
+            if(ss(iz).gt.0)then
+               call flux_flat(dz,z0(id,iz),ua_u(iz),                  &amp;              
+                       va_u(iz),pt_u(iz),pt0_u(iz),                   &amp;   
+                       ptr(id,iz),uhb_u(id,iz),                       &amp;   
+                       vhb_u(id,iz),sfr(id,iz),ehb_u(id,iz),da_u(iz)) 
+               thb_u(id,iz)=- sfr(id,iz)/(da_u(iz)*cp_u) 
+            else
+               uhb_u(id,iz) = 0.0
+               vhb_u(id,iz) = 0.0
+               thb_u(id,iz) = 0.0
+               ehb_u(id,iz) = 0.0
+            endif
+         end do
+
+!        Calculation at the wall surfaces        

+         do ibui=1,nbui
+         do iz=1,nlev(ibui)  
+                   
+            call flux_wall(ua_u(iz),va_u(iz),pt_u(iz),da_u(iz),             &amp;  
+                        ptw(2*id-1,iz,ibui),ptwin(2*id-1,iz,ibui),          &amp;   
+                        uva_tmp,vva_tmp,                                    &amp;   
+                        uvb_tmp,vvb_tmp,                                    &amp;   
+                        sfw(2*id-1,iz,ibui),sfwin(2*id-1,iz,ibui),          &amp;   
+                        evb_tmp,drst(id),dt)      
+   
+            if (pb(iz+1).gt.0.) then
+
+                    uva_u(2*id-1,iz)=uva_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*uva_tmp
+                    vva_u(2*id-1,iz)=vva_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*vva_tmp
+                    uvb_u(2*id-1,iz)=uvb_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*uvb_tmp
+                    vvb_u(2*id-1,iz)=vvb_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*vvb_tmp
+                    evb_u(2*id-1,iz)=evb_u(2*id-1,iz)+d_urb(ibui)/pb(iz+1)*evb_tmp
+                    tvb_u(2*id-1,iz)=tvb_u(2*id-1,iz)-(d_urb(ibui)/pb(iz+1))*                       &amp;
+                                    (sfw(2*id-1,iz,ibui)*(1.-pwin)+sfwin(2*id-1,iz,ibui)*pwin)/     &amp;
+                                    da_u(iz)/cp_u-(1./4.)*(d_urb(ibui)/pb(iz+1))*(sfvlev(iz,ibui)-sflev(iz,ibui))/&amp;
+                                    (dz*bs_u(id,iurb))/da_u(iz)/cp_u
+                    tvb_ac(2*id-1,iz)=tvb_ac(2*id-1,iz)-(1./4.)*(d_urb(ibui)/pb(iz+1))*(-sflev(iz,ibui))/&amp;
+                                    (dz*bs_u(id,iurb))/da_u(iz)/cp_u
+                    qvb_u(2*id-1,iz)=qvb_u(2*id-1,iz)-(1./4.)*(d_urb(ibui)/pb(iz+1))*(lfvlev(iz,ibui)-lflev(iz,ibui))/&amp;
+                                    (dz*bs_u(id,iurb))/da_u(iz)/latent
+                                     
+            endif
+
+            call flux_wall(ua_u(iz),va_u(iz),pt_u(iz),da_u(iz),    &amp;   
+                        ptw(2*id,iz,ibui),ptwin(2*id,iz,ibui),     &amp;    
+                        uva_tmp,vva_tmp,                           &amp;    
+                        uvb_tmp,vvb_tmp,                           &amp;    
+                        sfw(2*id,iz,ibui),sfwin(2*id,iz,ibui),     &amp;   
+                        evb_tmp,drst(id),dt) 
+
+            if (pb(iz+1).gt.0.) then
+
+                    uva_u(2*id,iz)=uva_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*uva_tmp
+                    vva_u(2*id,iz)=vva_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*vva_tmp
+                    uvb_u(2*id,iz)=uvb_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*uvb_tmp
+                    vvb_u(2*id,iz)=vvb_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*vvb_tmp
+                    evb_u(2*id,iz)=evb_u(2*id,iz)+d_urb(ibui)/pb(iz+1)*evb_tmp
+                    tvb_u(2*id,iz)=tvb_u(2*id,iz)-(d_urb(ibui)/pb(iz+1))*                    &amp;
+                                    (sfw(2*id,iz,ibui)*(1.-pwin)+sfwin(2*id,iz,ibui)*pwin)/  &amp;
+                                     da_u(iz)/cp_u-(1./4.)*(d_urb(ibui)/pb(iz+1))*(sfvlev(iz,ibui)-sflev(iz,ibui))/&amp;
+                                    (dz*bs_u(id,iurb))/da_u(iz)/cp_u
+                    tvb_ac(2*id,iz)=tvb_ac(2*id,iz)-(1./4.)*(d_urb(ibui)/pb(iz+1))*(-sflev(iz,ibui))/&amp;
+                                    (dz*bs_u(id,iurb))/da_u(iz)/cp_u
+                    qvb_u(2*id,iz)=qvb_u(2*id,iz)-(1./4.)*(d_urb(ibui)/pb(iz+1))*(lfvlev(iz,ibui)-lflev(iz,ibui))/&amp;
+                                    (dz*bs_u(id,iurb))/da_u(iz)/latent
+
+            endif
+!
+          enddo !iz
+         enddo !ibui
+         
+      end do !id
+                
+      return
+      end subroutine buildings
+      
+
+! ===6=8===============================================================72
+! ===6=8===============================================================72
+
+        subroutine urban_meso(nd,kms,kme,kts,kte,nz_u,z,dz,z_u,pb,ss,bs,ws,sf,vl,    &amp;
+                             uva_u,vva_u,uvb_u,vvb_u,tva_u,tvb_u,evb_u, &amp;       
+                             uhb_u,vhb_u,thb_u,ehb_u,qhb_u,qvb_u,       &amp;      
+                             a_u,a_v,a_t,a_e,b_u,b_v,b_t,b_e,b_q,tvb_ac,b_ac)           
+
+! ----------------------------------------------------------------------
+!  This routine interpolates the parameters from the &quot;urban grid&quot; to the
+!  &quot;mesoscale grid&quot;.
+!  See p300-301 Appendix B.2 of the BLM paper.  
+! ----------------------------------------------------------------------
+
+      implicit none
+
+! ----------------------------------------------------------------------
+! INPUT:
+! ----------------------------------------------------------------------
+! Data relative to the &quot;mesoscale grid&quot;
+      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 &quot;uban grid&quot;
+      integer nz_u              ! Number of layer in the urban grid
+      integer nd                ! Number of street direction for the current urban class
+      real bs(ndm)              ! Building widths of the current urban class
+      real ws(ndm)              ! Street widths of the current urban class
+      real z_u(nz_um)         ! Height of the urban grid levels
+      real pb(nz_um)          ! Probability to have a building with an height equal
+      real ss(nz_um)          ! Probability to have a building with height h
+      real uhb_u(ndm,nz_um)   ! U (x-wind component) Horizontal surfaces, B (explicit) term
+      real uva_u(2*ndm,nz_um)   ! U (x-wind component) Vertical surfaces, A (implicit) term
+      real uvb_u(2*ndm,nz_um)   ! U (x-wind component) Vertical surfaces, B (explicit) term
+      real vhb_u(ndm,nz_um)   ! V (y-wind component) Horizontal surfaces, B (explicit) term
+      real vva_u(2*ndm,nz_um)   ! V (y-wind component) Vertical surfaces, A (implicit) term
+      real vvb_u(2*ndm,nz_um)   ! V (y-wind component) Vertical surfaces, B (explicit) term
+      real thb_u(ndm,nz_um)   ! Temperature        Horizontal surfaces, B (explicit) term
+      real tva_u(2*ndm,nz_um)   ! Temperature          Vertical surfaces, A (implicit) term
+      real tvb_u(2*ndm,nz_um)   ! Temperature          Vertical surfaces, B (explicit) term
+      real tvb_ac(2*ndm,nz_um)
+      real ehb_u(ndm,nz_um)   ! Energy (TKE)       Horizontal surfaces, B (explicit) term
+      real evb_u(2*ndm,nz_um)   ! Energy (TKE)         Vertical surfaces, B (explicit) term
+!
+!New variables for BEM
+!
+      real qhb_u(ndm,nz_um)
+      real qvb_u(2*ndm,nz_um)
+     
+
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+! Data relative to the &quot;mesoscale grid&quot;
+      real sf(kms:kme)             ! Surface of the &quot;mesoscale grid&quot; cells taking into account the buildings
+      real vl(kms:kme)               ! Volume of the &quot;mesoscale grid&quot; cells taking into account the buildings
+      real a_u(kms:kme)              ! Implicit component of the momentum sources or sinks in the X-direction
+      real a_v(kms:kme)              ! Implicit component of the momentum sources or sinks in the Y-direction
+      real a_t(kms:kme)              ! Implicit component of the heat sources or sinks
+      real a_e(kms:kme)              ! Implicit component of the TKE sources or sinks
+      real b_u(kms:kme)              ! Explicit component of the momentum sources or sinks in the X-direction
+      real b_v(kms:kme)              ! Explicit component of the momentum sources or sinks in the Y-direction
+      real b_t(kms:kme)              ! Explicit component of the heat sources or sinks
+      real b_ac(kms:kme)
+      real b_e(kms:kme)              ! Explicit component of the TKE sources or sinks
+      real b_q(kms:kme)               ! Explicit component of the humidity sources or sinks
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+      real dzz
+      real fact
+      integer id,iz,iz_u
+      real se,sr,st,su,sv,sq
+      real uet(kms:kme)                ! Contribution to TKE due to walls
+      real veb,vta,vtb,vte,vtot,vua,vub,vva,vvb,vqb,vtb_ac
+
+
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ---------------------------------------------------------------------- 
+
+! initialisation
+
+      do iz=kts,kte
+         a_u(iz)=0.
+         a_v(iz)=0.
+         a_t(iz)=0.
+         a_e(iz)=0.
+         b_u(iz)=0.
+         b_v(iz)=0.
+         b_e(iz)=0.
+         b_t(iz)=0.
+         b_ac(iz)=0.
+         uet(iz)=0.
+         b_q(iz)=0.
+      end do
+            
+! horizontal surfaces
+      do iz=kts,kte
+         sf(iz)=0.
+         vl(iz)=0.
+      enddo
+      sf(kte+1)=0. 
+      
+      do id=1,nd      
+         do iz=kts+1,kte+1
+            sr=0.
+            do iz_u=2,nz_u
+               if(z(iz).lt.z_u(iz_u).and.z(iz).ge.z_u(iz_u-1))then
+                  sr=pb(iz_u)
+               endif
+            enddo
+            sf(iz)=sf(iz)+((ws(id)+(1.-sr)*bs(id))/(ws(id)+bs(id)))/nd
+         enddo
+      enddo
+
+! volume      
+      do iz=kts,kte
+         do id=1,nd
+            vtot=0.
+            do iz_u=1,nz_u
+               dzz=max(min(z_u(iz_u+1),z(iz+1))-max(z_u(iz_u),z(iz)),0.)
+               vtot=vtot+pb(iz_u+1)*dzz
+            enddo
+            vtot=vtot/(z(iz+1)-z(iz))
+            vl(iz)=vl(iz)+(1.-vtot*bs(id)/(ws(id)+bs(id)))/nd
+         enddo
+      enddo
+      
+! horizontal surface impact  
+
+      do id=1,nd
+      
+         fact=1./vl(kts)/dz(kts)*ws(id)/(ws(id)+bs(id))/nd
+         b_t(kts)=b_t(kts)+thb_u(id,1)*fact
+         b_u(kts)=b_u(kts)+uhb_u(id,1)*fact
+         b_v(kts)=b_v(kts)+vhb_u(id,1)*fact 
+         b_e(kts)=b_e(kts)+ehb_u(id,1)*fact*(z_u(2)-z_u(1))
+         b_q(kts)=b_q(kts)+qhb_u(id,1)*fact         
+
+         do iz=kts,kte
+            st=0.
+            su=0.
+            sv=0.
+            se=0.
+            sq=0.
+            do iz_u=2,nz_u
+               if(z(iz).le.z_u(iz_u).and.z(iz+1).gt.z_u(iz_u))then
+                  st=st+ss(iz_u)*thb_u(id,iz_u)
+                  su=su+ss(iz_u)*uhb_u(id,iz_u)
+                  sv=sv+ss(iz_u)*vhb_u(id,iz_u)          
+                  se=se+ss(iz_u)*ehb_u(id,iz_u)*(z_u(iz_u+1)-z_u(iz_u))
+                  sq=sq+ss(iz_u)*qhb_u(id,iz_u)
+               endif
+            enddo
+      
+            fact=bs(id)/(ws(id)+bs(id))/vl(iz)/dz(iz)/nd
+            b_t(iz)=b_t(iz)+st*fact
+            b_u(iz)=b_u(iz)+su*fact
+            b_v(iz)=b_v(iz)+sv*fact
+            b_e(iz)=b_e(iz)+se*fact
+            b_q(iz)=b_q(iz)+sq*fact
+         enddo
+      enddo              
+
+! vertical surface impact
+           
+      do iz=kts,kte 
+         uet(iz)=0.
+         do id=1,nd              
+            vtb=0.
+            vtb_ac=0.
+            vta=0.
+            vua=0.
+            vub=0.
+            vva=0.
+            vvb=0.
+            veb=0.
+            vte=0.
+            vqb=0.
+            do iz_u=1,nz_u
+               dzz=max(min(z_u(iz_u+1),z(iz+1))-max(z_u(iz_u),z(iz)),0.)
+               fact=dzz/(ws(id)+bs(id))
+               vtb=vtb+pb(iz_u+1)*                                  &amp;        
+                    (tvb_u(2*id-1,iz_u)+tvb_u(2*id,iz_u))*fact 
+               vtb_ac=vtb_ac+pb(iz_u+1)*                            &amp;        
+                    (tvb_ac(2*id-1,iz_u)+tvb_ac(2*id,iz_u))*fact     
+               vta=vta+pb(iz_u+1)*                                  &amp;        
+                   (tva_u(2*id-1,iz_u)+tva_u(2*id,iz_u))*fact
+               vua=vua+pb(iz_u+1)*                                  &amp;        
+                    (uva_u(2*id-1,iz_u)+uva_u(2*id,iz_u))*fact
+               vva=vva+pb(iz_u+1)*                                  &amp;        
+                    (vva_u(2*id-1,iz_u)+vva_u(2*id,iz_u))*fact
+               vub=vub+pb(iz_u+1)*                                  &amp;        
+                    (uvb_u(2*id-1,iz_u)+uvb_u(2*id,iz_u))*fact
+               vvb=vvb+pb(iz_u+1)*                                  &amp;        
+                    (vvb_u(2*id-1,iz_u)+vvb_u(2*id,iz_u))*fact
+               veb=veb+pb(iz_u+1)*                                  &amp;        
+                    (evb_u(2*id-1,iz_u)+evb_u(2*id,iz_u))*fact
+               vqb=vqb+pb(iz_u+1)*                                  &amp;        
+                    (qvb_u(2*id-1,iz_u)+qvb_u(2*id,iz_u))*fact   
+            enddo
+           
+            fact=1./vl(iz)/dz(iz)/nd
+            b_t(iz)=b_t(iz)+vtb*fact
+            b_ac(iz)=b_ac(iz)+vtb_ac*fact
+            a_t(iz)=a_t(iz)+vta*fact
+            a_u(iz)=a_u(iz)+vua*fact
+            a_v(iz)=a_v(iz)+vva*fact
+            b_u(iz)=b_u(iz)+vub*fact
+            b_v(iz)=b_v(iz)+vvb*fact
+            b_e(iz)=b_e(iz)+veb*fact
+            uet(iz)=uet(iz)+vte*fact
+            b_q(iz)=b_q(iz)+vqb*fact
+         enddo              
+      enddo
+      
+
+      
+      return
+      end subroutine urban_meso
+
+! ===6=8===============================================================72 
+! ===6=8===============================================================72 
+
+      subroutine interp_length(nd,kms,kme,kts,kte,nz_u,z_u,z,ss,ws,bs, &amp;
+                             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 &quot;urban grid&quot;
+      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)/                           &amp;                
+                    ((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,    &amp;
+                           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,   &amp;    
+                      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,   &amp;    
+                      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))*            &amp;
+                         (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)
+
+! ----------------------------------------------------------------------
+! This routine computes the effects of a shadow induced by a building of 
+! height hu, on a portion of wall between z1 and z2. See equation A10, 
+! and correction described below formula A11, and figure A1. Basically rd
+! is the ratio between the horizontal surface illuminated and the portion
+! of wall. Referring to figure A1, multiplying radiation flux density on 
+! a horizontal surface (rs) by x1-x2 we have the radiation energy per 
+! unit time. Dividing this by z2-z1, we obtain the radiation flux 
+! density reaching the portion of the wall between z2 and z1 
+! (everything is assumed in 2D)
+! ----------------------------------------------------------------------
+
+      implicit none
+      
+! ----------------------------------------------------------------------
+! INPUT:
+! ----------------------------------------------------------------------
+      real aa                   ! Angle between the sun direction and the face of the wall (A12)
+      real hu                   ! Height of the building that generates the shadow
+      real phix                 ! Solar zenith angle
+      real ws                   ! Width of the street
+      real z1                   ! Height of the level z(iz)
+      real z2                   ! Height of the level z(iz+1)
+
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+      real rd                   ! Ratio between (x1-x2)/(z2-z1), see Fig. 1A. 
+                                ! Multiplying rd by rs (radiation flux 
+                                ! density on a horizontal surface) gives 
+                                ! the radiation flux density on the 
+                                ! portion of wall between z1 and z2. 
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+      real x1,x2                ! x1,x2 see Fig. A1.
+
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ----------------------------------------------------------------------
+
+      x1=min((hu-z1)*tan(phix),max(0.,ws/sin(aa)))
+      
+      x2=max((hu-z2)*tan(phix),0.)
+
+      rd=max(0.,sin(aa)*(max(0.,x1-x2))/(z2-z1))
+      
+      return
+      end subroutine shade_wall
+
+! ===6=8===============================================================72     
+! ===6=8===============================================================72     
+
+      subroutine long_rad(iurb,nz_u,id,emw,emg,emwin,pwin,twlev,&amp;
+                         fwg,fww,fgw,fsw,fsg,tg,tw,rlg,rlw,rl,pb)
+
+! ----------------------------------------------------------------------
+! This routine computes the effects of the reflections of long-wave 
+! radiation in the street canyon by solving the system 
+! of 2*nz_u+1 eqn. in 2*nz_u+1
+! unkonwn defined in A4, A5 and A6 of the paper (pages 295 and 296).
+! The system is solved by solving A X= B,
+! with A matrix B vector, and X solution. 
+! ----------------------------------------------------------------------
+
+      implicit none
+
+  
+      
+! ----------------------------------------------------------------------
+! INPUT:
+! ----------------------------------------------------------------------
+      real emg                        ! Emissivity of ground for the current urban class
+      real emw                        ! Emissivity of wall for the current urban class
+      real fgw(nz_um,ndm,nurbm)       ! View factors from ground to wall
+      real fsg(ndm,nurbm)             ! View factors from sky to ground
+      real fsw(nz_um,ndm,nurbm)       ! View factors from sky to wall
+      real fwg(nz_um,ndm,nurbm)       ! View factors from wall to ground
+      real fww(nz_um,nz_um,ndm,nurbm) ! View factors from wall to wall
+      integer id                      ! Current street direction
+      integer iurb                    ! Current urban class
+      integer nz_u                    ! Number of layer in the urban grid
+      real pb(nz_um)                  ! Probability to have a building with an height equal
+      real rl                         ! Downward flux of the longwave radiation
+      real tg(ndm,ng_u)               ! Temperature in each layer of the ground [K]
+      real tw(2*ndm,nz_um)            ! Temperature in each layer of the wall [K]
+!
+!New Variables for BEM
+!
+      real twlev(2*ndm,nz_um)         ! Window temperature in BEM [K]
+      real emwin                      ! Emissivity of windows
+      real pwin                       ! Coverage area fraction of windows in the walls of the buildings (BEM)
+      
+
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+      real rlg(ndm)                   ! Long wave radiation at the ground
+      real rlw(2*ndm,nz_um)           ! Long wave radiation at the walls
+
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+      integer i,j
+      real aaa(2*nz_um+1,2*nz_um+1)   ! terms of the matrix
+      real bbb(2*nz_um+1)             ! terms of the vector
+
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ----------------------------------------------------------------------
+
+
+! west wall
+       
+      do i=1,nz_u
+        
+        do j=1,nz_u
+         aaa(i,j)=0.
+        enddo
+        
+        aaa(i,i)=1.        
+       
+        do j=nz_u+1,2*nz_u
+         aaa(i,j)=-(1.-emw*(1.-pwin)-emwin*pwin)* &amp;
+                  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)
+        
+        bbb(i)=fsw(i,id,iurb)*rl+emg*fgw(i,id,iurb)*sigma*tg(id,ng_u)**4
+        do j=1,nz_u
+           bbb(i)=bbb(i)+pb(j+1)*sigma*fww(j,i,id,iurb)* &amp;
+                 (emw*(1.-pwin)*tw(2*id,j)**4+emwin*pwin*twlev(2*id,j)**4)+ &amp;
+                 fww(j,i,id,iurb)*rl*(1.-pb(j+1))
+        enddo
+        
+       enddo
+       
+! east wall
+
+       do i=1+nz_u,2*nz_u
+        
+        do j=1,nz_u
+         aaa(i,j)=-(1.-emw*(1.-pwin)-emwin*pwin)*fww(j,i-nz_u,id,iurb)*pb(j+1)
+        enddo
+        
+        do j=1+nz_u,2*nz_u
+         aaa(i,j)=0.
+        enddo
+        
+        aaa(i,i)=1.
+        
+        aaa(i,2*nz_u+1)=-(1.-emg)*fgw(i-nz_u,id,iurb)
+        
+        bbb(i)=fsw(i-nz_u,id,iurb)*rl+  &amp;     
+               emg*fgw(i-nz_u,id,iurb)*sigma*tg(id,ng_u)**4
+
+        do j=1,nz_u
+         bbb(i)=bbb(i)+pb(j+1)*sigma*fww(j,i-nz_u,id,iurb)*  &amp;   
+                (emw*(1.-pwin)*tw(2*id-1,j)**4+emwin*pwin*twlev(2*id-1,j)**4)+&amp;   
+                fww(j,i-nz_u,id,iurb)*rl*(1.-pb(j+1))
+        enddo
+       
+       enddo
+
+! ground
+       do j=1,nz_u
+        aaa(2*nz_u+1,j)=-(1.-emw*(1.-pwin)-emwin*pwin)* &amp;
+                         fwg(j,id,iurb)*pb(j+1)
+       enddo
+       
+       do j=nz_u+1,2*nz_u
+        aaa(2*nz_u+1,j)=-(1.-emw*(1.-pwin)-emwin*pwin)* &amp;
+                         fwg(j-nz_u,id,iurb)*pb(j-nz_u+1)
+       enddo
+       
+       aaa(2*nz_u+1,2*nz_u+1)=1.
+       
+       bbb(2*nz_u+1)=fsg(id,iurb)*rl
+       
+       do i=1,nz_u
+        bbb(2*nz_u+1)=bbb(2*nz_u+1)+sigma*fwg(i,id,iurb)*pb(i+1)*         &amp;
+                      (emw*(1.-pwin)*(tw(2*id-1,i)**4+tw(2*id,i)**4)+     &amp;
+                      emwin*pwin*(twlev(2*id-1,i)**4+twlev(2*id,i)**4))+  &amp;
+                      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,                        &amp; 
+                           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)
+
+! ----------------------------------------------------------------------
+! 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
+                     pause '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)pause '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,                       &amp;
+                          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
+       
+      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=(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)
+
+! ----------------------------------------------------------------------
+!        Inversion and resolution of a tridiagonal matrix
+!                   A X = C
+! ----------------------------------------------------------------------
+
+      implicit none
+                
+! ----------------------------------------------------------------------
+! INPUT:
+! ----------------------------------------------------------------------
+       integer n
+       real a(n,3)              !  a(*,1) lower diagonal (Ai,i-1)
+                                !  a(*,2) principal diagonal (Ai,i)
+                                !  a(*,3) upper diagonal (Ai,i+1)
+       real c(n)
+
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+       real x(n)    
+
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+       integer i
+
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ----------------------------------------------------------------------
+                     
+       do i=n-1,1,-1                 
+          c(i)=c(i)-a(i,3)*c(i+1)/a(i+1,2)
+          a(i,2)=a(i,2)-a(i,3)*a(i+1,1)/a(i+1,2)
+       enddo
+       
+       do i=2,n        
+          c(i)=c(i)-a(i,1)*c(i-1)/a(i-1,2)
+       enddo
+        
+       do i=1,n
+          x(i)=c(i)/a(i,2)
+       enddo
+
+       return
+       end subroutine invert
+  
+
+! ===6=8===============================================================72  
+! ===6=8===============================================================72
+  
+      subroutine flux_wall(ua,va,pt,da,ptw,ptwin,uva,vva,uvb,vvb,  &amp;
+                           sfw,sfwin,evb,drst,dt)         
+       
+! ----------------------------------------------------------------------
+! This routine computes the surface sources or sinks of momentum, tke,
+! and heat from vertical surfaces (walls).   
+! ----------------------------------------------------------------------
+      implicit none   
+         
+! INPUT:
+! -----
+      real drst                 ! street directions for the current urban class
+      real da                   ! air density
+      real pt                   ! potential temperature
+      real ptw                  ! Walls potential temperatures 
+      real ptwin                ! Windows potential temperatures
+      real ua                   ! wind speed
+      real va                   ! wind speed
+      real dt                   !time step
+
+! OUTPUT:
+! ------
+! Explicit and implicit component of the momentum, temperature and TKE sources or sinks on
+! vertical surfaces (walls).
+! The fluxes can be computed as follow: Fluxes of X = A*X + B
+! Example: Momentum fluxes on vertical surfaces = uva_u * ua_u + uvb_u
+
+      real uva                  ! U (wind component)   Vertical surfaces, A (implicit) term
+      real uvb                  ! U (wind component)   Vertical surfaces, B (explicit) term
+      real vva                  ! V (wind component)   Vertical surfaces, A (implicit) term
+      real vvb                  ! V (wind component)   Vertical surfaces, B (explicit) term
+!     real tva                  ! Temperature          Vertical surfaces, A (implicit) term
+!     real tvb                  ! Temperature          Vertical surfaces, B (explicit) term
+      real evb                  ! Energy (TKE)         Vertical surfaces, B (explicit) term
+      real sfw                  ! Surfaces fluxes from the walls
+      real sfwin                ! Surfaces fluxes from the windows
+
+! LOCAL:
+! -----
+      real hc
+      real hcwin
+      real u_ort
+      real vett
+
+
+! -------------------------
+! END VARIABLES DEFINITIONS
+! -------------------------
+
+      vett=(ua**2+va**2)**.5         
+         
+      u_ort=abs((cos(drst)*ua-sin(drst)*va))
+       
+      uva=-cdrag*u_ort/2.*cos(drst)*cos(drst)
+      vva=-cdrag*u_ort/2.*sin(drst)*sin(drst)
+         
+      uvb=cdrag*u_ort/2.*sin(drst)*cos(drst)*va
+      vvb=cdrag*u_ort/2.*sin(drst)*cos(drst)*ua         
+
+      if (vett.lt.4.88) then   
+         hc=5.678*(1.09+0.23*(vett/0.3048))  
+      else
+         hc=5.678*0.53*((vett/0.3048)**0.78)
+      endif 
+
+      if (hc.gt.da*cp_u/dt)then
+         hc=da*cp_u/dt
+      endif
+
+       if (vett.lt.4.88) then
+          hcwin=5.678*(0.99+0.21*(vett/0.3048))
+       else
+          hcwin=5.678*0.50*((vett/0.3048)**0.78)
+       endif
+
+       if (hcwin.gt.da*cp_u/dt) then
+           hcwin=da*cp_u/dt
+       endif
+         
+!         tvb=hc*ptw/da/cp_u
+!         tva=-hc/da/cp_u
+!!!!!!!!!!!!!!!!!!!!
+! explicit 
+
+      sfw=hc*(pt-ptw)
+      sfwin=hcwin*(pt-ptwin)  
+       
+         
+      evb=cdrag*(abs(u_ort)**3.)/2.
+              
+      return
+      end subroutine flux_wall
+         
+! ===6=8===============================================================72
+! ===6=8===============================================================72
+
+      subroutine flux_flat(dz,z0,ua,va,pt,pt0,ptg,                     &amp;
+                          uhb,vhb,sf,ehb,da)
+                                
+! ----------------------------------------------------------------------
+!           Calculation of the flux at the ground 
+!           Formulation of Louis (Louis, 1979)       
+! ----------------------------------------------------------------------
+
+      implicit none
+
+      real dz                   ! first vertical level
+      real pt                   ! potential temperature
+      real pt0                  ! reference potential temperature
+      real ptg                  ! ground potential temperature
+      real ua                   ! wind speed
+      real va                   ! wind speed
+      real z0                   ! Roughness length
+      real da                   ! air density
+      
+     
+
+! ----------------------------------------------------------------------
+! OUTPUT:
+! ----------------------------------------------------------------------
+! Explicit component of the momentum, temperature and TKE sources or sinks on horizontal 
+!  surfaces (roofs and street)
+! The fluxes can be computed as follow: Fluxes of X = B
+!  Example: Momentum fluxes on horizontal surfaces =  uhb_u
+      real uhb                  ! U (wind component) Horizontal surfaces, B (explicit) term
+      real vhb                  ! V (wind component) Horizontal surfaces, B (explicit) term
+!     real thb                  ! Temperature        Horizontal surfaces, B (explicit) term
+!     real tva                  ! Temperature          Vertical surfaces, A (implicit) term
+!     real tvb                  ! Temperature          Vertical surfaces, B (explicit) term
+      real ehb                  ! Energy (TKE)       Horizontal surfaces, B (explicit) term
+      real sf
+
+
+! ----------------------------------------------------------------------
+! LOCAL:
+! ----------------------------------------------------------------------
+      real aa
+      real al
+      real buu
+      real c
+      real fbuw
+      real fbpt
+      real fh
+      real fm
+      real ric
+      real tstar
+      real ustar
+      real utot
+      real wstar
+      real zz
+      
+      real b,cm,ch,rr,tol
+      parameter(b=9.4,cm=7.4,ch=5.3,rr=0.74,tol=.001)
+
+! ----------------------------------------------------------------------
+! END VARIABLES DEFINITIONS
+! ----------------------------------------------------------------------
+
+
+! computation of the ground temperature
+         
+      utot=(ua**2+va**2)**.5
+        
+      
+!!!! Louis formulation
+!
+! compute the bulk Richardson Number
+
+      zz=dz/2.
+   
+
+      utot=max(utot,0.01)
+          
+      ric=2.*g_u*zz*(pt-ptg)/((pt+ptg)*(utot**2))
+              
+      aa=vk/log(zz/z0)
+
+! determine the parameters fm and fh for stable, neutral and unstable conditions
+
+      if(ric.gt.0)then
+         fm=1/(1+0.5*b*ric)**2
+         fh=fm
+      else
+         c=b*cm*aa*aa*(zz/z0)**.5
+         fm=1-b*ric/(1+c*(-ric)**.5)
+         c=c*ch/cm
+         fh=1-b*ric/(1+c*(-ric)**.5)
+      endif
+      
+      fbuw=-aa*aa*utot*utot*fm
+      fbpt=-aa*aa*utot*(pt-ptg)*fh/rr
+                     
+      ustar=(-fbuw)**.5
+      tstar=-fbpt/ustar
+
+      al=(vk*g_u*tstar)/(pt*ustar*ustar)                      
+      
+      buu=-g_u/pt0*ustar*tstar
+       
+      uhb=-ustar*ustar*ua/utot
+      vhb=-ustar*ustar*va/utot 
+      sf= ustar*tstar*da*cp_u   
+       
+!     thb= 0.      
+      ehb=buu
+!!!!!!!!!!!!!!!
+         
+      return
+      end subroutine flux_flat
+
+! ===6=8===============================================================72
+! ===6=8===============================================================72
+
+      subroutine icBEP (fww,fwg,fgw,fsw,fws,fsg,                       &amp;
+                       z0g_u,z0r_u,                                    &amp;
+                       nd_u,strd_u,ws_u,bs_u,h_b,d_b,ss_u,pb_u,        &amp;
+                       nz_u,z_u)                               
+
+
+      implicit none 
+      
+   
+!    Building parameters      
+
+!    Radiation parameters
+
+!    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 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
+! -----------------------------------------------------------------------
+!     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
+
+      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 some variables
+!
+       nz_u=0
+       z_u=0.    
+       ss_u=0.
+       pb_u=0.
+       fww=0.
+       fwg=0.
+       fgw=0.
+       fsw=0.
+       fws=0.
+       fsg=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)
+
+            call view_factors(iurb,nz_u(iurb),id,strd_u(id,iurb),   &amp;    
+                            z_u,ws_u(id,iurb),                      &amp;    
+                            fww,fwg,fgw,fsg,fsw,fws) 
+
+            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)                      &amp;    
+                    .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) 
+     
+      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)
+
+      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)+  &amp;
+           y*((1.+x**2)**.5)*atan(y/((1.+x**2)**.5))+          &amp;  
+           x*((1.+y**2)**.5)*atan(x/((1.+y**2)**.5))-          &amp;   
+           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)
+
+      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,&amp;
+        twini_u,trini_u,tgini_u,albg_u,albw_u,albr_u,albwin_u,emg_u,emw_u,&amp;
+        emr_u,emwind_u,z0g_u,z0r_u,nd_u,strd_u,drst_u,ws_u,bs_u,h_b,d_b, &amp;
+        cop_u, pwin_u, beta_u, sw_cond_u, time_on_u, time_off_u, &amp;
+        targtemp_u, gaptemp_u, targhum_u, gaphum_u, perflo_u, hsesf_u, hsequip)
+
+! initialization routine, where the variables from the table are read
+
+      implicit none
+      
+      integer iurb            ! urban class number
+!    Building parameters      
+      real alag_u(nurbm)      ! Ground thermal diffusivity [m^2 s^-1]
+      real alaw_u(nurbm)      ! Wall thermal diffusivity [m^2 s^-1]
+      real alar_u(nurbm)      ! Roof thermal diffusivity [m^2 s^-1]
+      real csg_u(nurbm)       ! Specific heat of the ground material [J m^3 K^-1]
+      real csw_u(nurbm)       ! Specific heat of the wall material [J m^3 K^-1]
+      real csr_u(nurbm)       ! Specific heat of the roof material [J m^3 K^-1]
+      real twini_u(nurbm)     ! Temperature inside the buildings behind the wall [K]
+      real trini_u(nurbm)     ! Temperature inside the buildings behind the roof [K]
+      real tgini_u(nurbm)     ! Initial road temperature
+
+!    Radiation parameters
+      real albg_u(nurbm)      ! Albedo of the ground
+      real albw_u(nurbm)      ! Albedo of the wall
+      real albr_u(nurbm)      ! Albedo of the roof
+      real albwin_u(nurbm)    ! Albedo of the window
+      real emg_u(nurbm)       ! Emissivity of ground
+      real emw_u(nurbm)       ! Emissivity of wall
+      real emr_u(nurbm)       ! Emissivity of roof
+      real emwind_u(nurbm)    ! Emissivity of windows
+
+!    Roughness parameters
+      real z0g_u(nurbm)       ! The ground's roughness length      
+      real z0r_u(nurbm)       ! The roof's roughness length
+
+!    Street parameters
+      integer nd_u(nurbm)     ! Number of street direction for each urban class
+
+      real strd_u(ndm,nurbm)  ! Street length (fix to greater value to the horizontal length of the cells)
+      real drst_u(ndm,nurbm)  ! Street direction [degree]
+      real ws_u(ndm,nurbm)    ! Street width [m]
+      real bs_u(ndm,nurbm)    ! Building width [m]
+      real h_b(nz_um,nurbm)   ! Bulding's heights [m]
+      real d_b(nz_um,nurbm)   ! The probability that a building has an height h_b
+
+      integer i,iu
+      integer nurb ! number of urban classes used
+
+      real, intent(out) :: cop_u(nurbm)
+      real, intent(out) :: pwin_u(nurbm)
+      real, intent(out) :: beta_u(nurbm)
+      integer, intent(out) :: sw_cond_u(nurbm)
+      real, intent(out) :: time_on_u(nurbm)
+      real, intent(out) :: time_off_u(nurbm)
+      real, intent(out) :: targtemp_u(nurbm)
+      real, intent(out) :: gaptemp_u(nurbm)
+      real, intent(out) :: targhum_u(nurbm)
+      real, intent(out) :: gaphum_u(nurbm)
+      real, intent(out) :: perflo_u(nurbm)
+      real, intent(out) :: hsesf_u(nurbm)
+      real, intent(out) :: hsequip(24)
+
+!
+!We initialize
+!
+        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
+!MT BEM
+       cop_u = cop_tbl
+       pwin_u = pwin_tbl
+       beta_u = beta_tbl
+       sw_cond_u = sw_cond_tbl
+       time_on_u = time_on_tbl
+       time_off_u = time_off_tbl
+       targtemp_u = targtemp_tbl
+       gaptemp_u = gaptemp_tbl
+       targhum_u = targhum_tbl
+       gaphum_u = gaphum_tbl
+       perflo_u = perflo_tbl
+       hsesf_u = hsesf_tbl
+       hsequip = hsequip_tbl
+
+       do iu=1,icate
+              if(ndm.lt.nd_u(iu))then
+                write(*,*)'ndm too small in module_sf_bep, please increase to at least ', nd_u(iu)
+                write(*,*)'remember also that num_urban_layers should be equal or greater than nz_um*ndm*nwr-u!'
+                stop
+              endif
+         do i=1,nd_u(iu)
+           drst_u(i,iu)=STREET_DIRECTION_TBL(i,iu) * pi/180.
+           ws_u(i,iu)=STREET_WIDTH_TBL(i,iu)
+           bs_u(i,iu)=BUILDING_WIDTH_TBL(i,iu)
+         enddo
+       enddo
+       do iu=1,ICATE
+          if(nz_um.lt.numhgt_tbl(iu)+3)then
+              write(*,*)'nz_um too small in module_sf_bep, please increase to at least ',numhgt_tbl(iu)+3
+              write(*,*)'remember also that num_urban_layers should be equal or greater than nz_um*ndm*nwr-u!'
+              stop
+          endif
+         do i=1,NUMHGT_TBL(iu)
+           h_b(i,iu)=HEIGHT_BIN_TBL(i,iu)
+           d_b(i,iu)=HPERCENT_BIN_TBL(i,iu)
+         enddo
+       enddo
+
+       do i=1,ndm
+        do iu=1,nurbm
+         strd_u(i,iu)=100000.
+        enddo
+       enddo
+
+       do iu=1,nurb  
+          emwind_u(iu)=0.9                       
+          call albwindow(albwin_u(iu))  
+       enddo
+       
+       return
+       end subroutine init_para
+! ===6================================================================72
+! ===6================================================================72
+      subroutine upward_rad(nd_u,nz_u,ws,bs,sigma,pb,ss,                     &amp;
+                       tg,emg_u,albg_u,rlg,rsg,sfg,                          &amp; 
+                       tw,emw_u,albw_u,rlw,rsw,sfw,                          &amp; 
+                       tr,emr_u,albr_u,emwind,albwind,twlev,pwin,            &amp;
+                       sfwind,rld,rs, sfr,                                   &amp; 
+                       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 nz_u
+      real ss(nz_um)                ! Probability to have a building of a given height
+      real sigma                       
+      real emg_u                       ! emissivity of the street
+      real emw_u                       ! emissivity of the wall
+      real emr_u                       ! emissivity of the roof
+      real tw(2*ndm,nz_um)  ! Temperature in each layer of the wall [K]
+      real tr(ndm,nz_um,nwr_u)  ! Temperature in each layer of the roof [K]
+      real tg(ndm,ng_u)          ! Temperature in each layer of the ground [K]
+      integer id ! street direction
+      integer nd_u ! number of street directions
+!
+!New variables BEM
+!
+      real emwind               !Emissivity of the windows
+      real albwind              !Albedo of the windows
+      real twlev(2*ndm,nz_um)   !Averaged Temperature of the windows 
+      real pwin                 !Coverage area fraction of the windows
+      real gflwin               !Heat stored for the windows
+      real sfwind(2*ndm,nz_um)  !Sensible heat flux from windows [W/m²]
+
+!OUTPUT/INPUT
+      real rs_abs  ! absrobed solar radiationfor this street direction
+      real rl_up   ! upward longwave radiation for this street direction
+      real emiss ! mean emissivity
+      real grdflx_urb ! ground heat flux 
+!LOCAL
+      integer iz,iw
+      real rl_inc,rl_emit
+      real gfl
+      integer ix,iy,iwrong
+
+         iwrong=1
+      do iz=1,nz_u+1
+      do id=1,nd_u
+      do iw=1,nwr_u
+        if(tr(id,iz,iw).lt.100.)then
+              write(*,*)'in upward_rad ',iz,id,iw,tr(id,iz,iw) 
+              iwrong=0
+        endif
+      enddo
+      enddo
+      enddo
+           if(iwrong.eq.0)stop
+
+      rl_up=0.

+      rs_abs=0.
+      rl_inc=0.
+      emiss=0.
+      rl_emit=0.
+      grdflx_urb=0.
+      do id=1,nd_u          
+       rl_emit=rl_emit-( emg_u*sigma*(tg(id,ng_u)**4.)+(1-emg_u)*rlg(id))*ws(id)/(ws(id)+bs(id))/nd_u
+       rl_inc=rl_inc+rlg(id)*ws(id)/(ws(id)+bs(id))/nd_u       
+       rs_abs=rs_abs+(1.-albg_u)*rsg(id)*ws(id)/(ws(id)+bs(id))/nd_u
+         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))/nd_u  

+          do iz=2,nz_u
+            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))/nd_u
+            rl_inc=rl_inc+rld*ss(iz)*bs(id)/(ws(id)+bs(id))/nd_u            
+            rs_abs=rs_abs+(1.-albr_u)*rs*ss(iz)*bs(id)/(ws(id)+bs(id))/nd_u
+            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))/nd_u
+         enddo
+           
+         do iz=1,nz_u 
+           
+            rl_emit=rl_emit-(emw_u*(1.-pwin)*sigma*(tw(2*id-1,iz)**4.+tw(2*id,iz)**4.)+ &amp;
+                            (emwind*pwin*sigma*(twlev(2*id-1,iz)**4.+twlev(2*id,iz)**4.))+ &amp;
+                ((1.-emw_u)*(1.-pwin)+pwin*(1.-emwind))*(rlw(2*id-1,iz)+rlw(2*id,iz)))* &amp;
+                            dz_u*pb(iz+1)/(ws(id)+bs(id))/nd_u
+
+            rl_inc=rl_inc+((rlw(2*id-1,iz)+rlw(2*id,iz)))*dz_u*pb(iz+1)/(ws(id)+bs(id))/nd_u
+
+            rs_abs=rs_abs+(((1.-albw_u)*(1.-pwin)+(1.-albwind)*pwin)*(rsw(2*id-1,iz)+rsw(2*id,iz)))*&amp;
+                          dz_u*pb(iz+1)/(ws(id)+bs(id))/nd_u 
+
+            gfl=(1.-albw_u)*(rsw(2*id-1,iz)+rsw(2*id,iz)) +emw_u*( rlw(2*id-1,iz)+rlw(2*id,iz) )   &amp;
+             -emw_u*sigma*( tw(2*id-1,iz)**4.+tw(2*id,iz)**4. )+(sfw(2*id-1,iz)+sfw(2*id,iz))   
+
+            gflwin=(1.-albwind)*(rsw(2*id-1,iz)+rsw(2*id,iz)) +emwind*(rlw(2*id-1,iz)+rlw(2*id,iz))   &amp;
+             -emwind*sigma*( twlev(2*id-1,iz)**4.+twlev(2*id,iz)**4.)+(sfwind(2*id-1,iz)+sfwind(2*id,iz)) 
+               
+           
+            grdflx_urb=grdflx_urb-(gfl*(1.-pwin)+pwin*gflwin)*dz_u*pb(iz+1)/(ws(id)+bs(id))/nd_u
+
+         enddo
+          
+      enddo
+        emiss=(emg_u+emw_u+emr_u)/3.
+        rl_up=(rl_inc+rl_emit)-rld
+       
+         
+      return
+
+      END SUBROUTINE upward_rad
+
+!====6=8===============================================================72         
+!====6=8===============================================================72 
+! ===6================================================================72
+! ===6================================================================72
+
+         subroutine albwindow(albwin)
+                
+!-------------------------------------------------------------------
+         implicit none
+
+
+! -------------------------------------------------------------------
+!Based on the 
+!paper of J.Karlsson and A.Roos(2000):&quot;modelling the angular behaviour
+!of the total solar energy transmittance of windows&quot;
+!Solar Energy Vol.69,No.4,pp. 321-329.      
+! -------------------------------------------------------------------
+!Input
+!-----        
+        
+!Output
+!------
+         real albwin                ! albedo of the window  
+!Local
+!-----
+         real a,b,c                !Polynomial coefficients
+         real alfa,delta,gama        !Polynomial powers
+         real g0                !transmittance when the angle 
+                                !of incidence is normal to the surface.
+         real asup,ainf
+         real fonc
+
+!Constants
+!--------------------
+         
+         real epsilon              !accuracy of the integration
+         parameter (epsilon=1.e-07) 
+         real n1,n2                !Index of refraction for glasses and air
+         parameter(n1=1.,n2=1.5)
+         integer intg,k
+!--------------------------------------------------------------------                
+         if (q_num.eq.0) then
+           write(*,*) 'Category parameter of the windows no valid'
+           stop
+         endif
+
+         g0=4.*n1*n2/((n1+n2)*(n1+n2))
+         a=8.
+         b=0.25/q_num
+         c=1.-a-b        
+         alfa =5.2 + (0.7*q_num)
+         delta =2.
+         gama =(5.26+0.06*p_num)+(0.73+0.04*p_num)*q_num
+
+         intg=1
+!----------------------------------------------------------------------
+
+
+100      asup=0.
+         ainf=0.
+
+         do k=1,intg
+          call foncs(fonc,(pi*k/intg),a,b,c,alfa,delta,gama)
+          asup=asup+(pi/intg)*fonc
+         enddo
+
+         intg=intg+1
+
+         do k=1,intg
+          call foncs(fonc,(pi*k/intg),a,b,c,alfa,delta,gama)
+          ainf=ainf+(pi/intg)*fonc
+         enddo
+         
+         if(abs(asup-ainf).lt.epsilon) then
+           albwin=1-g0+(g0/2.)*asup
+         else
+           goto 100
+         endif
+        
+!----------------------------------------------------------------------         
+        return
+        end subroutine albwindow
+!====================================================================72
+!====================================================================72
+
+        subroutine foncs(fonc,x,aa,bb,cc,alf,delt,gam)
+
+        implicit none
+!
+        real x,aa,bb,cc
+        real alf,delt,gam
+        real fonc
+  
+        fonc=(((aa*(x**alf))/(pi**alf))+   &amp;
+             ((bb*(x**delt))/(pi**delt))+  &amp;
+             ((cc*(x**gam))/(pi**gam)))*sin(x)
+        
+        return
+        end subroutine foncs
+!====================================================================72
+!====================================================================72  
+END MODULE module_sf_bep_bem

</font>
</pre>