SURFEX v8.1
General documentation of Surfex
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 ( DTCO, UG, U, USS, HPROGRAM, ORM_RIVER)
7 ! ##############################################################
8 !
9 !!**** *PGD_COVER* monitor for averaging and interpolations of cover fractions
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !! METHOD
15 !! ------
16 !!
17 !
18 !! EXTERNAL
19 !! --------
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !! AUTHOR
28 !! ------
29 !!
30 !! V. Masson Meteo-France
31 !!
32 !! MODIFICATION
33 !! ------------
34 !!
35 !! Original 10/12/97
36 !! B. Decharme 06/2008 limit of coast coverage under which the coast is replaced by sea or inland water
37 !! B. Decharme 06/2009 remove lack and sea as the user want
38 !! B. Decharme 07/2009 compatibility between Surfex and Orca (Nemo) grid (Earth Model)
39 !! B. Decharme 07/2012 if sea or water imposed to 1 in a grid cell: no extrapolation
40 !! B. Decharme 02/2014 Add LRM_RIVER and remove lake over antarctica
41 !!
42 !----------------------------------------------------------------------------
43 !
44 !* 0. DECLARATION
45 ! -----------
46 !
49 USE modd_surf_atm_n, ONLY : surf_atm_t
50 USE modd_sso_n, ONLY : sso_t
51 !
52 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm
53 USE modd_surf_par, ONLY : xundef
54 USE modd_pgd_grid, ONLY : cgrid, nl, xgrid_par
56 USE modd_data_cover_par, ONLY : jpcover, nrock, nsea, nwater, npermsnow, lveg_pres
58 !
59 USE modi_get_luout
62 !
64 !
65 USE modi_treat_field
66 USE modi_interpol_field2d
67 USE modi_convert_cover_frac
68 !
69 USE modi_read_lcover
70 USE modi_sum_on_all_procs
71 !
72 USE modi_make_lcover
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 #ifdef SFX_MPI
98 include "mpif.h"
99 #endif
100 !
101 !* 0.1 Declaration of arguments
102 ! ------------------------
103 !
104 !
105 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
106 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
107 TYPE(surf_atm_t), INTENT(INOUT) :: U
108 TYPE(sso_t), INTENT(INOUT) :: USS
109 !
110  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program
111 LOGICAL, INTENT(OUT) :: ORM_RIVER ! delete river coverage (default = false)
112 !
113 !
114 !* 0.2 Declaration of local variables
115 ! ------------------------------
116 !
117  CHARACTER(LEN=10) :: YFIELD
118  CHARACTER(LEN=28) :: YCOVER ! file name for cover types
119  CHARACTER(LEN=6) :: YFILETYPE ! data file type
120 !
121 REAL :: XRM_COVER ! limit of coverage under which the
122  ! cover is removed. Default is 1.E-6
123 REAL :: XRM_COAST ! limit of coast coverage under which
124  ! the coast is replaced by sea. Default is 1.
125 REAL :: XRM_LAKE ! limit of inland lake coverage under which
126  ! the water is removed. Default is 0.0
127 REAL :: XRM_SEA ! limit of sea coverage under which
128  ! the sea is removed. Default is 0.0
129 REAL :: XLAT_ANT ! Lattitude limit from Orca grid (Antartic)
130 !
131 REAL, DIMENSION(:), ALLOCATABLE :: ZDEF
132 REAL, DIMENSION(:), ALLOCATABLE :: ZLAT
133 REAL, DIMENSION(:), ALLOCATABLE :: XUNIF_COVER ! value of each cover (cover will be
134 ! uniform on the horizontal)
135 REAL, DIMENSION(:), ALLOCATABLE :: ZSEA !to check compatibility between
136 REAL, DIMENSION(:), ALLOCATABLE :: ZWATER !prescribed fractions and ECOCLIMAP
137 REAL, DIMENSION(:), ALLOCATABLE :: ZNATURE
138 REAL, DIMENSION(:), ALLOCATABLE :: ZTOWN
139 REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOVER_NATURE, ZCOVER_TOWN, ZCOVER_SEA, ZCOVER_WATER, &
140  ZCOVER, ZCOVER2
141 !
142 LOGICAL, DIMENSION(:), ALLOCATABLE :: GCOVER, GCOVER2
143 !
144 INTEGER :: INFOMPI, JPROC
145 INTEGER :: ILUOUT ! output listing logical unit
146 INTEGER :: IRESP ! Error code after redding
147 INTEGER :: JCOV ! loop counter on covers
148 INTEGER :: JL, JI ! loop counter on horizontal points
149 INTEGER :: ICOVER, ICOVERSUM, ICOVER_OLD, ICPT ! 0 if cover is not present, >1 if present somewhere
150 INTEGER :: IPERMSNOW, IECO2
151 INTEGER :: IC_NAT, IC_TWN, IC_WAT, IC_SEA
152 INTEGER :: ICPT1, ICPT2, ICPT_TOT
153 !
154 INTEGER :: IMAXCOVER ! index of maximum cover for the given point
155 INTEGER, DIMENSION(:), POINTER :: IMASK_COVER=>null()
156 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK_SEA, IMASK_WATER
157 !
158 LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GCOVER_ALL
159 LOGICAL, DIMENSION(:), ALLOCATABLE :: GCORINE
160 LOGICAL :: LORCA_GRID ! flag to compatibility between Surfex and Orca grid
161  ! (Earth Model over Antarctic)
162 LOGICAL :: LIMP_COVER ! Imposed values for Cover from another PGD file
163 !
164 LOGICAL :: GPRESENT
165 !
166 LOGICAL :: LRM_RIVER ! delete inland river coverage. Default is false
167 !
168 REAL, PARAMETER :: ZLAT_ANT_WATER = -60. ! Lattitude limit to delete lake over antarctica
169 !
170 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
171 !
172 !---------------------------------------------------------------
173 !
174 !* 1. Initializations
175 ! ---------------
176 !
177 IF (lhook) CALL dr_hook('PGD_COVER',0,zhook_handle)
178 !
179  CALL get_luout(hprogram,iluout)
180 !
181 ALLOCATE(u%LCOVER (jpcover))
182 ALLOCATE(xunif_cover(jpcover))
183 !
184 u%LCOVER = .false.
185 xunif_cover = xundef
186 !
187 ieco2 = 0
188 !
189 !-------------------------------------------------------------------------------
190 !
191 !* 2. Input file for cover types
192 ! --------------------------
193 !
194  CALL read_nam_pgd_cover(hprogram, ycover, yfiletype, xunif_cover, &
195  xrm_cover, xrm_coast, xrm_lake, lrm_river, &
196  xrm_sea, lorca_grid, xlat_ant, limp_cover )
197 !
198 !-------------------------------------------------------------------------------
199 !
200 !* 3. Uniform field is prescribed
201 ! ---------------------------
202 !-------------------------------------------------------------------------------
203 !
204 IF (any(xunif_cover/=0.)) THEN
205 !
206 !* 3.1 Verification of the total input cover fractions
207 ! -----------------------------------------------
208 !
209  IF (abs(sum(xunif_cover)-1.)>1.e-6) THEN
210  WRITE(iluout,*) ' '
211  WRITE(iluout,*) '***************************************************'
212  WRITE(iluout,*) '* Error in COVER fractions preparation *'
213  WRITE(iluout,*) '* The prescribed covers does not fit *'
214  WRITE(iluout,*) '* The sum of all cover must be equal to 1 exactly *'
215  WRITE(iluout,*) '***************************************************'
216  WRITE(iluout,*) ' '
217  CALL abor1_sfx('PGD_COVER: SUM OF ALL COVER FRACTIONS MUST BE 1.')
218 !
219 !* 3.2 Use of the presribed cover fractions
220 ! ------------------------------------
221 !
222  ELSE
223  icover = count(xunif_cover(:)/=0.)
224  ALLOCATE(u%XCOVER(nl,icover))
225  icpt = 0
226  DO jcov=1,jpcover
227  IF (xunif_cover(jcov)/=0.) THEN
228  u%LCOVER(jcov) = .true.
229  icpt = icpt + 1
230  u%XCOVER(:,icpt) = xunif_cover(jcov)
231  ENDIF
232  END DO
233  u%XCOVER(:,:) = u%XCOVER(:,:) / spread(sum(u%XCOVER(:,:),2),2,icover)
234  END IF
235 !
236 !* 3.3 No data
237 ! -------
238 !
239 ELSEIF (len_trim(ycover)==0) THEN
240  WRITE(iluout,*) ' '
241  WRITE(iluout,*) '***********************************************************'
242  WRITE(iluout,*) '* Error in COVER fractions preparation *'
243  WRITE(iluout,*) '* There is no prescribed cover fraction and no input file *'
244  WRITE(iluout,*) '***********************************************************'
245  WRITE(iluout,*) ' '
246  CALL abor1_sfx('PGD_COVER: NO PRESCRIBED COVER NOR INPUT FILE')
247 !
248 !-------------------------------------------------------------------------------
249 ELSEIF(limp_cover)THEN !LIMP_COVER (impose cover from input file at the same resolution)
250 !
251  IF(yfiletype=='NETCDF')THEN
252  CALL abor1_sfx('Use another format than netcdf for cover input file with LIMP_COVER')
253  ELSE
254 #ifdef SFX_ASC
255  cfilein = adjustl(adjustr(ycover)//'.txt')
256 #endif
257 #ifdef SFX_FA
258  cfilein_fa = adjustl(adjustr(ycover)//'.fa')
259 #endif
260 #ifdef SFX_LFI
261  cfilein_lfi = adjustl(ycover)
262 #endif
263  CALL init_io_surf_n(dtco, u, &
264  yfiletype,'FULL ','SURF ','READ ')
265  ENDIF
266 !
267  ALLOCATE(u%LCOVER(jpcover))
268  CALL read_lcover(yfiletype,u%LCOVER)
269 !
270  CALL read_surf_cov(yfiletype,'COVER',u%XCOVER(:,:),u%LCOVER,iresp)
271 !
272  CALL end_io_surf_n(yfiletype)
273 !
274 ELSE
275 !-------------------------------------------------------------------------------
276 !
277 !* 3. Averages the field
278 ! ------------------
279 !
280  ALLOCATE(nsize_all(u%NDIM_FULL,1) )
281  ALLOCATE(xall(u%NDIM_FULL,1,2) )
282 !
283  nsize_all(:,:) = 0
284  xall(:,:,:) = 0.
285  CALL treat_field(ug, u, uss, &
286  hprogram,'SURF ',yfiletype,'A_COVR',ycover, 'COVER ' )
287 !
288  DEALLOCATE(xsumval )
289 !
290 !-------------------------------------------------------------------------------
291 !-------------------------------------------------------------------------------
292 !
293 !* 4. Interpolation if some points are not initialized (no data for these points) (same time)
294 ! ---------------------------------------------------------------------------------------
295 !
296  WRITE(yfield,fmt='(A)') 'covers'
297  CALL interpol_field2d(ug, u, hprogram,iluout,nsize(:,1), u%XCOVER(:,:),yfield)
298 !
299 !-------------------------------------------------------------------------------
300 !-------------------------------------------------------------------------------
301 !
302 !* 5. Coherence check
303 ! ---------------
304 !
305  icover = SIZE(u%XCOVER,2)
306 !
307  u%XCOVER(:,:) = u%XCOVER(:,:) / spread(sum(u%XCOVER(:,:),2),2,icover)
308 !
309  DEALLOCATE(nsize )
310 !
311  CALL make_mask_cover(imask_cover,icover)
312 !
313  ALLOCATE(imask_sea(SIZE(nsea)))
314  imask_sea(:) = 0
315  DO jl=1,SIZE(nsea)
316  DO jcov=1,icover
317  IF (imask_cover(jcov)==nsea(jl)) imask_sea(jl) = jcov
318  ENDDO
319  ENDDO
320  !
321  ALLOCATE(imask_water(SIZE(nwater)))
322  imask_water(:) = 0
323  DO jl=1,SIZE(nwater)
324  DO jcov=1,icover
325  IF (imask_cover(jcov)==nwater(jl)) imask_water(jl) = jcov
326  ENDDO
327  ENDDO
328  !
329  ipermsnow=0
330  DO jcov=1,icover
331  IF (imask_cover(jcov)==npermsnow) ipermsnow = jcov
332  ENDDO
333  !
334  ieco2 = 0
335  DO jcov=1,icover
336  IF (imask_cover(jcov)>300) THEN
337  ieco2 = jcov
338  EXIT
339  ENDIF
340  ENDDO
341 !
342 !
343 !-------------------------------------------------------------------------------
344 !
345 !* 6. Special treatments asked by user
346 ! --------------------------------
347 !
348  CALL get_rmcov_omp(icover,u%XCOVER)
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,:),1)
355  IF(imask_water(2)/=imaxcover.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(anint(u%XCOVER(:,imask_water(jl))*xprec)/xprec<=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(anint(u%XCOVER(:,imask_sea(jl))*xprec)/xprec<=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  IF (xrm_coast<1.) THEN
386  !
387  DO jl=1,SIZE(nsea)
388  IF (imask_sea(jl)/=0) THEN
389  DO ji=1,SIZE(u%XCOVER,1)
390  IF (anint(u%XCOVER(ji,imask_sea(jl))*xprec)/xprec>=xrm_coast .AND. &
391  u%XCOVER(ji,imask_sea(jl))/=1.) THEN
392  u%XCOVER(ji,:) = 0.
393  u%XCOVER(ji,imask_sea(jl)) = 1.
394  ENDIF
395  ENDDO
396  ENDIF
397  ENDDO
398  !
399  DO jl=1,SIZE(nwater)
400  IF (imask_water(jl)/=0) THEN
401  DO ji=1,SIZE(u%XCOVER,1)
402  IF (anint(u%XCOVER(ji,imask_water(jl))*xprec)/xprec>=xrm_coast .AND. &
403  u%XCOVER(ji,imask_water(jl))/=1. ) THEN
404  u%XCOVER(ji,:) = 0.
405  u%XCOVER(ji,imask_water(jl)) = 1.
406  ENDIF
407  ENDDO
408  ENDIF
409  ENDDO
410  !
411  ENDIF
412 !
413 !
414 ! * Compatibility between Surfex and Orca grid
415 ! (Earth Model over water bodies and Antarctic)
416 !
417  IF(lorca_grid.AND.(cgrid=='GAUSS '.OR.cgrid=='LONLAT REG'))THEN
418 !
419  ALLOCATE(zlat(nl))
420  IF (cgrid=='GAUSS ') CALL get_gridtype_gauss(xgrid_par,plat=zlat)
421  IF (cgrid=='LONLAT REG') CALL get_gridtype_lonlat_reg(xgrid_par,plat=zlat)
422 !
423  DO jl=1,SIZE(nsea)
424  IF (imask_sea(jl)/=0.AND.ipermsnow/=0) THEN
425  WHERE(zlat(:)<xlat_ant.AND.u%XCOVER(:,imask_sea(jl))>0.0)
426  u%XCOVER(:,ipermsnow) = 1.0
427  u%XCOVER(:,imask_sea(jl)) = 0.0
428  ENDWHERE
429  ENDIF
430  ENDDO
431 
432  DO jl=1,SIZE(nwater)
433  IF (imask_water(jl)/=0.AND.ipermsnow/=0) THEN
434  WHERE(zlat(:)<zlat_ant_water.AND.u%XCOVER(:,imask_water(jl))>0.0)
435  u%XCOVER(:,ipermsnow) = 1.0
436  u%XCOVER(:,imask_water(jl)) = 0.0
437  ENDWHERE
438  ENDIF
439  ENDDO
440 !
441  DEALLOCATE(zlat)
442 !
443  ENDIF
444 !
445 !-------------------------------------------------------------------------------
446 !
447 !* 7. Coherence check
448 ! ---------------
449 !
450  u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
451 !
452  DEALLOCATE(imask_sea)
453  DEALLOCATE(imask_water)
454 !
455 !* 8. List of cover present
456 ! ---------------------
457 !
458  u%LCOVER(:) = .false.
459  DO jcov=1,icover
460  IF (any(u%XCOVER(:,jcov)/=0.)) u%LCOVER(imask_cover(jcov)) = .true.
461  ENDDO
462 !
463  CALL make_lcover(u%LCOVER)
464 !
465  icover_old = icover
466  icover = count(u%LCOVER)
467 !
468  IF (hprogram=='MESONH'.OR.icover<icover_old) THEN
469 
470  IF (icover/=icover_old) THEN
471  ALLOCATE(zcover(nl,icover_old))
472  zcover(:,:) = u%XCOVER(:,:)
473  DEALLOCATE(u%XCOVER)
474  ALLOCATE(u%XCOVER(nl,icover))
475  u%XCOVER(:,:) = 0.
476  icpt = 0
477  DO jcov=1,icover_old
478  IF (u%LCOVER(imask_cover(jcov))) THEN
479  icpt = icpt + 1
480  u%XCOVER(:,icpt) = zcover(:,jcov)
481  ENDIF
482  ENDDO
483  DEALLOCATE(zcover)
484  ENDIF
485 
486  IF (hprogram=='MESONH') THEN
487 
488  DO jcov=1,icover
489  icoversum = sum_on_all_procs(hprogram,cgrid,u%XCOVER(:,jcov)/=0., 'COV')
490  IF (icoversum==0) u%LCOVER(imask_cover(jcov) )= .false.
491  ENDDO
492 
493  icover_old = icover
494  icover = count(u%LCOVER)
495  IF (icover/=icover_old) THEN
496  ALLOCATE(zcover(nl,icover_old))
497  zcover(:,:) = u%XCOVER(:,:)
498  DEALLOCATE(u%XCOVER)
499  ALLOCATE(u%XCOVER(nl,icover))
500  u%XCOVER(:,:) = 0.
501  icpt = 0
502  DO jcov=1,icover_old
503  IF (u%LCOVER(imask_cover(jcov))) THEN
504  icpt = icpt + 1
505  u%XCOVER(:,icpt) = zcover(:,jcov)
506  ENDIF
507  ENDDO
508  DEALLOCATE(zcover)
509  ENDIF
510 
511  ENDIF
512 
513  ENDIF
514 !
515  ieco2 = 0
516  IF (any(u%LCOVER(301:))) ieco2=1
517 !
518  DEALLOCATE(imask_cover)
519 !
520 !-------------------------------------------------------------------------------
521 END IF
522 !
523 DEALLOCATE(xunif_cover)
524 !-------------------------------------------------------------------------------
525 !
526 !
527 IF(.NOT.limp_cover)THEN
528 
529 !* 8. List of cover present
530 ! ---------------------
531 !
532  IF (ieco2/=0) THEN
533  CALL pgd_ecoclimap2_data(dtco%NYEAR, dtco%XDATA_VEGTYPE, hprogram)
534  ENDIF
535 !
536 !-------------------------------------------------------------------------------
537 ENDIF
538 !-------------------------------------------------------------------------------
539 !-------------------------------------------------------------------------------
540 !
541 !* 9. Land - sea fractions
542 ! --------------------
543 !
544 IF (.NOT.ASSOCIATED(u%XSEA)) THEN
545 
546  ALLOCATE(u%XSEA (nl))
547  ALLOCATE(u%XWATER (nl))
548  ALLOCATE(u%XNATURE(nl))
549  ALLOCATE(u%XTOWN (nl))
550  CALL convert_cover_frac(dtco, u%XCOVER,u%LCOVER,u%XSEA,u%XNATURE,u%XTOWN,u%XWATER)
551 
552 ELSE
553  !
554  icover = SIZE(u%XCOVER,2)
555  !
556  CALL make_mask_cover(imask_cover,icover)
557  !
558 !if fractions are prescribed, it has to be verified that the locations of
559 !ECOCLIMAP covers are compatible with the fractions of surface types
560  ALLOCATE(zsea(nl))
561  ALLOCATE(zwater(nl))
562  ALLOCATE(znature(nl))
563  ALLOCATE(ztown(nl))
564  CALL convert_cover_frac(dtco, u%XCOVER,u%LCOVER,zsea,znature,ztown,zwater)
565  !
566  CALL fit_covers(xdata_nature,u%XNATURE,4,icover,ic_nat)
567  CALL fit_covers(xdata_town ,u%XTOWN ,7,icover,ic_twn)
568  CALL fit_covers(xdata_water ,u%XWATER ,2,icover,ic_wat)
569  CALL fit_covers(xdata_sea ,u%XSEA ,1,icover,ic_sea)
570  !
571  ALLOCATE(zcover_nature(nl,icover))
572  ALLOCATE(zcover_town(nl,icover))
573  ALLOCATE(zcover_sea(nl,icover))
574  ALLOCATE(zcover_water(nl,icover))
575  !
576  zcover_nature(:,:) = u%XCOVER(:,:)
577  zcover_town(:,:) = u%XCOVER(:,:)
578  zcover_sea(:,:) = u%XCOVER(:,:)
579  zcover_water(:,:) = u%XCOVER(:,:)
580  !
581  ALLOCATE(nsize(nl,1))
582  !
583  ALLOCATE(zdef(icover))
584  !
585  WRITE(iluout,fmt=*) &
586  '*********************************************************************'
587  WRITE(iluout,fmt=*) &
588  '* Coherence computation between covers and imposed nature fraction *'
589  WRITE(iluout,fmt=*) &
590  '*********************************************************************'
591  nsize(:,1) = 1
592  WHERE (u%XNATURE(:).NE.0. .AND. znature(:).EQ.0.) nsize(:,1)=0
593 
594  DO jl=1,SIZE(u%XCOVER,1)
595  IF (u%XNATURE(jl).EQ.0.) nsize(jl,1)=-1
596  ENDDO
597  zdef(:)=0.
598  DO jcov=1,icover
599  IF (xdata_nature(imask_cover(jcov))/=0.) THEN
600  zdef(jcov) = 1.
601  EXIT
602  ENDIF
603  ENDDO
604  CALL interpol_field2d(ug, u, &
605  hprogram,iluout,nsize(:,1),zcover_nature(:,:),yfield,zdef)
606 !
607  WRITE(iluout,fmt=*) &
608  '*********************************************************************'
609  WRITE(iluout,fmt=*) &
610  '* Coherence computation between covers and imposed town fraction *'
611  WRITE(iluout,fmt=*) &
612  '*********************************************************************'
613  nsize(:,1) = 1
614  WHERE (u%XTOWN(:).NE.0. .AND. ztown(:).EQ.0.) nsize(:,1)=0
615  DO jl=1,SIZE(u%XCOVER,1)
616  IF (u%XTOWN(jl).EQ.0.) nsize(jl,1)=-1
617  ENDDO
618  zdef(:)=0.
619  DO jcov=1,icover
620  IF (xdata_town(imask_cover(jcov))/=0.) THEN
621  zdef(jcov) = 1.
622  EXIT
623  ENDIF
624  ENDDO
625  CALL interpol_field2d(ug, u, &
626  hprogram,iluout,nsize(:,1),zcover_town(:,:),yfield,zdef)
627 
628  WRITE(iluout,fmt=*) &
629  '*********************************************************************'
630  WRITE(iluout,fmt=*) &
631  '* Coherence computation between covers and imposed water fraction *'
632  WRITE(iluout,fmt=*) &
633  '*********************************************************************'
634  nsize(:,1) = 1
635  WHERE (u%XWATER(:).NE.0. .AND. zwater(:).EQ.0.) nsize(:,1)=0
636 ! if water imposed to 1 in a grid cell: no extrapolation
637  DO jl=1,SIZE(u%XCOVER,1)
638  IF(u%XWATER(jl)==1.0)THEN
639  zcover_water(jl,:)=0.0
640  zcover_water(jl,ic_wat)=1.0
641  nsize(jl,1)=1
642  ELSEIF(u%XWATER(jl)==0.0)THEN
643  nsize(jl,1)=-1
644  ENDIF
645  ENDDO
646  zdef(:)=0.
647  DO jcov=1,icover
648  IF (xdata_water(imask_cover(jcov))/=0.) THEN
649  zdef(jcov) = 1.
650  EXIT
651  ENDIF
652  ENDDO
653  CALL interpol_field2d(ug, u, &
654  hprogram,iluout,nsize(:,1),zcover_water(:,:),yfield,pdef=zdef)
655  WRITE(iluout,fmt=*) &
656  '*********************************************************************'
657  WRITE(iluout,fmt=*) &
658  '* Coherence computation between covers and imposed sea fraction *'
659  WRITE(iluout,fmt=*) &
660  '*********************************************************************'
661  nsize(:,1) = 1
662  WHERE (u%XSEA(:).NE.0. .AND. zsea(:).EQ.0.) nsize(:,1)=0
663 ! if sea imposed to 1 in a grid cell: no extrapolation
664  DO jl=1,SIZE(u%XCOVER,1)
665  IF(u%XSEA(jl)==1.0)THEN
666  zcover_sea(jl,:)=0.0
667  zcover_sea(jl,ic_sea)=1.0
668  nsize(jl,1)=1
669  ELSEIF(u%XSEA(jl)==0.0)THEN
670  nsize(jl,1)=-1
671  ENDIF
672  ENDDO
673  zdef(:)=0.
674  DO jcov=1,icover
675  IF (xdata_sea(imask_cover(jcov))/=0.) THEN
676  zdef(jcov) = 1.
677  EXIT
678  ENDIF
679  ENDDO
680  CALL interpol_field2d(ug, u, &
681  hprogram,iluout,nsize(:,1),zcover_sea(:,:),yfield,pdef=zdef)
682  !
683  u%XCOVER(:,:) = u%XCOVER(:,:) + 0.001 * ( zcover_nature(:,:) + zcover_town(:,:) + &
684  zcover_water(:,:) + zcover_sea(:,:) )
685  !
686  u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
687  !
688  DEALLOCATE(zcover_nature)
689  DEALLOCATE(zcover_town )
690  DEALLOCATE(zcover_water )
691  DEALLOCATE(zcover_sea )
692  !
693  DEALLOCATE(nsize )
694  DEALLOCATE(zsea )
695  DEALLOCATE(zwater )
696  DEALLOCATE(znature )
697  DEALLOCATE(ztown )
698  !
699  DEALLOCATE(zdef)
700  DEALLOCATE(imask_cover)
701  !
702 ENDIF
703 !
704 lveg_pres(:) = .false.
705 IF (.NOT.u%LECOSG) THEN
706  DO jcov = 1,jpcover
707  IF (u%LCOVER(jcov)) THEN
708  WHERE(dtco%XDATA_VEGTYPE(jcov,:) > 0.) lveg_pres(1:SIZE(dtco%XDATA_VEGTYPE,2)) = .true.
709  ENDIF
710  ENDDO
711 ENDIF
712 !
713 u%NSIZE_NATURE = count(u%XNATURE(:) > 0.0)
714 u%NSIZE_WATER = count(u%XWATER (:) > 0.0)
715 u%NSIZE_SEA = count(u%XSEA (:) > 0.0)
716 u%NSIZE_TOWN = count(u%XTOWN (:) > 0.0)
717 u%NSIZE_FULL = nl
718 !
719 u%NDIM_NATURE = sum_on_all_procs(hprogram,cgrid,u%XNATURE(:) > 0., 'DIM')
720 u%NDIM_WATER = sum_on_all_procs(hprogram,cgrid,u%XWATER (:) > 0., 'DIM')
721 u%NDIM_SEA = sum_on_all_procs(hprogram,cgrid,u%XSEA (:) > 0., 'DIM')
722 u%NDIM_TOWN = sum_on_all_procs(hprogram,cgrid,u%XTOWN (:) > 0., 'DIM')
723 !
724 IF (lhook) CALL dr_hook('PGD_COVER',1,zhook_handle)
725 !-------------------------------------------------------------------------------
726 CONTAINS
727 !
728 SUBROUTINE fit_covers(PDATA_SURF,PSURF,KSURF,KCOVER,KC_SURF)
729 !
730 REAL, DIMENSION(:), INTENT(IN) :: PDATA_SURF
731 REAL, DIMENSION(:), INTENT(IN) :: PSURF
732 INTEGER, INTENT(IN) :: KSURF
733 INTEGER, INTENT(INOUT) :: KCOVER
734 INTEGER, INTENT(OUT) :: KC_SURF
735 !
736 LOGICAL :: GPRESENT
737 REAL :: ZHOOK_HANDLE
738 !
739 IF (lhook) CALL dr_hook('PGD_COVER:FIT_COVERS',0,zhook_handle)
740 !
741 gpresent = .false.
742 DO jcov=1,kcover
743  IF (pdata_surf(imask_cover(jcov))/=0.) THEN
744  gpresent = .true.
745  EXIT
746  ENDIF
747 ENDDO
748 !
749 IF (any(psurf(:)/=0.)) THEN
750  !
751  IF (gpresent) THEN
752  !
753  DO jcov=1,kcover
754  IF (imask_cover(jcov)==ksurf) THEN
755  kc_surf = jcov
756  EXIT
757  ENDIF
758  ENDDO
759  !
760  ELSE
761  !
762  u%LCOVER(ksurf) = .true.
763  kcover = kcover + 1
764  ALLOCATE(zcover(nl,kcover))
765  DO jcov = 1,kcover
766  IF (jcov<kcover) THEN
767  IF (imask_cover(jcov)<ksurf) cycle
768  ENDIF
769  kc_surf = jcov
770  IF (jcov>1) zcover(:,1:jcov-1) = u%XCOVER(:,1:jcov-1)
771  zcover(:,jcov) = 0.
772  IF (jcov<kcover) zcover(:,jcov+1:kcover) = u%XCOVER(:,jcov:kcover-1)
773  EXIT
774  ENDDO
775  DEALLOCATE(u%XCOVER)
776  ALLOCATE(u%XCOVER(nl,kcover))
777  u%XCOVER(:,:) = zcover(:,:)
778  DEALLOCATE(zcover)
779  !
780  CALL make_mask_cover(imask_cover,kcover)
781  !
782  ENDIF
783  !
784 ENDIF
785 !
786 IF (lhook) CALL dr_hook('PGD_COVER:FIT_COVERS',1,zhook_handle)
787 !
788 END SUBROUTINE fit_covers
789 !
790 !------------------------------------------------------
791 !
792 SUBROUTINE make_mask_cover(KMASK_COVER,KCOVER)
793 !
794 INTEGER, DIMENSION(:), POINTER :: KMASK_COVER
795 INTEGER, INTENT(IN) :: KCOVER
796 !
797 INTEGER :: ICPT
798 REAL :: ZHOOK_HANDLE
799 !
800 IF (lhook) CALL dr_hook('PGD_COVER:MAKE_MASK_COVER',0,zhook_handle)
801 !
802 IF (ASSOCIATED(kmask_cover)) DEALLOCATE(kmask_cover)
803 ALLOCATE(kmask_cover(kcover))
804 icpt = 0
805 DO jcov=1,jpcover
806  IF (u%LCOVER(jcov)) THEN
807  icpt = icpt + 1
808  kmask_cover(icpt) = jcov
809  ENDIF
810 ENDDO
811 !
812 IF (lhook) CALL dr_hook('PGD_COVER:MAKE_MASK_COVER',1,zhook_handle)
813 !
814 END SUBROUTINE make_mask_cover
815 !
816 !------------------------------------------------------
817 !
818 SUBROUTINE get_rmcov_omp(KCOVER,PCOVER)
819 !
820 USE modd_surfex_omp, ONLY : nblocktot
821 !
824 !
825 INTEGER, INTENT(IN) :: KCOVER
826 REAL, DIMENSION(:,:), INTENT(INOUT) :: PCOVER
827 !
828 REAL, DIMENSION(U%NDIM_FULL,SIZE(PCOVER,2)) :: ZCOVER_ALL
829 INTEGER, DIMENSION(U%NDIM_FULL) :: IMAXCOVER_ALL
830 INTEGER, DIMENSION(U%NSIZE_FULL) :: IMAXCOVER
831 INTEGER :: JK, JCOV, ISIZE_OMP
832 REAL :: ZHOOK_HANDLE_OMP
833 !
834 isize_omp = max(1,SIZE(pcover,1)/nblocktot)
835 !
836  CALL gather_and_write_mpi(pcover,zcover_all)
837 IF (nrank==npio) THEN
838  DO jl = 1,u%NDIM_FULL
839  imaxcover_all(jl) = maxloc(zcover_all(jl,:),1)
840  ENDDO
841 ENDIF
842 !
843  CALL read_and_send_mpi(imaxcover_all,imaxcover)
844 !
845 ! * removes cover with very small coverage
846 !$OMP PARALLEL PRIVATE(ZHOOK_HANDLE_OMP)
847 IF (lhook) CALL dr_hook('PGD_COVER:GET_RMCOV_OMP',0,zhook_handle_omp)
848 !$OMP DO SCHEDULE(STATIC,ISIZE_OMP) PRIVATE(JL,JCOV)
849 DO jl=1,SIZE(pcover,1)
850  DO jcov=1,kcover
851  IF (jcov /= imaxcover(jl)) THEN
852  IF (anint(pcover(jl,jcov)*xprec)/xprec<=xrm_cover ) pcover(jl,jcov) = 0.
853  ENDIF
854  END DO
855 END DO
856 !$OMP END DO
857 IF (lhook) CALL dr_hook('PGD_COVER:GET_RMCOV_OMP',1,zhook_handle_omp)
858 !$OMP END PARALLEL
859 !
860 END SUBROUTINE get_rmcov_omp
861 !
862 END SUBROUTINE pgd_cover
integer, dimension(:,:), allocatable nsize_all
real, parameter xprec
real, dimension(:,:,:), allocatable xall
integer function sum_on_all_procs(HPROGRAM, HGRID, OIN, HNAME)
subroutine pgd_ecoclimap2_data(KYEAR, PDATA_VEGTYPE, HPROGRAM)
subroutine read_surf_cov(HPROGRAM, HREC, PFIELD, OFLAG, KRESP, HCOMMENT, HDIR)
real, dimension(:), allocatable xdata_water
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
real, dimension(:), allocatable xdata_sea
subroutine pgd_cover(DTCO, UG, U, USS, HPROGRAM, ORM_RIVER)
Definition: pgd_cover.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
real, dimension(:), pointer xgrid_par
real, dimension(:,:), allocatable xsumval
subroutine get_gridtype_lonlat_reg(PGRID_PAR, PLONMIN, PLONMAX, PLATMIN, PLATMAX, KLON, KLAT, KL, PLON, PLAT)
subroutine read_lcover(HPROGRAM, OCOVER)
Definition: read_lcover.F90:7
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:7
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
subroutine get_gridtype_gauss(PGRID_PAR, KNLATI, PLAPO, PLOPO, PCODIL, KNLOPA, KL, PLAT, PLON, PLAT_XY, PLON_XY, PMESH_SIZE, PLONINF, PLATINF, PLONSUP, PLATSUP)
character(len=10) cgrid
subroutine interpol_field2d(UG, U, HPROGRAM, KLUOUT, KCODE, PFIELD, HFIELD, P
subroutine treat_field(UG, U, USS, HPROGRAM, HSCHEME, HFILETYPE, HSUBROUTINE, HFILENAME, HFIELD, PPGDARRAY)
Definition: treat_field.F90:10
subroutine get_rmcov_omp(KCOVER, PCOVER)
Definition: pgd_cover.F90:819
static ll_t maxloc
Definition: getcurheap.c:48
subroutine fit_covers(PDATA_SURF, PSURF, KSURF, KCOVER, KC_SURF)
Definition: pgd_cover.F90:729
character(len=28), save cfilein
subroutine make_mask_cover(KMASK_COVER, KCOVER)
Definition: pgd_cover.F90:793
character(len=28), save cfilein_fa
subroutine make_lcover(OCOVER)
Definition: make_lcover.F90:8
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION
real, dimension(:), allocatable xdata_town
real, dimension(:), allocatable xdata_nature
character(len=28), save cfilein_lfi
subroutine convert_cover_frac(DTCO, PCOVER, OCOVER, PSEA, PNATURE, PTOWN, PWATER)
static int count
Definition: memory_hook.c:21
subroutine read_nam_pgd_cover(HPROGRAM, HCOVER, HFILETYPE, PUNIF_C