5 SUBROUTINE init_index_mpi (DTCO, U, UG, GCP, HPROGRAM,HINIT,HALG,PIO_FRAC,OSHADOWS)
36 USE modi_set_surfex_filein
37 USE modi_init_io_surf_n
39 USE modi_make_choice_array
40 USE modi_read_gridtype
41 USE modi_end_io_surf_n
43 USE modi_get_sizes_parallel
44 USE modi_get_adjacent_meshes
45 USE modi_ini_data_cover
46 USE modi_read_arrange_cover
47 USE modi_read_cover_garden
63 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
64 CHARACTER(LEN=3),
INTENT(IN) :: HINIT
65 CHARACTER(LEN=4),
INTENT(INOUT) :: HALG
66 REAL,
INTENT(IN) :: PIO_FRAC
67 LOGICAL,
INTENT(IN),
OPTIONAL :: OSHADOWS
69 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ILEFT
70 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IRIGHT
71 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ITOP
72 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IBOTTOM
74 INTEGER,
DIMENSION(0:NPROC-1) :: INB
75 LOGICAL :: GSHADOWS, GSPEC
76 INTEGER,
DIMENSION(0:NPROC-1) :: INBPTS
77 INTEGER :: IRESTE, INRESTE, IRANK, IPROC
78 INTEGER :: JJ, CPT, ILUOUT, INBMIN, IP0
79 INTEGER :: IRESP, INFOMPI
80 REAL(KIND=JPRB) :: ZHOOK_HANDLE
84 gspec = (hinit==
'PGD' .OR. (hinit==
'PRE' .AND.
loasis) .OR. &
89 IF (
PRESENT(oshadows))
THEN 101 IF (hinit==
'PGD')
THEN 107 CALL pgd_grid (ug, u, gcp, hprogram,
' ',
' ',&
115 CALL read_surf(hprogram,
'DIM_FULL ', u%NDIM_FULL, iresp, hdir=
'A')
126 CALL read_surf(hprogram,
'GRID_TYPE', ug%G%CGRID, iresp, hdir=
'A')
128 CALL read_gridtype(hprogram, ug%G%CGRID, ug%NGRID_FULL_PAR, u%NDIM_FULL, .false., hdir=
'A')
130 ALLOCATE(ug%XGRID_FULL_PAR(ug%NGRID_FULL_PAR))
132 CALL read_gridtype(hprogram, ug%G%CGRID, ug%NGRID_FULL_PAR, u%NDIM_FULL, .true.,&
133 ug%XGRID_FULL_PAR, iresp ,hdir=
'A')
149 CALL mpi_bcast(ug%NGRID_FULL_PAR,kind(ug%NGRID_FULL_PAR)/4,mpi_integer,
npio,
ncomm,infompi)
150 IF (
nrank/=
npio)
ALLOCATE(ug%XGRID_FULL_PAR(ug%NGRID_FULL_PAR))
151 CALL mpi_bcast(ug%XGRID_FULL_PAR,
SIZE(ug%XGRID_FULL_PAR)*kind(ug%XGRID_FULL_PAR)/4,mpi_real,
npio,
ncomm,infompi)
153 CALL mpi_bcast(u%NDIM_FULL,kind(u%NDIM_FULL)/4,mpi_integer,
npio,
ncomm,infompi)
162 IF (.NOT.
ALLOCATED(
nindex))
ALLOCATE(
nindex(u%NDIM_FULL))
164 ELSEIF (.NOT.
ALLOCATED(
nindex))
THEN 168 IF (hinit==
'PGD' .AND. (halg==
'TILA' .OR. halg==
'TILL'))
THEN 171 WRITE(*,*)
'INIT_INDEX_MPI: for PGD, TILA and TILL are forbidden, forced to LIN' 172 WRITE(iluout,*)
'INIT_INDEX_MPI: for PGD, TILA and TILL are forbidden, forced to LIN' 176 IF (halg==
'LIN ')
THEN 180 ELSEIF (halg==
'ADJ ' .OR. halg==
'TILA' .OR. halg==
'TILL')
THEN 182 IF (
nrank==
npio .AND. (halg==
'ADJ ' .OR. halg==
'TILA'))
THEN 183 ALLOCATE(ileft(u%NDIM_FULL))
184 ALLOCATE(iright(u%NDIM_FULL))
185 ALLOCATE(ibottom(u%NDIM_FULL))
186 ALLOCATE(itop(u%NDIM_FULL))
188 ug%XGRID_FULL_PAR,ileft,iright,itop,ibottom)
196 IF (halg==
'ADJ ')
THEN 198 ileft,iright,itop,ibottom,
nindex,oshadows)
199 ELSEIF (halg==
'TILA' .OR. halg==
'TILL')
THEN 205 CALL abor1_sfx(
"INIT_INDEX_MPI: ALG="//halg//
" not defined for the moment")
210 ALLOCATE(
nnum(u%NDIM_FULL))
223 inbmin = minval(inbpts)
224 ip0 = maxval(minloc(inbpts)) - 1
226 IF (.NOT. gshadows)
THEN 230 DO WHILE( inbpts(
npio) > nint(pio_frac*inbmin) )
236 inbpts(ip0) = inbpts(ip0) + 1
241 inbmin = maxval(inbpts)
244 IF (jj/=
npio .AND. inbpts(jj)<inbmin)
THEN 303 IF (.NOT.gspec) ug%XGRID_FULL_PAR=>null()
305 IF (
lhook)
CALL dr_hook(
'INIT_INDEX_MPI',1,zhook_handle)
315 INTEGER,
INTENT(IN) :: KPROC
316 INTEGER,
INTENT(IN) :: KPROCMIN
317 INTEGER,
INTENT(IN) :: KSIZE
318 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: KINDEX
319 LOGICAL,
INTENT(IN) :: OSHADOWS
321 INTEGER,
DIMENSION(0:KPROC-1) :: ISIZE_TASK
322 INTEGER :: JI, JJ, CPT, IPROC1
323 REAL(KIND=JPRB) :: ZHOOK_HANDLE
325 IF (
lhook)
CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_LIN',0,zhook_handle)
328 kproc,ksize,kprocmin,isize_task,oshadows)
336 IF (kindex(jj)==-1)
THEN 338 DO WHILE( cpt>isize_task(iproc1) )
339 IF ( iproc1.GE.kprocmin )
THEN 341 IF ( iproc1==kproc ) iproc1 = kprocmin-1
353 IF (
lhook)
CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_LIN',1,zhook_handle)
359 SUBROUTINE set_nb_points_adj(KPROC,KSIZE,KDIM_FULL,KLEFT,KRIGHT,KTOP,KBOTTOM,KINDEX,OSHADOWS)
363 INTEGER,
INTENT(IN) :: KPROC
364 INTEGER,
INTENT(IN) :: KSIZE
365 INTEGER,
INTENT(IN) :: KDIM_FULL
366 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(IN) :: KLEFT
367 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(IN) :: KRIGHT
368 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(IN) :: KTOP
369 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(IN) :: KBOTTOM
370 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(INOUT) :: KINDEX
371 LOGICAL,
INTENT(IN) :: OSHADOWS
373 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IMASK
374 INTEGER,
DIMENSION(KDIM_FULL) :: IPOINT
375 INTEGER,
DIMENSION(0:KPROC-1) :: ISIZE_TASK
376 INTEGER,
DIMENSION(4) :: INEAR
377 INTEGER :: ICOUNT,ICPT,IDEB
378 INTEGER :: CPT_TOT, CPT_LOC, CPT_INTER, JI, JJ, JK
380 REAL(KIND=JPRB) :: ZHOOK_HANDLE
382 IF (
lhook)
CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_ADJ',0,zhook_handle)
385 kproc,ksize,
npio,isize_task,oshadows)
387 icount =
count(kindex(:)==-1)
388 ALLOCATE(imask(icount))
391 IF (kindex(jj)==-1)
THEN 404 DO WHILE ( cpt_tot < isize_task(ji) )
406 IF (cpt_loc < 1 )
THEN 409 IF ( kindex(imask(jj))==-1 )
THEN 410 cpt_tot = cpt_tot + 1
412 ipoint(1) = imask(jj)
413 kindex(imask(jj)) = ji
421 ipoint(1:cpt_loc-cpt_inter) = ipoint(cpt_inter+1:cpt_loc)
422 cpt_loc = cpt_loc - cpt_inter
425 b1 :
DO jj=1,cpt_inter
427 inear(1) = kbottom(ipoint(jj))
428 inear(2) = kleft(ipoint(jj))
429 inear(3) = kright(ipoint(jj))
430 inear(4) = ktop(ipoint(jj))
434 IF ( inear(jk).NE.0 )
THEN 435 IF( kindex(inear(jk)).EQ.-1 )
THEN 436 cpt_tot = cpt_tot + 1
437 cpt_loc = cpt_loc + 1
438 IF (cpt_tot.GT.isize_task(ji))
EXIT b1
439 kindex(inear(jk)) = ji
440 ipoint(cpt_loc) = inear(jk)
454 WHERE (kindex(:)==-1) kindex(:) = 0
456 IF (
lhook)
CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_ADJ',1,zhook_handle)
462 SUBROUTINE set_nb_points_til(HPROGRAM,HALG,KPROC,KDIM_FULL,KLEFT,KRIGHT,KTOP,KBOTTOM,KINDEX,OSHADOWS)
469 USE modd_data_cover_par
, ONLY : nvegtype, jpcover
477 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
478 CHARACTER(LEN=4),
INTENT(IN) :: HALG
479 INTEGER,
INTENT(IN) :: KPROC
480 INTEGER,
INTENT(IN) :: KDIM_FULL
481 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(IN) :: KLEFT
482 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(IN) :: KRIGHT
483 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(IN) :: KTOP
484 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(IN) :: KBOTTOM
485 INTEGER,
DIMENSION(KDIM_FULL),
INTENT(INOUT) :: KINDEX
486 LOGICAL,
INTENT(IN) :: OSHADOWS
488 REAL,
DIMENSION(KDIM_FULL) :: ZSEA
489 REAL,
DIMENSION(KDIM_FULL) :: ZWATER
490 REAL,
DIMENSION(KDIM_FULL) :: ZNATURE
491 REAL,
DIMENSION(KDIM_FULL) :: ZTOWN
492 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZCOVER
493 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZVEGTYPE
494 INTEGER,
DIMENSION(KDIM_FULL,2) :: ITYPE
495 INTEGER,
DIMENSION(KDIM_FULL) :: IINDEX
496 INTEGER,
DIMENSION(0:KPROC-1) :: ISIZE_TASK
497 INTEGER,
DIMENSION(0:KPROC-1) :: INBPTS
498 INTEGER,
DIMENSION(1) :: IPROCMIN
499 INTEGER :: IFULL, IRESP, JJ, JI, JK, JVEGTYPE, CPT, IN1, IN2
500 INTEGER :: IDIM_NATURE
501 CHARACTER(LEN=6) :: YNATURE
502 LOGICAL,
DIMENSION(:),
ALLOCATABLE :: GCOVER
503 LOGICAL :: GDATA_VEGTYPE, GDIM, GDIM2
505 CHARACTER(LEN=12) :: YRECFM
506 INTEGER :: IVERSION, IBUGFIX
508 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
510 IF (
lhook)
CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_TIL',0,zhook_handle)
512 gdata_vegtype = .false.
520 CALL read_surf(hprogram,
'FRAC_SEA ',zsea, iresp, hdir=
'A')
521 CALL read_surf(hprogram,
'FRAC_NATURE',znature,iresp, hdir=
'A')
522 CALL read_surf(hprogram,
'FRAC_WATER ',zwater, iresp, hdir=
'A')
523 CALL read_surf(hprogram,
'FRAC_TOWN ',ztown, iresp, hdir=
'A')
524 CALL read_surf(hprogram,
'NATURE ',ynature,iresp, hdir=
'-')
525 CALL read_surf(hprogram,
'VERSION ',iversion,iresp, hdir=
'-')
526 CALL read_surf(hprogram,
'BUG ',ibugfix,iresp, hdir=
'-')
527 CALL read_surf(hprogram,
'DIM_NATURE ',idim_nature,iresp,hdir=
'-')
529 gdim = (iversion>8 .OR. (iversion==8 .AND. ibugfix>=1))
532 CALL read_surf(hprogram,
'ECOSG',u%LECOSG,iresp,hdir=
'-')
549 IF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.)
THEN 551 ELSEIF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. zwater(jj)/=0.)
THEN 553 ELSEIF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. ztown(jj)/=0.)
THEN 555 ELSEIF (zsea(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.)
THEN 557 ELSEIF (znature(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.)
THEN 559 ELSEIF (zsea(jj)/=0.)
THEN 560 IF (znature(jj)/=0.)
THEN 562 ELSEIF (zwater(jj)/=0.)
THEN 564 ELSEIF (ztown(jj)/=0.)
THEN 569 ELSEIF (znature(jj)/=0.)
THEN 570 IF (zwater(jj)/=0.)
THEN 572 ELSEIF (ztown(jj)/=0.)
THEN 577 ELSEIF (zwater(jj)/=0.)
THEN 578 IF (ztown(jj)/=0.)
THEN 593 IF (ynature/=
'NONE' .AND. idim_nature>0)
THEN 595 ALLOCATE(zvegtype(kdim_full,nvegtype))
598 CALL read_surf(hprogram,
'L_VEGTYPE',gdata_vegtype,iresp,hdir=
'-')
603 IF (gdata_vegtype)
THEN 610 IF (gdim)
CALL read_surf(hprogram,
'SPLIT_PATCH',gdim2,iresp)
611 CALL make_choice_array(hprogram, nvegtype, gdim2, yrecfm, zvegtype(:,:),hdir=
'A')
614 CALL read_surf(hprogram,
'VEGTYPE',zvegtype(:,:),iresp,hdir=
'E')
616 ALLOCATE(gcover(jpcover))
617 CALL read_surf(hprogram,
'COVER_LIST',gcover(:),iresp,hdir=
'-')
619 ALLOCATE(zcover(kdim_full,
count(gcover)))
621 ALLOCATE(zcover(0,0))
623 CALL read_surf_cov(hprogram,
'COVER',zcover(:,:),gcover,iresp,hdir=
'E')
626 DO jvegtype=1,nvegtype
627 CALL av_pgd(dtco,zvegtype(:,jvegtype),zcover,dtco%XDATA_VEGTYPE(:,jvegtype),
'NAT',
'ARI',gcover)
642 in1 =
count(zvegtype(jj,1:3)/=0.)
643 in2 =
count(zvegtype(jj,4:nvegtype)/=0.)
644 itype(jj,2) = in2*4 + in1 + 1
663 DO jj = 1,maxval(maxval(itype,2))
668 IF (itype(jk,1)==ji .AND. itype(jk,2)==jj) iindex(jk) = -1
671 ifull =
count(iindex(:)==-1)
677 IF (kindex(jk)>-1) inbpts(kindex(jk)) = inbpts(kindex(jk)) + 1
680 iprocmin = minloc(inbpts(0:kproc-1))-1
685 IF (halg==
'TILL')
THEN 687 ELSEIF (halg==
'TILA')
THEN 688 CALL set_nb_points_adj(kproc,ifull,kdim_full,kleft,kright,ktop,kbottom,iindex(:),oshadows)
692 IF ( iindex(jk)> -1 ) kindex(jk) = iindex(jk)
703 IF (
lhook)
CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_TIL',1,zhook_handle)
subroutine make_choice_array(HPROGRAM, KNPATCH, ODIM, HRECFM, PWORK, HDIR, KPATCH)
subroutine read_cover_garden(HPROGRAM, OGARDEN, HDIR)
integer, dimension(:), allocatable nreq
subroutine set_surfex_filein(HPROGRAM, HMASK)
subroutine set_nb_points_adj(KPROC, KSIZE, KDIM_FULL, KLEFT, KRIGHT, KTOP, KBOTTOM, KINDEX, OSHADOWS)
subroutine init_index_mpi(DTCO, U, UG, GCP, HPROGRAM, HINIT, HALG, PIO_FRAC, OSHADOWS)
subroutine read_surf_cov(HPROGRAM, HREC, PFIELD, OFLAG, KRESP, HCOMMENT, HDIR)
subroutine set_nb_points_lin(KPROC, KPROCMIN, KSIZE, KINDEX, OSHADOWS)
integer, dimension(:), allocatable nnum
integer, dimension(:), allocatable, target nmask_full
subroutine abor1_sfx(YTEXT)
subroutine read_gridtype( HPROGRAM, HGRID, KGRID_PAR, KLU, OREAD, PGRID
character(len=6) cprogname
subroutine get_adjacent_meshes(HGRID, KGRID_PAR, KL, PGRID_PAR, KLEFT,
subroutine get_sizes_parallel(DTCO, UG, U, KPROC, KSIZE, KPROCMIN, KSIZE_TASK, OSHADOWS)
subroutine end_io_surf_n(HPROGRAM)
subroutine get_luout(HPROGRAM, KLUOUT)
integer, dimension(:), allocatable nsize_task
subroutine read_arrange_cover( HPROGRAM, OWATER_TO_NATURE, OTOWN_TO_
integer, dimension(:), allocatable nindex
subroutine set_nb_points_til(HPROGRAM, HALG, KPROC, KDIM_FULL, KLEFT, KRIGHT, KTOP, KBOTTOM, KINDEX, OSHADOWS)
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION
subroutine ini_data_cover(DTCO, U)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
subroutine pgd_grid(UG, U, GCP, HPROGRAM, HFILE, HFILETYPE, OGRID, HD