Newer
Older

Juan Escobar
committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!SFX_LIC for details. version 1.
! #########
SUBROUTINE ZOOM_PGD_COVER (DTCO, UG, U,GCP, &
HPROGRAM,HINIFILE,HINIFILETYPE,OECOCLIMAP)
! ###########################################################
!!
!! PURPOSE
!! -------
!! This program prepares the physiographic data fields.
!!
!! METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!! AUTHOR
!! ------
!!
!! V. Masson Meteo-France
!!
!! MODIFICATION
!! ------------
!!
!! Original 13/10/03
! Modification 17/04/12 M.Tomasini All COVER physiographic fields are now
!! interpolated for spawning =>
!! ABOR1_SFX if (.NOT.OECOCLIMAP) in comment
! Modification 05/02/15 M.Moge : MPPDB_CHECK + use NSIZE_FULL instead of SIZE(XLAT) (for clarity)
!! J.Escobar 18/12/2015 : missing interface

Juan Escobar
committed
!! J.Escobar 12/06/2015 : Bug in SPAWNING in // , compute/update LCOVER in // with SUM_ON_ALL_PROCS

Juan Escobar
committed
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
!----------------------------------------------------------------------------
!
!* 0. DECLARATION
! -----------
!
!
!
!
USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t
USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t
USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t
USE MODD_GRID_CONF_PROJ, ONLY : GRID_CONF_PROJ_t
!
USE MODD_SURF_PAR, ONLY : XUNDEF
USE MODD_DATA_COVER_PAR, ONLY : JPCOVER
USE MODD_PREP, ONLY : CINGRID_TYPE, CINTERP_TYPE
!
USE MODE_READ_SURF_COV, ONLY : READ_SURF_COV
!
USE MODI_CONVERT_COVER_FRAC
USE MODI_OPEN_AUX_IO_SURF
USE MODI_READ_SURF
USE MODI_CLOSE_AUX_IO_SURF
USE MODI_PREP_GRID_EXTERN
USE MODI_HOR_INTERPOL
USE MODI_HOR_INTERPOL_1COV
USE MODI_PREP_OUTPUT_GRID
USE MODI_OLD_NAME
USE MODI_SUM_ON_ALL_PROCS
USE MODI_GET_LUOUT
USE MODI_CLEAN_PREP_OUTPUT_GRID
USE MODI_GET_1D_MASK
USE MODI_READ_LCOVER
#ifdef SFX_MNH
USE MODI_READ_SURFX2COV_1COV_MNH
#endif
!
USE YOMHOOK ,ONLY : LHOOK, DR_HOOK
USE PARKIND1 ,ONLY : JPRB
!

Juan Escobar
committed
#ifdef MNH_PARALLEL

Juan Escobar
committed
USE MODE_MPPDB
!

Juan Escobar
committed
#endif

Juan Escobar
committed
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
IMPLICIT NONE
!
!* 0.1 Declaration of dummy arguments
! ------------------------------
!
!
TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO
TYPE(SURF_ATM_GRID_t), INTENT(INOUT) :: UG
TYPE(SURF_ATM_t), INTENT(INOUT) :: U
TYPE(GRID_CONF_PROJ_t),INTENT(INOUT) :: GCP
!
CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling
CHARACTER(LEN=28), INTENT(IN) :: HINIFILE ! input atmospheric file name
CHARACTER(LEN=6), INTENT(IN) :: HINIFILETYPE! input atmospheric file type
LOGICAL, INTENT(OUT) :: OECOCLIMAP ! flag to use ecoclimap
!
!
!* 0.2 Declaration of local variables
! ------------------------------
!
INTEGER :: ICPT1, ICPT2
INTEGER :: IRESP
INTEGER :: ILUOUT
INTEGER :: INI ! total 1D dimension (input grid)
INTEGER :: IL ! total 1D dimension (output grid)
INTEGER :: JCOVER ! loop counter
INTEGER :: IVERSION ! surface version
#ifdef MNH_PARALLEL
REAL, DIMENSION(:), POINTER :: ZCOVER1D
#endif
REAL, DIMENSION(:,:), POINTER :: ZCOVER
REAL, DIMENSION(:,:), POINTER :: ZSEA1, ZWATER1, ZNATURE1, ZTOWN1
REAL, DIMENSION(:,:), POINTER :: ZSEA2, ZWATER2, ZNATURE2, ZTOWN2
REAL, DIMENSION(:), ALLOCATABLE :: ZSUM
CHARACTER(LEN=16) :: YRECFM ! Name of the article to be read
CHARACTER(LEN=100) :: YCOMMENT
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!------------------------------------------------------------------------------
IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_COVER',0,ZHOOK_HANDLE)
CALL GET_LUOUT(HPROGRAM,ILUOUT)
!
!* 1. Preparation of IO for reading in the file
! -----------------------------------------
!
!* Note that all points are read, even those without physical meaning.
! These points will not be used during the horizontal interpolation step.
! Their value must be defined as XUNDEF.
!
CALL OPEN_AUX_IO_SURF(&
HINIFILE,HINIFILETYPE,'FULL ')
!
CALL READ_SURF(&
HPROGRAM,'ECOCLIMAP',OECOCLIMAP,IRESP)
!
!------------------------------------------------------------------------------
!
!* 2. Reading of grid
! ---------------
!
CALL PREP_GRID_EXTERN(GCP,&
HINIFILETYPE,ILUOUT,CINGRID_TYPE,CINTERP_TYPE,INI)
!
CALL PREP_OUTPUT_GRID(UG, U, &
ILUOUT,UG%CGRID,UG%XGRID_PAR,UG%XLAT,UG%XLON)

