SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
prep_snow_extern.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_snow_extern (&
7  hprogram,hsurf,hfile,hfiletype,hfilepgd,hfilepgdtype,&
8  kluout,pfield,osnow_ideal,klayer,kteb_patch)
9 ! #################################################################################
10 !
11 !
12 !!**** *PREP_SNOW_EXTERN*
13 !!
14 !! PURPOSE
15 !! -------
16 ! Read and prepare initial snow fields from external files
17 !
18 !!** METHOD
19 !! ------
20 !
21 !! EXTERNAL
22 !! --------
23 !!
24 !! IMPLICIT ARGUMENTS
25 !! ------------------
26 !!
27 !!
28 !! REFERENCE
29 !! ---------
30 !!
31 !!
32 !! AUTHOR
33 !! ------
34 !! * Meteo-France *
35 !!
36 !! MODIFICATIONS
37 !! -------------
38 !! Original ?
39 !! 02/2014 E. Martin : cor. for passing from from multilayer to a single layer
40 !! B. Decharme 04/2014, external init with FA files
41 !! improve vertical interpolation
42 !-------------------------------------------------------------------------------
43 !
44 !
45 !
46 !
47 !
49 USE modd_prep, ONLY : cingrid_type, cinterp_type
50 USE modd_prep_snow, ONLY : xgrid_snow, ngrid_level
51 USE modd_data_cover_par, ONLY : nvegtype
52 USE modd_surf_par, ONLY : xundef
53 USE modd_csts, ONLY : xtt
54 !
55 USE mode_snow3l
56 !
57 USE yomhook ,ONLY : lhook, dr_hook
58 USE parkind1 ,ONLY : jprb
59 !
60 USE modi_town_presence
61 USE modi_put_on_all_vegtypes
62 USE modi_abor1_sfx
63 USE modi_prep_grid_extern
64 USE modi_open_aux_io_surf
65 USE modi_close_aux_io_surf
66 USE modi_allocate_gr_snow
68 USE modi_read_gr_snow
71 USE modi_read_teb_patch
72 !
73 IMPLICIT NONE
74 !
75 !* 0.1 declarations of arguments
76 !
77 !
78 !
79  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
80  CHARACTER(LEN=10), INTENT(IN) :: hsurf ! type of field
81  CHARACTER(LEN=28), INTENT(IN) :: hfile ! name of file
82  CHARACTER(LEN=6), INTENT(IN) :: hfiletype ! type of file
83  CHARACTER(LEN=28), INTENT(IN) :: hfilepgd ! name of file
84  CHARACTER(LEN=6), INTENT(IN) :: hfilepgdtype ! type of file
85 INTEGER, INTENT(IN) :: kluout ! logical unit of output listing
86 REAL,DIMENSION(:,:,:), POINTER :: pfield ! field to interpolate horizontally
87 LOGICAL, INTENT(IN) :: osnow_ideal
88 INTEGER, INTENT(IN) :: klayer ! Number of layer of output snow scheme
89 INTEGER, INTENT(IN) :: kteb_patch
90 !
91 !* 0.2 declarations of local variables
92 !
93 TYPE(surf_snow) :: tzsnow ! snow characteristics
94 
95 REAL, DIMENSION(:,:,:), ALLOCATABLE :: zfield ! work field on input snow grid
96 REAL, DIMENSION(:,:,:), ALLOCATABLE :: zfield_fine ! work field on fine snow grid
97 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ztemp ! snow temperature
98 REAL, DIMENSION(:,:,:), ALLOCATABLE :: zwliq ! liquid water snow pack content
99 REAL, DIMENSION(:,:), ALLOCATABLE :: zd ! total snow depth
100 REAL, DIMENSION(:,:,:), ALLOCATABLE :: zdepth ! thickness of each layer (m)
101 REAL, DIMENSION(:,:,:), ALLOCATABLE :: zgrid ! normalized input grid
102 !
103 LOGICAL :: gtown ! town variables written in the file
104  CHARACTER(LEN=12) :: yrecfm ! record name
105 INTEGER :: iresp ! error return code
106 INTEGER :: iversion ! SURFEX version
107 LOGICAL :: gold_name ! old name flag
108 INTEGER :: ibugfix ! SURFEX bug version
109 INTEGER :: ivegtype ! actual number of vegtypes
110 INTEGER :: jlayer ! loop on snow vertical grids
111 INTEGER :: ji ! loop on pts
112 INTEGER :: ini
113  CHARACTER(LEN=8) :: yarea ! area treated ('ROOF','ROAD','VEG ')
114  CHARACTER(LEN=3) :: yprefix ! prefix to identify patch
115 INTEGER :: ipatch ! number of input patch
116 INTEGER :: iteb_patch ! number of input patch for TEB
117 INTEGER :: jpatch ! loop on patch
118  CHARACTER(LEN=6) :: ymask ! type of tile mask
119 REAL(KIND=JPRB) :: zhook_handle
120 !
121 !-------------------------------------------------------------------------------------
122 !
123 !* 3. Area being treated
124 ! ------------------
125 !
126 IF (lhook) CALL dr_hook('PREP_SNOW_EXTERN',0,zhook_handle)
127 !
128 !-------------------------------------------------------------------------------------
129 !
130 yarea=' '
131 yarea(1:4) = hsurf(7:10)
132 !
133 IF (yarea(1:4)=='VEG ') THEN
134  ivegtype = nvegtype
135  ymask = 'NATURE'
136  yprefix = ' '
137 ELSE
138  ivegtype = 1
139  ymask = 'TOWN '
140  ipatch = 1
141  yprefix = ' '
142 END IF
143 !
144 !* 1. Preparation of IO for reading in the file
145 ! -----------------------------------------
146 !
147 !* Note that all points are read, even those without physical meaning.
148 ! These points will not be used during the horizontal interpolation step.
149 ! Their value must be defined as XUNDEF.
150 !
151 !* reading of version of the file being read
152  CALL open_aux_io_surf(&
153  hfilepgd,hfilepgdtype,'FULL ')
154  CALL read_surf(&
155  hfilepgdtype,'VERSION',iversion,iresp)
156  CALL read_surf(&
157  hfilepgdtype,'BUG',ibugfix,iresp)
158  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
159 !
160 gold_name=(iversion<7 .OR. (iversion==7 .AND. ibugfix<3))
161 !
162  CALL open_aux_io_surf(&
163  hfilepgd,hfilepgdtype,ymask)
164 !
165 IF (yarea(1:4)=='VEG ') THEN
166  yrecfm = 'PATCH_NUMBER'
167  CALL read_surf(&
168  hfilepgdtype,yrecfm,ipatch,iresp)
169  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
170 ELSE
171  IF (.NOT.gold_name) THEN
172  IF (yarea(1:4)=='ROOF') yarea(1:4) = 'RF '
173  IF (yarea(1:4)=='ROAD') yarea(1:4) = 'RD '
174  ENDIF
175  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
176  CALL read_teb_patch(&
177  hfilepgd,hfilepgdtype,iteb_patch)
178  IF (iteb_patch>1) THEN
179  WRITE(yprefix,fmt='(A,I1,A)') 'T',min(kteb_patch,iteb_patch),'_'
180  END IF
181 END IF
182 !
183 !
184 !-------------------------------------------------------------------------------------
185 !
186 !* 2. Reading of grid
187 ! ---------------
188 !
189  CALL open_aux_io_surf(&
190  hfilepgd,hfilepgdtype,'FULL ')
191 !
192  CALL prep_grid_extern(&
193  hfilepgdtype,kluout,cingrid_type,cinterp_type,ini)
194 !
195 !-------------------------------------------------------------------------------------
196 !
197 !* 4. Reading of snow data
198 ! ---------------------
199 !
200 IF (yarea(1:2)=='RO' .OR. yarea(1:2)=='GA' .OR. yarea(1:2)=='RF' .OR. yarea(1:2)=='RD') THEN
201  CALL town_presence(&
202  hfilepgdtype,gtown)
203  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
204  IF (.NOT. gtown) THEN
205  tzsnow%SCHEME='1-L'
206  tzsnow%NLAYER=1
207  CALL allocate_gr_snow(tzsnow,ini,ipatch)
208  ELSE
209  CALL open_aux_io_surf(&
210  hfile,hfiletype,ymask)
211  CALL read_gr_snow(&
212  hfiletype,trim(yarea),yprefix,ini,ipatch,tzsnow, &
213  hdir='A',kversion=iversion,kbugfix=ibugfix)
214  CALL close_aux_io_surf(hfile,hfiletype)
215  ENDIF
216 ELSE
217  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
218  CALL open_aux_io_surf(&
219  hfile,hfiletype,ymask)
220  CALL read_gr_snow(&
221  hfiletype,trim(yarea),yprefix,ini,ipatch,tzsnow, &
222  hdir='A',kversion=iversion,kbugfix=ibugfix)
223  CALL close_aux_io_surf(hfile,hfiletype)
224 ENDIF
225 !
226 !-------------------------------------------------------------------------------------
227 !
228 !* 5. Total snow content
229 ! ------------------
230 !
231 SELECT CASE (hsurf(1:3))
232  CASE ('WWW')
233  IF (osnow_ideal) THEN
234  ALLOCATE(zfield(ini,klayer,ipatch))
235  zfield(:,:,:) = tzsnow%WSNOW(:,1:klayer,:)
236  ALLOCATE(pfield(ini,klayer,ivegtype))
237  CALL put_on_all_vegtypes(ini,klayer,ipatch,ivegtype,zfield,pfield)
238  ELSE
239  ALLOCATE(zfield(ini,1,ipatch))
240  zfield(:,1,:) = 0.0
241  DO jlayer=1,tzsnow%NLAYER
242  zfield(:,1,:) = zfield(:,1,:) + tzsnow%WSNOW(:,jlayer,:)
243  END DO
244  WHERE ( zfield(:,1,:)>xundef ) zfield(:,1,:)=xundef
245  ALLOCATE(pfield(ini,1,ivegtype))
246  CALL put_on_all_vegtypes(ini,1,ipatch,ivegtype,zfield,pfield)
247  ENDIF
248  DEALLOCATE(zfield)
249 !
250 !-------------------------------------------------------------------------------------
251 !
252 !* 6. Albedo
253 ! ------
254 !
255  CASE ('ALB')
256  ALLOCATE(zfield(ini,1,ipatch))
257  zfield(:,1,:) = tzsnow%ALB(:,:)
258  !
259  ALLOCATE(pfield(ini,1,ivegtype))
260  CALL put_on_all_vegtypes(ini,1,ipatch,ivegtype,zfield,pfield)
261  DEALLOCATE(zfield)
262 !
263 !-------------------------------------------------------------------------------------
264 !
265 !* 7. Total depth to snow grid
266 ! ------------------------
267 !
268  CASE ('DEP')
269  ALLOCATE(zfield_fine(ini,klayer,ipatch))
270  IF (osnow_ideal) THEN
271  zfield_fine(:,:,:) = tzsnow%WSNOW(:,1:klayer,:)/tzsnow%RHO(:,1:klayer,:)
272  WHERE(tzsnow%WSNOW(:,1:klayer,:)==xundef) zfield_fine(:,:,:)=xundef
273  ELSE
274  ALLOCATE(zdepth(ini,tzsnow%NLAYER,ipatch))
275  zdepth(:,:,:) = tzsnow%WSNOW(:,:,:)/tzsnow%RHO(:,:,:)
276  WHERE(tzsnow%WSNOW(:,:,:)==xundef) zdepth(:,:,:)=xundef
277  IF(tzsnow%NLAYER/=klayer)THEN
278  !* total depth
279  ALLOCATE(zd(ini,ipatch))
280  zd(:,:) = 0.0
281  DO jpatch=1,ipatch
282  DO jlayer=1,tzsnow%NLAYER
283  DO ji=1,ini
284  IF(zdepth(ji,jlayer,jpatch)/=xundef)THEN
285  zd(ji,jpatch) = zd(ji,jpatch) + zdepth(ji,jlayer,jpatch)
286  ENDIF
287  ENDDO
288  ENDDO
289  ENDDO
290  !* fine grid
291  DO jpatch=1,ipatch
292  CALL snow3lgrid(zfield_fine(:,:,jpatch),zd(:,jpatch))
293  ENDDO
294  DEALLOCATE(zd)
295  ELSE
296  zfield_fine(:,:,:)=zdepth(:,:,:)
297  ENDIF
298  DEALLOCATE(zdepth)
299  ENDIF
300  ALLOCATE(pfield(ini,klayer,ivegtype))
301  CALL put_on_all_vegtypes(ini,klayer,ipatch,ivegtype,zfield_fine,pfield)
302  DEALLOCATE(zfield_fine)
303 !
304 !-------------------------------------------------------------------------------------
305 !
306 !* 8. Density or heat profile
307 ! -----------------------
308 !
309  CASE ('RHO','HEA','SG1','SG2','HIS','AGE')
310  ALLOCATE(zfield(ini,tzsnow%NLAYER,ipatch))
311 !
312  SELECT CASE (tzsnow%SCHEME)
313  CASE ('D95','1-L','EBA')
314  ALLOCATE(zfield_fine(ini,ngrid_level,ipatch))
315  !* computes output physical variable
316  IF (hsurf(1:3)=='RHO') zfield(:,1,:) = tzsnow%RHO(:,1,:)
317  IF (hsurf(1:3)=='HEA') THEN
318  ALLOCATE(ztemp(ini,tzsnow%NLAYER,ipatch))
319  ALLOCATE(zwliq(ini,tzsnow%NLAYER,ipatch))
320  IF (tzsnow%SCHEME=='D95'.OR.tzsnow%SCHEME=='EBA') ztemp(:,1,:) = xtt-2.
321  IF (tzsnow%SCHEME=='1-L') ztemp(:,1,:) = tzsnow%T(:,1,:)
322  zwliq(:,:,:) = 0.0
323  CALL snow_t_wliq_to_heat(zfield,tzsnow%RHO,ztemp,zwliq)
324  DEALLOCATE(ztemp)
325  DEALLOCATE(zwliq)
326  END IF
327  IF (hsurf(1:3)=='SG1') zfield(:,1,:) = -20.0
328  IF (hsurf(1:3)=='SG2') zfield(:,1,:) = 80.0
329  IF (hsurf(1:3)=='HIS') zfield(:,1,:) = 0.0
330  IF (hsurf(1:3)=='AGE') zfield(:,1,:) = 3.0
331  !* put profile on fine snow grid
332  DO jlayer=1,ngrid_level
333  zfield_fine(:,jlayer,:) = zfield(:,1,:)
334  END DO
335  ALLOCATE(pfield(ini,ngrid_level,ivegtype))
336  CALL put_on_all_vegtypes(ini,ngrid_level,ipatch,ivegtype,zfield_fine,pfield)
337 
338  CASE ('3-L','CRO')
339  !* input physical variable
340  IF (hsurf(1:3)=='RHO') zfield(:,:,:) = tzsnow%RHO (:,1:tzsnow%NLAYER,:)
341  IF (hsurf(1:3)=='HEA') zfield(:,:,:) = tzsnow%HEAT(:,1:tzsnow%NLAYER,:)
342  IF (hsurf(1:3)=='AGE') zfield(:,:,:) = tzsnow%AGE (:,1:tzsnow%NLAYER,:)
343  IF (tzsnow%SCHEME=='CRO')THEN
344  IF (hsurf(1:3)=='SG1') zfield(:,:,:) = tzsnow%GRAN1(:,1:tzsnow%NLAYER,:)
345  IF (hsurf(1:3)=='SG2') zfield(:,:,:) = tzsnow%GRAN2(:,1:tzsnow%NLAYER,:)
346  IF (hsurf(1:3)=='HIS') zfield(:,:,:) = tzsnow%HIST (:,1:tzsnow%NLAYER,:)
347  ELSE
348  IF (hsurf(1:3)=='SG1') zfield(:,:,:) = -20.0
349  IF (hsurf(1:3)=='SG2') zfield(:,:,:) = 80.0
350  IF (hsurf(1:3)=='HIS') zfield(:,:,:) = 0.0
351  ENDIF
352  !
353  IF (osnow_ideal) THEN
354  ALLOCATE(zfield_fine(ini,klayer,ipatch))
355  zfield_fine(:,:,:) = zfield(:,:,:)
356  ALLOCATE(pfield(ini,klayer,ivegtype))
357  CALL put_on_all_vegtypes(ini,klayer,ipatch,ivegtype,zfield_fine,pfield)
358  ELSE
359  ALLOCATE(zfield_fine(ini,ngrid_level,ipatch))
360  !
361  !* input snow layer thickness
362  ALLOCATE(zdepth(ini,tzsnow%NLAYER,ipatch))
363  DO jpatch=1,ipatch
364  zdepth(:,:,jpatch) = tzsnow%WSNOW(:,:,jpatch)/tzsnow%RHO(:,:,jpatch)
365  END DO
366  !
367  !* total depth
368  ALLOCATE(zd(ini,ipatch))
369  zd(:,:) = 0.
370  DO jlayer=1,tzsnow%NLAYER
371  zd(:,:) = zd(:,:) + zdepth(:,jlayer,:)
372  ENDDO
373  !
374  !* input normalized grid
375  ALLOCATE(zgrid(ini,tzsnow%NLAYER,ipatch))
376  DO jpatch=1,ipatch
377  DO ji=1,ini
378  IF(zd(ji,jpatch)==0.0)THEN
379  DO jlayer = 1,tzsnow%NLAYER
380  zgrid(ji,jlayer,jpatch)=REAL(jlayer)/REAL(tzsnow%nlayer)
381  ENDDO
382  ELSE
383  DO jlayer = 1,tzsnow%NLAYER
384  IF(jlayer==1)THEN
385  zgrid(ji,jlayer,jpatch)=zdepth(ji,jlayer,jpatch)/ zd(ji,jpatch)
386  ELSE
387  zgrid(ji,jlayer,jpatch) = zgrid(ji,jlayer-1,jpatch) + zdepth(ji,jlayer,jpatch)/zd(ji,jpatch)
388  ENDIF
389  ENDDO
390  ENDIF
391  ENDDO
392  ENDDO
393  DEALLOCATE(zdepth)
394  DEALLOCATE(zd)
395  !
396  !* interpolation of profile onto fine normalized snow grid
397  DO jpatch=1,ipatch
398  CALL interp_grid_nat(zgrid(:,:,jpatch),zfield(:,:,jpatch), &
399  xgrid_snow(:), zfield_fine(:,:,jpatch))
400  END DO
401  DEALLOCATE(zgrid)
402  ALLOCATE(pfield(ini,ngrid_level,ivegtype))
403  CALL put_on_all_vegtypes(ini,ngrid_level,ipatch,ivegtype,zfield_fine,pfield)
404  ENDIF
405  END SELECT
406  !
407  !* put field form patch to all vegtypes
408  DEALLOCATE(zfield)
409  DEALLOCATE(zfield_fine)
410 !
411 END SELECT
412 !
413 !-------------------------------------------------------------------------------------
414 !
415 !* 9. End of IO
416 ! ---------
417 !
418 IF (lhook) CALL dr_hook('PREP_SNOW_EXTERN',1,zhook_handle)
419 !
420 !-------------------------------------------------------------------------------------
421 END SUBROUTINE prep_snow_extern
subroutine allocate_gr_snow(TPSNOW, KLU, KPATCH)
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK)
subroutine prep_snow_extern(HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, PFIELD, OSNOW_IDEAL, KLAYER, KTEB_PATCH)
subroutine read_teb_patch(HFILEPGD, HFILEPGDTYPE, KTEB_PATCH)
subroutine put_on_all_vegtypes(KNI, KLAYER, KPATCH, KVEGTYPE, PFIELD_PATCH, PFIELD_VEGTYPE)
subroutine town_presence(HFILETYPE, OTEB)
subroutine read_gr_snow(HPROGRAM, HSURFTYPE, HPREFIX, KLU, KPATCH, TPSNOW, HDIR, KVERSION, KBUGFIX)
Definition: read_gr_snow.F90:6
subroutine prep_grid_extern(HFILETYPE, KLUOUT, HGRIDTYPE, HINTERP_TYPE, KNI)