SURFEX v8.1
General documentation of Surfex
pgd_fieldin.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 pgd_fieldin (DTCO, UG, U, USS, &
7  HPROGRAM,HFIELD,HAREA,HFILE,HFILETYPE,PUNIF,PFIELD,&
8  OPRESENT,PVEGTYPE)
9 ! ##############################################################
10 !
11 !!**** *PGD_FIELDIN* monitor for averaging and interpolations of ISBA physiographic fields
12 !!
13 !! PURPOSE
14 !! -------
15 !!
16 !! METHOD
17 !! ------
18 !!
19 !
20 !! EXTERNAL
21 !! --------
22 !!
23 !! IMPLICIT ARGUMENTS
24 !! ------------------
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !! AUTHOR
30 !! ------
31 !!
32 !! V. Masson Meteo-France
33 !!
34 !! MODIFICATION
35 !! ------------
36 !!
37 !! Original 10/12/97
38 !! 09/2010 (E. Kourzeneva): interpolation of the lake depth
39 !! is not allowed and not necessary
40 !!
41 !! 02/2014 (B. Decharme): interpolation of the lake depth
42 !! re-allowed but using the nearest point
43 !----------------------------------------------------------------------------
44 !
45 !* 0. DECLARATION
46 ! -----------
47 !
48 !
49 USE modd_surfex_mpi, ONLY : nrank, npio, nproc
52 USE modd_surf_atm_n, ONLY : surf_atm_t
53 USE modd_sso_n, ONLY : sso_t
54 !
55 USE modd_pgdwork, ONLY : xall, nsize_all, catype, nsize, xsumval, &
57 USE modd_surf_par, ONLY : xundef
58 USE modd_pgd_grid, ONLY : nl
59 !
60 USE modd_data_cover_par, ONLY : ntype, lveg_pres, nvegtype
61 !
62 USE modi_get_luout
63 USE modi_treat_field
64 USE modi_interpol_field
67 !
68 !
69 USE yomhook ,ONLY : lhook, dr_hook
70 USE parkind1 ,ONLY : jprb
71 !
72 USE modi_abor1_sfx
73 !
74 USE modi_get_surf_mask_n
75 !
76 USE modi_get_type_dim_n
77 !
78 IMPLICIT NONE
79 !
80 !* 0.1 Declaration of arguments
81 ! ------------------------
82 !
83 !
84 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
85 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
86 TYPE(surf_atm_t), INTENT(INOUT) :: U
87 TYPE(sso_t), INTENT(INOUT) :: USS
88 !
89  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program
90  CHARACTER(LEN=*), INTENT(IN) :: HFIELD ! field name for prints
91  CHARACTER(LEN=3), INTENT(IN) :: HAREA ! area where field is defined
92 ! ! 'ALL' : everywhere
93 ! ! 'NAT' : on nature
94 ! ! 'TWN' : on town
95 ! ! 'SEA' : on sea
96 ! ! 'WAT' : on inland waters
97  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! data file name
98  CHARACTER(LEN=6), INTENT(INOUT) :: HFILETYPE ! data file type
99 REAL, INTENT(IN) :: PUNIF ! prescribed uniform value for field
100 REAL, DIMENSION(:,:),INTENT(OUT):: PFIELD ! physiographic field
101 LOGICAL, OPTIONAL, INTENT(OUT) :: OPRESENT
102 REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PVEGTYPE
103 !
104 !
105 !* 0.2 Declaration of local variables
106 ! ------------------------------
107 !
108 INTEGER :: ILU ! expected physical size of full surface array
109 INTEGER :: ILUOUT ! output listing logical unit
110 INTEGER, DIMENSION(:), POINTER :: IMASK ! mask for packing from complete field to nature field
111 INTEGER :: IDIM !
112 INTEGER :: JI, ICASE
113 !
114 REAL, DIMENSION(:), ALLOCATABLE :: ZVEGTYPE
115 INTEGER :: JJ, JT, JTN
116  CHARACTER(LEN=20) :: YFIELD
117  CHARACTER(LEN=6) :: YMASK
118 INTEGER :: INPTS ! number of points used for interpolation
119 REAL, DIMENSION(:,:), ALLOCATABLE :: ZFIELD ! physiographic field on full grid
120 REAL(KIND=JPRB) :: ZHOOK_HANDLE
121 !-------------------------------------------------------------------------------
122 !
123 !* 1. Initializations
124 ! ---------------
125 !
126 IF (lhook) CALL dr_hook('PGD_FIELDIN',0,zhook_handle)
127 !
128 !-------------------------------------------------------------------------------
129 !
130 !* 2. Output listing logical unit
131 ! ---------------------------
132 !
133  CALL get_luout(hprogram,iluout)
134 !
135 IF (len_trim(hfile)/=0 .OR. punif/=xundef) THEN
136  !
137  IF (PRESENT(opresent)) opresent=.true.
138  !
139  IF (hfiletype=='DIRTYP') THEN
140  ALLOCATE(zfield(nl,sum(ntype)))
141  ELSE
142  ALLOCATE(zfield(nl,1))
143  ENDIF
144  !-------------------------------------------------------------------------------
145  !
146  !* 6. Mask for the field
147  ! ------------------
148  !
149  ymask = ''
150  SELECT CASE (harea)
151  CASE ('LAN')
152  ymask = 'LAND '
153  CASE ('TWN')
154  ymask = 'TOWN '
155  CASE ('BLD')
156  ymask = 'TOWN '
157  CASE ('NAT')
158  ymask = 'NATURE'
159  CASE ('SEA')
160  ymask = 'SEA '
161  CASE ('WAT')
162  ymask = 'WATER '
163  CASE DEFAULT
164  ymask = 'FULL '
165  END SELECT
166 
167  CALL get_type_dim_n(dtco, u, ymask,idim)
168  IF (idim/=SIZE(pfield,1)) THEN
169  WRITE(iluout,*)'Wrong dimension of MASK: ',idim,SIZE(pfield,1)
170  CALL abor1_sfx('PGD_FIELDIN: WRONG DIMENSION OF MASK')
171  ENDIF
172 
173  ALLOCATE(imask(idim))
174  ilu=0
175  CALL get_surf_mask_n(dtco, u, ymask,idim,imask,ilu,iluout)
176 !
177 ELSE
178  !
179  IF (PRESENT(opresent)) THEN
180  opresent=.false.
181  pfield(:,:) = xundef
182  IF (lhook) CALL dr_hook('PGD_FIELDIN',1,zhook_handle)
183  RETURN
184  ENDIF
185  !
186  WRITE(iluout,*) ' '
187  WRITE(iluout,*) '***********************************************************'
188  WRITE(iluout,*) '* Error in PGD field preparation of field : ', hfield
189  WRITE(iluout,*) '* There is no prescribed value and no input file *'
190  WRITE(iluout,*) '***********************************************************'
191  WRITE(iluout,*) ' '
192  CALL abor1_sfx('PGD_FIELDIN: NO PRESCRIBED VALUE NOR INPUT FILE FOR '//hfield)
193  !
194 ENDIF
195 !
196 !-------------------------------------------------------------------------------
197 !
198 !* 3. Read from file
199 ! --------------
200 !
201 IF (len_trim(hfile)/=0) THEN
202 !
203 !-------------------------------------------------------------------------------
204 !
205 !* 4. Averages the field
206 ! ------------------
207 !
208  ALLOCATE(nsize_all(u%NDIM_FULL,1))
209 !
210  nsize_all(:,1) = 0
211 !
212  IF (catype=='MAJ') THEN
213  ALLOCATE(nvalnbr(u%NDIM_FULL,1))
214  ALLOCATE(nvalcount(u%NDIM_FULL,jpvalmax,1))
215  ALLOCATE(xvallist(u%NDIM_FULL,jpvalmax,1))
216  nvalnbr = 0
217  nvalcount = 0
218  xvallist = xundef
219  inpts = 1
220  ELSE
221  ALLOCATE(xall(u%NDIM_FULL,1,1))
222  xall(:,:,:) = 0.
223  inpts = 3
224  ENDIF
225 !
226  IF(hfield=="water depth") THEN
227  inpts = 1
228  ENDIF
229 !
230  yfield = ' '
231  yfield = hfield(1:min(len(hfield),20))
232 !
233  zfield(:,:) = xundef
234 !
235  CALL treat_field(ug, u, uss, &
236  hprogram,'SURF ',hfiletype,'A_MESH',hfile, &
237  yfield,zfield )
238 !
239 !-------------------------------------------------------------------------------
240 !
241 !* 4. Mask for the interpolations
242 ! ---------------------------
243 !
244  DO jt=1,SIZE(nsize,2)
245 
246  SELECT CASE (harea)
247 
248  CASE ('LAN')
249  WHERE ((u%XTOWN(:)+u%XNATURE(:))==0. .AND. nsize(:,jt)==0 ) nsize(:,jt) = -1
250 
251  CASE ('TWN')
252  WHERE (u%XTOWN (:)==0. .AND. nsize(:,jt)==0 ) nsize(:,jt) = -1
253 
254  CASE ('BLD')
255  WHERE (u%XTOWN (:)==0. .AND. nsize(:,jt)==0 ) nsize(:,jt) = -1
256 
257  CASE ('NAT')
258  WHERE (u%XNATURE(:)==0. .AND. nsize(:,jt)==0 ) nsize(:,jt) = -1
259  !
260  ! for fields calculated by vegtype
261  IF (PRESENT(pvegtype) .AND.SIZE(nsize,2)>1) THEN
262  ! only for the natural part
263  IF (u%LECOSG) THEN
264  jtn = jt - sum(ntype(1:2))
265  nsize(:,1:sum(ntype(1:2))) = -1
266  ELSE
267  jtn = jt
268  ENDIF
269  IF ( jtn <= SIZE(pvegtype,2) ) THEN
270  ALLOCATE(zvegtype(u%NSIZE_FULL))
271  CALL unpack_same_rank(imask,pvegtype(:,jtn),zvegtype)
272  WHERE (zvegtype(:)==0. .AND. nsize(:,jt)==0) nsize(:,jt) = -1
273  DEALLOCATE(zvegtype)
274  ELSE
275  nsize(:,jt) = -1
276  ENDIF
277  ENDIF
278 
279  CASE ('SEA')
280  WHERE (u%XSEA (:)==0. .AND. nsize(:,jt)==0 ) nsize(:,jt) = -1
281 
282  CASE ('WAT')
283  WHERE (u%XWATER (:)==0. .AND. nsize(:,jt)==0 ) nsize(:,jt) = -1
284 
285  END SELECT
286 
287  ENDDO
288 !
289 !-------------------------------------------------------------------------------
290 !
291 !* 5. Interpolation if some points are not initialized (no data for these points)
292 ! ------------------------------------------------
293 !
294  DO jt=1,SIZE(nsize,2)
295 
296  IF (.NOT.u%LECOSG.AND.jt>nvegtype) EXIT
297 
298  !multitype input file
299  IF (SIZE(zfield,2)>1) THEN
300 
301  !fields defined only on the not-bare soil part
302  IF ( (yfield(1:3)=='LAI'.OR.yfield(1:10)=='ALBNIR_VEG'.OR.yfield(1:10)=='ALBVIS_VEG') .OR. &
303  (SIZE(zfield,2)>1.AND.yfield(1:6)=='H_TREE') ) THEN
304 
305  IF ( (.NOT.u%LECOSG.AND.jt<=3).OR.(u%LECOSG.AND.jt<=sum(ntype(1:2))+3) ) THEN
306  zfield(:,jt) = 0.
307  nsize(:,jt) = 1
308  ENDIF
309 
310  ! height of trees only defined for tree vegtypes
311  IF (yfield(1:6)=='H_TREE') THEN
312  IF ((.NOT.u%LECOSG.AND.((jt>=7 .AND. jt<=12) .OR. (jt>=18 .AND. jt<=19))).OR. &
313  ( u%LECOSG.AND.((jt<=(sum(ntype(1:2))+3).OR.jt>=(sum(ntype(1:2))+13)).AND.jt/=22) ) ) THEN
314  zfield(:,jt) = 0.
315  nsize(:,jt) = 1.
316  ENDIF
317  ENDIF
318 
319  ENDIF
320 
321  ! if the cover / vegtype is not present on the area
322  !ICASE = 0
323  !IF (.NOT.U%LECOSG) THEN
324  ! IF (.NOT.LVEG_PRES(JT)) ICASE=1
325  !ENDIF
326  !IF( (U%LECOSG.AND..NOT.U%LCOVER(JT)) .OR. ICASE==1 ) THEN
327  ! ZFIELD(:,JT) = 0.
328  ! NSIZE (:,JT) = 1.
329  !ENDIF
330 
331  ENDIF
332 
333  IF (punif/=xundef) THEN
334  CALL interpol_field(ug, u, hprogram,iluout,nsize(:,jt),zfield(:,jt),hfield,pdef=punif,knpts=inpts)
335  ELSE
336  CALL interpol_field(ug, u, hprogram,iluout,nsize(:,jt),zfield(:,jt),hfield)
337  ENDIF
338 
339  ENDDO
340 !
341  DEALLOCATE(nsize )
342  DEALLOCATE(xsumval )
343 !
344 !-------------------------------------------------------------------------------
345 !
346 ELSEIF (punif/=xundef) THEN
347 !
348 !* 3.1 Use of the presribed field
349 ! --------------------------
350 !
351  zfield(:,:) = punif
352 !
353 !
354 END IF
355 !
356 ! only the case nature is treated for now, to adapt for town later
357 IF (harea=='NAT'.AND.SIZE(zfield,2)>SIZE(pfield,2).AND.u%LECOSG) THEN
358  CALL pack_same_rank(imask,zfield(:,sum(ntype(1:2))+1:sum(ntype(1:3))),pfield(:,:))
359 ELSE
360  CALL pack_same_rank(imask,zfield(:,1:SIZE(pfield,2)),pfield(:,:))
361 ENDIF
362 !
363 DEALLOCATE(zfield)
364 DEALLOCATE(imask)
365 !
366 IF (lhook) CALL dr_hook('PGD_FIELDIN',1,zhook_handle)
367 
368 !
369 !-------------------------------------------------------------------------------
370 !
371 END SUBROUTINE pgd_fieldin
real, dimension(:,:,:), allocatable xvallist
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
character(len=3) catype
integer, dimension(:,:), allocatable nsize_all
real, dimension(:,:,:), allocatable xall
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)
integer, parameter jprb
Definition: parkind1.F90:32
integer, dimension(:,:), allocatable nvalnbr
real, dimension(:,:), allocatable xsumval
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
logical lhook
Definition: yomhook.F90:15
integer, dimension(:,:), allocatable nsize
integer, dimension(:,:,:), allocatable nvalcount
subroutine treat_field(UG, U, USS, HPROGRAM, HSCHEME, HFILETYPE, HSUBROUTINE, HFILENAME, HFIELD, PPGDARRAY)
Definition: treat_field.F90:10
subroutine pgd_fieldin(DTCO, UG, U, USS, HPROGRAM, HFIELD, HAREA, HFILE, HFILETYPE, PUNIF,
Definition: pgd_fieldin.F90:8
integer, parameter jpvalmax
subroutine interpol_field(UG, U, HPROGRAM, KLUOUT, KCODE, PFIELD, HFIELD, PDE