6 hprogram,halg,pio_frac,oshadows)
16 USE modd_surfex_omp, ONLY : nindx2sfx, nwork, nwork2, xwork, xwork2, xwork3, &
17 nwork_full, nwork2_full, xwork_full, xwork2_full
26 USE modi_set_surfex_filein
27 USE modi_init_io_surf_n
29 USE modi_read_gridtype
30 USE modi_end_io_surf_n
32 USE modi_get_sizes_parallel
33 USE modi_get_adjacent_meshes
34 USE modi_get_size_full_n
35 USE modi_ini_data_cover
36 USE modi_read_arrange_cover
37 USE modi_read_cover_garden
39 USE yomhook
,ONLY : lhook, dr_hook
40 USE parkind1
,ONLY : jprb
51 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
52 CHARACTER(LEN=4),
INTENT(IN) :: halg
53 REAL,
INTENT(IN) :: pio_frac
54 LOGICAL,
INTENT(IN) :: oshadows
56 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ileft
57 INTEGER,
DIMENSION(:),
ALLOCATABLE :: iright
58 INTEGER,
DIMENSION(:),
ALLOCATABLE :: itop
59 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ibottom
61 INTEGER,
DIMENSION(0:NPROC-1) :: inbpts
62 INTEGER :: ireste, inreste, irank, iproc
63 INTEGER :: jj, cpt, iluout, inbmin, ip0
64 INTEGER :: iresp, infompi
65 REAL(KIND=JPRB) :: zhook_handle
67 IF (lhook) CALL dr_hook(
'INIT_INDEX_MPI',0,zhook_handle)
69 IF ( nrank==npio )
THEN
77 hprogram,
'FULL ',
'SURF ',
'READ ')
80 hprogram,
'DIM_FULL ',ysc%U%NDIM_FULL,iresp,hdir=
'A')
81 nindx2sfx = ysc%U%NDIM_FULL
84 hprogram,ysc%U%LWATER_TO_NATURE,ysc%U%LTOWN_TO_ROCK,
'A')
86 hprogram,ysc%U%LGARDEN,
'A')
89 DEALLOCATE(nmask_full)
93 hprogram,
'FULL ',
'SURF ',
'READ ')
96 hprogram,
'GRID_TYPE',ysc%UG%CGRID,iresp,hdir=
'A')
99 hprogram,ysc%UG%CGRID,ysc%UG%NGRID_PAR,ysc%U%NDIM_FULL,.false.,hdir=
'A')
101 ALLOCATE(ysc%UG%XGRID_FULL_PAR(ysc%UG%NGRID_PAR))
104 hprogram,ysc%UG%CGRID,ysc%UG%NGRID_PAR,ysc%U%NDIM_FULL,.true.,&
105 ysc%UG%XGRID_FULL_PAR,iresp,hdir=
'A')
110 ALLOCATE(nwork_full(ysc%U%NDIM_FULL))
111 ALLOCATE(xwork_full(ysc%U%NDIM_FULL))
112 ALLOCATE(nwork2_full(ysc%U%NDIM_FULL,10))
113 ALLOCATE(xwork2_full(ysc%U%NDIM_FULL,10))
116 ALLOCATE(nwork_full(0))
117 ALLOCATE(xwork_full(0))
118 ALLOCATE(nwork2_full(0,0))
119 ALLOCATE(xwork2_full(0,0))
125 CALL mpi_bcast(ysc%U%NDIM_FULL,kind(ysc%U%NDIM_FULL)/4,mpi_integer,npio,ncomm,infompi)
127 nindx2sfx = ysc%U%NDIM_FULL
132 IF (.NOT.
ALLOCATED(nindex))
ALLOCATE(nindex(ysc%U%NDIM_FULL))
135 IF (nrank==npio)
THEN
137 IF (halg==
'LIN ')
THEN
141 ELSEIF (halg==
'ADJ ' .OR. halg==
'TILA' .OR. halg==
'TILL')
THEN
143 IF (halg==
'ADJ ' .OR. halg==
'TILA')
THEN
144 ALLOCATE(ileft(ysc%U%NDIM_FULL))
145 ALLOCATE(iright(ysc%U%NDIM_FULL))
146 ALLOCATE(ibottom(ysc%U%NDIM_FULL))
147 ALLOCATE(itop(ysc%U%NDIM_FULL))
149 ysc%UG%XGRID_FULL_PAR,ileft,iright,itop,ibottom)
157 IF (halg==
'ADJ ')
THEN
158 CALL
set_nb_points_adj(nproc,ysc%U%NDIM_FULL,ysc%U%NDIM_FULL,ileft,iright,itop,ibottom,nindex,oshadows)
159 ELSEIF (halg==
'TILA' .OR. halg==
'TILL')
THEN
161 CALL
set_nb_points_til(hprogram,halg,nproc,ysc%U%NDIM_FULL,ileft,iright,itop,ibottom,nindex,oshadows)
171 CALL
abor1_sfx(
"INIT_INDEX_MPI: ALG="//halg//
" not defined for the moment")
179 inbpts(nindex(jj)) = inbpts(nindex(jj)) + 1
182 inbmin = minval(inbpts)
183 ip0 = maxval(minloc(inbpts)) - 1
185 IF (.NOT. oshadows)
THEN
189 DO WHILE( inbpts(npio) > nint(pio_frac*inbmin) )
192 IF (nindex(jj)==npio)
THEN
194 inbpts(npio) = inbpts(npio) - 1
195 inbpts(ip0) = inbpts(ip0) + 1
200 inbmin = maxval(inbpts)
203 IF (jj/=npio .AND. inbpts(jj)<inbmin)
THEN
220 CALL mpi_bcast(nindex,
SIZE(nindex)*kind(nindex)/4,mpi_integer,npio,ncomm,infompi)
224 CALL mpi_bcast(nix,kind(nix)/4,mpi_integer,npio,ncomm,infompi)
225 CALL mpi_bcast(niy,kind(niy)/4,mpi_integer,npio,ncomm,infompi)
230 ALLOCATE(nsize_task(0:nproc-1))
234 hprogram,ysc%U%NDIM_FULL,nsize_task(nrank))
235 nindx2sfx = nsize_task(nrank)
241 CALL mpi_bcast(nsize_task(jj),kind(nsize_task)/4,mpi_integer,jj,ncomm,infompi)
243 IF ( nsize_task(jj)>nsize ) nsize = nsize_task(jj)
244 CALL
wlog_mpi(
'SIZE_TASK ',klog=jj,klog2=nsize_task(jj))
247 nsize = nsize_task(0)
250 ysc%UG%XGRID_FULL_PAR=>null()
252 ALLOCATE(nwork(nsize))
253 ALLOCATE(xwork(nsize))
254 ALLOCATE(nwork2(nsize,10))
255 ALLOCATE(xwork2(nsize,10))
256 ALLOCATE(xwork3(nsize,10,10))
258 IF (lhook) CALL dr_hook(
'INIT_INDEX_MPI',1,zhook_handle)
268 INTEGER,
INTENT(IN) :: kproc
269 INTEGER,
INTENT(IN) :: kprocmin
270 INTEGER,
INTENT(IN) :: ksize
271 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: kindex
272 LOGICAL,
INTENT(IN) :: oshadows
274 INTEGER,
DIMENSION(0:KPROC-1) :: isize_task
275 INTEGER :: ji, jj, cpt, iproc1
276 REAL(KIND=JPRB) :: zhook_handle
278 IF (lhook) CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_LIN',0,zhook_handle)
281 kproc,ksize,kprocmin,isize_task,oshadows)
289 IF (kindex(jj)==-1)
THEN
291 DO WHILE( cpt>isize_task(iproc1) )
292 IF ( iproc1.GE.kprocmin )
THEN
294 IF ( iproc1==kproc ) iproc1 = kprocmin-1
306 IF (lhook) CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_LIN',1,zhook_handle)
316 INTEGER,
INTENT(IN) :: kproc
317 INTEGER,
INTENT(IN) :: ksize
318 INTEGER,
INTENT(IN) :: ksize_full
319 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(IN) :: kleft
320 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(IN) :: kright
321 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(IN) :: ktop
322 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(IN) :: kbottom
323 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(INOUT) :: kindex
324 LOGICAL,
INTENT(IN) :: oshadows
326 INTEGER,
DIMENSION(KSIZE_FULL) :: ipoint
327 INTEGER,
DIMENSION(0:KPROC-1) :: isize_task
328 INTEGER,
DIMENSION(4) :: inear
329 INTEGER :: cpt_tot, cpt_loc, cpt_inter, ji, jj, jk
331 REAL(KIND=JPRB) :: zhook_handle
333 IF (lhook) CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_ADJ',0,zhook_handle)
336 kproc,ksize,npio,isize_task,oshadows)
344 DO WHILE ( cpt_tot < isize_task(ji) )
346 IF (cpt_loc < 1 )
THEN
349 IF ( kindex(jj)==-1 )
THEN
350 cpt_tot = cpt_tot + 1
360 ipoint(1:cpt_loc-cpt_inter) = ipoint(cpt_inter+1:cpt_loc)
361 cpt_loc = cpt_loc - cpt_inter
364 b1 :
DO jj=1,cpt_inter
366 inear(1) = kbottom(ipoint(jj))
367 inear(2) = kleft(ipoint(jj))
368 inear(3) = kright(ipoint(jj))
369 inear(4) = ktop(ipoint(jj))
373 IF ( inear(jk).NE.0 )
THEN
374 IF( kindex(inear(jk)).EQ.-1 )
THEN
375 cpt_tot = cpt_tot + 1
376 cpt_loc = cpt_loc + 1
377 IF (cpt_tot.GT.isize_task(ji))
EXIT b1
378 kindex(inear(jk)) = ji
379 ipoint(cpt_loc) = inear(jk)
391 WHERE (kindex(:)==-1) kindex(:) = 0
393 IF (lhook) CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_ADJ',1,zhook_handle)
399 SUBROUTINE set_nb_points_til(HPROGRAM,HALG,KPROC,KSIZE_FULL,KLEFT,KRIGHT,KTOP,KBOTTOM,KINDEX,OSHADOWS)
412 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
413 CHARACTER(LEN=4),
INTENT(IN) :: halg
414 INTEGER,
INTENT(IN) :: kproc
415 INTEGER,
INTENT(IN) :: ksize_full
416 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(IN) :: kleft
417 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(IN) :: kright
418 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(IN) :: ktop
419 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(IN) :: kbottom
420 INTEGER,
DIMENSION(KSIZE_FULL),
INTENT(INOUT) :: kindex
421 LOGICAL,
INTENT(IN) :: oshadows
423 REAL,
DIMENSION(KSIZE_FULL) :: zsea
424 REAL,
DIMENSION(KSIZE_FULL) :: zwater
425 REAL,
DIMENSION(KSIZE_FULL) :: znature
426 REAL,
DIMENSION(KSIZE_FULL) :: ztown
427 REAL,
DIMENSION(KSIZE_FULL, JPCOVER) :: zcover
428 REAL,
DIMENSION(KSIZE_FULL, NVEGTYPE) :: zvegtype
429 INTEGER,
DIMENSION(KSIZE_FULL,2) :: itype
430 INTEGER,
DIMENSION(4,17) :: itype0
431 INTEGER,
DIMENSION(KSIZE_FULL) :: iindex
432 INTEGER,
DIMENSION(0:KPROC-1) :: isize_task
433 INTEGER,
DIMENSION(0:KPROC-1) :: inbpts
434 INTEGER,
DIMENSION(1) :: iprocmin
435 INTEGER :: ifull, iresp, jj, ji, jk, jvegtype, cpt, in1, in2
436 CHARACTER(LEN=6) :: ynature
437 LOGICAL,
DIMENSION(JPCOVER) :: gcover
438 LOGICAL :: gdata_vegtype
440 CHARACTER(LEN=12) :: yrecfm
441 INTEGER :: iversion, ipatch
442 REAL,
DIMENSION(:,:),
ALLOCATABLE :: zpatch
444 REAL(KIND=JPRB) :: zhook_handle
446 IF (lhook) CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_TIL',0,zhook_handle)
448 gdata_vegtype = .false.
453 hprogram,
'FULL ',
'SURF ',
'READ ')
456 hprogram,
'FRAC_SEA ',zsea, iresp, hdir=
'A')
458 hprogram,
'FRAC_NATURE',znature,iresp, hdir=
'A')
460 hprogram,
'FRAC_WATER ',zwater, iresp, hdir=
'A')
462 hprogram,
'FRAC_TOWN ',ztown, iresp, hdir=
'A')
464 hprogram,
'NATURE ',ynature,iresp, hdir=
'A')
466 hprogram,
'VERSION ',iversion,iresp,hdir=
'A')
472 IF (ynature/=
'NONE' .AND. sum(znature)>0.)
THEN
476 hprogram,
'NATURE',
'SURF ',
'READ ')
478 yrecfm=
'PATCH_NUMBER'
480 hprogram,yrecfm,ipatch,iresp,hdir=
'A')
481 ALLOCATE(zpatch(ksize_full,ipatch))
485 hprogram,
'L_VEGTYPE',gdata_vegtype,iresp,hdir=
'A')
489 ALLOCATE(zpatch(ksize_full,1))
494 IF (iversion >= 8 .AND. ynature/=
'NONE' .AND. sum(znature)>0.)
THEN
500 hprogram,
'NATURE',
'SURF ',
'READ ')
503 hprogram,yrecfm,zpatch(:,:),iresp,hdir=
'A')
504 WHERE(zpatch(:,:)==xundef)zpatch=0.0
509 IF (gdata_vegtype)
THEN
511 hprogram,
'D_VEGTYPE',zvegtype(:,:),iresp,hdir=
'A')
516 hprogram,
'FULL ',
'SURF ',
'READ ')
518 hprogram,
'COVER_LIST',gcover(:),iresp,hdir=
'A')
520 hprogram,
'COVER',zcover(:,:),gcover,iresp,hdir=
'A')
521 DO jvegtype=1,nvegtype
523 zvegtype(:,jvegtype),zcover,ysc%DTCO%XDATA_VEGTYPE(:,jvegtype),
'NAT',
'ARI',gcover)
539 IF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.)
THEN
541 ELSEIF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. zwater(jj)/=0.)
THEN
543 ELSEIF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. ztown(jj)/=0.)
THEN
545 ELSEIF (zsea(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.)
THEN
547 ELSEIF (znature(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.)
THEN
549 ELSEIF (zsea(jj)/=0.)
THEN
550 IF (znature(jj)/=0.)
THEN
552 ELSEIF (zwater(jj)/=0.)
THEN
554 ELSEIF (ztown(jj)/=0.)
THEN
559 ELSEIF (znature(jj)/=0.)
THEN
560 IF (zwater(jj)/=0.)
THEN
562 ELSEIF (ztown(jj)/=0.)
THEN
567 ELSEIF (zwater(jj)/=0.)
THEN
568 IF (ztown(jj)/=0.)
THEN
581 DO ji = 1,
SIZE(itype0,1)
582 DO jj = 1,
SIZE(itype0,2)
591 DO ji=1,min(3,ipatch)
592 IF (zpatch(jj,ji)/=0.) in1 = in1 +1
595 IF (zpatch(jj,ji)/=0.) in2 = in2 +1
597 itype(jj,2) = itype0(in1+1,in2+1)
609 IF (itype(jk,1)==ji .AND. itype(jk,2)==jj) iindex(jk) = -1
612 ifull = count(iindex(:)==-1)
618 IF (kindex(jk)>-1) inbpts(kindex(jk)) = inbpts(kindex(jk)) + 1
621 iprocmin = minloc(inbpts(0:kproc-1))-1
626 IF (halg==
'TILL')
THEN
628 ELSEIF (halg==
'TILA')
THEN
629 CALL
set_nb_points_adj(kproc,ifull,ksize_full,kleft,kright,ktop,kbottom,iindex(:),oshadows)
633 IF ( iindex(jk)> -1 ) kindex(jk) = iindex(jk)
645 IF (lhook) CALL dr_hook(
'INIT_INDEX_MPI:SET_NB_POINTS_TIL',1,zhook_handle)
subroutine init_io_surf_n(DTCO, DGU, U, HPROGRAM, HMASK, HSCHEME, HACTION)
subroutine read_gridtype(HPROGRAM, HGRID, KGRID_PAR, KLU, OREAD, PGRID_PAR, KRESP, HDIR)
subroutine read_cover_garden(HPROGRAM, OGARDEN, HDIR)
subroutine get_sizes_parallel(DTCO, DGU, UG, U, KPROC, KSIZE, KPROCMIN, KSIZE_TASK, OSHADOWS)
subroutine, public read_surf_cov(HPROGRAM, HREC, PFIELD, OFLAG, KRESP, HCOMMENT, HDIR)
subroutine set_surfex_filein(HPROGRAM, HMASK)
subroutine set_nb_points_lin(KPROC, KPROCMIN, KSIZE, KINDEX, OSHADOWS)
subroutine get_adjacent_meshes(HGRID, KGRID_PAR, KL, PGRID_PAR, KLEFT, KRIGHT, KTOP, KBOTTOM)
subroutine init_index_mpi(YSC, HPROGRAM, HALG, PIO_FRAC, OSHADOWS)
subroutine abor1_sfx(YTEXT)
subroutine end_io_surf_n(HPROGRAM)
subroutine read_arrange_cover(HPROGRAM, OWATER_TO_NATURE, OTOWN_TO_ROCK, HDIR)
subroutine get_luout(HPROGRAM, KLUOUT)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
subroutine set_nb_points_til(HPROGRAM, HALG, KPROC, KSIZE_FULL, KLEFT, KRIGHT, KTOP, KBOTTOM, KINDEX, OSHADOWS)
subroutine get_size_full_n(U, HPROGRAM, KDIM_FULL, KSIZE_FULL)
subroutine ini_data_cover(DTCO, U)
subroutine set_nb_points_adj(KPROC, KSIZE, KSIZE_FULL, KLEFT, KRIGHT, KTOP, KBOTTOM, KINDEX, OSHADOWS)