!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer, 
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms 
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer 
!version 3 or (at your option) any later version that should be found at: 
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html 
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software; 
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), 
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
!!!S/P TOWN 
!
#include "phy_macros_f.h"
!

      SUBROUTINE TOWN ( bus, bussiz,        & 1,19
                        ptsurf, ptsurfsiz,  &
                        dt, trnch, kount,   &
                        n, m, nk )
!
      USE MODD_TOWN,      ONLY : NNI, XTOWN,                            &
                                 XQ_TOWN,                               &
                                 XU_CANYON,                             &
                                 XRN_ROOF,XH_ROOF,XLE_ROOF,XLES_ROOF,   &
                                 XGFLUX_ROOF,XRUNOFF_ROOF,              &
                                 XRN_ROAD,XH_ROAD,XLE_ROAD,XLES_ROAD,   &
                                 XGFLUX_ROAD,XRUNOFF_ROAD,              &
                                 XRN_WALL,XH_WALL,XLE_WALL,XGFLUX_WALL, &
                                 XRNSNOW_ROOF,XHSNOW_ROOF,XLESNOW_ROOF, &
                                 XGSNOW_ROOF,XMELT_ROOF,                &
                                 XRNSNOW_ROAD,XHSNOW_ROAD,XLESNOW_ROAD, &
                                 XGSNOW_ROAD,XMELT_ROAD,                &
                                 XRN,XH,XLE,XGFLUX,XEVAP,XRUNOFF,       &
                                 XCH,XRI,XUSTAR
      USE MODD_TEB_GRID,  ONLY : XLAT, XLON
      USE MODD_TEB,       ONLY : XZS, XBLD, XBLD_HEIGHT, XZ0_TOWN,      &
                                 XWALL_O_HOR, XCAN_HW_RATIO,            &
                                 XSVF_ROAD,XSVF_WALL,                   &
                                 XALB_ROOF, XALB_ROAD, XALB_WALL,       &
                                 XEMIS_ROOF, XEMIS_ROAD, XEMIS_WALL,    &
                                 XHC_ROOF, XTC_ROOF, XD_ROOF,           &
                                 XHC_ROAD, XTC_ROAD, XD_ROAD,           &
                                 XHC_WALL, XTC_WALL, XD_WALL,           &
                                 NROOF_LAYER, NROAD_LAYER, NWALL_LAYER, &
                                 XH_TRAFFIC, XLE_TRAFFIC,               &
                                 XH_INDUSTRY, XLE_INDUSTRY,             &
                                 XT_ROOF, XT_ROAD, XT_WALL,             &
                                 XWS_ROOF, XWS_ROAD,                    &
                                 XT_CANYON, XQ_CANYON,                  &
                                 XTI_ROAD, XTI_BLD,                     &
                                 TSNOW_ROOF,TSNOW_ROAD
      USE MODD_SURF_PAR,  ONLY : XUNDEF
      USE MODD_CSTS
!
      USE MODI_COUPLING_TEB_OROGRAPHY
      USE MODI_ALLOCATE_GR_SNOW
      USE MODI_INI_CSTS
      USE MODI_SUNPOS
      USE MODI_POSSOL 
!
#include "impnone.cdk"
!
      INTEGER bussiz, kount, trnch
      REAL    bus(bussiz), dt
      INTEGER ptsurfsiz
      INTEGER ptsurf(ptsurfsiz)
!
!-------------------------------------------------------------------------------------
!Author
!       Aude Lemonsu (April 2004)
! 
! 
!Object
!       Choose the surface scheme for towns 
! 
!Revision
! 001      A. Lemonsu (Dec 2005) Computation of zenithal angle
!                                + coherence between solar zenithal angle and radiation
! 
!Arguments
!               - Input/Output -
! BUS           bus of surface variables
!               - Input -
! BUSSIZ        size of the surface bus
! PTSURF        surface pointers
! PTSURFSIZ     dimension of ptsurf
! KOUNT         number of timestep
! TRNCH         row number
! DT            timestep
! N             running length
! M             horizontal dimension
! NK            vertical dimension
!-------------------------------------------------------------------------------------
!
      INTEGER  N, M, NK
! 
      INTEGER  surflen, X
      INTEGER  PTR
      INTEGER  I, J, K
!
#include "locbus.cdk"
!
      INTEGER INDX_SFC
      PARAMETER (INDX_SFC = INDX_URB)
      INTEGER QUELNIVO(MAXVARSURF)
!
#include "options.cdk"
!
#include "sfcbus.cdk"
!
#include "xptsurf.cdk"
!
#include "tebcst.cdk"
!
      REAL     JULIEN,JULIAND
      EXTERNAL JULIAND
      EXTERNAL FLXSURF3, DIASURF2, FILLAGG
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
! 
!     Local variables
!     ---------------
      INTEGER,DIMENSION (80) :: ALLOC_STATUS
      INTEGER                :: KYEAR       ! current year
      INTEGER                :: KMONTH      ! current month
      INTEGER                :: KDAY        ! current day 
      REAL                   :: PTIME       ! current time
      REAL                   :: PTSTEP      ! timestep   
