!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ############################################################################### SUBROUTINE COUPLING_TEB_n (DTCO, DST, SLT, TOP, SPAOP, SB, G, CHT, NT, TPN, TIR, BOP, NB, TD, AT, & GDM, GRM, HM, HPROGRAM, HCOUPLING, PTSTEP, KYEAR, KMONTH, & KDAY, PTIME, KI, KSV, KSW, KLEV, PTSUN, PZENITH, PAZIM, & PZREF, PUREF, PZS, PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV, & PRAIN, PSN, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, & PTKE, PSFTQ, PSFTQ_SURF, PSFTQ_WALL, PSFTQ_ROOF, PSFTH, & PSFTH_SURF, PSFTH_WALL, PSFTH_ROOF, PCD_ROOF, PSFTS, PSFCO2,& PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, & PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, & PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST ) ! ############################################################################### ! !!**** *COUPLING_TEB_n * - Driver for TEB !! !! PURPOSE !! ------- ! !!** METHOD !! ------ !! !! REFERENCE !! --------- !! !! !! AUTHOR !! ------ !! V. Masson !! !! MODIFICATIONS !! ------------- !! Original 01/2004 !! 10/2005 (G.Pigeon) transfer of domestic heating !! S. Riette 06/2009 Initialisation of XT, XQ, XU and XTKE on canopy levels !! S. Riette 01/2010 Use of interpol_sbl to compute 10m wind diagnostic !! G. Pigeon 09/2012 CCH_BEM, ROUGH_WALL, ROUGH_ROOF for building conv. coef !! G. Pigeon 10/2012 XF_WIN_WIN as arg. of TEB_GARDEN !! B. Decharme 09/2012 New wind implicitation !! J. Escobar 09/2012 KI not allowed without-interface , replace by KI !! V. Masson 08/2013 adds solar panels & occupation calendar !! B. Decharme 04/2013 new coupling variables !! M. Goret 02/2017 add heating fractions and CO2 conversion factors as arg. of TEB_GARDEN !! M. Goret 03/2017 add traffic flux modulation !! A. Lemonsu 06/2017 utci calculations with urban trees !! M. Goret 04/2017 suppress PEFF_HEAT as arg. of TEB_GARDEN !! M. Goret 07/2017 move CO2 flux diagnostics from DGT to DGMT !! M. Goret 07/2017 add heating energy consumption by source !! M. Goret 07/2017 add anthropogenic flux diagnostics !! M. Goret 09/2017 add diagnostic of heat storage link to snow !! M. Goret 10/2017 add hot water !! R. Schoetter 2017 Verification of energy conservation !! V. Masson 04.2020 completes energy check for high vegetation IR exchanges !!--------------------------------------------------------------- ! USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t USE MODD_DST_n, ONLY : DST_t USE MODD_SLT_n, ONLY : SLT_t ! USE MODD_CH_TEB_n, ONLY : CH_TEB_t USE MODD_CANOPY_n, ONLY: CANOPY_t USE MODD_SFX_GRID_n, ONLY : GRID_t USE MODD_TEB_OPTION_n, ONLY : TEB_OPTIONS_t USE MODD_SPARTACUS_OPTION_n, ONLY : SPARTACUS_OPTIONS_t USE MODD_TEB_PANEL_n, ONLY : TEB_PANEL_t USE MODD_TEB_IRRIG_n, ONLY : TEB_IRRIG_t USE MODD_TEB_n, ONLY : TEB_NP_t USE MODD_SURFEX_n, ONLY : TEB_DIAG_t USE MODD_BEM_OPTION_n, ONLY : BEM_OPTIONS_t USE MODD_BEM_n, ONLY : BEM_NP_t USE MODD_DATA_TEB_n, ONLY : DATA_TEB_t ! USE MODD_CHECK_TEB, ONLY : CHECK_TEB_t ! USE MODD_SURFEX_n, ONLY : TEB_GARDEN_MODEL_t USE MODD_SURFEX_n, ONLY : TEB_GREENROOF_MODEL_t USE MODD_SURFEX_n, ONLY : TEB_HYDRO_MODEL_t ! USE MODD_REPROD_OPER, ONLY : CIMPLICIT_WIND ! USE MODD_CSTS, ONLY : XRD, XCPD, XP00, XLVTT, XSURF_EPSILON, & XPI, XKARMAN, XG, XTT USE MODD_SURF_PAR, ONLY : XUNDEF ! USE MODD_DST_SURF USE MODD_SLT_SURF ! USE MODD_SURF_ATM_TURB_n, ONLY : SURF_ATM_TURB_t ! USE MODE_DSLT_SURF USE MODE_THERMOS USE MODE_SBLS ! USE MODI_ABOR1_SFX USE MODI_ADD_FORECAST_TO_DATE_SURF USE MODI_ALLOC_CHECK_TEB USE MODI_AVERAGE_RAD USE MODI_CANOPY_EVOL USE MODI_CANOPY_GRID_UPDATE USE MODI_CH_AER_DEP USE MODI_CH_DEP_TOWN USE MODI_CHECK_TEB USE MODI_CUMUL_DIAG_TEB_n USE MODI_DIAG_INLINE_TEB_n USE MODI_DEALLOC_CHECK_TEB USE MODI_DSLT_DEP USE MODI_INTERPOL_SBL USE MODI_SM10 USE MODI_TOWN_ENERGY_BALANCE USE MODI_TEB_CANOPY USE MODI_TRAFFIC_FLUX_MODULATION USE MODI_UTCI_TEB USE MODI_UTCIC_STRESS ! USE YOMHOOK, ONLY : LHOOK, DR_HOOK USE PARKIND1, ONLY : JPRB ! IMPLICIT NONE ! !* 0.1 declarations of arguments ! ! ! TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO TYPE(DST_t), INTENT(INOUT) :: DST TYPE(SLT_t), INTENT(INOUT) :: SLT ! TYPE(CH_TEB_t), INTENT(INOUT) :: CHT TYPE(CANOPY_t), INTENT(INOUT) :: SB TYPE(GRID_t), INTENT(INOUT) :: G TYPE(TEB_OPTIONS_t), INTENT(INOUT) :: TOP TYPE(SPARTACUS_OPTIONS_t), INTENT(INOUT) :: SPAOP TYPE(TEB_PANEL_t), INTENT(INOUT) :: TPN TYPE(TEB_IRRIG_t), INTENT(INOUT) :: TIR TYPE(TEB_NP_t), INTENT(INOUT) :: NT ! TYPE(TEB_DIAG_t), INTENT(INOUT) :: TD ! TYPE(SURF_ATM_TURB_t), INTENT(IN) :: AT ! atmospheric turbulence parameters ! TYPE(BEM_OPTIONS_t), INTENT(INOUT) :: BOP TYPE(BEM_NP_t), INTENT(INOUT) :: NB ! TYPE(TEB_GARDEN_MODEL_t), INTENT(INOUT) :: GDM TYPE(TEB_GREENROOF_MODEL_t), INTENT(INOUT) :: GRM TYPE(TEB_HYDRO_MODEL_t), INTENT(INOUT) :: HM ! CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING ! type of coupling ! 'E' : explicit ! 'I' : implicit INTEGER, INTENT(IN) :: KYEAR ! current year (UTC) INTEGER, INTENT(IN) :: KMONTH ! current month (UTC) INTEGER, INTENT(IN) :: KDAY ! current day (UTC) REAL, INTENT(IN) :: PTIME ! current time since midnight (UTC, s) INTEGER, INTENT(IN) :: KI ! number of points INTEGER, INTENT(IN) :: KSV ! number of scalars INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands INTEGER, INTENT(IN) :: KLEV ! number of atmospheric levels to couple REAL, DIMENSION(KI), INTENT(IN) :: PTSUN ! solar time (s from midnight) REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s) REAL, DIMENSION(KI,KLEV), INTENT(IN) :: PZREF ! height of T,q forcing (m) REAL, DIMENSION(KI,KLEV), INTENT(IN) :: PUREF ! height of wind forcing (m) ! REAL, DIMENSION(KI,KLEV), INTENT(IN) :: PTA ! air temperature forcing (K) REAL, DIMENSION(KI,KLEV), INTENT(IN) :: PQA ! air humidity forcing (kg/m3) REAL, DIMENSION(KI,KLEV), INTENT(IN) :: PRHOA ! air density (kg/m3) REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV ! scalar variables ! ! chemistry: first char. in HSV: '#' (molecule/m3) ! ! CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV ! name of all scalar variables REAL, DIMENSION(KI,KLEV), INTENT(IN) :: PU ! zonal wind (m/s) REAL, DIMENSION(KI,KLEV), INTENT(IN) :: PV ! meridian wind (m/s) REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.) ! ! (W/m2) REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.) ! ! (W/m2) REAL, DIMENSION(KSW),INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m) REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! zenithal angle (radian from the vertical) REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! azimuthal angle (radian from North, clockwise) REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.) ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI,KLEV), INTENT(IN) :: PPA ! pressure at forcing level (Pa) REAL, DIMENSION(KI,KLEV), INTENT(IN) :: PTKE ! Turbulent kinetic energy at forcing level (m2/s2) REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(INOUT) :: PSN ! snow precipitation (kg/m2/s) REAL, DIMENSION(KI), INTENT(INOUT) :: PRAIN ! liquid precipitation (kg/m2/s) ! REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH ! flux of heat (W/m2) REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH_SURF REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH_WALL REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH_ROOF REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ ! flux of water vapor (kg/m2/s) REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ_SURF REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ_WALL REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ_ROOF REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa) REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa) REAL, DIMENSION(KI), INTENT(OUT) :: PCD_ROOF ! Drag coefficient for roofs multiplied by roof density (-) REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2 ! flux of CO2 (m/s*kg_CO2/kg_air) REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS ! flux of scalar var. (kg/m2/s) ! REAL, DIMENSION(KI), INTENT(OUT) :: PTRAD ! radiative temperature (K) REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB! direct albedo for each spectral band (-) REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB! diffuse albedo for each spectral band (-) REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity (-) ! REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K) REAL, DIMENSION(KI), INTENT(OUT) :: PZ0 ! roughness length for momentum (m) REAL, DIMENSION(KI), INTENT(OUT) :: PZ0H ! roughness length for heat (m) REAL, DIMENSION(KI), INTENT(OUT) :: PQSURF ! specific humidity at surface (kg/kg) ! REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I' REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK' ! !* 0.2 declarations of local variables ! INTEGER :: JSWB ! loop counter on shortwave spectral bands ! REAL, DIMENSION(KI) :: ZQA ! specific humidity (kg/kg) REAL, DIMENSION(KI) :: ZEXNA ! Exner function at forcing level REAL, DIMENSION(KI) :: ZEXNS ! Exner function at surface level REAL, DIMENSION(KI,KLEV) :: ZWIND ! wind INTEGER :: ZCTL ! ! Ouput Diagnostics: ! REAL, DIMENSION(KI) :: ZU_CANYON ! wind in canyon REAL, DIMENSION(KI) :: ZT_CANYON ! temperature in canyon REAL, DIMENSION(KI) :: ZQ_CANYON ! specific humidity in canyon REAL, DIMENSION(KI) :: ZT_CAN ! temperature in canyon (evolving in TEB) REAL, DIMENSION(KI) :: ZQ_CAN ! specific humidity in canyon (evolving in TEB) REAL, DIMENSION(KI) :: ZTA_HVEG ! temperature in canyon at tree level REAL, DIMENSION(KI) :: ZQA_HVEG ! specific humidity in canyon at tree level REAL, DIMENSION(KI) :: ZTS_HVEG ! temperature of high vegetation ! REAL, DIMENSION(KI) :: ZPEW_A_COEF ! implicit coefficients REAL, DIMENSION(KI) :: ZPEW_B_COEF ! needed if HCOUPLING='I' ! REAL, DIMENSION(KI) :: ZT_LOWCAN ! temperature at lowest canyon level (K) REAL, DIMENSION(KI) :: ZQ_LOWCAN ! humidity at lowest canyon level (kg/kg) REAL, DIMENSION(KI) :: ZU_LOWCAN ! wind speed at lowest canyon level (m/s) REAL, DIMENSION(KI) :: ZZ_LOWCAN ! height of lowest canyon level (m) ! REAL, DIMENSION(KI) :: ZPEW_A_COEF_LOWCAN ! implicit coefficients for wind coupling REAL, DIMENSION(KI) :: ZPEW_B_COEF_LOWCAN ! between first canopy level and road ! REAL, DIMENSION(KI) :: ZTA ! temperature at canyon level just above roof (K) REAL, DIMENSION(KI) :: ZPA ! pressure at canyon level just above roof (K) REAL, DIMENSION(KI) :: ZUA ! wind at canyon level just above roof (m/s) REAL, DIMENSION(KI) :: ZUREF ! height of canyon level just above roof (m) REAL, DIMENSION(KI) :: ZZREF ! height of canyon level just above roof (m) ! REAL, DIMENSION(KI) :: ZDIR_SW ! total direct SW REAL, DIMENSION(KI) :: ZSCA_SW ! total diffuse SW REAL, DIMENSION(KI) :: ZAVG_SCA_SW REAL, DIMENSION(KI) :: ZAVG_DIR_SW REAL, DIMENSION(KI) :: ZAVG_DIR_SW_ROAD ! REAL, DIMENSION(KI) :: ZAVG_H_WL REAL, DIMENSION(KI) :: ZAVG_E_WL ! REAL, DIMENSION(KI,BOP%NBEMCOMP) :: ZAVG_TI_BLD REAL, DIMENSION(KI,BOP%NBEMCOMP) :: ZAVG_QI_BLD ! REAL, DIMENSION(KI) :: ZRN_GRND ! net radiation on ground built surf REAL, DIMENSION(KI) :: ZH_GRND ! sensible heat flux on ground built surf REAL, DIMENSION(KI) :: ZLE_GRND ! latent heat flux on ground built surf REAL, DIMENSION(KI) :: ZGFLX_GRND ! storage flux in ground built surf REAL, DIMENSION(KI) :: ZUW_GRND ! momentum flux for ground built surf REAL, DIMENSION(KI) :: ZDUWDU_GRND ! REAL, DIMENSION(KI) :: ZEMIT_LW_HVEG REAL, DIMENSION(KI) :: ZAVG_UW_GRND REAL, DIMENSION(KI) :: ZAVG_DUWDU_GRND REAL, DIMENSION(:,:), ALLOCATABLE :: ZAVG_DH_HVEG REAL, DIMENSION(:,:), ALLOCATABLE :: ZAVG_DE_HVEG REAL, DIMENSION(KI) :: ZAVG_AC_GRND REAL, DIMENSION(KI) :: ZAVG_AC_GRND_WAT REAL, DIMENSION(KI) :: ZSCA_SW_SKY ! diff solar rad from the sky received by people (incl attenuation by trees) REAL, DIMENSION(KI) :: ZLW_RAD_SKY ! IR rad from the sky received by people (incl attenuation by trees) ! REAL, DIMENSION(KI) :: ZRESA_TOWN ! aerodynamical resistance REAL, DIMENSION(KI) :: ZAC_GRND ! ground built surf aerodynamical conductance REAL, DIMENSION(KI) :: ZAC_GRND_WAT ! ground built surf water aerodynamical conductance ! REAL, DIMENSION(KI) :: ZLEW_RF ! latent heat flux on snowfree roof REAL, DIMENSION(KI) :: ZRNSN_RF ! net radiation over snow REAL, DIMENSION(KI) :: ZHSN_RF ! sensible heat flux over snow REAL, DIMENSION(KI) :: ZLESN_RF ! latent heat flux over snow REAL, DIMENSION(KI) :: ZGSN_RF ! flux under the snow REAL, DIMENSION(KI) :: ZMELT_RF ! snow melt REAL, DIMENSION(KI) :: ZUW_RF ! momentum flux for roofs REAL, DIMENSION(KI) :: ZDUWDU_RF ! REAL, DIMENSION(KI) :: ZAVG_UW_RF REAL, DIMENSION(KI) :: ZAVG_DUWDU_RF REAL, DIMENSION(KI) :: ZAVG_H_RF REAL, DIMENSION(KI) :: ZAVG_E_RF ! REAL, DIMENSION(KI) :: ZLEW_RD ! latent heat flux on snowfree road REAL, DIMENSION(KI) :: ZRNSN_RD ! net radiation over snow REAL, DIMENSION(KI) :: ZHSN_RD ! sensible heat flux over snow REAL, DIMENSION(KI) :: ZLESN_RD ! latent heat flux over snow REAL, DIMENSION(KI) :: ZGSN_RD ! flux under the snow REAL, DIMENSION(KI) :: ZMELT_RD ! snow melt REAL, DIMENSION(KI) :: ZAC_RD ! road aerodynamical conductance REAL, DIMENSION(KI) :: ZAC_RD_WAT ! road water aerodynamical conductance ! REAL, DIMENSION(KI) :: ZAC_GD ! green area aerodynamical conductance REAL, DIMENSION(KI) :: ZAC_GD_WAT! green area water aerodynamical conductance ! REAL, DIMENSION(KI) :: ZAC_GRF ! green roof aerodynamical conductance REAL, DIMENSION(KI) :: ZAC_GRF_WAT! green roof water aerodynamical conductance ! REAL, DIMENSION(KI) :: ZTRAD ! radiative temperature for current patch REAL, DIMENSION(KI) :: ZEMIS ! emissivity for current patch REAL, DIMENSION(KI,TOP%NTEB_PATCH) :: ZTRAD_PATCH ! radiative temperature for each patch REAL, DIMENSION(KI,TOP%NTEB_PATCH) :: ZEMIS_PATCH ! emissivity for each patch ! REAL, DIMENSION(:,:), ALLOCATABLE :: ZLAD_CAN ! vertical profile of Leaf Area Density on canopy grid REAL, DIMENSION(:,:), ALLOCATABLE :: ZDH_HVEG ! sensible heat flux from trees discretized on caopy grid REAL, DIMENSION(:,:), ALLOCATABLE :: ZDLE_HVEG! latent heat flux from trees discretized on caopy grid ! REAL, DIMENSION(KI) :: ZDIR_ALB ! direct albedo of town REAL, DIMENSION(KI) :: ZSCA_ALB ! diffuse albedo of town REAL, DIMENSION(KI,KSW,TOP%NTEB_PATCH) :: ZDIR_ALB_PATCH ! direct albedo per wavelength and patch REAL, DIMENSION(KI,KSW,TOP%NTEB_PATCH) :: ZSCA_ALB_PATCH ! diffuse albedo per wavelength and patch ! REAL, DIMENSION(KI) :: ZRI ! Richardson number REAL, DIMENSION(KI) :: ZCD ! drag coefficient REAL, DIMENSION(KI) :: ZCDN ! neutral drag coefficient REAL, DIMENSION(KI) :: ZCH ! heat drag REAL, DIMENSION(KI) :: ZRN ! net radiation over town REAL, DIMENSION(KI) :: ZH ! sensible heat flux over town REAL, DIMENSION(KI) :: ZH_TOWN_SURF ! sensible heat flux over town, surface level REAL, DIMENSION(KI) :: ZH_TOWN_WALL ! sensible heat flux over town, wall level REAL, DIMENSION(KI) :: ZH_TOWN_ROOF ! sensible heat flux over town, roof level REAL, DIMENSION(KI) :: ZLE ! latent heat flux over town REAL, DIMENSION(KI) :: ZGFLX ! flux through the ground REAL, DIMENSION(KI) :: ZQF ! anthropogenic flux over town REAL, DIMENSION(KI) :: ZEVAP ! evaporation (km/m2/s) REAL, DIMENSION(KI) :: ZEVAP_TOWN_SURF ! evaporation flux, surface level (kg/m2/s) REAL, DIMENSION(KI) :: ZEVAP_TOWN_WALL ! evaporation flux, wall level (kg/m2/s) REAL, DIMENSION(KI) :: ZEVAP_TOWN_ROOF ! evaporation flux, roof level (kg/m2/s) ! REAL, DIMENSION(KI) :: ZAVG_T_CANYON ! temperature in canyon for town REAL, DIMENSION(KI) :: ZAVG_Q_CANYON ! specific humidity in canyon for town REAL, DIMENSION(KI) :: ZAVG_CD ! aggregated drag coefficient REAL, DIMENSION(KI) :: ZAVG_CDN ! aggregated neutral drag coefficient REAL, DIMENSION(KI) :: ZAVG_RI ! aggregated Richardson number REAL, DIMENSION(KI) :: ZAVG_CH ! aggregated Heat transfer coefficient ! ! new local variables after BEM ! REAL, DIMENSION(KI) :: ZUSTAR ! friction velocity REAL, DIMENSION(KI) :: ZSFU ! momentum flux for patch (U direction) REAL, DIMENSION(KI) :: ZSFV ! momentum flux for patch (V direction) REAL, DIMENSION(KI) :: ZH_TRAFFIC ! anthropogenic sensible ! ! heat fluxes due to traffic REAL, DIMENSION(KI) :: ZLE_TRAFFIC ! anthropogenic latent ! ! heat fluxes due to traffic REAL, DIMENSION(KI) :: ZTRAF_MODULATION ! modulation of traffic CO2 flux as a function of month, day and hour REAL, DIMENSION(KI) :: ZPOP_MODULATION ! modulation of CO2 flux due to metabolism as a function of month, day and hour REAL, DIMENSION(KI) :: ZREF_SW_HVEG ! total solar rad reflected from high veg REAL, DIMENSION(KI) :: ZAVG_Z0_TOWN REAL, DIMENSION(KI) :: ZAVG_RESA_TOWN REAL, DIMENSION(KI) :: ZAVG_USTAR ! town avegared Ustar REAL, DIMENSION(KI) :: ZAVG_BLD ! town averaged building fraction REAL, DIMENSION(KI) :: ZAVG_BLD_HEIGHT ! town averaged building height REAL, DIMENSION(KI) :: ZAVG_WL_O_HOR ! town averaged Wall/hor ratio REAL, DIMENSION(KI) :: ZAVG_CAN_HW_RATIO ! town averaged road aspect ratio REAL, DIMENSION(KI) :: ZAVG_TAU_SR REAL, DIMENSION(KI) :: ZAVG_H REAL, DIMENSION(KI) :: ZAVG_LE REAL, DIMENSION(KI) :: ZAVG_RN REAL, DIMENSION(KI) :: ZAVG_GFLX REAL, DIMENSION(KI) :: ZAVG_QF REAL, DIMENSION(KI) :: ZAVG_REF_SW_GRND REAL, DIMENSION(KI) :: ZAVG_REF_SW_FAC REAL, DIMENSION(KI) :: ZAVG_REF_SW_HVEG REAL, DIMENSION(KI) :: ZSCA_SW_GROUND_DOWN REAL, DIMENSION(KI) :: ZSCA_SW_GROUND_UP REAL, DIMENSION(KI) :: ZSCA_SW_GROUND_HOR REAL, DIMENSION(KI) :: ZLW_GROUND_DOWN REAL, DIMENSION(KI) :: ZLW_GROUND_HOR REAL, DIMENSION(KI) :: ZAVG_SCA_SW_GROUND_DOWN REAL, DIMENSION(KI) :: ZAVG_SCA_SW_GROUND_UP REAL, DIMENSION(KI) :: ZAVG_SCA_SW_GROUND_HOR REAL, DIMENSION(KI) :: ZAVG_LW_GROUND_DOWN REAL, DIMENSION(KI) :: ZAVG_LW_GROUND_HOR REAL, DIMENSION(KI) :: ZAVG_EMIT_LW_FAC REAL, DIMENSION(KI) :: ZAVG_EMIT_LW_GRND REAL, DIMENSION(KI) :: ZAVG_EMIT_LW_HVEG REAL, DIMENSION(KI) :: ZAVG_LW_RAD_SKY REAL, DIMENSION(KI) :: ZAVG_SCA_SW_SKY REAL, DIMENSION(KI,BOP%NBEMCOMP) :: ZAVG_T_RAD_IND REAL, DIMENSION(KI) :: ZAVG_URBTREE REAL, DIMENSION(:,:), ALLOCATABLE :: ZAVG_LAD_CAN REAL, DIMENSION(KI) :: ZAVG_ROAD_SHADE REAL, DIMENSION(KI) :: ZU_UTCI ! wind speed for the UTCI calculation (m/s) REAL, DIMENSION(KI) :: ZT_UTCI ! temperature for the UTCI calculation (m/s) REAL, DIMENSION(KI) :: ZQ_UTCI ! specific humidity for the UTCI calculation (m/s) REAL, DIMENSION(KI) :: ZALFAU ! V+(1) = alfa u'w'(1) + beta REAL, DIMENSION(KI) :: ZBETAU ! V+(1) = alfa u'w'(1) + beta REAL, DIMENSION(KI) :: ZALFAT ! Th+(1) = alfa w'th'(1) + beta REAL, DIMENSION(KI) :: ZBETAT ! Th+(1) = alfa w'th'(1) + beta REAL, DIMENSION(KI) :: ZALFAQ ! Q+(1) = alfa w'q'(1) + beta REAL, DIMENSION(KI) :: ZBETAQ ! Q+(1) = alfa w'q'(1) + beta !***** CANOPY ***** REAL, DIMENSION(KI) :: ZWAKE ! reduction of average wind speed ! ! in canyon due to direction average. REAL, DIMENSION(KI) :: ZSFLUX_U ! Surface flux u'w' (m2/s2) REAL, DIMENSION(KI) :: ZSFLUX_T ! Surface flux w'T' (mK/s) REAL, DIMENSION(KI) :: ZSFLUX_Q ! Surface flux w'q' (kgm2/s) REAL, DIMENSION(KI,SB%NLVL) :: ZFORC_U ! tendency due to drag force for wind REAL, DIMENSION(KI,SB%NLVL) :: ZDFORC_UDU! formal derivative of ! ! tendency due to drag force for wind REAL, DIMENSION(KI,SB%NLVL) :: ZFORC_E ! tendency due to drag force for TKE REAL, DIMENSION(KI,SB%NLVL) :: ZDFORC_EDE! formal derivative of ! ! tendency due to drag force for TKE REAL, DIMENSION(KI,SB%NLVL) :: ZFORC_T ! tendency due to drag force for Temp REAL, DIMENSION(KI,SB%NLVL) :: ZDFORC_TDT! formal derivative of ! ! tendency due to drag force for Temp REAL, DIMENSION(KI,SB%NLVL) :: ZFORC_Q ! tendency due to drag force for hum REAL, DIMENSION(KI,SB%NLVL) :: ZDFORC_QDQ! formal derivative of ! ! tendency due to drag force for hum. REAL, DIMENSION(KI) :: ZLMO ! Monin-Obukhov length at canopy height (m) REAL, DIMENSION(KI,SB%NLVL) :: ZL ! Mixing length generic profile at mid levels ! REAL, DIMENSION(KI) :: ZCOEF REAL, DIMENSION(KI) :: ZAVG_USTAR_ROOF REAL, DIMENSION(KI) :: ZNET_UP_DOWN ! REAL :: ZCONVERTFACM0_SLT, ZCONVERTFACM0_DST REAL :: ZCONVERTFACM3_SLT, ZCONVERTFACM3_DST REAL :: ZCONVERTFACM6_SLT, ZCONVERTFACM6_DST ! INTEGER :: JI INTEGER :: JLAYER INTEGER :: JCOMP INTEGER :: JJ ! INTEGER :: ICHECK REAL :: ZWEIGHT ! TYPE(CHECK_TEB_t) :: CT ! ! number of TEB patches ! INTEGER :: JP, IBEG, IEND ! loop counter INTEGER :: ILUOUT ! Unit number ! REAL(KIND=JPRB) :: ZHOOK_HANDLE ! !------------------------------------------------------------------------------------- ! Preliminaries: !------------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('COUPLING_TEB_N',0,ZHOOK_HANDLE) CALL GET_LUOUT(HPROGRAM,ILUOUT) ! IF (HTEST/='OK') THEN CALL ABOR1_SFX('COUPLING_TEBN: FATAL ERROR DURING ARGUMENT TRANSFER') END IF ! ! Set very low values of snow and rain rate to 0.0 ! WHERE(PSN(:).LT.1.0e-9) PSN(:)=0.0 WHERE(PRAIN(:).LT.1.0e-9) PRAIN(:)=0.0 ! !------------------------------------------------------------------------------------- ! CT%LCHECK_TEB = TOP%LCHECK_TEB CT%XCHECK_PROCESS = TOP%XEPS_BDGT_FAC CT%XCHECK_ALL = TOP%XEPS_BDGT_GLOB ! IF (CT%LCHECK_TEB) CALL ALLOC_CHECK_TEB(CT, KI, BOP%NBEMCOMP) ! ! scalar fluxes ! PSFTS(:,:) = 0. ! ! broadband radiative fluxes ! ZDIR_SW(:) = 0. ZSCA_SW(:) = 0. ! DO JSWB=1,KSW !add directionnal contrib from scattered radiation ! ZDIR_SW(:) = ZDIR_SW(:) + PDIR_SW(:,JSWB) ZSCA_SW(:) = ZSCA_SW(:) + PSCA_SW(:,JSWB) ! ENDDO ! ! specific humidity (conversion from kg/m3 to kg/kg) ! ZQA(:) = PQA(:,1) / PRHOA(:,1) ! ! wind speed ! ZWIND(:,:) = SQRT(PU(:,:)**2+PV(:,:)**2) ! ! method of wind coupling ! IF (HCOUPLING=='I') THEN ZPEW_A_COEF = PPEW_A_COEF ZPEW_B_COEF = PPEW_B_COEF ELSE ZPEW_A_COEF = 0. ZPEW_B_COEF = ZWIND(:,1) END IF ! ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! Time evolution ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! DO JP=1,TOP%NTEB_PATCH CALL TRAFFIC_FLUX_MODULATION (TOP, PTSUN, & NT%AL(JP)%XDELTA_LEGAL_TIME,NT%AL(JP)%NDELTA_LEGAL_TIME, & NT%AL(JP)%XTIME_OF_CHANGE, NT%AL(JP)%LTIME_OF_CHANGE, & G%XLON, HPROGRAM,ZTRAF_MODULATION,ZPOP_MODULATION) ! ZH_TRAFFIC(:) = NT%AL(JP)%XH_TRAFFIC * ZTRAF_MODULATION ZLE_TRAFFIC(:) = NT%AL(JP)%XLE_TRAFFIC * ZTRAF_MODULATION ! END DO !,' (K)' TOP%TTIME%TIME = TOP%TTIME%TIME + PTSTEP CALL ADD_FORECAST_TO_DATE_SURF(TOP%TTIME%TDATE%YEAR, TOP%TTIME%TDATE%MONTH,& TOP%TTIME%TDATE%DAY, TOP%TTIME%TIME) ! !-------------------------------------------------------------------------------------- ! Canyon forcing for TEB !-------------------------------------------------------------------------------------- !------------------------------------------------------------------------------------- ! Town averaged quantities to force canopy atmospheric layers !------------------------------------------------------------------------------------- ! DO JP=1,TOP%NTEB_PATCH CALL ADD_PATCH_CONTRIB(JP,ZAVG_BLD, NT%AL(JP)%XBLD ) CALL ADD_PATCH_CONTRIB(JP,ZAVG_BLD_HEIGHT, NT%AL(JP)%XBLD_HEIGHT ) CALL ADD_PATCH_CONTRIB(JP,ZAVG_WL_O_HOR, NT%AL(JP)%XWALL_O_HOR ) CALL ADD_PATCH_CONTRIB(JP,ZAVG_CAN_HW_RATIO,NT%AL(JP)%XCAN_HW_RATIO) CALL ADD_PATCH_CONTRIB(JP,ZAVG_Z0_TOWN ,NT%AL(JP)%XZ0_TOWN ) END DO ! ! Allocate local canopy variables ! ALLOCATE(ZAVG_DH_HVEG(KI,SB%NLVL)) ALLOCATE(ZAVG_DE_HVEG(KI,SB%NLVL)) ALLOCATE(ZLAD_CAN(KI,SB%NLVL)) ALLOCATE(ZDH_HVEG(KI,SB%NLVL)) ALLOCATE(ZDLE_HVEG(KI,SB%NLVL)) ALLOCATE(ZAVG_LAD_CAN(KI,SB%NLVL)) ! IF (TOP%LCANOPY) THEN ! ! !------------------------------------------------------------------------------------- ! Updates canopy vertical grid as a function of forcing height ! and coupling (single level or multi-level) !------------------------------------------------------------------------------------- ! IF (TOP%LATM_CANOPY) THEN ! ! Check whether lowest forcing level not too low ! compared to roughness lengths assumed in the TEB routines ! IF ((MINVAL(PZREF).LT.0.1).OR.(MINVAL(PUREF).LT.0.1)) THEN CALL ABOR1_SFX("COUPLING_TEBN: Too low value for reference height") ENDIF ! ! The number of canopy levels is set to the number of levels from the atmospheric model ! SB%NLVL = KLEV ! ! On first time step: change size of TEB canopy variables ! to match with atmospheric model grid. ! IF (SIZE(SB%XZ,2).NE.KLEV) THEN ! DEALLOCATE(SB%XZ) DEALLOCATE(SB%XZF) DEALLOCATE(SB%XDZ) DEALLOCATE(SB%XT) DEALLOCATE(SB%XQ) DEALLOCATE(SB%XP) DEALLOCATE(SB%XU) DEALLOCATE(SB%XTKE) DEALLOCATE(SB%XLMO) DEALLOCATE(SB%XLM) DEALLOCATE(SB%XLEPS) DEALLOCATE(SB%XU_MEAN) DEALLOCATE(SB%XT_MEAN) DEALLOCATE(SB%XQ_MEAN) DEALLOCATE(SB%XRH_MEAN) DEALLOCATE(SB%XP_MEAN) ! ALLOCATE(SB%XZ(KI,KLEV)) ALLOCATE(SB%XZF(KI,KLEV)) ALLOCATE(SB%XDZ(KI,KLEV)) ALLOCATE(SB%XT(KI,KLEV)) ALLOCATE(SB%XQ(KI,KLEV)) ALLOCATE(SB%XP(KI,KLEV)) ALLOCATE(SB%XU(KI,KLEV)) ALLOCATE(SB%XTKE(KI,KLEV)) ALLOCATE(SB%XLMO(KI,KLEV)) ALLOCATE(SB%XLM(KI,KLEV)) ALLOCATE(SB%XLEPS(KI,KLEV)) ALLOCATE(SB%XU_MEAN(KI,KLEV)) ALLOCATE(SB%XT_MEAN(KI,KLEV)) ALLOCATE(SB%XQ_MEAN(KI,KLEV)) ALLOCATE(SB%XRH_MEAN(KI,KLEV)) ALLOCATE(SB%XP_MEAN(KI,KLEV)) ! DEALLOCATE(ZAVG_DH_HVEG) DEALLOCATE(ZAVG_DE_HVEG) DEALLOCATE(ZLAD_CAN) DEALLOCATE(ZDH_HVEG) DEALLOCATE(ZDLE_HVEG) DEALLOCATE(ZAVG_LAD_CAN) ! ALLOCATE(ZAVG_DH_HVEG(KI,KLEV)) ALLOCATE(ZAVG_DE_HVEG(KI,KLEV)) ALLOCATE(ZLAD_CAN(KI,KLEV)) ALLOCATE(ZDH_HVEG(KI,KLEV)) ALLOCATE(ZDLE_HVEG(KI,KLEV)) ALLOCATE(ZAVG_LAD_CAN(KI,KLEV)) ! ! The variables not used with this option are initialised with the undefined value ! SB%XLMO(:,:) = XUNDEF SB%XLM(:,:) = XUNDEF SB%XLEPS(:,:) = XUNDEF ! ENDIF ! ! The height of the middle of the canopy levels equals the ! scalar level heights from the atmospheric model ! SB%XZ(:,:) = PZREF(:,:) ! ! The height of the bottom and top of the canopy levels ! SB%XZF(:,:) = XUNDEF SB%XZF(:,1) = 0. ! DO JLAYER=2,KLEV SB%XZF(:,JLAYER) = 2.*SB%XZ(:,JLAYER-1) - SB%XZF(:,JLAYER-1) ENDDO ! ! Calculate the layer depths (variable located at full levels) ! SB%XDZ(:,:) = -XUNDEF DO JLAYER=1,SB%NLVL-1 SB%XDZ(:,JLAYER) = SB%XZF(:,JLAYER+1) - SB%XZF(:,JLAYER) ENDDO ! ! The prognostic canopy variables are set equal to the atmospheric variables ! SB%XT(:,:) = PTA(:,:) SB%XQ(:,:) = PQA(:,:) SB%XP(:,:) = PPA(:,:) SB%XU(:,:) = ZWIND(:,:) SB%XTKE(:,:) = PTKE(:,:) ! ! For the variables close to the surface, the first atmospheric level is taken ! ZZ_LOWCAN(:) = PZREF(:,1) ZU_LOWCAN(:) = ZWIND(:,1) ZT_LOWCAN(:) = PTA(:,1) ZQ_LOWCAN(:) = PQA(:,1)/PRHOA(:,1) ZPEW_A_COEF_LOWCAN(:) = 0.0 ZPEW_B_COEF_LOWCAN(:) = ZU_LOWCAN(:) ! ! For the variables above the roof, the corresponding ! atmospheric values are assigned. ! However, the level must be at least 0.5 m higher than the roof, since ! in urban drag a roof roughness length of 0.15 m is hardcoded ! Otherwise the next higher level is taken. ! DO JJ=1,KI ! ICHECK=0 ! DO JLAYER=1,(SB%NLVL-1) ! IF ( (SB%XZ(JJ,JLAYER ).LE.ZAVG_BLD_HEIGHT(JJ)) .AND. & (SB%XZ(JJ,JLAYER+1).GT.ZAVG_BLD_HEIGHT(JJ)) ) THEN ! ICHECK=ICHECK+1 ! IF ( (SB%XZ(JJ,JLAYER+1) - ZAVG_BLD_HEIGHT(JJ) ) .GT. 0.5 ) THEN ! ZUREF(JJ) = SB%XZ(JJ,JLAYER+1) - ZAVG_BLD_HEIGHT(JJ) ZZREF(JJ) = SB%XZ(JJ,JLAYER+1) - ZAVG_BLD_HEIGHT(JJ) ZTA(JJ) = SB%XT(JJ,JLAYER+1) ZQA(JJ) = SB%XQ(JJ,JLAYER+1)/PRHOA(JJ,JLAYER+1) ZPA(JJ) = SB%XP(JJ,JLAYER+1) ZUA(JJ) = SB%XU(JJ,JLAYER+1) ! ELSE ! ZUREF(JJ) = SB%XZ(JJ,JLAYER+2) - ZAVG_BLD_HEIGHT(JJ) ZZREF(JJ) = SB%XZ(JJ,JLAYER+2) - ZAVG_BLD_HEIGHT(JJ) ZTA(JJ) = SB%XT(JJ,JLAYER+2) ZQA(JJ) = SB%XQ(JJ,JLAYER+2)/PRHOA(JJ,JLAYER+2) ZPA(JJ) = SB%XP(JJ,JLAYER+2) ZUA(JJ) = SB%XU(JJ,JLAYER+2) ! ENDIF ! ENDIF ! ENDDO ! IF (ICHECK.NE.1) THEN CALL ABOR1_SFX("COUPLING_TEBN: Roof level could not be attributed") ENDIF ! ENDDO ! ! For the canyon variables, a weighted average over all ! atmospheric levels intersecting the buildings is calculated ! The in-canyon variability of temperature, humidity and wind speed ! is therefore neglected, which leads to uncertainties due to ! the non-linearity of the exchange coeffients. ! DO JJ=1,KI ! ICHECK = 0 ZWEIGHT = 0 ! ZU_CANYON(JJ) = 0.0 ZT_CANYON(JJ) = 0.0 ZQ_CANYON(JJ) = 0.0 ! DO JLAYER=1,(SB%NLVL-1) ! IF ( (SB%XZ(JJ,JLAYER ) .LT. ZAVG_BLD_HEIGHT(JJ)) .AND. & (SB%XZ(JJ,JLAYER+1) .LE. ZAVG_BLD_HEIGHT(JJ)) ) THEN ! ZWEIGHT = ZWEIGHT + (SB%XZF(JJ,JLAYER+1)-SB%XZF(JJ,JLAYER)) ! ZU_CANYON(JJ) = ZU_CANYON(JJ) + SB%XU(JJ,JLAYER) * (SB%XZF(JJ,JLAYER+1)-SB%XZF(JJ,JLAYER)) ZT_CANYON(JJ) = ZT_CANYON(JJ) + SB%XT(JJ,JLAYER) * (SB%XZF(JJ,JLAYER+1)-SB%XZF(JJ,JLAYER)) ZQ_CANYON(JJ) = ZQ_CANYON(JJ) + (SB%XQ(JJ,JLAYER) / PRHOA(JJ,JLAYER)) * (SB%XZF(JJ,JLAYER+1)-SB%XZF(JJ,JLAYER)) ! ELSE IF ( (SB%XZ(JJ,JLAYER ) .LE. ZAVG_BLD_HEIGHT(JJ)) .AND. & (SB%XZ(JJ,JLAYER+1) .GT. ZAVG_BLD_HEIGHT(JJ)) ) THEN ! ZWEIGHT = ZWEIGHT + (ZAVG_BLD_HEIGHT(JJ)-SB%XZF(JJ,JLAYER)) ! ZU_CANYON(JJ) = ZU_CANYON(JJ) + SB%XU(JJ,JLAYER) * (ZAVG_BLD_HEIGHT(JJ)-SB%XZF(JJ,JLAYER)) ZT_CANYON(JJ) = ZT_CANYON(JJ) + SB%XT(JJ,JLAYER) * (ZAVG_BLD_HEIGHT(JJ)-SB%XZF(JJ,JLAYER)) ZQ_CANYON(JJ) = ZQ_CANYON(JJ) + (SB%XQ(JJ,JLAYER) / PRHOA(JJ,JLAYER)) * (ZAVG_BLD_HEIGHT(JJ)-SB%XZF(JJ,JLAYER)) ! ICHECK=ICHECK+1 ! ENDIF ! ENDDO ! IF (ICHECK.NE.1) THEN CALL ABOR1_SFX ("COUPLING_TEBN: Roof level could not be attributed") ENDIF ! IF (ABS(ZWEIGHT-ZAVG_BLD_HEIGHT(JJ)).GT.1.0E-6) THEN CALL ABOR1_SFX ("COUPLING_TEBN: Wrong weights for canyon levels") ENDIF ! ZU_CANYON(JJ) = ZU_CANYON(JJ) / ZWEIGHT ZT_CANYON(JJ) = ZT_CANYON(JJ) / ZWEIGHT ZQ_CANYON(JJ) = ZQ_CANYON(JJ) / ZWEIGHT ! ENDDO ! ELSE ! ! Make sure this part is not used with multi level forcing ! IF (KLEV.NE.1) THEN CALL ABOR1_SFX("COUPLING_TEBN: TEB canopy only available with single level coupling") ENDIF ! !* determines where is the forcing level and modifies the upper levels of the canopy grid ! CALL CANOPY_GRID_UPDATE(KI, ZAVG_BLD_HEIGHT, ZAVG_BLD_HEIGHT+PUREF(:,1), SB) ! !* Initialisations of T, Q, TKE and wind at first time step ! IF(ANY(SB%XT(:,:) == XUNDEF)) THEN DO JLAYER=1,SB%NLVL SB%XT(:,JLAYER) = PTA(:,1) SB%XQ(:,JLAYER) = PQA(:,1) SB%XU(:,JLAYER) = 2./XPI * ZWIND(:,1) & * LOG( ( 2.* NT%AL(1)%XBLD_HEIGHT(:)/3.) / NT%AL(1)%XZ0_TOWN(:)) & / LOG( (PUREF(:,1)+ 2.* NT%AL(1)%XBLD_HEIGHT(:)/3.) / NT%AL(1)%XZ0_TOWN(:)) END DO SB%XTKE(:,:) = 1. ENDIF ! !* default forcing above roof: forcing level ZUREF(:) = PUREF(:,1) ZZREF(:) = PZREF(:,1) ZUA(:) = SB%XU(:,SB%NLVL) ZTA(:) = SB%XT(:,SB%NLVL) ZQA(:) = SB%XQ(:,SB%NLVL)/PRHOA(:,1) ZPA(:) = SB%XP(:,SB%NLVL) !* for the time being, only one value is kept for wall in-canyon forcing, in the middle of the canyon ZU_CANYON(:) = ZUA(:) ZT_CANYON(:) = ZTA(:) ZQ_CANYON(:) = ZQA(:) 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 !* finds layer just above roof (at least 1m above roof) IF (SB%XZ(JI,JLAYER)<ZAVG_BLD_HEIGHT(JI)+1. .AND. SB%XZ(JI,JLAYER+1)>=ZAVG_BLD_HEIGHT(JI)+1.) THEN ZUREF(JI) = SB%XZ(JI,JLAYER+1) - ZAVG_BLD_HEIGHT(JI) ZZREF(JI) = SB%XZ(JI,JLAYER+1) - ZAVG_BLD_HEIGHT(JI) ZTA (JI) = SB%XT(JI,JLAYER+1) ZQA (JI) = SB%XQ(JI,JLAYER+1)/PRHOA(JI,1) ZUA (JI) = MAX(SB%XU(JI,JLAYER+1) - 2.*SQRT(SB%XTKE(JI,JLAYER+1)) , SB%XU(JI,JLAYER+1)/3.) ZPA (JI) = SB%XP(JI,JLAYER+1) ZLMO (JI) = SB%XLMO(JI,JLAYER+1) END IF END DO END DO ! ZU_CANYON= MAX(ZU_CANYON,0.2) ZU_LOWCAN=SB%XU(:,1) ZT_LOWCAN=SB%XT(:,1) ZQ_LOWCAN=SB%XQ(:,1) / PRHOA(:,1) ZZ_LOWCAN=SB%XZ(:,1) WHERE(ZPA==XUNDEF) ZPA = PPA(:,1) ! security for first time step ! !------------------------------------------------------------------------------------- ! determine the vertical profile for mixing and dissipative lengths (at full levels) !------------------------------------------------------------------------------------- ! IF (TOP%CURB_LM.EQ.'SM10') THEN ! ! Computation of the urban mixing length following Santiago and Martilli (2010) ! CALL SM10(SB%XZ, ZAVG_BLD_HEIGHT, ZAVG_BLD, ZL) ! ELSE IF (TOP%CURB_LM.EQ.'LMEZ') THEN ! ! The urban mixing length equals to the height above ground ! ZL(:,:) = SB%XZ(:,:) ! ELSE CALL ABOR1_SFX("COUPLING_TEBN: No rule for computation of urban mixing length") ENDIF ! !------------------------------------------------------------------------------------- ! computes coefficients for implicitation !------------------------------------------------------------------------------------- ! ZAVG_UW_GRND(:) = 0. ZAVG_DUWDU_GRND(:) = 0. ZAVG_UW_RF(:) = 0. ZAVG_DUWDU_RF(:) = 0. ZAVG_H_WL(:) = 0. ZAVG_H_RF(:) = 0. ZAVG_E_WL(:) = 0. ZAVG_E_RF(:) = 0. ZAVG_DH_HVEG(:,:) = 0. ZAVG_DE_HVEG(:,:) = 0. ZAVG_URBTREE(:) = 0. ZAVG_LAD_CAN(:,:) = 0. ZAVG_AC_GRND(:) = 0. ZAVG_AC_GRND_WAT(:)= 0. ZSFLUX_U(:) = 0. ZSFLUX_T(:) = 0. ZSFLUX_Q(:) = 0. ! DO JLAYER=1,SB%NLVL-1 !* Monin-Obuhkov theory not used inside the urban canopy ! => neutral mixing if layer is below : (roof level +1 meter) WHERE (SB%XZ(:,JLAYER)<=ZAVG_BLD_HEIGHT(:)+1.) SB%XLMO(:,JLAYER) = XUNDEF ENDDO ! !* computes tendencies on wind and Tke due to canopy 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 ) ! !* computes coefficients for implicitation CALL CANOPY_EVOL(SB, KI, PTSTEP, 1, 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) ! ZPEW_A_COEF_LOWCAN = - ZALFAU / PRHOA(:,1) ZPEW_B_COEF_LOWCAN = ZBETAU ! ENDIF ! Related to multi-level coupling (LATM_CANOPY) ! !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ELSE ! no canopy case !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DO JI=1,KI !* skimming flow for h/w>1 (maximum effect of direction on wind in the canyon); !* isolated flow for h/w<0.5 (wind is the same in large streets for all dir.) !* wake flow between. ! ZWAKE(JI)= 1. + (2./XPI-1.) * 2. * (ZAVG_CAN_HW_RATIO(JI)-0.5) ZWAKE(JI)= MAX(MIN(ZWAKE(JI),1.),2./XPI) ! !* Estimation of canyon wind speed from wind just above roof level ! (at 1.33h). Wind at 1.33h is estimated using the log law. ! IF (ZAVG_BLD_HEIGHT(JI) .GT. 0.) THEN ZU_CANYON(JI) = ZWAKE(JI) * EXP(-ZAVG_CAN_HW_RATIO(JI)/4.) * ZWIND(JI,1) & * LOG( ( 2.* ZAVG_BLD_HEIGHT(JI)/3.) / ZAVG_Z0_TOWN(JI)) & / LOG( (PUREF(JI,1)+ 2.* ZAVG_BLD_HEIGHT(JI)/3.) / ZAVG_Z0_TOWN(JI)) ZZ_LOWCAN(JI) = ZAVG_BLD_HEIGHT(JI) / 2. ELSE ZU_CANYON(JI) = ZWIND(JI,1) ZZ_LOWCAN(JI) = PZREF(JI,1) ENDIF END DO ! !* Without SBL scheme, canyon air is assumed at mid height ! ! Check for negative humidity ! IF (MINVAL(NT%AL(1)%XQ_CANYON).LT.-XSURF_EPSILON) THEN CALL GET_LUOUT(HPROGRAM,ILUOUT) WRITE(ILUOUT,*) "NT%AL(1)%Q_CANYON : ",NT%AL(1)%XQ_CANYON CALL FLUSH(ILUOUT) CALL ABOR1_SFX("Negative humidity in canyon") ENDIF ! !* Without SBL scheme, canyon air is assumed at mid height ZU_LOWCAN = ZU_CANYON ZT_LOWCAN = NT%AL(1)%XT_CANYON ZQ_LOWCAN = NT%AL(1)%XQ_CANYON ZT_CANYON = NT%AL(1)%XT_CANYON ZQ_CANYON = NT%AL(1)%XQ_CANYON ZUREF = PUREF(:,1) ZZREF = PZREF(:,1) ZTA = PTA(:,1) ZUA = ZWIND(:,1) ZPA = PPA(:,1) ZPEW_A_COEF_LOWCAN = 0. ZPEW_B_COEF_LOWCAN = ZU_CANYON END IF ! ! Exner functions ! ZEXNS(:) = (PPS(:)/XP00)**(XRD/XCPD) ZEXNA(:) = (ZPA(:)/XP00)**(XRD/XCPD) ! !-------------------------------------------------------------------------------------- ! Over Urban surfaces/towns: !-------------------------------------------------------------------------------------- ! !-------------------------------------------------------------------------------------- ! LOOP on TEB PATCHES !-------------------------------------------------------------------------------------- DO JP = 1,TOP%NTEB_PATCH ! ZT_CAN = ZT_CANYON ZQ_CAN = ZQ_CANYON ! IF (TOP%LCANOPY) THEN NT%AL(JP)%XT_CANYON(:) = ZT_CANYON(:) NT%AL(JP)%XQ_CANYON(:) = ZQ_CANYON(:) END IF ! ZLESN_RF(:) = 0. ZLESN_RD(:) = 0. TD%NDMT%AL(JP)%XG_GREENROOF_ROOF(:) = 0. ! ! Compute Air temperature at tree level inside the canyon ! IF (TOP%LGARDEN .AND. TOP%CURBTREE/='NONE') THEN ! air temperature IF (TOP%LCANOPY) THEN DO JI=1,SIZE(GDM%PHV%XH_LAI_MAX) ZCTL=0 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 ZCTL=1 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 ! 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) ENDDO ENDDO 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)) END IF ELSE 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 ENDIF IF (CHT%SVT%NDSTEQ>0) THEN ! Blindage à enlever lorsque que TEB aura été corrigé ZUSTAR(:) = MIN(ZUSTAR(:), 10.) ZRESA_TOWN(:) = MAX(ZRESA_TOWN(:), 10.) ! IBEG = CHT%SVT%NSV_DSTBEG IEND = CHT%SVT%NSV_DSTEND ! CALL DSLT_DEP(PSV(:,IBEG:IEND), PSFTS(:,IBEG:IEND), ZUSTAR, ZRESA_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), ZUSTAR, ZRESA_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 ) 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 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 ! DO JJ=1,KI IF (TD%D%XZON10M(JJ)/=XUNDEF) THEN ZU_UTCI(JJ) = SQRT(TD%D%XZON10M(JJ)**2+TD%D%XMER10M(JJ)**2) ELSE ZU_UTCI(JJ) = ZWIND(JJ,1) ENDIF ENDDO ! ! 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 ! ENDIF ! ! ############################################################### ! 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) ! !------------------------------------------------------------------------------------- CONTAINS 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