The TELEMAC-MASCARET system  trunk
partel_para.F
Go to the documentation of this file.
1 ! *******************
2  PROGRAM partel_para
3 ! *******************
4 !
5 !***********************************************************************
6 ! PARALLEL V6P2 20/02/2012
7 !***********************************************************************
8 !
9 !brief PREPROCESSING STEP BEFORE A PARALLEL COMPUTATION
10 !history R. KOPMANN (BAW)
11 !+
12 !+
13 !+ FIRST VERSION JANUARY-MARCH 2000
14 !
15 !history JAJ
16 !+ 12/12/2000
17 !+ SECOND VERSION PINXIT
18 !+ PARTITIONING OF GEOMETRY AND 2D RESULT FILES POSSIBLE
19 
20 !history JAJ
21 !+ 22/02/2002
22 !+ THIRD VERSION
23 !+ ERRORS IN BC VALUES IN DECOMPOSED BC FILES REMOVED
24 !+ ERRONEOUS TREATMENT OF ISLANDS DEBUGGED
25 !
26 !history J-M HERVOUET ; JAJ
27 !+ 17/04/2002
28 !+ FOURTH VERSION
29 !+ PARTITIONING FOR 3D RESULT FILES DONE BY JMH
30 !+ INCLUDING BOTH PARTITIONING METHODS AND BEAUTIFYING BY JAJ
31 !
32 !history J-M HERVOUET
33 !+ 21/01/2003
34 !+ FIFTH VERSION
35 !+ CORRECTED A WRONG DIMENSION OF THE ARRAY CUT, AN ERROR
36 !+ OCCURING BY A LARGER NUMBER OF PROCESSORS
37 !
38 !history JAJ; MATTHIEU GONZALES DE LINARES
39 !+ 27/01/2003
40 !+ SIXTH VERSION
41 !+ CORRECTED A WRONG DIMENSION OF THE ARRAY ALLVAR
42 !
43 !history J-M HERVOUET
44 !+ 12/03/2003
45 !+ SEVENTH VERSION
46 !+ ALGORITHM CHANGED : A SEGMENT IS IN A SUBDOMAIN IF IT BELONGS
47 !+ TO AN ELEMENT IN THE SUBDOMAIN NOT IF THE 2 POINTS OF THE
48 !+ SEGMENT BELONG TO THE SUBDOMAIN.
49 !+ SPECIFIC ELEBD INCLUDED, ALL REFERENCE TO MPI OR BIEF REMOVED
50 !
51 !history J-M HERVOUET
52 !+ 01/09/2003
53 !+ EIGHTH VERSION
54 !+ UBOR AND VBOR INVERTED LINE 613 WHEN READING THE CLI FILE.
55 !
56 !history C. MOULINEC, P. VEZOLLE, O. BOITEAU
57 !+
58 !+ NEXT VERSION
59 !+ SOME CHANGES
60 !
61 !history C. DENIS (EDF-SINETICS)
62 !+ 31/05/2010
63 !+ V6P2
64 !+ FURTHER DEVELOPPED IN ORDER TO DECREASE THE AMOOUT OF MEMORY
65 !
66 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
67 !+ 21/02/2012
68 !+ V6P2
69 !+ Creation of DOXYGEN tags for automated documentation and
70 !+ cross-referencing of the FORTRAN sources
71 !
72 !history J-M HERVOUET
73 !+ 27/03/2014
74 !+ Arguments added to the call elebd.
75 !+ Note that all the history before this is wrong...
76 !
77 !history J,RIEHME (ADJOINTWARE)
78 !+ November 2016
79 !+ V7P2
80 !+ Replaced EXTERNAL statements to parallel functions / subroutines
81 !+ by the INTERFACE_PARALLEL
82 !
83 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
84 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
85 !
88  USE bief, ONLY : bief_ncsize => ncsize, nbmaxnshare, ipid, front2
90  IMPLICIT NONE
91 !
92  ! MAX PARTITION NUMBER [00000..99999]
93  INTEGER, PARAMETER :: maxnproc = 100000
94  ! MAX ADDED SUFFIX LENGTH
95  INTEGER, PARAMETER :: maxaddch = 10
96  ! MAX NUMBER OF VARIABLES
97  INTEGER, PARAMETER :: maxvar = 100
98  ! MAXVAR*32 FOR ALLVAR
99  INTEGER, PARAMETER :: maxallvarlength = 3200
100 !
101  INTEGER pmethod
102  INTEGER nvar, nplan, nptfr, nptir, nptfrmax
103  INTEGER nelem, npoin, ndp, nelem2, npoin2, ndum
104  INTEGER ib(10)
105 !
106  INTEGER, ALLOCATABLE :: ikles(:), ikles_p(:)
107  INTEGER, ALLOCATABLE :: ikles3d(:),ikles3d_p(:,:,:)
108  INTEGER, ALLOCATABLE :: irand(:), irand_p(:)
109  INTEGER, ALLOCATABLE :: lihbor(:), liubor(:), livbor(:)
110  INTEGER, ALLOCATABLE :: litbor(:)
111  INTEGER :: npoin_p, nelem_p , nptfr_p,nptir_p
112  INTEGER, ALLOCATABLE :: nbor(:), nbor_p(:)
113  INTEGER, ALLOCATABLE :: numliq(:)
114  INTEGER, ALLOCATABLE :: knolg(:), knogl(:),check(:)
115  INTEGER, ALLOCATABLE :: elelg(:)
116  INTEGER, ALLOCATABLE :: cut(:), cut_p(:), sort(:)
117  INTEGER, ALLOCATABLE :: part_p(:,:)
118 !
119  REAL, ALLOCATABLE :: f(:,:), f_p(:,:)
120  REAL, ALLOCATABLE :: hbor(:)
121  REAL, ALLOCATABLE :: ubor(:), vbor(:), aubor(:)
122  REAL, ALLOCATABLE :: tbor(:), atbor(:), btbor(:)
123 !
124  REAL times
125 !
126  INTEGER :: ninp, ncli, nout, nclm
127  INTEGER time(3), date(3)
128 !
129  CHARACTER(LEN=80) :: title
130  CHARACTER(LEN=32) :: vari, variable(maxvar)
131  CHARACTER(LEN=PATH_LEN) :: nameinp, namecli, nameout, nameclm
132  CHARACTER(LEN=15) :: fmt4
133 !
134  INTEGER max_n_neigh
135  INTEGER i, j, k, l , m, err, iso
136  INTEGER istop, istart, iseg, iloop
137  INTEGER i_len, i_s, i_sp, i_lencli, i_leninp
138 !
139  REAL xseg, yseg
140  LOGICAL is, timecount
141 !
142 ! METISOLOGY
143 !
144  INTEGER nparts
145  INTEGER, ALLOCATABLE :: epart(:), npart(:)
146 !
147 ! FOR CALLING FRONT2
148 !
149  ! MAX NUMBER OF BOUNDARIES
150  INTEGER, PARAMETER :: maxfro = 3000
151  INTEGER nfrliq, nfrsol, debliq(maxfro), finliq(maxfro)
152  INTEGER debsol(maxfro), finsol(maxfro)
153  INTEGER, ALLOCATABLE :: dejavu(:), kp1bor(:,:)
154  INTEGER, ALLOCATABLE :: nachb(:,:)
155  DOUBLE PRECISION, ALLOCATABLE :: x_d(:), y_d(:)
156 !
157 ! FOR CALLING BIEF MESH SUBROUTINES (TO BE OPTIMISED SOON):
158 !
159  INTEGER, ALLOCATABLE :: ifabor(:,:), ifanum(:,:), nelbor(:)
160  INTEGER, ALLOCATABLE :: nulone(:,:)
161  INTEGER, ALLOCATABLE :: ikle(:,:), iklbor(:,:), isegf(:)
162  INTEGER, ALLOCATABLE :: it1(:), it2(:), it3(:)
163 !
164 ! TIME MEASURING
165 !
166  INTEGER tdebp, tfinp, temps, parsec
167 ! EXTENS
168  CHARACTER(LEN=11) :: extens
169 ! TENTATIVELY CALLING ONLY FOR SERAFIN ? VERIFY
170  CHARACTER(LEN=8),PARAMETER :: fformat='SERAFIN '
171  EXTERNAL extens
172 !
173 !----------------------------------------------------------------------
174 !
175 ! JAJ NEW FOR PARALLEL CHARACTERISTICS ////
176 ! HALO ELEMENTS: THESE ADJACENT TO THE INTERFACE EDGES HAVING
177 ! NEIGHBOURS BEHIND A BOUNDARY
178 !
179 ! THE ELEMENTAL GLOBAL->LOCAL NUMBERING TRANSLATION TABLE
180 ! THIS IS ELEGL SAVED FROM ALL PARTITIONS FOR FURTHER USE
181 !
182  DOUBLE PRECISION :: starttime,endtime,startiotime,startctime
183  INTEGER, ALLOCATABLE :: gelegl(:),gelegl1(:)
184 !
185  ! THE HALO ELEMENTS NEIGHBOURHOOD DESCRIPTION FOR A HALO CELL
186  INTEGER, ALLOCATABLE :: ifapar(:,:)
187 !
188  ! THE NUMBER OF HALO CELLS PRO PARTITION
189  INTEGER :: nhalo
190 !
191  ! WORK VARIABLES
192  INTEGER ifaloc(3)
193  INTEGER ndp_2d,nb_inter_glob,compt
194  INTEGER ef
195  INTEGER, ALLOCATABLE :: nbre_ef(:),nbre_ef_loc(:),ef_i(:),
196  & tab_tmp(:),ef_ii(:),global_inter_node_reord(:)
197  INTEGER, ALLOCATABLE :: part_p_tmp1(:),part_p_tmp2(:)
198  LOGICAL halo
199  INTEGER noeud,nbre_noeud_interne
200  INTEGER nbre_ef_i,ier,nbre_nptir
201  LOGICAL interface
202 !
203 ! FOR SCOTCH
204 !
205  CHARACTER(LEN=MAXLENTMPDIR) :: path
206  INTEGER :: ncar, ncsize
207  INTEGER :: id_input
208  ndp_2d=3
209  CALL p_init(path, ncar, ipid, ncsize)
210 !
211 !----------------------------------------------------------------------
212 !
213  timecount = .true.
214  IF (parsec==0) timecount = .false. ! COUNT_RATE == 0 : NO CLOCK
215 !
216  lng=2 ! ENGLISH PLEASE
217  lu=6 ! FORTRAN STANDARD OUPUT CHANNEL
218 !
219 !----------------------------------------------------------------------
220 ! INTRODUCE YOURSELF
221 !
222  IF (ipid .EQ. 0) THEN
223 !
224  WRITE(lu,*) ' '
225  WRITE(lu,*) '+----------------------------------------------+'
226  WRITE(lu,*) ' '
227  WRITE(lu,*) ' PARTEL //'
228  WRITE(lu,*) ' PARALLEL VERSION DEVELOPPED BY'
229  WRITE(lu,*) ' CHRISTOPHE DENIS (SINETICS)'
230  WRITE(lu,*) ' '
231  WRITE(lu,*) ' PARTEL'
232  WRITE(lu,*) ' BUNDESANSTALT FUER WASSERBAU, KARLSRUHE'
233  WRITE(lu,*) ' '
234  WRITE(lu,*) ' METIS 5.0.2'
235  WRITE(lu,*) ' REGENTS OF THE UNIVERSITY OF MINNESOTA'
236  WRITE(lu,*) ' '
237  WRITE(lu,*) '+----------------------------------------------+'
238 !
239  END IF
240 !
241 !----------------------------------------------------------------------
242 ! NAMES OF THE INPUT FILES:
243 !
244  INQUIRE (file='PARTEL.PAR',exist=is)
245  IF( .NOT.is ) THEN
246  WRITE (lu,'('' FILE DOES NOT EXIST: '',A30)') 'PARTEL.PAR'
247  CALL plante(1)
248  stop
249  END IF
250 !
251  CALL get_free_id(id_input)
252  OPEN(unit=id_input,file='partel.par')
253  READ(id_input,*) nameinp
254  READ(id_input,*) namecli
255  READ(id_input,*) nparts
256  READ(id_input,*) pmethod
257  ! SI PMETHOD = 3 or 4 ON NE DECOUPE PAS AVEC METIS ON LIT UN FICHIER
258  ! RESULT_SEQ_METIS CREE PAR PARTEL_PRELIM (OU AUTRE !!)
259  ! SINON ON DECOUPE AVEC METIS
260  CLOSE(id_input)
261 !
262  IF (pmethod .EQ. 3) THEN
263  WRITE(lu,*) ' '
264  WRITE(lu,*) 'PARTITIONING USING PARMETIS'
265  WRITE(lu,*) ' '
266  ELSEIF (pmethod .EQ. 4) THEN
267  WRITE(lu,*) ' '
268  WRITE(lu,*) 'PARTITIONING USING PTSCOTCH'
269  WRITE(lu,*) ' '
270  ENDIF
271 !
272  INQUIRE (file=nameinp,exist=is)
273  IF( .NOT.is ) THEN
274  WRITE (lu,'('' FILE DOES NOT EXIST: '',A30)') nameinp
275  CALL plante(1)
276  stop
277  END IF
278 !
279  INQUIRE (file=namecli,exist=is)
280  IF (.NOT.is) THEN
281  WRITE (lu,'('' FILE DOES NOT EXIST: '',A30)') namecli
282  CALL plante(1)
283  stop
284  END IF
285 !
286  i_s = len(nameinp)
287  i_sp = i_s + 1
288  DO i=1,i_s
289  IF (nameinp(i_sp-i:i_sp-i) .NE. ' ') EXIT
290  ENDDO
291  i_len=i_sp - i
292  i_leninp = i_len
293 !
294  IF (i_leninp > path_len) THEN
295  WRITE(lu,*) ' '
296  WRITE(lu,*) 'ATTENTION:'
297  WRITE(lu,*) 'THE NAME OF THE INPUT FILE:'
298  WRITE(lu,*) nameinp
299  WRITE(lu,*) 'IS LONGER THAN ',path_len,' CHARACTERS'
300  WRITE(lu,*) 'WHICH IS THE LONGEST APPLICABLE NAME FOR TELEMAC'
301  WRITE(lu,*) 'INPUT AND OUTPUT FILES. STOPPED. '
302  CALL plante(1)
303  stop
304  ENDIF
305 !
306  IF (ipid .EQ. 0) THEN
307  starttime=p_time()
308  END IF
309  CALL get_free_id(ninp)
310  OPEN(ninp,file=nameinp,status='OLD',form='UNFORMATTED')
311  rewind ninp
312 
313  READ (ninp) title
314  READ (ninp) i, j
315  nvar = i + j
316  istart = 42
317  DO i=1,nvar
318  READ(ninp) vari
319  variable(i) = vari
320  DO j=1,32
321  IF(vari(j:j).EQ.' ') vari(j:j) = '-'
322  END DO
323  istop = istart+20
324  IF (istop.GT.maxallvarlength) THEN
325  WRITE(lu,*) 'VARIABLE NAMES TOO LONG FOR STRING ALLVAR'
326  WRITE(lu,*) 'STOPPED.'
327  CALL plante(1)
328  stop
329  ENDIF
330  istart=istop+1
331  ENDDO
332 !
333 ! READ THE REST OF THE SELAFIN FILE
334 ! 10 INTEGERS, THE FIRST IS THE NUMBER OF RECORDS (TIMESTEPS)
335 !
336  READ (ninp) (ib(i), i=1,10)
337  IF (ib(8).NE.0.OR.ib(9).NE.0) THEN
338  WRITE(lu,*) 'THIS IS A PARTIAL OUTPUT FILE'
339  WRITE(lu,*) 'MAYBE MEET GRETEL BEFORE...'
340  ENDIF
341  nplan = ib(7)
342 !
343  IF (ib(10).EQ.1) THEN
344  READ(ninp) date(1), date(2), date(3), time(1), time(2), time(3)
345  ENDIF
346 !
347  READ (ninp) nelem,npoin,ndp,ndum
348  IF (nplan.GT.1) THEN
349 !
350  npoin2 = npoin/nplan
351  nelem2 = nelem/(nplan-1)
352  IF (mod(npoin,nplan).NE.0) THEN
353  WRITE (lu,*) 'BUT NPOIN2 /= NPOIN3/NPLAN!'
354  CALL plante(1)
355  stop
356  ENDIF
357  IF (mod(nelem,(nplan-1)).NE.0) THEN
358  WRITE (lu,*) 'BUT NELEM2 /= NELEM3/NPLAN!'
359  CALL plante(1)
360  stop
361  ENDIF
362  ELSE
363 !
364  npoin2 = npoin
365  nelem2 = nelem
366  ENDIF
367 !
368  IF (ndp.EQ.3) THEN
369  WRITE(lu,*) 'THE INPUT FILE ASSUMED TO BE 2D SELAFIN'
370  ELSEIF (ndp.EQ.6) THEN
371  WRITE(lu,*) 'THE INPUT FILE ASSUMED TO BE 3D SELAFIN'
372  ELSE
373 ! WRITE(LU,*) 'THE ELEMENTS ARE NEITHER TRIANGLES NOR PRISMS!'
374 ! WRITE(LU,*) 'NDP = ',NDP
375  CALL plante(1)
376  stop
377  ENDIF
378 !
379 ! NOW LET US ALLOCATE
380 !
381  ALLOCATE (ikles(nelem2*3),stat=err)
382  CALL check_allocate(err, 'IKLES')
383  IF(nplan.GT.1) THEN
384  ALLOCATE (ikles3d(nelem*ndp),stat=err)
385  CALL check_allocate(err, 'IKLES3D')
386  ENDIF
387  ALLOCATE (irand(npoin),stat=err)
388  CALL check_allocate(err, 'IRAND')
389  ! NVAR+2 : FIRST TWO FUNCTIONS ARE X AND Y
390  ! NPOIN IS 3D HERE IN 3D
391  ALLOCATE (f(npoin,nvar+2),stat=err)
392  CALL check_allocate(err, 'IRAND')
393 !
394 ! CONNECTIVITY TABLE:
395 !
396  IF(nplan.EQ.0) THEN
397  READ(ninp) ((ikles((k-1)*ndp+j),j=1,ndp),k=1,nelem)
398  ELSE
399  READ(ninp) ((ikles3d((k-1)*ndp+j),j=1,ndp),k=1,nelem)
400 ! BUILDING IKLES
401  DO j=1,3
402  DO k=1,nelem2
403  ikles((k-1)*3+j)=ikles3d((k-1)*6+j)
404  ENDDO
405  ENDDO
406  ENDIF
407 !
408 ! BOUNDARY NODES INDICATIONS
409 !
410  READ(ninp) (irand(j),j=1,npoin)
411 !
412 !
413  READ(ninp) (f(j,1),j=1,npoin)
414  READ(ninp) (f(j,2),j=1,npoin)
415 !
416  iloop = 0
417 ! DO
418 !
419 ! READ THE TIME STEP
420 !
421  READ(ninp) times
422 ! WRITE(NINPFORMAT,*) TIMES
423  iloop = iloop + 1
424 !
425 !
426 ! READ THE TIME VARIABLES; NO 1 AND 2 ARE X,Y
427 !
428  DO k=3,nvar+2
429 ! WRITE(LU,*) 'NOW READING VARIABLE',K-2
430  READ(ninp) (f(j,k), j=1,npoin)
431 ! WRITE(NINPFORMAT,*) (F(J,K), J=1,NPOIN)
432 ! WRITE(LU,*) 'READING VARIABLE',K-2,' SUCCESSFUL'
433  END DO
434 ! END DO
435  CLOSE (ninp)
436  CALL p_sync()
437  IF (ipid .EQ. 0) THEN
438  startctime=p_time()
439  WRITE(lu,*) 'TEMPS LECTURE :',startctime-starttime
440  END IF
441 
442 !
443 !----------------------------------------------------------------------
444 ! READ THE BOUNDARY CONDITIONS FILE
445 !
446 ! BUT ALLOCATE FIRST
447 !
448  nptfrmax = npoin2 ! BETTER IDEA ?
449 !
450  ALLOCATE (lihbor(nptfrmax),stat=err)
451  CALL check_allocate(err, 'LIHBOR')
452  ALLOCATE (liubor(nptfrmax),stat=err)
453  CALL check_allocate(err, 'LIUBOR')
454  ALLOCATE (livbor(nptfrmax),stat=err)
455  CALL check_allocate(err, 'LIVBOR')
456  ALLOCATE (hbor(nptfrmax),stat=err)
457  CALL check_allocate(err, 'HBOR')
458  ALLOCATE (ubor(nptfrmax),stat=err)
459  CALL check_allocate(err, 'UBOR')
460  ALLOCATE (vbor(nptfrmax),stat=err)
461  CALL check_allocate(err, 'VBOR')
462  ALLOCATE (aubor(nptfrmax),stat=err)
463  CALL check_allocate(err, 'AUBOR')
464  ALLOCATE (tbor(nptfrmax),stat=err)
465  CALL check_allocate(err, 'TBOR')
466  ALLOCATE (atbor(nptfrmax),stat=err)
467  CALL check_allocate(err, 'ATBOR')
468  ALLOCATE (btbor(nptfrmax),stat=err)
469  CALL check_allocate(err, 'BTBOR')
470  ALLOCATE (litbor(nptfrmax),stat=err)
471  CALL check_allocate(err, 'LITBOR')
472  ALLOCATE (nbor(nptfrmax),stat=err)
473  CALL check_allocate(err, 'NBOR')
474  ALLOCATE (numliq(nptfrmax),stat=err)
475  CALL check_allocate(err, 'NUMLIQ')
476  ALLOCATE (check(nptfrmax),stat=err)
477  CALL check_allocate(err, 'CHECK')
478 !
479 ! CORE NAME LENGTH
480 !
481  i_s = len(namecli)
482  i_sp = i_s + 1
483  DO i=1,i_s
484  IF (namecli(i_sp-i:i_sp-i) .NE. ' ') EXIT
485  ENDDO
486  i_len=i_sp - i
487  i_lencli = i_len
488 !
489  IF (i_leninp > path_len) THEN
490  WRITE(lu,*) ' '
491  WRITE(lu,*) 'ATTENTION:'
492  WRITE(lu,*) 'THE NAME OF THE BOUNDARY CONDITIONS FILE:'
493  WRITE(lu,*) namecli
494  WRITE(lu,*) 'IS LONGER THAN ',path_len,' CHARACTERS'
495  WRITE(lu,*) 'WHICH IS THE LONGEST APPLICABLE NAME FOR TELEMAC '
496  WRITE(lu,*) 'INPUT AND OUTPUT FILES. STOPPED. '
497  CALL plante(1)
498  stop
499  ENDIF
500 !
501  CALL get_free_id(ncli)
502  OPEN(ncli,file=namecli,status='OLD',form='FORMATTED')
503  rewind ncli
504 !
505 ! READING BOUNDARY FILE AND COUNTING BOUNDARY POINTS
506 !
507  k=1
508  900 CONTINUE
509  READ(ncli,*,end=901,err=901) lihbor(k),liubor(k),
510  & livbor(k),
511  & hbor(k),ubor(k),vbor(k),aubor(k),litbor(k),
512  & tbor(k),atbor(k),btbor(k),nbor(k),check(k)
513 !
514 ! NOW CHECK IS THE BOUNDARY NODE COLOUR
515 ! IF(CHECK(K).NE.K) THEN
516 ! WRITE(LU,*) 'ERROR IN BOUNDARY CONDITIONS FILE AT LINE ',K
517 ! CALL PLANTE(1)
518 ! STOP
519 ! ENDIF
520  k=k+1
521  GOTO 900
522  901 CONTINUE
523  nptfr = k-1
524 ! WRITE (LU,*) ' '
525 ! WRITE (LU,*) 'NUMBER OF BOUNDARY NODES IN 2D MESH: ',NPTFR
526 ! WRITE (LU,*) ' '
527  CLOSE(ncli)
528 !
529 !----------------------------------------------------------------------
530 ! NUMBERING OF OPEN BOUNDARIES
531 ! NUMBERING OF LIQUID BOUNDARY, IF 0 = SOLID
532 ! OPN: NUMBER OF OPEN BOUNDARY
533 ! IN ORDER TO DO IT IN THE SAME WAY AS TELEMAC DOES,
534 ! IT IS BEST TO CALL FRONT2 HERE
535 !
536 ! FOR CALLING BIEF MESH SUBROUTINES
537 ! CAN BE OPTIMISED / USES A LOT OF MEMORY
538 ! THE ONLY REASON IS TO OBTAIN KP1BOR AND NUMLIQ
539 !
540  ALLOCATE (dejavu(nptfr),stat=err)
541  CALL check_allocate(err, 'DEJAVU')
542  ALLOCATE (kp1bor(nptfr,2),stat=err)
543  CALL check_allocate(err, 'KP1BOR')
544 !JAJ----------V ////
545 ! CHANGED NELEM TO NELEM2, NDP TO 3 HUH!
546 ! CAUSING ERRORS WHEN 3D RESTART/REFERENCE FILES ARE PARTITIONED
547 ! AND BC FILE IS WRITTEN AGAIN (WHAT FOR, ACTUALLY???)
548 ! CAUSE: CALLING VOISIN WITH NELEM2 BUT IFABOR(NELEM=NELEM3,NDP=6)
549  ALLOCATE (ifabor(nelem2,3),stat=err)
550  CALL check_allocate(err, 'IFABOR')
551  ALLOCATE (ifanum(nelem2,3),stat=err)
552  CALL check_allocate(err, 'IFANUM')
553  ALLOCATE (iklbor(nptfr,2),stat=err)
554  CALL check_allocate(err, 'IKLBOR')
555  ALLOCATE (nelbor(nptfr),stat=err)
556  CALL check_allocate(err, 'NELBOR')
557  ALLOCATE (nulone(nptfr,2),stat=err)
558  CALL check_allocate(err, 'NULONE')
559  ALLOCATE (isegf(nptfr),stat=err)
560  CALL check_allocate(err, 'ISEGF')
561  ALLOCATE (ikle(nelem2,3),stat=err)
562  CALL check_allocate(err, 'IKLE')
563  ALLOCATE (it1(npoin),stat=err)
564  CALL check_allocate(err, 'IT1')
565  ALLOCATE (it2(npoin),stat=err)
566  CALL check_allocate(err, 'IT2')
567  ALLOCATE (it3(npoin),stat=err)
568  CALL check_allocate(err, 'IT3')
569  nptir = 1
570  ALLOCATE (nachb(nbmaxnshare,nptir),stat=err)
571  CALL check_allocate(err, 'NACHB')
572  ALLOCATE (x_d(npoin2),stat=err)
573  CALL check_allocate(err, 'X_D')
574  ALLOCATE (y_d(npoin2),stat=err)
575  CALL check_allocate(err, 'Y_D')
576 !
577 ! TRANSFORM IKLES--> IKLE FOR 2D ROUTINES (AN OLD TELEMAC DISEASE)
578 !
579  DO i = 1,3
580  DO j = 1,nelem2
581  ikle(j,i) = ikles((j-1)*3+i)
582  ENDDO
583  ENDDO
584 !
585 ! Forcong voisn elebd and front2 to run on serila mode
586  bief_ncsize = 1
587  CALL voisin(ifabor, nelem2, nelem2, 11, ikle, nelem2,
588  & npoin2, nachb, nbor, nptfr, it1, it2)
589 !
590 ! WRITE(LU,'(/,'' CALLING ELEBD'')')
591 !
592  CALL elebd (nelbor, nulone, kp1bor, ifabor, nbor(1:nptfr), ikle,
593  & nelem2, iklbor, nelem2, nelem2,
594  & npoin2, nptfr, 11, lihbor, 2,
595  & isegf, it1, it2, it3 ,
596  & nptfr ,nptfr)
597 ! NELEBX,NELEB (EQUAL NPTFR HERE)
598 !
599 ! WRITE(LU,'(/,'' BOUNDARY TYPE NUMBERING USING FRONT2'')')
600 !
601  nfrliq = 0
602  nfrsol = 0
603  debsol(:) = 0
604  finsol(:) = 0
605  debliq(:) = 0
606  finliq(:) = 0
607  DO i=1,npoin2
608  x_d(i) = dble(f(i,1))
609  y_d(i) = dble(f(i,2))
610  ENDDO
611  CALL front2 (nfrliq,
612  & lihbor,liubor,x_d,y_d,
613  & nbor,kp1bor(1:nptfr,1),dejavu,npoin2,nptfr,
614  & 2,.false.,numliq,maxfro)
615 !
616  DEALLOCATE (dejavu)
617  DEALLOCATE (nachb)
618  DEALLOCATE (x_d)
619  DEALLOCATE (y_d)
620 !JAJ //// IFABOR APPLIED LATER FOR FINDING HALO CELL NEIGHBOURHOODS
621 !!!! DEALLOCATE (IFABOR)
622  DEALLOCATE (ifanum)
623  DEALLOCATE (iklbor)
624 ! DEALLOCATE (NELBOR)
625  DEALLOCATE (nulone)
626  DEALLOCATE (isegf)
627  DEALLOCATE (ikle)
628  DEALLOCATE (it1)
629  DEALLOCATE (it2)
630  DEALLOCATE (it3)
631 !
632 !======================================================================
633 ! STEP 2 : PARTITIONING THE MESH
634 !
635 ! OTHER PARTITIONING METHODS SHOULD BE USED (SCOTCH FOR EXAMPLE)
636 ! ALL PROCESSORS PERFORM THIS TASK TO AVOID COMMUNICATION
637 ! THE USE OF PARMETIS OR PTSCOTCH COULD BE USED FOR LARGER MESHES
638 ! IF THERE WILL BE SOME MEMORY ALLOCATION PROBLEM
639 !======================================================================
640 !
641 ! NEW METIS INTERFACE (>= VERSION 5) :
642 !
643 ! EPTR, EIND: THESE ARRAYS SPECIFIES CONTAINS
644 ! IKLES IN CSR FORMAT
645 !
646  ALLOCATE (epart(nelem2),stat=err)
647  CALL check_allocate(err, 'EPART')
648  ALLOCATE (npart(npoin2),stat=err)
649  CALL check_allocate(err, 'NPART')
650 !
651  ! If metis was run previously just read the results
652  IF (pmethod.NE.3 .AND. pmethod.NE.4) THEN
653  OPEN(id_input,file='RESULT_SEQ_METIS')
654  DO i=1,nelem2
655  READ(id_input,*) epart(i)
656  END DO
657  CLOSE(id_input)
658  ELSE
659 !
660 ! Choosing partitionning method
661 ! 1 : METIS IF PARMETIS NOT INSTALLED PARMETIS OTHERWISE
662 ! 2 : PT SCOTCH
663 !
664  WRITE(lu,*) ' THE MESH PARTITIONING STEP STARTS'
665  IF (timecount) THEN
666  CALL system_clock (count=temps, count_rate=parsec)
667  tdebp = temps
668  ENDIF
669  CALL partitioner_para(pmethod, nelem2, npoin2, ndp, nparts,
670  & ikles, epart, npart)
671  WRITE(lu,*) ' THE MESH PARTITIONING STEP HAS FINISHED'
672  IF (timecount) THEN
673  CALL system_clock (count=temps, count_rate=parsec)
674  tfinp = temps
675  WRITE(lu,*) ' RUNTIME OF PARTITIONER ',
676  & (1.0*(tfinp-tdebp))/(1.0*parsec),' SECONDS'
677  ENDIF
678  ENDIF
679 !
680 
681 !======================================================================
682 ! STEP 3 : ALLOCATE THE GLOBAL ARRAYS NOT DEPENDING OF THE PARTITION
683 !
684 !======================================================================
685 !
686 ! KNOGL(I) => GLOBAL LABEL OF THE LOCAL POINT I
687  ALLOCATE (knogl(npoin2),stat=err)
688  CALL check_allocate(err, 'KNOGL')
689  knogl(:)=0
690 
691 ! NBRE_EF(I) => NUMBER OF FINITE ELEMENT CONTAINING I
692 ! I IS A GLOBAL LABEL
693  ALLOCATE (nbre_ef(npoin2),stat=err)
694  CALL check_allocate(err, 'NBRE_EF')
695 !
696  IF(nplan.EQ.0) THEN
697  ALLOCATE (f_p(npoin2,nvar+2),stat=err)
698  ELSE
699  ALLOCATE (f_p(npoin2*nplan,nvar+2),stat=err)
700  ENDIF
701  CALL check_allocate(err, 'F_P')
702 !
703  ALLOCATE (gelegl(nelem2),stat=err)
704  CALL check_allocate(err, 'GELEGL')
705  ALLOCATE (gelegl1(nelem2),stat=err)
706  CALL check_allocate(err, 'GELEGL1')
707 !
708  ALLOCATE (sort(npoin2),stat=err)
709  CALL check_allocate(err, 'CUT_P')
710 !
711  ALLOCATE (cut(npoin2),stat=err)
712  CALL check_allocate(err, 'CUT_P')
713  sort=0
714 !
715  ALLOCATE(nbor_p(npoin2),stat=err)
716  ALLOCATE(tab_tmp( nbmaxnshare),stat=err)
717 !
718 !======================================================================
719 ! STEP 4 : COMPUTE THE NUMBER OF FINITE ELEMENTS AND POINTS
720 ! BELONGING TO SUBMESH I
721 !
722 !======================================================================
723 !
724 ! FIRSTLY, ALL MPI PROCESSES WORK ON THE WHOLE MESH
725 ! ----------------------------------------------
726 !
727 ! LOOP OVER THE FINITE ELEMENT OF THE MESH
728 ! TO COMPUTE THE NUMBER OF FINITE ELEMENTS CONTAINING EACH POINT NOEUD
729  nbre_ef(:)=0
730  DO ef=1,nelem2
731  DO k=1,ndp_2d
732  noeud=ikles((ef-1)*3+k)
733  nbre_ef(noeud)=nbre_ef(noeud)+1
734  END DO
735  END DO
736 !
737 ! THE PROCESS MPI IPID WORK ON THE SUBMESH IPID+1
738  i=ipid+1
739 !
740 ! LOOP OVER THE FINITE ELEMENTD OF THE MESH TO COMPUTE
741 ! THE NUMBER OF THE FINITE ELEMENT AND POINTS BELONGING
742 ! TO SUBMESH I
743 !
744  nelem_p=0
745  npoin_p=0
746  DO ef=1,nelem2
747  IF (epart(ef) .EQ. i) THEN
748  nelem_p=nelem_p+1
749  DO k=1,ndp_2d
750  noeud=ikles((ef-1)*3+k)
751  IF (knogl(noeud) .EQ. 0) THEN
752  npoin_p=npoin_p+1
753  knogl(noeud)=npoin_p
754  END IF
755  END DO
756  END IF
757  END DO
758 !
759 !======================================================================
760 ! STEP 4 : ALLOCATION OF LOCAL ARRAYS NEEDED BY MPI PROCESSUS IPID
761 ! WORKING ON SUBMESH IPID+1
762 !======================================================================
763 !
764 ! ELEGL(E) => GLOBAL LABEL OF THE FINITE ELEMENT E
765 ! E IS THE LOCAL LABEL ON SUBMESH I
766  ALLOCATE (elelg(nelem_p),stat=err)
767  CALL check_allocate(err, 'ELELG')
768  elelg(:)=0
769 ! KNOLG(I) => GLOBAL LABEL OF THE POINT I
770 ! I IS THE LOCAL LABEL ON SUBDOMAIN I
771  IF(nplan.EQ.0) THEN
772  ALLOCATE (knolg(npoin_p),stat=err)
773  ELSE
774  ALLOCATE (knolg(npoin_p*nplan),stat=err)
775  ENDIF
776  CALL check_allocate(err, 'KNOLG')
777  knolg(:)=0
778 ! NBRE_EF_LOC(I) : NUMBER OF FINITE ELEMENTS CONTAINING THE POINT I
779 ! ON SUBMESH I
780 ! I IS THE LOCAL LABEL ON SUBMESH I
781  ALLOCATE (nbre_ef_loc(npoin_p),stat=err)
782  CALL check_allocate(err, 'NBRE_EF_LOC')
783 !
784 ! EF_I(E) IS THE GLOBAL LABEL OF THE INTERFACE FINITE ELEMENT NUMBER E
785  ALLOCATE (ef_i(nelem_p),stat=err)
786  CALL check_allocate(err, 'EF_I')
787 ! EF_II(E) IS THE LOCAL LABEL OF THE INTERFACE FINITE ELEMENT NUMBER E
788  ALLOCATE (ef_ii(nelem_p),stat=err)
789  CALL check_allocate(err, 'EF_II')
790 !
791 !======================================================================
792 ! STEP 5 : INITIALISATION OF LOCAL ARRAYS
793 ! (GELELG AND ELELG, NBRE_EF_LOC)
794 !
795 !======================================================================
796 !
797  nelem_p=0
798  gelegl(:)=0
799  DO ef=1,nelem2
800  IF (epart(ef) .EQ. i) THEN
801  nelem_p=nelem_p+1
802  elelg(nelem_p)=ef
803  gelegl(ef)=nelem_p
804  END IF
805  END DO
806  CALL p_isum_array(gelegl,gelegl1,nelem2,ier)
807  DEALLOCATE(gelegl)
808  DEALLOCATE(npart)
809  nptfr_p=0
810  DO j=1,npoin_p
811  nbre_ef_loc(j)=0
812  END DO
813 !
814 !======================================================================
815 ! STEP 5 : COMPUTE THE NUMBER OF BOUNDARY AND INTERFACE POINTS
816 ! INITIALISATION OF NBRE_EF_LOC AND F_P
817 !
818 !======================================================================
819 !
820  npoin_p=0
821  nbre_noeud_interne=0
822 !
823  DO j=1,nelem_p
824  ef=elelg(j)
825  DO k=1,3
826  noeud=ikles((ef-1)*3+k)
827  nbre_ef_loc(knogl(noeud))=nbre_ef_loc(knogl(noeud))+1
828  IF (nbre_ef_loc(knogl(noeud)) .EQ. 1) THEN
829 ! THE POINT NOEUD IS ENCOUNTERED FOR THE FIRST TIME
830  npoin_p=npoin_p+1
831 ! IS NOEUD A BOUNDARY POINT ?
832  IF (irand(noeud) .NE. 0) THEN
833  nptfr_p= nptfr_p+1
834  END IF
835 ! MODIFICATION OF KNOGL ET F_P
836  knolg(npoin_p)=noeud
837  DO l=1,nvar+2
838  f_p(npoin_p,l)=f(noeud,l)
839  END DO
840  END IF
841 !
842 ! NOEUD IS A INTERNAL POINT IF ALL FINITE ELEMENTS
843 ! CONTAINING IT BELONGS TO THE SAME SUBMESH
844  IF (nbre_ef_loc(knogl(noeud)) .EQ. nbre_ef(noeud)) THEN
845  nbre_noeud_interne=nbre_noeud_interne+1
846  END IF
847  END DO
848  END DO
849 !
850 !======================================================================
851 ! STEP 5 : FIND THE INTERFACES POINTS AND THE INTERFACE FINITE
852 ! ELEMENTS OF SUBMESH I
853 !======================================================================
854 !
855 ! COMPUTE THE NUMBER OF INTERFACES POINTS TO ALLOCATE CORRECLY CUT_P
856  nbre_nptir=npoin_p-nbre_noeud_interne
857  ALLOCATE (cut_p(nbre_nptir),stat=err)
858  CALL check_allocate(err, 'CUT_P')
859  nbre_ef_i=0 ! THE NUMBER OF INTERFACE FINITE ELEMENT IS SET TO 0
860  nptir_p=0 !THE NUMBER OF INTERFACE POINTS IS SET TO 0
861 ! LOOP ON THE FINITE ELEMENT BELONGING TO SUBMESH I
862  DO j=1,nelem_p
863  interface=.false.
864  ef=elelg(j) ! GLOBAL LABEL OF THE FINITE ELEMENT
865  DO k=1,ndp_2d ! LOOP ON THE NODES CONTAINED IN EF
866  noeud=ikles((ef-1)*3+k)
867  IF (abs(nbre_ef_loc(knogl(noeud))) .NE. nbre_ef(noeud))
868  & THEN
869  ! THE GLOBAL NUMBER OF FINITE ELEMENTS CONTAINING NOEUD
870  ! IS GREATER THAN THE LOCAL NUMBER OF FINITE ELEMENTS
871  ! CONTAINING NOEUD => NOEUD IS AN INTERFACE POINT
872  ! => EF IS AN INTERFACE FINITE ELEMENT
873  interface=.true.
874  END IF
875  IF (nbre_ef_loc(knogl(noeud)) .NE. nbre_ef(noeud).AND.
876  & nbre_ef_loc(knogl(noeud)) .GT. 0) THEN
877  ! IT IS THE FIRST TIME THAT NOEUD IS DETECTED AS INTERFACE POINT
878  ! AS AFTER NBRE_EF_LOC(KNOGL(NOEUD))= -1*NBRE_EF_LOC(KNOGL(NOEUD))
879  interface=.true.
880  nptir_p=nptir_p+1
881  cut_p(nptir_p)=noeud
882  sort(noeud)=1
883  nbre_ef_loc(knogl(noeud))=
884  & -1*nbre_ef_loc(knogl(noeud))
885  END IF
886  END DO
887  IF (INTERFACE .EQV. .true.) THEN
888  nbre_ef_i=nbre_ef_i+1
889  ef_i(nbre_ef_i)=ef
890  ef_ii(nbre_ef_i)=j
891  END IF
892  END DO
893  WRITE(22,*) 'NPTIR_P',nptir_p
894  nb_inter_glob=0
895  ! IF (IPID. EQ. 0) WRITE(89,*) SORT
896  ! CUT=0
897  CALL p_max_array(sort,cut,npoin2,ier)
898 !
899  DO j=1,npoin2
900  IF (cut(j) .NE. 0) THEN
901  nb_inter_glob=nb_inter_glob+1
902  END IF
903  END DO
904  ALLOCATE(global_inter_node_reord(nb_inter_glob),stat=err)
905  CALL check_allocate(err, 'GLOBAL_INTER_REORD')
906  ALLOCATE(part_p(nb_inter_glob,nbmaxnshare+1),stat=err)
907  CALL check_allocate(err, 'PART_P')
908  ALLOCATE(part_p_tmp1(nparts+1),stat=err)
909  CALL check_allocate(err, 'PART_P_TMP1')
910  ALLOCATE(part_p_tmp2(nparts+1),stat=err)
911  CALL check_allocate(err, 'PART_P_TMP2')
912  nb_inter_glob=0
913  DO j=1,npoin2
914  IF (cut(j) .NE. 0) THEN
915  nb_inter_glob=nb_inter_glob+1
916  global_inter_node_reord( nb_inter_glob)=j
917 ! IF (NBRE_EF_LOC(KNOGL(NOEUD)) .LT. 0) THEN
918 ! PART_P(NB_INTER_GLOB,I)=I
919 ! END IF
920  END IF
921  END DO
922  part_p=0
923  DO j=1,nb_inter_glob
924  part_p_tmp1=0
925  part_p_tmp2=0
926  compt=0
927  noeud=global_inter_node_reord(j)
928  IF (sort(noeud) .NE. 0) THEN
929  part_p_tmp1(i)=i
930  part_p_tmp1(nparts+1)=part_p_tmp1(nparts+1)+1
931  END IF
932  CALL p_isum_array(part_p_tmp1,part_p_tmp2,nparts+1,
933  & ier)
934  DO k=1,nparts
935  IF (part_p_tmp2(k) .NE. 0 .AND. k .NE. i) THEN
936  compt=compt+1
937  part_p(j,compt)=k
938  part_p(j,nbmaxnshare+1)=part_p_tmp2(nparts+1)
939  END IF
940  END DO
941  END DO
942  DEALLOCATE(part_p_tmp1)
943  DEALLOCATE(part_p_tmp2)
944  DEALLOCATE(cut)
945  max_n_neigh=maxval(part_p(:,nbmaxnshare+1))
946 ! WRITE(LU,*) 'MAX', MAX_N_NEIGH
947  IF ( max_n_neigh > nbmaxnshare-1 ) THEN
948  WRITE(lu,*) 'SERIOUS WARNING: '
949  WRITE(lu,*)
950  & 'AN INTERFACE NODE BELONGS TO ',
951  & 'MORE THAN NBMAXNSHARE-1 SUBDOMAINS'
952  WRITE(lu,*) 'TELEMAC MAY PROTEST!'
953  END IF
954  IF (max_n_neigh > maxnproc) THEN
955  WRITE (lu,*) 'THERE IS A NODE WHICH BELONGS TO MORE THAN ',
956  & maxnproc,' PROCESSORS, HOW COME?'
957  CALL plante(1)
958  stop
959  ENDIF
960  IF (max_n_neigh < nbmaxnshare-1) max_n_neigh = nbmaxnshare-1
961 !
962 !======================================================================
963 ! STEP 6 : COMPUTE THE HALO
964 !
965 !======================================================================
966 !
967  nhalo=0
968 ! LOOP ON THE INTERFACE FINITE ELEMENT
969  DO j=1,nbre_ef_i
970  ef=ef_i(j)
971  halo=.false.
972  ifaloc(:)=ifabor(ef,:)
973  WHERE (ifaloc .GT. 0)
974  ifaloc=epart(ifaloc)
975  END WHERE
976  halo=any(ifaloc .GT. 0 .AND. ifaloc .NE. i)
977  IF (halo .EQV. .true.) THEN
978  nhalo=nhalo+1
979  END IF
980  END DO
981  ALLOCATE (ifapar(7,nhalo),stat=err)
982  CALL check_allocate(err, 'IFAPAR')
983  ifapar(:,:)=0
984 !
985  nhalo=0
986 ! LOOP ON THE INTERFACE FINITE ELEMENT
987  DO j=1,nbre_ef_i
988  ef=ef_i(j)
989  halo=.false.
990  ifaloc(:)=ifabor(ef,:)
991  WHERE (ifaloc .GT. 0)
992  ifaloc=epart(ifaloc)
993  END WHERE
994  halo=any(ifaloc .GT. 0 .AND. ifaloc .NE. i)
995  IF (halo .EQV. .true.) THEN
996  nhalo=nhalo+1
997  ifapar(1,nhalo)=ef_ii(j)
998  ifapar(2:4,nhalo)=ifaloc(:)
999  ifapar(5:7,nhalo)=ifabor(ef_i(j),:)
1000 ! DO K=1,3
1001 ! NPART(IFALOC(K))=NPART(IFALOC(K))+1
1002 ! END DO
1003  END IF
1004  END DO
1005 !
1006 ! WRITE(LU,*) 'SOUS DOMAINE ',I,'NBRE POINTS',NPOIN_P,
1007 ! & 'NBRE NOEUD INTE',NBRE_NOEUD_INTERNE,'INTERFACE',
1008 !! & NPTIR_P,'NBRE FRONT',NPTFR_P, 'HALO',NHALO,
1009 ! & 'NBRE_EFRONT',NBRE_EF_I
1010 !
1011  IF (.NOT. ALLOCATED(nbor_p)) THEN
1012  ALLOCATE(nbor_p(npoin2),stat=err)
1013  CALL check_allocate(err, 'NBOR_P')
1014  END IF
1015 ! END DO
1016 
1017 ! DO I=1,NPARTS
1018  CALL p_sync()
1019  IF (ipid .EQ. 0) THEN
1020  startiotime=p_time()
1021  WRITE(lu,*) 'TEMPS CALCUL :',startiotime-startctime
1022  END IF
1023 !
1024 !-----------------------------------------------------------------------
1025 ! THE CORE NAMES FOR THE OUTPUT BC FILES ACCORDING TO THE NUMBER OF PARTS
1026 !
1027  nameclm = namecli ! CORE NAME LENGTH IS I_LENCLI
1028  nameout = nameinp ! CORE NAME LENGTH IS I_LENINP
1029 !
1030 !----------------------------------------------------------------------
1031 !
1032  nameclm(i_lencli+1:i_lencli+11) = extens(nparts-1,ipid)
1033 !
1034  CALL get_free_id(nclm)
1035  OPEN(nclm,file=nameclm,
1036  & status='UNKNOWN',form='FORMATTED')
1037  rewind(nclm)
1038 !
1039 ! FILE OPENED, NOW WORK ON BOUNDARIES
1040 ! -----------------------------------
1041 !
1042 ! WHEN THE BOUNDARY NODE BELONGS TO THIS SUBDOMAIN IT WILL BE TAKEN
1043 ! J IS THE RUNNING BOUNDARY NODE NUMBER
1044 !
1045 ! NPTIR = 0
1046  j = 0
1047 !
1048  DO k=1,nptfr
1049 !
1050 ! BOUNDARY NODES BELONGING TO THIS PARTITION
1051 !
1052  IF ( knogl(nbor(k)) /= 0) THEN
1053  j = j + 1
1054 ! NBOR_P(J) = NBOR(K)
1055  iseg = 0
1056  xseg = 0.0
1057  yseg = 0.0
1058 !
1059 ! IF THE ORIGINAL (GLOBAL) BOUNDARY LEADS FURTHER INTO
1060 ! ANOTHER PARTITION THEN ISEG IS SET NOT EQUAL TO ZERO
1061 ! THE NEXT NODE ALONG THE GLOBAL BOUNDARY HAS IPTFR = M
1062 ! (BUT CHECK THE CASE THE CIRCLE CLOSES)
1063 !
1064  m = kp1bor(k,1)
1065 !
1066 ! NBOR_P CANNOT BE USED, IT IS NOT FULLY FILLED WITH DATA
1067 !
1068  iso = 0
1069 ! CHECKING IF THE ADJACENT ELEMENT IS NOT IN THE
1070 ! SUB-DOMAIN
1071  IF (epart(nelbor(k)).NE.i) THEN
1072 !
1073  iseg = nbor(m)
1074  xseg = f(iseg,1)
1075  yseg = f(iseg,2)
1076  iso = iso + 1
1077  ENDIF
1078 !
1079  m = kp1bor(k,2)
1080 !
1081 ! SAME AS ABOVE, BUT PREVIOUS SEGMENT ,THUS M, NOT K
1082  IF (epart(nelbor(m)).NE.i) THEN
1083 !
1084  iseg = -nbor(m)
1085  xseg = f(-iseg,1)
1086  yseg = f(-iseg,2)
1087  iso = iso + 1
1088  ENDIF
1089 !
1090 ! WHEN BOTH NEIGHBOURS BOUNDARY NODES BELONG TO ANOTHER PARTITION
1091 !
1092  IF (iso == 2) THEN
1093  iseg = -9999
1094  iso = 0
1095  ENDIF
1096 !
1097  WRITE (nclm,4000)
1098  & lihbor(k), liubor(k), livbor(k),
1099  & hbor(k), ubor(k), vbor(k),
1100  & aubor(k), litbor(k), tbor(k), atbor(k), btbor(k),
1101  & nbor(k),check(k), iseg, xseg, yseg, numliq(k)
1102 
1103  4000 FORMAT (1x,i2,1x,2(i1,1x),3(f24.12,1x),1x,
1104  & f24.12,3x,i1,1x,3(f24.12,1x),1i15,1x,1i15,
1105  & 1x,i15,1x,2(f27.15,1x),i15)
1106  ENDIF
1107 !
1108  END DO
1109 
1110  fmt4='(I15)'
1111  WRITE (nclm,*) nptir_p
1112 ! WRITE(LU,*) '######### ', NPTIR_P
1113  IF (max_n_neigh < nbmaxnshare-1) max_n_neigh = nbmaxnshare-1
1114  fmt4='( (I15,1X))'
1115  WRITE (fmt4(2:4),'(I3)') max_n_neigh+1
1116 !
1117  DO j=1, nb_inter_glob
1118  noeud=global_inter_node_reord(j)
1119  IF (sort(noeud) .NE. 0) THEN
1120 
1121  WRITE(nclm,fmt=fmt4) global_inter_node_reord(j),
1122  & (part_p(j,k)-1, k=1,max_n_neigh)
1123  END IF
1124  END DO
1125 !
1126  DO j=1,nhalo
1127  DO m=0,2
1128  IF (ifapar(2+m,j)>0) THEN
1129  ifapar(5+m,j)=gelegl1(ifapar(5+m,j))
1130  END IF
1131  END DO
1132  END DO
1133 ! IFAPAR(2:4,:)=IFAPAR(2:4,:)-1
1134  DO j=1,nhalo
1135  DO m=0,2
1136  IF (ifapar(2+m,j)>0) THEN
1137  ifapar(2+m,j)=ifapar(2+m,j)-1
1138  END IF
1139  END DO
1140  END DO
1141 !
1142  WRITE(nclm,'(I15)') nhalo
1143  DO k=1,nhalo
1144 
1145  WRITE (nclm,'(7(I15,1X))') ifapar(:,k)
1146  END DO
1147  CLOSE(nclm)
1148 !
1149  ALLOCATE (irand_p(npoin2),stat=err)
1150  CALL check_allocate(err, 'IRAND_P')
1151 !
1152  CALL check_allocate(err, 'F_P')
1153  ALLOCATE(ikles_p(nelem2*3),stat=err)
1154  IF(nplan.GT.1) THEN
1155  ALLOCATE(ikles3d_p(6,nelem2,nplan-1),stat=err)
1156  ENDIF
1157  CALL check_allocate(err, 'IKLES3D_P')
1158 !
1159 !***************************************************************
1160 ! WRITING GEOMETRY FILES FOR ALL PARTS/PROCESSORS
1161 !
1162  nameout(i_leninp+1:i_leninp+11) = extens(nparts-1,ipid)
1163 !
1164  CALL get_free_id(nout)
1165  OPEN(nout,file=nameout,form='UNFORMATTED'
1166  & ,status='UNKNOWN')
1167  rewind(nout)
1168 !
1169 ! TITLE, THE NUMBER OF VARIABLES
1170  WRITE(nout) title
1171  WRITE(nout) nvar,0
1172 !
1173  DO k=1,nvar
1174  WRITE(nout) variable(k)
1175  END DO
1176 ! WRITE(*,*) 'HERE '
1177 ! 10 INTEGERS...
1178 ! 1. IS THE NUMBER OF RECORDINGS IN FILES
1179 ! 8. IS THE NUMBER OF BOUNDARY POINTS (NPTFR_P)
1180 ! 9. IS THE NUMBER OF INTERFACE POINTS (NPTIR_P)
1181 ! 10. IS 0 WHEN NO DATE PASSED; 1 IF A DATE/TIME RECORD FOLLOWS
1182 !
1183 ! IB(7) = NPLAN (ALREADY DONE)
1184  ib(8) = nptfr_p
1185  ib(9) = nptir_p
1186 ! WRITE(*,*) 'SD',I,'NPTFR_P(I)',NPTFR_P, 'NPTIR_P(I)',
1187 ! & NPTIR_P,'NHALO(I)',NHALO,NPOIN_P
1188  WRITE(nout) (ib(k), k=1,10)
1189  IF (ib(10).EQ.1) THEN
1190  WRITE(nout) date(1), date(2), date(3),
1191  & time(1), time(2), time(3)
1192  ENDIF
1193  IF(nplan.LE.1) THEN
1194  WRITE(nout) nelem_p, npoin_p, ndp, ndum
1195  ELSE
1196  WRITE(nout) nelem_p*(nplan-1),
1197  & npoin_p*nplan, ndp, ndum
1198  ENDIF
1199  DO j=1,nelem_p
1200  ef=elelg(j)
1201  DO k=1,3
1202  ikles_p((j-1)*3+k) = knogl(ikles((ef-1)*3+k))
1203  END DO
1204  END DO
1205  IF(nplan > 1) THEN
1206  DO k = 1,nplan-1
1207  DO j = 1,nelem_p
1208  ikles3d_p(1,j,k) = ikles_p(1+(j-1)*3) + (k-1)*npoin_p
1209  ikles3d_p(2,j,k) = ikles_p(2+(j-1)*3) + (k-1)*npoin_p
1210  ikles3d_p(3,j,k) = ikles_p(3+(j-1)*3) + (k-1)*npoin_p
1211  ikles3d_p(4,j,k) = ikles_p(1+(j-1)*3) + k *npoin_p
1212  ikles3d_p(5,j,k) = ikles_p(2+(j-1)*3) + k *npoin_p
1213  ikles3d_p(6,j,k) = ikles_p(3+(j-1)*3) + k *npoin_p
1214  ENDDO
1215  ENDDO
1216  ENDIF
1217 !
1218  IF (nplan.LE.1) THEN
1219  WRITE(nout)
1220  & ((ikles_p((j-1)*3+k),k=1,3),j=1,nelem_p)
1221  ELSE
1222  WRITE(nout)
1223  & (((ikles3d_p(l,j,k),l=1,6),j=1,nelem_p),k=1,nplan-1)
1224  ENDIF
1225 !
1226 ! INSTEAD OF IRAND, KNOLG IS WRITTEN !!!
1227 ! I.E. THE TABLE PROCESSOR-LOCAL -> PROCESSOR-GLOBAL NODE NUMBERS
1228 !
1229  IF (nplan.EQ.0) THEN
1230  WRITE(nout) (knolg(j), j=1,npoin_p)
1231  ELSE
1232 ! BEYOND NPOIN_P(I) : DUMMY VALUES IN KNOLG, NEVER USED
1233  WRITE(nout) (knolg(j), j=1,npoin_p*nplan)
1234  ENDIF
1235 !
1236 ! COMPLETING PLANES OTHER THAN 1 FOR FUNCTIONS F_P
1237  IF (nplan.GT.1) THEN
1238  DO l=2,nplan
1239  DO j=1,npoin_p
1240  DO k=1,nvar+2
1241  f_p(j+(l-1)*npoin_p,k) = f(knolg(j)+(l-1)*npoin2,k)
1242  END DO
1243  ENDDO
1244  ENDDO
1245  ENDIF
1246 !
1247 ! NODE COORDINATES X AND Y
1248 !
1249  IF (nplan.EQ.0) THEN
1250  WRITE(nout) (f_p(j,1),j=1,npoin_p)
1251  WRITE(nout) (f_p(j,2),j=1,npoin_p)
1252  ELSE
1253  WRITE(nout) (f_p(j,1),j=1,npoin_p*nplan)
1254  WRITE(nout) (f_p(j,2),j=1,npoin_p*nplan)
1255  ENDIF
1256 !
1257 ! TIME STAMP (SECONDS)
1258  WRITE(nout) times
1259 ! NOW THE TIME-DEPENDENT VARIABLES
1260 !
1261  DO k=3,nvar+2
1262  IF(nplan.EQ.0) THEN
1263  WRITE(nout) (f_p(j,k),j=1,npoin_p)
1264  ELSE
1265  WRITE(nout) (f_p(j,k),j=1,npoin_p*nplan)
1266  ENDIF
1267  END DO
1268  CLOSE (nout)
1269  CALL p_sync()
1270 !
1271 !======================================================================
1272 ! WRITING EPART AND NPART
1273 !
1274 ! //// JAJ: LA FINITA COMMEDIA FOR PARALLEL CHARACTERISTICS, BYE!
1275 !----------------------------------------------------------------------
1276 !
1277 ! NOTE BY J-M HERVOUET : DEALLOCATE CAUSES ERRORS ON HP
1278 ! (POSSIBLE REMAINING BUG ?)
1279 ! NOTE BY JAJ: DEALLOCATE(HP) ,^)
1280 !
1281 ! DEALLOCATE(NPART)
1282 ! DEALLOCATE(EPART)
1283 ! DEALLOCATE(NPOIN_P)
1284 ! DEALLOCATE(NELEM_P)
1285 ! DEALLOCATE(NPTFR_P)
1286 ! DEALLOCATE(NPTIR_P)
1287 !
1288 ! DEALLOCATE(IKLES)
1289 ! IF(NPLAN.GT.1) THEN
1290 ! DEALLOCATE(IKLES3D)
1291 ! DEALLOCATE(IKLES3D_P)
1292 ! ENDIF
1293 ! DEALLOCATE(IKLES_P)
1294 ! DEALLOCATE(IRAND)
1295 ! DEALLOCATE(IRAND_P)
1296 ! DEALLOCATE(F)
1297 ! DEALLOCATE(F_P)
1298 !
1299 ! DEALLOCATE(KNOLG)
1300 ! DEALLOCATE(KNOGL)
1301 ! DEALLOCATE(ELELG)
1302 !
1303 ! DEALLOCATE(LIHBOR)
1304 ! DEALLOCATE(LIUBOR)
1305 ! DEALLOCATE(LIVBOR)
1306 ! DEALLOCATE(HBOR)
1307 ! DEALLOCATE(UBOR)
1308 ! DEALLOCATE(VBOR)
1309 ! DEALLOCATE(LITBOR)
1310 ! DEALLOCATE(AUBOR)
1311 ! DEALLOCATE(TBOR)
1312 ! DEALLOCATE(ATBOR)
1313 ! DEALLOCATE(BTBOR)
1314 ! DEALLOCATE(NBOR)
1315 ! DEALLOCATE(NUMLIQ)
1316 ! DEALLOCATE(KP1BOR)
1317 ! DEALLOCATE(CHECK)
1318 !
1319 ! DEALLOCATE(NBOR_P)
1320 ! DEALLOCATE(CUT)
1321 ! DEALLOCATE(CUT_P)
1322 ! DEALLOCATE(PART_P)
1323 ! DEALLOCATE(SORT)
1324 !
1325 !----------------------------------------------------------------------
1326 !
1327  CALL p_sync()
1328  IF (ipid .EQ. 0) THEN
1329  ENDTIME=P_TIME()
1330  WRITE(lu,*) 'TEMPS ECRITURE :',endtime-startiotime
1331  WRITE(lu,*) 'TEMPS TOTAL :',endtime-starttime
1332  WRITE(lu,*) '+---- PARTEL: NORMAL TERMINATION ----+'
1333  END IF
1334 !
1335  CALL p_exit()
1336  stop 0
1337 !
1338  END PROGRAM partel_para
subroutine p_isum_array(SEND_BUFFER, RECV_BUFFER, NCOUNT, IERR)
Definition: p_isum_array.F:7
subroutine p_exit
Definition: p_exit.F:4
subroutine p_init(CHAINE, NCAR, IPID, NCSIZE)
Definition: p_init.F:7
subroutine check(IKLE2, NBOR, NELBOR, IKLBOR, NELEB, NELEBX, IKLE3, NELBO3, NULONE, DIM1NUL, DIM2NUL, NBOR3, NELMAX2, NPTFR, NELMAX, NPTFR3, INFO)
Definition: check.f:8
subroutine front2(NFRLIQ, LIHBOR, LIUBOR, X, Y, NBOR, KP1BOR, DEJAVU, NPOIN, NPTFR, KLOG, LISTIN, NUMLIQ, MAXFRO)
Definition: front2.f:8
real *8 function p_time()
Definition: p_time.F:7
subroutine p_sync
Definition: p_sync.F:4
integer, parameter path_len
subroutine voisin(IFABOR, NELEM, NELMAX, IELM, IKLE, SIZIKL, NPOIN, NACHB, NBOR, NPTFR, IADR, NVOIS)
Definition: voisin.f:8
subroutine elebd(NELBOR, NULONE, KP1BOR, IFABOR, NBOR, IKLE, SIZIKL, IKLBOR, NELEM, NELMAX, NPOIN, NPTFR, IELM, LIHBOR, KLOG, ISEG, T1, T2, T3, NELEBX, NELEB)
Definition: elebd.f:9
Definition: bief.f:3