SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
prep_hor_snow_fields.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 prep_hor_snow_fields (DTCO, &
7  ig, u, &
8  hprogram,hsurf, &
9  hfile,hfiletype, &
10  hfilepgd,hfilepgdtype, &
11  kluout,ounif,kpatch, &
12  kteb_patch, &
13  kl,tpsnow, tptime, &
14  punif_wsnow, punif_rsnow, &
15  punif_tsnow, punif_lwcsnow, &
16  punif_asnow, osnow_ideal, &
17  punif_sg1snow, punif_sg2snow,&
18  punif_histsnow,punif_agesnow,&
19  pvegtype, pvegtype_patch, &
20  ppatch, okey )
21 ! #######################################################
22 !
23 !
24 !!**** *PREP_HOR_SNOW_FIELDS* - prepares all snow fields for one surface scheme.
25 !!
26 !! PURPOSE
27 !! -------
28 !
29 !!** METHOD
30 !! ------
31 !!
32 !! REFERENCE
33 !! ---------
34 !!
35 !!
36 !! AUTHOR
37 !! ------
38 !! V. Masson
39 !!
40 !! MODIFICATIONS
41 !! -------------
42 !! Original 01/2004
43 !! B. Decharme 10/2013, Phasage Arpege-Climat
44 !! B. Decharme 04/2014, Init permsnow
45 !!------------------------------------------------------------------
46 !
47 !
48 !
49 !
50 !
51 !
53 !
54 USE modd_isba_grid_n, ONLY : isba_grid_t
55 USE modd_surf_atm_n, ONLY : surf_atm_t
56 !
59 !
60 USE modd_surf_par, ONLY : xundef
61 USE modd_snow_par, ONLY : xaglamin, xaglamax
62 !
63 USE modd_data_cover_par, ONLY : nvegtype
64 !
65 USE modi_allocate_gr_snow
66 USE modi_prep_hor_snow_field
67 USE mode_snow3l
68 USE modi_open_aux_io_surf
70 USE modi_close_aux_io_surf
71 !
72 USE yomhook ,ONLY : lhook, dr_hook
73 USE parkind1 ,ONLY : jprb
74 !
75 IMPLICIT NONE
76 !
77 !* 0.1 declarations of arguments
78 !
79 !
80 !
81 TYPE(data_cover_t), INTENT(INOUT) :: dtco
82 !
83 TYPE(isba_grid_t), INTENT(INOUT) :: ig
84 TYPE(surf_atm_t), INTENT(INOUT) :: u
85 !
86  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
87  CHARACTER(LEN=7), INTENT(IN) :: hsurf ! type of field
88  CHARACTER(LEN=28), INTENT(IN) :: hfile ! file name
89  CHARACTER(LEN=6), INTENT(IN) :: hfiletype ! file type
90  CHARACTER(LEN=28), INTENT(IN) :: hfilepgd ! file name
91  CHARACTER(LEN=6), INTENT(IN) :: hfilepgdtype ! file type
92 INTEGER, INTENT(IN) :: kluout ! logical unit of output listing
93 LOGICAL, INTENT(IN) :: ounif ! flag for prescribed uniform field
94 INTEGER, INTENT(IN) :: kpatch ! patch number for output scheme
95 INTEGER, INTENT(IN) :: kteb_patch
96 INTEGER, INTENT(IN) :: kl ! number of points
97 TYPE(surf_snow) :: tpsnow ! snow fields
98 TYPE(date_time), INTENT(IN) :: tptime ! date and time
99 REAL, DIMENSION(:), INTENT(IN) :: punif_wsnow ! prescribed snow content (kg/m2)
100 REAL, DIMENSION(:), INTENT(IN) :: punif_rsnow ! prescribed density (kg/m3)
101 REAL, DIMENSION(:), INTENT(IN) :: punif_tsnow ! prescribed temperature (K)
102 REAL, DIMENSION(:), INTENT(IN) :: punif_lwcsnow ! prescribed snow liquid water content (kg/m3)
103 REAL, INTENT(IN) :: punif_asnow ! prescribed albedo (-)
104 LOGICAL, INTENT(IN) :: osnow_ideal
105 REAL, DIMENSION(:), INTENT(IN) :: punif_sg1snow !
106 REAL, DIMENSION(:), INTENT(IN) :: punif_sg2snow !
107 REAL, DIMENSION(:), INTENT(IN) :: punif_histsnow !
108 REAL, DIMENSION(:), INTENT(IN) :: punif_agesnow !
109 
110 REAL,DIMENSION(:,:), INTENT(IN ), OPTIONAL :: pvegtype ! fraction of each vegtype
111 REAL,DIMENSION(:,:,:), INTENT(IN ), OPTIONAL :: pvegtype_patch ! fraction of each vegtype per patch
112 REAL,DIMENSION(:,:), INTENT(IN ), OPTIONAL :: ppatch ! fraction of each patch
113 LOGICAL, INTENT(OUT), OPTIONAL :: okey
114 !
115 !
116 !* 0.2 declarations of local variables
117 !
118  CHARACTER(LEN=10) :: ysnsurf ! type of field
119 REAL,ALLOCATABLE,DIMENSION(:,:,:) :: zw ! total snow content
120 REAL,ALLOCATABLE,DIMENSION(:,:) :: zwrho ! total snow content from rho profile alone
121 REAL,ALLOCATABLE,DIMENSION(:,:,:) :: zd ! total snow depth
122 REAL,ALLOCATABLE,DIMENSION(:,:,:) :: zdepth ! snow depth of each layer
123 REAL,ALLOCATABLE,DIMENSION(:,:) :: zdtot ! total snow depth
124 REAL,DIMENSION(KL,KPATCH) :: zpatch ! fraction of each patch
125 REAL,DIMENSION(:,:), ALLOCATABLE :: zvegtype ! fraction of each patch
126 REAL,DIMENSION(:,:,:), ALLOCATABLE :: zvegtype_patch ! fraction of each vegtype per patch
127 !
128 INTEGER :: jpatch ! loop counter on patches
129 INTEGER :: jlayer ! loop counter on layers
130 INTEGER :: iversion ! surface version
131  CHARACTER(LEN=16) :: yrecfm ! record name
132 INTEGER :: iresp ! error return code
133 LOGICAL :: gglacier
134 !
135 REAL(KIND=JPRB) :: zhook_handle
136 !---------------------------------------------------------------------------
137 !
138 IF (lhook) CALL dr_hook('PREP_HOR_SNOW_FIELDS',0,zhook_handle)
139 !
140 IF (present(ppatch)) THEN
141  zpatch = ppatch
142 ELSE
143  zpatch = 1.
144 ENDIF
145 IF (present(pvegtype)) THEN
146  ALLOCATE(zvegtype(kl,SIZE(pvegtype,2)))
147  zvegtype = pvegtype
148 ELSE
149  ALLOCATE(zvegtype(kl,nvegtype))
150  zvegtype = 1.
151 ENDIF
152 IF (present(pvegtype_patch)) THEN
153  ALLOCATE(zvegtype_patch(kl,SIZE(pvegtype_patch,2),kpatch))
154  zvegtype_patch = pvegtype_patch
155 ELSE
156  ALLOCATE(zvegtype_patch(kl,1,kpatch))
157  zvegtype_patch = 1.
158 ENDIF
159 !
160 !* 1. Allocation of output field
161 !
162  CALL allocate_gr_snow(tpsnow,kl,kpatch)
163 !
164 !---------------------------------------------------------------------------
165 !
166 !* 2. Find if PERMSNOW must be done
167 !
168 IF(present(okey))THEN
169 !
170  IF ( (hfiletype=='MESONH' .OR. hfiletype=='ASCII ' .OR. hfiletype=='LFI '.OR. hfiletype=='FA ') &
171  .AND. (hsurf=='SN_VEG ') ) THEN
172 !
173  CALL open_aux_io_surf(&
174  hfile,hfiletype,'FULL ')
175  yrecfm='VERSION'
176  CALL read_surf(&
177  hfiletype,yrecfm,iversion,iresp)
178  CALL close_aux_io_surf(hfile,hfiletype)
179 !
180  IF(iversion>7)THEN
181  CALL open_aux_io_surf(&
182  hfile,hfiletype,'NATURE')
183  yrecfm='GLACIER'
184  CALL read_surf(&
185  hfiletype,yrecfm,gglacier,iresp)
186  CALL close_aux_io_surf(hfile,hfiletype)
187  IF(gglacier)okey=.false.
188  ENDIF
189 !
190  ENDIF
191 !
192  IF(osnow_ideal)okey=.false.
193 !
194 ENDIF
195 !
196 !---------------------------------------------------------------------------
197 !
198 !* 3. Treatment of total snow content (kg/m2)
199 !
200 ALLOCATE(zw(kl,tpsnow%NLAYER,kpatch))
201 !
202 ysnsurf='WWW'//hsurf
203  CALL prep_hor_snow_field(dtco, &
204  ig, u, &
205  hprogram, hfile, hfiletype, hfilepgd, hfilepgdtype, &
206  kluout, ounif, ysnsurf, kpatch, kteb_patch, kl, tpsnow, tptime, &
207  punif_wsnow, punif_rsnow, punif_tsnow, punif_lwcsnow,&
208  punif_asnow, osnow_ideal, punif_sg1snow, &
209  punif_sg2snow, punif_histsnow,punif_agesnow, &
210  pf=zw, pvegtype=zvegtype, &
211  pvegtype_patch=zvegtype_patch, ppatch=zpatch )
212 !
213 !----------------------------------------------------------------------------
214 !
215 !* 4. Treatment of total snow depth
216 !
217 ALLOCATE(zd(kl,tpsnow%NLAYER,kpatch))
218 !
219 ysnsurf='DEP'//hsurf
220  CALL prep_hor_snow_field(dtco, &
221  ig, u, &
222  hprogram, hfile, hfiletype, hfilepgd, hfilepgdtype, &
223  kluout, ounif, ysnsurf, kpatch, kteb_patch, kl, tpsnow, tptime, &
224  punif_wsnow, punif_rsnow, punif_tsnow, punif_lwcsnow,&
225  punif_asnow, osnow_ideal, punif_sg1snow, &
226  punif_sg2snow, punif_histsnow,punif_agesnow, &
227  pf=zd, pvegtype=zvegtype, &
228  pvegtype_patch=zvegtype_patch, ppatch=zpatch )
229 !
230 !* snow layer thickness definition
231 !
232 ALLOCATE(zdepth(kl,tpsnow%NLAYER,kpatch))
233 !
234 IF (osnow_ideal) THEN
235  zdepth(:,:,:) = zd(:,:,:)
236 ELSE
237  IF (tpsnow%NLAYER==1) THEN
238  DO jpatch=1,kpatch
239  zdepth(:,1,jpatch) = zd(:,1,jpatch)
240  END DO
241  ELSEIF (tpsnow%SCHEME=='3-L') THEN
242  zdepth(:,:,:)=zd(:,:,:)
243  ELSEIF (tpsnow%SCHEME=='CRO') THEN
244  ALLOCATE(zdtot(kl,kpatch))
245  zdtot(:,:)=0.0
246  DO jlayer=1,tpsnow%NLAYER
247  zdtot(:,:)=zdtot(:,:)+zd(:,jlayer,:)
248  END DO
249  DO jpatch=1,kpatch
250  CALL snow3lgrid(zdepth(:,:,jpatch),zdtot(:,jpatch))
251  END DO
252  DEALLOCATE(zdtot)
253  ENDIF
254 ENDIF
255 !
256 !----------------------------------------------------------------------------
257 !
258 !* 4. Snow density profile
259 ! --------------------
260 !
261 !* density profile
262 ysnsurf='RHO'//hsurf
263  CALL prep_hor_snow_field(dtco, &
264  ig, u, &
265  hprogram,hfile,hfiletype,hfilepgd,hfilepgdtype, &
266  kluout,ounif,ysnsurf, kpatch, kteb_patch, kl, tpsnow, tptime, &
267  punif_wsnow, punif_rsnow, punif_tsnow, punif_lwcsnow, &
268  punif_asnow, osnow_ideal, punif_sg1snow, &
269  punif_sg2snow, punif_histsnow,punif_agesnow, &
270  pdepth=zdepth, pvegtype=zvegtype, &
271  pvegtype_patch=zvegtype_patch, ppatch=zpatch )
272 !
273 !----------------------------------------------------------------------------
274 !
275 !* 5. Snow water content profile
276 ! --------------------------
277 !
278 IF (osnow_ideal) THEN
279  !
280  tpsnow%WSNOW(:,:,:) = zw(:,:,:)
281  !
282 ELSE
283  !
284  ALLOCATE(zwrho(SIZE(tpsnow%WSNOW,1),kpatch))
285  ALLOCATE(zdtot(SIZE(tpsnow%WSNOW,1),kpatch))
286  zwrho(:,:) = 0.0
287  zdtot(:,:) = 0.0
288  !
289  !* snow depth estimated from rho profile
290  DO jpatch=1,kpatch
291  DO jlayer=1,tpsnow%NLAYER
292  WHERE (zpatch(:,jpatch)>0. .AND. tpsnow%RHO(:,jlayer,jpatch)/=xundef)
293  zwrho(:,jpatch) = zwrho(:,jpatch) + tpsnow%RHO(:,jlayer,jpatch) * zdepth(:,jlayer,jpatch)
294  ELSEWHERE
295  zwrho(:,jpatch) = xundef
296  END WHERE
297  END DO
298  END DO
299  !
300  !* modification of snow depth: coherence between rho profile, total snow and total depth
301  DO jpatch=1,kpatch
302  DO jlayer=1,tpsnow%NLAYER
303  WHERE(zpatch(:,jpatch)>0. .AND. zwrho(:,jpatch)/=0. .AND. zwrho(:,jpatch)/=xundef .AND. zw(:,1,jpatch)>0.0)
304  zdtot(:,jpatch) = zdtot(:,jpatch) + zdepth(:,jlayer,jpatch) * zw(:,1,jpatch) / zwrho(:,jpatch)
305  ENDWHERE
306  END DO
307  CALL snow3lgrid(zdepth(:,:,jpatch),zdtot(:,jpatch))
308  END DO
309  !
310  !* snow content profile for each grid level
311  DO jpatch=1,kpatch
312  DO jlayer=1,tpsnow%NLAYER
313  WHERE(zpatch(:,jpatch)>0..AND.tpsnow%RHO(:,jlayer,jpatch)/=xundef.AND.zdtot(:,jpatch)>0.)
314  tpsnow%WSNOW(:,jlayer,jpatch) = tpsnow%RHO(:,jlayer,jpatch) * zdepth(:,jlayer,jpatch)
315  ELSEWHERE(zpatch(:,jpatch)>0..AND.(tpsnow%RHO(:,jlayer,jpatch)==xundef.OR.zdtot(:,jpatch)==0.0))
316  tpsnow%WSNOW(:,jlayer,jpatch) = 0.0
317  ELSEWHERE
318  tpsnow%WSNOW(:,jlayer,jpatch) = xundef
319  END WHERE
320  END DO
321  END DO
322  !
323  DEALLOCATE(zwrho)
324  DEALLOCATE(zdtot)
325  !
326 ENDIF
327 !
328 !----------------------------------------------------------------------------
329 !
330 !* 6. Albedo, snow heat content, and age
331 ! ----------------------------------
332 !
333 !* albedo
334 ysnsurf='ALB'//hsurf
335  CALL prep_hor_snow_field(dtco, &
336  ig, u, &
337  hprogram,hfile,hfiletype,hfilepgd,hfilepgdtype, &
338  kluout,ounif,ysnsurf, kpatch, kteb_patch, kl, tpsnow, tptime, &
339  punif_wsnow, punif_rsnow, punif_tsnow, punif_lwcsnow, &
340  punif_asnow, osnow_ideal, punif_sg1snow, &
341  punif_sg2snow, punif_histsnow,punif_agesnow, &
342  pdepth=zdepth, pvegtype=zvegtype, &
343  pvegtype_patch=zvegtype_patch, ppatch=zpatch )
344 !
345 IF (tpsnow%SCHEME/='D95') THEN
346  !
347  !* heat in snowpack profile
348  ysnsurf='HEA'//hsurf
349  CALL prep_hor_snow_field(dtco, &
350  ig, u, &
351  hprogram,hfile,hfiletype,hfilepgd,hfilepgdtype, &
352  kluout,ounif,ysnsurf, kpatch, kteb_patch, kl, tpsnow, tptime, &
353  punif_wsnow, punif_rsnow, punif_tsnow, punif_lwcsnow, &
354  punif_asnow, osnow_ideal, punif_sg1snow, &
355  punif_sg2snow, punif_histsnow,punif_agesnow, &
356  pdepth=zdepth, pvegtype=zvegtype, &
357  pvegtype_patch=zvegtype_patch, ppatch=zpatch )
358  !
359 ENDIF
360 !
361 IF (tpsnow%SCHEME=='CRO'.OR. tpsnow%SCHEME=='3-L') THEN
362  !
363  !* age in snowpack profile
364  ysnsurf='AGE'//hsurf
365  CALL prep_hor_snow_field(dtco, &
366  ig, u, &
367  hprogram,hfile,hfiletype,hfilepgd,hfilepgdtype, &
368  kluout,ounif,ysnsurf, kpatch, kteb_patch, kl, tpsnow, tptime, &
369  punif_wsnow, punif_rsnow, punif_tsnow, punif_lwcsnow, &
370  punif_asnow, osnow_ideal, punif_sg1snow, &
371  punif_sg2snow, punif_histsnow,punif_agesnow, &
372  pdepth=zdepth, pvegtype=zvegtype, &
373  pvegtype_patch=zvegtype_patch, ppatch=zpatch )
374  !
375  WHERE(tpsnow%WSNOW(:,1,:)>0.0.AND.tpsnow%WSNOW(:,1,:)/=xundef.AND. &
376  tpsnow%AGE(:,1,:)==0.0.AND.tpsnow%ALB(:,:)<xaglamin)
377  tpsnow%ALB(:,:)=(xaglamin+xaglamax)/2.0
378  ENDWHERE
379  !
380 ENDIF
381 !
382 !----------------------------------------------------------------------------
383 !
384 !* 7. Crocus specific parameters
385 ! --------------------------
386 !
387 IF (tpsnow%SCHEME=='CRO') THEN
388  !
389  ysnsurf='SG1'//hsurf
390  CALL prep_hor_snow_field(dtco, &
391  ig, u, &
392  hprogram,hfile,hfiletype,hfilepgd,hfilepgdtype, &
393  kluout,ounif,ysnsurf, kpatch, kteb_patch, kl, tpsnow, tptime, &
394  punif_wsnow, punif_rsnow, punif_tsnow, punif_lwcsnow, &
395  punif_asnow, osnow_ideal, punif_sg1snow, &
396  punif_sg2snow, punif_histsnow,punif_agesnow, &
397  pdepth=zdepth, pvegtype=zvegtype, &
398  pvegtype_patch=zvegtype_patch, ppatch=zpatch )
399  !
400  ysnsurf='SG2'//hsurf
401  CALL prep_hor_snow_field(dtco, &
402  ig, u, &
403  hprogram,hfile,hfiletype,hfilepgd,hfilepgdtype, &
404  kluout,ounif,ysnsurf, kpatch, kteb_patch, kl, tpsnow, tptime, &
405  punif_wsnow, punif_rsnow, punif_tsnow, punif_lwcsnow, &
406  punif_asnow, osnow_ideal, punif_sg1snow, &
407  punif_sg2snow, punif_histsnow,punif_agesnow, &
408  pdepth=zdepth, pvegtype=zvegtype, &
409  pvegtype_patch=zvegtype_patch, ppatch=zpatch )
410  !
411  ysnsurf='HIS'//hsurf
412  CALL prep_hor_snow_field(dtco, &
413  ig, u, &
414  hprogram,hfile,hfiletype,hfilepgd,hfilepgdtype, &
415  kluout,ounif,ysnsurf, kpatch, kteb_patch, kl, tpsnow, tptime, &
416  punif_wsnow, punif_rsnow, punif_tsnow, punif_lwcsnow, &
417  punif_asnow, osnow_ideal, punif_sg1snow, &
418  punif_sg2snow, punif_histsnow,punif_agesnow, &
419  pdepth=zdepth, pvegtype=zvegtype, &
420  pvegtype_patch=zvegtype_patch, ppatch=zpatch )
421  !
422 ENDIF
423 !
424 !* 8. Deallocations
425 !
426 DEALLOCATE(zd )
427 DEALLOCATE(zw )
428 DEALLOCATE(zdepth )
429 DEALLOCATE(zvegtype)
430 DEALLOCATE(zvegtype_patch)
431 !
432 IF (lhook) CALL dr_hook('PREP_HOR_SNOW_FIELDS',1,zhook_handle)
433 !
434 !----------------------------------------------------------------------------
435 !
436 END SUBROUTINE prep_hor_snow_fields
subroutine prep_hor_snow_field(DTCO, IG, U, HPROGRAM, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, OUNIF, HSNSURF, KPATCH, KTEB_PATCH, KL, TPSNOW, TPTIME, PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_LWCSNOW, PUNIF_ASNOW, OSNOW_IDEAL, PUNIF_SG1SNOW, PUNIF_SG2SNOW, PUNIF_HISTSNOW, PUNIF_AGESNOW, PF, PDEPTH, PVEGTYPE, PVEGTYPE_PATCH, PPATCH)
subroutine allocate_gr_snow(TPSNOW, KLU, KPATCH)
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK)
subroutine prep_hor_snow_fields(DTCO, IG, U, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, OUNIF, KPATCH, KTEB_PATCH, KL, TPSNOW, TPTIME, PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_LWCSNOW, PUNIF_ASNOW, OSNOW_IDEAL, PUNIF_SG1SNOW, PUNIF_SG2SNOW, PUNIF_HISTSNOW, PUNIF_AGESNOW, PVEGTYPE, PVEGTYPE_PATCH, PPATCH, OKEY)