Juan Escobar
committed
#ifdef MNH_PARALLEL

Juan Escobar
committed
CALL MPPDB_CHECK_SURFEX2D(UG%XLAT,"ZOOM_PGD_COVER:XLAT",PRECISION,ILUOUT)
CALL MPPDB_CHECK_SURFEX2D(UG%XLON,"ZOOM_PGD_COVER:XLON",PRECISION,ILUOUT)

Juan Escobar
committed
#endif

Juan Escobar
committed
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
!
!------------------------------------------------------------------------------
!
!* 3. Reading of cover
! ----------------
!
YRECFM='VERSION'
CALL READ_SURF(&
HPROGRAM,YRECFM,IVERSION,IRESP)
!
ALLOCATE(U%LCOVER(JPCOVER))
!
ALLOCATE(ZSEA1 (INI,1))
ALLOCATE(ZNATURE1(INI,1))
ALLOCATE(ZWATER1 (INI,1))
ALLOCATE(ZTOWN1 (INI,1))
!
IF (IVERSION>=7) THEN
CALL READ_SURF(&
HPROGRAM,'FRAC_SEA ',ZSEA1(:,1), IRESP,HDIR='A')
CALL READ_SURF(&
HPROGRAM,'FRAC_NATURE',ZNATURE1(:,1),IRESP,HDIR='A')
CALL READ_SURF(&
HPROGRAM,'FRAC_WATER ',ZWATER1(:,1), IRESP,HDIR='A')
CALL READ_SURF(&
HPROGRAM,'FRAC_TOWN ',ZTOWN1(:,1), IRESP,HDIR='A')
CALL OLD_NAME(&
HPROGRAM,'COVER_LIST ',YRECFM)
CALL READ_LCOVER(HPROGRAM,U%LCOVER)
#ifdef MNH_PARALLEL
ALLOCATE(ZCOVER1D(INI))
#else
ALLOCATE(ZCOVER(INI,COUNT(U%LCOVER)))
CALL READ_SURF_COV(&
HPROGRAM,YRECFM,ZCOVER(:,:),U%LCOVER,IRESP,HDIR='A')
#endif
!
ELSE
#ifdef MNH_PARALLEL
! we assume that IVERSION>=7
#else
CALL OLD_NAME(&
HPROGRAM,'COVER_LIST ',YRECFM)
CALL READ_LCOVER(HPROGRAM,U%LCOVER)
!
ALLOCATE(ZCOVER(INI,COUNT(U%LCOVER)))
CALL READ_SURF_COV(&
HPROGRAM,YRECFM,ZCOVER(:,:),U%LCOVER,IRESP,HDIR='A')
CALL CONVERT_COVER_FRAC(DTCO, &
ZCOVER,U%LCOVER,ZSEA1(:,1),ZNATURE1(:,1),ZTOWN1(:,1),ZWATER1(:,1))
#endif
ENDIF
!
! CALL CLOSE_AUX_IO_SURF(HINIFILE,HINIFILETYPE)
!------------------------------------------------------------------------------
!
!* 4. Reading of cover & Interpolations
! --------------
!
IL = U%NSIZE_FULL
ALLOCATE(U%XCOVER(IL,COUNT(U%LCOVER)))
!
! on lit les cover une apres l'autre, et on appelle hor_interpol sur chaque cover separement
!
#ifdef MNH_PARALLEL
IF ( HPROGRAM == 'MESONH' ) THEN
ICPT1 = 0
DO JCOVER=1,JPCOVER
IF ( U%LCOVER( JCOVER ) ) THEN
ICPT1 = ICPT1 + 1
CALL READ_SURFX2COV_1COV_MNH(YRECFM,INI,JCOVER,ZCOVER1D(:),IRESP,YCOMMENT,'A')
CALL HOR_INTERPOL_1COV(DTCO, U,GCP,ILUOUT,ZCOVER1D,U%XCOVER(:,ICPT1))
CALL MPPDB_CHECK_SURFEX3D(U%XCOVER,"ZOOM_PGD_COVER:XCOVER",PRECISION,ILUOUT,'FULL',JPCOVER)
ENDIF
!
ENDDO
ENDIF
DEALLOCATE(ZCOVER1D)
#else
CALL HOR_INTERPOL(DTCO, U,GCP, &
ILUOUT,ZCOVER,U%XCOVER)
DEALLOCATE(ZCOVER)
#endif
!
ALLOCATE(ZCOVER(IL,COUNT(U%LCOVER)))
ICPT1 = 0
ICPT2 = 0
DO JCOVER = 1,JPCOVER
IF (U%LCOVER(JCOVER)) THEN
ICPT1 = ICPT1 + 1