!
      REAL, DIMENSION(N)     :: PTSUN       ! solar time
      REAL, DIMENSION(N)     :: PZENITH     ! solar zenithal angle
      REAL, DIMENSION(N)     :: PAZIM       ! solar azimuthal angle (rad from N, clock)
      REAL, DIMENSION(1)     :: PSW_BANDS   ! middle wavelength of each band
      REAL, DIMENSION(N,1)   :: PDIR_SW     ! direct ingoing solar radiation
      REAL, DIMENSION(N,1)   :: PSCA_SW     ! diffuse ingoing solar radiation
      REAL, DIMENSION(N)     :: PLW         ! ingoing longwave radiation
      REAL, DIMENSION(N)     :: PTA         ! air temperature at forcing level
      REAL, DIMENSION(N)     :: PQA         ! air specific humidity at forcing level
      REAL, DIMENSION(N)     :: PRHOA       ! air density at forcing level
      REAL, DIMENSION(N)     :: PU          ! zonal wind component       
      REAL, DIMENSION(N)     :: PV          ! meridional wind component       
      REAL, DIMENSION(N)     :: PPS         ! surface pressure 
      REAL, DIMENSION(N)     :: PPA         ! air pressure at forcing level
      REAL, DIMENSION(N)     :: PZS         ! topography 
      REAL, DIMENSION(N)     :: PSNOW       ! snow rate
      REAL, DIMENSION(N)     :: PRAIN       ! rain rate
      REAL, DIMENSION(N)     :: PZREF       ! height of forcing level for T and q
      REAL, DIMENSION(N)     :: PUREF       ! height of forcing level for the wind
      REAL, DIMENSION(N)     :: PSFTH       ! flux of heat 
      REAL, DIMENSION(N)     :: PSFTQ       ! flux of water vapor    
      REAL, DIMENSION(N)     :: PSFU        ! zonal momentum flux         
      REAL, DIMENSION(N)     :: PSFV        ! meridional momentum flux       
      REAL, DIMENSION(N)     :: PEMIS       ! emissivity
      REAL, DIMENSION(N)     :: PTRAD       ! radiative temperature
      REAL, DIMENSION(N,1)   :: PDIR_ALB    ! direct albedo for each band
      REAL, DIMENSION(N,1)   :: PSCA_ALB    ! diffuse albedo for each band
!
      REAL, DIMENSION(N)     :: ZTVI        ! Virtual temperature
!
      REAL, DIMENSION(N)     :: ZVMOD       ! Module of the wind
      REAL, DIMENSION(N)     :: RIBN
      REAL, DIMENSION(N)     :: LZZ0
      REAL, DIMENSION(N)     :: LZZ0T
      REAL, DIMENSION(N)     :: FM
      REAL, DIMENSION(N)     :: FH
      REAL, DIMENSION(N)     :: DFM
      REAL, DIMENSION(N)     :: DFH
!
!     Variables pour le calcul des angles solaires
      real zlat(n), zlon(n)
      real zday(n), zheure(n), zmin(n)
      real ztsun(n), zzenith(n), zazimsol(n)
!
      SURFLEN = M
!
      INIT_LOCBUS()
!
      NROOF_LAYER = ROOF_LAYER
      NROAD_LAYER = ROAD_LAYER
      NWALL_LAYER = WALL_LAYER
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
!
!     Allocation
!     ----------
!     General parameters
!     ------------------
      ALLOCATE( XLAT         (N)             , STAT=ALLOC_STATUS( 1) )
      ALLOCATE( XLON         (N)             , STAT=ALLOC_STATUS( 2) )
      ALLOCATE( XZS          (N)             , STAT=ALLOC_STATUS( 3) )
      ALLOCATE( XTOWN        (N)             , STAT=ALLOC_STATUS( 4) )
!     Urban parameters
!     ----------------
!     1. Geometric parameters :
      ALLOCATE( XBLD         (N)             , STAT=ALLOC_STATUS( 5) )
      ALLOCATE( XBLD_HEIGHT  (N)             , STAT=ALLOC_STATUS( 6) )
      ALLOCATE( XZ0_TOWN     (N)             , STAT=ALLOC_STATUS( 7) )
      ALLOCATE( XWALL_O_HOR  (N)             , STAT=ALLOC_STATUS( 8) )
      ALLOCATE( XCAN_HW_RATIO(N)             , STAT=ALLOC_STATUS( 9) )
      ALLOCATE( XSVF_ROAD    (N)             , STAT=ALLOC_STATUS(10) )
      ALLOCATE( XSVF_WALL    (N)             , STAT=ALLOC_STATUS(11) )
!     2. Radiative properties :
      ALLOCATE( XALB_ROOF    (N)             , STAT=ALLOC_STATUS(12) )
      ALLOCATE( XALB_ROAD    (N)             , STAT=ALLOC_STATUS(13) )
      ALLOCATE( XALB_WALL    (N)             , STAT=ALLOC_STATUS(14) )
      ALLOCATE( XEMIS_ROOF   (N)             , STAT=ALLOC_STATUS(15) )
      ALLOCATE( XEMIS_ROAD   (N)             , STAT=ALLOC_STATUS(16) )
      ALLOCATE( XEMIS_WALL   (N)             , STAT=ALLOC_STATUS(17) )
!     3. Thermal properties :  
      ALLOCATE( XHC_ROOF     (N,NROOF_LAYER) , STAT=ALLOC_STATUS(18) )
      ALLOCATE( XTC_ROOF     (N,NROOF_LAYER) , STAT=ALLOC_STATUS(19) )
      ALLOCATE( XD_ROOF      (N,NROOF_LAYER) , STAT=ALLOC_STATUS(20) )
      ALLOCATE( XHC_ROAD     (N,NROAD_LAYER) , STAT=ALLOC_STATUS(21) )
      ALLOCATE( XTC_ROAD     (N,NROAD_LAYER) , STAT=ALLOC_STATUS(22) )
      ALLOCATE( XD_ROAD      (N,NROAD_LAYER) , STAT=ALLOC_STATUS(23) )
      ALLOCATE( XHC_WALL     (N,NWALL_LAYER) , STAT=ALLOC_STATUS(24) )
      ALLOCATE( XTC_WALL     (N,NWALL_LAYER) , STAT=ALLOC_STATUS(25) )
      ALLOCATE( XD_WALL      (N,NWALL_LAYER) , STAT=ALLOC_STATUS(26) )
!     4. Anthropogenic fluxes :
      ALLOCATE( XH_TRAFFIC   (N)             , STAT=ALLOC_STATUS(27) )
      ALLOCATE( XLE_TRAFFIC  (N)             , STAT=ALLOC_STATUS(28) )
      ALLOCATE( XH_INDUSTRY  (N)             , STAT=ALLOC_STATUS(29) )
      ALLOCATE( XLE_INDUSTRY (N)             , STAT=ALLOC_STATUS(30) )
