SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
roof_layer_e_budget.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE roof_layer_e_budget(PT_ROOF, PQSAT_ROOF, PTI_BLD, PAC_BLD, PTSTEP, &
7  hbld, phc_roof, ptc_roof, pd_roof, pdn_roof, &
8  prhoa, pac_roof, pac_roof_wat, plw_rad, pps, &
9  pdelt_roof, pta, pqa, pexna, pexns, &
10  pabs_sw_roof, pgsnow_roof, pemis_roof, &
11  pflx_bld_roof, pdqs_roof, pabs_lw_roof, &
12  phfree_roof, plefree_roof, pimb_roof, &
13  pfrac_gr, pg_greenroof_roof, &
14  pf_floor_mass, pf_floor_wall, pf_floor_win, &
15  pf_floor_roof, pradht_in, &
16  pts_mass, pt_win2, pts_floor, pti_wall, &
17  prad_roof_wall, prad_roof_win, prad_roof_floor,&
18  prad_roof_mass, pconv_roof_bld, prr, &
19  pload_in_roof )
20 ! ##########################################################################
21 !
22 !!**** *ROOF_LAYER_E_BUDGET*
23 !!
24 !! PURPOSE
25 !! -------
26 !
27 ! Computes the evoultion of surface temperature of roofs
28 !
29 !
30 !!** METHOD
31 ! ------
32 !
33 !
34 !
35 !
36 ! 5 : equation for evolution of Ts_roof
37 ! *********************************
38 !
39 ! dTt_1(t) / dt = 1/(dt_1*Ct_1) * ( Rn - H - LE
40 ! - 2*Kt_1*(Tt_1-Tt_2)/(dt_1 +dt_2) )
41 !
42 ! dTt_k(t) / dt = 1/(dt_k*Ct_k) * (- 2*Kt_k-1*(Tt_k-Tt_k-1)/(dt_k-1 +dt_k)
43 ! - 2*Kt_k *(Tt_k-Tt_k+1)/(dt_k+1 +dt_k) )
44 !
45 ! with
46 !
47 ! K*_k = (d*_k+ d*_k+1)/(d*_k/k*_k+ d*_k+1/k*_k+1)
48 !
49 ! Rn = (dir_Rg + sca_Rg) (1-a) + emis * ( Rat - sigma Ts**4 (t+dt) )
50 !
51 ! H = rho Cp CH V ( Ts (t+dt) - Tas )
52 !
53 ! LE = rho Lv CH V ( qs (t+dt) - qas )
54 !
55 ! where the as subscript denotes atmospheric values at ground level
56 ! (and not at first half level)
57 !
58 ! The tridiagonal systel is linearized with
59 !
60 ! using Ts**4 (t+dt) = Ts**4 (t) + 4*Ts**3 (t) * ( Ts(t+dt) - Ts(t) )
61 !
62 ! and qs (t+dt) = Hu(t) * qsat(t) + Hu(t) dqsat/dT * ( Ts(t+dt) - Ts(t) )
63 !
64 !
65 !
66 !! EXTERNAL
67 !! --------
68 !!
69 !!
70 !! IMPLICIT ARGUMENTS
71 !! ------------------
72 !!
73 !! MODD_CST
74 !!
75 !!
76 !! REFERENCE
77 !! ---------
78 !!
79 !!
80 !! AUTHOR
81 !! ------
82 !!
83 !! V. Masson * Meteo-France *
84 !!
85 !! MODIFICATIONS
86 !! -------------
87 !! Original 23/01/98
88 !! 17/10/05 (G. Pigeon) computation of storage inside the roofs
89 !! 26/04/12 (G. Pigeon) add term of heating of rain (new arg PRR+XCL)
90 !! 09/12 (G. Pigeon) modif of indoor conv. coef and implicit calculation
91 !! 10/12 (G. Pigeon) add indoor solar heat load
92 !-------------------------------------------------------------------------------
93 !
94 !* 0. DECLARATIONS
95 ! ------------
96 !
97 USE modd_surf_par, ONLY : xundef
98 USE modd_csts,ONLY : xcpd, xlvtt, xstefan, xcl
99 !
100 USE mode_thermos
101 !
102 USE modi_layer_e_budget
103 USE modi_layer_e_budget_get_coef
104 USE mode_conv_doe
105 !
106 USE yomhook ,ONLY : lhook, dr_hook
107 USE parkind1 ,ONLY : jprb
108 !
109 IMPLICIT NONE
110 !
111 !* 0.1 declarations of arguments
112 !
113 REAL, DIMENSION(:,:), INTENT(INOUT) :: pt_roof ! roof layers temperatures
114 REAL, DIMENSION(:), INTENT(INOUT) :: pqsat_roof ! q_sat(Ts)
115 REAL, DIMENSION(:), INTENT(IN) :: pti_bld ! inside building temp.
116 REAL, DIMENSION(:), INTENT(IN) :: pac_bld ! aerodynamical resistance
117  ! inside building itself
118 REAL, INTENT(IN) :: ptstep ! time step
119  CHARACTER(LEN=3), INTENT(IN) :: hbld ! Building Energy model 'DEF' or 'BEM'
120 REAL, DIMENSION(:,:), INTENT(IN) :: phc_roof ! heat capacity for roof layers
121 REAL, DIMENSION(:,:), INTENT(IN) :: ptc_roof ! thermal conductivity for roof layers
122 REAL, DIMENSION(:,:), INTENT(IN) :: pd_roof ! depth of roof layers
123 REAL, DIMENSION(:), INTENT(IN) :: pdn_roof ! roof snow fraction
124 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density
125 REAL, DIMENSION(:), INTENT(IN) :: pac_roof ! aerodynamical conductance
126 REAL, DIMENSION(:), INTENT(IN) :: pac_roof_wat ! aerodynamical conductance (for water)
127 REAL, DIMENSION(:), INTENT(IN) :: plw_rad ! atmospheric infrared radiation
128 REAL, DIMENSION(:), INTENT(IN) :: pps ! pressure at the surface
129 REAL, DIMENSION(:), INTENT(IN) :: pdelt_roof ! fraction of water
130 REAL, DIMENSION(:), INTENT(IN) :: pta ! air temperature at roof level
131 REAL, DIMENSION(:), INTENT(IN) :: pqa ! air specific humidity
132  ! at roof level
133 REAL, DIMENSION(:), INTENT(IN) :: pexna ! exner function
134 REAL, DIMENSION(:), INTENT(IN) :: pexns ! surface exner function
135 REAL, DIMENSION(:), INTENT(IN) :: pabs_sw_roof ! absorbed solar radiation
136 REAL, DIMENSION(:), INTENT(IN) :: pgsnow_roof ! roof snow conduction
137 ! ! heat fluxes at mantel
138 ! ! base
139 REAL, DIMENSION(:), INTENT(IN) :: pemis_roof ! roof emissivity
140 REAL, DIMENSION(:), INTENT(IN) :: pfrac_gr ! fraction of green roofs
141 REAL, DIMENSION(:), INTENT(IN) :: pg_greenroof_roof ! heat conduction flux
142 ! between greenroof and
143 ! structural roof
144 REAL, DIMENSION(:), INTENT(OUT) :: pflx_bld_roof ! flux from bld to roof
145 REAL, DIMENSION(:), INTENT(OUT) :: pdqs_roof ! heat storage inside the roofs
146 REAL, DIMENSION(:), INTENT(OUT) :: pabs_lw_roof ! absorbed infra-red rad.
147 REAL, DIMENSION(:), INTENT(OUT) :: phfree_roof ! sensible heat flux of the
148  ! snow free part of the roof
149 REAL, DIMENSION(:), INTENT(OUT) :: plefree_roof ! latent heat flux of the
150  ! snow free part of the roof
151 REAL, DIMENSION(:), INTENT(OUT) :: pimb_roof ! residual energy imbalance
152  ! of the roof for
153 REAL, DIMENSION(:), INTENT(IN) :: pf_floor_mass ! View factor floor-mass
154 REAL, DIMENSION(:), INTENT(IN) :: pf_floor_wall ! View factor floor-wall
155 REAL, DIMENSION(:), INTENT(IN) :: pf_floor_win ! View factor floor-window
156 REAL, DIMENSION(:), INTENT(IN) :: pf_floor_roof ! View factor floor-roof
157 REAL, DIMENSION(:), INTENT(IN) :: pradht_in ! Indoor radiant heat transfer coefficient
158  ! [W K-1 m-2]
159 REAL, DIMENSION(:), INTENT(IN) :: pts_mass ! surf. mass temp. (contact with bld air)
160 REAL, DIMENSION(:), INTENT(IN) :: pt_win2 ! indoor wind. temp.
161 REAL, DIMENSION(:), INTENT(IN) :: pts_floor ! surf. floor temp. (contact with bld air)
162 REAL, DIMENSION(:), INTENT(IN) :: pti_wall ! indoor wall temp.
163 REAL, DIMENSION(:), INTENT(OUT) :: prad_roof_wall ! rad. fluxes from roof to wall [W m-2(roof)]
164 REAL, DIMENSION(:), INTENT(OUT) :: prad_roof_win ! rad. fluxes from roof to win [W m-2(roof)]
165 REAL, DIMENSION(:), INTENT(OUT) :: prad_roof_floor! rad. fluxes from roof to floor [W m-2(roof)]
166 REAL, DIMENSION(:), INTENT(OUT) :: prad_roof_mass ! rad. fluxes from roof to mass [W m-2(roof)]
167 REAL, DIMENSION(:), INTENT(OUT) :: pconv_roof_bld ! conv. fluxes from roof to bld [W m-2(roof)]
168 REAL, DIMENSION(:), INTENT(IN) :: prr ! rain rate [kg m-2 s-1]
169 REAL, DIMENSION(:), INTENT(IN) :: pload_in_roof ! solar + int heat gain on roof W/m2 [roof]
170 !
171 !* 0.2 declarations of local variables
172 !
173 REAL :: zimpl = 1.0 ! implicit coefficient
174 REAL :: zexpl = 0.0 ! explicit coefficient
175 !
176 REAL, DIMENSION(SIZE(PTA)) :: zdf_roof ! snow-free fraction
177 REAL, DIMENSION(SIZE(PTA),SIZE(PT_ROOF,2)) :: za,& ! lower diag.
178  zb,& ! main diag.
179  zc,& ! upper diag.
180  zy ! r.h.s.
181 !
182 REAL, DIMENSION(SIZE(PTA)) :: zdqsat_roof ! dq_sat/dTs
183 REAL, DIMENSION(SIZE(PTA)) :: zrho_acf_roof ! conductance * rho
184 REAL, DIMENSION(SIZE(PTA)) :: zrho_acf_roof_wat! conductance * rho (for water)
185 REAL, DIMENSION(SIZE(PTA)) :: zmtc_o_d_roof_in ! thermal capacity times layer depth
186 REAL, DIMENSION(SIZE(PTA)) :: zts_roof ! roof surface temperature at previous time step
187 REAL, DIMENSION(SIZE(PTA)) :: ztrad_roof ! roof radiative surface temperature at intermediate time step
188 REAL, DIMENSION(SIZE(PTA)) :: ztaer_roof ! roof aerodyn. surface temperature at intermediate time step
189 REAL, DIMENSION(SIZE(PTA)) :: zheat_rr ! heat used too cool/heat the rain from the roof
190 REAL, DIMENSION(SIZE(PTA)) :: zti_roof ! temperature of internal roof layer used for radiative exchanges
191 REAL, DIMENSION(SIZE(PTA)) :: zti_roof_conv ! temperature of internal roof layer used for convective exchanges
192 REAL, DIMENSION(SIZE(PTA)) :: zchtc_in_roof ! Indoor roof convec heat transfer coefficient
193  ! [W K-1 m-2(bld)]
194 !
195 INTEGER :: jj
196 INTEGER :: iroof_layer ! number of roof layers
197 INTEGER :: jlayer ! loop counter
198 REAL(KIND=JPRB) :: zhook_handle
199 !-------------------------------------------------------------------------------
200 !
201 IF (lhook) CALL dr_hook('ROOF_LAYER_E_BUDGET',0,zhook_handle)
202 !
203 prad_roof_wall(:) = xundef
204 prad_roof_win(:) = xundef
205 prad_roof_floor(:)= xundef
206 prad_roof_mass(:) = xundef
207 pconv_roof_bld(:) = xundef
208 !
209 ! *Convection heat transfer coefficients [W m-2 K-1] from EP Engineering Reference
210 !
211 iroof_layer = SIZE(pt_roof,2)
212 !
213 zchtc_in_roof(:) = chtc_down_doe(pt_roof(:,iroof_layer), pti_bld(:))
214 DO jj=1,SIZE(zchtc_in_roof)
215  zchtc_in_roof(jj) = max(1., zchtc_in_roof(jj))
216 ENDDO
217 !
218  CALL layer_e_budget_get_coef( pt_roof, ptstep, zimpl, phc_roof, ptc_roof, pd_roof, &
219  za, zb, zc, zy )
220 !
221 !
222 DO jj=1,SIZE(pdn_roof)
223  !
224  zdf_roof(jj) = 1. - pdn_roof(jj)
225  !
226  zts_roof(jj) = pt_roof(jj,1)
227  zti_roof(jj) = pt_roof(jj,iroof_layer)
228  !
229  !* 2. Roof Ts coefficients
230  ! --------------------
231  !
232  zrho_acf_roof(jj) = prhoa(jj) * pac_roof(jj)
233  zrho_acf_roof_wat(jj) = prhoa(jj) * pac_roof_wat(jj)
234  !
235  IF (hbld .EQ. 'DEF') THEN
236  zmtc_o_d_roof_in(jj) = 2. * ptc_roof(jj,iroof_layer) / pd_roof(jj,iroof_layer)
237  zmtc_o_d_roof_in(jj) = 1./( 1./zmtc_o_d_roof_in(jj) + 1./(xcpd*prhoa(jj)*pac_bld(jj)) )
238  ENDIF
239  !
240 ENDDO
241 !
242 !* 2.1 dqsat/dTs, and humidity for roofs
243 ! ---------------------------------
244 !
245 zdqsat_roof(:) = dqsat(zts_roof(:),pps(:),pqsat_roof(:))
246 !
247 !* 2.2 coefficients
248 ! ------------
249 !
250 DO jj=1,SIZE(pt_roof,1)
251  !
252  zb(jj,1) = zb(jj,1) + zdf_roof(jj) * (1.-pfrac_gr(jj)) * ( &
253  zimpl * ( xcpd/pexns(jj) * zrho_acf_roof(jj) &
254  + xlvtt * zrho_acf_roof_wat(jj) * pdelt_roof(jj) * zdqsat_roof(jj) &
255  + xstefan * pemis_roof(jj) * 4.*zts_roof(jj)**3 &
256  + prr(jj) * xcl )) !! heating/cooling of rain
257  !
258  zy(jj,1) = zy(jj,1) + (1.-pfrac_gr(jj)) &
259  * (pdn_roof(jj)*pgsnow_roof(jj) + zdf_roof(jj) * ( pabs_sw_roof(jj) &
260  + xcpd * zrho_acf_roof(jj) * ( pta(jj)/pexna(jj) - zexpl*zts_roof(jj)/pexns(jj)) &
261  + pemis_roof(jj)*plw_rad(jj) &
262  + xlvtt * zrho_acf_roof_wat(jj) * pdelt_roof(jj) &
263  * ( pqa(jj) - pqsat_roof(jj) + zimpl * zdqsat_roof(jj) * zts_roof(jj) ) &
264  + xstefan * pemis_roof(jj) * zts_roof(jj)**4 * ( 3.*zimpl-zexpl ) &
265  + prr(jj) * xcl * (pta(jj) - zexpl * zts_roof(jj)) ) ) & !! heating/cooling of rain
266  + pfrac_gr(jj)*pg_greenroof_roof(jj)
267  !
268  IF (hbld=="DEF") THEN
269  !
270  zb(jj,iroof_layer) = zb(jj,iroof_layer) + zimpl * zmtc_o_d_roof_in(jj)
271  !
272  zy(jj,iroof_layer) = zy(jj,iroof_layer) &
273  + zmtc_o_d_roof_in(jj) * pti_bld(jj) &
274  - zexpl * zmtc_o_d_roof_in(jj) * pt_roof(jj,iroof_layer)
275  !
276  ELSEIF (hbld=="BEM") THEN
277  !
278  zb(jj, iroof_layer) = zb(jj,iroof_layer) + zimpl * &
279  (zchtc_in_roof(jj) * 4./3. + pradht_in(jj) * &
280  (pf_floor_mass(jj) + pf_floor_win(jj) + &
281  pf_floor_wall(jj) + pf_floor_roof(jj) ))
282 
283  zy(jj,iroof_layer) = zy(jj,iroof_layer) + &
284  zchtc_in_roof(jj) * (pti_bld(jj) - 1./3. * pt_roof(jj, iroof_layer)*(4*zexpl - 1.)) + &
285  pradht_in(jj) * ( &
286  pf_floor_mass(jj) * (pts_mass(jj) - zexpl * pt_roof(jj,iroof_layer)) + &
287  pf_floor_win(jj) * (pt_win2(jj) - zexpl * pt_roof(jj,iroof_layer)) + &
288  pf_floor_wall(jj) * (pti_wall(jj) - zexpl * pt_roof(jj,iroof_layer)) + &
289  pf_floor_roof(jj) * (pts_floor(jj)- zexpl * pt_roof(jj,iroof_layer)) ) + &
290  pload_in_roof(jj)
291  !
292  ENDIF
293  !
294 ENDDO
295 !
296 !
297  CALL layer_e_budget( pt_roof, ptstep, zimpl, phc_roof, ptc_roof, pd_roof, &
298  za, zb, zc, zy, pdqs_roof )
299 !
300 !-------------------------------------------------------------------------------
301 !
302 !* diagnostic: computation of flux between bld and internal roof layer
303 DO jj=1,SIZE(pt_roof,1)
304  !
305  zti_roof_conv(jj) = 4./3. * zimpl * pt_roof(jj, iroof_layer) + 1./3. * zti_roof(jj) * (4*zexpl -1.)
306  zti_roof(jj) = zexpl * zti_roof(jj) + zimpl * pt_roof(jj, iroof_layer)
307  SELECT CASE(hbld)
308  CASE("DEF")
309  pflx_bld_roof(jj) = zmtc_o_d_roof_in(jj) * (pti_bld(jj) - zti_roof(jj))
310  CASE("BEM")
311  prad_roof_wall(jj) = pradht_in(jj) * (zti_roof(jj) - pti_wall(jj))
312  prad_roof_win(jj) = pradht_in(jj) * (zti_roof(jj) - pt_win2(jj))
313  prad_roof_floor(jj)= pradht_in(jj) * (zti_roof(jj) - pts_floor(jj))
314  prad_roof_mass(jj) = pradht_in(jj) * (zti_roof(jj) - pts_mass(jj))
315  pconv_roof_bld(jj) = zchtc_in_roof(jj) * (zti_roof_conv(jj) - pti_bld(jj))
316  pflx_bld_roof(jj) = -(prad_roof_wall(jj) + prad_roof_win(jj) + prad_roof_floor(jj) + prad_roof_mass(jj) + pconv_roof_bld(jj))
317  ENDSELECT
318 
319  !
320  !* 8. Infra-red radiation absorbed by roofs
321  ! -------------------------------------
322  !
323  !* radiative surface temperature at intermediate time step
324  ztrad_roof(jj) = ( zts_roof(jj)**4 + &
325  4.*zimpl*zts_roof(jj)**3 * (pt_roof(jj,1) - zts_roof(jj)) )**0.25
326  !
327  !* absorbed LW
328  pabs_lw_roof(jj) = pemis_roof(jj) * (plw_rad(jj) - xstefan * ztrad_roof(jj)** 4)
329  !
330  !* 9. Sensible heat flux between snow free roof and air
331  ! -------------------------------------------------
332  !
333  !* aerodynamic surface temperature at the intermediate time step
334  ztaer_roof(jj) = zexpl * zts_roof(jj) + zimpl * pt_roof(jj,1)
335  phfree_roof(jj) = zrho_acf_roof(jj) * xcpd * &
336  ( ztaer_roof(jj)/pexns(jj) - pta(jj)/pexna(jj) )
337  !
338  zheat_rr(jj) = prr(jj) * xcl * (ztaer_roof(jj) - pta(jj))
339  !
340  !* 10. Latent heat flux between snow free roof and air
341  ! -------------------------------------------------
342  !
343  plefree_roof(jj) = zrho_acf_roof_wat(jj) * xlvtt * pdelt_roof(jj) * &
344  ( pqsat_roof(jj) - pqa(jj) + &
345  zimpl * zdqsat_roof(jj) * (pt_roof(jj,1) - zts_roof(jj)) )
346  !
347  ! 13. Energy imbalance for verification
348  ! ---------------------------------
349  pimb_roof(jj) = pabs_sw_roof(jj) + pabs_lw_roof(jj) - pdqs_roof(jj) &
350  - zdf_roof(jj) * ( phfree_roof(jj) + plefree_roof(jj)) &
351  - pdn_roof(jj) * pgsnow_roof(jj) + pflx_bld_roof(jj)
352  !
353 ENDDO
354 !
355 !* 11. New saturated specified humidity near the roof surface
356 ! ------------------------------------------------------
357 !
358 pqsat_roof(:) = qsat(pt_roof(:,1),pps(:))
359 !
360 !-------------------------------------------------------------------------
361 IF (lhook) CALL dr_hook('ROOF_LAYER_E_BUDGET',1,zhook_handle)
362 !-------------------------------------------------------------------------
363 !
364 END SUBROUTINE roof_layer_e_budget
real function, dimension(size(pts)) chtc_down_doe(PTS, PTA)
subroutine layer_e_budget(PT, PTSTEP, PIMPL, PHC, PTC, PD, PA, PB, PC, PY, PDQS)
subroutine roof_layer_e_budget(PT_ROOF, PQSAT_ROOF, PTI_BLD, PAC_BLD, PTSTEP, HBLD, PHC_ROOF, PTC_ROOF, PD_ROOF, PDN_ROOF, PRHOA, PAC_ROOF, PAC_ROOF_WAT, PLW_RAD, PPS, PDELT_ROOF, PTA, PQA, PEXNA, PEXNS, PABS_SW_ROOF, PGSNOW_ROOF, PEMIS_ROOF, PFLX_BLD_ROOF, PDQS_ROOF, PABS_LW_ROOF, PHFREE_ROOF, PLEFREE_ROOF, PIMB_ROOF, PFRAC_GR, PG_GREENROOF_ROOF, PF_FLOOR_MASS, PF_FLOOR_WALL, PF_FLOOR_WIN, PF_FLOOR_ROOF, PRADHT_IN, PTS_MASS, PT_WIN2, PTS_FLOOR, PTI_WALL, PRAD_ROOF_WALL, PRAD_ROOF_WIN, PRAD_ROOF_FLOOR, PRAD_ROOF_MASS, PCONV_ROOF_BLD, PRR, PLOAD_IN_ROOF)
subroutine layer_e_budget_get_coef(PT, PTSTEP, PIMPL, PHC, PTC, PD, PA, PB, PC, PY)