SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_surf_snow_frac.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 ! ##########################
7 ! ##########################
8 !
9 !!**** *MODE_SURF_SNOW_FRAC* - module for routines to compute snow fraction
10 !! for surface schemes
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 ! The purpose of this routine is to store here all routines to compute
16 ! snow fractions for the TEB scheme. This allows to insure a coherent
17 ! way in retrieving snow fraction or snow contents.
18 !
19 !!
20 !!** IMPLICIT ARGUMENTS
21 !! ------------------
22 !! NONE
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !! V. Masson * Meteo France *
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original 15/03/99
35 !! (B.Decharme) 12/03/08 Make sure PPSNV <= PPSNG
36 !--------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 !
42 !-------------------------------------------------------------------------------
43 !
44 !
45 USE yomhook ,ONLY : lhook, dr_hook
46 USE parkind1 ,ONLY : jprb
47 !
48  CONTAINS
49 !-------------------------------------------------------------------------------
50 !
51 ! ###############################################
52  FUNCTION snow_frac_ground(PWSNOW) RESULT(PPSNG)
53 ! ###############################################
54 !
55 USE modd_snow_par, ONLY : xwcrn
56 IMPLICIT NONE
57 !
58 REAL, DIMENSION(:), INTENT(IN) :: pwsnow ! snow amount over natural areas (kg/m2)
59 REAL, DIMENSION(SIZE(PWSNOW)) :: ppsng ! snow fraction over bare ground
60 REAL(KIND=JPRB) :: zhook_handle
61 !
62 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_GROUND',0,zhook_handle)
63 ppsng(:) = pwsnow(:) / (pwsnow(:)+xwcrn) ! fraction of ground covered
64 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_GROUND',1,zhook_handle)
65 !
66 END FUNCTION snow_frac_ground
67 !
68 !-------------------------------------------------------------------------------
69 !
70 ! ##########################################################
71  FUNCTION wsnow_from_snow_frac_ground(PPSNG) RESULT(PWSNOW)
72 ! ##########################################################
73 !
74 USE modd_snow_par, ONLY : xwcrn
75 IMPLICIT NONE
76 !
77 REAL, DIMENSION(:), INTENT(IN) :: ppsng ! snow fraction over bare ground
78 REAL, DIMENSION(SIZE(PPSNG)) :: pwsnow ! snow amount over natural areas (kg/m2)
79 REAL(KIND=JPRB) :: zhook_handle
80 !
81 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:WSNOW_FROM_SNOW_FRAC_GROUND',0,zhook_handle)
82 pwsnow(:) = xwcrn * ppsng(:) / (1. - ppsng(:))
83 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:WSNOW_FROM_SNOW_FRAC_GROUND',1,zhook_handle)
84 !
85 END FUNCTION wsnow_from_snow_frac_ground
86 !-------------------------------------------------------------------------------
87 !
88 ! #########################################################
89  FUNCTION snow_frac_veg(PPSNG,PWSNOW,PZ0VEG,PRHOS) RESULT(PPSNV)
90 ! #########################################################
91 !
92 USE modd_snow_par, ONLY : xwsnv
93 IMPLICIT NONE
94 !
95 REAL, DIMENSION(:), INTENT(IN) :: ppsng ! snow fraction over bare ground
96 REAL, DIMENSION(:), INTENT(IN) :: pwsnow ! snow amount over natural areas (kg/m2)
97 REAL, DIMENSION(:), INTENT(IN) :: pz0veg ! vegetation roughness length for momentum
98 REAL, DIMENSION(:), INTENT(IN) :: prhos ! snow density (kg/m3)
99 REAL, DIMENSION(SIZE(PWSNOW)) :: ppsnv ! snow fraction over vegetation
100 REAL(KIND=JPRB) :: zhook_handle
101 !
102 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_VEG',0,zhook_handle)
103 ppsnv(:) = pwsnow(:) / (pwsnow(:)+prhos(:)*xwsnv*pz0veg(:))
104 ! Make sure PPSNV <= PPSNG
105 ppsnv(:) = min(ppsnv(:),ppsng(:))
106 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_VEG',1,zhook_handle)
107 !
108 END FUNCTION snow_frac_veg
109 !
110 !-------------------------------------------------------------------------------
111 ! **********************************************************
112  FUNCTION snow_frac_veg_a(P_PSNG,P_LAI,P_SNOWALB) RESULT(PPSNV)
113 ! **********************************************************
114 !
115 IMPLICIT NONE
116 !
117 REAL, DIMENSION(:), INTENT(IN) :: p_lai ! leaf area index
118 REAL, DIMENSION(:), INTENT(IN) :: p_snowalb ! snow albedo
119 REAL, DIMENSION(:), INTENT(IN) :: p_psng ! snow fraction over bare ground
120 REAL, DIMENSION(SIZE(P_LAI)) :: ppsnv ! snow fraction over vegetation
121 !
122 !
123 !
124 ! Definition of local variables
125 REAL, DIMENSION(SIZE(P_LAI)) :: flai ! snow fraction over vegetation
126 REAL rlaimax,rlai,a1,a2
127 REAL(KIND=JPRB) :: zhook_handle
128 !
129 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_VEG_A',0,zhook_handle)
130 rlaimax=7.
131 rlai=3.
132 a1=0.87
133 a2=0.84
134 flai(:)=1.
135 WHERE(p_lai(:)>rlai)
136  flai(:)=1.-(p_lai(:)/rlaimax)*(max(0.0,(a1-max(a2,p_snowalb(:))))/(a1-a2))
137 END WHERE
138 ppsnv(:)=p_psng(:)*flai(:)
139 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_VEG_A',1,zhook_handle)
140 !
141 END FUNCTION snow_frac_veg_a
142 
143 !-------------------------------------------------------------------------------
144 !
145 ! ############################################################
146  FUNCTION snow_frac_nat(PWSNOW,PPSNG,PPSNV,PVEG) RESULT(PPSN)
147 ! ############################################################
148 !
149 IMPLICIT NONE
150 !
151 REAL, DIMENSION(:), INTENT(IN) :: pwsnow ! snow amount over natural areas (kg/m2)
152 REAL, DIMENSION(:), INTENT(IN) :: ppsng ! snow fraction over bare ground
153 REAL, DIMENSION(:), INTENT(IN) :: ppsnv ! snow fraction over vegetation
154 REAL, DIMENSION(:), INTENT(IN) :: pveg ! vegetation fraction
155 REAL, DIMENSION(SIZE(PWSNOW)) :: ppsn ! snow fraction over natural areas
156 REAL(KIND=JPRB) :: zhook_handle
157 !
158 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_NAT',0,zhook_handle)
159 ppsn(:) = (1-pveg(:))*ppsng(:) + pveg(:)*ppsnv(:)
160 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_NAT',1,zhook_handle)
161 !
162 END FUNCTION snow_frac_nat
163 !
164 !-------------------------------------------------------------------------------
165 !
166 !-------------------------------------------------------------------------------
167 !
168 ! ##############################################################
169  SUBROUTINE snow_frac_road(PWSNOW_ROAD,OSNOW,PDN_ROAD,PDF_ROAD)
170 ! ##############################################################
171 !
172 USE modd_snow_par, ONLY : xwcrn
173 !
174 REAL, DIMENSION(:), INTENT(IN) :: pwsnow_road ! snow amount over roads (kg/m2)
175 LOGICAL, DIMENSION(:), INTENT(IN) :: osnow ! T: snow-fall is occuring
176 REAL, DIMENSION(:), INTENT(OUT) :: pdn_road ! snow fraction over roads
177 REAL, DIMENSION(:), INTENT(OUT) :: pdf_road ! snow-free fraction over roads
178 REAL(KIND=JPRB) :: zhook_handle
179 !
180 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_ROAD',0,zhook_handle)
181 pdf_road(:) = 1.
182 pdn_road(:) = 0.
183 !
184 ! due to the flatness of horizontal surfaces (compared to landscape and
185 ! vegetation), the amount of snow necessary to cover the entire surface XWCRN
186 ! is reduced (equal to 1kg/m2 instead of 10).
187 !
188 WHERE (pwsnow_road(:)>0. .OR. osnow)
189  pdn_road(:) = max(min(pwsnow_road(:)/(pwsnow_road(:) + xwcrn*0.1) , 0.7), 0.01)
190  pdf_road(:) = 1.-pdn_road(:)
191 END WHERE
192 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_ROAD',1,zhook_handle)
193 !
194 END SUBROUTINE snow_frac_road
195 !
196 !-------------------------------------------------------------------------------
197 !
198 ! ##############################################################
199  SUBROUTINE snow_frac_roof(PWSNOW_ROOF,OSNOW,PDN_ROOF,PDF_ROOF)
200 ! ##############################################################
201 !
202 USE modd_snow_par, ONLY : xwcrn
203 !
204 REAL, DIMENSION(:), INTENT(IN) :: pwsnow_roof ! snow amount over roofs (kg/m2)
205 LOGICAL, DIMENSION(:), INTENT(IN) :: osnow ! T: snow-fall is occuring
206 REAL, DIMENSION(:), INTENT(OUT) :: pdn_roof ! snow fraction over roofs
207 REAL, DIMENSION(:), INTENT(OUT) :: pdf_roof ! snow-free fraction over roofs
208 REAL(KIND=JPRB) :: zhook_handle
209 !
210 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_ROOF',0,zhook_handle)
211 pdf_roof(:) = 1.
212 pdn_roof(:) = 0.
213 !
214 ! due to the flatness of horizontal surfaces (compared to landscape and
215 ! vegetation), the amount of snow necessary to cover the entire surface XWCRN
216 ! is reduced (equal to 1kg/m2 instead of 10).
217 !
218 WHERE (pwsnow_roof(:)>0. .OR. osnow)
219  pdn_roof(:) = max(pwsnow_roof(:)/(pwsnow_roof(:) + xwcrn*0.1),0.01)
220  pdf_roof(:) = 1.-pdn_roof(:)
221 END WHERE
222 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_ROOF',1,zhook_handle)
223 !
224 END SUBROUTINE snow_frac_roof
225 !
226 !-------------------------------------------------------------------------------
227 !-------------------------------------------------------------------------------
228 ! routines bidon pour tora
229 !
230 ! ########################################################
231  FUNCTION snow_frac_nat_1d(PWSNOW)RESULT(BIDON)
232 ! ########################################################
233 !
234 REAL, DIMENSION(:), INTENT(IN) :: pwsnow ! snow amount over natural areas (kg/m2)
235 REAL :: bidon
236 REAL(KIND=JPRB) :: zhook_handle
237 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_NAT_1D',0,zhook_handle)
238 bidon=pwsnow(1)
239 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_NAT_1D',1,zhook_handle)
240 !
241 END FUNCTION snow_frac_nat_1d
242 !
243 !-------------------------------------------------------------------------------
244 !
245 ! ########################################################
246  FUNCTION snow_frac_nat_2d(PWSNOW) RESULT(BIDON)
247 ! ########################################################
248 
249 REAL :: bidon
250 REAL, DIMENSION(:), INTENT(IN) :: pwsnow ! snow amount over natural areas (kg/m2)
251 REAL(KIND=JPRB) :: zhook_handle
252 !
253 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_NAT_2D',0,zhook_handle)
254 bidon=pwsnow(1)
255 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_NAT_2D',1,zhook_handle)
256 
257 END FUNCTION snow_frac_nat_2d
258 
259 !----------------------------------------------------------------------------------
260 ! ############################################################
261  FUNCTION snow_frac_veg_1d(PWSNOW) RESULT(BIDON)
262 ! ############################################################
263 REAL :: bidon
264 REAL, DIMENSION(:), INTENT(IN) :: pwsnow ! snow amount over natural areas (kg/m2)
265 REAL(KIND=JPRB) :: zhook_handle
266 !
267 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_VEG_1D',0,zhook_handle)
268 bidon=pwsnow(1)
269 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_VEG_1D',1,zhook_handle)
270 END FUNCTION snow_frac_veg_1d
271 !
272 !-------------------------------------------------------------------------------
273 !
274 ! ############################################################
275  FUNCTION snow_frac_veg_2d(PWSNOW) RESULT(BIDON)
276 ! ############################################################
277 
278 REAL :: bidon
279 REAL, DIMENSION(:), INTENT(IN) :: pwsnow ! snow amount over natural areas (kg/m2)
280 REAL(KIND=JPRB) :: zhook_handle
281 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_VEG_2D',0,zhook_handle)
282 bidon=pwsnow(1)
283 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_VEG_2D',1,zhook_handle)
284 !
285 END FUNCTION snow_frac_veg_2d
286 !
287 !-------------------------------------------------------------------------------
288 ! ##################################################
289  FUNCTION snow_frac_ground_1d(PWSNOW) RESULT(BIDON)
290 ! ##################################################
291 !
292 REAL :: bidon
293 REAL, DIMENSION(:), INTENT(IN) :: pwsnow ! snow amount over natural areas (kg/m2)
294 REAL(KIND=JPRB) :: zhook_handle
295 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_GROUND_1D',0,zhook_handle)
296 bidon=pwsnow(1)
297 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_GROUND_1D',1,zhook_handle)
298 !
299 END FUNCTION snow_frac_ground_1d
300 !
301 !-------------------------------------------------------------------------------
302 !
303 ! ##################################################
304  FUNCTION snow_frac_ground_2d(PWSNOW) RESULT(BIDON)
305 ! ##################################################
306 !
307 REAL :: bidon
308 REAL, DIMENSION(:), INTENT(IN) :: pwsnow ! snow amount over natural areas (kg/m2)
309 REAL(KIND=JPRB) :: zhook_handle
310 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_GROUND_2D',0,zhook_handle)
311 bidon=pwsnow(1)
312 IF (lhook) CALL dr_hook('MODE_SURF_SNOW_FRAC:SNOW_FRAC_GROUND_2D',1,zhook_handle)
313 
314 !
315 END FUNCTION snow_frac_ground_2d
316 !
317 
318 !-------------------------------------------------------------------------------
319 !-------------------------------------------------------------------------------
320 !
321 END MODULE mode_surf_snow_frac
real function snow_frac_veg_2d(PWSNOW)
real function snow_frac_ground_1d(PWSNOW)
real function, dimension(size(p_lai)) snow_frac_veg_a(P_PSNG, P_LAI, P_SNOWALB)
real function snow_frac_nat_1d(PWSNOW)
subroutine snow_frac_roof(PWSNOW_ROOF, OSNOW, PDN_ROOF, PDF_ROOF)
real function snow_frac_ground_2d(PWSNOW)
real function snow_frac_nat_2d(PWSNOW)
real function, dimension(size(ppsng)) wsnow_from_snow_frac_ground(PPSNG)
real function, dimension(size(pwsnow)) snow_frac_nat(PWSNOW, PPSNG, PPSNV, PVEG)
real function, dimension(size(pwsnow)) snow_frac_veg(PPSNG, PWSNOW, PZ0VEG, PRHOS)
real function, dimension(size(pwsnow)) snow_frac_ground(PWSNOW)
real function snow_frac_veg_1d(PWSNOW)
subroutine snow_frac_road(PWSNOW_ROAD, OSNOW, PDN_ROAD, PDF_ROAD)