!     5. Pronostic variables : 
      ALLOCATE( XT_ROOF      (N,NROOF_LAYER) , STAT=ALLOC_STATUS(31) )
      ALLOCATE( XT_ROAD      (N,NROAD_LAYER) , STAT=ALLOC_STATUS(32) )
      ALLOCATE( XT_WALL      (N,NWALL_LAYER) , STAT=ALLOC_STATUS(33) )
      ALLOCATE( XWS_ROOF     (N)             , STAT=ALLOC_STATUS(34) )
      ALLOCATE( XWS_ROAD     (N)             , STAT=ALLOC_STATUS(35) )
      ALLOCATE( XT_CANYON    (N)             , STAT=ALLOC_STATUS(36) )
      ALLOCATE( XQ_CANYON    (N)             , STAT=ALLOC_STATUS(37) )
      ALLOCATE( XTI_ROAD     (N)             , STAT=ALLOC_STATUS(38) )
      ALLOCATE( XTI_BLD      (N)             , STAT=ALLOC_STATUS(39) )
!     6. Diagnostic variables :
      ALLOCATE( XQ_TOWN      (N)             , STAT=ALLOC_STATUS(40) )
      ALLOCATE( XU_CANYON    (N)             , STAT=ALLOC_STATUS(41) )
      ALLOCATE( XRN_ROOF     (N)             , STAT=ALLOC_STATUS(42) )
      ALLOCATE( XH_ROOF      (N)             , STAT=ALLOC_STATUS(43) )
      ALLOCATE( XLE_ROOF     (N)             , STAT=ALLOC_STATUS(44) )
      ALLOCATE( XLES_ROOF    (N)             , STAT=ALLOC_STATUS(45) )
      ALLOCATE( XGFLUX_ROOF  (N)             , STAT=ALLOC_STATUS(46) )
      ALLOCATE( XRUNOFF_ROOF (N)             , STAT=ALLOC_STATUS(47) )
      ALLOCATE( XRN_ROAD     (N)             , STAT=ALLOC_STATUS(48) )
      ALLOCATE( XH_ROAD      (N)             , STAT=ALLOC_STATUS(49) )
      ALLOCATE( XLE_ROAD     (N)             , STAT=ALLOC_STATUS(50) )
      ALLOCATE( XLES_ROAD    (N)             , STAT=ALLOC_STATUS(51) )
      ALLOCATE( XGFLUX_ROAD  (N)             , STAT=ALLOC_STATUS(52) )
      ALLOCATE( XRUNOFF_ROAD (N)             , STAT=ALLOC_STATUS(53) )
      ALLOCATE( XRN_WALL     (N)             , STAT=ALLOC_STATUS(54) )
      ALLOCATE( XH_WALL      (N)             , STAT=ALLOC_STATUS(55) )
      ALLOCATE( XLE_WALL     (N)             , STAT=ALLOC_STATUS(56) )
      ALLOCATE( XGFLUX_WALL  (N)             , STAT=ALLOC_STATUS(57) )
      ALLOCATE( XRNSNOW_ROOF (N)             , STAT=ALLOC_STATUS(58) )
      ALLOCATE( XHSNOW_ROOF  (N)             , STAT=ALLOC_STATUS(59) )
      ALLOCATE( XLESNOW_ROOF (N)             , STAT=ALLOC_STATUS(60) )
      ALLOCATE( XGSNOW_ROOF  (N)             , STAT=ALLOC_STATUS(61) )
      ALLOCATE( XMELT_ROOF   (N)             , STAT=ALLOC_STATUS(62) )
      ALLOCATE( XRNSNOW_ROAD (N)             , STAT=ALLOC_STATUS(63) )
      ALLOCATE( XHSNOW_ROAD  (N)             , STAT=ALLOC_STATUS(64) )
      ALLOCATE( XLESNOW_ROAD (N)             , STAT=ALLOC_STATUS(65) )
      ALLOCATE( XGSNOW_ROAD  (N)             , STAT=ALLOC_STATUS(66) )
      ALLOCATE( XMELT_ROAD   (N)             , STAT=ALLOC_STATUS(67) )
      ALLOCATE( XRN          (N)             , STAT=ALLOC_STATUS(68) )
      ALLOCATE( XH           (N)             , STAT=ALLOC_STATUS(69) )
      ALLOCATE( XLE          (N)             , STAT=ALLOC_STATUS(70) )
      ALLOCATE( XGFLUX       (N)             , STAT=ALLOC_STATUS(71) )
      ALLOCATE( XEVAP        (N)             , STAT=ALLOC_STATUS(72) )
      ALLOCATE( XRUNOFF      (N)             , STAT=ALLOC_STATUS(73) )
      ALLOCATE( XCH          (N)             , STAT=ALLOC_STATUS(74) )
      ALLOCATE( XRI          (N)             , STAT=ALLOC_STATUS(75) )
      ALLOCATE( XUSTAR       (N)             , STAT=ALLOC_STATUS(76) )
!
      TSNOW_ROOF%SCHEME = '1-L '
      TSNOW_ROAD%SCHEME = '1-L '
      CALL ALLOCATE_GR_SNOW(TSNOW_ROOF,N,1)
      CALL ALLOCATE_GR_SNOW(TSNOW_ROAD,N,1)
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
!     Initialisation
!     --------------
!     General parameters 
!     ------------------
      XLAT            = XUNDEF
      XLON            = XUNDEF
      XZS             = XUNDEF
      XTOWN           = XUNDEF
!     Urban parameters
!     ----------------
!     1. Geometric parameters :
      XBLD            = XUNDEF
      XBLD_HEIGHT     = XUNDEF
      XZ0_TOWN        = XUNDEF
      XWALL_O_HOR     = XUNDEF
      XCAN_HW_RATIO   = XUNDEF
      XSVF_ROAD       = XUNDEF
      XSVF_WALL       = XUNDEF