Juan Escobar
committed
IF ( SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XCOVER(:,ICPT1)/=0., 'COV') == 0 ) THEN

Juan Escobar
committed
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
U%LCOVER(JCOVER) = .FALSE.
ELSE
ICPT2 = ICPT2 + 1
ZCOVER(:,ICPT2) = U%XCOVER(:,ICPT1)
ENDIF
ENDIF
ENDDO
!
DEALLOCATE(U%XCOVER)
ALLOCATE(U%XCOVER(IL,ICPT2))
U%XCOVER(:,:) = ZCOVER(:,1:ICPT2)
DEALLOCATE(ZCOVER)
!
CALL CLOSE_AUX_IO_SURF(HINIFILE,HINIFILETYPE)
ALLOCATE(ZSEA2 (IL,1))
ALLOCATE(ZNATURE2(IL,1))
ALLOCATE(ZWATER2 (IL,1))
ALLOCATE(ZTOWN2 (IL,1))
!
CALL HOR_INTERPOL(DTCO, U,GCP, &
ILUOUT,ZSEA1,ZSEA2)
CALL HOR_INTERPOL(DTCO, U,GCP, &
ILUOUT,ZNATURE1,ZNATURE2)
CALL HOR_INTERPOL(DTCO, U,GCP, &
ILUOUT,ZWATER1,ZWATER2)
CALL HOR_INTERPOL(DTCO, U,GCP, &
ILUOUT,ZTOWN1,ZTOWN2)
!
DEALLOCATE(ZSEA1)
DEALLOCATE(ZNATURE1)
DEALLOCATE(ZWATER1)
DEALLOCATE(ZTOWN1)
!
ALLOCATE(U%XSEA (IL))
ALLOCATE(U%XNATURE(IL))
ALLOCATE(U%XWATER (IL))
ALLOCATE(U%XTOWN (IL))
!
U%XSEA(:) = ZSEA2 (:,1)
U%XNATURE(:)= ZNATURE2(:,1)
U%XWATER(:) = ZWATER2 (:,1)
U%XTOWN(:) = ZTOWN2 (:,1)
!
DEALLOCATE(ZSEA2)
DEALLOCATE(ZNATURE2)
DEALLOCATE(ZWATER2)
DEALLOCATE(ZTOWN2)
!
CALL CLEAN_PREP_OUTPUT_GRID
!------------------------------------------------------------------------------
!
!* 5. Coherence check
! ---------------
!
ALLOCATE(ZSUM(IL))
ZSUM = 0.
DO JCOVER=1,SIZE(U%XCOVER,2)
ZSUM(:) = ZSUM(:) + U%XCOVER(:,JCOVER)
END DO

