Skip to content
Snippets Groups Projects
coupling_tebn.F90 74.8 KiB
Newer Older
  !
  IF (TOP%LGARDEN .AND. TOP%CURBTREE/='NONE') THEN
     ! air temperature
     IF (TOP%LCANOPY) THEN
        DO JI=1,SIZE(GDM%PHV%XH_LAI_MAX)
           DO JLAYER=1,SB%NLVL-1
              !* finds middle of tree crown
              !+marine condition si XH_LAI_MAX < XZ(1)
              IF (GDM%PHV%XH_LAI_MAX(JI) < SB%XZ(JI,1)) THEN
                 ZCTL=1
                 ZTA_HVEG(JI) = SB%XT(JI,1)
                 ZQA_HVEG(JI) = SB%XQ(JI,1)
              ENDIF
              !- marine
              IF (SB%XZ(JI,JLAYER)  < GDM%PHV%XH_LAI_MAX(JI) .AND. & 
                  SB%XZ(JI,JLAYER+1)>=GDM%PHV%XH_LAI_MAX(JI)) THEN
                 ZCOEF(JI)    = (GDM%PHV%XH_LAI_MAX(JI)-SB%XZ(JI,JLAYER))/ (SB%XZ(JI,JLAYER+1)-SB%XZ(JI,JLAYER))
                 ZTA_HVEG(JI) = SB%XT(JI,JLAYER) + ZCOEF(JI)*(SB%XT(JI,JLAYER+1)-SB%XT(JI,JLAYER))
                 ZQA_HVEG(JI) = SB%XQ(JI,JLAYER) + ZCOEF(JI)*(SB%XQ(JI,JLAYER+1)-SB%XQ(JI,JLAYER))
              ENDIF
           ENDDO
           IF (ZCTL.NE.1) THEN
              CALL ABOR1_SFX("COUPLING_TEBN: Tree forcing temperature not attributed")
           ENDIF
        ENDDO
     ELSE
        ZTA_HVEG = ZT_CAN
        ZQA_HVEG = ZQ_CAN
     ENDIF
     ! tree leaves temperature
     ZTS_HVEG(:) = GDM%NPEHV%AL(JP)%XTV(:)
  ELSE
     ZTA_HVEG    = XUNDEF
     ZQA_HVEG    = XUNDEF
     ZTS_HVEG(:) = XUNDEF
  ENDIF
  !
  ! Storage of soil water depths in urban soils
  !
  IF (TOP%LURBHYDRO .AND. CT%LCHECK_TEB) THEN
     CT%XWATER_ROAD  (:)=0.0
     CT%XWATER_BLD   (:)=0.0
     CT%XWATER_GARDEN(:)=0.0
     DO JLAYER=1,SIZE(NT%AL(JP)%XT_ROAD,2)
        CT%XWATER_ROAD(:)   = CT%XWATER_ROAD(:)   +  NT%AL(JP)%XROAD(:)     * &
                             NT%AL(JP)%XD_ROAD(:,JLAYER) * HM%NTH%AL(JP)%XWG_ROAD(:,JLAYER)
        CT%XWATER_BLD (:)   = CT%XWATER_BLD (:)   +  NT%AL(JP)%XBLD (:)     * &
                             NT%AL(JP)%XD_ROAD(:,JLAYER) * HM%NTH%AL(JP)%XWG_BLD (:,JLAYER)
        CT%XWATER_GARDEN(:) = CT%XWATER_GARDEN(:) +  NT%AL(JP)%XGARDEN(:)   * &
                             NT%AL(JP)%XD_ROAD(:,JLAYER) * GDM%NPE%AL(JP)%XWG(:,JLAYER)
     ENDDO
  ENDIF
  !
  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  ! Call the physical routines of TEB (including gardens and greenroofs)
  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  !
  IF (MINVAL(ZQ_CAN).LT.-XSURF_EPSILON) THEN
     CALL ABOR1_SFX("COUPLING_TEBN: Negative humidity in canyon")
  ENDIF
  !
    !CHECK if old pressure is initialized
  IF(TOP%CBEM=='BEM' ) THEN
    IF (ANY(NB%AL(JP)%XPSOLD(:)==XUNDEF)) THEN
      NB%AL(JP)%XPSOLD(:)=PPS(:)  
    END IF
  CALL TOWN_ENERGY_BALANCE(DTCO, G, TOP, SPAOP, NT%AL(JP), BOP, NB%AL(JP), TPN, TIR, TD%NDMT%AL(JP), GDM, GRM, &
       HM, SB, CT, JP, HPROGRAM, CIMPLICIT_WIND, PTSUN, ZT_CAN, ZQ_CAN, ZU_CANYON, ZT_LOWCAN,  &
       ZQ_LOWCAN, ZU_LOWCAN, ZZ_LOWCAN, ZTA_HVEG, ZQA_HVEG,                                    &
       ZPEW_A_COEF, ZPEW_B_COEF, ZPEW_A_COEF_LOWCAN,                                           &
       ZPEW_B_COEF_LOWCAN, AT, PPS, NB%AL(JP)%XPSOLD, ZPA, ZEXNS, ZEXNA, ZTA, ZQA, PRHOA(:,1),     &
       PCO2, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, KSW, PZENITH, PAZIM, PRAIN, PSN, ZZREF,         &
       ZUREF, ZUA, ZH_TRAFFIC, ZLE_TRAFFIC, PTSTEP, ZLEW_RF, ZLEW_RD, ZRNSN_RF, ZHSN_RF,       &
       ZLESN_RF, ZGSN_RF, ZMELT_RF, ZRNSN_RD, ZHSN_RD, ZLESN_RD, ZGSN_RD, ZMELT_RD, ZRN_GRND,  &
       ZH_GRND, ZLE_GRND, ZGFLX_GRND, ZRN, ZH, ZH_TOWN_SURF, ZH_TOWN_WALL, ZH_TOWN_ROOF, ZLE,  &
       ZGFLX, ZQF, ZEVAP, ZEVAP_TOWN_SURF, ZEVAP_TOWN_WALL,ZEVAP_TOWN_ROOF, ZUW_GRND, ZUW_RF,  &
       ZDUWDU_GRND, ZDUWDU_RF, ZUSTAR, ZCD, ZCDN, ZCH, ZRI, ZTRAD, ZEMIS, ZDIR_ALB, ZSCA_ALB,  &
       ZRESA_TOWN, ZAC_RD, ZAC_GD, ZAC_GRF, ZAC_RD_WAT, ZAC_GD_WAT, ZAC_GRF_WAT, KDAY, &
       ZEMIT_LW_HVEG, TD%NDMT%AL(JP)%XREF_SW_GRND, TD%NDMT%AL(JP)%XREF_SW_FAC, ZREF_SW_HVEG,   &
       PTIME, TD%NDMT%AL(JP)%XDN_ROOF,TD%NDMT%AL(JP)%XDN_ROAD, ZTS_HVEG,                       &
       TD%NDMT%AL(JP)%XTS_GD, TD%NDMT%AL(JP)%XTS_GR, ZLAD_CAN, ZTRAF_MODULATION,               &
       ZPOP_MODULATION, ZDH_HVEG, ZDLE_HVEG, ZSCA_SW_SKY, ZLW_RAD_SKY,                         &
       ZSCA_SW_GROUND_DOWN, ZSCA_SW_GROUND_UP, ZSCA_SW_GROUND_HOR, ZLW_GROUND_DOWN,            &
       ZLW_GROUND_HOR, "OK" )
  !
  TD%NDMT%AL(JP)%XU_LOWCAN=ZU_LOWCAN
  !
  IF (TOP%CBEM=='BEM') THEN
     !
     ! The internal heat release as well as the heating and cooling
     ! energy demand are converted from W/m²(bld) to W/m²(urb).
     !
     TD%NDMT%AL(JP)%XQINOUT(:)    = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XQINOUT(:)
     TD%NDMT%AL(JP)%XQINOUTSEN(:) = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XQINOUTSEN(:)
     TD%NDMT%AL(JP)%XQINOUTLAT(:) = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XQINOUTLAT(:)
     !
     TD%NDMT%AL(JP)%XHVAC_COOL(:) = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XHVAC_COOL(:)
     TD%NDMT%AL(JP)%XHVAC_HEAT(:) = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XHVAC_HEAT(:)
     !
     TD%NDMT%AL(JP)%XHVAC_HEAT_ELEC   = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XHVAC_HEAT_ELEC
     TD%NDMT%AL(JP)%XHVAC_HEAT_GAS    = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XHVAC_HEAT_GAS
     TD%NDMT%AL(JP)%XHVAC_HEAT_FUEL   = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XHVAC_HEAT_FUEL
     TD%NDMT%AL(JP)%XHVAC_HEAT_OTHER  = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XHVAC_HEAT_OTHER
     !
     DO JCOMP=1,BOP%NBEMCOMP
         TD%NDMT%AL(JP)%XCOMP_QINOUT   (:,JCOMP) = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XCOMP_QINOUT(:,JCOMP)
         TD%NDMT%AL(JP)%XCOMP_HVAC_COOL(:,JCOMP) = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XCOMP_HVAC_COOL(:,JCOMP)
         TD%NDMT%AL(JP)%XCOMP_HVAC_HEAT(:,JCOMP) = NT%AL(JP)%XBLD(:) * TD%NDMT%AL(JP)%XCOMP_HVAC_HEAT(:,JCOMP)
     ENDDO
     !
  ENDIF
  !
  IF (.NOT. TOP%LCANOPY) THEN
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_T_CANYON,ZT_CAN)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_Q_CANYON,ZQ_CAN)
    !
    ! Momentum fluxes
    !
    ZSFU = 0.
    ZSFV = 0.
    DO JJ=1,SIZE(PU,1)
      IF (ZWIND(JJ,1)>0.) THEN
        ZCOEF(JJ) = - PRHOA(JJ,1) * ZUSTAR(JJ)**2 / ZWIND(JJ,1)
        ZSFU(JJ) = ZCOEF(JJ) * PU(JJ,1)
        ZSFV(JJ) = ZCOEF(JJ) * PV(JJ,1)
      ENDIF
    ENDDO
    CALL ADD_PATCH_CONTRIB(JP,PSFU,ZSFU)
    CALL ADD_PATCH_CONTRIB(JP,PSFV,ZSFV)
    !
  ENDIF
  !
  IF (CT%LCHECK_TEB) THEN
     CT%XH = ZH
     CT%XLE= ZLE
     CT%XRN=ZRN
  END IF
  !-------------------------------------------------------------------------------------
  ! Outputs:
  !-------------------------------------------------------------------------------------
  !
  ! Grid box average fluxes/properties: Arguments and standard diagnostics
  !
  CALL ADD_PATCH_CONTRIB(JP,PSFTH,ZH)
  CALL ADD_PATCH_CONTRIB(JP,PSFTH_SURF,ZH_TOWN_SURF)
  CALL ADD_PATCH_CONTRIB(JP,PSFTH_WALL,ZH_TOWN_WALL)
  CALL ADD_PATCH_CONTRIB(JP,PSFTH_ROOF,ZH_TOWN_ROOF)  
  !
  CALL ADD_PATCH_CONTRIB(JP,PSFTQ,ZEVAP)
  CALL ADD_PATCH_CONTRIB(JP,PSFTQ_SURF,ZEVAP_TOWN_SURF)
  CALL ADD_PATCH_CONTRIB(JP,PSFTQ_WALL,ZEVAP_TOWN_WALL)
  CALL ADD_PATCH_CONTRIB(JP,PSFTQ_ROOF,ZEVAP_TOWN_ROOF)
  CALL ADD_PATCH_CONTRIB(JP,PSFCO2,TD%NDMT%AL(JP)%XSFCO2)
  !
  ! Albedo for each wavelength and patch
  !
  DO JSWB=1,SIZE(PSW_BANDS)
     DO JJ=1,SIZE(ZDIR_ALB)
        ZDIR_ALB_PATCH(JJ,JSWB,JP) = ZDIR_ALB(JJ)
        ZSCA_ALB_PATCH(JJ,JSWB,JP) = ZSCA_ALB(JJ)
     ENDDO
  END DO
  !
  ! emissivity and radiative temperature
  !
  ZEMIS_PATCH(:,JP) = ZEMIS
  ZTRAD_PATCH(:,JP) = ZTRAD
  !
  ! computes some aggregated diagnostics
  !
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_CD ,ZCD )
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_CDN,ZCDN)
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_RI ,ZRI )
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_CH ,ZCH )
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_RN ,ZRN )
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_H  ,ZH  )
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_LE ,ZLE )
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_GFLX ,ZGFLX )
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_QF ,ZQF )
  !
  !* warning: aerodynamical resistance does not yet take into account gardens
  CALL ADD_PATCH_CONTRIB(JP,ZAVG_RESA_TOWN,1./ZRESA_TOWN)
  IF (JP==TOP%NTEB_PATCH) ZAVG_RESA_TOWN = 1./ZAVG_RESA_TOWN
  !
  !
  ! Use the modulated fields of traffic and industry releases for the output
  !
  TD%NDMT%AL(JP)%XH_TRAFFIC_OUT(:)   = ZH_TRAFFIC(:)
  TD%NDMT%AL(JP)%XLE_TRAFFIC_OUT(:)  = ZLE_TRAFFIC(:)
  TD%NDMT%AL(JP)%XH_INDUSTRY_OUT (:) = NT%AL(JP)%XH_INDUSTRY(:)
  TD%NDMT%AL(JP)%XLE_INDUSTRY_OUT(:) = NT%AL(JP)%XLE_INDUSTRY(:)
  !
  !
  ! ###############################################################
  ! ###############################################################
  ! Verification of energy conservation
  ! ###############################################################
  ! ###############################################################
  !
  IF (CT%LCHECK_TEB) CALL CHECK_TEB (TOP, BOP, NT, NB, TD, TPN, TIR, GDM, GRM, HM, CT, &
                                     HPROGRAM, KI, JP, PTSTEP, PTSUN, PRAIN, PSN       )
  !
  !
  ! Check for realistic temperatures
  IF (ANY(NT%AL(JP)%XT_ROOF .GT. XTT+100.) .OR. ANY(NT%AL(JP)%XT_WALL_A .GT. XTT+100. ) &
             .OR. ANY(NT%AL(JP)%XT_ROAD .GT. XTT+100. )) THEN
      CALL GET_LUOUT(HPROGRAM,ILUOUT)
      WRITE(ILUOUT,*) '--------------------------------------------------------'
      WRITE(ILUOUT,*) ' coupling_tebn : date and time (UTC) = ', KYEAR, KMONTH, KDAY, PTIME
      DO JLAYER=1,SIZE(NT%AL(JP)%XT_ROOF,2)
         WRITE(ILUOUT,*) " coupling_tebn : NT%AL(JP)%XT_ROOF  (:,",JLAYER,") = ", NT%AL(JP)%XT_ROOF(:,JLAYER)
      END DO
      WRITE(ILUOUT,*) ' '
      DO JLAYER=1,SIZE(NT%AL(JP)%XT_ROAD,2)
         WRITE(ILUOUT,*) " coupling_tebn : NT%AL(JP)%XT_ROAD  (:,",JLAYER,") = ", NT%AL(JP)%XT_ROAD(:,JLAYER)
      END DO
      WRITE(ILUOUT,*) ' '
      DO JLAYER=1,SIZE(NT%AL(JP)%XT_WALL_A,2)
         WRITE(ILUOUT,*) " coupling_tebn : NT%AL(JP)%XT_WALL_A(:,",JLAYER,") = ", NT%AL(JP)%XT_WALL_A(:,JLAYER)
      END DO
      CALL FLUSH(ILUOUT)
      CALL ABOR1_SFX("Irrealistic temperature reached for Roof, Road or Wall.")
  ENDIF
  !
  !-------------------------------------------------------------------------------------
  ! Diagnostics on each patch
  !-------------------------------------------------------------------------------------
  !
  IF (TD%MTO%LSURF_MISC_BUDGET) THEN
    !
    ! cumulated diagnostics 
    ! ---------------------
    !
    CALL CUMUL_DIAG_TEB_n(TD%NDMTC%AL(JP),  TD%NDMT%AL(JP),  &
                          GDM%VD%ND%AL(JP), GDM%VD%NDC%AL(JP), GDM%VD%NDEC%AL(JP), GDM%VD%NDE%AL(JP), &
                          GRM%VD%ND%AL(JP), GRM%VD%NDC%AL(JP), GRM%VD%NDEC%AL(JP), GRM%VD%NDE%AL(JP), TOP, PTSTEP, PRAIN, PSN)
    IF (TOP%LURBHYDRO) THEN 
      CALL BUDGET_HYDRO_n(TD%NDMTC%AL(JP), TD%NDMT%AL(JP), &
                        GDM%VD%NDC%AL(JP), GDM%VD%NDEC%AL(JP), GDM%VD%NDE%AL(JP), GRM%VD%NDC%AL(JP), GRM%VD%NDEC%AL(JP), &
                        NT%AL(JP), GDM%P, GDM%NPE%AL(JP), HM%NTH%AL(JP), TOP) 
    ENDIF
  ENDIF
  !
  !-------------------------------------------------------------------------------------
  ! Computes averaged parameters necessary for UTCI
  !-------------------------------------------------------------------------------------
  !
  IF (TD%O%N2M >0 .AND. TD%DU%LUTCI) THEN
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_REF_SW_GRND ,TD%NDMT%AL(JP)%XREF_SW_GRND )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_REF_SW_FAC  ,TD%NDMT%AL(JP)%XREF_SW_FAC )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_REF_SW_HVEG ,ZREF_SW_HVEG )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_SCA_SW      ,ZSCA_SW      )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_DIR_SW      ,ZDIR_SW      )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_SCA_SW_GROUND_DOWN, ZSCA_SW_GROUND_DOWN)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_SCA_SW_GROUND_UP  , ZSCA_SW_GROUND_UP)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_SCA_SW_GROUND_HOR , ZSCA_SW_GROUND_HOR)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_LW_GROUND_DOWN, ZLW_GROUND_DOWN)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_LW_GROUND_HOR , ZLW_GROUND_HOR)    
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_DIR_SW_ROAD ,TD%NDMT%AL(JP)%XDIR_SW_ROAD )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_EMIT_LW_FAC ,TD%NDMT%AL(JP)%XEMIT_LW_FAC )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_EMIT_LW_GRND,TD%NDMT%AL(JP)%XEMIT_LW_GRND)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_EMIT_LW_HVEG,ZEMIT_LW_HVEG)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_SCA_SW_SKY  ,ZSCA_SW_SKY  )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_LW_RAD_SKY  ,ZLW_RAD_SKY  )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_ROAD_SHADE  ,TD%NDMT%AL(JP)%XROAD_SHADE  )
    !
    IF (TOP%LGARDEN .AND. TOP%CURBTREE/='NONE') THEN
        CALL ADD_PATCH_CONTRIB(JP,ZAVG_TAU_SR   ,NT%AL(JP)%XTAU_SR) 
    ELSE
        ZAVG_TAU_SR(:)   = 1.   
    ENDIF  
    !
    DO JCOMP=1,BOP%NBEMCOMP
        CALL ADD_PATCH_CONTRIB(JP, ZAVG_T_RAD_IND(:,JCOMP), TD%NDMT%AL(JP)%XT_RAD_IND(:,JCOMP) )
        CALL ADD_PATCH_CONTRIB(JP, ZAVG_TI_BLD(:,JCOMP)   , NB%AL(JP)%XTI_BLD(:,JCOMP) )
        CALL ADD_PATCH_CONTRIB(JP, ZAVG_QI_BLD(:,JCOMP)   , NB%AL(JP)%XQI_BLD(:,JCOMP) )
    ENDDO
    !
  ENDIF
  !
  !-------------------------------------------------------------------------------------
  ! Use of the canopy version of TEB
  !-------------------------------------------------------------------------------------
  !
  IF (TOP%LCANOPY) THEN
    !-------------------------------------------------------------------------------------
    ! Town averaged quantities to force canopy atmospheric layers
    !-------------------------------------------------------------------------------------
    !
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_DUWDU_GRND ,ZDUWDU_GRND )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_UW_RF ,ZUW_RF)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_DUWDU_RF ,ZDUWDU_RF)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_H_WL ,0.5*(TD%NDMT%AL(JP)%XH_WALL_A+TD%NDMT%AL(JP)%XH_WALL_B))
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_E_WL ,(0.5*(TD%NDMT%AL(JP)%XLE_WALL_A + TD%NDMT%AL(JP)%XLE_WALL_B))/XLVTT)
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_H_RF ,(TD%NDMT%AL(JP)%XH_ROOF+NT%AL(JP)%XH_INDUSTRY))
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_E_RF ,(TD%NDMT%AL(JP)%XLE_ROOF+NT%AL(JP)%XLE_INDUSTRY)/XLVTT)
    IF (TOP%LGARDEN .AND. TOP%CURBTREE/='NONE') THEN
        CALL ADD_PATCH_CONTRIB(JP,ZAVG_URBTREE,NT%AL(JP)%XURBTREE   )
        !   Average of turbulent fluxes and LAD profile on TEB patchs and CANOPY layers
        !
        DO JLAYER=1,SB%NLVL
           CALL ADD_PATCH_CONTRIB(JP,ZAVG_DH_HVEG(:,JLAYER),ZDH_HVEG (:,JLAYER))
           CALL ADD_PATCH_CONTRIB(JP,ZAVG_DE_HVEG(:,JLAYER),ZDLE_HVEG(:,JLAYER)/XLVTT)
           CALL ADD_PATCH_CONTRIB(JP,ZAVG_LAD_CAN(:,JLAYER),ZLAD_CAN(:,JLAYER))
        ENDDO
    ELSE
        ZAVG_URBTREE(:)   = 0.
        ZAVG_DH_HVEG(:,:) = 0.
        ZAVG_DE_HVEG(:,:) = 0.
        ZAVG_LAD_CAN(:,:) = 0.
    ENDIF
    !
    !-------------------------------------------------------------------------------------
    ! Computes the impact of canopy and surfaces on air
    !-------------------------------------------------------------------------------------
    !
    ZAC_GRND    (:) = (NT%AL(JP)%XROAD(:)*ZAC_RD    (:) + &
             NT%AL(JP)%XGARDEN(:)*ZAC_GD    (:)) / (NT%AL(JP)%XROAD(:)+NT%AL(JP)%XGARDEN(:))
    ZAC_GRND_WAT(:) = (NT%AL(JP)%XROAD(:)*ZAC_RD_WAT(:) + &
             NT%AL(JP)%XGARDEN(:)*ZAC_GD_WAT(:)) / (NT%AL(JP)%XROAD(:)+NT%AL(JP)%XGARDEN(:))
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_AC_GRND     ,ZAC_GRND    )
    CALL ADD_PATCH_CONTRIB(JP,ZAVG_AC_GRND_WAT ,ZAC_GRND_WAT)
    CALL ADD_PATCH_CONTRIB(JP,ZSFLUX_U ,ZUW_GRND * (1.-NT%AL(JP)%XBLD))
    CALL ADD_PATCH_CONTRIB(JP,ZSFLUX_T ,ZH_GRND  * (1.-NT%AL(JP)%XBLD)/XCPD/PRHOA(:,1))
    CALL ADD_PATCH_CONTRIB(JP,ZSFLUX_Q ,ZLE_GRND * (1.-NT%AL(JP)%XBLD)/XLVTT)
    !
  END IF
  !
  !-------------------------------------------------------------------------------------
  ! end of loop on TEB patches
