SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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 pgd_cover ( DGU, DTCO, UG, U, USS, &
7  hprogram,orm_river)
8 ! ##############################################################
9 !
10 !!**** *PGD_COVER* monitor for averaging and interpolations of cover fractions
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !! METHOD
16 !! ------
17 !!
18 !
19 !! EXTERNAL
20 !! --------
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! V. Masson Meteo-France
32 !!
33 !! MODIFICATION
34 !! ------------
35 !!
36 !! Original 10/12/97
37 !! B. Decharme 06/2008 limit of coast coverage under which the coast is replaced by sea or inland water
38 !! B. Decharme 06/2009 remove lack and sea as the user want
39 !! B. Decharme 07/2009 compatibility between Surfex and Orca (Nemo) grid (Earth Model)
40 !! B. Decharme 07/2012 if sea or water imposed to 1 in a grid cell: no extrapolation
41 !! B. Decharme 02/2014 Add LRM_RIVER and remove lake over antarctica
42 !!
43 !----------------------------------------------------------------------------
44 !
45 !* 0. DECLARATION
46 ! -----------
47 !
51 USE modd_surf_atm_n, ONLY : surf_atm_t
53 !
54 USE modd_surf_par, ONLY : xundef
55 USE modd_pgd_grid, ONLY : cgrid, nl, xgrid_par, ngrid_par
56 USE modd_pgdwork, ONLY : xsumcover, nsize
57 USE modd_data_cover_par, ONLY : jpcover, nrock, nsea, nwater, npermsnow
58 USE modd_data_cover, ONLY : xdata_town, xdata_sea, xdata_nature, xdata_water
59 !
60 USE modi_get_luout
63 !
65 !
66 USE modi_treat_field
67 USE modi_interpol_field2d
68 USE modi_convert_cover_frac
69 !
70 USE modi_read_lcover
71 USE modi_sum_on_all_procs
72 !
73 USE modi_read_nam_pgd_cover
74 !
75 USE modi_init_io_surf_n
76 USE modi_end_io_surf_n
77 !
78 USE modi_abor1_sfx
79 !
80 USE modi_pgd_ecoclimap2_data
81 !
82 #ifdef SFX_ASC
83 USE modd_io_surf_asc, ONLY : cfilein
84 #endif
85 #ifdef SFX_FA
86 USE modd_io_surf_fa, ONLY : cfilein_fa
87 #endif
88 #ifdef SFX_LFI
89 USE modd_io_surf_lfi, ONLY : cfilein_lfi
90 #endif
91 !
92 USE yomhook ,ONLY : lhook, dr_hook
93 USE parkind1 ,ONLY : jprb
94 !
95 IMPLICIT NONE
96 !
97 !* 0.1 Declaration of arguments
98 ! ------------------------
99 !
100 !
101 TYPE(diag_surf_atm_t), INTENT(INOUT) :: dgu
102 TYPE(data_cover_t), INTENT(INOUT) :: dtco
103 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
104 TYPE(surf_atm_t), INTENT(INOUT) :: u
105 TYPE(surf_atm_sso_t), INTENT(INOUT) :: uss
106 !
107  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! Type of program
108 LOGICAL, INTENT(OUT) :: orm_river ! delete river coverage (default = false)
109 !
110 !
111 !* 0.2 Declaration of local variables
112 ! ------------------------------
113 !
114  CHARACTER(LEN=10) :: yfield
115  CHARACTER(LEN=28) :: ycover ! file name for cover types
116  CHARACTER(LEN=6) :: yfiletype ! data file type
117 !
118 REAL :: xrm_cover ! limit of coverage under which the
119  ! cover is removed. Default is 1.E-6
120 REAL :: xrm_coast ! limit of coast coverage under which
121  ! the coast is replaced by sea. Default is 1.
122 REAL :: xrm_lake ! limit of inland lake coverage under which
123  ! the water is removed. Default is 0.0
124 REAL :: xrm_sea ! limit of sea coverage under which
125  ! the sea is removed. Default is 0.0
126 REAL :: xlat_ant ! Lattitude limit from Orca grid (Antartic)
127 !
128 REAL, DIMENSION(:), ALLOCATABLE :: zdef
129 REAL, DIMENSION(:), ALLOCATABLE :: zlat
130 REAL, DIMENSION(:), ALLOCATABLE :: xunif_cover ! value of each cover (cover will be
131 ! uniform on the horizontal)
132 REAL, DIMENSION(:), ALLOCATABLE :: zsea !to check compatibility between
133 REAL, DIMENSION(:), ALLOCATABLE :: zwater !prescribed fractions and ECOCLIMAP
134 REAL, DIMENSION(:), ALLOCATABLE :: znature
135 REAL, DIMENSION(:), ALLOCATABLE :: ztown
136 REAL, DIMENSION(:,:), ALLOCATABLE :: zcover_nature, zcover_town, zcover_sea, zcover_water, zcover
137 !
138 !
139 INTEGER :: iluout ! output listing logical unit
140 INTEGER :: iresp ! Error code after redding
141 INTEGER :: jcover ! loop counter on covers
142 INTEGER :: jl ! loop counter on horizontal points
143 INTEGER :: icover, icoversum, icover_old, icpt ! 0 if cover is not present, >1 if present somewhere
144 INTEGER :: ipermsnow, ieco2
145 INTEGER :: ic_nat, ic_twn, ic_wat, ic_sea
146 !
147 INTEGER, DIMENSION(1) :: imaxcover ! index of maximum cover for the given point
148 INTEGER, DIMENSION(:), POINTER :: imask_cover=>null()
149 INTEGER, DIMENSION(:), ALLOCATABLE :: imask_sea, imask_water
150 !
151 LOGICAL :: lorca_grid ! flag to compatibility between Surfex and Orca grid
152  ! (Earth Model over Antarctic)
153 LOGICAL :: limp_cover ! Imposed values for Cover from another PGD file
154 !
155 LOGICAL :: gpresent
156 !
157 LOGICAL :: lrm_river ! delete inland river coverage. Default is false
158 !
159 REAL, PARAMETER :: zlat_ant_water = -60. ! Lattitude limit to delete lake over antarctica
160 !
161 REAL(KIND=JPRB) :: zhook_handle
162 !
163 !---------------------------------------------------------------
164 !
165 !* 1. Initializations
166 ! ---------------
167 !
168 IF (lhook) CALL dr_hook('PGD_COVER',0,zhook_handle)
169 !
170  CALL get_luout(hprogram,iluout)
171 !
172 ALLOCATE(u%LCOVER (jpcover))
173 ALLOCATE(xunif_cover(jpcover))
174 !
175 u%LCOVER = .false.
176 xunif_cover = xundef
177 !
178 ieco2 = 0
179 !
180 !-------------------------------------------------------------------------------
181 !
182 !* 2. Input file for cover types
183 ! --------------------------
184 !
185  CALL read_nam_pgd_cover(hprogram, ycover, yfiletype, xunif_cover, &
186  xrm_cover, xrm_coast, xrm_lake, lrm_river, &
187  xrm_sea, lorca_grid, xlat_ant, limp_cover )
188 !
189 !-------------------------------------------------------------------------------
190 !
191 !* 3. Uniform field is prescribed
192 ! ---------------------------
193 !-------------------------------------------------------------------------------
194 !
195 IF (any(xunif_cover/=0.)) THEN
196 !
197 !* 3.1 Verification of the total input cover fractions
198 ! -----------------------------------------------
199 !
200  IF (abs(sum(xunif_cover)-1.)>1.e-6) THEN
201  WRITE(iluout,*) ' '
202  WRITE(iluout,*) '***************************************************'
203  WRITE(iluout,*) '* Error in COVER fractions preparation *'
204  WRITE(iluout,*) '* The prescribed covers does not fit *'
205  WRITE(iluout,*) '* The sum of all cover must be equal to 1 exactly *'
206  WRITE(iluout,*) '***************************************************'
207  WRITE(iluout,*) ' '
208  CALL abor1_sfx('PGD_COVER: SUM OF ALL COVER FRACTIONS MUST BE 1.')
209 !
210 !* 3.2 Use of the presribed cover fractions
211 ! ------------------------------------
212 !
213  ELSE
214  icover = count(xunif_cover(:)/=0.)
215  ALLOCATE(u%XCOVER(nl,icover))
216  icpt = 0
217  DO jcover=1,jpcover
218  IF (xunif_cover(jcover)/=0.) THEN
219  u%LCOVER(jcover) = .true.
220  icpt = icpt + 1
221  u%XCOVER(:,icpt) = xunif_cover(jcover)
222  ENDIF
223  END DO
224  u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
225  END IF
226 !
227 !* 3.3 No data
228 ! -------
229 !
230 ELSEIF (len_trim(ycover)==0) THEN
231  WRITE(iluout,*) ' '
232  WRITE(iluout,*) '***********************************************************'
233  WRITE(iluout,*) '* Error in COVER fractions preparation *'
234  WRITE(iluout,*) '* There is no prescribed cover fraction and no input file *'
235  WRITE(iluout,*) '***********************************************************'
236  WRITE(iluout,*) ' '
237  CALL abor1_sfx('PGD_COVER: NO PRESCRIBED COVER NOR INPUT FILE')
238 !
239 !-------------------------------------------------------------------------------
240 ELSEIF(limp_cover)THEN !LIMP_COVER (impose cover from input file at the same resolution)
241 !
242  IF(yfiletype=='NETCDF')THEN
243  CALL abor1_sfx('Use another format than netcdf for cover input file with LIMP_COVER')
244  ELSE
245 #ifdef SFX_ASC
246  cfilein = adjustl(adjustr(ycover)//'.txt')
247 #endif
248 #ifdef SFX_FA
249  cfilein_fa = adjustl(adjustr(ycover)//'.fa')
250 #endif
251 #ifdef SFX_LFI
252  cfilein_lfi = adjustl(ycover)
253 #endif
254  CALL init_io_surf_n(dtco, dgu, u, &
255  yfiletype,'FULL ','SURF ','READ ')
256  ENDIF
257 !
258  ALLOCATE(u%LCOVER(jpcover))
259  CALL read_lcover(&
260  yfiletype,u%LCOVER)
261 !
262  CALL read_surf_cov(&
263  yfiletype,'COVER',u%XCOVER(:,:),u%LCOVER,iresp)
264 !
265  CALL end_io_surf_n(yfiletype)
266 !
267 ELSE
268 !-------------------------------------------------------------------------------
269 !
270 !* 3. Averages the field
271 ! ------------------
272 !
273  ALLOCATE(nsize(nl) )
274  ALLOCATE(xsumcover(nl,jpcover))
275 !
276  nsize(:) = 0.
277  xsumcover(:,:) = 0.
278  CALL treat_field(ug, u, uss, &
279  hprogram,'SURF ',yfiletype,'A_COVR',ycover, &
280  'COVER ' )
281 
282 !
283 !* 4. Interpolation if some points are not initialized (no data for these points) (same time)
284 ! ---------------------------------------------------------------------------------------
285 !
286  WRITE(yfield,fmt='(A)') 'covers'
287  CALL interpol_field2d(ug, u, &
288  hprogram,iluout,nsize,u%XCOVER(:,:),yfield)
289 !
290 !-------------------------------------------------------------------------------
291 !
292 !* 5. Coherence check
293 ! ---------------
294 !
295  icover = SIZE(u%XCOVER,2)
296 !
297  u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
298 !
299  DEALLOCATE(nsize )
300  DEALLOCATE(xsumcover)
301 !
302  CALL make_mask_cover(imask_cover,icover)
303 !
304  ALLOCATE(imask_sea(SIZE(nsea)))
305  imask_sea(:) = 0
306  DO jl=1,SIZE(nsea)
307  DO jcover=1,icover
308  IF (imask_cover(jcover)==nsea(jl)) imask_sea(jl) = jcover
309  ENDDO
310  ENDDO
311  !
312  ALLOCATE(imask_water(SIZE(nwater)))
313  imask_water(:) = 0
314  DO jl=1,SIZE(nwater)
315  DO jcover=1,icover
316  IF (imask_cover(jcover)==nwater(jl)) imask_water(jl) = jcover
317  ENDDO
318  ENDDO
319  !
320  ipermsnow=0
321  DO jcover=1,icover
322  IF (imask_cover(jcover)==npermsnow) ipermsnow = jcover
323  ENDDO
324  !
325  ieco2 = 0
326  DO jcover=1,icover
327  IF (imask_cover(jcover)>300) THEN
328  ieco2 = jcover
329  EXIT
330  ENDIF
331  ENDDO
332 !
333 !-------------------------------------------------------------------------------
334 !
335 !* 6. Special treatments asked by user
336 ! --------------------------------
337 !
338 ! * removes cover with very small coverage
339  DO jl=1,SIZE(u%XCOVER,1)
340  imaxcover(:) = maxloc(u%XCOVER(jl,:))
341  DO jcover=1,icover
342  IF (u%XCOVER(jl,jcover)/=0.) THEN
343  IF (u%XCOVER(jl,jcover)<=xrm_cover .AND. jcover /= imaxcover(1)) THEN
344  u%XCOVER(jl,jcover) = 0.
345  END IF
346  ENDIF
347  END DO
348  END DO
349  !
350  ! * removes River if the user want
351  orm_river=lrm_river
352  IF(lrm_river.AND.imask_water(2)/=0)THEN
353  DO jl=1,SIZE(u%XCOVER,1)
354  imaxcover(:) = maxloc(u%XCOVER(jl,:))
355  IF(imask_water(2)/=imaxcover(1).AND.u%XCOVER(jl,imask_water(2))>0.)THEN
356  u%XCOVER(jl,imask_water(2)) = 0.
357  ENDIF
358  ENDDO
359  ENDIF
360  !
361  ! * removes lake as the user want
362  IF(xrm_lake>0.0)THEN
363  DO jl=1,SIZE(nwater)
364  IF (imask_water(jl)/=0) THEN
365  WHERE(u%XCOVER(:,imask_water(jl))<=xrm_lake)
366  u%XCOVER(:,imask_water(jl)) = 0.
367  ENDWHERE
368  ENDIF
369  ENDDO
370  ENDIF
371  !
372  ! * removes sea as the user want
373  IF(xrm_sea>0.0)THEN
374  DO jl=1,SIZE(nsea)
375  IF (imask_sea(jl)/=0) THEN
376  WHERE(u%XCOVER(:,imask_sea(jl))<=xrm_sea)
377  u%XCOVER(:,imask_sea(jl)) = 0.
378  ENDWHERE
379  ENDIF
380  ENDDO
381  ENDIF
382  !
383  !
384  ! * removes cover; replace by sea or inland water if sea > XRM_COAST
385  DO jcover=1,icover
386  !
387  DO jl=1,SIZE(nsea)
388  IF (imask_sea(jl)/=0) THEN
389  WHERE(u%XCOVER(:,imask_sea(jl))>=xrm_coast)
390  u%XCOVER(:,jcover) = 0.
391  u%XCOVER(:,imask_sea(jl)) = 1.
392  END WHERE
393  ENDIF
394  ENDDO
395  !
396  DO jl=1,SIZE(nwater)
397  IF (imask_water(jl)/=0) THEN
398  WHERE(u%XCOVER(:,imask_water(jl))>=xrm_coast)
399  u%XCOVER(:,jcover) = 0.
400  u%XCOVER(:,imask_water(jl)) = 1.
401  END WHERE
402  ENDIF
403  ENDDO
404  !
405  ENDDO
406 !
407 !
408 ! * Compatibility between Surfex and Orca grid
409 ! (Earth Model over water bodies and Antarctic)
410 !
411  IF(lorca_grid.AND.(cgrid=='GAUSS '.OR.cgrid=='LONLAT REG'))THEN
412 !
413  ALLOCATE(zlat(nl))
414  IF (cgrid=='GAUSS ') CALL get_gridtype_gauss(xgrid_par,plat=zlat)
415  IF (cgrid=='LONLAT REG') CALL get_gridtype_lonlat_reg(xgrid_par,plat=zlat)
416 !
417  DO jl=1,SIZE(nsea)
418  IF (imask_sea(jl)/=0.AND.ipermsnow/=0) THEN
419  WHERE(zlat(:)<xlat_ant.AND.u%XCOVER(:,imask_sea(jl))>0.0)
420  u%XCOVER(:,ipermsnow) = 1.0
421  u%XCOVER(:,imask_sea(jl)) = 0.0
422  ENDWHERE
423  ENDIF
424  ENDDO
425 
426  DO jl=1,SIZE(nwater)
427  IF (imask_water(jl)/=0.AND.ipermsnow/=0) THEN
428  WHERE(zlat(:)<zlat_ant_water.AND.u%XCOVER(:,imask_water(jl))>0.0)
429  u%XCOVER(:,ipermsnow) = 1.0
430  u%XCOVER(:,imask_water(jl)) = 0.0
431  ENDWHERE
432  ENDIF
433  ENDDO
434 !
435  DEALLOCATE(zlat)
436 !
437  ENDIF
438 !
439 !-------------------------------------------------------------------------------
440 !
441 !* 7. Coherence check
442 ! ---------------
443 !
444  u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
445 !
446  DEALLOCATE(imask_sea)
447  DEALLOCATE(imask_water)
448 !
449 !* 8. List of cover present
450 ! ---------------------
451 !
452  ALLOCATE(zcover(nl,icover))
453  zcover(:,:) = 0.
454 !
455  icover_old = icover
456  icover = 0
457 !
458  ieco2 = 0
459 !
460  u%LCOVER(:) = .false.
461  DO jcover=1,icover_old
462  icoversum = sum_on_all_procs(hprogram,cgrid,u%XCOVER(:,jcover)/=0., 'COV')
463  IF (icoversum>0) THEN
464  u%LCOVER(imask_cover(jcover))=.true.
465  icover = icover+1
466  zcover(:,icover) = u%XCOVER(:,jcover)
467  IF (imask_cover(jcover)>300) ieco2 = icover
468  ENDIF
469  END DO
470 !
471  DEALLOCATE(u%XCOVER)
472  ALLOCATE(u%XCOVER(nl,icover))
473  u%XCOVER(:,:) = zcover(:,1:icover)
474 !
475  DEALLOCATE(zcover)
476  DEALLOCATE(imask_cover)
477 !
478 !-------------------------------------------------------------------------------
479 END IF
480 !
481 DEALLOCATE(xunif_cover)
482 !-------------------------------------------------------------------------------
483 !
484 !
485 IF(.NOT.limp_cover)THEN
486 
487 !* 8. List of cover present
488 ! ---------------------
489 !
490  IF (ieco2/=0) THEN
491  IF ( sum_on_all_procs(hprogram,cgrid,any(u%XCOVER(:,ieco2:)>0.,dim=2),'COV' ) >0 ) &
492  CALL pgd_ecoclimap2_data(dtco, &
493  hprogram)
494  ENDIF
495 !
496 !-------------------------------------------------------------------------------
497 ENDIF
498 !-------------------------------------------------------------------------------
499 !-------------------------------------------------------------------------------
500 !
501 !* 9. Land - sea fractions
502 ! --------------------
503 !
504 IF (.NOT.ASSOCIATED(u%XSEA)) THEN
505 
506  ALLOCATE(u%XSEA (nl))
507  ALLOCATE(u%XWATER (nl))
508  ALLOCATE(u%XNATURE(nl))
509  ALLOCATE(u%XTOWN (nl))
510  CALL convert_cover_frac(dtco, &
511  u%XCOVER,u%LCOVER,u%XSEA,u%XNATURE,u%XTOWN,u%XWATER)
512 
513 ELSE
514  !
515  icover = SIZE(u%XCOVER,2)
516  !
517  CALL make_mask_cover(imask_cover,icover)
518  !
519 !if fractions are prescribed, it has to be verified that the locations of
520 !ECOCLIMAP covers are compatible with the fractions of surface types
521  ALLOCATE(zsea(nl))
522  ALLOCATE(zwater(nl))
523  ALLOCATE(znature(nl))
524  ALLOCATE(ztown(nl))
525  CALL convert_cover_frac(dtco, &
526  u%XCOVER,u%LCOVER,zsea,znature,ztown,zwater)
527  !
528  CALL fit_covers(xdata_nature,u%XNATURE,4,icover,ic_nat)
529  CALL fit_covers(xdata_town,u%XTOWN,7,icover,ic_twn)
530  CALL fit_covers(xdata_water,u%XWATER,2,icover,ic_wat)
531  CALL fit_covers(xdata_sea,u%XSEA,1,icover,ic_sea)
532  !
533  ALLOCATE(zcover_nature(nl,icover))
534  ALLOCATE(zcover_town(nl,icover))
535  ALLOCATE(zcover_sea(nl,icover))
536  ALLOCATE(zcover_water(nl,icover))
537  !
538  zcover_nature(:,:) = u%XCOVER(:,:)
539  zcover_town(:,:) = u%XCOVER(:,:)
540  zcover_sea(:,:) = u%XCOVER(:,:)
541  zcover_water(:,:) = u%XCOVER(:,:)
542  !
543  ALLOCATE(nsize(nl))
544  !
545  ALLOCATE(zdef(icover))
546  !
547  WRITE(iluout,fmt=*) &
548  '*********************************************************************'
549  WRITE(iluout,fmt=*) &
550  '* Coherence computation between covers and imposed nature fraction *'
551  WRITE(iluout,fmt=*) &
552  '*********************************************************************'
553  nsize(:) = 1
554  WHERE (u%XNATURE(:).NE.0. .AND. znature(:).EQ.0.) nsize(:)=0
555 
556  DO jl=1,SIZE(u%XCOVER,1)
557  IF (u%XNATURE(jl).EQ.0.) nsize(jl)=-1
558  ENDDO
559  zdef(:)=0.
560  DO jcover=1,icover
561  IF (xdata_nature(imask_cover(jcover))/=0.) THEN
562  zdef(jcover) = 1.
563  EXIT
564  ENDIF
565  ENDDO
566  CALL interpol_field2d(ug, u, &
567  hprogram,iluout,nsize,zcover_nature(:,:),yfield,zdef)
568 !
569  WRITE(iluout,fmt=*) &
570  '*********************************************************************'
571  WRITE(iluout,fmt=*) &
572  '* Coherence computation between covers and imposed town fraction *'
573  WRITE(iluout,fmt=*) &
574  '*********************************************************************'
575  nsize(:) = 1
576  WHERE (u%XTOWN(:).NE.0. .AND. ztown(:).EQ.0.) nsize(:)=0
577  DO jl=1,SIZE(u%XCOVER,1)
578  IF (u%XTOWN(jl).EQ.0.) nsize(jl)=-1
579  ENDDO
580  zdef(:)=0.
581  DO jcover=1,icover
582  IF (xdata_town(imask_cover(jcover))/=0.) THEN
583  zdef(jcover) = 1.
584  EXIT
585  ENDIF
586  ENDDO
587  CALL interpol_field2d(ug, u, &
588  hprogram,iluout,nsize,zcover_town(:,:),yfield,zdef)
589 
590  WRITE(iluout,fmt=*) &
591  '*********************************************************************'
592  WRITE(iluout,fmt=*) &
593  '* Coherence computation between covers and imposed water fraction *'
594  WRITE(iluout,fmt=*) &
595  '*********************************************************************'
596  nsize(:) = 1
597  WHERE (u%XWATER(:).NE.0. .AND. zwater(:).EQ.0.) nsize(:)=0
598 ! if water imposed to 1 in a grid cell: no extrapolation
599  DO jl=1,SIZE(u%XCOVER,1)
600  IF(u%XWATER(jl)==1.0)THEN
601  zcover_water(jl,:)=0.0
602  zcover_water(jl,ic_wat)=1.0
603  nsize(jl)=1
604  ELSEIF(u%XWATER(jl)==0.0)THEN
605  nsize(jl)=-1
606  ENDIF
607  ENDDO
608  zdef(:)=0.
609  DO jcover=1,icover
610  IF (xdata_water(imask_cover(jcover))/=0.) THEN
611  zdef(jcover) = 1.
612  EXIT
613  ENDIF
614  ENDDO
615  CALL interpol_field2d(ug, u, &
616  hprogram,iluout,nsize,zcover_water(:,:),yfield,pdef=zdef)
617  WRITE(iluout,fmt=*) &
618  '*********************************************************************'
619  WRITE(iluout,fmt=*) &
620  '* Coherence computation between covers and imposed sea fraction *'
621  WRITE(iluout,fmt=*) &
622  '*********************************************************************'
623  nsize(:) = 1
624  WHERE (u%XSEA(:).NE.0. .AND. zsea(:).EQ.0.) nsize(:)=0
625 ! if sea imposed to 1 in a grid cell: no extrapolation
626  DO jl=1,SIZE(u%XCOVER,1)
627  IF(u%XSEA(jl)==1.0)THEN
628  zcover_sea(jl,:)=0.0
629  zcover_sea(jl,ic_sea)=1.0
630  nsize(jl)=1
631  ELSEIF(u%XSEA(jl)==0.0)THEN
632  nsize(jl)=-1
633  ENDIF
634  ENDDO
635  zdef(:)=0.
636  DO jcover=1,icover
637  IF (xdata_sea(imask_cover(jcover))/=0.) THEN
638  zdef(jcover) = 1.
639  EXIT
640  ENDIF
641  ENDDO
642  CALL interpol_field2d(ug, u, &
643  hprogram,iluout,nsize,zcover_sea(:,:),yfield,pdef=zdef)
644  !
645  u%XCOVER(:,:) = u%XCOVER(:,:) + 0.001 * ( zcover_nature(:,:) + zcover_town(:,:) + &
646  zcover_water(:,:) + zcover_sea(:,:) )
647  !
648  u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
649  !
650  DEALLOCATE(zcover_nature)
651  DEALLOCATE(zcover_town )
652  DEALLOCATE(zcover_water )
653  DEALLOCATE(zcover_sea )
654  !
655  DEALLOCATE(nsize )
656  DEALLOCATE(zsea )
657  DEALLOCATE(zwater )
658  DEALLOCATE(znature )
659  DEALLOCATE(ztown )
660  !
661  DEALLOCATE(zdef)
662  DEALLOCATE(imask_cover)
663  !
664 ENDIF
665 !
666 u%NSIZE_NATURE = count(u%XNATURE(:) > 0.0)
667 u%NSIZE_WATER = count(u%XWATER (:) > 0.0)
668 u%NSIZE_SEA = count(u%XSEA (:) > 0.0)
669 u%NSIZE_TOWN = count(u%XTOWN (:) > 0.0)
670 u%NSIZE_FULL = nl
671 !
672 u%NDIM_NATURE = sum_on_all_procs(hprogram,cgrid,u%XNATURE(:) > 0., 'DIM')
673 u%NDIM_WATER = sum_on_all_procs(hprogram,cgrid,u%XWATER (:) > 0., 'DIM')
674 u%NDIM_SEA = sum_on_all_procs(hprogram,cgrid,u%XSEA (:) > 0., 'DIM')
675 u%NDIM_TOWN = sum_on_all_procs(hprogram,cgrid,u%XTOWN (:) > 0., 'DIM')
676 !
677 IF (lhook) CALL dr_hook('PGD_COVER',1,zhook_handle)
678 !-------------------------------------------------------------------------------
679  CONTAINS
680 !
681 SUBROUTINE fit_covers(PDATA_SURF,PSURF,KSURF,KCOVER,KC_SURF)
682 !
683 REAL, DIMENSION(:), INTENT(IN) :: pdata_surf
684 REAL, DIMENSION(:), INTENT(IN) :: psurf
685 INTEGER, INTENT(IN) :: ksurf
686 INTEGER, INTENT(INOUT) :: kcover
687 INTEGER, INTENT(OUT) :: kc_surf
688 !
689 LOGICAL :: gpresent
690 !
691 gpresent = .false.
692 DO jcover=1,kcover
693  IF (pdata_surf(imask_cover(jcover))/=0.) THEN
694  gpresent = .true.
695  EXIT
696  ENDIF
697 ENDDO
698 !
699 IF (any(psurf(:)/=0.)) THEN
700  !
701  IF (gpresent) THEN
702  !
703  DO jcover=1,kcover
704  IF (imask_cover(jcover)==ksurf) THEN
705  kc_surf = jcover
706  EXIT
707  ENDIF
708  ENDDO
709  !
710  ELSE
711  !
712  u%LCOVER(ksurf) = .true.
713  kcover = kcover + 1
714  ALLOCATE(zcover(nl,kcover))
715  DO jcover = 1,kcover
716  IF (jcover<kcover) THEN
717  IF (imask_cover(jcover)<ksurf) cycle
718  ENDIF
719  kc_surf = jcover
720  IF (jcover>1) zcover(:,1:jcover-1) = u%XCOVER(:,1:jcover-1)
721  zcover(:,jcover) = 0.
722  IF (jcover<kcover) zcover(:,jcover+1:kcover) = u%XCOVER(:,jcover:kcover-1)
723  EXIT
724  ENDDO
725  DEALLOCATE(u%XCOVER)
726  ALLOCATE(u%XCOVER(nl,kcover))
727  u%XCOVER(:,:) = zcover(:,:)
728  DEALLOCATE(zcover)
729  !
730  CALL make_mask_cover(imask_cover,kcover)
731  !
732  ENDIF
733  !
734 ENDIF
735 !
736 END SUBROUTINE fit_covers
737 !
738 !------------------------------------------------------
739 !
740 SUBROUTINE make_mask_cover(KMASK_COVER,KCOVER)
741 !
742 INTEGER, DIMENSION(:), POINTER :: kmask_cover
743 INTEGER, INTENT(IN) :: kcover
744 !
745 INTEGER :: icpt
746 !
747 IF (ASSOCIATED(kmask_cover)) DEALLOCATE(kmask_cover)
748 ALLOCATE(kmask_cover(kcover))
749 icpt = 0
750 DO jcover=1,jpcover
751  IF (u%LCOVER(jcover)) THEN
752  icpt = icpt + 1
753  kmask_cover(icpt) = jcover
754  ENDIF
755 ENDDO
756 !
757 END SUBROUTINE make_mask_cover
758 !
759 END SUBROUTINE pgd_cover
subroutine init_io_surf_n(DTCO, DGU, U, HPROGRAM, HMASK, HSCHEME, HACTION)
subroutine, public read_surf_cov(HPROGRAM, HREC, PFIELD, OFLAG, KRESP, HCOMMENT, HDIR)
subroutine get_gridtype_gauss(PGRID_PAR, KNLATI, PLAPO, PLOPO, PCODIL, KNLOPA, KL, PLAT, PLON, PLAT_XY, PLON_XY, PMESH_SIZE, PLONINF, PLATINF, PLONSUP, PLATSUP)
integer function sum_on_all_procs(HPROGRAM, HGRID, OIN, HNAME)
subroutine read_nam_pgd_cover(HPROGRAM, HCOVER, HFILETYPE, PUNIF_COVER, PRM_COVER, PRM_COAST, PRM_LAKE, ORM_RIVER, PRM_SEA, OORCA_GRID, PLAT_ANT, OIMP_COVER)
subroutine treat_field(UG, U, USS, HPROGRAM, HSCHEME, HFILETYPE, HSUBROUTINE, HFILENAME, HFIELD, PPGDARRAY, HSFTYPE)
Definition: treat_field.F90:6
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine pgd_ecoclimap2_data(DTCO, HPROGRAM)
subroutine read_lcover(HPROGRAM, OCOVER)
Definition: read_lcover.F90:6
subroutine interpol_field2d(UG, U, HPROGRAM, KLUOUT, KCODE, PFIELD, HFIELD, PDEF, KNPTS)
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:6
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine fit_covers(PDATA_SURF, PSURF, KSURF, KCOVER, KC_SURF)
Definition: pgd_cover.F90:681
subroutine make_mask_cover(KMASK_COVER, KCOVER)
Definition: pgd_cover.F90:740
subroutine get_gridtype_lonlat_reg(PGRID_PAR, PLONMIN, PLONMAX, PLATMIN, PLATMAX, KLON, KLAT, KL, PLON, PLAT)
subroutine pgd_cover(DGU, DTCO, UG, U, USS, HPROGRAM, ORM_RIVER)
Definition: pgd_cover.F90:6
subroutine convert_cover_frac(DTCO, PCOVER, OCOVER, PSEA, PNATURE, PTOWN, PWATER)