Juan Escobar
committed
#ifdef MNH_PARALLEL

Juan Escobar
committed
CALL MPPDB_CHECK_SURFEX2D(ZSUM,"ZOOM_PGD_COVER:ZSUM",PRECISION,ILUOUT)

Juan Escobar
committed
#endif

Juan Escobar
committed
!
DO JCOVER=1,SIZE(U%XCOVER,2)
WHERE(ZSUM(:)/=0.) U%XCOVER(:,JCOVER) = U%XCOVER(:,JCOVER)/ZSUM(:)
END DO
!
DO JCOVER=1,SIZE(U%XCOVER,2)

Juan Escobar
committed
IF ( SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XCOVER(:,JCOVER)/=0., 'COV') == 0 ) THEN
U%LCOVER(JCOVER) = .FALSE.
END IF

Juan Escobar
committed
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
END DO
!------------------------------------------------------------------------------
!
!* 6. Fractions
! ---------
!
! When the model runs in multiproc, NSIZE* represents the number of points
! on a proc, and NDIM* the total number of points on all procs.
! The following definition of NDIM* won't be correct any more when the PGD
! runs in multiproc.
!
U%NSIZE_NATURE = COUNT(U%XNATURE(:) > 0.0)
U%NSIZE_WATER = COUNT(U%XWATER (:) > 0.0)
U%NSIZE_SEA = COUNT(U%XSEA (:) > 0.0)
U%NSIZE_TOWN = COUNT(U%XTOWN (:) > 0.0)
U%NSIZE_FULL = IL
!
U%NDIM_NATURE = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XNATURE(:) > 0., 'DIM')
U%NDIM_WATER = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XWATER (:) > 0., 'DIM')
U%NDIM_SEA = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XSEA (:) > 0., 'DIM')
U%NDIM_TOWN = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,U%XTOWN (:) > 0., 'DIM')
ZSUM=1.
U%NDIM_FULL = SUM_ON_ALL_PROCS(HPROGRAM,UG%CGRID,ZSUM (:) ==1., 'DIM')
DEALLOCATE(ZSUM)
!
ALLOCATE(U%NR_NATURE (U%NSIZE_NATURE))
ALLOCATE(U%NR_TOWN (U%NSIZE_TOWN ))
ALLOCATE(U%NR_WATER (U%NSIZE_WATER ))
ALLOCATE(U%NR_SEA (U%NSIZE_SEA ))
!
IF (U%NSIZE_SEA >0)CALL GET_1D_MASK( U%NSIZE_SEA, U%NSIZE_FULL, U%XSEA , U%NR_SEA )
IF (U%NSIZE_WATER >0)CALL GET_1D_MASK( U%NSIZE_WATER, U%NSIZE_FULL, U%XWATER , U%NR_WATER )
IF (U%NSIZE_TOWN >0)CALL GET_1D_MASK( U%NSIZE_TOWN, U%NSIZE_FULL, U%XTOWN , U%NR_TOWN )
IF (U%NSIZE_NATURE>0)CALL GET_1D_MASK( U%NSIZE_NATURE, U%NSIZE_FULL, U%XNATURE, U%NR_NATURE)

Juan Escobar
committed
#ifdef MNH_PARALLEL

Juan Escobar
committed
CALL MPPDB_CHECK_SURFEX2D(U%XSEA,"ZOOM_PGD_COVER:XSEA",PRECISION,ILUOUT)
CALL MPPDB_CHECK_SURFEX2D(U%XWATER,"ZOOM_PGD_COVER:XWATER",PRECISION,ILUOUT)
CALL MPPDB_CHECK_SURFEX2D(U%XTOWN,"ZOOM_PGD_COVER:XTOWN",PRECISION,ILUOUT)
CALL MPPDB_CHECK_SURFEX2D(U%XNATURE,"ZOOM_PGD_COVER:XNATURE",PRECISION,ILUOUT)

Juan Escobar
committed
#endif

Juan Escobar
committed
IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_COVER',1,ZHOOK_HANDLE)
!_______________________________________________________________________________
!
END SUBROUTINE ZOOM_PGD_COVER