END DO
!-------------------------------------------------------------------------------------
!
!-------------------------------------------------------------------------------------
!* Evolution of canopy air if canopy option is active
!-------------------------------------------------------------------------------------
!
IF (TOP%LCANOPY) THEN
   !
   IF (.NOT.TOP%LATM_CANOPY) THEN
     !
     !-------------------------------------------------------------------------------------
     !* Impact of TEB fluxes on the air
     !-------------------------------------------------------------------------------------
     !
     CALL TEB_CANOPY(KI, SB, ZAVG_BLD, ZAVG_BLD_HEIGHT, ZAVG_WL_O_HOR, PPA(:,1), PRHOA(:,1), &
                     ZAVG_DUWDU_GRND, ZAVG_UW_RF, ZAVG_DUWDU_RF, ZAVG_H_WL,         &
                     ZAVG_E_WL, ZAVG_H_RF, ZAVG_E_RF, ZAVG_DH_HVEG, ZAVG_DE_HVEG,   &
                     ZAVG_AC_GRND,ZAVG_AC_GRND_WAT, ZAVG_URBTREE, ZAVG_LAD_CAN, ZFORC_U, &
                     ZDFORC_UDU, ZFORC_E, ZDFORC_EDE, ZFORC_T, ZDFORC_TDT, ZFORC_Q, &
                     ZDFORC_QDQ )
     !
     !-------------------------------------------------------------------------------------
     !* Evolution of canopy air due to these impacts
     !-------------------------------------------------------------------------------------
     !
     CALL CANOPY_EVOL(SB, KI, PTSTEP, 2, ZL, ZWIND(:,1), PTA(:,1), PQA(:,1), PPA(:,1), PRHOA(:,1),  &
                      ZSFLUX_U, ZSFLUX_T, ZSFLUX_Q, ZFORC_U, ZDFORC_UDU,    &
                      ZFORC_E, ZDFORC_EDE, ZFORC_T, ZDFORC_TDT, ZFORC_Q,    &
                      ZDFORC_QDQ, SB%XLM, SB%XLEPS, ZAVG_USTAR, ZALFAU,   &
                      ZBETAU, ZALFAT, ZBETAT, ZALFAQ, ZBETAQ      )
     !
     ! Robert: 
     ! Since not all calculations related to the canopy are implicit it is possible
     ! that unrealistic (even negative) values of humidity in the canopy occur. 
     ! For this reason, a pragmatic correction is implemented here in the case
     ! where the absolute humidity of the canopy deviates strongly from the 
     ! absolute humidity of the forcing.
     ! In the long term all computations related to the canopy should be implicited.
     !
     DO JLAYER=1,SB%NLVL
       !
       WHERE ( SB%XQ(:,JLAYER).LT.(0.3*PQA(:,1)) )
          SB%XQ(:,JLAYER) = 0.3 * PQA(:,1)
       ELSEWHERE ( SB%XQ(:,JLAYER).GT.(3.0*PQA(:,1)) )
          SB%XQ(:,JLAYER) = 3.0 * PQA(:,1)
       END WHERE
       !
     ENDDO
     !
     !-------------------------------------------------------------------------------------
     ! Momentum fluxes in the case canopy is active
     !-------------------------------------------------------------------------------------
     !
   ENDIF
   !
   PSFU=0.
   PSFV=0.
   ZAVG_Z0_TOWN(:) = MIN(ZAVG_Z0_TOWN(:),PUREF(:,1)*0.5)
   ZAVG_CDN=(XKARMAN/LOG(PUREF(:,1)/ZAVG_Z0_TOWN(:)))**2
   ZAVG_CD = ZAVG_CDN
   ZAVG_RI = 0.
   !
   PCD_ROOF(:)        = 0.0
   IF (TOP%LATM_CANOPY) THEN
      !
      ZAVG_USTAR(:)      = SQRT(ABS(ZSFLUX_U))
      ZAVG_USTAR_ROOF(:) = SQRT(ABS(ZAVG_UW_RF))
      !
      DO JJ=1,KI
         IF (ZUA(JJ)>0.) THEN
            PCD_ROOF(JJ) = ZAVG_BLD(JJ)*ZAVG_USTAR_ROOF(JJ)**2 / ZUA(JJ)**2
         ENDIF
      ENDDO
      !
   ENDIF
   !
   DO JJ=1,SIZE(PU,1)
     IF (ZWIND(JJ,1)>0.) THEN
       ZCOEF(JJ) = - PRHOA(JJ,1) * ZAVG_USTAR(JJ)**2 / ZWIND(JJ,1)
       PSFU(JJ) = ZCOEF(JJ) * PU(JJ,1)
       PSFV(JJ) = ZCOEF(JJ) * PV(JJ,1)
       ZAVG_CD(JJ) = ZAVG_USTAR(JJ)**2 / ZWIND(JJ,1)**2
       ZAVG_RI(JJ) = -XG/PTA(JJ,1)*ZSFLUX_T(JJ)/ZAVG_USTAR(JJ)**4
     ENDIF
   ENDDO
   !
   !-------------------------------------------------------------------------------------
   !* Update of canyon parameters at the end of the time step for the consistance of diagnostics
   !-------------------------------------------------------------------------------------
   !
   IF (.NOT.TOP%LATM_CANOPY) THEN
      !
      DO JLAYER=1,SB%NLVL-1
         DO JI=1,KI
            !* finds middle canyon layer
            IF (SB%XZ(JI,JLAYER)<ZAVG_BLD_HEIGHT(JI)/2. .AND. &
                SB%XZ(JI,JLAYER+1)>=ZAVG_BLD_HEIGHT(JI)/2.) THEN
               ZCOEF(JI) = (ZAVG_BLD_HEIGHT(JI)/2.-SB%XZ(JI,JLAYER))/(SB%XZ(JI,JLAYER+1)-SB%XZ(JI,JLAYER))
               ZU_CANYON(JI) = SB%XU(JI,JLAYER) + ZCOEF(JI) * (SB%XU(JI,JLAYER+1)-SB%XU(JI,JLAYER))
               ZT_CANYON(JI) = SB%XT(JI,JLAYER) + ZCOEF(JI) * (SB%XT(JI,JLAYER+1)-SB%XT(JI,JLAYER))
               ZQ_CANYON(JI) =(SB%XQ(JI,JLAYER) + ZCOEF(JI) * &
                 (SB%XQ(JI,JLAYER+1)-SB%XQ(JI,JLAYER)))/PRHOA(JI,1)
            END IF
         END DO
      END DO
      ZU_CANYON= MAX(ZU_CANYON,0.2)
      !
      DO JP=1,TOP%NTEB_PATCH
         NT%AL(JP)%XT_CANYON(:) = ZT_CANYON(:)
         NT%AL(JP)%XQ_CANYON(:) = ZQ_CANYON(:)
      ENDDO
      !
   ENDIF
   !
   !-------------------------------------------------------------------------------------
   ! End of specific case with canopy option
   !-------------------------------------------------------------------------------------
   !