!     2. Radiative properties :
      XALB_ROOF       = XUNDEF
      XALB_ROAD       = XUNDEF
      XALB_WALL       = XUNDEF
      XEMIS_ROOF      = XUNDEF
      XEMIS_ROAD      = XUNDEF
      XEMIS_WALL      = XUNDEF
!     3. Thermal properties :
      XHC_ROOF        = XUNDEF
      XTC_ROOF        = XUNDEF
      XD_ROOF         = XUNDEF
      XHC_ROAD        = XUNDEF
      XTC_ROAD        = XUNDEF
      XD_ROAD         = XUNDEF
      XHC_WALL        = XUNDEF
      XTC_WALL        = XUNDEF
      XD_WALL         = XUNDEF
!     4. Anthropogenic fluxes :
      XH_TRAFFIC      = XUNDEF
      XLE_TRAFFIC     = XUNDEF
      XH_INDUSTRY     = XUNDEF
      XLE_INDUSTRY    = XUNDEF
!     5. Pronostic variables : 
      XT_ROOF         = XUNDEF
      XT_ROAD         = XUNDEF
      XT_WALL         = XUNDEF
      XWS_ROOF        = XUNDEF
      XWS_ROAD        = XUNDEF
      XT_CANYON       = XUNDEF
      XQ_CANYON       = XUNDEF
      XTI_ROAD        = XUNDEF
      XTI_BLD         = XUNDEF
!     6. Diagnostic variables : 
      XQ_TOWN         = XUNDEF
      XU_CANYON       = XUNDEF
      XRN_ROOF        = XUNDEF
      XH_ROOF         = XUNDEF
      XLE_ROOF        = XUNDEF
      XLES_ROOF       = XUNDEF
      XGFLUX_ROOF     = XUNDEF
      XRUNOFF_ROOF    = XUNDEF
      XRN_ROAD        = XUNDEF
      XH_ROAD         = XUNDEF
      XLE_ROAD        = XUNDEF
      XLES_ROAD       = XUNDEF
      XGFLUX_ROAD     = XUNDEF
      XRUNOFF_ROAD    = XUNDEF
      XRN_WALL        = XUNDEF
      XH_WALL         = XUNDEF
      XLE_WALL        = XUNDEF
      XGFLUX_WALL     = XUNDEF
      XRNSNOW_ROOF    = XUNDEF
      XHSNOW_ROOF     = XUNDEF
      XLESNOW_ROOF    = XUNDEF
      XGSNOW_ROOF     = XUNDEF
      XMELT_ROOF      = XUNDEF
      XRNSNOW_ROAD    = XUNDEF
      XHSNOW_ROAD     = XUNDEF
      XLESNOW_ROAD    = XUNDEF
      XGSNOW_ROAD     = XUNDEF
      XMELT_ROAD      = XUNDEF
      XRN             = XUNDEF
      XH              = XUNDEF
      XLE             = XUNDEF
      XGFLUX          = XUNDEF
      XEVAP           = XUNDEF
      XRUNOFF         = XUNDEF
      XCH             = XUNDEF
      XRI             = XUNDEF
      XUSTAR          = XUNDEF
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
      CALL INI_CSTS
!
!     Time
!     ----
      JULIEN       = JULIAND(dt,kount,DATE)
      PTIME        = date(5)*3600. + date(6)/100. + dt*(kount)
      KDAY         = date(3) + INT(PTIME/86400.)
      KMONTH       = date(2)
      KYEAR        = date(4)
      PTIME        = AMOD(PTIME,3600*24.)
      PTSTEP       = dt
      PSW_BANDS    = 0.
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
!     Calcul de l'angle zenithal
!     --------------------------
      do i=0,n-1
        xlat(i+1) = bus(x(dlat,i+1,1))*180./XPI
        xlon(i+1) = bus(x(dlon,i+1,1))*180./XPI
      end do
      zday(:)   = JULIEN
      zheure(:) = INT(ptime/3600.)*1.
      zmin(:)   = (ptime/3600.-INT(ptime/3600.))*60.
!
      call sunpos(kyear,kmonth,kday,ptime,xlon,xlat,ztsun,zzenith,zazimsol)
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
      do i=0,n-1
        ptsun         (i+1) = ZTSUN(i+1)                   !bus(x(tsun         ,i+1,1))
        pzenith       (i+1) = ZZENITH(i+1)                 !bus(x(zenith       ,i+1,1))
        pazim         (i+1) = ZAZIMSOL(i+1)                !bus(x(azim         ,i+1,1))
        pta           (i+1) = bus(x(tmoins       ,i+1,nk))
        pqa           (i+1) = bus(x(humoins      ,i+1,nk))
        pu            (i+1) = bus(x(umoins       ,i+1,nk))
        pv            (i+1) = bus(x(vmoins       ,i+1,nk))
        ppa           (i+1) = bus(x(pmoins       ,i+1,1))
        pps           (i+1) = bus(x(pmoins       ,i+1,1))
        pzs           (i+1) = bus(x(mf           ,i+1,1))
        psnow         (i+1) = bus(x(snowrate     ,i+1,1))
        prain         (i+1) = bus(x(rainrate     ,i+1,1))
        pdir_sw     (i+1,1) = bus(x(fdss         ,i+1,1))
        pdir_sw     (i+1,1) = bus(x(flusolis     ,i+1,1))
        psca_sw     (i+1,1) = 0.
        plw           (i+1) = bus(x(fdsi         ,i+1,1))
        ztvi          (i+1) = pta(i+1)*(1+((XRV/XRD)-1)*pqa(i+1))
       !prhoa         (i+1) = bus(x(rhod         ,i+1,nk))*1E02
        prhoa         (i+1) = pps(i+1)/XRD/ztvi(i+1)
        zvmod         (i+1) = sqrt(bus(x(umoins,i+1,nk))**2+bus(x(vmoins,i+1,nk))**2)
