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