END IF
!
!-------------------------------------------------------------------------------------
! Outputs:
!-------------------------------------------------------------------------------------
!
!-------------------------------------------------------------------------------------
!Radiative properties should be at time t+1 (see by the atmosphere) in order to close
!the energy budget between surfex and the atmosphere. It is not the case here
!for ALB and EMIS
!-------------------------------------------------------------------------------------
 CALL AVERAGE_RAD(TOP%XTEB_PATCH, ZDIR_ALB_PATCH, ZSCA_ALB_PATCH, ZEMIS_PATCH, &
                  ZTRAD_PATCH, PDIR_ALB, PSCA_ALB, PEMIS, PTRAD )
!
!-------------------------------------------------------------------------------
!Physical properties see by the atmosphere in order to close the energy budget 
!between surfex and the atmosphere. All variables should be at t+1 but very 
!difficult to do. Maybe it will be done later. However, Ts can be at time t+1
!-------------------------------------------------------------------------------
!
PTSURF (:) = PTRAD         (:) ! Should be the surface effective temperature; not radative
PZ0    (:) = ZAVG_Z0_TOWN  (:) ! Should account for ISBA (greenroof and garden) Z0
PZ0H   (:) = PZ0 (:) / 200.    ! Should account for ISBA (greenroof and garden) Z0
PQSURF (:) = NT%AL(1)%XQ_CANYON(:) ! Should account for ISBA (greenroof and garden) Qs
!
!-------------------------------------------------------------------------------------
! Scalar fluxes:
!-------------------------------------------------------------------------------------
!
ZAVG_USTAR    (:) = SQRT(SQRT(PSFU**2+PSFV**2))
!
!
IF (CHT%SVT%NBEQ>0) THEN

  IBEG = CHT%SVT%NSV_CHSBEG
  IEND = CHT%SVT%NSV_CHSEND
  IF (CHT%CCH_DRY_DEP == "WES89") THEN
      CALL CH_DEP_TOWN(ZAVG_RESA_TOWN,  ZAVG_USTAR, PTA(:,1), PTRAD, ZAVG_WL_O_HOR,&
                       PSV(:,IBEG:IEND), CHT%SVT%CSV(IBEG:IEND), CHT%XDEP(:,1:CHT%SVT%NBEQ)  )

    DO JI=IBEG,IEND
