SURFEX v8.1
General documentation of Surfex
isba_snow_agr.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 isba_snow_agr(KK, PK, PEK, DMK, DK, DEK, &
7  OMEB, OMEB_LITTER, PEXNS, PEXNA, PTA, PQA, &
8  PZREF, PUREF, PDIRCOSZW, PVMOD, PRR, PSR, &
9  PEMIS, PALB, PUSTAR, PLES3L, PLEL3L, &
10  PEVAP3L, PQS3L, PALB3L, PGSFCSNOW, &
11  PZGRNDFLUX, PFLSN_COR, PEMIST, PPALPHAN )
12 ! ##########################################################################
13 !
14 !
15 !!**** *ISBA_SNOW_AGR* aggregates snow free and snow fluxes
16 !!
17 !! PURPOSE
18 !! -------
19 !
20 !!** METHOD
21 !! ------
22 !
23 !! EXTERNAL
24 !! --------
25 !!
26 !! IMPLICIT ARGUMENTS
27 !! ------------------
28 !!
29 !!
30 !! REFERENCE
31 !! ---------
32 !!
33 !! Noilhan and Planton (1989)
34 !!
35 !! AUTHOR
36 !! ------
37 !! V. Masson * Meteo-France *
38 !! (following A. Boone)
39 !!
40 !! MODIFICATIONS
41 !! -------------
42 !! Original 10/03/95
43 !! B. Decharme 01/2009 Floodplains
44 !! B. Decharme 01/2010 Effective surface temperature (for diag)
45 !! B. Decharme 09/2012 Bug total sublimation flux: no DEK%XLESL
46 !! B. Decharme 04/2013 Bug wrong radiative temperature
47 !! Sublimation diag flux
48 !! Qs for 3l or crocus (needed for coupling with atm)
49 !! A. Boone 11/2014 MEB
50 !-------------------------------------------------------------------------------
51 !
52 !* 0. DECLARATIONS
53 ! ------------
55 USE modd_diag_n, ONLY : diag_t
58 !
59 USE modd_surf_par, ONLY : xundef
60 !
61 USE yomhook ,ONLY : lhook, dr_hook
62 USE parkind1 ,ONLY : jprb
63 !
64 IMPLICIT NONE
65 !
66 !* 0.1 declarations of arguments
67 ! -------------------------
68 !
69 !
70 !* general variables
71 ! -----------------
72 !
73 TYPE(isba_k_t), INTENT(INOUT) :: KK
74 TYPE(isba_p_t), INTENT(INOUT) :: PK
75 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
76 TYPE(diag_t), INTENT(INOUT) :: DK
77 TYPE(diag_evap_isba_t), INTENT(INOUT) :: DEK
78 TYPE(diag_misc_isba_t), INTENT(INOUT) :: DMK
79 !
80 LOGICAL, INTENT(IN) :: OMEB ! True = patch with multi-energy balance
81 ! ! False = patch with classical ISBA
82 LOGICAL, INTENT(IN) :: OMEB_LITTER !True = litter option activated
83 ! ! over the ground
84 !
85 !* surface and atmospheric parameters
86 ! ----------------------------------
87 !
88 REAL, DIMENSION(:), INTENT(IN) :: PEXNS ! Exner function at the surface
89 REAL, DIMENSION(:), INTENT(IN) :: PEXNA ! Exner function
90 REAL, DIMENSION(:), INTENT(IN) :: PTA ! air temperature
91 REAL, DIMENSION(:), INTENT(IN) :: PQA ! air specific humidity
92 REAL, DIMENSION(:), INTENT(IN) :: PZREF ! reference height of the first atmospheric level
93 REAL, DIMENSION(:), INTENT(IN) :: PUREF ! reference height of the wind
94 REAL, DIMENSION(:), INTENT(IN) :: PDIRCOSZW ! Cosinus of the angle between the normal to the surface and the vertical
95 REAL, DIMENSION(:), INTENT(IN) :: PVMOD ! module of the horizontal wind
96 REAL, DIMENSION(:), INTENT(IN) :: PRR ! Rain rate (in kg/m2/s)
97 REAL, DIMENSION(:), INTENT(IN) :: PSR ! Snow rate (in kg/m2/s)
98 !
99 !* surface parameters
100 ! ------------------
101 !
102 REAL, DIMENSION(:), INTENT(IN) :: PALB ! albedo
103 REAL, DIMENSION(:), INTENT(IN) :: PEMIS ! emissivity
104 ! 'D95' : represents aggregated (snow + flood + snow-flood-free) albedo and emissivity
105 ! '3-L' : represents flood + snow-flood-free albedo and emissivity
106 ! 'MEB+3-L' : represents aggregated (snow + flood + snow-flood-free) albedo and emissivity
107 !
108 !
109 !* snow fractions
110 ! --------------
111 !
112 REAL, DIMENSION(:), INTENT(IN) :: PPALPHAN ! fraction of the the explicit veg.
113 ! ! canopy buried by snow
114 !
115 !* ISBA-SNOW3L variables/parameters:
116 ! ---------------------------------
117 !
118 ! Prognostic variables:
119 !
120 REAL, DIMENSION(:), INTENT(IN) :: PALB3L ! Snow albedo
121 REAL, DIMENSION(:), INTENT(IN) :: PQS3L ! Surface humidity
122 !
123 ! Diagnostics:
124 !
125 REAL, DIMENSION(:), INTENT(IN) :: PZGRNDFLUX ! snow/soil-biomass interface flux (W/m2)
126 REAL, DIMENSION(:), INTENT(IN) :: PFLSN_COR ! snow/soil-biomass correction flux (W/m2)
127 !
128 REAL, DIMENSION(:), INTENT(INOUT) :: PGSFCSNOW ! heat flux from snow sfc to sub sfc layers (W/m2)
129 REAL, DIMENSION(:), INTENT(IN) :: PLES3L ! sublimation from ISBA-ES(3L)
130 REAL, DIMENSION(:), INTENT(IN) :: PLEL3L ! evaporation heat flux of water in the snow (W/m2)
131 REAL, DIMENSION(:), INTENT(INOUT) :: PEVAP3L ! evaporation flux over snow from ISBA-ES (kg/m2/s)
132 !
133 !* diagnostic variables
134 ! --------------------
135 !
136 REAL, DIMENSION(:), INTENT(INOUT) :: PEMIST ! total surface emissivity
137 !
138 !* surface fluxes
139 ! --------------
140 !
141 REAL, DIMENSION(:), INTENT(INOUT) :: PUSTAR ! friction velocity
142 !
143 !* 0.2 declarations of local variables
144 !
145 REAL, DIMENSION(SIZE(PTA)) :: ZWORK
146 !
147 REAL(KIND=JPRB) :: ZHOOK_HANDLE
148 !
149 !-------------------------------------------------------------------------------
150 !
151 IF (lhook) CALL dr_hook('ISBA_SNOW_AGR',0,zhook_handle)
152 !
153 zwork(:) = 0.
154 !
155 IF(omeb)THEN
156  !
157  ! Snow free (ground-based snow) diagnostics: canopy and ground blended (W m-2):
158  ! NOTE that the effects of snow cover *fraction* are implicitly *included* in these fluxes
159  ! so do NOT multiply by snow fraction.
160  !
161  dek%XRN_SN_FR (:) = dek%XSWNET_V(:) + dek%XSWNET_G(:) + dek%XLWNET_V(:) + dek%XLWNET_G(:)
162  dek%XH_SN_FR (:) = dek%XH_CV(:) + dek%XH_GN(:)
163  IF (omeb_litter) THEN
164  dek%XLEG_SN_FR (:) = dek%XLELITTER (:)
165  dek%XLEGI_SN_FR(:) = dek%XLELITTERI(:)
166  dek%XLEG (:) = dek%XLELITTER (:)
167  dek%XLEGI(:) = dek%XLELITTERI(:)
168  ELSE
169  dek%XLEG_SN_FR (:) = dek%XLEG (:)
170  dek%XLEGI_SN_FR(:) = dek%XLEGI(:)
171  ENDIF
172 
173  dek%XLEV_SN_FR (:) = dek%XLEV_CV (:)
174  dek%XLETR_SN_FR(:) = dek%XLETR_CV(:)
175  ! NOTE for now, this is same as total Ustar (includes snow)
176  dek%XUSTAR_SN_FR(:) = pustar(:)
177  ! LER does not include intercepted snow sublimation
178  dek%XLER_SN_FR (:) = dek%XLEV_CV(:) - dek%XLETR_CV(:)
179 
180  dek%XLEI_SN_FR (:) = dek%XLEGI(:) + dek%XLEI_FLOOD(:) + dek%XLES(:) + dek%XLES_CV(:)
181  ! LE includes intercepted snow sublimation
182  dek%XLE_SN_FR (:) = dek%XLEG_SN_FR(:) + dek%XLEGI_SN_FR(:) + dek%XLEV_SN_FR(:) + &
183  dek%XLES_CV(:) + dek%XLE_FLOOD(:) + dek%XLEI_FLOOD(:)
184  dek%XGFLUX_SN_FR(:) = dek%XRN_SN_FR(:) - dek%XH_SN_FR(:) - dek%XLE_SN_FR(:)
185  !
186  pemist(:) = pemis(:)
187  !
188  ! Effective surface temperature (for diag): for MEB:
189 
190  zwork(:) = ppalphan(:)*pek%XPSN(:)
191  dk%XTS(:) = (1.0 - zwork(:))*pek%XTC(:) + zwork(:)*dmk%XSNOWTEMP(:,1)
192  !
193  ! Total heat FLUX into snow/soil/vegetation surface:
194  !
195  dk%XGFLUX(:) = dk%XRN(:) - dk%XH(:) - pek%XLE(:) + dmk%XHPSNOW(:)
196  !
197 ELSE
198 !
199 ! * 2. Using an explicit snow scheme option with composite soil/veg ISBA:
200 ! ------------------------------------------------------------------
201 !
202  IF(pek%TSNOW%SCHEME == '3-L' .OR. pek%TSNOW%SCHEME == 'CRO')THEN
203 !
204 ! Save fluxes from Force-Restore snow/explicit snow-free
205 ! portion of grid box (vegetation/soil):
206 !
207  dek%XLEG_SN_FR (:) = dek%XLEG (:)
208  dek%XLEGI_SN_FR (:) = dek%XLEGI(:)
209  dek%XLEV_SN_FR (:) = dek%XLEV (:)
210  dek%XLETR_SN_FR (:) = dek%XLETR(:)
211  dek%XLER_SN_FR (:) = dek%XLER (:)
212  dek%XRN_SN_FR (:) = dk%XRN (:)
213  dek%XH_SN_FR (:) = dk%XH (:)
214  dek%XUSTAR_SN_FR(:) = pustar(:)
215 
216  dek%XLE_SN_FR (:) = pek%XLE(:)
217  dek%XGFLUX_SN_FR(:) = dk%XGFLUX(:)
218 !
219  dek%XLEI_SN_FR (:)= dek%XLEGI(:) + dek%XLEI_FLOOD(:) + dek%XLES(:)
220 !
221 ! Effective surface temperature (for diag):
222 !
223  dk%XTS(:) = (1.-pek%XPSN(:))*pek%XTG(:,1)+pek%XPSN(:)*dmk%XSNOWTEMP(:,1)
224 !
225 ! Effective surface radiating temperature:
226 !
227  dk%XALBT (:) = palb(:)*(1.-pek%XPSN(:)) + pek%XPSN(:)*palb3l(:)
228  pemist(:) = pemis(:)*(1.-pek%XPSN(:)) + pek%XPSN(:)*pek%TSNOW%EMIS(:)
229 !
230  dk%XTSRAD(:) = ( ((1.-pek%XPSN(:))*pemis(:)*pek%XTG(:,1)**4 + &
231  pek%XPSN(:) *pek%TSNOW%EMIS(:)*dmk%XSNOWTEMP(:,1)**4 &
232  )/pemist(:) )**(0.25)
233 !
234 ! Calculate actual fluxes from snow-free natural
235 ! portion of surface: NET flux from surface is the sum of
236 ! fluxes from snow free and snow covered portions
237 ! of natural portion of grid box when *ISBA-ES* in force.
238 ! when NOT in use, then these fluxes equal those above.
239 !
240  dk%XRN (:) = (1.-pek%XPSN(:)) * dk%XRN(:) + pek%XPSN(:) * dmk%XRNSNOW(:)
241  dk%XH (:) = (1.-pek%XPSN(:)) * dk%XH (:) + pek%XPSN(:) * dmk%XHSNOW(:)
242 !
243  dek%XLEG (:) = (1.-pek%XPSNG(:)-kk%XFFG(:)) * dek%XLEG(:)
244  dek%XLEGI(:) = (1.-pek%XPSNG(:)-kk%XFFG(:)) * dek%XLEGI(:)
245  dek%XLEV (:) = (1.-pek%XPSNV(:)-kk%XFFV(:)) * dek%XLEV(:)
246  dek%XLETR(:) = (1.-pek%XPSNV(:)-kk%XFFV(:)) * dek%XLETR(:)
247  dek%XLER (:) = (1.-pek%XPSNV(:)-kk%XFFV(:)) * dek%XLER(:)
248 !
249 ! Total evapotranspiration flux (kg/m2/s):
250 !
251  dk%XEVAP(:) = (dek%XLEV(:) + dek%XLEG(:))/pk%XLVTT(:) + dek%XLEGI(:)/pk%XLSTT(:) + &
252  dek%XLE_FLOOD(:)/pk%XLVTT(:) + dek%XLEI_FLOOD(:)/pk%XLSTT(:) + &
253  pek%XPSN(:) * pevap3l(:)
254 !
255 ! ISBA-ES/SNOW3L fluxes:
256 !
257  dek%XLES (:) = pek%XPSN(:) * ples3l(:)
258  dek%XLESL (:) = pek%XPSN(:) * plel3l(:)
259  dmk%XRNSNOW (:) = pek%XPSN(:) * dmk%XRNSNOW (:)
260  dmk%XHSNOW (:) = pek%XPSN(:) * dmk%XHSNOW (:)
261  dmk%XGFLUXSNOW(:) = pek%XPSN(:) * dmk%XGFLUXSNOW(:)
262  dmk%XSNOWHMASS(:) = pek%XPSN(:) * dmk%XSNOWHMASS(:) ! (J m-2)
263  dmk%XHPSNOW (:) = pek%XPSN(:) * dmk%XHPSNOW (:)
264  pgsfcsnow(:) = pek%XPSN(:) * pgsfcsnow(:)
265  pevap3l(:) = pek%XPSN(:) * pevap3l(:)
266 !
267 ! Total heat flux between snow and soil
268 !
269  dmk%XGRNDFLUX(:) = pek%XPSN(:) * (pzgrndflux(:)+pflsn_cor(:))
270  dek%XMELTADV(:) = pek%XPSN(:) * dek%XMELTADV(:)
271 !
272 ! Total evaporative flux (W/m2) :
273 !
274  pek%XLE(:) = dek%XLEG(:) + dek%XLEV(:) + dek%XLES(:) + dek%XLESL(:) + &
275  dek%XLEGI(:) + dek%XLE_FLOOD(:) + dek%XLEI_FLOOD(:)
276 !
277 ! Total sublimation flux (W/m2) :
278 !
279  dk%XLEI (:) = dek%XLES(:) + dek%XLEGI(:) + dek%XLEI_FLOOD(:)
280 !
281 ! Total sublimation flux (kg/m2/s):
282 !
283  dk%XSUBL (:) = dk%XLEI(:)/pk%XLSTT(:)
284 !
285 ! Total FLUX into snow/soil/vegetation surface:
286 !
287  dk%XGFLUX(:) = dk%XRN(:) - dk%XH(:) - pek%XLE(:) + dmk%XHPSNOW(:)
288 !
289 ! surface humidity:
290 !
291  dk%XQS (:) = (1.-pek%XPSN(:)) * dk%XQS(:) + pek%XPSN(:) * pqs3l(:)
292 !
293 ! near-surface humidity :
294 !
295  dk%XHU (:) = (1.-pek%XPSN(:)) * dk%XHU(:) + pek%XPSN(:)
296 !
297 ! Momentum fluxes:
298 !
299  pustar(:) = sqrt( (1.-pek%XPSN(:)) * pustar(:)**2 + &
300  pek%XPSN(:) * dmk%XUSTARSNOW(:)**2 )
301 !
302 ! Richardson number and Drag coeff:
303 !
304  CALL comput_ri_drag
305 !
306  ELSE
307 !
308  dk%XTS (:) = pek%XTG(:,1)
309  dk%XTSRAD (:) = pek%XTG(:,1)
310  dk%XALBT (:) = palb(:)
311  pemist(:) = pemis(:)
312 !
313 ! Total sublimation flux (W/m2) :
314  dk%XLEI (:) = dek%XLES(:) + dek%XLEGI(:) + dek%XLEI_FLOOD(:)
315 !
316 ! Total sublimation flux (kg/m2/s):
317  dk%XSUBL (:) = dk%XLEI(:)/pk%XLSTT(:)
318 !
319  ENDIF
320 !
321 ENDIF
322 !
323 IF (lhook) CALL dr_hook('ISBA_SNOW_AGR',1,zhook_handle)
324 !
325 !-------------------------------------------------------------------------------
326 CONTAINS
327 !-------------------------------------------------------------------------------
328 !
329 SUBROUTINE comput_ri_drag
330 !
333 !
334 USE modi_surface_ri
335 USE modi_surface_aero_cond
336 USE modi_surface_cd
337 USE modi_surface_cdch_1darp
338 USE modi_wind_threshold
339 !
340 !* 0.2 declarations of local variables
341 !
342 REAL, DIMENSION(SIZE(PTA)) :: ZFP, ZRRCOR, ZVMOD, ZAC, ZRA
343 !
344 REAL(KIND=JPRB) :: ZHOOK_HANDLE
345 !
346 !-------------------------------------------------------------------------------
347 !
348 IF (lhook) CALL dr_hook('ISBA_SNOW_AGR:COMPUT_RI_DRAG',0,zhook_handle)
349 !
350 ! * Richardson number
351 !
352  CALL surface_ri(dk%XTS, dk%XQS, pexns, pexna, pta, pqa, &
353  pzref, puref, pdircoszw, pvmod, dk%XRI)
354 !
355 ! * Wind check
356 !
357 zvmod = wind_threshold(pvmod,puref)
358 !
359 ! * Drag coefficient for heat and momentum
360 !
361 IF (ldrag_coef_arp) THEN
362  CALL surface_cdch_1darp(pzref, dk%XZ0EFF, dk%XZ0H, zvmod, pta, pek%XTG(:,1), &
363  pqa, dk%XQS, dk%XCD, dk%XCDN, dk%XCH )
364 ELSE
365  CALL surface_aero_cond(dk%XRI, pzref, puref, zvmod, dk%XZ0, dk%XZ0H, zac, zra, dk%XCH)
366  CALL surface_cd(dk%XRI, pzref, puref, dk%XZ0EFF, dk%XZ0H, dk%XCD, dk%XCDN)
367 ENDIF
368 !
369 IF (lrrgust_arp) THEN
370  zfp(:)=max(0.0,prr(:)+psr(:))
371  zrrcor(:)=sqrt(1.0+((((zfp(:)/(zfp(:)+xrrscale))**xrrgamma)*xutilgust)**2) &
372  /(dk%XCD(:)*zvmod(:)**2))
373  dk%XCD = dk%XCD * zrrcor
374  dk%XCH = dk%XCH * zrrcor
375  dk%XCDN = dk%XCDN * zrrcor
376 ENDIF
377 !
378 IF (lhook) CALL dr_hook('ISBA_SNOW_AGR:COMPUT_RI_DRAG',1,zhook_handle)
379 !
380 END SUBROUTINE comput_ri_drag
381 !
382 !-------------------------------------------------------------------------------
383 !
384 END SUBROUTINE isba_snow_agr
real function, dimension(size(pwind)) wind_threshold(PWIND, PUREF)
subroutine surface_ri(PTG, PQS, PEXNS, PEXNA, PTA, PQA, PZREF, PUREF, PDIRCOSZW, PVMOD, PRI)
Definition: surface_ri.F90:8
logical lrrgust_arp
subroutine comput_ri_drag
real, parameter xundef
subroutine surface_aero_cond(PRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, PAC, PRA, PCH)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine surface_cd(PRI, PZREF, PUREF, PZ0EFF, PZ0H, PCD, PCDN)
Definition: surface_cd.F90:8
logical lhook
Definition: yomhook.F90:15
subroutine surface_cdch_1darp(PZREF, PZ0EFF, PZ0H, PVMOD, PTA, PTG, PQA, PQS, PCD, PCDN, PCH)
logical ldrag_coef_arp
subroutine isba_snow_agr(KK, PK, PEK, DMK, DK, DEK, OMEB, OMEB_LITTER, PEXNS, PEXNA, PTA, PQA