!
        pzref         (i+1) = bus(x(ztsl         ,i+1,1))
        puref         (i+1) = bus(x(zusl         ,i+1,1))

!       General variables 
!       -----------------
        xzs           (i+1) = bus(x(mf           ,i+1,1)) 
        xtown         (i+1) = bus(x(urban        ,i+1,1))
!       Urban parameters
!       ----------------
!       1. Geometric parameters :
        xbld          (i+1) = bus(x(bld          ,i+1,1)) 
        xbld_height   (i+1) = bus(x(bld_height   ,i+1,1)) 
        xz0_town      (i+1) = bus(x(z0_town      ,i+1,1)) 
        xwall_o_hor   (i+1) = bus(x(wall_o_hor   ,i+1,1)) 
        xcan_hw_ratio (i+1) = bus(x(can_hw_ratio ,i+1,1)) 
        xsvf_road     (i+1) = bus(x(svf_road     ,i+1,1))
        xsvf_wall     (i+1) = bus(x(svf_wall     ,i+1,1))
!       2. Radiative properties :
        xalb_roof     (i+1) = bus(x(alb_roof     ,i+1,1)) 
        xalb_road     (i+1) = bus(x(alb_road     ,i+1,1)) 
        xalb_wall     (i+1) = bus(x(alb_wall     ,i+1,1))
        xemis_roof    (i+1) = bus(x(emis_roof    ,i+1,1)) 
        xemis_road    (i+1) = bus(x(emis_road    ,i+1,1)) 
        xemis_wall    (i+1) = bus(x(emis_wall    ,i+1,1))
!       3. Anthropogenic fluxes :
        xh_traffic    (i+1) = bus(x(h_traffic    ,i+1,1))
        xle_traffic   (i+1) = bus(x(le_traffic   ,i+1,1)) 
        xh_industry   (i+1) = bus(x(h_industry   ,i+1,1)) 
        xle_industry  (i+1) = bus(x(le_industry  ,i+1,1)) 
!       4. Pronostic variables :
        xws_roof      (i+1) = bus(x(ws_roof      ,i+1,1)) 
        xws_road      (i+1) = bus(x(ws_road      ,i+1,1)) 
        xt_canyon     (i+1) = bus(x(t_canyon     ,i+1,1))
        xq_canyon     (i+1) = bus(x(q_canyon     ,i+1,1)) 
        xti_bld       (i+1) = bus(x(ti_bld       ,i+1,1)) 
        xti_road      (i+1) = bus(x(ti_road      ,i+1,1)) 
        do k=0,NROOF_LAYER-1
         xhc_roof (i+1,k+1) = bus(x(hc_roof  ,i+1+n*k,1)) 
         xtc_roof (i+1,k+1) = bus(x(tc_roof  ,i+1+n*k,1)) 
         xd_roof  (i+1,k+1) = bus(x(d_roof   ,i+1+n*k,1))
         xt_roof  (i+1,k+1) = bus(x(t_roof   ,i+1+n*k,1))  
        end do
        do k=0,NROAD_LAYER-1
         xhc_road (i+1,k+1) = bus(x(hc_road  ,i+1+n*k,1)) 
         xtc_road (i+1,k+1) = bus(x(tc_road  ,i+1+n*k,1)) 
         xd_road  (i+1,k+1) = bus(x(d_road   ,i+1+n*k,1)) 
         xt_road  (i+1,k+1) = bus(x(t_road   ,i+1+n*k,1)) 
        end do
        do k=0,NWALL_LAYER-1
         xhc_wall (i+1,k+1) = bus(x(hc_wall  ,i+1+n*k,1))
         xtc_wall (i+1,k+1) = bus(x(tc_wall  ,i+1+n*k,1)) 
         xd_wall  (i+1,k+1) = bus(x(d_wall   ,i+1+n*k,1)) 
         xt_wall  (i+1,k+1) = bus(x(t_wall   ,i+1+n*k,1))
        end do
!       5. Snow variables :
        tsnow_roof%wsnow(i+1,1,1) = bus(x(sroof_wsnow,i+1,1))
        tsnow_roof%t    (i+1,1,1) = bus(x(sroof_t    ,i+1,1))
        tsnow_roof%rho  (i+1,1,1) = bus(x(sroof_rho  ,i+1,1))
        tsnow_roof%alb  (i+1,1)   = bus(x(sroof_alb  ,i+1,1))
        tsnow_roof%emis (i+1,1)   = bus(x(sroof_emis ,i+1,1))
        tsnow_roof%ts   (i+1,1)   = bus(x(sroof_ts   ,i+1,1))
        tsnow_road%wsnow(i+1,1,1) = bus(x(sroad_wsnow,i+1,1))
        tsnow_road%t    (i+1,1,1) = bus(x(sroad_t    ,i+1,1))
        tsnow_road%rho  (i+1,1,1) = bus(x(sroad_rho  ,i+1,1))
        tsnow_road%alb  (i+1,1)   = bus(x(sroad_alb  ,i+1,1))
        tsnow_road%emis (i+1,1)   = bus(x(sroad_emis ,i+1,1))
        tsnow_road%ts   (i+1,1)   = bus(x(sroad_ts   ,i+1,1))
      end do
!

       ! coherence between solar zenithal angle and radiation
       !
       WHERE (SUM(PDIR_SW+PSCA_SW,2)>0.)
         PZENITH = MIN (PZENITH,XPI/2.-0.01)
       ELSEWHERE
         PZENITH = MAX (PZENITH,XPI/2.)
       END WHERE

      do i=0,n-1
        bus(x(tsun  ,i+1,1)) = PTSUN(i+1)
        bus(x(zenith,i+1,1)) = PZENITH(i+1)
        bus(x(azim  ,i+1,1)) = PAZIM(i+1)
      enddo
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
! if (kount > 0) then
!
      CALL COUPLING_TEB_OROGRAPHY(PTSTEP, KYEAR, KMONTH, KDAY, PTIME,           &
                  PTSUN, PZENITH, PAZIM, PZREF, PUREF, PZS, PU, PV, PQA, PTA,   &
                  PRHOA, PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS,   &
                  PPA, PSFTQ, PSFTH, PSFU, PSFV,                                &
                  PTRAD, PDIR_ALB, PSCA_ALB, PEMIS                              )