!cdir nodep
      DO JJ=1,SIZE(PSFTS,1)
        PSFTS(JJ,JI) = - PSV(JJ,JI) * CHT%XDEP(JJ,JI-IBEG+1)
    IF (CHT%SVT%NAEREQ > 0 ) THEN

      IBEG = CHT%SVT%NSV_AERBEG
      IEND = CHT%SVT%NSV_AEREND

      CALL CH_AER_DEP(PSV(:,IBEG:IEND), PSFTS(:,IBEG:IEND), &
                      ZAVG_USTAR, ZAVG_RESA_TOWN, PTA(:,1), PRHOA(:,1))   

    IBEG = CHT%SVT%NSV_CHSBEG
    IEND = CHT%SVT%NSV_CHSEND

    DO JI=IBEG,IEND
      PSFTS(:,JI) =0.
    ENDDO

    IBEG = CHT%SVT%NSV_AERBEG
    IEND = CHT%SVT%NSV_AEREND

    IF(IBEG.LT.IEND) THEN
      DO JI=IBEG,IEND
        PSFTS(:,JI) =0.
      ENDDO
    ENDIF
  ENDIF
IF (CHT%SVT%NDSTEQ>0) THEN
  !
  IBEG = CHT%SVT%NSV_DSTBEG
  IEND = CHT%SVT%NSV_DSTEND
  CALL DSLT_DEP(PSV(:,IBEG:IEND), PSFTS(:,IBEG:IEND), ZAVG_USTAR, ZAVG_RESA_TOWN, PTA(:,1), PRHOA(:,1), &
                DST%XEMISSIG_DST, DST%XEMISRADIUS_DST, JPMODE_DST, XDENSITY_DST, &
                XMOLARWEIGHT_DST, ZCONVERTFACM0_DST, ZCONVERTFACM6_DST,          &
                ZCONVERTFACM3_DST, LVARSIG_DST, LRGFIX_DST, CVERMOD  )  

  CALL MASSFLUX2MOMENTFLUX(         &
    PSFTS(:,IBEG:IEND),             & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments
    PRHOA(:,1),                     & !I [kg/m3] air density
    DST%XEMISRADIUS_DST,            &!I [um] emitted radius for the modes (max 3)
    DST%XEMISSIG_DST,               &!I [-] emitted sigma for the different modes (max 3)
    NDSTMDE,                        &
    ZCONVERTFACM0_DST,              &
    ZCONVERTFACM6_DST,              &
    ZCONVERTFACM3_DST,              &
    LVARSIG_DST, LRGFIX_DST         )  
