6 SUBROUTINE pgd_cover ( DTCO, UG, U, USS, HPROGRAM, ORM_RIVER)
56 USE modd_data_cover_par
, ONLY : jpcover, nrock, nsea, nwater, npermsnow, lveg_pres
66 USE modi_interpol_field2d
67 USE modi_convert_cover_frac
70 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
108 TYPE(
sso_t),
INTENT(INOUT) :: USS
110 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
111 LOGICAL,
INTENT(OUT) :: ORM_RIVER
117 CHARACTER(LEN=10) :: YFIELD
118 CHARACTER(LEN=28) :: YCOVER
119 CHARACTER(LEN=6) :: YFILETYPE
131 REAL,
DIMENSION(:),
ALLOCATABLE :: ZDEF
132 REAL,
DIMENSION(:),
ALLOCATABLE :: ZLAT
133 REAL,
DIMENSION(:),
ALLOCATABLE :: XUNIF_COVER
135 REAL,
DIMENSION(:),
ALLOCATABLE :: ZSEA
136 REAL,
DIMENSION(:),
ALLOCATABLE :: ZWATER
137 REAL,
DIMENSION(:),
ALLOCATABLE :: ZNATURE
138 REAL,
DIMENSION(:),
ALLOCATABLE :: ZTOWN
139 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZCOVER_NATURE, ZCOVER_TOWN, ZCOVER_SEA
142 LOGICAL,
DIMENSION(:),
ALLOCATABLE :: GCOVER, GCOVER2
144 INTEGER :: INFOMPI, JPROC
149 INTEGER :: ICOVER, ICOVERSUM, ICOVER_OLD, ICPT
150 INTEGER :: IPERMSNOW, IECO2
151 INTEGER :: IC_NAT, IC_TWN, IC_WAT, IC_SEA
152 INTEGER :: ICPT1, ICPT2, ICPT_TOT
155 INTEGER,
DIMENSION(:),
POINTER :: IMASK_COVER=>null()
156 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IMASK_SEA, IMASK_WATER
158 LOGICAL,
DIMENSION(:,:),
ALLOCATABLE :: GCOVER_ALL
159 LOGICAL,
DIMENSION(:),
ALLOCATABLE :: GCORINE
160 LOGICAL :: LORCA_GRID
162 LOGICAL :: LIMP_COVER
168 REAL,
PARAMETER :: ZLAT_ANT_WATER = -60.
170 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
181 ALLOCATE(u%LCOVER (jpcover))
182 ALLOCATE(xunif_cover(jpcover))
195 xrm_cover, xrm_coast, xrm_lake, lrm_river, &
196 xrm_sea, lorca_grid, xlat_ant, limp_cover )
204 IF (any(xunif_cover/=0.))
THEN 209 IF (abs(
sum(xunif_cover)-1.)>1.e-6)
THEN 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,*)
'***************************************************' 217 CALL abor1_sfx(
'PGD_COVER: SUM OF ALL COVER FRACTIONS MUST BE 1.')
223 icover =
count(xunif_cover(:)/=0.)
224 ALLOCATE(u%XCOVER(
nl,icover))
227 IF (xunif_cover(jcov)/=0.)
THEN 228 u%LCOVER(jcov) = .true.
230 u%XCOVER(:,icpt) = xunif_cover(jcov)
233 u%XCOVER(:,:) = u%XCOVER(:,:) / spread(
sum(u%XCOVER(:,:),2),2,icover
239 ELSEIF (len_trim(ycover)==0)
THEN 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,*)
'***********************************************************' 246 CALL abor1_sfx(
'PGD_COVER: NO PRESCRIBED COVER NOR INPUT FILE')
249 ELSEIF(limp_cover)
THEN 251 IF(yfiletype==
'NETCDF')
THEN 252 CALL abor1_sfx(
'Use another format than netcdf for cover input file with LIMP_COVER' 255 cfilein = adjustl(adjustr(ycover)//
'.txt')
264 yfiletype,
'FULL ',
'SURF ',
'READ ')
267 ALLOCATE(u%LCOVER(jpcover))
270 CALL read_surf_cov(yfiletype,
'COVER',u%XCOVER(:,:),u%LCOVER,iresp)
281 ALLOCATE(
xall(u%NDIM_FULL,1,2) )
286 hprogram,
'SURF ',yfiletype,
'A_COVR',ycover,
'COVER ' 296 WRITE(yfield,fmt=
'(A)')
'covers' 305 icover =
SIZE(u%XCOVER,2)
307 u%XCOVER(:,:) = u%XCOVER(:,:) / spread(
sum(u%XCOVER(:,:),2),2,icover)
313 ALLOCATE(imask_sea(
SIZE(nsea)))
317 IF (imask_cover(jcov)==nsea(jl)) imask_sea(jl) = jcov
321 ALLOCATE(imask_water(
SIZE(nwater)))
325 IF (imask_cover(jcov)==nwater(jl)) imask_water(jl) = jcov
331 IF (imask_cover(jcov)==npermsnow) ipermsnow = jcov
336 IF (imask_cover(jcov)>300)
THEN 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.
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.
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.
385 IF (xrm_coast<1.)
THEN 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.
393 u%XCOVER(ji,imask_sea(jl)) = 1.
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
405 u%XCOVER(ji,imask_water(jl)) = 1.
417 IF(lorca_grid.AND.(
cgrid==
'GAUSS '.OR.
cgrid==
'LONLAT REG'))
THEN 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
433 IF (imask_water(jl)/=0.AND.ipermsnow/=0)
THEN 434 WHERE(zlat(:)<zlat_ant_water.AND.u%XCOVER(:,imask_water(jl))>0
450 u%XCOVER(:,:)=u%XCOVER(:,:)/spread(
sum(u%XCOVER(:,:),2),2,icover)
452 DEALLOCATE(imask_sea)
453 DEALLOCATE(imask_water)
458 u%LCOVER(:) = .false.
460 IF (any(u%XCOVER(:,jcov)/=0.)) u%LCOVER(imask_cover(jcov)) = .true.
466 icover =
count(u%LCOVER)
468 IF (hprogram==
'MESONH'.OR.icover<icover_old)
THEN 470 IF (icover/=icover_old)
THEN 471 ALLOCATE(zcover(
nl,icover_old))
472 zcover(:,:) = u%XCOVER(:,:)
474 ALLOCATE(u%XCOVER(
nl,icover))
478 IF (u%LCOVER(imask_cover(jcov)))
THEN 480 u%XCOVER(:,icpt) = zcover(:,jcov)
486 IF (hprogram==
'MESONH')
THEN 490 IF (icoversum==0) u%LCOVER(imask_cover(jcov) )= .false.
494 icover =
count(u%LCOVER)
495 IF (icover/=icover_old)
THEN 496 ALLOCATE(zcover(
nl,icover_old))
497 zcover(:,:) = u%XCOVER(:,:)
499 ALLOCATE(u%XCOVER(
nl,icover))
503 IF (u%LCOVER(imask_cover(jcov)))
THEN 505 u%XCOVER(:,icpt) = zcover(:,jcov)
516 IF (any(u%LCOVER(301:))) ieco2=1
518 DEALLOCATE(imask_cover)
523 DEALLOCATE(xunif_cover)
527 IF(.NOT.limp_cover)
THEN 544 IF (.NOT.
ASSOCIATED(u%XSEA))
THEN 546 ALLOCATE(u%XSEA (
nl))
547 ALLOCATE(u%XWATER (
nl))
548 ALLOCATE(u%XNATURE(
nl))
549 ALLOCATE(u%XTOWN (
nl))
554 icover =
SIZE(u%XCOVER,2)
562 ALLOCATE(znature(
nl))
571 ALLOCATE(zcover_nature(
nl,icover))
572 ALLOCATE(zcover_town(
nl,icover))
573 ALLOCATE(zcover_sea(
nl,icover))
574 ALLOCATE(zcover_water(
nl,icover))
576 zcover_nature(:,:) = u%XCOVER(:,:)
577 zcover_town(:,:) = u%XCOVER(:,:)
578 zcover_sea(:,:) = u%XCOVER(:,:)
579 zcover_water(:,:) = u%XCOVER(:,:)
583 ALLOCATE(zdef(icover))
585 WRITE(iluout,fmt=*) &
586 '*********************************************************************' 587 WRITE(iluout,fmt=*) &
588 '* Coherence computation between covers and imposed nature fraction *' 589 WRITE(iluout,fmt=*) &
590 '*********************************************************************' 592 WHERE (u%XNATURE(:).NE.0. .AND. znature(:).EQ.0.)
nsize(:,1)=0
594 DO jl=1,
SIZE(u%XCOVER,1)
595 IF (u%XNATURE(jl).EQ.0.)
nsize(jl,1)=-1
605 hprogram,iluout,
nsize(:,1),zcover_nature(:,:),yfield
607 WRITE(iluout,fmt=*) &
608 '*********************************************************************' 609 WRITE(iluout,fmt=*) &
610 '* Coherence computation between covers and imposed town fraction *' 611 WRITE(iluout,fmt=*) &
612 '*********************************************************************' 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
626 hprogram,iluout,
nsize(:,1),zcover_town(:,:),yfield
628 WRITE(iluout,fmt=*) &
629 '*********************************************************************' 630 WRITE(iluout,fmt=*) &
631 '* Coherence computation between covers and imposed water fraction *' 632 WRITE(iluout,fmt=*) &
633 '*********************************************************************' 635 WHERE (u%XWATER(:).NE.0. .AND. zwater(:).EQ.0.)
nsize(:,1)=0
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
642 ELSEIF(u%XWATER(jl)==0.0)
THEN 654 hprogram,iluout,
nsize(:,1),zcover_water(:,:),yfield
655 WRITE(iluout,fmt=*) &
656 '*********************************************************************' 657 WRITE(iluout,fmt=*) &
658 '* Coherence computation between covers and imposed sea fraction *' 659 WRITE(iluout,fmt=*) &
660 '*********************************************************************' 662 WHERE (u%XSEA(:).NE.0. .AND. zsea(:).EQ.0.)
nsize(:,1)=0
664 DO jl=1,
SIZE(u%XCOVER,1)
665 IF(u%XSEA(jl)==1.0)
THEN 667 zcover_sea(jl,ic_sea)=1.0
669 ELSEIF(u%XSEA(jl)==0.0)
THEN 675 IF (
xdata_sea(imask_cover(jcov))/=0.)
THEN 681 hprogram,iluout,
nsize(:,1),zcover_sea(:,:),yfield
683 u%XCOVER(:,:) = u%XCOVER(:,:) + 0.001 * ( zcover_nature(:,:) + zcover_town
686 u%XCOVER(:,:)=u%XCOVER(:,:)/spread(
sum(u%XCOVER(:,:),2),2,icover)
688 DEALLOCATE(zcover_nature)
689 DEALLOCATE(zcover_town )
690 DEALLOCATE(zcover_water )
691 DEALLOCATE(zcover_sea )
700 DEALLOCATE(imask_cover)
704 lveg_pres(:) = .false.
705 IF (.NOT.u%LECOSG)
THEN 707 IF (u%LCOVER(jcov))
THEN 708 WHERE(dtco%XDATA_VEGTYPE(jcov,:) > 0.) lveg_pres(1:
SIZE(dtco%XDATA_VEGTYPE
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)
728 SUBROUTINE fit_covers(PDATA_SURF,PSURF,KSURF,KCOVER,KC_SURF)
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
739 IF (
lhook)
CALL dr_hook(
'PGD_COVER:FIT_COVERS',0,zhook_handle)
743 IF (pdata_surf(imask_cover(jcov))/=0.)
THEN 749 IF (any(psurf(:)/=0.))
THEN 754 IF (imask_cover(jcov)==ksurf)
THEN 762 u%LCOVER(ksurf) = .true.
764 ALLOCATE(zcover(
nl,kcover))
766 IF (jcov<kcover)
THEN 767 IF (imask_cover(jcov)<ksurf) cycle
770 IF (jcov>1) zcover(:,1:jcov-1) = u%XCOVER(:,1:jcov-1)
772 IF (jcov<kcover) zcover(:,jcov+1:kcover) = u%XCOVER(:,jcov:kcover-
776 ALLOCATE(u%XCOVER(
nl,kcover))
777 u%XCOVER(:,:) = zcover(:,:)
786 IF (
lhook)
CALL dr_hook(
'PGD_COVER:FIT_COVERS',1,zhook_handle)
794 INTEGER,
DIMENSION(:),
POINTER :: KMASK_COVER
795 INTEGER,
INTENT(IN) :: KCOVER
800 IF (
lhook)
CALL dr_hook(
'PGD_COVER:MAKE_MASK_COVER',0,zhook_handle)
802 IF (
ASSOCIATED(kmask_cover))
DEALLOCATE(kmask_cover)
803 ALLOCATE(kmask_cover(kcover))
806 IF (u%LCOVER(jcov))
THEN 808 kmask_cover(icpt) = jcov
812 IF (
lhook)
CALL dr_hook(
'PGD_COVER:MAKE_MASK_COVER',1,zhook_handle)
825 INTEGER,
INTENT(IN) :: KCOVER
826 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PCOVER
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
834 isize_omp = max(1,
SIZE(pcover,1)/
nblocktot)
838 DO jl = 1,u%NDIM_FULL
839 imaxcover_all(jl) =
maxloc(zcover_all(jl,:),1)
847 IF (
lhook)
CALL dr_hook(
'PGD_COVER:GET_RMCOV_OMP',0,zhook_handle_omp)
849 DO jl=1,
SIZE(pcover,1)
851 IF (jcov /= imaxcover(jl))
THEN 852 IF (anint(pcover(jl,jcov)*
xprec)/
xprec<=xrm_cover ) pcover(jl,jcov
857 IF (
lhook)
CALL dr_hook(
'PGD_COVER:GET_RMCOV_OMP',1,zhook_handle_omp)
integer, dimension(:,:), allocatable nsize_all
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)
real, dimension(:), allocatable xdata_sea
subroutine pgd_cover(DTCO, UG, U, USS, HPROGRAM, ORM_RIVER)
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)
subroutine end_io_surf_n(HPROGRAM)
subroutine get_luout(HPROGRAM, KLUOUT)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
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)
subroutine interpol_field2d(UG, U, HPROGRAM, KLUOUT, KCODE, PFIELD, HFIELD, P
subroutine treat_field(UG, U, USS, HPROGRAM, HSCHEME, HFILETYPE, HSUBROUTINE, HFILENAME, HFIELD, PPGDARRAY)
subroutine get_rmcov_omp(KCOVER, PCOVER)
subroutine fit_covers(PDATA_SURF, PSURF, KSURF, KCOVER, KC_SURF)
character(len=28), save cfilein
subroutine make_mask_cover(KMASK_COVER, KCOVER)
character(len=28), save cfilein_fa
subroutine make_lcover(OCOVER)
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)
subroutine read_nam_pgd_cover(HPROGRAM, HCOVER, HFILETYPE, PUNIF_C