58 USE modd_data_cover, ONLY : xdata_town, xdata_sea, xdata_nature, xdata_water
67 USE modi_interpol_field2d
68 USE modi_convert_cover_frac
71 USE modi_sum_on_all_procs
73 USE modi_read_nam_pgd_cover
75 USE modi_init_io_surf_n
76 USE modi_end_io_surf_n
80 USE modi_pgd_ecoclimap2_data
92 USE yomhook
,ONLY : lhook, dr_hook
93 USE parkind1
,ONLY : jprb
107 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
108 LOGICAL,
INTENT(OUT) :: orm_river
114 CHARACTER(LEN=10) :: yfield
115 CHARACTER(LEN=28) :: ycover
116 CHARACTER(LEN=6) :: yfiletype
128 REAL,
DIMENSION(:),
ALLOCATABLE :: zdef
129 REAL,
DIMENSION(:),
ALLOCATABLE :: zlat
130 REAL,
DIMENSION(:),
ALLOCATABLE :: xunif_cover
132 REAL,
DIMENSION(:),
ALLOCATABLE :: zsea
133 REAL,
DIMENSION(:),
ALLOCATABLE :: zwater
134 REAL,
DIMENSION(:),
ALLOCATABLE :: znature
135 REAL,
DIMENSION(:),
ALLOCATABLE :: ztown
136 REAL,
DIMENSION(:,:),
ALLOCATABLE :: zcover_nature, zcover_town, zcover_sea, zcover_water, zcover
143 INTEGER :: icover, icoversum, icover_old, icpt
144 INTEGER :: ipermsnow, ieco2
145 INTEGER :: ic_nat, ic_twn, ic_wat, ic_sea
147 INTEGER,
DIMENSION(1) :: imaxcover
148 INTEGER,
DIMENSION(:),
POINTER :: imask_cover=>null()
149 INTEGER,
DIMENSION(:),
ALLOCATABLE :: imask_sea, imask_water
151 LOGICAL :: lorca_grid
153 LOGICAL :: limp_cover
159 REAL,
PARAMETER :: zlat_ant_water = -60.
161 REAL(KIND=JPRB) :: zhook_handle
168 IF (lhook) CALL dr_hook(
'PGD_COVER',0,zhook_handle)
172 ALLOCATE(u%LCOVER (jpcover))
173 ALLOCATE(xunif_cover(jpcover))
186 xrm_cover, xrm_coast, xrm_lake, lrm_river, &
187 xrm_sea, lorca_grid, xlat_ant, limp_cover )
195 IF (any(xunif_cover/=0.))
THEN
200 IF (abs(sum(xunif_cover)-1.)>1.e-6)
THEN
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,*)
'***************************************************'
208 CALL
abor1_sfx(
'PGD_COVER: SUM OF ALL COVER FRACTIONS MUST BE 1.')
214 icover = count(xunif_cover(:)/=0.)
215 ALLOCATE(u%XCOVER(nl,icover))
218 IF (xunif_cover(jcover)/=0.)
THEN
219 u%LCOVER(jcover) = .true.
221 u%XCOVER(:,icpt) = xunif_cover(jcover)
224 u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
230 ELSEIF (len_trim(ycover)==0)
THEN
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,*)
'***********************************************************'
237 CALL
abor1_sfx(
'PGD_COVER: NO PRESCRIBED COVER NOR INPUT FILE')
240 ELSEIF(limp_cover)
THEN
242 IF(yfiletype==
'NETCDF')
THEN
243 CALL
abor1_sfx(
'Use another format than netcdf for cover input file with LIMP_COVER')
246 cfilein = adjustl(adjustr(ycover)//
'.txt')
249 cfilein_fa = adjustl(adjustr(ycover)//
'.fa')
252 cfilein_lfi = adjustl(ycover)
255 yfiletype,
'FULL ',
'SURF ',
'READ ')
258 ALLOCATE(u%LCOVER(jpcover))
263 yfiletype,
'COVER',u%XCOVER(:,:),u%LCOVER,iresp)
274 ALLOCATE(xsumcover(nl,jpcover))
279 hprogram,
'SURF ',yfiletype,
'A_COVR',ycover, &
286 WRITE(yfield,fmt=
'(A)')
'covers'
288 hprogram,iluout,nsize,u%XCOVER(:,:),yfield)
295 icover =
SIZE(u%XCOVER,2)
297 u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
300 DEALLOCATE(xsumcover)
304 ALLOCATE(imask_sea(
SIZE(nsea)))
308 IF (imask_cover(jcover)==nsea(jl)) imask_sea(jl) = jcover
312 ALLOCATE(imask_water(
SIZE(nwater)))
316 IF (imask_cover(jcover)==nwater(jl)) imask_water(jl) = jcover
322 IF (imask_cover(jcover)==npermsnow) ipermsnow = jcover
327 IF (imask_cover(jcover)>300)
THEN
339 DO jl=1,
SIZE(u%XCOVER,1)
340 imaxcover(:) = maxloc(u%XCOVER(jl,:))
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.
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.
364 IF (imask_water(jl)/=0)
THEN
365 WHERE(u%XCOVER(:,imask_water(jl))<=xrm_lake)
366 u%XCOVER(:,imask_water(jl)) = 0.
375 IF (imask_sea(jl)/=0)
THEN
376 WHERE(u%XCOVER(:,imask_sea(jl))<=xrm_sea)
377 u%XCOVER(:,imask_sea(jl)) = 0.
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.
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.
411 IF(lorca_grid.AND.(cgrid==
'GAUSS '.OR.cgrid==
'LONLAT REG'))
THEN
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
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
444 u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
446 DEALLOCATE(imask_sea)
447 DEALLOCATE(imask_water)
452 ALLOCATE(zcover(nl,icover))
460 u%LCOVER(:) = .false.
461 DO jcover=1,icover_old
463 IF (icoversum>0)
THEN
464 u%LCOVER(imask_cover(jcover))=.true.
466 zcover(:,icover) = u%XCOVER(:,jcover)
467 IF (imask_cover(jcover)>300) ieco2 = icover
472 ALLOCATE(u%XCOVER(nl,icover))
473 u%XCOVER(:,:) = zcover(:,1:icover)
476 DEALLOCATE(imask_cover)
481 DEALLOCATE(xunif_cover)
485 IF(.NOT.limp_cover)
THEN
491 IF (
sum_on_all_procs(hprogram,cgrid,any(u%XCOVER(:,ieco2:)>0.,dim=2),
'COV' ) >0 ) &
504 IF (.NOT.
ASSOCIATED(u%XSEA))
THEN
506 ALLOCATE(u%XSEA (nl))
507 ALLOCATE(u%XWATER (nl))
508 ALLOCATE(u%XNATURE(nl))
509 ALLOCATE(u%XTOWN (nl))
511 u%XCOVER,u%LCOVER,u%XSEA,u%XNATURE,u%XTOWN,u%XWATER)
515 icover =
SIZE(u%XCOVER,2)
523 ALLOCATE(znature(nl))
526 u%XCOVER,u%LCOVER,zsea,znature,ztown,zwater)
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)
533 ALLOCATE(zcover_nature(nl,icover))
534 ALLOCATE(zcover_town(nl,icover))
535 ALLOCATE(zcover_sea(nl,icover))
536 ALLOCATE(zcover_water(nl,icover))
538 zcover_nature(:,:) = u%XCOVER(:,:)
539 zcover_town(:,:) = u%XCOVER(:,:)
540 zcover_sea(:,:) = u%XCOVER(:,:)
541 zcover_water(:,:) = u%XCOVER(:,:)
545 ALLOCATE(zdef(icover))
547 WRITE(iluout,fmt=*) &
548 '*********************************************************************'
549 WRITE(iluout,fmt=*) &
550 '* Coherence computation between covers and imposed nature fraction *'
551 WRITE(iluout,fmt=*) &
552 '*********************************************************************'
554 WHERE (u%XNATURE(:).NE.0. .AND. znature(:).EQ.0.) nsize(:)=0
556 DO jl=1,
SIZE(u%XCOVER,1)
557 IF (u%XNATURE(jl).EQ.0.) nsize(jl)=-1
561 IF (xdata_nature(imask_cover(jcover))/=0.)
THEN
567 hprogram,iluout,nsize,zcover_nature(:,:),yfield,zdef)
569 WRITE(iluout,fmt=*) &
570 '*********************************************************************'
571 WRITE(iluout,fmt=*) &
572 '* Coherence computation between covers and imposed town fraction *'
573 WRITE(iluout,fmt=*) &
574 '*********************************************************************'
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
582 IF (xdata_town(imask_cover(jcover))/=0.)
THEN
588 hprogram,iluout,nsize,zcover_town(:,:),yfield,zdef)
590 WRITE(iluout,fmt=*) &
591 '*********************************************************************'
592 WRITE(iluout,fmt=*) &
593 '* Coherence computation between covers and imposed water fraction *'
594 WRITE(iluout,fmt=*) &
595 '*********************************************************************'
597 WHERE (u%XWATER(:).NE.0. .AND. zwater(:).EQ.0.) nsize(:)=0
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
604 ELSEIF(u%XWATER(jl)==0.0)
THEN
610 IF (xdata_water(imask_cover(jcover))/=0.)
THEN
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 '*********************************************************************'
624 WHERE (u%XSEA(:).NE.0. .AND. zsea(:).EQ.0.) nsize(:)=0
626 DO jl=1,
SIZE(u%XCOVER,1)
627 IF(u%XSEA(jl)==1.0)
THEN
629 zcover_sea(jl,ic_sea)=1.0
631 ELSEIF(u%XSEA(jl)==0.0)
THEN
637 IF (xdata_sea(imask_cover(jcover))/=0.)
THEN
643 hprogram,iluout,nsize,zcover_sea(:,:),yfield,pdef=zdef)
645 u%XCOVER(:,:) = u%XCOVER(:,:) + 0.001 * ( zcover_nature(:,:) + zcover_town(:,:) + &
646 zcover_water(:,:) + zcover_sea(:,:) )
648 u%XCOVER(:,:)=u%XCOVER(:,:)/spread(sum(u%XCOVER(:,:),2),2,icover)
650 DEALLOCATE(zcover_nature)
651 DEALLOCATE(zcover_town )
652 DEALLOCATE(zcover_water )
653 DEALLOCATE(zcover_sea )
662 DEALLOCATE(imask_cover)
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)
677 IF (lhook) CALL dr_hook(
'PGD_COVER',1,zhook_handle)
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
693 IF (pdata_surf(imask_cover(jcover))/=0.)
THEN
699 IF (any(psurf(:)/=0.))
THEN
704 IF (imask_cover(jcover)==ksurf)
THEN
712 u%LCOVER(ksurf) = .true.
714 ALLOCATE(zcover(nl,kcover))
716 IF (jcover<kcover)
THEN
717 IF (imask_cover(jcover)<ksurf) cycle
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)
726 ALLOCATE(u%XCOVER(nl,kcover))
727 u%XCOVER(:,:) = zcover(:,:)
742 INTEGER,
DIMENSION(:),
POINTER :: kmask_cover
743 INTEGER,
INTENT(IN) :: kcover
747 IF (
ASSOCIATED(kmask_cover))
DEALLOCATE(kmask_cover)
748 ALLOCATE(kmask_cover(kcover))
751 IF (u%LCOVER(jcover))
THEN
753 kmask_cover(icpt) = jcover
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)
subroutine abor1_sfx(YTEXT)
subroutine pgd_ecoclimap2_data(DTCO, HPROGRAM)
subroutine read_lcover(HPROGRAM, OCOVER)
subroutine interpol_field2d(UG, U, HPROGRAM, KLUOUT, KCODE, PFIELD, HFIELD, PDEF, KNPTS)
subroutine end_io_surf_n(HPROGRAM)
subroutine get_luout(HPROGRAM, KLUOUT)
subroutine fit_covers(PDATA_SURF, PSURF, KSURF, KCOVER, KC_SURF)
subroutine make_mask_cover(KMASK_COVER, KCOVER)
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)
subroutine convert_cover_frac(DTCO, PCOVER, OCOVER, PSEA, PNATURE, PTOWN, PWATER)