SURFEX v8.1
General documentation of Surfex
prep_hor_snow_field.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_field (DTCO, G, U, GCP, HPROGRAM, &
7  HFILE,HFILETYPE, &
8  HFILEPGD,HFILEPGDTYPE, &
9  KLUOUT,OUNIF,HSNSURF,KPATCH, &
10  KTEB_PATCH, &
11  KL,TNPSNOW, TPTIME, &
12  PUNIF_WSNOW, PUNIF_RSNOW, &
13  PUNIF_TSNOW, PUNIF_LWCSNOW, &
14  PUNIF_ASNOW, OSNOW_IDEAL, &
15  PUNIF_SG1SNOW, PUNIF_SG2SNOW, &
16  PUNIF_HISTSNOW,PUNIF_AGESNOW, YDCTL, &
17  PVEGTYPE_PATCH, PPATCH, &
18  KSIZE_P, KR_P, PDEPTH )
19 ! #######################################################
20 !
21 !!**** *PREP_HOR_SNOW_FIELD* - reads, interpolates and prepares a snow field
22 !!
23 !! PURPOSE
24 !! -------
25 !!
26 !!** METHOD
27 !! ------
28 !!
29 !! REFERENCE
30 !! ---------
31 !!
32 !!
33 !! AUTHOR
34 !! ------
35 !! V. Masson
36 !!
37 !! MODIFICATIONS
38 !! -------------
39 !! Original 01/2004
40 !! P. Le Moigne 10/2005, Phasage Arome
41 !! B. Decharme 10/2013, Phasage Arpège-Climat
42 !! M. Lafaysse 11/2012, snow liquid water content
43 !! B. Decharme 04/2014, external init with FA files
44 !! new init for ES
45 !! P. Marguinaud10/2014, Support for a 2-part PREP
46 !!------------------------------------------------------------------
47 !
49 !
50 USE modd_sfx_grid_n, ONLY : grid_t
51 USE modd_surf_atm_n, ONLY : surf_atm_t
53 !
56 !
58 !
59 USE modd_grid_grib, ONLY : cinmodel
60 USE modd_surfex_mpi, ONLY : nrank, npio, ncomm, nproc
61 !
62 USE modd_csts, ONLY : xtt
63 USE modd_prep_snow, ONLY : xgrid_snow
64 USE modd_surf_par, ONLY : xundef
65 USE modd_data_cover_par, ONLY : nvegtype, nvt_snow
67 !
68 USE modd_snow_par, ONLY : xansmax
69 !
70 USE modi_prep_grib_grid
71 USE modi_prep_snow_grib
72 USE modi_prep_snow_unif
73 USE modi_prep_snow_extern
74 USE modi_prep_snow_buffer
75 USE modi_hor_interpol
76 USE modi_vegtype_grid_to_patch_grid
78 USE modi_vegtype_to_patch
80 USE modi_get_prep_interp
81 USE modi_put_on_all_vegtypes
82 !
83 USE mode_snow3l, ONLY : snow3lgrid
84 !
85 USE modi_abor1_sfx
86 !
87 USE yomhook ,ONLY : lhook, dr_hook
88 USE parkind1 ,ONLY : jprb
89 !
90 IMPLICIT NONE
91 !
92 #ifdef SFX_MPI
93 include "mpif.h"
94 #endif
95 !
96 !* 0.1 declarations of arguments
97 !
98 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
99 !
100 TYPE(grid_t), INTENT(INOUT) :: G
101 TYPE(surf_atm_t), INTENT(INOUT) :: U
102 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
103 !
104 type(prep_ctl), INTENT (INOUT) :: ydctl
105 !
106  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
107  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! file name
108  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! file type
109  CHARACTER(LEN=28), INTENT(IN) :: HFILEPGD ! file name
110  CHARACTER(LEN=6), INTENT(IN) :: HFILEPGDTYPE ! file type
111 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing
112 LOGICAL, INTENT(IN) :: OUNIF ! flag for prescribed uniform field
113  CHARACTER(LEN=10) :: HSNSURF ! type of field
114 INTEGER, INTENT(IN) :: KPATCH ! patch number for output scheme
115 INTEGER, INTENT(IN) :: KTEB_PATCH
116 TYPE(nsurf_snow), INTENT(INOUT) :: TNPSNOW ! snow fields
117 INTEGER, INTENT(IN) :: KL ! number of points
118 TYPE(date_time), INTENT(IN) :: TPTIME ! date and time
119 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_WSNOW ! prescribed snow content (kg/m2)
120 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_RSNOW ! prescribed density (kg/m3)
121 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_TSNOW ! prescribed temperature (K)
122 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_LWCSNOW ! prescribed snow liquid water content (kg/m3)
123 REAL, INTENT(IN) :: PUNIF_ASNOW ! prescribed albedo (-)
124 LOGICAL, INTENT(INOUT) :: OSNOW_IDEAL
125 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_SG1SNOW !
126 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_SG2SNOW !
127 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_HISTSNOW !
128 REAL, DIMENSION(:), INTENT(IN) :: PUNIF_AGESNOW !
129 !
130 REAL,DIMENSION(:,:,:), INTENT(IN) :: PVEGTYPE_PATCH ! fraction of each vegtype per patch
131 REAL,DIMENSION(:,:), INTENT(IN) :: PPATCH ! fraction of each patch
132 INTEGER, DIMENSION(:), INTENT(IN) :: KSIZE_P
133 INTEGER,DIMENSION(:,:), INTENT(IN) :: KR_P
134 !
135 REAL,DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PDEPTH ! thickness of each snow layer
136 !
137 !* 0.2 declarations of local variables
138 !
139 TYPE fout
140  REAL, DIMENSION(:,:), ALLOCATABLE :: ZOUT
141 END TYPE fout
142 TYPE nfout
143  TYPE(fout), DIMENSION(:), ALLOCATABLE :: AL
144 END TYPE nfout
145 type(nfout) :: zw
146 TYPE(surf_snow), POINTER :: SK
147 !
148 REAL, POINTER, DIMENSION(:,:,:) :: ZFIELDIN ! field to interpolate horizontally
149 REAL, POINTER, DIMENSION(:,:,:) :: ZFIELDOUTP ! field interpolated horizontally
150 REAL, POINTER, DIMENSION(:,:,:) :: ZFIELDOUTV !
151 REAL, ALLOCATABLE, DIMENSION(:) :: ZD ! snow depth (x, kpatch)
152 REAL, ALLOCATABLE, DIMENSION(:,:) :: ZTEMP
153 REAL, ALLOCATABLE, DIMENSION(:,:) :: ZWLIQ ! liquid water snow pack content
154 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZGRID ! grid array (x, output snow grid, kpatch)
155 !
156 REAL, DIMENSION(:,:), ALLOCATABLE :: ZDEPTH, ZPATCH
157 !
158 type(date_time) :: tztime_grib ! current date and time
159 INTEGER :: JP, IP ! loop on patches
160 INTEGER :: JL ! loop on layers
161 INTEGER :: INFOMPI, INL, INP, ISNOW_NLAYER, IMASK, JI
162 REAL(KIND=JPRB) :: ZHOOK_HANDLE
163 !----------------------------------------------------------------------------
164 !
165 !* 1. Does the field exist?
166 !
167 !
168 IF (lhook) CALL dr_hook('PREP_HOR_SNOW_FIELD',0,zhook_handle)
169 !
170 isnow_nlayer = tnpsnow%AL(1)%NLAYER
171 !
172 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
173 !
174 !* 2. Reading of input configuration (Grid and interpolation type)
175 !
176 NULLIFY (zfieldin, zfieldoutp, zfieldoutv)
177 !
178 IF (ydctl%LPART1) THEN
179  IF (ounif) THEN
180  CALL prep_snow_unif(kluout,hsnsurf,zfieldin, tptime, osnow_ideal, &
181  punif_wsnow, punif_rsnow, punif_tsnow, &
182  punif_lwcsnow, punif_asnow, punif_sg1snow, &
183  punif_sg2snow, punif_histsnow, punif_agesnow, &
184  isnow_nlayer )
185  ELSE IF (hfiletype=='GRIB ') THEN
186  CALL prep_grib_grid(hfile,kluout,cinmodel,cingrid_type,cinterp_type,tztime_grib)
187  IF (nrank==npio) CALL prep_snow_grib(hprogram,hsnsurf,hfile,kluout,isnow_nlayer,zfieldin)
188  ELSE IF (hfiletype=='MESONH' .OR. hfiletype=='ASCII ' .OR. hfiletype=='LFI '&
189  .OR. hfiletype=='FA '.OR. hfiletype=='AROME '.OR.hfiletype=='NC ') THEN
190  CALL prep_snow_extern(gcp,hprogram,hsnsurf,hfile,hfiletype,hfilepgd,hfilepgdtype, &
191  kluout,zfieldin,osnow_ideal,isnow_nlayer,kteb_patch)
192  ELSE IF (hfiletype=='BUFFER') THEN
193  CALL prep_snow_buffer(g, u, hprogram,hsnsurf,kluout,isnow_nlayer,zfieldin)
194  ELSE
195  CALL abor1_sfx('PREP_HOR_SNOW_FIELD: data file type not supported : '//hfiletype)
196  END IF
197 ENDIF
198 !
199 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
200 !
201 !* 3. Horizontal interpolation
202 !
203  CALL prep_ctl_int_part2 (ydctl, hsnsurf, 'SNOW', cmask, zfieldin)
204 !
205 IF (ydctl%LPART3) THEN
206 !
207  IF (nrank==npio) THEN
208  inl = SIZE(zfieldin,2)
209  inp = SIZE(zfieldin,3)
210  ELSEIF (.NOT.ASSOCIATED(zfieldin)) THEN
211  ALLOCATE(zfieldin(0,0,0))
212  ENDIF
213 !
214  IF (nproc>1) THEN
215 #ifdef SFX_MPI
216  CALL mpi_bcast(inl,kind(inl)/4,mpi_integer,npio,ncomm,infompi)
217  CALL mpi_bcast(inp,kind(inp)/4,mpi_integer,npio,ncomm,infompi)
218 #endif
219  ENDIF
220 !
221  ALLOCATE(zfieldoutp(kl,inl,inp))
222 !
223 ! ZPATCH is the array of output patches put on the input patches
224  ALLOCATE(zpatch(kl,inp))
225  zpatch(:,:) = 0.
226 !
227 ! if the number of input patches is NVEGTYPE
228  IF (inp==nvegtype) THEN
229  DO jp = 1,nvegtype
230  ! each vegtype takes the output contribution of the patch it is in
231  ip = vegtype_to_patch(jp,kpatch)
232  zpatch(:,jp) = pvegtype_patch(:,jp,ip)
233  ENDDO
234  ENDIF
235 !
236  CALL get_prep_interp(inp,kpatch,zpatch,ppatch,zpatch,kr_p)
237 !
238 ! the same for depth that is defined on the output patches
239  IF (PRESENT(pdepth)) THEN
240  !
241  ALLOCATE(zdepth(kl,inp))
242  zdepth(:,:) = 0.
243  !
244  IF (inp==nvegtype) THEN
245  DO jp = 1,nvegtype
246  ip = vegtype_to_patch(jp,kpatch)
247  zdepth(:,jp) = pdepth(:,1,ip)
248  ENDDO
249  ENDIF
250  !
251  CALL get_prep_interp(inp,kpatch,zdepth,pdepth(:,1,:),zdepth,kr_p)
252  !
253  ENDIF
254 !
255  DO jp = 1, inp
256  ! ZDEPTH and ZPATCH are defined on the size on the patch for the snow: use of
257  ! the mask
258  IF (PRESENT(pdepth)) THEN
259  linterp(:) = ( zdepth(:,jp) /= 0. .AND. zdepth(:,jp) /= xundef )
260  ENDIF
261  linterp(:) = (linterp(:) .AND. zpatch(:,jp)>0.)
262  !* horizontal interpolation
263  CALL hor_interpol(dtco, u, gcp, kluout,zfieldin(:,:,jp),zfieldoutp(:,:,jp))
264  !
265  linterp(:) = .true.
266  END DO
267  !
268  DEALLOCATE(zfieldin, zpatch )
269  IF (PRESENT(pdepth)) DEALLOCATE(zdepth)
270  !
271 ENDIF
272 !
273 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
274 !
275 !* 4. Transformation from vegtype grid to patch grid, if any
276 !
277  CALL prep_ctl_int_part4 (ydctl, hsnsurf, 'SNOW', cmask, zfieldin, zfieldoutp)
278 
279 IF (ydctl%LPART5) THEN
280 !
281  ALLOCATE(zw%AL(kpatch))
282  !
283  IF (kpatch/=inp.and.inp/=1) THEN
284  !
285  ALLOCATE(zfieldoutv(kl,inl,nvegtype))
286  CALL put_on_all_vegtypes(kl,inl,inp,nvegtype,zfieldoutp,zfieldoutv)
287  !
288  !* 6. Transformation from vegtype grid to patch grid
289  !
290  DEALLOCATE(zfieldoutp)
291  !
292  DO jp = 1,kpatch
293  !
294  ALLOCATE(zw%AL(jp)%ZOUT(ksize_p(jp),inl))
295  !
296  CALL vegtype_grid_to_patch_grid(jp, kpatch, pvegtype_patch(1:ksize_p(jp),:,jp), &
297  ppatch(1:ksize_p(jp),jp), kr_p(1:ksize_p(jp),jp), &
298  zfieldoutv, zw%AL(jp)%ZOUT)
299  ENDDO
300  !
301  DEALLOCATE(zfieldoutv)
302  !
303  ELSEIF (inp==1) THEN
304  !
305  DO jp = 1,kpatch
306  !
307  ALLOCATE(zw%AL(jp)%ZOUT(ksize_p(jp),inl))
308  !
309  CALL pack_same_rank(kr_p(1:ksize_p(jp),jp),zfieldoutp(:,:,1),zw%AL(jp)%ZOUT)
310  !
311  ENDDO
312  !
313  ELSE
314  !
315  DO jp = 1,kpatch
316  !
317  ALLOCATE(zw%AL(jp)%ZOUT(ksize_p(jp),inl))
318  !
319  CALL pack_same_rank(kr_p(1:ksize_p(jp),jp),zfieldoutp(:,:,jp),zw%AL(jp)%ZOUT)
320  !
321  ENDDO
322  !
323  DEALLOCATE(zfieldoutp)
324  !
325  ENDIF
326  !
327 
328  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
329  !
330  !* 5. Defines normalized output grid, if depths of snow layers are present
331  !
332  IF ( PRESENT(pdepth) .AND. .NOT.osnow_ideal ) THEN
333  !
334  ALLOCATE(zd(SIZE(pdepth,1)))
335  !
336  ALLOCATE(zgrid(SIZE(pdepth,1),isnow_nlayer,kpatch))
337  DO jp = 1,kpatch
338  !* total snow depth
339  !
340  zd(:)=0.
341  DO jl = 1,isnow_nlayer
342  WHERE (pdepth(1:ksize_p(jp),jl,jp)/=xundef) zd(1:ksize_p(jp)) = zd(1:ksize_p(jp)) + pdepth(1:ksize_p(jp),jl,jp)
343  END DO
344  !
345  !* grid at center of layers
346  !
347  zgrid(1:ksize_p(jp),1,jp) = pdepth(1:ksize_p(jp),1,jp)
348  IF(isnow_nlayer>1) THEN
349  DO jl = 2,isnow_nlayer
350  zgrid(1:ksize_p(jp),jl,jp) = zgrid(1:ksize_p(jp),jl-1,jp) + pdepth(1:ksize_p(jp),jl,jp)
351  ENDDO
352  ENDIF
353  !
354  ! * normalized grid
355  !
356  DO jl=1,isnow_nlayer
357  WHERE (zd(1:ksize_p(jp))/=0.)
358  zgrid(1:ksize_p(jp),jl,jp) = zgrid(1:ksize_p(jp),jl,jp) / zd(1:ksize_p(jp))
359  ELSEWHERE
360  zgrid(1:ksize_p(jp),jl,jp) = 1.0
361  END WHERE
362  END DO
363  !
364  ENDDO
365  !
366  DEALLOCATE(zd)
367  !
368  ELSEIF (.NOT.osnow_ideal) THEN
369  IF (hsnsurf(1:3)=='RHO' .OR. hsnsurf(1:3)=='HEA') THEN
370  WRITE(kluout,*) 'when interpolation profiles of snow pack quantities,'
371  WRITE(kluout,*) 'depth of snow layers must be given'
372  CALL abor1_sfx('PREP_HOR_SNOW_FIELD: DEPTH OF SNOW LAYERS NEEDED')
373  END IF
374  END IF
375  !
376  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
377  !
378  !* 6. Return to historical variable
379  !
380  DO jp = 1,kpatch
381  !
382  sk => tnpsnow%AL(jp)
383  !
384  SELECT CASE (hsnsurf(1:3))
385  !
386  CASE('WWW') ! total snow content
387  !
388  IF (osnow_ideal) THEN
389  sk%WSNOW(:,:) = zw%AL(jp)%ZOUT(:,:)
390  ELSE
391  DO jl=1,SIZE(sk%WSNOW,2)
392  sk%WSNOW(:,jl) = zw%AL(jp)%ZOUT(:,1)
393  ENDDO
394  ENDIF
395  !
396  DO jl = 1,isnow_nlayer
397  WHERE(ppatch(1:ksize_p(jp),jp)==0.)
398  sk%WSNOW(:,jl) = xundef
399  END WHERE
400  ENDDO
401  !
402  CASE('DEP') ! snow thickness
403  !
404  IF (osnow_ideal) THEN
405  sk%DEPTH(:,:) = zw%AL(jp)%ZOUT(:,:)
406  ELSE
407  CALL snow3lgrid(sk%DEPTH(:,:),zw%AL(jp)%ZOUT(:,1))
408  !DO JL=1,SIZE(SK%DEPTH,2)
409  ! SK%DEPTH(:,JL) = ZW%AL(JP)%ZOUT(:,1)
410  !ENDDO
411  ENDIF
412  !
413  DO jl = 1,isnow_nlayer
414  WHERE(ppatch(1:ksize_p(jp),jp)==0.)
415  sk%DEPTH(:,jl) = xundef
416  END WHERE
417  ENDDO
418  !
419  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
420  !
421  CASE('RHO')
422  !
423  IF (osnow_ideal) THEN
424  sk%RHO(:,:) = zw%AL(jp)%ZOUT(:,:)
425  ELSEIF(inl==1) THEN
426  DO jl = 1,isnow_nlayer
427  sk%RHO(:,jl) = zw%AL(jp)%ZOUT(:,1)
428  ENDDO
429  ELSE
430  !* interpolation on snow levels
431  CALL init_from_ref_grid(xgrid_snow,zw%AL(jp)%ZOUT,zgrid(1:ksize_p(jp),:,jp),sk%RHO)
432  ENDIF
433  !
434  !* mask for areas where there is no snow
435  DO jl=1,isnow_nlayer
436  WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==xundef) sk%RHO(:,jl) = xundef
437  END DO
438  !
439  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
440  !
441  CASE('ALB')
442  !
443  sk%ALB(:) = zw%AL(jp)%ZOUT(:,1)
444  !
445  !* mask for areas where there is no snow
446  WHERE(pdepth(1:ksize_p(jp),1,jp)==0. .OR. pdepth(1:ksize_p(jp),1,jp)==xundef) sk%ALB(:) = xundef
447  !
448  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
449  !
450  CASE('HEA')
451  !
452  IF (sk%SCHEME=='3-L' .OR. sk%SCHEME=='CRO') THEN
453  !
454  ALLOCATE(ztemp(ksize_p(jp),isnow_nlayer))
455  ALLOCATE(zwliq(ksize_p(jp),isnow_nlayer))
456  zwliq(:,:) = 0.0
457  !
458  IF (osnow_ideal) THEN
459  ztemp(:,:) = zw%AL(jp)%ZOUT(:,:)
460  ELSEIF (inl==1) THEN
461  DO jl = 1,isnow_nlayer
462  ztemp(:,jl) = zw%AL(jp)%ZOUT(:,1)
463  ENDDO
464  ELSE
465  !* interpolation of heat on snow levels
466  CALL init_from_ref_grid(xgrid_snow,zw%AL(jp)%ZOUT,zgrid(1:ksize_p(jp),:,jp),ztemp)
467  ENDIF
468  !
469  CALL snow_t_wliq_to_heat(sk%HEAT,sk%RHO,ztemp,zwliq)
470  DEALLOCATE(ztemp)
471  DEALLOCATE(zwliq)
472  !
473  !* mask for areas where there is no snow
474  DO jl=1,isnow_nlayer
475  WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==xundef) sk%HEAT(:,jl) = xundef
476  END DO
477  !
478  ELSE IF (sk%SCHEME=='1-L') THEN
479  !* interpolation of heat on snow levels
480  !
481  IF (osnow_ideal) THEN
482  sk%T(:,:) = zw%AL(jp)%ZOUT(:,:)
483  ELSEIF(inl==1) THEN
484  DO jl = 1,isnow_nlayer
485  sk%T(:,jl) = zw%AL(jp)%ZOUT(:,1)
486  ENDDO
487  ELSE
488  CALL init_from_ref_grid(xgrid_snow,zw%AL(jp)%ZOUT,zgrid(1:ksize_p(jp),:,jp),sk%T)
489  ENDIF
490  !
491  !* transformation from heat to temperature
492  WHERE (sk%T>xtt) sk%T = xtt
493  !
494  !* mask for areas where there is no snow
495  DO jl=1,isnow_nlayer
496  WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==xundef) sk%T(:,jl) = xundef
497  END DO
498  !
499  END IF
500  !
501  !
502  CASE('SG1')
503  !
504  IF (osnow_ideal) THEN
505  sk%GRAN1(:,:) = zw%AL(jp)%ZOUT(:,:)
506  ELSEIF(inl==1) THEN
507  DO jl = 1,isnow_nlayer
508  sk%GRAN1(:,jl) = zw%AL(jp)%ZOUT(:,1)
509  ENDDO
510  ELSE
511  !* interpolation of heat on snow levels
512  CALL init_from_ref_grid(xgrid_snow,zw%AL(jp)%ZOUT,zgrid(1:ksize_p(jp),:,jp),sk%GRAN1)
513  ENDIF
514  !
515  !* mask for areas where there is no snow
516  DO jl=1,isnow_nlayer
517  WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==xundef) sk%GRAN1(:,jl) = xundef
518  END DO
519  !
520  CASE('SG2')
521  !
522  IF (osnow_ideal) THEN
523  sk%GRAN2(:,:) = zw%AL(jp)%ZOUT(:,:)
524  ELSEIF(SIZE(zw%AL(jp)%ZOUT,2)==1) THEN
525  DO jl = 1,isnow_nlayer
526  sk%GRAN2(:,jl) = zw%AL(jp)%ZOUT(:,1)
527  ENDDO
528  ELSE
529  !* interpolation of heat on snow levels
530  CALL init_from_ref_grid(xgrid_snow,zw%AL(jp)%ZOUT,zgrid(1:ksize_p(jp),:,jp),sk%GRAN2)
531  ENDIF
532  !
533  !* mask for areas where there is no snow
534  DO jl=1,isnow_nlayer
535  WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==xundef) sk%GRAN2(:,jl) = xundef
536  END DO
537  !
538  CASE('HIS')
539  !
540  IF (osnow_ideal) THEN
541  sk%HIST(:,:) = zw%AL(jp)%ZOUT(:,:)
542  ELSEIF(inl==1) THEN
543  DO jl = 1,isnow_nlayer
544  sk%HIST(:,jl) = zw%AL(jp)%ZOUT(:,1)
545  ENDDO
546  ELSE
547  !* interpolation of heat on snow levels
548  CALL init_from_ref_grid(xgrid_snow,zw%AL(jp)%ZOUT,zgrid(1:ksize_p(jp),:,jp),sk%HIST)
549  ENDIF
550  !
551  !* mask for areas where there is no snow
552  DO jl=1,isnow_nlayer
553  WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==xundef) sk%HIST(:,jl) = xundef
554  END DO
555  !
556  CASE('AGE')
557  !
558  IF (sk%SCHEME=='3-L'.AND.(.NOT.osnow_ideal).AND.(.NOT.ounif))THEN
559  sk%AGE(:,:) = 0.0
560  ELSE
561  IF (osnow_ideal) THEN
562  sk%AGE(:,:) = zw%AL(jp)%ZOUT(:,:)
563  ELSEIF(inl==1) THEN
564  DO jl = 1,isnow_nlayer
565  sk%AGE(:,jl) = zw%AL(jp)%ZOUT(:,1)
566  ENDDO
567  ELSE
568  !* interpolation of heat on snow levels
569  CALL init_from_ref_grid(xgrid_snow,zw%AL(jp)%ZOUT,zgrid(1:ksize_p(jp),:,jp),sk%AGE)
570  ENDIF
571  ENDIF
572  !
573  !* mask for areas where there is no snow
574  DO jl=1,isnow_nlayer
575  WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==xundef) sk%AGE(:,jl) = xundef
576  END DO
577  !
578  END SELECT
579  !
580  ENDDO
581 !
582 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
583 !
584 !* 7. Deallocations
585 !
586  IF (PRESENT(pdepth) .AND. .NOT.osnow_ideal) DEALLOCATE(zgrid )
587  DO jp =1,kpatch
588  DEALLOCATE(zw%AL(jp)%ZOUT)
589  ENDDO
590  DEALLOCATE(zw%AL)
591 !
592 ENDIF
593 !
594 IF (lhook) CALL dr_hook('PREP_HOR_SNOW_FIELD',1,zhook_handle)
595 !
596 !-------------------------------------------------------------------------------------
597 !
598 CONTAINS
599 !
600 !-------------------------------------------------------------------------------------
601 !
602 SUBROUTINE init_from_ref_grid(PGRID1,PT1,PD2,PT2)
603 !
605 !
606 REAL, DIMENSION(:,:), INTENT(IN) :: PT1 ! variable profile
607 REAL, DIMENSION(:), INTENT(IN) :: PGRID1 ! normalized grid
608 REAL, DIMENSION(:,:), INTENT(IN) :: PD2 ! output layer thickness
609 REAL, DIMENSION(:,:), INTENT(OUT) :: PT2 ! variable profile
610 !
611 INTEGER :: JL, JL1 ! loop counter
612 REAL, DIMENSION(SIZE(PT1,1),SIZE(PGRID1)) :: ZT1
613 REAL, DIMENSION(SIZE(PT1,1),SIZE(PGRID1)) :: ZD1 ! input grid
614 REAL, DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: ZD2 ! output grid
615 INTEGER :: JP ! loop on patches
616 REAL(KIND=JPRB) :: ZHOOK_HANDLE
617 !
618 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
619 !
620 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',0,zhook_handle)
621 !
622 zd2(:,:) = 0.
623 DO jl=1,SIZE(zd2,2)
624  zd2(:,jl) = pd2(:,jl)
625 END DO
626 !
627 DO jl=1,SIZE(pgrid1)
628  jl1 = min(jl,SIZE(pt1,2))
629  zt1(:,jl) = pt1(:,jl1)
630  zd1(:,jl) = pgrid1(jl)
631 END DO
632 !
633  CALL interp_grid_nat(zd1,zt1(:,:),zd2,pt2(:,:))
634 !
635 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',1,zhook_handle)
636 !
637 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
638 END SUBROUTINE init_from_ref_grid
639 !-------------------------------------------------------------------------------------
640 !
641 END SUBROUTINE prep_hor_snow_field
subroutine prep_grib_grid(HGRIB, KLUOUT, HINMODEL, HGRIDTYPE, HINTERP_
character(len=10) cingrid_type
Definition: modd_prep.F90:39
subroutine init_from_ref_grid(PGRID1, PT1, PD2, PT2)
character(len=6) cmask
Definition: modd_prep.F90:41
character(len=6) cinterp_type
Definition: modd_prep.F90:40
subroutine get_prep_interp(KNP_IN, KNP_OUT, PVEGTYPE, PPATCH_IN, PPATCH_OUT, KMASK_IN)
subroutine put_on_all_vegtypes(KNI, KLAYER, KPATCH, KVEGTYPE, PFIELD_P
subroutine vegtype_grid_to_patch_grid(KPATCH, KNPATCH, PVEGTYPE_PATCH, PPATCH, KMASK, PFIELDOUT, PW)
integer function vegtype_to_patch(IVEGTYPE, INPATCH)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
character(len=6) cinmodel
subroutine prep_snow_grib(HPROGRAM, HSURF, HFILE, KLUOUT, KLAYER, PFIELD)
logical, dimension(:), allocatable linterp
Definition: modd_prep.F90:43
subroutine hor_interpol(DTCO, U, GCP, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:7
subroutine prep_snow_buffer(G, U, HPROGRAM, HSURF, KLUOUT, KLAYER, PFIELD)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine prep_snow_unif(KLUOUT, HSURF, PFIELD, TPTIME, OSNOW_IDEAL, PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_LWCSNOW, PUNIF_ASNOW, PUNIF_SG1SNOW, PUNIF_SG2SNOW, PUNIF_HISTSNOW, PUNIF_AGESNOW, KLAYER)
logical lhook
Definition: yomhook.F90:15
real, save xtt
Definition: modd_csts.F90:66
subroutine prep_hor_snow_field(DTCO, G, U, GCP, HPROGRAM, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, OUNIF, HSNSURF, KPATCH, KTEB_PATCH, KL, TNPSNOW, TPTIME, PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_LWCSNOW, PUNIF_ASNOW, OSNOW_IDEAL, PUNIF_SG1SNOW, PUNIF_SG2SNOW, PUNIF_HISTSNOW, PUNIF_AGESNOW, YDCTL, PVEGTYPE_PATCH, PPATCH, KSIZE_P, KR_P, PDEPTH)
subroutine prep_snow_extern(GCP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, PFIELD, OSNOW_IDEAL, KLAYER, KTEB_PATCH)
real, dimension(ngrid_level) xgrid_snow