ENDIF
IF (CHT%SVT%NSLTEQ>0) THEN
  !
  IBEG = CHT%SVT%NSV_SLTBEG
  IEND = CHT%SVT%NSV_SLTEND
  !
  CALL DSLT_DEP(PSV(:,IBEG:IEND), PSFTS(:,IBEG:IEND), ZAVG_USTAR, ZAVG_RESA_TOWN, PTA(:,1), PRHOA(:,1), &
                SLT%XEMISSIG_SLT, SLT%XEMISRADIUS_SLT, JPMODE_SLT, XDENSITY_SLT, &
                XMOLARWEIGHT_SLT, ZCONVERTFACM0_SLT, ZCONVERTFACM6_SLT,          &
                ZCONVERTFACM3_SLT, LVARSIG_SLT, LRGFIX_SLT, CVERMOD  )  
    PSFTS(:,IBEG:IEND),             & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments
    PRHOA(:,1),                     & !I [kg/m3] air density
    SLT%XEMISRADIUS_SLT,            &!I [um] emitted radius for the modes (max 3)
    SLT%XEMISSIG_SLT,               &!I [-] emitted sigma for the different modes (max 3)
    NSLTMDE,                        &
    ZCONVERTFACM0_SLT,              &
    ZCONVERTFACM6_SLT,              &
    ZCONVERTFACM3_SLT,              &
    LVARSIG_SLT, LRGFIX_SLT         ) 
