SURFEX v8.1
General documentation of Surfex
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 (DTCO, U, UG, GCP, HPROGRAM,HINIT,HALG,PIO_FRAC,OSHADOWS)
6 !
7 ! 04-2014 : Modifs Matthieu Lafaysse for shadows :
8 ! * OSHADOWS logical to pass to get_sizes_parallel
9 ! * disactivate the treatments relative to PIO_FRAC in case of shadows
10 ! * MPI_BCAST of NIX and NIY
11 !
13 USE modd_surf_atm_n, ONLY : surf_atm_t
16 !
17 USE modd_xios, ONLY : lxios
18 !
19 USE modd_sfx_oasis, ONLY : loasis
20 !
23 !
24 USE modn_io_offline, ONLY : lland_use
25 !
26 USE modd_surf_conf, ONLY : cprogname
27 USE modd_mask, ONLY : nmask_full
28 !
29 USE modd_slope_effect, ONLY : nix,niy
30 !
32 !
33 USE modi_ini_csts
34 USE modi_pgd_grid
35 USE modi_get_luout
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
42 USE modi_abor1_sfx
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
48 !
49 USE yomhook ,ONLY : lhook, dr_hook
50 USE parkind1 ,ONLY : jprb
51 !
52 IMPLICIT NONE
53 !
54 #ifdef SFX_MPI
55 include "mpif.h"
56 #endif
57 !
58 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
59 TYPE(surf_atm_t), INTENT(INOUT) :: U
60 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
61 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
62 !
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
68 !
69 INTEGER, DIMENSION(:), ALLOCATABLE :: ILEFT ! index of left grid mesh
70 INTEGER, DIMENSION(:), ALLOCATABLE :: IRIGHT ! index of right grid mesh
71 INTEGER, DIMENSION(:), ALLOCATABLE :: ITOP ! index of top grid mesh
72 INTEGER, DIMENSION(:), ALLOCATABLE :: IBOTTOM ! index of bottom grid mesh
73 !
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
81 !
82 IF (lhook) CALL dr_hook('INIT_INDEX_MPI',0,zhook_handle)
83 !
84 gspec = (hinit=='PGD' .OR. (hinit=='PRE' .AND. loasis) .OR. &
85  (hinit=='OFF' .AND. (lland_use .OR. lxios .OR. loasis)))
86 !
87 ALLOCATE(nreq((nproc-1)*2))
88 !
89 IF (PRESENT(oshadows)) THEN
90  gshadows = oshadows
91 ELSE
92  gshadows = .false.
93 ENDIF
94 !
95 IF ( nrank==npio ) THEN
96  !
97  CALL get_luout(hprogram,iluout)
98  !
99  !* 1. Parameters of the grid
100  !
101  IF (hinit=='PGD') THEN
102  !
103  cprogname=hprogram
104  !
105  CALL ini_csts
106  !
107  CALL pgd_grid (ug, u, gcp, hprogram,' ',' ',&
108  .false.,'A')
109  !
110  ELSE
111  !
112  CALL set_surfex_filein(hprogram,'PGD ')
113  CALL init_io_surf_n(dtco, u, hprogram,'FULL ','SURF ','READ ')
114  !
115  CALL read_surf(hprogram, 'DIM_FULL ', u%NDIM_FULL, iresp, hdir='A')
116  !
117  CALL read_arrange_cover(hprogram, u%LWATER_TO_NATURE, u%LTOWN_TO_ROCK,'A')
118  CALL read_cover_garden(hprogram, u%LGARDEN,'A')
119  !
120  CALL end_io_surf_n(hprogram)
121  DEALLOCATE(nmask_full)
122  !
123  CALL set_surfex_filein(hprogram,'PGD ') ! change input file name to pgd name
124  CALL init_io_surf_n(dtco, u, hprogram,'FULL ','SURF ','READ ')
125  !
126  CALL read_surf(hprogram, 'GRID_TYPE', ug%G%CGRID, iresp, hdir='A')
127  !
128  CALL read_gridtype(hprogram, ug%G%CGRID, ug%NGRID_FULL_PAR, u%NDIM_FULL, .false., hdir='A')
129  !
130  ALLOCATE(ug%XGRID_FULL_PAR(ug%NGRID_FULL_PAR))
131  !
132  CALL read_gridtype(hprogram, ug%G%CGRID, ug%NGRID_FULL_PAR, u%NDIM_FULL, .true.,&
133  ug%XGRID_FULL_PAR, iresp ,hdir='A')
134  !
135  !
136  CALL end_io_surf_n(hprogram)
137  !
138  ENDIF
139  !
140  nsize = u%NDIM_FULL
141  !
142 ELSE
143  u%NDIM_FULL = 0
144 ENDIF
145 !
146 IF (nproc>1) THEN
147 #ifdef SFX_MPI
148  IF (gspec) THEN
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)
152  ENDIF
153  CALL mpi_bcast(u%NDIM_FULL,kind(u%NDIM_FULL)/4,mpi_integer,npio,ncomm,infompi)
154 #endif
155 ENDIF
156 !
157 ndim_full_init = u%NDIM_FULL
158 !
159 !* 3. Points by task
160 !
161 IF (nrank==npio .OR. gspec) THEN
162  IF (.NOT.ALLOCATED(nindex)) ALLOCATE(nindex(u%NDIM_FULL))
163  nindex(:) = -1
164 ELSEIF (.NOT.ALLOCATED(nindex)) THEN
165  ALLOCATE(nindex(0))
166 ENDIF
167 !
168 IF (hinit=='PGD' .AND. (halg=='TILA' .OR. halg=='TILL')) THEN
169  halg = 'LIN '
170  IF (nrank==npio) 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'
173  ENDIF
174 ENDIF
175 !
176 IF (halg=='LIN ') THEN
177  !
178  IF (nrank==npio) CALL set_nb_points_lin(nproc,nproc-1,u%NDIM_FULL,nindex,oshadows)
179  !
180 ELSEIF (halg=='ADJ ' .OR. halg=='TILA' .OR. halg=='TILL') THEN
181  !
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))
187  CALL get_adjacent_meshes(ug%G%CGRID,ug%NGRID_FULL_PAR,u%NDIM_FULL,&
188  ug%XGRID_FULL_PAR,ileft,iright,itop,ibottom)
189  ELSE
190  ALLOCATE(ileft(0))
191  ALLOCATE(iright(0))
192  ALLOCATE(ibottom(0))
193  ALLOCATE(itop(0))
194  ENDIF
195  !
196  IF (halg=='ADJ ') THEN
197  IF (nrank==npio) CALL set_nb_points_adj(nproc,u%NDIM_FULL,u%NDIM_FULL,&
198  ileft,iright,itop,ibottom,nindex,oshadows)
199  ELSEIF (halg=='TILA' .OR. halg=='TILL') THEN
200  CALL set_nb_points_til(hprogram,halg,nproc,u%NDIM_FULL,ileft,iright,itop,ibottom,nindex,oshadows)
201  ENDIF
202  !
203 ELSE
204  !
205  CALL abor1_sfx("INIT_INDEX_MPI: ALG="//halg//" not defined for the moment")
206  !
207 ENDIF
208 !
209 IF (gspec) THEN
210  ALLOCATE(nnum(u%NDIM_FULL))
211  nnum(:) = 0
212 ENDIF
213 !
214 IF (nrank==npio) THEN
215  !
216  IF (nproc>1) THEN
217  !
218  inbpts(:) = 0
219  DO jj=1,SIZE(nindex)
220  inbpts(nindex(jj)) = inbpts(nindex(jj)) + 1
221  ENDDO
222  !
223  inbmin = minval(inbpts)
224  ip0 = maxval(minloc(inbpts)) - 1
225  !
226  IF (.NOT. gshadows) THEN
227  ! Matthieu Lafaysse :
228  ! With shadows we don't want the repartition of points to be modified by the following instructions
229 
230  DO WHILE( inbpts(npio) > nint(pio_frac*inbmin) )
231  !
232  DO jj=1,SIZE(nindex)
233  IF (nindex(jj)==npio) THEN
234  nindex(jj) = ip0
235  inbpts(npio) = inbpts(npio) - 1
236  inbpts(ip0) = inbpts(ip0) + 1
237  EXIT
238  ENDIF
239  ENDDO
240  !
241  inbmin = maxval(inbpts)
242  ip0 = 0
243  DO jj=0,nproc-1
244  IF (jj/=npio .AND. inbpts(jj)<inbmin) THEN
245  inbmin = inbpts(jj)
246  ip0 = jj
247  ENDIF
248  ENDDO
249  !
250  END DO
251 
252  END IF
253  !
254  ENDIF
255  !
256  IF (gspec) THEN
257  inb(:) = 0
258  DO jj=1,u%NDIM_FULL
259  inb(nindex(jj)) = inb(nindex(jj))+1
260  nnum(jj) = inb(nindex(jj))
261  ENDDO
262  ENDIF
263  !
264 ENDIF
265 !
266 IF (nproc>1) THEN
267 #ifdef SFX_MPI
268  IF (gspec) THEN
269  CALL mpi_bcast(nindex,SIZE(nindex)*kind(nindex)/4,mpi_integer,npio,ncomm,infompi)
270  CALL mpi_bcast(nnum,SIZE(nnum)*kind(nnum)/4,mpi_integer,npio,ncomm,infompi)
271  ENDIF
272  IF (gshadows) THEN
273  ! Matthieu Lafaysse :
274  ! Each thread need to know NIX and NIY
275  CALL mpi_bcast(nix,kind(nix)/4,mpi_integer,npio,ncomm,infompi)
276  CALL mpi_bcast(niy,kind(niy)/4,mpi_integer,npio,ncomm,infompi)
277  ENDIF
278 #endif
279 ENDIF
280 !
281 ALLOCATE(nsize_task(0:nproc-1))
282 nsize_task(:) = 0
283 !
284 IF (nrank==npio) THEN
285  DO jj=1,u%NDIM_FULL
286  nsize_task(nindex(jj)) = nsize_task(nindex(jj)) + 1
287  ENDDO
288 ENDIF
289 !
290 nsize = 0
291 IF (nproc>1) THEN
292 #ifdef SFX_MPI
293  CALL mpi_bcast(nsize_task,SIZE(nsize_task)*kind(nsize_task)/4,mpi_integer,npio,ncomm,infompi)
294 #endif
295  nsize = maxval(nsize_task)
296  DO jj=0,nproc-1
297  CALL wlog_mpi('SIZE_TASK ',klog=jj,klog2=nsize_task(jj))
298  ENDDO
299 ELSE
300  nsize = nsize_task(0)
301 ENDIF
302 !
303 IF (.NOT.gspec) ug%XGRID_FULL_PAR=>null()
304 !
305 IF (lhook) CALL dr_hook('INIT_INDEX_MPI',1,zhook_handle)
306 !
307 CONTAINS
308 !
309 !***************************************************************
310 !
311 SUBROUTINE set_nb_points_lin(KPROC,KPROCMIN,KSIZE,KINDEX,OSHADOWS)
312 !
313 IMPLICIT NONE
314 !
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
320 !
321 INTEGER, DIMENSION(0:KPROC-1) :: ISIZE_TASK
322 INTEGER :: JI, JJ, CPT, IPROC1
323 REAL(KIND=JPRB) :: ZHOOK_HANDLE
324 !
325 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_LIN',0,zhook_handle)
326 !
327  CALL get_sizes_parallel(dtco, ug, u, &
328  kproc,ksize,kprocmin,isize_task,oshadows)
329 !
330 iproc1 = kprocmin
331 !
332 cpt = 0
333 !
334 DO jj=1,SIZE(kindex) ! boucle sur les points du domaine
335  !
336  IF (kindex(jj)==-1) THEN ! si le point doit être affecté à cette itération
337  cpt = cpt + 1 ! on augmente le nombre de points affectés de 1
338  DO WHILE( cpt>isize_task(iproc1) ) ! si on est hors les bornes permises par le proc en cours
339  IF ( iproc1.GE.kprocmin ) THEN ! d'abord, on va de IPROCMIN à IPROC-1
340  iproc1 = iproc1+1
341  IF ( iproc1==kproc ) iproc1 = kprocmin-1 ! une fois qu'on est à IPROC-1,
342  ELSE ! on redescend sous IPROC1
343  iproc1 = iproc1-1
344  ENDIF
345  cpt = 1
346  ENDDO
347  kindex(jj) = iproc1
348  ENDIF
349  !
350 ENDDO
351 !
352 
353 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_LIN',1,zhook_handle)
354 !
355 END SUBROUTINE set_nb_points_lin
356 !
357 !**************************************************************************
358 !
359 SUBROUTINE set_nb_points_adj(KPROC,KSIZE,KDIM_FULL,KLEFT,KRIGHT,KTOP,KBOTTOM,KINDEX,OSHADOWS)
360 !
361 IMPLICIT NONE
362 !
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
372 !
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
379 !
380 REAL(KIND=JPRB) :: ZHOOK_HANDLE
381 !
382 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_ADJ',0,zhook_handle)
383 !
384  CALL get_sizes_parallel(dtco, ug, u, &
385  kproc,ksize,npio,isize_task,oshadows)
386 !
387 icount = count(kindex(:)==-1)
388 ALLOCATE(imask(icount))
389 icpt = 0
390 DO jj=1,kdim_full
391  IF (kindex(jj)==-1) THEN
392  icpt = icpt + 1
393  imask(icpt) = jj
394  ENDIF
395 ENDDO
396 ideb = 1
397 !
398 DO ji=1,kproc-1
399  !
400  cpt_inter = 0
401  cpt_loc = 0
402  cpt_tot = 0
403  !
404  DO WHILE ( cpt_tot < isize_task(ji) )
405  !
406  IF (cpt_loc < 1 ) THEN ! if no free point has been found in neighbours
407  !
408  DO jj=ideb,icount
409  IF ( kindex(imask(jj))==-1 ) THEN
410  cpt_tot = cpt_tot + 1
411  cpt_loc = 1
412  ipoint(1) = imask(jj)
413  kindex(imask(jj)) = ji
414  EXIT
415  ENDIF
416  ENDDO
417  ideb = jj+1
418  !
419  ENDIF
420  !
421  ipoint(1:cpt_loc-cpt_inter) = ipoint(cpt_inter+1:cpt_loc)
422  cpt_loc = cpt_loc - cpt_inter
423  cpt_inter = cpt_loc
424  !
425  b1 : DO jj=1,cpt_inter
426  !
427  inear(1) = kbottom(ipoint(jj))
428  inear(2) = kleft(ipoint(jj))
429  inear(3) = kright(ipoint(jj))
430  inear(4) = ktop(ipoint(jj))
431  !
432  DO jk=1,4
433  !
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)
441  ENDIF
442  ENDIF
443  !
444  ENDDO
445  !
446  ENDDO b1
447  !
448  ENDDO
449  !
450 ENDDO
451 !
452 DEALLOCATE(imask)
453 !
454 WHERE (kindex(:)==-1) kindex(:) = 0
455 !
456 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_ADJ',1,zhook_handle)
457 !
458 END SUBROUTINE set_nb_points_adj
459 !
460 !*****************************************************************
461 !
462 SUBROUTINE set_nb_points_til(HPROGRAM,HALG,KPROC,KDIM_FULL,KLEFT,KRIGHT,KTOP,KBOTTOM,KINDEX,OSHADOWS)
463 !
464 ! modif
465 ! 05/14 B. Decharme Partion done according to patch and not vegtype (vegtype can be > to patch grid)
466 !
467 USE modn_io_offline, ONLY : lwr_vegtype
468 !
469 USE modd_data_cover_par, ONLY : nvegtype, jpcover
470 !
471 USE modd_surf_par, ONLY : xundef
472 !
473 USE modi_av_pgd
474 !
475 IMPLICIT NONE
476 !
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
487 !
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
504 !
505  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
506 INTEGER :: IVERSION, IBUGFIX
507 !
508 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
509 !
510 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_TIL',0,zhook_handle)
511 !
512 gdata_vegtype = .false.
513 !
514 ! Full read
515 !
516  CALL set_surfex_filein(hprogram,'PGD ')
517 
518  CALL init_io_surf_n(dtco, u, hprogram,'FULL ','SURF ','READ ')
519 !
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='-')
528 !
529 gdim = (iversion>8 .OR. (iversion==8 .AND. ibugfix>=1))
530 !
531 IF (gdim) THEN
532  CALL read_surf(hprogram,'ECOSG',u%LECOSG,iresp,hdir='-')
533 ELSE
534  u%LECOSG = .false.
535 ENDIF
536 !
537  CALL end_io_surf_n(hprogram)
538 !
539  CALL ini_data_cover(dtco, u)
540 !
541 ! Algo
542 !
543 IF (nrank==npio) THEN
544  !
545  itype(:,:) = 0
546  !
547  DO jj=1,kdim_full
548  !
549  IF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.) THEN ! 1 2 3 4
550  itype(jj,1) = 1
551  ELSEIF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. zwater(jj)/=0.) THEN ! 1 2 3
552  itype(jj,1) = 2
553  ELSEIF (zsea(jj)/=0. .AND. znature(jj)/=0. .AND. ztown(jj)/=0.) THEN ! 1 2 4
554  itype(jj,1) = 3
555  ELSEIF (zsea(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.) THEN ! 1 3 4
556  itype(jj,1) = 4
557  ELSEIF (znature(jj)/=0. .AND. zwater(jj)/=0. .AND. ztown(jj)/=0.) THEN ! 2 3 4
558  itype(jj,1) = 5
559  ELSEIF (zsea(jj)/=0.) THEN
560  IF (znature(jj)/=0.) THEN ! 1 2
561  itype(jj,1) = 6
562  ELSEIF (zwater(jj)/=0.) THEN ! 1 3
563  itype(jj,1) = 7
564  ELSEIF (ztown(jj)/=0.) THEN ! 1 4
565  itype(jj,1) = 8
566  ELSE ! 1
567  itype(jj,1) = 12
568  ENDIF
569  ELSEIF (znature(jj)/=0.) THEN
570  IF (zwater(jj)/=0.) THEN ! 2 3
571  itype(jj,1) = 9
572  ELSEIF (ztown(jj)/=0.) THEN ! 2 4
573  itype(jj,1) = 10
574  ELSE ! 2
575  itype(jj,1) = 13
576  ENDIF
577  ELSEIF (zwater(jj)/=0.) THEN
578  IF (ztown(jj)/=0.) THEN ! 3 4
579  itype(jj,1) = 11
580  ELSE ! 3
581  itype(jj,1) = 14
582  ENDIF
583  ELSE ! 4
584  itype(jj,1) = 15
585  ENDIF
586  !
587  ENDDO
588  !
589 ENDIF
590 !
591 ! Nature read
592 !
593 IF (ynature/='NONE' .AND. idim_nature>0) THEN
594  !
595  ALLOCATE(zvegtype(kdim_full,nvegtype))
596  !
597  CALL init_io_surf_n(dtco, u, hprogram,'NATURE','SURF ','READ ')
598  CALL read_surf(hprogram,'L_VEGTYPE',gdata_vegtype,iresp,hdir='-')
599  CALL end_io_surf_n(hprogram)
600  !
601  CALL init_io_surf_n(dtco, u, hprogram,'FULL ','SURF ','READ ')
602  !
603  IF (gdata_vegtype) THEN
604  IF (gdim) THEN
605  yrecfm='D_VEGTY_'
606  ELSE
607  yrecfm='D_VEGTYPE'
608  ENDIF
609  gdim2 = gdim
610  IF (gdim) CALL read_surf(hprogram,'SPLIT_PATCH',gdim2,iresp)
611  CALL make_choice_array(hprogram, nvegtype, gdim2, yrecfm, zvegtype(:,:),hdir='A')
612  ELSE
613  IF (lwr_vegtype) THEN
614  CALL read_surf(hprogram,'VEGTYPE',zvegtype(:,:),iresp,hdir='E')
615  ELSE
616  ALLOCATE(gcover(jpcover))
617  CALL read_surf(hprogram,'COVER_LIST',gcover(:),iresp,hdir='-')
618  IF (nrank==npio) THEN
619  ALLOCATE(zcover(kdim_full,count(gcover)))
620  ELSE
621  ALLOCATE(zcover(0,0))
622  ENDIF
623  CALL read_surf_cov(hprogram,'COVER',zcover(:,:),gcover,iresp,hdir='E')
624 
625  IF (nrank==npio) THEN
626  DO jvegtype=1,nvegtype
627  CALL av_pgd(dtco,zvegtype(:,jvegtype),zcover,dtco%XDATA_VEGTYPE(:,jvegtype),'NAT','ARI',gcover)
628  END DO
629  ENDIF
630  DEALLOCATE(zcover)
631  DEALLOCATE(gcover)
632 
633  ENDIF
634 
635  ENDIF
636 !
637  CALL end_io_surf_n(hprogram)
638 !
639  IF (nrank==npio) THEN
640  !we give numbers to the 40 types of vegtypes
641  DO jj=1,kdim_full
642  in1 = count(zvegtype(jj,1:3)/=0.)
643  in2 = count(zvegtype(jj,4:nvegtype)/=0.)
644  itype(jj,2) = in2*4 + in1 + 1
645  ENDDO
646  ENDIF
647  !
648 ELSE
649  !
650  IF (nrank==npio) itype(:,2) = 1
651  !
652 ENDIF
653 !
654 !
655 !we give numbers to the 40 types of vegtypes
656 !
657 IF (nrank==npio) THEN
658  !
659  kindex(:) = -1
660  !
661  DO ji = 1,15
662  !
663  DO jj = 1,maxval(maxval(itype,2))
664  !
665  !count of the points in the couple of types
666  iindex(:) = -2
667  DO jk=1,kdim_full
668  IF (itype(jk,1)==ji .AND. itype(jk,2)==jj) iindex(jk) = -1
669  ENDDO
670  !
671  ifull = count(iindex(:)==-1)
672  !
673  IF (ifull.NE.0) THEN
674  !
675  inbpts(:) = 0
676  DO jk=1,SIZE(kindex)
677  IF (kindex(jk)>-1) inbpts(kindex(jk)) = inbpts(kindex(jk)) + 1
678  ENDDO
679  IF (kproc>1) THEN
680  iprocmin = minloc(inbpts(0:kproc-1))-1
681  ELSE
682  iprocmin(:) = 0
683  ENDIF
684  !
685  IF (halg=='TILL') THEN
686  CALL set_nb_points_lin(kproc,iprocmin(1),ifull,iindex(:),oshadows)
687  ELSEIF (halg=='TILA') THEN
688  CALL set_nb_points_adj(kproc,ifull,kdim_full,kleft,kright,ktop,kbottom,iindex(:),oshadows)
689  ENDIF
690  !
691  DO jk=1,kdim_full
692  IF ( iindex(jk)> -1 ) kindex(jk) = iindex(jk)
693  ENDDO
694  !
695  ENDIF
696  !
697  ENDDO
698  !
699  ENDDO
700  !
701 ENDIF
702 !
703 IF (lhook) CALL dr_hook('INIT_INDEX_MPI:SET_NB_POINTS_TIL',1,zhook_handle)
704 !
705 END SUBROUTINE set_nb_points_til
706 !
707 !
708 !
709 END SUBROUTINE init_index_mpi
subroutine make_choice_array(HPROGRAM, KNPATCH, ODIM, HRECFM, PWORK, HDIR, KPATCH)
subroutine read_cover_garden(HPROGRAM, OGARDEN, HDIR)
logical lxios
Definition: modd_xios.F90:41
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
Definition: modd_mask.F90:37
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine read_gridtype( HPROGRAM, HGRID, KGRID_PAR, KLU, OREAD, PGRID
integer, parameter jprb
Definition: parkind1.F90:32
character(len=6) cprogname
subroutine get_adjacent_meshes(HGRID, KGRID_PAR, KL, PGRID_PAR, KLEFT,
subroutine ini_csts
Definition: ini_csts.F90:7
subroutine get_sizes_parallel(DTCO, UG, U, KPROC, KSIZE, KPROCMIN, KSIZE_TASK, OSHADOWS)
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:7
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
integer, dimension(:), allocatable nsize_task
logical lhook
Definition: yomhook.F90:15
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
Definition: pgd_grid.F90:7
static int count
Definition: memory_hook.c:21