SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
init_index_mpi.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 SUBROUTINE init_index_mpi (YSC, &
6  hprogram,halg,pio_frac,oshadows)
7 !
8 ! 04-2014 : Modifs Matthieu Lafaysse for shadows :
9 ! * OSHADOWS logical to pass to get_sizes_parallel
10 ! * disactivate the treatments relative to PIO_FRAC in case of shadows
11 ! * MPI_BCAST of NIX and NIY
12 !
13 USE modd_surfex_n, ONLY : surfex_t
14 !
15 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm, nindex, nsize_task, nsize, wlog_mpi
16 USE modd_surfex_omp, ONLY : nindx2sfx, nwork, nwork2, xwork, xwork2, xwork3, &
17  nwork_full, nwork2_full, xwork_full, xwork2_full
18 !
19 USE modd_mask, ONLY : nmask_full
20 !
21 USE modd_slope_effect, ONLY : nix,niy
22 !
24 !
25 USE modi_get_luout
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
31 USE modi_abor1_sfx
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
38 !
39 USE yomhook ,ONLY : lhook, dr_hook
40 USE parkind1 ,ONLY : jprb
41 !
42 IMPLICIT NONE
43 !
44 #ifdef SFX_MPI
45 include "mpif.h"
46 #endif
47 !
48 !
49 TYPE(surfex_t), INTENT(INOUT) :: ysc
50 !
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
55 !
56 INTEGER, DIMENSION(:), ALLOCATABLE :: ileft ! index of left grid mesh
57 INTEGER, DIMENSION(:), ALLOCATABLE :: iright ! index of right grid mesh
58 INTEGER, DIMENSION(:), ALLOCATABLE :: itop ! index of top grid mesh
59 INTEGER, DIMENSION(:), ALLOCATABLE :: ibottom ! index of bottom grid mesh
60 !
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
66 !
67 IF (lhook) CALL dr_hook('INIT_INDEX_MPI',0,zhook_handle)
68 !
69 IF ( nrank==npio ) THEN
70  !
71  CALL get_luout(hprogram,iluout)
72  !
73  !* 1. Parameters of the grid
74  !
75  CALL set_surfex_filein(hprogram,'PGD ')
76  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
77  hprogram,'FULL ','SURF ','READ ')
78  !
79  CALL read_surf(&
80  hprogram,'DIM_FULL ',ysc%U%NDIM_FULL,iresp,hdir='A')
81  nindx2sfx = ysc%U%NDIM_FULL
82  !
83  CALL read_arrange_cover(&
84  hprogram,ysc%U%LWATER_TO_NATURE,ysc%U%LTOWN_TO_ROCK,'A')
85  CALL read_cover_garden(&
86  hprogram,ysc%U%LGARDEN,'A')
87  !
88  CALL end_io_surf_n(hprogram)
89  DEALLOCATE(nmask_full)
90  !
91  CALL set_surfex_filein(hprogram,'PGD ') ! change input file name to pgd name
92  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
93  hprogram,'FULL ','SURF ','READ ')
94  !
95  CALL read_surf(&
96  hprogram,'GRID_TYPE',ysc%UG%CGRID,iresp,hdir='A')
97  !
98  CALL read_gridtype(&
99  hprogram,ysc%UG%CGRID,ysc%UG%NGRID_PAR,ysc%U%NDIM_FULL,.false.,hdir='A')
100  !
101  ALLOCATE(ysc%UG%XGRID_FULL_PAR(ysc%UG%NGRID_PAR))
102  !
103  CALL read_gridtype(&
104  hprogram,ysc%UG%CGRID,ysc%UG%NGRID_PAR,ysc%U%NDIM_FULL,.true.,&
105  ysc%UG%XGRID_FULL_PAR,iresp,hdir='A')
106  !
107  !
108  CALL end_io_surf_n(hprogram)
109  !
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))
114  !
115 ELSE
116  ALLOCATE(nwork_full(0))
117  ALLOCATE(xwork_full(0))
118  ALLOCATE(nwork2_full(0,0))
119  ALLOCATE(xwork2_full(0,0))
120 ENDIF
121 !
122 
123 IF (nproc>1) THEN
124 #ifdef SFX_MPI
125  CALL mpi_bcast(ysc%U%NDIM_FULL,kind(ysc%U%NDIM_FULL)/4,mpi_integer,npio,ncomm,infompi)
126 #endif
127  nindx2sfx = ysc%U%NDIM_FULL
128 ENDIF
129 !
130 !* 3. Points by task
131 !
132 IF (.NOT.ALLOCATED(nindex)) ALLOCATE(nindex(ysc%U%NDIM_FULL))
133 nindex(:) = -1
134 !
135 IF (nrank==npio) THEN
136  !
137  IF (halg=='LIN ') THEN
138  !
139  CALL set_nb_points_lin(nproc,nproc-1,ysc%U%NDIM_FULL,nindex,oshadows)
140  !
141  ELSEIF (halg=='ADJ ' .OR. halg=='TILA' .OR. halg=='TILL') THEN
142  !
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))
148  CALL get_adjacent_meshes(ysc%UG%CGRID,ysc%UG%NGRID_PAR,ysc%U%NDIM_FULL,&
149  ysc%UG%XGRID_FULL_PAR,ileft,iright,itop,ibottom)
150  ELSE
151  ALLOCATE(ileft(0))
152  ALLOCATE(iright(0))
153  ALLOCATE(ibottom(0))
154  ALLOCATE(itop(0))
155  ENDIF
156  !
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
160  CALL ini_data_cover(ysc%DTCO, ysc%U)
161  CALL set_nb_points_til(hprogram,halg,nproc,ysc%U%NDIM_FULL,ileft,iright,itop,ibottom,nindex,oshadows)
162  ENDIF
163  !
164  DEALLOCATE(ileft )
165  DEALLOCATE(iright )
166  DEALLOCATE(itop )
167  DEALLOCATE(ibottom)
168  !
169  ELSE
170  !
171  CALL abor1_sfx("INIT_INDEX_MPI: ALG="//halg//" not defined for the moment")
172  !
173  ENDIF
174  !
175  IF (nproc>1) THEN
176  !
177  inbpts(:) = 0
178  DO jj=1,SIZE(nindex)
179  inbpts(nindex(jj)) = inbpts(nindex(jj)) + 1
180  ENDDO
181  !
182  inbmin = minval(inbpts)
183  ip0 = maxval(minloc(inbpts)) - 1
184  !
185  IF (.NOT. oshadows) THEN
186  ! Matthieu Lafaysse :
187  ! With shadows we don't want the repartition of points to be modified by the following instructions
188 
189  DO WHILE( inbpts(npio) > nint(pio_frac*inbmin) )
190  !
191  DO jj=1,SIZE(nindex)
192  IF (nindex(jj)==npio) THEN
193  nindex(jj) = ip0
194  inbpts(npio) = inbpts(npio) - 1
195  inbpts(ip0) = inbpts(ip0) + 1
196  EXIT
197  ENDIF
198  ENDDO
199  !
200  inbmin = maxval(inbpts)
201  ip0 = 0
202  DO jj=0,nproc-1
203  IF (jj/=npio .AND. inbpts(jj)<inbmin) THEN
204  inbmin = inbpts(jj)
205  ip0 = jj
206  ENDIF
207  ENDDO
208  !
209  END DO
210 
211  END IF
212  !
213  ENDIF
214  !
215 ENDIF
216 !
217 
218 IF (nproc>1) THEN
219 #ifdef SFX_MPI
220  CALL mpi_bcast(nindex,SIZE(nindex)*kind(nindex)/4,mpi_integer,npio,ncomm,infompi)
221  IF (oshadows) THEN
222  ! Matthieu Lafaysse :
223  ! Each thread need to know NIX and NIY
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)
226  ENDIF
227 #endif
228 ENDIF
229 !
230 ALLOCATE(nsize_task(0:nproc-1))
231 nsize_task(:) = 0
232 !
233  CALL get_size_full_n(ysc%U, &
234  hprogram,ysc%U%NDIM_FULL,nsize_task(nrank))
235 nindx2sfx = nsize_task(nrank)
236 !
237 nsize = 0
238 IF (nproc>1) THEN
239  DO jj=0,nproc-1
240 #ifdef SFX_MPI
241  CALL mpi_bcast(nsize_task(jj),kind(nsize_task)/4,mpi_integer,jj,ncomm,infompi)
242 #endif
243  IF ( nsize_task(jj)>nsize ) nsize = nsize_task(jj)
244  CALL wlog_mpi('SIZE_TASK ',klog=jj,klog2=nsize_task(jj))
245  ENDDO
246 ELSE
247  nsize = nsize_task(0)
248 ENDIF
249 !
250 ysc%UG%XGRID_FULL_PAR=>null()
251 !
252 ALLOCATE(nwork(nsize))
253 ALLOCATE(xwork(nsize))
254 ALLOCATE(nwork2(nsize,10))
255 ALLOCATE(xwork2(nsize,10))
256 ALLOCATE(xwork3(nsize,10,10))
257 !
258 IF (lhook) CALL dr_hook('INIT_INDEX_MPI',1,zhook_handle)
259 !
260  CONTAINS
261 !
262 !***************************************************************
263 !
264 SUBROUTINE set_nb_points_lin(KPROC,KPROCMIN,KSIZE,KINDEX,OSHADOWS)
265 !
266 IMPLICIT NONE
267 !
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
273 !
274 INTEGER, DIMENSION(0:KPROC-1) :: isize_task
275 INTEGER :: ji, jj, cpt, iproc1
276 REAL(KIND=JPRB) :: zhook_handle
277 !
278 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_LIN',0,zhook_handle)
279 !
280  CALL get_sizes_parallel(ysc%DTCO, ysc%DGU, ysc%UG, ysc%U, &
281  kproc,ksize,kprocmin,isize_task,oshadows)
282 !
283 iproc1 = kprocmin
284 !
285  cpt = 0
286 !
287 DO jj=1,SIZE(kindex) ! boucle sur les points du domaine
288  !
289  IF (kindex(jj)==-1) THEN ! si le point doit être affecté à cette itération
290  cpt = cpt + 1 ! on augmente le nombre de points affectés de 1
291  DO WHILE( cpt>isize_task(iproc1) ) ! si on est hors les bornes permises par le proc en cours
292  IF ( iproc1.GE.kprocmin ) THEN ! d'abord, on va de IPROCMIN à IPROC-1
293  iproc1 = iproc1+1
294  IF ( iproc1==kproc ) iproc1 = kprocmin-1 ! une fois qu'on est à IPROC-1,
295  ELSE ! on redescend sous IPROC1
296  iproc1 = iproc1-1
297  ENDIF
298  cpt = 1
299  ENDDO
300  kindex(jj) = iproc1
301  ENDIF
302  !
303 ENDDO
304 !
305 
306 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_LIN',1,zhook_handle)
307 !
308 END SUBROUTINE set_nb_points_lin
309 !
310 !**************************************************************************
311 !
312 SUBROUTINE set_nb_points_adj(KPROC,KSIZE,KSIZE_FULL,KLEFT,KRIGHT,KTOP,KBOTTOM,KINDEX,OSHADOWS)
313 !
314 IMPLICIT NONE
315 !
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
325 !
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
330 !
331 REAL(KIND=JPRB) :: zhook_handle
332 !
333 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_ADJ',0,zhook_handle)
334 !
335  CALL get_sizes_parallel(ysc%DTCO, ysc%DGU, ysc%UG, ysc%U, &
336  kproc,ksize,npio,isize_task,oshadows)
337 !
338 DO ji=1,kproc-1
339  !
340  cpt_inter = 0
341  cpt_loc = 0
342  cpt_tot = 0
343  !
344  DO WHILE ( cpt_tot < isize_task(ji) )
345  !
346  IF (cpt_loc < 1 ) THEN ! if no free point has been found in neighbours
347  !
348  DO jj=1,ksize_full
349  IF ( kindex(jj)==-1 ) THEN
350  cpt_tot = cpt_tot + 1
351  cpt_loc = 1
352  ipoint(1) = jj
353  kindex(jj) = ji
354  EXIT
355  ENDIF
356  ENDDO
357  !
358  ENDIF
359  !
360  ipoint(1:cpt_loc-cpt_inter) = ipoint(cpt_inter+1:cpt_loc)
361  cpt_loc = cpt_loc - cpt_inter
362  cpt_inter = cpt_loc
363  !
364  b1 : DO jj=1,cpt_inter
365  !
366  inear(1) = kbottom(ipoint(jj))
367  inear(2) = kleft(ipoint(jj))
368  inear(3) = kright(ipoint(jj))
369  inear(4) = ktop(ipoint(jj))
370  !
371  DO jk=1,4
372  !
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)
380  ENDIF
381  ENDIF
382  !
383  ENDDO
384  !
385  ENDDO b1
386  !
387  ENDDO
388  !
389 ENDDO
390 !
391 WHERE (kindex(:)==-1) kindex(:) = 0
392 !
393 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_ADJ',1,zhook_handle)
394 !
395 END SUBROUTINE set_nb_points_adj
396 !
397 !*****************************************************************
398 !
399 SUBROUTINE set_nb_points_til(HPROGRAM,HALG,KPROC,KSIZE_FULL,KLEFT,KRIGHT,KTOP,KBOTTOM,KINDEX,OSHADOWS)
400 !
401 ! modif
402 ! 05/14 B. Decharme Partion done according to patch and not vegtype (vegtype can be > to patch grid)
403 !
404 USE modd_data_cover_par, ONLY : nvegtype, jpcover
405 USE modd_surf_par, ONLY : xundef
406 !
407 USE modi_av_pgd
408 USE modi_surf_patch
409 !
410 IMPLICIT NONE
411 !
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
422 !
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
439 !
440  CHARACTER(LEN=12) :: yrecfm ! Name of the article to be read
441 INTEGER :: iversion, ipatch
442 REAL, DIMENSION(:,:), ALLOCATABLE :: zpatch
443 !
444 REAL(KIND=JPRB) :: zhook_handle
445 !
446 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_TIL',0,zhook_handle)
447 !
448 gdata_vegtype = .false.
449 !
450 ! Full read
451 !
452  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
453  hprogram,'FULL ','SURF ','READ ')
454 !
455  CALL read_surf(&
456  hprogram,'FRAC_SEA ',zsea, iresp, hdir='A')
457  CALL read_surf(&
458  hprogram,'FRAC_NATURE',znature,iresp, hdir='A')
459  CALL read_surf(&
460  hprogram,'FRAC_WATER ',zwater, iresp, hdir='A')
461  CALL read_surf(&
462  hprogram,'FRAC_TOWN ',ztown, iresp, hdir='A')
463  CALL read_surf(&
464  hprogram,'NATURE ',ynature,iresp, hdir='A')
465  CALL read_surf(&
466  hprogram,'VERSION ',iversion,iresp,hdir='A')
467 !
468  CALL end_io_surf_n(hprogram)
469 !
470 ! Nature read
471 !
472 IF (ynature/='NONE' .AND. sum(znature)>0.) THEN
473 !
474  !CALL SET_SURFEX_FILEIN(HPROGRAM,'PGD')
475  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
476  hprogram,'NATURE','SURF ','READ ')
477 !
478  yrecfm='PATCH_NUMBER'
479  CALL read_surf(&
480  hprogram,yrecfm,ipatch,iresp,hdir='A')
481  ALLOCATE(zpatch(ksize_full,ipatch))
482  zpatch(:,:)=0.0
483 !
484  IF (iversion<8) CALL read_surf(&
485  hprogram,'L_VEGTYPE',gdata_vegtype,iresp,hdir='A')
486 !
487 ELSE
488 !
489  ALLOCATE(zpatch(ksize_full,1))
490  zpatch(:,:)=0.0
491 !
492 ENDIF
493 !
494 IF (iversion >= 8 .AND. ynature/='NONE' .AND. sum(znature)>0.) THEN
495 !
496  CALL end_io_surf_n(hprogram)
497 !
498  CALL set_surfex_filein(hprogram,'PREP')
499  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
500  hprogram,'NATURE','SURF ','READ ')
501  yrecfm = 'PATCH'
502  CALL read_surf(&
503  hprogram,yrecfm,zpatch(:,:),iresp,hdir='A')
504  WHERE(zpatch(:,:)==xundef)zpatch=0.0
505  CALL end_io_surf_n(hprogram)
506 !
507 ELSE
508 !
509  IF (gdata_vegtype) THEN
510  CALL read_surf(&
511  hprogram,'D_VEGTYPE',zvegtype(:,:),iresp,hdir='A')
512  CALL end_io_surf_n(hprogram)
513  ELSE
514  CALL end_io_surf_n(hprogram)
515  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
516  hprogram,'FULL ','SURF ','READ ')
517  CALL read_surf(&
518  hprogram,'COVER_LIST',gcover(:),iresp,hdir='A')
519  CALL read_surf_cov(&
520  hprogram,'COVER',zcover(:,:),gcover,iresp,hdir='A')
521  DO jvegtype=1,nvegtype
522  CALL av_pgd(ysc%DTCO, &
523  zvegtype(:,jvegtype),zcover,ysc%DTCO%XDATA_VEGTYPE(:,jvegtype),'NAT','ARI',gcover)
524  END DO
525  ENDIF
526 !
527  CALL end_io_surf_n(hprogram)
528 !
529  CALL surf_patch(ipatch,zvegtype,zpatch)
530 !
531 ENDIF
532 !
533 ! Algo
534 !
535 itype(:,:) = 0
536 !
537 DO jj=1,ksize_full
538  !
539  IF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.) THEN ! 1 2 3 4
540  itype(jj,1) = 1
541  ELSEIF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. zwater(jj)/=0.) THEN ! 1 2 3
542  itype(jj,1) = 2
543  ELSEIF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. ztown(jj)/=0.) THEN ! 1 2 4
544  itype(jj,1) = 3
545  ELSEIF (zsea(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.) THEN ! 1 3 4
546  itype(jj,1) = 4
547  ELSEIF (znature(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.) THEN ! 2 3 4
548  itype(jj,1) = 5
549  ELSEIF (zsea(jj)/=0.) THEN
550  IF (znature(jj)/=0.) THEN ! 1 2
551  itype(jj,1) = 6
552  ELSEIF (zwater(jj)/=0.) THEN ! 1 3
553  itype(jj,1) = 7
554  ELSEIF (ztown(jj)/=0.) THEN ! 1 4
555  itype(jj,1) = 8
556  ELSE ! 1
557  itype(jj,1) = 12
558  ENDIF
559  ELSEIF (znature(jj)/=0.) THEN
560  IF (zwater(jj)/=0.) THEN ! 2 3
561  itype(jj,1) = 9
562  ELSEIF (ztown(jj)/=0.) THEN ! 2 4
563  itype(jj,1) = 10
564  ELSE ! 2
565  itype(jj,1) = 13
566  ENDIF
567  ELSEIF (zwater(jj)/=0.) THEN
568  IF (ztown(jj)/=0.) THEN ! 3 4
569  itype(jj,1) = 11
570  ELSE ! 3
571  itype(jj,1) = 14
572  ENDIF
573  ELSE ! 4
574  itype(jj,1) = 15
575  ENDIF
576  !
577 ENDDO
578 !
579 !we give numbers to the 40 types of vegtypes
580  cpt = 0
581 DO ji = 1,SIZE(itype0,1)
582  DO jj = 1,SIZE(itype0,2)
583  cpt = cpt + 1
584  itype0(ji,jj) = cpt
585  ENDDO
586 ENDDO
587 !
588 DO jj=1,ksize_full
589  in1 = 0
590  in2 = 0
591  DO ji=1,min(3,ipatch)
592  IF (zpatch(jj,ji)/=0.) in1 = in1 +1
593  ENDDO
594  DO ji=4,ipatch
595  IF (zpatch(jj,ji)/=0.) in2 = in2 +1
596  ENDDO
597  itype(jj,2) = itype0(in1+1,in2+1)
598 ENDDO
599 !
600 kindex(:) = -1
601 !
602 DO ji = 1,15
603  !
604  DO jj = 1,68
605  !
606  !count of the points in the couple of types
607  iindex(:) = -2
608  DO jk=1,ksize_full
609  IF (itype(jk,1)==ji .AND. itype(jk,2)==jj) iindex(jk) = -1
610  ENDDO
611  !
612  ifull = count(iindex(:)==-1)
613  !
614  IF (ifull.NE.0) THEN
615  !
616  inbpts(:) = 0
617  DO jk=1,SIZE(kindex)
618  IF (kindex(jk)>-1) inbpts(kindex(jk)) = inbpts(kindex(jk)) + 1
619  ENDDO
620  IF (kproc>1) THEN
621  iprocmin = minloc(inbpts(0:kproc-1))-1
622  ELSE
623  iprocmin(:) = 0
624  ENDIF
625  !
626  IF (halg=='TILL') THEN
627  CALL set_nb_points_lin(kproc,iprocmin(1),ifull,iindex(:),oshadows)
628  ELSEIF (halg=='TILA') THEN
629  CALL set_nb_points_adj(kproc,ifull,ksize_full,kleft,kright,ktop,kbottom,iindex(:),oshadows)
630  ENDIF
631  !
632  DO jk=1,ksize_full
633  IF ( iindex(jk)> -1 ) kindex(jk) = iindex(jk)
634  ENDDO
635  !
636 
637  ENDIF
638  !
639  ENDDO
640  !
641 ENDDO
642 !
643 DEALLOCATE(zpatch)
644 !
645 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_TIL',1,zhook_handle)
646 !
647 END SUBROUTINE set_nb_points_til
648 !
649 !
650 !
651 END SUBROUTINE init_index_mpi
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)
Definition: abor1_sfx.F90:6
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:6
subroutine read_arrange_cover(HPROGRAM, OWATER_TO_NATURE, OTOWN_TO_ROCK, HDIR)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
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)