!
! endif
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
      do i=0,n-1
        bus(x(ws_roof      ,i+1,1)) = xws_roof     (i+1)
        bus(x(ws_road      ,i+1,1)) = xws_road     (i+1)
        bus(x(t_canyon     ,i+1,1)) = xt_canyon    (i+1)
        bus(x(q_canyon     ,i+1,1)) = xq_canyon    (i+1)
        bus(x(ti_bld       ,i+1,1)) = xti_bld      (i+1)
        bus(x(ti_road      ,i+1,1)) = xti_road     (i+1)
        do k=0,NROOF_LAYER-1
         bus(x(hc_roof ,i+1+n*k,1)) = xhc_roof (i+1,k+1)
         bus(x(tc_roof ,i+1+n*k,1)) = xtc_roof (i+1,k+1)
         bus(x(d_roof  ,i+1+n*k,1)) = xd_roof  (i+1,k+1)
         bus(x(t_roof  ,i+1+n*k,1)) = xt_roof  (i+1,k+1)
        end do
        do k=0,NROAD_LAYER-1
         bus(x(hc_road ,i+1+n*k,1)) = xhc_road (i+1,k+1)
         bus(x(tc_road ,i+1+n*k,1)) = xtc_road (i+1,k+1)
         bus(x(d_road  ,i+1+n*k,1)) = xd_road  (i+1,k+1)
         bus(x(t_road  ,i+1+n*k,1)) = xt_road  (i+1,k+1)
        end do
        do k=0,NWALL_LAYER-1
         bus(x(hc_wall ,i+1+n*k,1)) = xhc_wall (i+1,k+1)
         bus(x(tc_wall ,i+1+n*k,1)) = xtc_wall (i+1,k+1)
         bus(x(d_wall  ,i+1+n*k,1)) = xd_wall  (i+1,k+1)
         bus(x(t_wall  ,i+1+n*k,1)) = xt_wall  (i+1,k+1)
        end do
        bus(x(sroof_wsnow  ,i+1,1)) = tsnow_roof%wsnow(i+1,1,1)
        bus(x(sroof_t      ,i+1,1)) = tsnow_roof%t    (i+1,1,1)
        bus(x(sroof_rho    ,i+1,1)) = tsnow_roof%rho  (i+1,1,1)
        bus(x(sroof_alb    ,i+1,1)) = tsnow_roof%alb  (i+1,1)
        bus(x(sroof_emis   ,i+1,1)) = tsnow_roof%emis (i+1,1)
        bus(x(sroof_ts     ,i+1,1)) = tsnow_roof%ts   (i+1,1)
        bus(x(sroad_wsnow  ,i+1,1)) = tsnow_road%wsnow(i+1,1,1)
        bus(x(sroad_t      ,i+1,1)) = tsnow_road%t    (i+1,1,1)
        bus(x(sroad_rho    ,i+1,1)) = tsnow_road%rho  (i+1,1,1)
        bus(x(sroad_alb    ,i+1,1)) = tsnow_road%alb  (i+1,1)
        bus(x(sroad_emis   ,i+1,1)) = tsnow_road%emis (i+1,1)
        bus(x(sroad_ts     ,i+1,1)) = tsnow_road%ts   (i+1,1)
        bus(x(u_canyon     ,i+1,1)) = xu_canyon       (i+1)  
        bus(x(rn_town      ,i+1,1)) = xrn             (i+1)  
        bus(x(h_town       ,i+1,1)) = xh              (i+1)  
        bus(x(le_town      ,i+1,1)) = xle             (i+1)  
        bus(x(g_town       ,i+1,1)) = xgflux          (i+1)  
        bus(x(rn_roof      ,i+1,1)) = xrn_roof        (i+1)  
        bus(x(h_roof       ,i+1,1)) = xh_roof         (i+1)  
        bus(x(le_roof      ,i+1,1)) = xle_roof        (i+1)  
        bus(x(g_roof       ,i+1,1)) = xgflux_roof     (i+1)
        bus(x(rn_road      ,i+1,1)) = xrn_road        (i+1)  
        bus(x(h_road       ,i+1,1)) = xh_road         (i+1)  
        bus(x(le_road      ,i+1,1)) = xle_road        (i+1)  
        bus(x(g_road       ,i+1,1)) = xgflux_road     (i+1)
        bus(x(rn_wall      ,i+1,1)) = xrn_wall        (i+1)  
        bus(x(h_wall       ,i+1,1)) = xh_wall         (i+1)  
        bus(x(le_wall      ,i+1,1)) = xle_wall        (i+1)  
        bus(x(g_wall       ,i+1,1)) = xgflux_wall     (i+1)
!
!       Variables a agreger
!       -------------------
        bus(x(z0           ,i+1,indx_urb)) = xz0_town   (i+1)
        bus(x(z0t          ,i+1,indx_urb)) = 0.10 / 200.
        bus(x(tsurf        ,i+1,1))        = ptrad      (i+1)
        bus(x(tsrad        ,i+1,1))        = ptrad      (i+1)
        bus(x(qsurf        ,i+1,indx_urb)) = xq_town    (i+1)
        bus(x(alvis        ,i+1,indx_urb)) = pdir_alb   (i+1,1)
        bus(x(snodp        ,i+1,indx_urb)) = 0. 
        bus(x(fc           ,i+1,indx_urb)) = psfth      (i+1)
        bus(x(fv           ,i+1,indx_urb)) = psftq      (i+1)
      end do
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
      CALL FLXSURF3( bus(x(bm,1,1)), bus(x(bt,1,indx_urb)), RIBN,                &
                     bus(x(ftemp,1,indx_urb)), bus(x(fvap,1,indx_urb)),          &
                     bus(x(ilmo,1,indx_urb)), bus(x(frv,1,indx_urb)),            &
                     bus(x(fcor,1,1)), bus(x(tmoins,1,nk)), bus(x(humoins,1,nk)),&
                     bus(x(zusl,1,1)), bus(x(ztsl,1,1)), ZVMOD,                  &
                     bus(x(tsurf,1,1)), bus(x(qsurf,1,indx_urb)),                &
                     bus(x(hst,1,indx_urb)), bus(x(z0,1,indx_urb)),              &
                     bus(x(z0t,1,indx_urb)), LZZ0, LZZ0T, FM, FH, N              )
