SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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, IG, U, TG, T, TOP, &
7  hprogram,hsurf,hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,kpatch)
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 !!------------------------------------------------------------------
32 !
33 !
34 !
35 !
36 !
37 USE modd_bem_n, ONLY : bem_t
40 USE modd_isba_grid_n, ONLY : isba_grid_t
41 USE modd_surf_atm_n, ONLY : surf_atm_t
42 USE modd_teb_grid_n, ONLY : teb_grid_t
43 USE modd_teb_n, ONLY : teb_t
45 !
46 USE modd_prep, ONLY : cingrid_type, cinterp_type, xzs_ls, xlat_out, xlon_out, &
47  xx_out, xy_out, cmask
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 !
56 USE mode_thermos
57 !
58 USE modi_read_prep_teb_conf
59 USE modi_read_prep_teb_snow
60 USE modi_prep_teb_grib
61 USE modi_prep_teb_unif
62 USE modi_prep_teb_buffer
63 USE modi_hor_interpol
64 USE modi_prep_hor_snow_fields
65 USE modi_get_luout
66 USE modi_prep_teb_extern
67 !
68 USE yomhook ,ONLY : lhook, dr_hook
69 USE parkind1 ,ONLY : jprb
70 !
71 USE modi_abor1_sfx
72 IMPLICIT NONE
73 !
74 !* 0.1 declarations of arguments
75 !
76 !
77 TYPE(bem_t), INTENT(INOUT) :: b
78 TYPE(bem_options_t), INTENT(INOUT) :: bop
79 TYPE(data_cover_t), INTENT(INOUT) :: dtco
80 TYPE(isba_grid_t), INTENT(INOUT) :: ig
81 TYPE(surf_atm_t), INTENT(INOUT) :: u
82 TYPE(teb_grid_t), INTENT(INOUT) :: tg
83 TYPE(teb_t), INTENT(INOUT) :: t
84 TYPE(teb_options_t), INTENT(INOUT) :: top
85 !
86  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
87  CHARACTER(LEN=7), INTENT(IN) :: hsurf ! type of field
88  CHARACTER(LEN=28), INTENT(IN) :: hatmfile ! name of the Atmospheric file
89  CHARACTER(LEN=6), INTENT(IN) :: hatmfiletype! type of the Atmospheric file
90  CHARACTER(LEN=28), INTENT(IN) :: hpgdfile ! name of the Atmospheric file
91  CHARACTER(LEN=6), INTENT(IN) :: hpgdfiletype! type of the Atmospheric file
92 !
93 INTEGER, INTENT(IN) :: kpatch
94 !
95 !* 0.2 declarations of local variables
96 !
97  CHARACTER(LEN=6) :: yfiletype ! type of input file
98  CHARACTER(LEN=28) :: yfile ! name of file
99  CHARACTER(LEN=6) :: yfilepgdtype ! type of input file
100  CHARACTER(LEN=28) :: yfilepgd ! name of file
101 REAL, DIMENSION(:), ALLOCATABLE :: zsg1snow, zsg2snow, zhistsnow, zagesnow
102 REAL, POINTER, DIMENSION(:,:) :: zfieldin ! field to interpolate horizontally
103 REAL, ALLOCATABLE, DIMENSION(:,:) :: zfieldout ! field interpolated horizontally
104 REAL, ALLOCATABLE, DIMENSION(:) :: zps !surface pressure
105 REAL, PARAMETER :: zrhoa=1.19 ! volumic mass of air at 20C and 1000hPa
106 INTEGER :: iluout ! output listing logical unit
107 !
108 LOGICAL :: gunif ! flag for prescribed uniform field
109 REAL(KIND=JPRB) :: zhook_handle
110 !-------------------------------------------------------------------------------------
111 !
112 !
113 !* 1. Reading of input file name and type
114 !
115 IF (lhook) CALL dr_hook('PREP_HOR_TEB_FIELD',0,zhook_handle)
116  CALL get_luout(hprogram,iluout)
117 !
118  CALL read_prep_teb_conf(hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,&
119  hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,iluout,gunif)
120 !
121  cmask = 'TOWN'
122 !
123 !-------------------------------------------------------------------------------------
124 !
125 !* 2. Snow variables case?
126 !
127 IF (hsurf=='SN_ROOF') THEN
128  CALL read_prep_teb_snow(hprogram,t%CUR%TSNOW_ROOF%SCHEME,t%CUR%TSNOW_ROOF%NLAYER,&
129  t%CUR%TSNOW_ROAD%SCHEME,t%CUR%TSNOW_ROAD%NLAYER,&
130  yfile,yfiletype,yfilepgd,yfilepgdtype)
131  IF (len_trim(yfile)>0 .AND. len_trim(yfiletype)>0) gunif = .false.
132  ALLOCATE(zsg1snow(SIZE(xwsnow_roof)))
133  ALLOCATE(zsg2snow(SIZE(xwsnow_roof)))
134  ALLOCATE(zhistsnow(SIZE(xwsnow_roof)))
135  ALLOCATE(zagesnow(SIZE(xwsnow_roof)))
136  CALL prep_hor_snow_fields(dtco, &
137  ig, u, &
138  hprogram,hsurf, &
139  yfile,yfiletype, &
140  yfilepgd, yfilepgdtype, &
141  iluout,gunif,1,kpatch, &
142  SIZE(tg%XLAT),t%CUR%TSNOW_ROOF, top%TTIME,&
143  xwsnow_roof, xrsnow_roof, &
144  xtsnow_roof, xlwcsnow_roof, &
145  xasnow_roof, &
146  lsnow_ideal_teb, zsg1snow, &
147  zsg2snow, zhistsnow, zagesnow)
148  DEALLOCATE(zsg1snow)
149  DEALLOCATE(zsg2snow)
150  DEALLOCATE(zhistsnow)
151  DEALLOCATE(zagesnow)
152  IF (lhook) CALL dr_hook('PREP_HOR_TEB_FIELD',1,zhook_handle)
153  RETURN
154 ELSE IF (hsurf=='SN_ROAD') THEN
155  CALL read_prep_teb_snow(hprogram,t%CUR%TSNOW_ROOF%SCHEME,t%CUR%TSNOW_ROOF%NLAYER,&
156  t%CUR%TSNOW_ROAD%SCHEME,t%CUR%TSNOW_ROAD%NLAYER,&
157  yfile,yfiletype,yfilepgd,yfilepgdtype)
158  IF (len_trim(yfile)>0 .AND. len_trim(yfiletype)>0) gunif = .false.
159  ALLOCATE(zsg1snow(SIZE(xwsnow_road)))
160  ALLOCATE(zsg2snow(SIZE(xwsnow_road)))
161  ALLOCATE(zhistsnow(SIZE(xwsnow_road)))
162  ALLOCATE(zagesnow(SIZE(xwsnow_road)))
163  CALL prep_hor_snow_fields(dtco, &
164  ig, u, &
165  hprogram,hsurf, &
166  yfile,yfiletype, &
167  yfilepgd, yfilepgdtype, &
168  iluout,gunif,1,kpatch, &
169  SIZE(tg%XLAT),t%CUR%TSNOW_ROAD, top%TTIME,&
170  xwsnow_road, xrsnow_road, &
171  xtsnow_road, xlwcsnow_road, &
172  xasnow_road, &
173  lsnow_ideal_teb, zsg1snow, &
174  zsg2snow, zhistsnow, zagesnow)
175  DEALLOCATE(zsg1snow)
176  DEALLOCATE(zsg2snow)
177  DEALLOCATE(zhistsnow)
178  DEALLOCATE(zagesnow)
179  IF (lhook) CALL dr_hook('PREP_HOR_TEB_FIELD',1,zhook_handle)
180  RETURN
181 END IF
182 !
183 !
184 !* 4. Reading of input configuration (Grid and interpolation type)
185 !
186 IF (gunif) THEN
187  CALL prep_teb_unif(iluout,hsurf,zfieldin)
188 ELSE IF (yfiletype=='GRIB ') THEN
189  CALL prep_teb_grib(hprogram,hsurf,yfile,iluout,zfieldin)
190  ELSE IF (yfiletype=='MESONH' .OR. yfiletype=='ASCII ' .OR. yfiletype=='LFI '.OR. yfiletype=='FA ') THEN
191  CALL prep_teb_extern(dtco, &
192  hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,iluout,kpatch,zfieldin)
193  ELSE IF (yfiletype=='BUFFER') THEN
194  CALL prep_teb_buffer(hprogram,hsurf,iluout,zfieldin)
195  ELSE
196  CALL abor1_sfx('PREP_HOR_TEB_FIELD: data file type not supported : '//yfiletype)
197 END IF
198 !
199 !* 5. Horizontal interpolation
200 !
201 ALLOCATE(zfieldout(SIZE(tg%XLAT),SIZE(zfieldin,2)))
202 !
203  CALL hor_interpol(dtco, u, &
204  iluout,zfieldin,zfieldout)
205 !
206 !* 6. Return to historical variable
207 !
208 SELECT CASE (hsurf)
209  CASE('ZS ')
210  ALLOCATE(xzs_ls(SIZE(zfieldout,1)))
211  xzs_ls(:) = zfieldout(:,1)
212  CASE('WS_ROOF')
213  ALLOCATE(t%CUR%XWS_ROOF(SIZE(zfieldout,1)))
214  t%CUR%XWS_ROOF(:) = zfieldout(:,1)
215  CASE('WS_ROAD')
216  ALLOCATE(t%CUR%XWS_ROAD(SIZE(zfieldout,1)))
217  t%CUR%XWS_ROAD(:) = zfieldout(:,1)
218  CASE('TI_ROAD')
219  ALLOCATE(t%CUR%XTI_ROAD(SIZE(zfieldout,1)))
220  t%CUR%XTI_ROAD(:) = zfieldout(:,1)
221  CASE('TI_BLD ')
222  ALLOCATE(b%CUR%XTI_BLD (SIZE(zfieldout,1)))
223  b%CUR%XTI_BLD (:) = zfieldout(:,1)
224  CASE('QI_BLD ')
225  ALLOCATE(b%CUR%XQI_BLD (SIZE(zfieldout,1)))
226  IF (all(zfieldout .GE. xundef-1.e+5 .AND. zfieldout .LE. xundef+1.e+5)) THEN
227  ALLOCATE(zps(SIZE(zfieldout,1)))
228  zps = xp00 - zrhoa * xg * xzs_ls
229  IF (xhui_bld==xundef) THEN
230  zfieldout(:,1) = xhui_bld_def * qsat(b%CUR%XTI_BLD, zps)
231  ELSE
232  zfieldout(:,1) = xhui_bld * qsat(b%CUR%XTI_BLD, zps)
233  ENDIF
234  DEALLOCATE(zps)
235  ENDIF
236  b%CUR%XQI_BLD (:) = zfieldout(:,1)
237  CASE('T_WIN1 ')
238  ALLOCATE(b%CUR%XT_WIN1 (SIZE(zfieldout,1)))
239  b%CUR%XT_WIN1 (:) = zfieldout(:,1)
240  CASE('T_WIN2 ')
241  ALLOCATE(b%CUR%XT_WIN2 (SIZE(zfieldout,1)))
242  b%CUR%XT_WIN2 (:) = zfieldout(:,1)
243  CASE('T_FLOOR')
244  ALLOCATE(b%CUR%XT_FLOOR(SIZE(zfieldout,1),bop%NFLOOR_LAYER))
245  CALL init_from_ref_grid(xgrid_floor,zfieldout,b%CUR%XD_FLOOR,b%CUR%XT_FLOOR)
246  CASE('T_MASS')
247  ALLOCATE(b%CUR%XT_MASS(SIZE(zfieldout,1),bop%NFLOOR_LAYER))
248  CALL init_from_ref_grid(xgrid_floor,zfieldout,b%CUR%XD_FLOOR,b%CUR%XT_MASS)
249  CASE('T_ROAD ')
250  ALLOCATE(t%CUR%XT_ROAD(SIZE(zfieldout,1),top%NROAD_LAYER))
251  CALL init_from_ref_grid(xgrid_road,zfieldout,t%CUR%XD_ROAD,t%CUR%XT_ROAD)
252  CASE('T_WALLA')
253  ALLOCATE(t%CUR%XT_WALL_A(SIZE(zfieldout,1),top%NWALL_LAYER))
254  CALL init_from_ref_grid(xgrid_wall,zfieldout,t%CUR%XD_WALL,t%CUR%XT_WALL_A)
255  CASE('T_WALLB')
256  ALLOCATE(t%CUR%XT_WALL_B(SIZE(zfieldout,1),top%NWALL_LAYER))
257  IF (top%CWALL_OPT=='UNIF') THEN
258  t%CUR%XT_WALL_B = t%CUR%XT_WALL_A
259  ELSE
260  CALL init_from_ref_grid(xgrid_wall,zfieldout,t%CUR%XD_WALL,t%CUR%XT_WALL_B)
261  END IF
262  CASE('T_ROOF ')
263  ALLOCATE(t%CUR%XT_ROOF(SIZE(zfieldout,1),top%NROOF_LAYER))
264  CALL init_from_ref_grid(xgrid_roof,zfieldout,t%CUR%XD_ROOF,t%CUR%XT_ROOF)
265  CASE('T_CAN ')
266  ALLOCATE(t%CUR%XT_CANYON(SIZE(zfieldout,1)))
267  t%CUR%XT_CANYON (:) = zfieldout(:,1)
268  CASE('Q_CAN ')
269  ALLOCATE(t%CUR%XQ_CANYON(SIZE(zfieldout,1)))
270  t%CUR%XQ_CANYON (:) = zfieldout(:,1)
271 END SELECT
272 !
273 !-------------------------------------------------------------------------------------
274 !
275 !* 7. Deallocations
276 !
277 DEALLOCATE(zfieldin )
278 DEALLOCATE(zfieldout)
279 IF (lhook) CALL dr_hook('PREP_HOR_TEB_FIELD',1,zhook_handle)
280 !
281 !-------------------------------------------------------------------------------------
282 !-------------------------------------------------------------------------------------
283 !
284  CONTAINS
285 !
286 !-------------------------------------------------------------------------------------
287 !-------------------------------------------------------------------------------------
288 SUBROUTINE init_from_ref_grid(PGRID1,PT1,PD2,PT2)
289 !
291 !
292 REAL, DIMENSION(:,:), INTENT(IN) :: pt1 ! temperature profile
293 REAL, DIMENSION(:), INTENT(IN) :: pgrid1 ! normalized grid
294 REAL, DIMENSION(:,:), INTENT(IN) :: pd2 ! output layer thickness
295 REAL, DIMENSION(:,:), INTENT(OUT) :: pt2 ! temperature profile
296 !
297 INTEGER :: jl ! loop counter
298 REAL, DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: zd1 ! input grid
299 REAL, DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: zd2 ! output grid
300 REAL, DIMENSION(SIZE(PD2,1)) :: zd ! output total thickness
301 REAL(KIND=JPRB) :: zhook_handle
302 !
303 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',0,zhook_handle)
304 zd2(:,:) = 0.
305 zd(:) = 0.
306 !
307 DO jl=1,SIZE(zd2,2)
308  zd2(:,jl) = zd(:) + pd2(:,jl)/2.
309  zd(:) = zd(:) + pd2(:,jl)
310 END DO
311 !
312 DO jl=1,SIZE(pt1,2)
313  zd1(:,jl) = pgrid1(jl) * zd(:)
314 END DO
315 !
316  CALL interp_grid(zd1,pt1,zd2,pt2)
317 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',1,zhook_handle)
318 !
319 END SUBROUTINE init_from_ref_grid
320 !-------------------------------------------------------------------------------------
321 !
322 END SUBROUTINE prep_hor_teb_field
subroutine prep_hor_teb_field(B, BOP, DTCO, IG, U, TG, T, TOP, HPROGRAM, HSURF, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, KPATCH)
subroutine init_from_ref_grid(PGRID1, PT1, PD2, PT2)
subroutine read_prep_teb_conf(HPROGRAM, HVAR, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, KLUOUT, OUNIF)
subroutine read_prep_teb_snow(HPROGRAM, HSNOW_ROOF, KSNOW_ROOF, HSNOW_ROAD, KSNOW_ROAD, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine hor_interpol(DTCO, U, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:6
subroutine prep_teb_grib(HPROGRAM, HSURF, HFILE, KLUOUT, PFIELD)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine prep_teb_extern(DTCO, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, KPATCH, PFIELD)
subroutine prep_teb_buffer(HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine prep_hor_snow_fields(DTCO, IG, U, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, OUNIF, KPATCH, KTEB_PATCH, KL, TPSNOW, TPTIME, PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_LWCSNOW, PUNIF_ASNOW, OSNOW_IDEAL, PUNIF_SG1SNOW, PUNIF_SG2SNOW, PUNIF_HISTSNOW, PUNIF_AGESNOW, PVEGTYPE, PVEGTYPE_PATCH, PPATCH, OKEY)
subroutine prep_teb_unif(KLUOUT, HSURF, PFIELD)