SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
zoom_pgd_cover.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 zoom_pgd_cover (DTCO, UG, U, &
7  hprogram,hinifile,hinifiletype,oecoclimap)
8 ! ###########################################################
9 
10 !!
11 !! PURPOSE
12 !! -------
13 !! This program prepares the physiographic data fields.
14 !!
15 !! METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !! AUTHOR
30 !! ------
31 !!
32 !! V. Masson Meteo-France
33 !!
34 !! MODIFICATION
35 !! ------------
36 !!
37 !! Original 13/10/03
38 ! Modification 17/04/12 M.Tomasini All COVER physiographic fields are now
39 !! interpolated for spawning =>
40 !! ABOR1_SFX if (.NOT.OECOCLIMAP) in comment
41 !----------------------------------------------------------------------------
42 !
43 !* 0. DECLARATION
44 ! -----------
45 !
46 !
47 !
48 !
51 USE modd_surf_atm_n, ONLY : surf_atm_t
52 !
53 USE modd_surf_par, ONLY : xundef
54 USE modd_data_cover_par, ONLY : jpcover
55 USE modd_prep, ONLY : cingrid_type, cinterp_type
56 !
58 !
59 USE modi_convert_cover_frac
60 USE modi_open_aux_io_surf
62 USE modi_close_aux_io_surf
63 USE modi_prep_grid_extern
64 USE modi_hor_interpol
65 USE modi_prep_output_grid
66 USE modi_old_name
67 USE modi_sum_on_all_procs
68 USE modi_get_luout
69 USE modi_clean_prep_output_grid
70 USE modi_get_1d_mask
71 !
72 USE yomhook ,ONLY : lhook, dr_hook
73 USE parkind1 ,ONLY : jprb
74 !
75 IMPLICIT NONE
76 !
77 !* 0.1 Declaration of dummy arguments
78 ! ------------------------------
79 !
80 !
81 TYPE(data_cover_t), INTENT(INOUT) :: dtco
82 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
83 TYPE(surf_atm_t), INTENT(INOUT) :: u
84 !
85  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling
86  CHARACTER(LEN=28), INTENT(IN) :: hinifile ! input atmospheric file name
87  CHARACTER(LEN=6), INTENT(IN) :: hinifiletype! input atmospheric file type
88 LOGICAL, INTENT(OUT) :: oecoclimap ! flag to use ecoclimap
89 !
90 !
91 !* 0.2 Declaration of local variables
92 ! ------------------------------
93 !
94 INTEGER :: icpt1, icpt2
95 INTEGER :: iresp
96 INTEGER :: iluout
97 INTEGER :: ini ! total 1D dimension (input grid)
98 INTEGER :: il ! total 1D dimension (output grid)
99 INTEGER :: jcover ! loop counter
100 INTEGER :: iversion ! surface version
101 REAL, DIMENSION(:,:), POINTER :: zcover
102 REAL, DIMENSION(:,:), POINTER :: zsea1, zwater1, znature1, ztown1
103 REAL, DIMENSION(:,:), POINTER :: zsea2, zwater2, znature2, ztown2
104 REAL, DIMENSION(:), ALLOCATABLE :: zsum
105  CHARACTER(LEN=12) :: yrecfm ! Name of the article to be read
106 REAL(KIND=JPRB) :: zhook_handle
107 !------------------------------------------------------------------------------
108 IF (lhook) CALL dr_hook('ZOOM_PGD_COVER',0,zhook_handle)
109  CALL get_luout(hprogram,iluout)
110 !
111 !* 1. Preparation of IO for reading in the file
112 ! -----------------------------------------
113 !
114 !* Note that all points are read, even those without physical meaning.
115 ! These points will not be used during the horizontal interpolation step.
116 ! Their value must be defined as XUNDEF.
117 !
118  CALL open_aux_io_surf(&
119  hinifile,hinifiletype,'FULL ')
120 !
121  CALL read_surf(&
122  hprogram,'ECOCLIMAP',oecoclimap,iresp)
123 !
124 !------------------------------------------------------------------------------
125 !
126 !* 2. Reading of grid
127 ! ---------------
128 !
129  CALL prep_grid_extern(&
130  hinifiletype,iluout,cingrid_type,cinterp_type,ini)
131 !
132  CALL prep_output_grid(ug, u, &
133  iluout,ug%CGRID,ug%XGRID_PAR,ug%XLAT,ug%XLON)
134 !
135 !------------------------------------------------------------------------------
136 !
137 !* 3. Reading of cover
138 ! ----------------
139 !
140 yrecfm='VERSION'
141  CALL read_surf(&
142  hprogram,yrecfm,iversion,iresp)
143 !
144 ALLOCATE(u%LCOVER(jpcover))
145  CALL old_name(&
146  hprogram,'COVER_LIST ',yrecfm)
147  CALL read_surf(&
148  hprogram,yrecfm,u%LCOVER(:),iresp,hdir='-')
149 !
150 ALLOCATE(zcover(ini,count(u%LCOVER)))
151  CALL read_surf_cov(&
152  hprogram,yrecfm,zcover(:,:),u%LCOVER,iresp,hdir='A')
153 !
154 ALLOCATE(zsea1(ini,1))
155 ALLOCATE(znature1(ini,1))
156 ALLOCATE(zwater1(ini,1))
157 ALLOCATE(ztown1(ini,1))
158 !
159 IF (iversion>=7) THEN
160  CALL read_surf(&
161  hprogram,'FRAC_SEA ',zsea1(:,1), iresp,hdir='A')
162  CALL read_surf(&
163  hprogram,'FRAC_NATURE',znature1(:,1),iresp,hdir='A')
164  CALL read_surf(&
165  hprogram,'FRAC_WATER ',zwater1(:,1), iresp,hdir='A')
166  CALL read_surf(&
167  hprogram,'FRAC_TOWN ',ztown1(:,1), iresp,hdir='A')
168  !
169 ELSE
170  CALL convert_cover_frac(dtco, &
171  zcover,u%LCOVER,zsea1(:,1),znature1(:,1),ztown1(:,1),zwater1(:,1))
172 ENDIF
173 !
174  CALL close_aux_io_surf(hinifile,hinifiletype)
175 !------------------------------------------------------------------------------
176 !
177 !* 4. Interpolations
178 ! --------------
179 !
180 il = SIZE(ug%XLAT)
181 ALLOCATE(u%XCOVER(il,count(u%LCOVER)))
182 !
183  CALL hor_interpol(dtco, u, &
184  iluout,zcover,u%XCOVER)
185 !
186 DEALLOCATE(zcover)
187 !
188 ALLOCATE(zcover(il,count(u%LCOVER)))
189 icpt1 = 0
190 icpt2 = 0
191 DO jcover = 1,jpcover
192  IF (u%LCOVER(jcover)) THEN
193  icpt1 = icpt1 + 1
194  IF (all(u%XCOVER(:,icpt1)==0.)) THEN
195  u%LCOVER(jcover) = .false.
196  ELSE
197  icpt2 = icpt2 + 1
198  zcover(:,icpt2) = u%XCOVER(:,icpt1)
199  ENDIF
200  ENDIF
201 ENDDO
202 !
203 DEALLOCATE(u%XCOVER)
204 ALLOCATE(u%XCOVER(il,icpt2))
205 u%XCOVER(:,:) = zcover(:,1:icpt2)
206 DEALLOCATE(zcover)
207 !
208 ALLOCATE(zsea2(il,1))
209 ALLOCATE(znature2(il,1))
210 ALLOCATE(zwater2(il,1))
211 ALLOCATE(ztown2(il,1))
212 !
213  CALL hor_interpol(dtco, u, &
214  iluout,zsea1,zsea2)
215  CALL hor_interpol(dtco, u, &
216  iluout,znature1,znature2)
217  CALL hor_interpol(dtco, u, &
218  iluout,zwater1,zwater2)
219  CALL hor_interpol(dtco, u, &
220  iluout,ztown1,ztown2)
221 !
222 DEALLOCATE(zsea1)
223 DEALLOCATE(znature1)
224 DEALLOCATE(zwater1)
225 DEALLOCATE(ztown1)
226 !
227 ALLOCATE(u%XSEA (il))
228 ALLOCATE(u%XNATURE(il))
229 ALLOCATE(u%XWATER (il))
230 ALLOCATE(u%XTOWN (il))
231 !
232 u%XSEA(:) = zsea2(:,1)
233 u%XNATURE(:)= znature2(:,1)
234 u%XWATER(:) = zwater2(:,1)
235 u%XTOWN(:) = ztown2(:,1)
236 !
237 DEALLOCATE(zsea2)
238 DEALLOCATE(znature2)
239 DEALLOCATE(zwater2)
240 DEALLOCATE(ztown2)
241 !
243 !------------------------------------------------------------------------------
244 !
245 !* 5. Coherence check
246 ! ---------------
247 !
248 ALLOCATE(zsum(il))
249 zsum = 0.
250 DO jcover=1,SIZE(u%XCOVER,2)
251  zsum(:) = zsum(:) + u%XCOVER(:,jcover)
252 END DO
253 !
254 DO jcover=1,SIZE(u%XCOVER,2)
255  WHERE(zsum(:)/=0.) u%XCOVER(:,jcover) = u%XCOVER(:,jcover)/zsum(:)
256 END DO
257 !
258 DO jcover=1,SIZE(u%XCOVER,2)
259  IF (all(u%XCOVER(:,jcover)==0.)) u%LCOVER(jcover) = .false.
260 END DO
261 !------------------------------------------------------------------------------
262 !
263 !* 6. Fractions
264 ! ---------
265 !
266 ! When the model runs in multiproc, NSIZE* represents the number of points
267 ! on a proc, and NDIM* the total number of points on all procs.
268 ! The following definition of NDIM* won't be correct any more when the PGD
269 ! runs in multiproc.
270 !
271 u%NSIZE_NATURE = count(u%XNATURE(:) > 0.0)
272 u%NSIZE_WATER = count(u%XWATER (:) > 0.0)
273 u%NSIZE_SEA = count(u%XSEA (:) > 0.0)
274 u%NSIZE_TOWN = count(u%XTOWN (:) > 0.0)
275 u%NSIZE_FULL = il
276 !
277 u%NDIM_NATURE = sum_on_all_procs(hprogram,ug%CGRID,u%XNATURE(:) > 0., 'DIM')
278 u%NDIM_WATER = sum_on_all_procs(hprogram,ug%CGRID,u%XWATER (:) > 0., 'DIM')
279 u%NDIM_SEA = sum_on_all_procs(hprogram,ug%CGRID,u%XSEA (:) > 0., 'DIM')
280 u%NDIM_TOWN = sum_on_all_procs(hprogram,ug%CGRID,u%XTOWN (:) > 0., 'DIM')
281 zsum=1.
282 u%NDIM_FULL = sum_on_all_procs(hprogram,ug%CGRID,zsum(:) ==1., 'DIM')
283 DEALLOCATE(zsum)
284 !
285 ALLOCATE(u%NR_NATURE (u%NSIZE_NATURE))
286 ALLOCATE(u%NR_TOWN (u%NSIZE_TOWN ))
287 ALLOCATE(u%NR_WATER (u%NSIZE_WATER ))
288 ALLOCATE(u%NR_SEA (u%NSIZE_SEA ))
289 !
290 IF (u%NSIZE_SEA >0)CALL get_1d_mask( u%NSIZE_SEA, u%NSIZE_FULL, u%XSEA , u%NR_SEA )
291 IF (u%NSIZE_WATER >0)CALL get_1d_mask( u%NSIZE_WATER, u%NSIZE_FULL, u%XWATER , u%NR_WATER )
292 IF (u%NSIZE_TOWN >0)CALL get_1d_mask( u%NSIZE_TOWN, u%NSIZE_FULL, u%XTOWN , u%NR_TOWN )
293 IF (u%NSIZE_NATURE>0)CALL get_1d_mask( u%NSIZE_NATURE, u%NSIZE_FULL, u%XNATURE, u%NR_NATURE)
294 IF (lhook) CALL dr_hook('ZOOM_PGD_COVER',1,zhook_handle)
295 
296 !_______________________________________________________________________________
297 !
298 END SUBROUTINE zoom_pgd_cover
subroutine, public read_surf_cov(HPROGRAM, HREC, PFIELD, OFLAG, KRESP, HCOMMENT, HDIR)
subroutine clean_prep_output_grid
integer function sum_on_all_procs(HPROGRAM, HGRID, OIN, HNAME)
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine hor_interpol(DTCO, U, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:6
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine get_1d_mask(KSIZE, KFRAC, PFRAC, KMASK)
Definition: get_1d_mask.F90:5
subroutine zoom_pgd_cover(DTCO, UG, U, HPROGRAM, HINIFILE, HINIFILETYPE, OECOCLIMAP)
subroutine prep_grid_extern(HFILETYPE, KLUOUT, HGRIDTYPE, HINTERP_TYPE, KNI)
subroutine prep_output_grid(UG, U, KLUOUT, HGRID, PGRID_PAR, PLAT, PLON)
subroutine convert_cover_frac(DTCO, PCOVER, OCOVER, PSEA, PNATURE, PTOWN, PWATER)
subroutine old_name(HPROGRAM, HRECIN, HRECOUT)
Definition: old_name.F90:6