!
      CALL DIASURF2( bus(x(udiag,1,1)), bus(x(vdiag,1,1)), bus(x(tdiag,1,1)),    &
                     bus(x(qdiag,1,1)), n, bus(x(umoins,1,nk)),                  &
                     bus(x(vmoins,1,nk)), bus(x(tsurf,1,1)),                     &
                     bus(x(qsurf,1,indx_urb)), bus(x(z0,1,indx_urb)),            &
                     bus(x(z0t,1,indx_urb)), bus(x(ilmo,1,indx_urb)),            &
                     bus(x(zusl,1,1)), bus(x(hst,1,indx_urb)),                   &
                     bus(x(frv,1,indx_urb)), bus(x(ftemp,1,indx_urb)),           &
                     bus(x(fvap,1,indx_urb)), PUREF, PZREF, bus(x(dlat,1,1))     )
!
      do i=1,n
        bus(x(tdiag,i,1)) = bus(x(t_canyon,i,1))
        bus(x(qdiag,i,1)) = bus(x(q_canyon,i,1))
!
        bus(x(alfat,i,1)) = - bus(x(bt,i,indx_urb)) * ( bus(x(tsurf,i,1))       -bus(x(tmoins ,i,nk)))
        bus(x(alfaq,i,1)) = - bus(x(bt,i,indx_urb)) * ( bus(x(qsurf,i,indx_urb))-bus(x(humoins,i,nk)))
        if (.NOT.IMPFLX) bus(x(bt,i,indx_urb)) = 0.
        if (IMPFLX) then
         bus(x(alfat,i,1)) = - bus(x(bt,i,indx_urb)) * bus(x(tsurf,i,1)) 
         bus(x(alfaq,i,1)) = - bus(x(bt,i,indx_urb)) * bus(x(qsurf,i,indx_urb)) 
        endif
      end do
!
      CALL FILLAGG ( BUS, BUSSIZ, PTSURF, PTSURFSIZ, INDX_URB, SURFLEN )
!
!
!     General parameters
!     ------------------
      DEALLOCATE( XLAT              , STAT=ALLOC_STATUS( 1)  )
      DEALLOCATE( XLON              , STAT=ALLOC_STATUS( 2)  )
      DEALLOCATE( XZS               , STAT=ALLOC_STATUS( 3)  )
      DEALLOCATE( XTOWN             , STAT=ALLOC_STATUS( 4)  )
!     Urban parameters
!     ----------------
!     1.Geometric parameter :
      DEALLOCATE( XBLD              , STAT=ALLOC_STATUS( 5)  )
      DEALLOCATE( XBLD_HEIGHT       , STAT=ALLOC_STATUS( 6)  )
      DEALLOCATE( XZ0_TOWN          , STAT=ALLOC_STATUS( 7)  )
      DEALLOCATE( XWALL_O_HOR       , STAT=ALLOC_STATUS( 8)  )
      DEALLOCATE( XCAN_HW_RATIO     , STAT=ALLOC_STATUS( 9)  )
      DEALLOCATE( XSVF_ROAD         , STAT=ALLOC_STATUS(10)  )
      DEALLOCATE( XSVF_WALL         , STAT=ALLOC_STATUS(11)  )
!     2.Radiative properties :
      DEALLOCATE( XALB_ROOF         , STAT=ALLOC_STATUS(12)  )
      DEALLOCATE( XALB_ROAD         , STAT=ALLOC_STATUS(13)  )
      DEALLOCATE( XALB_WALL         , STAT=ALLOC_STATUS(14)  )
      DEALLOCATE( XEMIS_ROOF        , STAT=ALLOC_STATUS(15)  )
      DEALLOCATE( XEMIS_ROAD        , STAT=ALLOC_STATUS(16)  )
      DEALLOCATE( XEMIS_WALL        , STAT=ALLOC_STATUS(17)  )
!     3. Thermal properties :
      DEALLOCATE( XHC_ROOF          , STAT=ALLOC_STATUS(18)  )
      DEALLOCATE( XTC_ROOF          , STAT=ALLOC_STATUS(19)  )
      DEALLOCATE( XD_ROOF           , STAT=ALLOC_STATUS(20)  )
      DEALLOCATE( XHC_ROAD          , STAT=ALLOC_STATUS(21)  )
      DEALLOCATE( XTC_ROAD          , STAT=ALLOC_STATUS(22)  )
      DEALLOCATE( XD_ROAD           , STAT=ALLOC_STATUS(23)  )
      DEALLOCATE( XHC_WALL          , STAT=ALLOC_STATUS(24)  )
      DEALLOCATE( XTC_WALL          , STAT=ALLOC_STATUS(25)  )
      DEALLOCATE( XD_WALL           , STAT=ALLOC_STATUS(26)  )
!     4. Anthropogenic fluxes :
      DEALLOCATE( XH_TRAFFIC        , STAT=ALLOC_STATUS(27)  )
      DEALLOCATE( XLE_TRAFFIC       , STAT=ALLOC_STATUS(28)  )
      DEALLOCATE( XH_INDUSTRY       , STAT=ALLOC_STATUS(29)  )
      DEALLOCATE( XLE_INDUSTRY      , STAT=ALLOC_STATUS(30)  )