ENDIF
!
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
! Inline diagnostics
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
!
CALL DIAG_INLINE_TEB_n(TD%O, TD%D, SB, NT%AL(1), TOP%LCANOPY, PTA(:,1), PTRAD, ZQA, &
     PPA(:,1), PPS, PRHOA(:,1), PU(:,1), PV(:,1), ZWIND(:,1), PZREF(:,1), PUREF(:,1),    &
     ZAVG_CD, ZAVG_CDN, ZAVG_RI, ZAVG_CH, ZAVG_Z0_TOWN, PTRAD, PEMIS, PDIR_ALB,     &
     PSCA_ALB, PLW, PDIR_SW, PSCA_SW,  PSFTH, PSFTQ, PSFU, PSFV, PSFCO2, ZAVG_RN,   &
     ZAVG_H, ZAVG_LE, ZAVG_GFLX, ZAVG_QF )
!
!-------------------------------------------------------------------------------------
! Stores Canyon air and humidity if historical option of TEB is active
!-------------------------------------------------------------------------------------
!
IF (.NOT. TOP%LCANOPY) THEN
  DO JP=1,TOP%NTEB_PATCH
    NT%AL(JP)%XT_CANYON(:) = ZAVG_T_CANYON(:)
    NT%AL(JP)%XQ_CANYON(:) = ZAVG_Q_CANYON(:)
  END DO
