SURFEX v8.1
General documentation of Surfex
read_gr_snow.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 read_gr_snow(HPROGRAM, HSURFTYPE, HPREFIX, &
7  KLU, KSIZE_P, KMASK_P, KPATCH, TPSNOW, HDIR, KVERSION, KBUGFIX, KNPATCH)
8 ! ##########################################################
9 !
10 !!**** *READ_GR_SNOW* - routine to read snow surface fields
11 !!
12 !! PURPOSE
13 !! -------
14 ! Initialize snow surface fields.
15 !
16 !!** METHOD
17 !! ------
18 !!
19 !!
20 !!
21 !! EXTERNAL
22 !! --------
23 !!
24 !!
25 !! IMPLICIT ARGUMENTS
26 !! ------------------
27 !!
28 !! REFERENCE
29 !! ---------
30 !!
31 !!
32 !!
33 !! AUTHOR
34 !! ------
35 !! V. Masson * Meteo France *
36 !!
37 !! MODIFICATIONS
38 !! -------------
39 !! Original 20/01/99
40 ! F.solmon 06/00 adaptation for patch
41 ! V.Masson 01/03 new version of ISBA
42 ! B. Decharme 2008 If no WSNOW, WSNOW = XUNDEF
43 !-----------------------------------------------------------------------------
44 !
45 !* 0. DECLARATIONS
46 !
48 !
50 !
51 USE modi_allocate_gr_snow
53 !
54 USE modd_surf_par, ONLY : xundef
56 !
57 USE yomhook ,ONLY : lhook, dr_hook
58 USE parkind1 ,ONLY : jprb
59 !
60 IMPLICIT NONE
61 !
62 !* 0.1 declarations of arguments
63 !
64  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
65  CHARACTER (LEN=*), INTENT(IN) :: HSURFTYPE ! generic name used for
66  ! snow characteristics
67  ! storage in file
68  CHARACTER (LEN=3), INTENT(IN) :: HPREFIX ! generic name for patch
69 ! ! identification
70 INTEGER, INTENT(IN) :: KLU ! horizontal size of snow var.
71 INTEGER, INTENT(IN) :: KSIZE_P
72 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK_P
73 INTEGER, INTENT(IN) :: KPATCH ! number of tiles
74 TYPE(surf_snow), INTENT(INOUT) :: TPSNOW ! snow characteristics
75  CHARACTER (LEN=1), INTENT(IN), OPTIONAL :: HDIR ! type of reading
76 ! ! HDIR = 'A' : entire field on All processors
77 ! ! HDIR = 'H' : distribution on each processor
78 !
79 INTEGER, INTENT(IN), OPTIONAL :: KVERSION
80 INTEGER, INTENT(IN), OPTIONAL :: KBUGFIX
81 INTEGER, INTENT(IN), OPTIONAL :: KNPATCH
82 !
83 !* 0.2 declarations of local variables
84 !
85  CHARACTER (LEN=7) :: YFMT0 ! format for writing
86  CHARACTER (LEN=100) :: YFMT ! format for writing
87  CHARACTER(LEN=16) :: YRECFM2
88  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
89  CHARACTER(LEN=4) :: YNLAYER !Format depending on the number of layers
90  CHARACTER(LEN=1) :: YDIR ! type of reading
91  CHARACTER(LEN=3) :: YPAT
92 !
93 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK
94 !
95 INTEGER :: IRESP, JI, JP ! Error code after redding
96 INTEGER :: ISURFTYPE_LEN, IPAT_LEN !
97 INTEGER :: JL ! loop counter
98 INTEGER :: IVERSION, IBUGFIX
99 INTEGER :: INPATCH
100 !
101 LOGICAL :: GVERSION, GDIM, GDIM2
102 LOGICAL :: GSNOW ! snow written in the file
103 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
104 !-------------------------------------------------------------------------------
105 !
106 IF (lhook) CALL dr_hook('READ_GR_SNOW_1',0,zhook_handle)
107 !
108 ydir = 'H'
109 IF (PRESENT(hdir)) ydir = hdir
110 !
111 inpatch = 1
112 IF (PRESENT(knpatch)) inpatch = knpatch
113 !
114 !-------------------------------------------------------------------------------
115 IF(PRESENT(kversion))THEN
116  iversion=kversion
117 ELSE
118  CALL read_surf(hprogram,'VERSION',iversion,iresp)
119 ENDIF
120 IF(PRESENT(kbugfix))THEN
121  ibugfix=kbugfix
122 ELSE
123  CALL read_surf(hprogram,'BUG',ibugfix,iresp)
124 ENDIF
125 !
126 gdim = (iversion>8 .OR. iversion==8 .AND. ibugfix>0)
127 gdim2 = gdim
128 IF (gdim) CALL read_surf(hprogram,'SPLIT_PATCH',gdim2,iresp)
129 !
130 !-------------------------------------------------------------------------------
131 !
132 gversion = (iversion>7 .OR. iversion==7 .AND. ibugfix>=3)
133 !
134 !* 1. Type of snow scheme
135 ! -------------------
136 !
137 isurftype_len=len_trim(hsurftype)
138 !
139 IF (kpatch<=1) THEN
140 
141  IF (iversion <=2 .OR. (iversion==3 .AND. ibugfix<=4)) THEN
142  WRITE(yfmt,'(A5,I1,A4)') '(A5,A',isurftype_len,',A5)'
143  WRITE(yrecfm2,yfmt) 'SNOW_',hsurftype,'_TYPE'
144  ELSE
145  IF (iversion<7 .OR. iversion==7 .AND. ibugfix<3) THEN
146  WRITE(yfmt,'(A5,I1,A4)') '(A3,A',isurftype_len,',A5)'
147  WRITE(yrecfm2,yfmt) 'SN_',hsurftype,'_TYPE'
148  ELSE
149  WRITE(yfmt,'(A5,I1,A4)') '(A3,A',isurftype_len,',A4)'
150  WRITE(yrecfm2,yfmt) 'SN_',hsurftype,'_TYP'
151  yrecfm2=adjustl(hprefix//yrecfm2)
152  ENDIF
153  END IF
154  !
155  CALL read_surf(hprogram,yrecfm2,tpsnow%SCHEME,iresp)
156  !
157  !* 2. Snow levels
158  ! -----------
159  !
160  !
161  IF (iversion <=2 .OR. (iversion==3 .AND. ibugfix<=4)) THEN
162  WRITE(yfmt,'(A5,I1,A4)') '(A5,A',isurftype_len,',A6)'
163  WRITE(yrecfm2,yfmt) 'SNOW_',hsurftype,'_LAYER'
164  ELSE
165  WRITE(yfmt,'(A5,I1,A4)') '(A3,A',isurftype_len,',A2)'
166  WRITE(yrecfm2,yfmt) 'SN_',hsurftype,'_N'
167  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) yrecfm2=adjustl(hprefix//yrecfm2)
168  END IF
169  !
170  CALL read_surf(hprogram,yrecfm2,tpsnow%NLAYER,iresp)
171  !
172 ENDIF
173 !
174 !* 2. Presence of snow fields in the file
175 ! -----------------------------------
176 !
177 IF (kpatch>0.AND.gdim2) THEN
178  WRITE(ypat,'(I2)') kpatch
179  ypat = "P"//adjustl(ypat)
180  ipat_len = len_trim(adjustl(ypat))
181 ELSE
182  ypat = " "
183  ipat_len=1
184 ENDIF
185 !
186 IF (iversion >6 .OR. (iversion==6 .AND. ibugfix>=1)) THEN
187  WRITE(yfmt,'(A5,I1,A2,I1,A1)') '(A3,A',isurftype_len,',A1,A',ipat_len,')'
188  WRITE(yrecfm,yfmt) 'SN_',adjustl(hsurftype(:len_trim(hsurftype))),adjustl(ypat(:len_trim(ypat)))
189  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) yrecfm=adjustl(hprefix//yrecfm)
190  CALL read_surf(hprogram,yrecfm,gsnow,iresp)
191 ELSE
192  IF (tpsnow%NLAYER==0) THEN
193  gsnow = .false.
194  IF (tpsnow%SCHEME=='D95' .OR. tpsnow%SCHEME=='1-L' .OR. tpsnow%SCHEME=='EBA') tpsnow%NLAYER=1
195  IF (tpsnow%SCHEME=='3-L' .OR. tpsnow%SCHEME=='CRO' ) tpsnow%NLAYER=3
196  ELSE
197  gsnow = .true.
198  END IF
199 END IF
200 !
201 IF (.NOT.gdim2) THEN
202  ypat = " "
203  ipat_len=1
204 ENDIF
205 !
206 !-------------------------------------------------------------------------------
207 !
208 !* 3. Allocations
209 ! -----------
210 !
211  CALL allocate_gr_snow(tpsnow,ksize_p)
212 !
213 IF (.NOT. gsnow) THEN
214  IF (lhook) CALL dr_hook('READ_GR_SNOW_1',1,zhook_handle)
215  RETURN
216 END IF
217 !-------------------------------------------------------------------------------
218 !
219 !* 4. Additional key
220 ! ---------------
221 !
222 IF (iversion >= 7 .AND. hsurftype=='VEG'.AND.kpatch==1) &
223  CALL read_surf(hprogram,'LSNOW_FRAC_T',lsnow_frac_tot,iresp)
224 !
225 !-------------------------------------------------------------------------------
226 !
227 !
228 !* 5. Snow reservoir
229 ! --------------
230 !
231 ALLOCATE(zwork(klu,inpatch))
232 !
233 IF (tpsnow%SCHEME=='1-L' .OR. tpsnow%SCHEME=='D95' .OR. tpsnow%SCHEME=='EBA' &
234  .OR. tpsnow%SCHEME=='3-L' .OR. tpsnow%SCHEME=='CRO') THEN
235  !
236  WRITE(yfmt0,'(A5,I1,A1)') ',A1,A',isurftype_len
237  !
238  IF (gversion) THEN
239  yfmt = '(A3'//yfmt0//')'
240  ELSE
241  yfmt = '(A5'//yfmt0//')'
242  ENDIF
243  CALL read_layers(gversion,tpsnow%NLAYER,ydir,hprefix,yfmt,"WSNOW",hsurftype,tpsnow%WSNOW)
244  CALL read_layers(gversion,tpsnow%NLAYER,ydir,hprefix,yfmt,"RSNOW",hsurftype,tpsnow%RHO)
245  !
246  !* 7. Snow temperature
247  ! ----------------
248  !
249  IF (tpsnow%SCHEME=='1-L') THEN
250  !
251  CALL read_layers(gversion,tpsnow%NLAYER,ydir,hprefix,yfmt,"TSNOW",hsurftype,tpsnow%T)
252  !
253  ENDIF
254  !
255  !* 8. Heat content
256  ! ------------
257  !
258  IF (tpsnow%SCHEME=='3-L' .OR. tpsnow%SCHEME=='CRO') THEN
259  !
260  CALL read_layers(gversion,tpsnow%NLAYER,ydir,hprefix,yfmt,"HSNOW",hsurftype,tpsnow%HEAT)
261  !
262  IF (tpsnow%SCHEME=='CRO') THEN
263  !
264  CALL read_layers(gversion,tpsnow%NLAYER,ydir,hprefix,yfmt,"SHIST",hsurftype,tpsnow%HIST)
265  !
266  !* 9. Snow Gran1
267  ! ------------
268  !
269  IF (gversion) THEN
270  yfmt = "(A2,A1"//yfmt0//')'
271  ELSE
272  yfmt = "(A5"//yfmt0//')'
273  ENDIF
274  yfmt = yfmt//ynlayer//')'
275  CALL read_layers(gversion,tpsnow%NLAYER,ydir,hprefix,yfmt,"SGRAN",hsurftype,tpsnow%GRAN1,hrec2="1")
276  CALL read_layers(gversion,tpsnow%NLAYER,ydir,hprefix,yfmt,"SGRAN",hsurftype,tpsnow%GRAN2,hrec2="2")
277  !
278  ENDIF
279  !
280  IF ((tpsnow%SCHEME=='3-L'.AND.iversion>=8) .OR. tpsnow%SCHEME=='CRO') THEN
281  !* 12. Age parameter
282  ! -------------------
283  !
284  IF (gversion) THEN
285  yfmt = "(A3"//yfmt0//')'
286  ELSE
287  yfmt = "(A4"//yfmt0//')'
288  ENDIF
289  yfmt = yfmt//ynlayer//')'
290  CALL read_layers(gversion,tpsnow%NLAYER,ydir,hprefix,yfmt,"SAGE",hsurftype,tpsnow%AGE)
291  !
292  ELSE
293  !
294  DO jl = 1,tpsnow%NLAYER
295  WHERE (tpsnow%WSNOW(:,1) >= 0.0)
296  tpsnow%AGE(:,jl) = 0.0
297  ELSEWHERE
298  tpsnow%AGE(:,jl) = xundef
299  ENDWHERE
300  ENDDO
301  !
302  END IF
303  !
304  ENDIF
305  !
306  WRITE(yfmt,'(A5,I1,A2,I1,A1)') '(A4,A',isurftype_len,',A',ipat_len,')'
307  WRITE(yrecfm,yfmt) 'ASN_',adjustl(hsurftype(:len_trim(hsurftype))),adjustl(ypat)
308  IF (gversion) yrecfm=adjustl(hprefix//yrecfm)
309  IF (gdim2) THEN
310  CALL read_surf(hprogram,yrecfm,zwork(:,1),iresp,hdir=ydir)
311  CALL pack_same_rank(kmask_p,zwork(:,1),tpsnow%ALB(:))
312  ELSE
313  CALL read_surf(hprogram,yrecfm,zwork,iresp,hdir=ydir)
314  CALL pack_same_rank(kmask_p,zwork(:,max(1,kpatch)),tpsnow%ALB(:))
315  ENDIF
316  !
317 ENDIF
318 !
319 DEALLOCATE(zwork)
320 !
321 IF (lhook) CALL dr_hook('READ_GR_SNOW_1',1,zhook_handle)
322 !
323 IF (tpsnow%SCHEME=='1-L' .OR. tpsnow%SCHEME=='D95' .OR. tpsnow%SCHEME=='EBA' &
324  .OR. tpsnow%SCHEME=='3-L' .OR. tpsnow%SCHEME=='CRO') THEN
325  !
326 !$OMP PARALLEL PRIVATE(ZHOOK_HANDLE_OMP)
327 IF (lhook) CALL dr_hook('READ_GR_SNOW_2',0,zhook_handle_omp)
328 !$OMP DO PRIVATE(JI,JL)
329  DO ji = 1,SIZE(tpsnow%WSNOW,1)
330  !
331  IF (tpsnow%WSNOW(ji,1) == 0.0 ) THEN
332  !
333  tpsnow%ALB(ji) = xundef
334  !
335  DO jl = 1,tpsnow%NLAYER
336  !
337  tpsnow%RHO(ji,jl)=xundef
338  IF (tpsnow%SCHEME=='1-L') THEN
339  tpsnow%T(ji,jl) = xundef
340  ELSEIF (tpsnow%SCHEME=='3-L' .OR. tpsnow%SCHEME=='CRO') THEN
341  tpsnow%HEAT(ji,jl) = xundef
342  IF (tpsnow%SCHEME=='CRO') THEN
343  tpsnow%HIST (ji,jl) = xundef
344  tpsnow%GRAN1(ji,jl) = xundef
345  tpsnow%GRAN2(ji,jl) = xundef
346  tpsnow%AGE (ji,jl) = xundef
347  ENDIF
348  ENDIF
349  !
350  ENDDO
351  ENDIF
352  ENDDO
353 !$OMP ENDDO
354 IF (lhook) CALL dr_hook('READ_GR_SNOW_2',1,zhook_handle_omp)
355 !$OMP END PARALLEL
356  !
357 ENDIF
358 !
359 !-------------------------------------------------------------------------------
360 !
361 CONTAINS
362 !
363 SUBROUTINE read_layers(OVERSION,KNL,HDIRIN,HPREF,HFMT,HREC,HSURF,PTAB,HREC2)
364 !
366 !
367 IMPLICIT NONE
368 !
369 LOGICAL, INTENT(IN) :: OVERSION
370 INTEGER, INTENT(IN) :: KNL
371  CHARACTER(LEN=*), INTENT(IN) :: HDIRIN
372  CHARACTER(LEN=*), INTENT(IN) :: HPREF
373  CHARACTER(LEN=*), INTENT(IN) :: HFMT
374  CHARACTER(LEN=*), INTENT(IN) :: HREC
375  CHARACTER(LEN=*), INTENT(IN) :: HSURF
376 REAL, DIMENSION(:,:), INTENT(OUT) :: PTAB
377  CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HREC2
378 !
379 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D
380  CHARACTER(LEN=1) :: YREC2
381  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
382 INTEGER :: JL, IRESP
383 !
384 IF (PRESENT(hrec2)) THEN
385  yrec2=trim(hrec2)
386 ELSE
387  yrec2=""
388 ENDIF
389 !
390 IF (yrec2/="") THEN
391  WRITE(yrecfm,hfmt) trim(hrec),trim(yrec2),'_',trim(hsurf)
392 ELSE
393  WRITE(yrecfm,hfmt) trim(hrec),'_',trim(hsurf)
394 ENDIF
395 IF (oversion) yrecfm=adjustl(trim(hpref)//yrecfm)
396 !
397 IF (gdim2) THEN
398  ALLOCATE(zwork3d(klu,SIZE(ptab,2),1))
399 ELSE
400  ALLOCATE(zwork3d(klu,SIZE(ptab,2),inpatch))
401 ENDIF
402 !
403  CALL read_surf_layers(hprogram,yrecfm,gdim2,zwork3d,iresp,kpatch=kpatch,hdir=ydir)
404 !
405 DO jl = 1,knl
406  IF (gdim2) THEN
407  CALL pack_same_rank(kmask_p,zwork3d(:,jl,1),ptab(:,jl))
408  ELSE
409  CALL pack_same_rank(kmask_p,zwork3d(:,jl,max(1,kpatch)),ptab(:,jl))
410  ENDIF
411 ENDDO
412 !
413 DEALLOCATE(zwork3d)
414 !
415 END SUBROUTINE read_layers
416 !
417 END SUBROUTINE read_gr_snow
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine read_surf_layers(HPROGRAM, HREC, ODIM, PFIELD, KRESP, HCOMMENT, HDIR, KPATCH)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine read_layers(OVERSION, KNL, HDIRIN, HPREF, HFMT, HREC, HSURF, PTAB, HR
subroutine allocate_gr_snow(TPSNOW, KLU)
logical lhook
Definition: yomhook.F90:15
logical lsnow_frac_tot
subroutine read_gr_snow(HPROGRAM, HSURFTYPE, HPREFIX, KLU, KSIZE_P, KMASK_P, KPATCH, TPSNOW, HDI
Definition: read_gr_snow.F90:8