SURFEX v8.1
General documentation of Surfex
prep_hor_teb_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_teb_field (B, BOP, DTCO, U, GCP, G, T, TOP, &
7  HPROGRAM,HSURF,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,KPATCH,YDCTL)
8 ! #################################################################################
9 !
10 !
11 !!**** *PREP_HOR_TEB_FIELD* - reads, interpolates and prepares a TEB field
12 !!
13 !! PURPOSE
14 !! -------
15 !
16 !!** METHOD
17 !! ------
18 !!
19 !! REFERENCE
20 !! ---------
21 !!
22 !!
23 !! AUTHOR
24 !! ------
25 !! V. Masson
26 !!
27 !! MODIFICATIONS
28 !! -------------
29 !! Original 01/2004
30 !! P. Le Moigne 10/2005, Phasage Arome
31 !! P. Marguinaud10/2014, Support for a 2-part PREP
32 !!------------------------------------------------------------------
33 !
34 USE modd_bem_n, ONLY : bem_t
37 USE modd_surf_atm_n, ONLY : surf_atm_t
39 USE modd_sfx_grid_n, ONLY : grid_t
40 USE modd_teb_n, ONLY : teb_t
42 !
45 USE modd_surfex_mpi, ONLY : nrank, npio, ncomm, nproc
46 USE modd_grid_grib, ONLY : cinmodel
48 USE modd_prep_teb, ONLY : xgrid_roof, xgrid_road, xgrid_wall, xgrid_floor, lsnow_ideal_teb, &
49  xwsnow_roof, xrsnow_roof, xtsnow_roof, xlwcsnow_roof, xasnow_roof, &
50  xwsnow_road, xrsnow_road, xtsnow_road, xlwcsnow_road, xasnow_road, &
51  xhui_bld, xhui_bld_def
52 !
53 USE modd_csts, ONLY: xg, xp00
54 USE modd_surf_par, ONLY: xundef
55 !
57 !
58 USE mode_thermos
59 !
60 USE modi_prep_grib_grid
61 USE modi_read_prep_teb_conf
62 USE modi_read_prep_teb_snow
63 USE modi_prep_teb_grib
64 USE modi_prep_teb_unif
65 USE modi_prep_teb_buffer
66 USE modi_hor_interpol
67 USE modi_prep_hor_snow_fields
68 USE modi_get_luout
69 USE modi_prep_teb_extern
70 USE modi_allocate_gr_snow
71 !
72 USE yomhook ,ONLY : lhook, dr_hook
73 USE parkind1 ,ONLY : jprb
74 !
75 USE modi_abor1_sfx
76 IMPLICIT NONE
77 !
78 #ifdef SFX_MPI
79 include "mpif.h"
80 #endif
81 !
82 !* 0.1 declarations of arguments
83 !
84 !
85 TYPE(bem_t), INTENT(INOUT) :: B
86 TYPE(bem_options_t), INTENT(INOUT) :: BOP
87 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
88 TYPE(surf_atm_t), INTENT(INOUT) :: U
89 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
90 TYPE(grid_t), INTENT(INOUT) :: G
91 TYPE(teb_t), INTENT(INOUT) :: T
92 TYPE(teb_options_t), INTENT(INOUT) :: TOP
93 type(prep_ctl), INTENT(INOUT) :: ydctl
94 !
95  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
96  CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field
97  CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! name of the Atmospheric file
98  CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! type of the Atmospheric file
99  CHARACTER(LEN=28), INTENT(IN) :: HPGDFILE ! name of the Atmospheric file
100  CHARACTER(LEN=6), INTENT(IN) :: HPGDFILETYPE! type of the Atmospheric file
101 !
102 INTEGER, INTENT(IN) :: KPATCH
103 !
104 !* 0.2 declarations of local variables
105 !
106 TYPE(nsurf_snow) :: TNPSNOW
107 !
108  CHARACTER(LEN=6) :: YFILETYPE ! type of input file
109  CHARACTER(LEN=28) :: YFILE ! name of file
110  CHARACTER(LEN=6) :: YFILEPGDTYPE ! type of input file
111  CHARACTER(LEN=28) :: YFILEPGD ! name of file
112 REAL, DIMENSION(:), ALLOCATABLE :: ZSG1SNOW, ZSG2SNOW, ZHISTSNOW, ZAGESNOW
113 REAL, POINTER, DIMENSION(:,:) :: ZFIELDIN ! field to interpolate horizontally
114 REAL, POINTER, DIMENSION(:,:) :: ZFIELDOUT ! field interpolated horizontally
115 REAL, ALLOCATABLE, DIMENSION(:) :: ZPS !surface pressure
116 REAL, PARAMETER :: ZRHOA=1.19 ! volumic mass of air at 20C and 1000hPa
117 INTEGER :: ILUOUT ! output listing logical unit
118 INTEGER :: INFOMPI, INL
119 !
120 type(date_time) :: tztime_grib ! current date and time
121 LOGICAL :: GUNIF ! flag for prescribed uniform field
122 REAL(KIND=JPRB) :: ZHOOK_HANDLE
123 !-------------------------------------------------------------------------------------
124 !
125 !
126 !* 1. Reading of input file name and type
127 !
128 IF (lhook) CALL dr_hook('PREP_HOR_TEB_FIELD',0,zhook_handle)
129  CALL get_luout(hprogram,iluout)
130 !
131  CALL read_prep_teb_conf(hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,&
132  hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,iluout,gunif)
133 !
134 cmask = 'TOWN'
135 !
136 !-------------------------------------------------------------------------------------
137 !
138 !* 2. Snow variables case?
139 !
140 IF (hsurf=='SN_ROOF') THEN
141  CALL read_prep_teb_snow(hprogram,t%TSNOW_ROOF%SCHEME,t%TSNOW_ROOF%NLAYER,&
142  t%TSNOW_ROAD%SCHEME,t%TSNOW_ROAD%NLAYER,&
143  yfile,yfiletype,yfilepgd,yfilepgdtype)
144  IF (len_trim(yfile)>0 .AND. len_trim(yfiletype)>0) gunif = .false.
145  ALLOCATE(zsg1snow(SIZE(xwsnow_roof)))
146  ALLOCATE(zsg2snow(SIZE(xwsnow_roof)))
147  ALLOCATE(zhistsnow(SIZE(xwsnow_roof)))
148  ALLOCATE(zagesnow(SIZE(xwsnow_roof)))
149  ALLOCATE(tnpsnow%AL(1))
150  tnpsnow%AL(1)%SCHEME = t%TSNOW_ROOF%SCHEME
151  tnpsnow%AL(1)%NLAYER = t%TSNOW_ROOF%NLAYER
152  CALL prep_hor_snow_fields(dtco, g, u, gcp, &
153  hprogram,hsurf, &
154  yfile,yfiletype, &
155  yfilepgd, yfilepgdtype, &
156  iluout,gunif,1,kpatch, &
157  SIZE(g%XLAT),tnpsnow, top%TTIME,&
158  xwsnow_roof, xrsnow_roof, &
159  xtsnow_roof, xlwcsnow_roof, &
160  xasnow_roof, &
161  lsnow_ideal_teb, zsg1snow, &
162  zsg2snow, zhistsnow, zagesnow, ydctl)
163 
164  CALL allocate_gr_snow(t%TSNOW_ROOF,SIZE(g%XLAT))
165  t%TSNOW_ROOF%WSNOW = tnpsnow%AL(1)%WSNOW
166  t%TSNOW_ROOF%RHO = tnpsnow%AL(1)%RHO
167  t%TSNOW_ROOF%ALB = tnpsnow%AL(1)%ALB
168  t%TSNOW_ROOF%T = tnpsnow%AL(1)%T
169  t%TSNOW_ROOF%HEAT = tnpsnow%AL(1)%HEAT
170  !
171  CALL type_snow_init(tnpsnow%AL(1))
172  DEALLOCATE(tnpsnow%AL)
173 
174  DEALLOCATE(zsg1snow)
175  DEALLOCATE(zsg2snow)
176  DEALLOCATE(zhistsnow)
177  DEALLOCATE(zagesnow)
178  IF (lhook) CALL dr_hook('PREP_HOR_TEB_FIELD',1,zhook_handle)
179  RETURN
180 ELSE IF (hsurf=='SN_ROAD') THEN
181  CALL read_prep_teb_snow(hprogram,t%TSNOW_ROOF%SCHEME,t%TSNOW_ROOF%NLAYER,&
182  t%TSNOW_ROAD%SCHEME,t%TSNOW_ROAD%NLAYER,&
183  yfile,yfiletype,yfilepgd,yfilepgdtype)
184  IF (len_trim(yfile)>0 .AND. len_trim(yfiletype)>0) gunif = .false.
185  ALLOCATE(zsg1snow(SIZE(xwsnow_road)))
186  ALLOCATE(zsg2snow(SIZE(xwsnow_road)))
187  ALLOCATE(zhistsnow(SIZE(xwsnow_road)))
188  ALLOCATE(zagesnow(SIZE(xwsnow_road)))
189  ALLOCATE(tnpsnow%AL(1))
190  tnpsnow%AL(1)%SCHEME = t%TSNOW_ROAD%SCHEME
191  tnpsnow%AL(1)%NLAYER = t%TSNOW_ROAD%NLAYER
192  CALL prep_hor_snow_fields(dtco, g, u, gcp, &
193  hprogram,hsurf, &
194  yfile,yfiletype, &
195  yfilepgd, yfilepgdtype, &
196  iluout,gunif,1,kpatch, &
197  SIZE(g%XLAT),tnpsnow, top%TTIME,&
198  xwsnow_road, xrsnow_road, &
199  xtsnow_road, xlwcsnow_road, &
200  xasnow_road, &
201  lsnow_ideal_teb, zsg1snow, &
202  zsg2snow, zhistsnow, zagesnow, ydctl)
203 
204  CALL allocate_gr_snow(t%TSNOW_ROAD,SIZE(g%XLAT))
205  t%TSNOW_ROAD%WSNOW = tnpsnow%AL(1)%WSNOW
206  t%TSNOW_ROAD%RHO = tnpsnow%AL(1)%RHO
207  t%TSNOW_ROAD%ALB = tnpsnow%AL(1)%ALB
208  t%TSNOW_ROAD%T = tnpsnow%AL(1)%T
209  t%TSNOW_ROAD%HEAT = tnpsnow%AL(1)%HEAT
210  !
211  CALL type_snow_init(tnpsnow%AL(1))
212  DEALLOCATE(tnpsnow%AL)
213 
214  DEALLOCATE(zsg1snow)
215  DEALLOCATE(zsg2snow)
216  DEALLOCATE(zhistsnow)
217  DEALLOCATE(zagesnow)
218  IF (lhook) CALL dr_hook('PREP_HOR_TEB_FIELD',1,zhook_handle)
219  RETURN
220 END IF
221 !
222 !
223 !* 4. Reading of input configuration (Grid and interpolation type)
224 !
225 NULLIFY (zfieldin, zfieldout)
226 !
227 IF (ydctl%LPART1) THEN
228 !
229  IF (gunif) THEN
230  CALL prep_teb_unif(iluout,hsurf,zfieldin)
231  ELSE IF (yfiletype=='GRIB ') THEN
232  CALL prep_grib_grid(yfile,iluout,cinmodel,cingrid_type,cinterp_type,tztime_grib)
233  IF (nrank==npio)CALL prep_teb_grib(hprogram,hsurf,yfile,iluout,zfieldin)
234  ELSE IF (yfiletype=='MESONH' .OR.yfiletype=='ASCII ' .OR.yfiletype=='LFI '&
235  .OR.yfiletype=='FA '.OR.yfiletype=='AROME '.OR.yfiletype=='NC ') THEN
236  CALL prep_teb_extern(dtco,gcp,top,bop,hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,iluout,kpatch,zfieldin)
237  ELSE IF (yfiletype=='BUFFER') THEN
238  CALL prep_teb_buffer(hprogram,hsurf,iluout,zfieldin)
239  ELSE
240  CALL abor1_sfx('PREP_HOR_TEB_FIELD: data file type not supported : '//yfiletype)
241  END IF
242 !
243 ENDIF
244 !
245 !* 5. Horizontal interpolation
246 !
247  CALL prep_ctl_int_part2 (ydctl, hsurf, cmask, 'TOWN', zfieldin)
248 !
249 IF (ydctl%LPART3) THEN
250 !
251  IF (nrank==npio) THEN
252  inl = SIZE(zfieldin,2)
253  ELSEIF (.NOT.ASSOCIATED(zfieldin)) THEN
254  ALLOCATE(zfieldin(0,0))
255  ENDIF
256  !
257  IF (nproc>1) THEN
258 #ifdef SFX_MPI
259  CALL mpi_bcast(inl,kind(inl)/4,mpi_integer,npio,ncomm,infompi)
260 #endif
261  ENDIF
262  ALLOCATE(zfieldout(SIZE(g%XLAT),inl))
263  !
264  IF (top%CWALL_OPT/='UNIF'.OR.trim(hsurf)/='T_WALLB') THEN
265  CALL hor_interpol(dtco, u, gcp, iluout,zfieldin,zfieldout)
266  ENDIF
267  !
268  DEALLOCATE(zfieldin )
269  !
270 ENDIF
271 !
272  CALL prep_ctl_int_part4 (ydctl, hsurf, 'TOWN', cmask, zfieldin, zfieldout)
273 
274 IF (ydctl%LPART5) THEN
275 !
276 !* 6. Return to historical variable
277 !
278  SELECT CASE (hsurf)
279  CASE('ZS ')
280  ALLOCATE(xzs_ls(SIZE(zfieldout,1)))
281  xzs_ls(:) = zfieldout(:,1)
282  CASE('WS_ROOF')
283  ALLOCATE(t%XWS_ROOF(SIZE(zfieldout,1)))
284  t%XWS_ROOF(:) = zfieldout(:,1)
285  CASE('WS_ROAD')
286  ALLOCATE(t%XWS_ROAD(SIZE(zfieldout,1)))
287  t%XWS_ROAD(:) = zfieldout(:,1)
288  CASE('TI_ROAD')
289  ALLOCATE(t%XTI_ROAD(SIZE(zfieldout,1)))
290  t%XTI_ROAD(:) = zfieldout(:,1)
291  CASE('TI_BLD ')
292  ALLOCATE(b%XTI_BLD (SIZE(zfieldout,1)))
293  b%XTI_BLD (:) = zfieldout(:,1)
294  CASE('QI_BLD ')
295  ALLOCATE(b%XQI_BLD (SIZE(zfieldout,1)))
296  IF (all(zfieldout .GE. xundef-1.e+5 .AND. zfieldout .LE. xundef+1.e+5)) THEN
297  ALLOCATE(zps(SIZE(zfieldout,1)))
298  zps = xp00 - zrhoa * xg * xzs_ls
299  IF (xhui_bld==xundef) THEN
300  zfieldout(:,1) = xhui_bld_def * qsat(b%XTI_BLD, zps)
301  ELSE
302  zfieldout(:,1) = xhui_bld * qsat(b%XTI_BLD, zps)
303  ENDIF
304  DEALLOCATE(zps)
305  ENDIF
306  b%XQI_BLD (:) = zfieldout(:,1)
307  CASE('T_WIN1 ')
308  ALLOCATE(b%XT_WIN1 (SIZE(zfieldout,1)))
309  b%XT_WIN1 (:) = zfieldout(:,1)
310  CASE('T_WIN2 ')
311  ALLOCATE(b%XT_WIN2 (SIZE(zfieldout,1)))
312  b%XT_WIN2 (:) = zfieldout(:,1)
313  CASE('T_FLOOR')
314  ALLOCATE(b%XT_FLOOR(SIZE(zfieldout,1),bop%NFLOOR_LAYER))
315  CALL init_from_ref_grid(xgrid_floor,zfieldout,b%XD_FLOOR,b%XT_FLOOR)
316  CASE('T_MASS')
317  ALLOCATE(b%XT_MASS(SIZE(zfieldout,1),bop%NFLOOR_LAYER))
318  CALL init_from_ref_grid(xgrid_floor,zfieldout,b%XD_FLOOR,b%XT_MASS)
319  CASE('T_ROAD ')
320  ALLOCATE(t%XT_ROAD(SIZE(zfieldout,1),top%NROAD_LAYER))
321  CALL init_from_ref_grid(xgrid_road,zfieldout,t%XD_ROAD,t%XT_ROAD)
322  CASE('T_WALLA')
323  ALLOCATE(t%XT_WALL_A(SIZE(zfieldout,1),top%NWALL_LAYER))
324  CALL init_from_ref_grid(xgrid_wall,zfieldout,t%XD_WALL,t%XT_WALL_A)
325  CASE('T_WALLB')
326  ALLOCATE(t%XT_WALL_B(SIZE(zfieldout,1),top%NWALL_LAYER))
327  IF (top%CWALL_OPT=='UNIF') THEN
328  t%XT_WALL_B = t%XT_WALL_A
329  ELSE
330  CALL init_from_ref_grid(xgrid_wall,zfieldout,t%XD_WALL,t%XT_WALL_B)
331  END IF
332  CASE('T_ROOF ')
333  ALLOCATE(t%XT_ROOF(SIZE(zfieldout,1),top%NROOF_LAYER))
334  CALL init_from_ref_grid(xgrid_roof,zfieldout,t%XD_ROOF,t%XT_ROOF)
335  CASE('T_CAN ')
336  ALLOCATE(t%XT_CANYON(SIZE(zfieldout,1)))
337  t%XT_CANYON (:) = zfieldout(:,1)
338  CASE('Q_CAN ')
339  ALLOCATE(t%XQ_CANYON(SIZE(zfieldout,1)))
340  t%XQ_CANYON (:) = zfieldout(:,1)
341  END SELECT
342 !
343 ENDIF
344 !-------------------------------------------------------------------------------------
345 !
346 !* 7. Deallocations
347 !
348 IF (ASSOCIATED (zfieldout)) DEALLOCATE(zfieldout)
349 IF (lhook) CALL dr_hook('PREP_HOR_TEB_FIELD',1,zhook_handle)
350 !
351 !-------------------------------------------------------------------------------------
352 !-------------------------------------------------------------------------------------
353 !
354 CONTAINS
355 !
356 !-------------------------------------------------------------------------------------
357 !-------------------------------------------------------------------------------------
358 SUBROUTINE init_from_ref_grid(PGRID1,PT1,PD2,PT2)
359 !
361 !
362 REAL, DIMENSION(:,:), INTENT(IN) :: PT1 ! temperature profile
363 REAL, DIMENSION(:), INTENT(IN) :: PGRID1 ! normalized grid
364 REAL, DIMENSION(:,:), INTENT(IN) :: PD2 ! output layer thickness
365 REAL, DIMENSION(:,:), INTENT(OUT) :: PT2 ! temperature profile
366 !
367 INTEGER :: JL ! loop counter
368 REAL, DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: ZD1 ! input grid
369 REAL, DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: ZD2 ! output grid
370 REAL, DIMENSION(SIZE(PD2,1)) :: ZD ! output total thickness
371 REAL(KIND=JPRB) :: ZHOOK_HANDLE
372 !
373 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',0,zhook_handle)
374 zd2(:,:) = 0.
375 zd(:) = 0.
376 !
377 DO jl=1,SIZE(zd2,2)
378  zd2(:,jl) = zd(:) + pd2(:,jl)/2.
379  zd(:) = zd(:) + pd2(:,jl)
380 END DO
381 !
382 DO jl=1,SIZE(pt1,2)
383  zd1(:,jl) = pgrid1(jl) * zd(:)
384 END DO
385 !
386  CALL interp_grid(zd1,pt1,zd2,pt2)
387 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',1,zhook_handle)
388 !
389 END SUBROUTINE init_from_ref_grid
390 !-------------------------------------------------------------------------------------
391 !
392 END SUBROUTINE prep_hor_teb_field
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine prep_grib_grid(HGRIB, KLUOUT, HINMODEL, HGRIDTYPE, HINTERP_
character(len=10) cingrid_type
Definition: modd_prep.F90:39
subroutine prep_hor_snow_fields(DTCO, G, U, GCP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, OUNIF, 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, KSIZE_P, KR_P, PPATCH, OKEY)
subroutine read_prep_teb_conf(HPROGRAM, HVAR, HFILE, HFILETYPE, HFILEP
subroutine init_from_ref_grid(PGRID1, PT1, PD2, PT2)
real, dimension(:), allocatable xzs_ls
Definition: modd_prep.F90:45
character(len=6) cmask
Definition: modd_prep.F90:41
character(len=6) cinterp_type
Definition: modd_prep.F90:40
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
character(len=6) cinmodel
subroutine prep_hor_teb_field(B, BOP, DTCO, U, GCP, G, T, TOP, HPROGRAM, HSURF, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, KPATCH, YDCTL)
subroutine hor_interpol(DTCO, U, GCP, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:7
real, save xg
Definition: modd_csts.F90:55
integer, parameter jprb
Definition: parkind1.F90:32
subroutine prep_teb_grib(HPROGRAM, HSURF, HFILE, KLUOUT, PFIELD)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
subroutine allocate_gr_snow(TPSNOW, KLU)
logical lhook
Definition: yomhook.F90:15
subroutine prep_teb_extern(DTCO, GCP, TOP, BOP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, KPATCH, PFIELD)
subroutine prep_teb_buffer(HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine prep_teb_unif(KLUOUT, HSURF, PFIELD)
subroutine read_prep_teb_snow(HPROGRAM, HSNOW_ROOF, KSNOW_ROOF, HSNOW
real, save xp00
Definition: modd_csts.F90:57
subroutine type_snow_init(YSURF_SNOW)