END IF
!          
!-------------------------------------------------------------------------------------
! Thermal confort index
!-------------------------------------------------------------------------------------
!
IF (TD%DU%LUTCI .AND. TD%O%N2M >0) THEN
  !
  ! Wind speed for UTCI is in 10 m above ground
  !
    IF (TD%D%XZON10M(JJ)/=XUNDEF) THEN
      ZU_UTCI(JJ) = SQRT(TD%D%XZON10M(JJ)**2+TD%D%XMER10M(JJ)**2)
  !
  ! Temperature and specific humidity for UTCI is in
  ! 1 m above ground in the case the SBL scheme is active.
  ! Otherwise, due to the lack of appropriate diagnostics,
  ! the canyon average values are taken.
  !
  IF (TOP%LCANOPY) THEN
     !
     CALL INTERPOL_SBL(SB%XZ(:,:),SB%XT(:,:),1.0,ZT_UTCI(:))
     !
     CALL INTERPOL_SBL(SB%XZ(:,:),SB%XQ(:,:),1.0,ZQ_UTCI(:))
     ZQ_UTCI(:) = ZQ_UTCI(:) / PRHOA(:,1)
     !
  ELSE
     ZT_UTCI(:) = ZAVG_T_CANYON(:)
     ZQ_UTCI(:) = ZAVG_Q_CANYON(:)
  ENDIF
  !
  DO JCOMP=1,BOP%NBEMCOMP
     !
     CALL UTCI_TEB(NT%AL(1), TD%DU, TOP, JCOMP, HPROGRAM, ZAVG_TI_BLD(:,JCOMP), ZAVG_QI_BLD(:,JCOMP), &
          ZU_UTCI, ZT_UTCI, ZQ_UTCI, PPS, ZAVG_REF_SW_GRND, ZAVG_REF_SW_FAC, ZAVG_SCA_SW,             &
          ZAVG_DIR_SW, PZENITH, ZAVG_EMIT_LW_FAC, ZAVG_EMIT_LW_GRND, ZAVG_EMIT_LW_HVEG,               &
          ZAVG_SCA_SW_SKY, ZAVG_LW_RAD_SKY, PLW, ZAVG_T_RAD_IND(:,JCOMP), ZAVG_TAU_SR,                &
          ZAVG_SCA_SW_GROUND_DOWN, ZAVG_SCA_SW_GROUND_UP, ZAVG_SCA_SW_GROUND_HOR, ZAVG_LW_GROUND_DOWN,&
          ZAVG_LW_GROUND_HOR, "OK" )
     !
     CALL UTCIC_STRESS(PTSTEP, TD%DU%XUTCI_IN(:,JCOMP), TD%DU%XUTCIC_IN(:,:,JCOMP) )
     !
  ENDDO
  !
  ! Aggregated outdoor UTCI and mean radiant temperature according to sun and shade fractions
  DO JJ=1,KI
    IF (ZAVG_DIR_SW(JJ).GT.0.) THEN
       TD%DU%XUTCI_OUTAGG(JJ) = TD%DU%XUTCI_OUTSUN  (JJ)*(   ZAVG_DIR_SW_ROAD(JJ)/ZAVG_DIR_SW(JJ)) &
                              + TD%DU%XUTCI_OUTSHADE(JJ)*(1.-ZAVG_DIR_SW_ROAD(JJ)/ZAVG_DIR_SW(JJ))
       TD%DU%XTRAD_AGG   (JJ) = TD%DU%XTRAD_SUN     (JJ)*(   ZAVG_DIR_SW_ROAD(JJ)/ZAVG_DIR_SW(JJ)) &
                              + TD%DU%XTRAD_SHADE   (JJ)*(1.-ZAVG_DIR_SW_ROAD(JJ)/ZAVG_DIR_SW(JJ))
    ELSE
       TD%DU%XUTCI_OUTAGG(JJ) = TD%DU%XUTCI_OUTSHADE(JJ)
       TD%DU%XTRAD_AGG   (JJ) = TD%DU%XTRAD_SHADE   (JJ)
    ENDIF
  ENDDO
  !
  ! Mean UTCI and TRAD
  !
  TD%DU%NCOUNT_UTCI_STEP    = TD%DU%NCOUNT_UTCI_STEP    + 1
  TD%DU%XUTCI_OUTSUN_MEAN   = TD%DU%XUTCI_OUTSUN_MEAN   + TD%DU%XUTCI_OUTSUN  
  TD%DU%XUTCI_OUTSHADE_MEAN = TD%DU%XUTCI_OUTSHADE_MEAN + TD%DU%XUTCI_OUTSHADE
  TD%DU%XTRAD_SUN_MEAN      = TD%DU%XTRAD_SUN_MEAN      + TD%DU%XTRAD_SUN
  TD%DU%XTRAD_SHADE_MEAN    = TD%DU%XTRAD_SHADE_MEAN    + TD%DU%XTRAD_SHADE
  !
  CALL UTCIC_STRESS(PTSTEP,TD%DU%XUTCI_OUTSUN  ,TD%DU%XUTCIC_OUTSUN  )
  CALL UTCIC_STRESS(PTSTEP,TD%DU%XUTCI_OUTSHADE,TD%DU%XUTCIC_OUTSHADE)
  CALL UTCIC_STRESS(PTSTEP,TD%DU%XUTCI_OUTAGG  ,TD%DU%XUTCIC_OUTAGG  )
  !
ELSE IF (TD%DU%LUTCI) THEN
  TD%DU%XUTCI_IN    (:,:) = XUNDEF
  TD%DU%XUTCI_OUTSUN  (:) = XUNDEF
  TD%DU%XUTCI_OUTSHADE(:) = XUNDEF
  TD%DU%XUTCI_OUTAGG  (:) = XUNDEF
  TD%DU%XUTCI_OUTSUN_MEAN  (:) = XUNDEF
  TD%DU%XUTCI_OUTSHADE_MEAN(:) = XUNDEF
  TD%DU%XTRAD_SUN(:) = XUNDEF
  TD%DU%XTRAD_SHADE(:) = XUNDEF
  TD%DU%XTRAD_SUN_MEAN(:) = XUNDEF
  TD%DU%XTRAD_SHADE_MEAN(:) = XUNDEF
  TD%DU%XUTCIC_IN    (:,:,:) = XUNDEF
  TD%DU%XUTCIC_OUTSUN  (:,:) = XUNDEF
  TD%DU%XUTCIC_OUTSHADE(:,:) = XUNDEF
  TD%DU%XUTCIC_OUTAGG  (:,:) = XUNDEF