!     5. Pronostic variables I :
      DEALLOCATE( XT_ROOF           , STAT=ALLOC_STATUS(31)  )
      DEALLOCATE( XT_ROAD           , STAT=ALLOC_STATUS(32)  )
      DEALLOCATE( XT_WALL           , STAT=ALLOC_STATUS(33)  )
      DEALLOCATE( XWS_ROOF          , STAT=ALLOC_STATUS(34)  )
      DEALLOCATE( XWS_ROAD          , STAT=ALLOC_STATUS(35)  )
      DEALLOCATE( XT_CANYON         , STAT=ALLOC_STATUS(36)  )
      DEALLOCATE( XQ_CANYON         , STAT=ALLOC_STATUS(37)  )
      DEALLOCATE( XTI_ROAD          , STAT=ALLOC_STATUS(38)  )
      DEALLOCATE( XTI_BLD           , STAT=ALLOC_STATUS(39)  )
   !     6. Diagnostic variables
      DEALLOCATE( XQ_TOWN           , STAT=ALLOC_STATUS(40) )
      DEALLOCATE( XU_CANYON         , STAT=ALLOC_STATUS(41) )
      DEALLOCATE( XRN_ROOF          , STAT=ALLOC_STATUS(42) )
      DEALLOCATE( XH_ROOF           , STAT=ALLOC_STATUS(43) )
      DEALLOCATE( XLE_ROOF          , STAT=ALLOC_STATUS(44) )
      DEALLOCATE( XLES_ROOF         , STAT=ALLOC_STATUS(45) )
      DEALLOCATE( XGFLUX_ROOF       , STAT=ALLOC_STATUS(46) )
      DEALLOCATE( XRUNOFF_ROOF      , STAT=ALLOC_STATUS(47) )
      DEALLOCATE( XRN_ROAD          , STAT=ALLOC_STATUS(48) )
      DEALLOCATE( XH_ROAD           , STAT=ALLOC_STATUS(49) )
      DEALLOCATE( XLE_ROAD          , STAT=ALLOC_STATUS(50) )
      DEALLOCATE( XLES_ROAD         , STAT=ALLOC_STATUS(51) )
      DEALLOCATE( XGFLUX_ROAD       , STAT=ALLOC_STATUS(52) )
      DEALLOCATE( XRUNOFF_ROAD      , STAT=ALLOC_STATUS(53) )
      DEALLOCATE( XRN_WALL          , STAT=ALLOC_STATUS(54) )
      DEALLOCATE( XH_WALL           , STAT=ALLOC_STATUS(55) )
      DEALLOCATE( XLE_WALL          , STAT=ALLOC_STATUS(56) )
      DEALLOCATE( XGFLUX_WALL       , STAT=ALLOC_STATUS(57) )
      DEALLOCATE( XRNSNOW_ROOF      , STAT=ALLOC_STATUS(58) )
      DEALLOCATE( XHSNOW_ROOF       , STAT=ALLOC_STATUS(59) )
      DEALLOCATE( XLESNOW_ROOF      , STAT=ALLOC_STATUS(60) )
      DEALLOCATE( XGSNOW_ROOF       , STAT=ALLOC_STATUS(61) )
      DEALLOCATE( XMELT_ROOF        , STAT=ALLOC_STATUS(62) )
      DEALLOCATE( XRNSNOW_ROAD      , STAT=ALLOC_STATUS(63) )
      DEALLOCATE( XHSNOW_ROAD       , STAT=ALLOC_STATUS(64) )
      DEALLOCATE( XLESNOW_ROAD      , STAT=ALLOC_STATUS(65) )
      DEALLOCATE( XGSNOW_ROAD       , STAT=ALLOC_STATUS(66) )
      DEALLOCATE( XMELT_ROAD        , STAT=ALLOC_STATUS(67) )
      DEALLOCATE( XRN               , STAT=ALLOC_STATUS(68) )
      DEALLOCATE( XH                , STAT=ALLOC_STATUS(69) )
      DEALLOCATE( XLE               , STAT=ALLOC_STATUS(70) )
      DEALLOCATE( XGFLUX            , STAT=ALLOC_STATUS(71) )
      DEALLOCATE( XEVAP             , STAT=ALLOC_STATUS(72) )
      DEALLOCATE( XRUNOFF           , STAT=ALLOC_STATUS(73) )
      DEALLOCATE( XCH               , STAT=ALLOC_STATUS(74) )
      DEALLOCATE( XRI               , STAT=ALLOC_STATUS(75) )
      DEALLOCATE( XUSTAR            , STAT=ALLOC_STATUS(76) )
!     5. Pronostic variables II :
      DEALLOCATE( TSNOW_ROOF%WSNOW , STAT=ALLOC_STATUS( 1)  )
      DEALLOCATE( TSNOW_ROOF%T     , STAT=ALLOC_STATUS( 2)  )
      DEALLOCATE( TSNOW_ROOF%RHO   , STAT=ALLOC_STATUS( 3)  )
      DEALLOCATE( TSNOW_ROOF%ALB   , STAT=ALLOC_STATUS( 4)  )
      DEALLOCATE( TSNOW_ROOF%EMIS  , STAT=ALLOC_STATUS( 5)  )
      DEALLOCATE( TSNOW_ROOF%TS    , STAT=ALLOC_STATUS( 6)  )
      DEALLOCATE( TSNOW_ROAD%WSNOW , STAT=ALLOC_STATUS( 1)  )
      DEALLOCATE( TSNOW_ROAD%T     , STAT=ALLOC_STATUS( 2)  )
      DEALLOCATE( TSNOW_ROAD%RHO   , STAT=ALLOC_STATUS( 3)  )
      DEALLOCATE( TSNOW_ROAD%ALB   , STAT=ALLOC_STATUS( 4)  )
      DEALLOCATE( TSNOW_ROAD%EMIS  , STAT=ALLOC_STATUS( 5)  )
      DEALLOCATE( TSNOW_ROAD%TS    , STAT=ALLOC_STATUS( 6)  )


!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
      RETURN
      END