ENDIF
!
IF (TOP%CBEM.EQ."BEM") THEN
   !
   DO JP=1,TOP%NTEB_PATCH
      !
      ! Update auxiliairy variable for pressure at previous time step.
      !
      NB%AL(JP)%XPSOLD(:)=PPS(:)
      !
      ! Determine the switch for shading status
      ! during vacancy at 7:00 solar time. 
      !
      DO JJ=1,SIZE(NB%AL(JP)%XSHADVACSW,1)
         DO JCOMP=1,BOP%NBEMCOMP
            IF ( (PTSUN(JJ).GE.7.0*3600.0).AND.(PTSUN(JJ).LT.(7.0*3600.0+PTSTEP) ) ) THEN
               IF ((NB%AL(JP)%XTI_BLD(JJ,JCOMP).GT.NB%AL(JP)%XTDESV(JJ)).AND. &
                    (NB%AL(JP)%XTI_BLD(JJ,JCOMP).GT.NB%AL(JP)%XTHEAT_OCCD(JJ,JCOMP))) THEN
                  NB%AL(JP)%XSHADVACSW(JJ,JCOMP)=1.0
               ELSE
                  NB%AL(JP)%XSHADVACSW(JJ,JCOMP)=0.0
               ENDIF
            ENDIF
         ENDDO
      ENDDO
      !
      ! Determine the switch for ventilation status
      ! during night at 22:00 solar time.
      ! This status change might not be reasonable for all building uses
      !
      DO JJ=1,SIZE(NB%AL(JP)%XVENTNIGSW,1)
         DO JCOMP=1,BOP%NBEMCOMP
            IF ( (PTSUN(JJ).GE.22.0*3600.0).AND.(PTSUN(JJ).LT.(22.0*3600.0+PTSTEP) ) ) THEN
               IF ((NB%AL(JP)%XTI_BLD(JJ,JCOMP).GT.NB%AL(JP)%XTDESV(JJ)).AND. &
                    (NB%AL(JP)%XTI_BLD(JJ,JCOMP).GT.NB%AL(JP)%XTHEAT_OCCD(JJ,JCOMP))) THEN
                  NB%AL(JP)%XVENTNIGSW(JJ,JCOMP) = 1.0
               ELSE
                  NB%AL(JP)%XVENTNIGSW(JJ,JCOMP) = 0.0
               ENDIF
            ENDIF
         ENDDO
      ENDDO
      !
   ENDDO
   !
!
! ###############################################################
! Verification of radiation budget
! FIXME: Commented at the moment.
! ###############################################################
!
!IF (SIZE(TD%D%XSWD)>0) THEN
!  DO JJ = 1, SIZE(ZAVG_RN)
!   !
!   ZNET_UP_DOWN(JJ) = TD%D%XSWD(JJ) - TD%D%XSWU(JJ) + TD%D%XLWD(JJ) - TD%D%XLWU(JJ)
!   !
!   IF ( ISNAN(ZNET_UP_DOWN(JJ)) .OR. ISNAN(ZAVG_RN(JJ)) ) THEN
!      CALL GET_LUOUT(HPROGRAM,ILUOUT)
!      WRITE(ILUOUT,*) "ZNET_UP_DOWN(JJ) ",ZNET_UP_DOWN(JJ)
!      WRITE(ILUOUT,*) "ZAVG_RN     (JJ) ",ZAVG_RN(JJ)
!      CALL FLUSH(ILUOUT)
!      CALL ABOR1_SFX("CHECK_TEB: NAN in radiation budget diagnostics, check report")
!   ENDIF
!   !
!   IF ( ABS(ZNET_UP_DOWN(JJ)-ZAVG_RN(JJ)).GT. 1.) THEN
!      WRITE(ILUOUT,*) "                                      "
!      WRITE(ILUOUT,*) "Large incoherence in radiation budget (larger than 1W/m2) "
!      WRITE(ILUOUT,*) "                                      "
!      WRITE(ILUOUT,*) "TD%D%XSWD(JJ)    ",TD%D%XSWD(JJ)
!      WRITE(ILUOUT,*) "TD%D%XSWU(JJ)    ",TD%D%XSWU(JJ)
!      WRITE(ILUOUT,*) "TD%D%XLWD(JJ)    ",TD%D%XLWD(JJ)
!      WRITE(ILUOUT,*) "TD%D%XLWU(JJ)    ",TD%D%XLWU(JJ)      
!      WRITE(ILUOUT,*) "Diagnostics should be equal from radiative and energy balance point of views:"
!      WRITE(ILUOUT,*) "ZNET_UP_DOWN(JJ) ",ZNET_UP_DOWN(JJ)
!      WRITE(ILUOUT,*) "ZAVG_RN(JJ)      ",ZAVG_RN(JJ)
!      WRITE(ILUOUT,*) 
!      CALL FLUSH(ILUOUT)
!      ! CALL ABOR1_SFX("COUPLING_TEBn: Radiation budget is not closed for at least one point, check report")
!     EXIT
!   ENDIF
!   !
!  ENDDO
!END IF
!
IF (CT%LCHECK_TEB) CALL DEALLOC_CHECK_TEB(CT)
!
IF (LHOOK) CALL DR_HOOK('COUPLING_TEB_N',1,ZHOOK_HANDLE)
!
!-------------------------------------------------------------------------------------
SUBROUTINE ADD_PATCH_CONTRIB(JP,PAVG,PFIELD)
INTEGER, INTENT(IN) :: JP
REAL, DIMENSION(:), INTENT(INOUT) :: PAVG
REAL, DIMENSION(:), INTENT(IN)    :: PFIELD
!
IF (JP==1) PAVG = 0.
PAVG = PAVG + TOP%XTEB_PATCH(:,JP) * PFIELD(:)
!
END SUBROUTINE ADD_PATCH_CONTRIB
!-------------------------------------------------------------------------------------
!
END SUBROUTINE COUPLING_TEB_n