The TELEMAC-MASCARET system  trunk
partel.F
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE partel
3 ! *****************
4  & (nameinp, namecli, nparts, pmethod, fformat,
5  & namesec, namezfi, nameseu)
6 !
7 !
8 !***********************************************************************
9 ! PARTEL
10 !***********************************************************************
11 !
12 !BRIEF PREPROCESSING STEP BEFORE A PARALLEL COMPUTATION
13 !
14 !HISTORY R. KOPMANN (BAW)
15 !+
16 !+
17 !+ FIRST VERSION JANUARY-MARCH 2000
18 !
19 !HISTORY JAJ
20 !+ 12/12/2000
21 !+ SECOND VERSION PINXIT
22 !+ PARTITIONING OF GEOMETRY AND 2D RESULT FILES POSSIBLE
23 
24 !HISTORY JAJ
25 !+ 22/02/2002
26 !+ THIRD VERSION
27 !+ ERRORS IN BC VALUES IN DECOMPOSED BC FILES REMOVED
28 !+ ERRONEOUS TREATMENT OF ISLANDS DEBUGGED
29 !
30 !HISTORY J-M HERVOUET ; JAJ
31 !+ 17/04/2002
32 !+ FOURTH VERSION
33 !+ PARTITIONING FOR 3D RESULT FILES DONE BY JMH
34 !+ INCLUDING BOTH PARTITIONING METHODS AND BEAUTIFYING BY JAJ
35 !
36 !HISTORY J-M HERVOUET
37 !+ 21/01/2003
38 !+ FIFTH VERSION
39 !+ CORRECTED A WRONG DIMENSION OF THE ARRAY CUT, AN ERROR
40 !+ OCCURING BY A LARGER NUMBER OF PROCESSORS
41 !
42 !HISTORY J-M HERVOUET
43 !+ 12/03/2003
44 !+ SEVENTH VERSION
45 !+ ALGORITHM CHANGED : A SEGMENT IS IN A SUBDOMAIN IF IT BELONGS
46 !+ TO AN ELEMENT IN THE SUBDOMAIN NOT IF THE 2 POINTS OF THE
47 !+ SEGMENT BELONG TO THE SUBDOMAIN.
48 !+ SPECIFIC ELEBD INCLUDED, ALL REFERENCE TO MPI OR BIEF REMOVED
49 !
50 !HISTORY J-M HERVOUET
51 !+ 01/09/2003
52 !+ EIGHTH VERSION
53 !+ UBOR AND VBOR INVERTED LINE 613 WHEN READING THE CLI FILE.
54 !+ OTHER MODIFICATIONS PERFORMED
55 !
56 !HISTORY C. DENIS J-M HERVOUET (SINETICS & LNHE)
57 !+ 22/06/2012
58 !+ V6P2
59 !+ DOUBLE PRECISION SERAFIN NOW POSSIBLE.
60 !
61 !HISTORY Y. AUDOUIN (STFC & LNHE)
62 !+ 25/06/2012
63 !+ V6P2
64 !+ INTERFACE FOR LATEST RELEASE OF METIS (>= VERSION 5)
65 !
66 !HISTORY J-M HERVOUET (EDF LAB, LNHE)
67 !+ 27/03/2014
68 !+ V7P0
69 !+ ARGUMENTS ADDED TO THE CALL ELEBD.
70 !
71 !HISTORY Y AUDOUIN (LNHE)
72 !+ 25/05/2015
73 !+ V7P0
74 !+ MODIFICATION TO COMPLY WITH THE HERMES MODULE
75 !
76 !HISTORY C. COULET (ARTELIA)
77 !+ 01/09/2016
78 !+ V7P2
79 !+ MODIFICATION TO ADD THE WEIR FILE MANAGEMENT
80 !
81 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
82 !| NAMEGEO |<--| NAME OF THE GEOMETRY FILE
83 !| NAMECLI |<--| NAME OF THE BOUNDARY CONDITIONS FILE
84 !| NPARTS |<--| NUMBER OF PARTITIONS
85 !| PMETHOD |<--| 1: FOR METIS 2: FOR SCOTCH
86 !| FFORMAT |<--| FORMAT OF THE GEOMETRY FILE
87 !| NAMESEC |<--| NAME OF THE SECTION FILE ' ' IF THERE ARE NONE
88 !| NAMEZFI |<--| NAME OF THE FRICTION ZONE FILE ' ' IF THERE ARE NONE
89 !| NAMESEU |<--| NAME OF THE WEIR FILE ' ' IF THERE ARE NONE
90 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
91 !
94  USE bief, ONLY : nbmaxnshare, nptir,
95  & read_mesh_info, ncsize
97  USE mod_hash_table
104  USE mod_handle_weirs
105 !
106  IMPLICIT NONE
107 !
108 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
109 
110  CHARACTER(LEN=PATH_LEN), INTENT(IN) :: NAMEINP
111  CHARACTER(LEN=PATH_LEN), INTENT(IN) :: NAMECLI
112  INTEGER, INTENT(IN) :: NPARTS
113  INTEGER, INTENT(IN) :: PMETHOD
114  CHARACTER(LEN=8), INTENT(INOUT) :: FFORMAT
115  CHARACTER(LEN=PATH_LEN), INTENT(IN) :: NAMESEC
116  CHARACTER(LEN=PATH_LEN), INTENT(IN) :: NAMEZFI
117  CHARACTER(LEN=PATH_LEN), INTENT(IN) :: NAMESEU
118 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
119 !
120 !
121  INTEGER NVAR, NPLAN, NPTFR
122  INTEGER NELEM, NPOIN, NDP, NELEM2, NPOIN2, NDP_BND
123  INTEGER DIM_MESH
124  !USED IN SOME LOOP TO AVOID THE MULTIPLE CALL OF HASH_TABLE_GET
125  INTEGER TEMP
126 !
127  INTEGER, ALLOCATABLE :: IKLES(:), IKLES_P(:)
128  INTEGER, ALLOCATABLE :: IKLES3D(:),IKLES3D_P(:,:,:)
129  INTEGER, ALLOCATABLE :: IRAND(:)
130  INTEGER, ALLOCATABLE :: LIHBOR(:),LIUBOR(:)
131  INTEGER, ALLOCATABLE :: LIVBOR(:),LITBOR(:),COLOR(:)
132  DOUBLE PRECISION, ALLOCATABLE :: HBOR(:),UBOR(:),VBOR(:)
133  DOUBLE PRECISION, ALLOCATABLE :: CHBORD(:)
134  DOUBLE PRECISION, ALLOCATABLE :: TBOR(:),ATBOR(:),BTBOR(:)
135  INTEGER, ALLOCATABLE :: NBOR(:),IKLE_BND(:)
136  INTEGER, ALLOCATABLE :: NPOIN_P(:), NELEM_P(:), NPTFR_P(:)
137  INTEGER, ALLOCATABLE :: NPTIR_P(:)
138  INTEGER, ALLOCATABLE :: NUMLIQ(:)
139  INTEGER, ALLOCATABLE :: KNOLG(:,:)
140  INTEGER, ALLOCATABLE :: ELELG(:,:)
141  INTEGER, ALLOCATABLE :: CUT(:), SORT(:)
142  TYPE(hash_table) :: CUT_P, KNOGL
143  INTEGER, ALLOCATABLE :: PART_P(:,:)
144 !
145 ! FOR DOUBLE PRECISION SERAFIN FORMAT
146 !
147  DOUBLE PRECISION, ALLOCATABLE :: F(:,:)
148 !
149  DOUBLE PRECISION TIMES
150 !
151  INTEGER :: NINP=10
152  INTEGER :: NOUT=17, nclm=18
153  INTEGER TIME(3),DATE(3), DATE_TMP(6)
154 !
155  CHARACTER(LEN=80) :: TITLE
156  CHARACTER(LEN=32), ALLOCATABLE :: VARIABLE(:)
157  CHARACTER(LEN=PATH_LEN) :: NAMECLM
158  CHARACTER(LEN=12) :: FMT4
159 !
160  INTEGER MAX_NELEM_P
161  INTEGER MAX_NPOIN_P,MAX_N_NEIGH
162  INTEGER I, J, K, L, M, ISO, IDUM
163  INTEGER ISEG, NTIMESTEP
164 !
165  REAL XSEG, YSEG
166  LOGICAL TIMECOUNT
167 !
168 ! METISOLOGY
169 !
170  INTEGER, ALLOCATABLE :: EPART(:), NPART(:)
171 !
172 ! FOR CALLING FRONT2
173 !
174  INTEGER, ALLOCATABLE :: KP1BOR(:,:)
175 !
176 ! FOR CALLING BIEF MESH SUBROUTINES (TO BE OPTIMISED SOON):
177 !
178  INTEGER, ALLOCATABLE :: IFABOR(:,:), NELBOR(:)
179  INTEGER, ALLOCATABLE :: IKLE(:,:)
180 !
181 ! TIME MEASURING
182 !
183  INTEGER TDEB, TFIN, TDEBP, TFINP, TEMPS, PARSEC
184 ! HERMES TEMPORARY ARRAYS
185  DOUBLE PRECISION,ALLOCATABLE :: DATAVAL(:,:,:)
186  INTEGER :: IERR
187  CHARACTER(LEN=16), ALLOCATABLE :: VAR_NAME(:), VAR_UNIT(:)
188  INTEGER NELEBD
189  INTEGER TYP_ELEM, TYP_BND_ELEM
190 !
191 !----------------------------------------------------------------------
192 !
193 !JAJ NEW FOR PARALLEL CHARACTERISTICS ////
194 ! HALO ELEMENTS: THESE ADJACENT TO THE INTERFACE EDGES HAVING
195 ! NEIGHBOURS BEHIND A BOUNDARY
196 !
197  ! THE ELEMENTAL GLOBAL->LOCAL NUMBERING TRANSLATION TABLE
198  ! THIS IS ELEGL SAVED FROM ALL PARTITIONS FOR FURTHER USE
199  !INTEGER, ALLOCATABLE :: GELEGL(:,:)
200  TYPE(hash_table) :: GELEGL
201 !
202  ! THE HALO ELEMENTS NEIGHBOURHOOD DESCRIPTION FOR A HALO CELL
203  INTEGER, ALLOCATABLE :: IFAPAR(:,:)
204 !
205  ! THE NUMBER OF HALO CELLS PRO PARTITION
206  INTEGER, ALLOCATABLE :: NHALO(:)
207 !
208 ! WORK VARIABLES
209 !
210  INTEGER IFALOC(3)
211  INTEGER NDP_2D
212  INTEGER EF
213  INTEGER, ALLOCATABLE :: NBRE_EF(:),EF_I(:,:)
214  INTEGER, ALLOCATABLE :: TAB_TMP(:),EF_II(:,:)
215  LOGICAL HALO
216  INTEGER NOEUD
217  INTEGER, ALLOCATABLE :: NBRE_EF_I(:)
218 !
219 ! #### FOR SECTIONS
220 !
221  LOGICAL :: WITH_SECTIONS
222 !
223 ! #### FOR ZONES
224 !
225  LOGICAL :: WITH_ZONES
226 !
227 ! CD: FLAG FOR SERAFIN FORMAT (.TRUE. IF DOUBLE PRECISION)
228 !
229 ! PARTEL EXTENS
230  CHARACTER(LEN=11) :: EXTENS
231  EXTERNAL extens
232 !
233 ! #### FOR WEIRS
234 !
235  LOGICAL :: WITH_WEIRS
236 !
237 ! FOR PARTEL CONCAT
238  INTEGER :: NCLM_IDX, OFFSET_BEGIN, OFFSET_END, WRITTEN_LINES
239  CHARACTER(LEN=PATH_LEN) :: NAMECLM_IDX
240 !
241 !----------------------------------------------------------------------
242 !
243  ndp_2d=3
244  ! SET NCSIZE TO 1 TO USE VOISIN AND READ_MESH_INFO IN SERIAL MODE
245  ncsize=1
246 !
247  WRITE(lu,*) '+---- PARTEL: BEGINNING -------------+'
248  CALL system_clock (count=temps, count_rate=parsec)
249  timecount = .true.
250  IF (parsec==0) timecount = .false. ! COUNT_RATE == 0 : NO CLOCK
251  IF (timecount) tdeb = temps
252 !
253  WRITE(lu,*)'FICHIER:',nameinp
254  CALL open_mesh(fformat, nameinp, ninp, 'READ ', ierr)
255  CALL check_call(ierr, 'PARTEL:OPENMESH:INP')
256 !
257  CALL open_bnd(fformat,namecli,ninp,'READ ',ierr)
258  CALL check_call(ierr,'PARTEL:OPEN_BND:NCLI')
259 !
260 !----------------------------------------------------------------------
261 !
262 ! START READING THE GEOMETRY OR RESULT FILE
263 !
264  CALL read_mesh_info(fformat,ninp,title,nvar,npoin,typ_elem,nelem,
265  & nptfr,nptir,ndp,nplan,x_orig,y_orig,
266  & typ_bnd_elem,nelebd)
267 !
268  ALLOCATE(nbre_ef_i(nparts), stat=ierr)
269  CALL check_allocate(ierr, 'NBRE_EF_I')
270 
271  ! GET THE VARIABLES NAMES
272  ALLOCATE(var_name(nvar),stat=ierr)
273  CALL check_allocate(ierr,'PARTEL:VAR_NAME')
274  ALLOCATE(var_unit(nvar),stat=ierr)
275  CALL check_allocate(ierr,'PARTEL:VAR_UNIT')
276  ALLOCATE(variable(nvar),stat=ierr)
277  CALL check_allocate(ierr,'PARTEL:VAR_UNIT')
278 
279  CALL get_data_var_list(fformat,ninp,nvar,var_name,var_unit,ierr)
280  CALL check_call(ierr,'PARTEL:GET_DATA_VAR_LIST:INP')
281  DO i=1,nvar
282  variable(i)(1:16) = var_name(i)
283  variable(i)(17:32) = var_unit(i)
284  ENDDO
285  DEALLOCATE(var_name)
286  DEALLOCATE(var_unit)
287 !
288 ! READ THE REST OF THE SELAFIN FILE
289 ! 10 INTEGERS, THE FIRST IS THE NUMBER OF RECORDS (TIMESTEPS)
290 !
291  CALL get_mesh_date(fformat,ninp,date_tmp,ierr)
292  CALL check_call(ierr,'PARTEL:GET_MESH_DATE:INP')
293  DO i=1,3
294  date(i) = date_tmp(i)
295  time(i) = date_tmp(i+3)
296  ENDDO
297 !
298  IF(nplan.GT.1) THEN
299  WRITE(lu,*) ' '
300  WRITE(lu,*) '3D MESH DETECTED'
301  npoin2 = npoin/nplan
302  nelem2 = nelem/(nplan-1)
303  WRITE(lu,*) 'NDP NODES PER ELEMENT: ',ndp
304  WRITE(lu,*) 'NPLAN NUMBER OF MESH LEVELS: ',nplan
305  WRITE(lu,*) 'NPOIN2 NUMBER OF 2D MESH NODES: ',npoin2
306  WRITE(lu,*) 'NPOIN NUMBER OF 3D MESH NODES: ',npoin
307  WRITE(lu,*) 'NELEM2 NUMBER OF 2D MESH ELEMENTS: ',nelem2
308  WRITE(lu,*) 'NELEM NUMBER OF 3D MESH ELEMENTS: ',nelem
309  IF (mod(npoin,nplan).NE.0) THEN
310  WRITE (lu,*) 'BUT NPOIN2 /= NPOIN3/NPLAN!'
311  CALL plante(1)
312  stop
313  ENDIF
314  IF (mod(nelem,(nplan-1)).NE.0) THEN
315  WRITE (lu,*) 'BUT NELEM2 /= NELEM3/NPLAN!'
316  CALL plante(1)
317  stop
318  ENDIF
319  WRITE(lu,*) ' '
320  WRITE(lu,*) 'THE INPUT FILE ASSUMED TO BE 3D'
321  dim_mesh = 3
322  ELSE
323  WRITE(lu,*) ' '
324  WRITE(lu,*) 'ONE-LEVEL MESH.'
325  WRITE(lu,*) 'NDP NODES PER ELEMENT: ',ndp
326  WRITE(lu,*) 'ELEMENT TYPE : ',typ_elem
327  WRITE(lu,*) 'NPOIN NUMBER OF MESH NODES: ',npoin
328  WRITE(lu,*) 'NELEM NUMBER OF MESH ELEMENTS: ',nelem
329  WRITE(lu,*) ' '
330  npoin2 = npoin
331  nelem2 = nelem
332  WRITE(lu,*) 'THE INPUT FILE ASSUMED TO BE 2D'
333  dim_mesh = 2
334  ENDIF
335 !
336 ! NOW LET US ALLOCATE
337 !
338  ALLOCATE (ikles(nelem2*3),stat=ierr)
339  CALL check_allocate(ierr, 'IKLES')
340  IF(nplan.GT.1) THEN
341  ALLOCATE (ikles3d(nelem*ndp),stat=ierr)
342  CALL check_allocate(ierr, 'IKLES3D')
343  ENDIF
344  ALLOCATE (irand(npoin),stat=ierr)
345  CALL check_allocate(ierr, 'IRAND')
346 !
347 ! SIZE 3: FIRST TWO FUNCTIONS ARE X AND Y, 3 IS ALL OTHER
348 ! VARIABLES (THEY WILL BE COPIED AND WRITTEN
349 ! ONE AFTER THE OTHER...)
350 ! NPOIN IS 3D HERE IN 3D
351 !
352  ALLOCATE (f(npoin,2),stat=ierr)
353  CALL check_allocate(ierr, 'F')
354 !
355 ! CONNECTIVITY TABLE:
356 !
357  IF(nplan.LE.1) THEN
358  CALL get_mesh_connectivity(fformat,ninp,typ_elem,ikles,
359  & nelem,ndp,ierr)
360  CALL check_call(ierr,'PARTEL:GET_MESH_CONNECTIVITY:2D')
361  ELSE
362  CALL get_mesh_connectivity(fformat,ninp,typ_elem,ikles3d,
363  & nelem,ndp,ierr)
364  CALL check_call(ierr,'PARTEL:GET_MESH_CONNECTIVITY:3D')
365 ! BUILDING IKLES
366  DO j=1,3
367  DO k=1,nelem2
368  ikles((k-1)*3+j)=ikles3d((k-1)*6+j)
369  ENDDO
370  ENDDO
371  ENDIF
372 !
373 ! BOUNDARY NODES INDICATIONS
374 !
375  CALL get_bnd_ipobo(fformat,ninp,npoin,nptfr,typ_bnd_elem,
376  & irand,ierr)
377  CALL check_call(ierr,'PARTEL:GET_BND_IPOBO:NINP')
378 !
379 ! IRAND IS NOT ALWAYS CORRECT AND MAY LEAD TO ERRORS
380 ! THE BO0UNDARY FILE IS USED INSTEAD
381 !
382 ! X-, Y-COORDINATES
383 !
384  CALL get_mesh_coord(fformat,ninp,1,2,npoin,f(:,1),ierr)
385  CALL check_call(ierr,'PARTEL:GET_MESH_COORD:X')
386  CALL get_mesh_coord(fformat,ninp,2,2,npoin,f(:,2),ierr)
387  CALL check_call(ierr,'PARTEL:GET_MESH_COORD:Y')
388 !
389  CALL get_data_ntimestep(fformat,ninp,ntimestep,ierr)
390  CALL check_call(ierr,'PARTEL:GET_DATA_NTIMESTEP')
391 !
392  WRITE(lu,*) 'THERE ARE ',ntimestep,' TIME-DEPENDENT RECORDINGS'
393 !
394 !----------------------------------------------------------------------
395 !
396 ! READ THE BOUNDARY CONDITIONS FILE
397 !
398  !
399  CALL get_nodes_per_element(typ_bnd_elem,ndp_bnd)
400  ! GET THE NUMBER OF BOUNDARY POINTS AND ELEMENTS
401  CALL get_bnd_nelem(fformat,ninp,typ_bnd_elem,nelebd,ierr)
402  CALL check_call(ierr,'PARTEL:GET_BND_NELEBD:NCLI')
403  CALL get_bnd_npoin(fformat,ninp,typ_bnd_elem,nptfr,ierr)
404  CALL check_call(ierr,'PARTEL:GET_BND_NPOIN:NCLI')
405  !
406  ALLOCATE(ikle_bnd(nelebd*ndp_bnd),stat=ierr)
407  CALL check_allocate(ierr,'PARTEL:IKLE_BND')
408  ALLOCATE(nbor(nptfr),stat=ierr)
409  CALL check_allocate(ierr,'PARTEL:NBOR')
410  ! ALLOCATING ARRAY FOR THE BOUNDARY CONDITIONS
411  ALLOCATE(lihbor(nptfr),stat=ierr)
412  CALL check_allocate(ierr,'PARTEL:LIHBOR')
413  ALLOCATE(liubor(nptfr),stat=ierr)
414  CALL check_allocate(ierr,'PARTEL:LIUBOR')
415  ALLOCATE(livbor(nptfr),stat=ierr)
416  CALL check_allocate(ierr,'PARTEL:LIVBOR')
417  ALLOCATE(hbor(nptfr),stat=ierr)
418  CALL check_allocate(ierr,'PARTEL:HBOR')
419  ALLOCATE(ubor(nptfr),stat=ierr)
420  CALL check_allocate(ierr,'PARTEL:UBOR')
421  ALLOCATE(vbor(nptfr),stat=ierr)
422  CALL check_allocate(ierr,'PARTEL:VBOR')
423  ALLOCATE(chbord(nptfr),stat=ierr)
424  CALL check_allocate(ierr,'PARTEL:CHBORD')
425  ALLOCATE(litbor(nptfr),stat=ierr)
426  CALL check_allocate(ierr,'PARTEL:LITBOR')
427  ALLOCATE(tbor(nptfr),stat=ierr)
428  CALL check_allocate(ierr,'PARTEL:TBOR')
429  ALLOCATE(atbor(nptfr),stat=ierr)
430  CALL check_allocate(ierr,'PARTEL:ATBOR')
431  ALLOCATE(btbor(nptfr),stat=ierr)
432  CALL check_allocate(ierr,'PARTEL:BTBOR')
433  ALLOCATE (color(nptfr),stat=ierr)
434  CALL check_allocate(ierr, 'COLOR')
435  ! Get the connectivity table for the boundary elements
436  CALL get_bnd_connectivity(fformat,ninp,typ_bnd_elem,nelebd,
437  & ndp_bnd,ikle_bnd,ierr)
438  CALL check_call(ierr,'PARTEL:GET_BND_CONNECTIVITY:NCLI')
439  ! FILL NBOR
440  CALL get_bnd_numbering(fformat,ninp,typ_bnd_elem,nptfr,nbor,ierr)
441  ! GET THE VALUE OF EACH BOUNDARY
442  CALL get_bnd_value(fformat,ninp,typ_bnd_elem,nelebd,
443  & lihbor,liubor,
444  & livbor,hbor,ubor,vbor,chbord,.true.,
445  & litbor,tbor,atbor,btbor,nptfr,ierr)
446  CALL check_call(ierr,'PARTEL:GET_BND_VALUE:NCLI')
447  CALL get_bnd_color(fformat,ninp,typ_bnd_elem,nelebd,
448  & color,ierr)
449  CALL check_call(ierr,'PARTEL:GET_BND_COLOR:NCLI')
450 !
451  CALL numbering_open_boundaries(nameinp, ikle, ikles, kp1bor,
452  & numliq, dim_mesh, npoin2, nptfr, npoin, nelem2,
453  & nelbor, liubor, lihbor, nbor, ifabor, f,.true.)
454 !
455 !======================================================================
456 ! PARTITIONING
457 !
458 !
459 !
460 !======================================================================
461 ! STEP 2 : PARTITIONING THE MESH
462 !
463 ! OTHER PARTITIONING METHODS SHOULD BE USED (SCOTCH FOR EXAMPLE)
464 ! ALL PROCESSORS PERFORM THIS TASK TO AVOID COMMUNICATION
465 ! THE USE OF PARMETIS OR PTSCOTCH COULD BE USED FOR LARGER MESHES
466 ! IF THERE WILL BE SOME MEMORY ALLOCATION PROBLEM
467 !======================================================================
468 !
469  ALLOCATE(epart(nelem2),stat=ierr)
470  CALL check_allocate(ierr, 'EPART')
471  ALLOCATE(npart(npoin2),stat=ierr)
472  CALL check_allocate(ierr, 'NPART')
473 !
474 ! PARTITIONNING METHOD
475 ! 1 : METIS
476 ! 2 : SCOTCH
477  WRITE(lu,*) ' THE MESH PARTITIONING STEP STARTS'
478  IF(timecount) THEN
479 ! CALL SYSTEM_CLOCK (COUNT=TEMPS, COUNT_RATE=PARSEC)
480  tdebp = temps
481  ENDIF
482  CALL partitioner(pmethod, nelem2, npoin2, 3, nparts,
483  & ikles, epart, npart)
484  IF (timecount) THEN
485 ! CALL SYSTEM_CLOCK (COUNT=TEMPS, COUNT_RATE=PARSEC)
486  tfinp = temps
487  WRITE(lu,*) ' RUNTIME OF METIS ',
488  & (1.0*(tfinp-tdebp))/(1.0*parsec),' SECONDS'
489  ENDIF
490  WRITE(lu,*) ' THE MESH PARTITIONING STEP HAS FINISHED'
491 !
492 !
493 !----------------------------------------------------------------------
494 !
495 !======================================================================
496 ! STEP 3 : ALLOCATE THE GLOBAL ARRAYS NOT DEPENDING OF THE PARTITION
497 !
498 !======================================================================
499 !
500 ! KNOGL(I) => GLOBAL LABEL OF THE LOCAL POINT I
501 !
502  CALL hash_table_create(knogl, 2**20)
503 !
504 ! NBRE_EF(I) => NUMBER OF FINITE ELEMENT CONTAINING I
505 ! I IS A GLOBAL LABEL
506  ALLOCATE (nbre_ef(npoin2),stat=ierr)
507  CALL check_allocate(ierr, 'NBRE_EF')
508 !
509  ALLOCATE (part_p(npoin2,0:nbmaxnshare),stat=ierr)
510  CALL check_allocate(ierr, 'PART_P')
511  part_p(:,:)=0
512 
513  CALL hash_table_create(cut_p, 2**20)
514 
515  CALL hash_table_create(gelegl, nelem2)
516 
517  ALLOCATE (sort(npoin2),stat=ierr)
518  CALL check_allocate(ierr, 'SORT')
519 
520  ALLOCATE (cut(npoin2),stat=ierr)
521  CALL check_allocate(ierr, 'CUT')
522 
523  ALLOCATE (nelem_p(nparts),stat=ierr)
524  CALL check_allocate(ierr, 'NELEM_P')
525 
526  ALLOCATE (npoin_p(nparts),stat=ierr)
527  CALL check_allocate(ierr, 'NPOIN_P')
528 
529  ALLOCATE (nptfr_p(nparts),stat=ierr)
530  CALL check_allocate(ierr, 'NPTFR_P')
531 
532  ALLOCATE (nptir_p(nparts),stat=ierr)
533  CALL check_allocate(ierr, 'NPTIR_P')
534 
535  ALLOCATE (nhalo(nparts),stat=ierr)
536  CALL check_allocate(ierr, 'NHALO')
537 
538  ALLOCATE(tab_tmp( nbmaxnshare),stat=ierr)
539  CALL check_allocate(ierr, 'TAB_TMP')
540 
541  ALLOCATE(ifapar(7,nbmaxhalo),stat=ierr)
542  CALL check_allocate(ierr, 'IFAPAR')
543  ifapar(:,:)=0
544 !
545 !======================================================================
546 ! STEP 4 : COMPUTE THE NUMBER OF FINITE ELEMENTS AND POINTS
547 ! BELONGING TO SUBMESH I
548 !
549 !======================================================================
550 !
551 
552 ! FIRSTLY, ALL MPI PROCESSES WORK ON THE WHOLE MESH
553 ! ----------------------------------------------
554 !
555 ! LOOP OVER THE FINITE ELEMENT OF THE MESH
556 ! TO COMPUTE THE NUMBER OF FINITE ELEMENTS CONTAINING EACH POINT NOEUD
557  IF (code(1:3) == 'ART') THEN
558  DO ef=1,nelem2
559  DO k=1,ndp_2d
560  noeud=ikles((ef-1)*3+k)
561  IF (irand(noeud) .NE. 0) THEN
562  epart(ef)=1
563  END IF
564  END DO
565  END DO
566  END IF
567 
568  nbre_ef(:)=0
569  DO ef=1,nelem2
570  DO k=1,ndp_2d
571  noeud=ikles((ef-1)*3+k)
572  nbre_ef(noeud)=nbre_ef(noeud)+1
573  END DO
574  END DO
575 !
576 ! LOOP OVER THE FINITE ELEMENT OF THE MESH TO COMPUTE
577 ! THE NUMBER OF THE FINITE ELEMENT AND POINTS BELONGING
578 ! TO SUBMESH I
579 !
580  nelem_p=0
581  npoin_p=0
582  DO ef=1,nelem2
583  i = epart(ef)
584  IF(i >= 1 .AND. i <= nparts) THEN
585  nelem_p(i)=nelem_p(i)+1
586  DO k=1,ndp_2d
587  noeud=ikles((ef-1)*3+k)
588  IF (hash_table_get(knogl,noeud,i) .EQ. 0) THEN
589  npoin_p(i)=npoin_p(i)+1
590  CALL hash_table_insert(knogl,noeud,i,npoin_p(i))
591  END IF
592  END DO
593  END IF
594  END DO
595 !
596 !======================================================================
597 ! STEP 4 : ALLOCATION OF LOCAL ARRAYS NEEDED BY MPI PROCESSUS ID
598 ! WORKING ON SUBMESH ID+1
599 !======================================================================
600 !
601  max_nelem_p=maxval(nelem_p)
602  max_npoin_p=maxval(npoin_p)
603 !
604 ! ELEGL(E) => GLOBAL LABEL OF THE FINITE ELEMENT E
605 ! E IS THE LOCAL LABEL ON SUBMESH I
606  ALLOCATE (elelg(max_nelem_p,nparts),stat=ierr)
607  CALL check_allocate(ierr, 'ELELG')
608  elelg(:,:)=0
609 ! KNOLG(I) => GLOBAL LABEL OF THE POINT I
610 ! I IS THE LOCAL LABEL ON SUBDOMAIN I
611  IF(nplan.LE.0) THEN
612  ALLOCATE(knolg(max_npoin_p,nparts),stat=ierr)
613  ELSE
614  ALLOCATE(knolg(max_npoin_p*nplan,nparts),stat=ierr)
615  ENDIF
616  CALL check_allocate(ierr, 'KNOLG')
617  knolg(:,:)=0
618 !
619 ! EF_I(E) IS THE GLOBAL LABEL OF THE INTERFACE FINITE ELEMENT NUMBER E
620  ALLOCATE (ef_i(nparts, max_nelem_p),stat=ierr)
621  CALL check_allocate(ierr, 'EF_I')
622 ! EF_II(E) IS THE LOCAL LABEL OF THE INTERFACE FINITE ELEMENT NUMBER E
623  ALLOCATE (ef_ii(nparts, max_nelem_p),stat=ierr)
624  CALL check_allocate(ierr, 'EF_II')
625 !
626 !======================================================================
627 ! STEP 5 : INITIALISATION OF LOCAL ARRAYS
628 ! (GELELG AND ELELG)
629 !======================================================================
630 !
631  nelem_p=0
632  DO ef=1,nelem2
633  i=epart(ef)
634  IF(i >= 1 .AND. i <= nparts) THEN
635  nelem_p(i)=nelem_p(i)+1
636  elelg(nelem_p(i),i)=ef
637  CALL hash_table_insert(gelegl,ef,i,nelem_p(i))
638  ENDIF
639  ENDDO
640 !
641  CALL compute_boundary_and_interface(nparts,ndp_2d,npoin_p,
642  & nptfr_p, elelg,
643  & nelem_p,ikles,knogl,cut_p,ef_i
644  & ,ef_ii,nptir_p,nbre_ef_i,knolg
645  & ,irand,part_p,nbre_ef)
646 
647 !
648  max_n_neigh=maxval(part_p(:,0))
649  IF ( max_n_neigh > nbmaxnshare-1 ) THEN
650  WRITE(lu,*) 'SERIOUS WARNING: '
651  WRITE(lu,*)
652  & 'AN INTERFACE NODE BELONGS TO ',
653  & 'MORE THAN NBMAXNSHARE-1 SUBDOMAINS'
654  WRITE(lu,*) 'TELEMAC MAY PROTEST!'
655  ENDIF
656  IF(max_n_neigh.GT.maxnproc) THEN
657  WRITE (lu,*) 'THERE IS A NODE WHICH BELONGS TO MORE THAN ',
658  & maxnproc,' PROCESSORS, HOW COME?'
659  CALL plante(1)
660  stop
661  ENDIF
662  IF (max_n_neigh.LT.nbmaxnshare-1) max_n_neigh = nbmaxnshare-1
663 !
664  IF(partel_concat)THEN
665  IF (code.NE.' ') THEN
666  nameclm = code//'PAR'//'-CONCAT'
667  nameclm_idx = code//'PAR'//'-INDEX'
668  ELSE
669  nameclm = namecli(1:3)//'PAR'//'-CONCAT'
670  nameclm_idx = namecli(1:3)//'PAR'//'-INDEX'
671  ENDIF
672  CALL get_free_id(nclm)
673  OPEN(nclm,file=nameclm,status='UNKNOWN',form='FORMATTED')
674  rewind(nclm)
675  CALL get_free_id(nclm_idx)
676  OPEN(nclm_idx,file=nameclm_idx,action='WRITE')
677  offset_begin=1
678  offset_end=1
679  ENDIF
680  DO i=1,nparts
681  written_lines=1
682 !
683 ! FIRST LOOP TO COMPUTE THE NUMBER OF HALO TO ALLOCATE IFAPAR
684 !
685 ! FILLING IFAPAR
686 !
687  nhalo(i)=0
688  DO j=1,nbre_ef_i(i) ! ON PARCOURT JUSTE LES ELEMENTS FINIS INTERFACES POUR
689  ! DETERMINER DES HALO
690  ef=ef_i(i, j)
691  halo=.false.
692  ifaloc(:)=ifabor(ef,:)
693  WHERE (ifaloc .GT. 0)
694  ifaloc=epart(ifaloc)
695  END WHERE
696  halo=any(ifaloc .GT. 0 .AND. ifaloc .NE. i)
697  IF(halo) THEN
698  nhalo(i)=nhalo(i)+1
699  IF(nhalo(i) > nbmaxhalo) THEN
700  WRITE(lu,*) 'ERROR : NBMAXHALO TOO SMALL'
701  CALL plante(1)
702  stop
703  ENDIF
704  ifapar(1,nhalo(i))=ef_ii(i, j)
705  ifapar(2:4,nhalo(i))=ifaloc(:)
706  ifapar(5:7,nhalo(i))=ifabor(ef_i(i, j),:)
707  ENDIF
708  ENDDO
709 
710 !
711 !-----------------------------------------------------------------------
712 ! THE CORE NAMES FOR THE OUTPUT BC FILES ACCORDING TO THE NUMBER OF PARTS
713 !
714  ! WORKING ON THE PARALLEL INFORMATIONS
715  IF(dim_mesh.NE.3) THEN
716  IF (code.NE.' ') THEN
717  nameclm = code//'PAR'//extens(nparts-1,i-1)
718  ELSE
719  nameclm = namecli(1:3)//'PAR'//extens(nparts-1,i-1)
720  ENDIF
721  IF(.NOT. partel_concat)THEN
722  CALL get_free_id(nclm)
723  OPEN(nclm,file=nameclm,status='UNKNOWN',form='FORMATTED')
724  rewind(nclm)
725  ENDIF
726  WRITE(nclm,*) nptfr_p(i)
727 !
728 ! FILE OPENED, NOW WORK ON BOUNDARIES
729 ! -----------------------------------
730 !
731 ! WHEN THE BOUNDARY NODE BELONGS TO THIS SUBDOMAIN IT WILL BE TAKEN
732 ! J IS THE RUNNING BOUNDARY NODE NUMBER
733 !
734  j = 0
735  l = 0
736 !
737  DO k=1,npoin_p(i)
738  IF(irand(knolg(k,i)).NE.0) THEN
739  l = l + 1
740  ENDIF
741  ENDDO
742  DO k=1,nptfr
743 !
744 ! BOUNDARY NODES BELONGING TO THIS PARTITION
745 !
746  temp=hash_table_get(knogl,nbor(k),i)
747  IF(temp.NE.0) THEN
748  j = j + 1
749  iseg = 0
750  xseg = 0.0
751  yseg = 0.0
752 !
753 ! IF THE ORIGINAL (GLOBAL) BOUNDARY LEADS FURTHER INTO
754 ! ANOTHER PARTITION THEN ISEG IS SET NOT EQUAL TO ZERO
755 ! THE NEXT NODE ALONG THE GLOBAL BOUNDARY HAS IPTFR = M
756 ! (BUT CHECK THE CASE THE CIRCLE CLOSES)
757 !
758  m = kp1bor(k,1)
759 !
760 ! NBOR_P CANNOT BE USED, IT IS NOT FULLY FILLED WITH DATA
761 !
762  iso = 0
763 ! CHECKING IF THE ADJACENT ELEMENT IS NOT IN THE
764 ! SUB-DOMAIN
765  IF (epart(nelbor(k)).NE.i) THEN
766 !
767  iseg = nbor(m)
768  xseg = REAL(f(iseg,1))
769  yseg = REAL(f(iseg,2))
770  iso = iso + 1
771  ENDIF
772 !
773  m = kp1bor(k,2)
774 !
775 ! SAME AS ABOVE, BUT PREVIOUS SEGMENT ,THUS M, NOT K
776  IF (epart(nelbor(m)).NE.i) THEN
777  iseg = -nbor(m)
778  xseg = REAL(f(-iseg,1))
779  yseg = REAL(f(-iseg,2))
780  iso = iso + 1
781  ENDIF
782 !
783 ! WHEN BOTH NEIGHBOURS BOUNDARY NODES BELONG TO ANOTHER PARTITION
784 !
785  IF (iso == 2) THEN
786  iseg = -9999
787  iso = 0
788  WRITE(lu,*) 'ISOLATED BOUNDARY POINT', nbor(k), temp
789  ENDIF
790 !
791 ! WRITE BOUNDARY PARALLEL INFORMATIOSN
792 ! CONCERNING THE NODE WHICH HAS BEEN RESEARCHED
793 !
794  WRITE (nclm,*) color(k), hash_table_get(knogl,nbor(k),i),
795  & iseg, xseg, yseg, numliq(k)
796  written_lines=written_lines+1
797  ENDIF
798 !
799  END DO
800 !
801 ! CHECKING THAT THERE IS NOT AN ERROR IN THE BOUNDARIES
802  IF(j.NE.nptfr_p(i)) THEN
803  WRITE(lu,*) 'ERROR IN BOUNDARIES J=',j
804  WRITE(lu,*) 'WHILE NPTFR_P(I)=',nptfr_p(i)
805  WRITE(lu,*) 'WHILE L=',l
806  CALL plante(1)
807  stop
808  ENDIF
809 
810 
811 !
812  fmt4='(I7)'
813  WRITE (nclm,*) nptir_p(i)
814  written_lines=written_lines+1
815  IF (max_n_neigh < nbmaxnshare-1) max_n_neigh = nbmaxnshare-1
816  fmt4='( (I7,1X))'
817  WRITE (fmt4(2:4),'(I3)') max_n_neigh+1
818 !
819 ! SORTING NODE NUMBERS TO SORT(J) SO THAT CUT_P(SORT(J)) IS ORDERED
820 ! CUT IS OVERWRITTEN NOW
821 !
822  DO j=1,nptir_p(i)
823  cut(j)=hash_table_get(cut_p, j, i)
824  ENDDO
825 !
826 ! IF A NODE HAS BEEN ALREADY FOUND AS MIN, CUT(NODE) GETS 0
827 !
828  DO j=1,nptir_p(i)
829  idum = npoin2+1 ! LARGEST POSSIBLE NODE NUMBER + 1
830  k=0
831  401 CONTINUE
832  k = k + 1
833  temp=hash_table_get(cut_p,k,i)
834  IF ( cut(k) /= 0 .AND. temp < idum ) THEN
835  sort(j) = k
836  idum = temp
837  ENDIF
838  IF ( k < nptir_p(i) ) THEN
839  GOTO 401
840  ELSE
841  cut(sort(j)) = 0
842  ENDIF
843  ENDDO
844 !
845  DO j=1,nptir_p(i)
846  tab_tmp=0
847  l=0
848  DO k=1,max_n_neigh
849  temp=hash_table_get(cut_p,sort(j),i)
850  IF(part_p(temp,k) .NE. i .AND.part_p(temp,k) .NE. 0) THEN
851  l=l+1
852  tab_tmp(l)=part_p(temp, k)
853  ENDIF
854  ENDDO
855  WRITE(nclm,fmt=fmt4)
856  & hash_table_get(knogl,temp,i),(tab_tmp(k)-1, k=1,max_n_neigh)
857  ENDDO
858  written_lines=written_lines+nptir_p(i)
859 ! !
860  DO j=1,nhalo(i)
861  DO m=0,2
862  IF (ifapar(2+m,j)>0) THEN
863  ifapar(5+m,j)=hash_table_get(gelegl,ifapar(5+m,j),
864  & ifapar(2+m,j))
865  END IF
866  ENDDO
867  ENDDO
868  DO j=1,nhalo(i)
869  DO m=0,2
870  IF (ifapar(2+m,j)>0) THEN
871  ifapar(2+m,j)=ifapar(2+m,j)-1
872  END IF
873  ENDDO
874  ENDDO
875 !
876  WRITE(nclm,'(I9)') nhalo(i)
877  DO k=1,nhalo(i)
878  WRITE (nclm,'(7(I9,1X))') ifapar(:,k)
879  END DO
880  written_lines=written_lines+nhalo(i)+1
881 !
882  IF(partel_concat)THEN
883  offset_end=offset_end+written_lines
884  WRITE(nclm_idx,*)offset_begin
885  offset_begin=offset_end
886  ELSE
887  CLOSE(nclm)
888  ENDIF
889  !
890  ENDIF
891  END DO
892  IF(partel_concat)THEN
893  CLOSE(nclm)
894  CLOSE(nclm_idx)
895  ENDIF
896 !
897  DEALLOCATE(ifapar)
898  DEALLOCATE(part_p)
899  DEALLOCATE(numliq)
900  DEALLOCATE(tab_tmp)
901  CALL hash_table_destroy(gelegl)
902  DEALLOCATE(cut)
903  CALL hash_table_destroy(cut_p)
904  DEALLOCATE(sort)
905 !
906  ALLOCATE(ikles_p(max_nelem_p*3),stat=ierr)
907  IF(nplan.GT.1) THEN
908  ALLOCATE(ikles3d_p(6,max_nelem_p,nplan-1),stat=ierr)
909  ENDIF
910  CALL check_allocate(ierr, 'IKLES3D_P')
911 !
912  CALL init_dataval(dataval, npoin, nvar, ntimestep, fformat,
913  & ninp, variable)
914 !
915  CALL write_solutions(fformat,nbor, knogl,ndp_bnd,nelebd,ninp,
916  & nplan,ikles,times,knolg, date,nelem_p,
917  & npoin_p,nptfr_p,ubor,hbor,chbord,tbor,vbor,
918  & btbor,atbor,liubor,lihbor,litbor,livbor,
919  & dataval,ikle_bnd,elelg,typ_elem,time,title,
920  & nvar,ntimestep,nptfr,npoin2,nparts,npoin,
921  & nout,ndp,f,variable,typ_bnd_elem,
922  & nptir_p,nameinp,namecli,color)
923 
924  DEALLOCATE(nbor)
925  DEALLOCATE(lihbor)
926  DEALLOCATE(liubor)
927  DEALLOCATE(livbor)
928  DEALLOCATE(hbor)
929  DEALLOCATE(ubor)
930  DEALLOCATE(vbor)
931  DEALLOCATE(chbord)
932  DEALLOCATE(litbor)
933  DEALLOCATE(tbor)
934  DEALLOCATE(atbor)
935  DEALLOCATE(btbor)
936  DEALLOCATE(dataval)
937  DEALLOCATE(color)
938 ! -------------------------------------------------------------------
939 ! //// JAJ: LA FINITA COMMEDIA FOR PARALLEL CHARACTERISTICS, BYE!
940 !----------------------------------------------------------------------
941 ! !JAJ #### DEAL WITH SECTIONS
942 !
943  with_sections = namesec(1:1) .NE. ' '
944  IF (nplan.NE.0) with_sections=.false.
945  IF (with_sections) THEN ! PRESENTLY, FOR TELEMAC2D, EV. SISYPHE
946 !
947  WRITE(lu,*) 'DEALING WITH SECTIONS WITH FILE ',trim(namesec)
948  CALL handle_sections(namesec, nparts, nelem, ndp, ikle, npoin,
949  & f, knogl)
950  WRITE(lu,*) 'FINISHED DEALING WITH SECTIONS'
951 !
952  ENDIF ! NPLAN==0
953 
954 ! !YA #### DEAL WITH ZONES
955 !
956 !----------------------------------------------------------------------
957 !
958  with_zones = namezfi(1:1) .NE. ' '
959  IF (nplan.NE.0) with_zones = .false.
960  IF(with_zones) THEN
961 !
962  WRITE(lu,*) 'DEALING WITH ZONES WITH FILE ',trim(namezfi)
963  CALL handle_friction_zones(namezfi, nparts, npoin, npoin_p,
964  & max_npoin_p, knolg)
965  WRITE(lu,*) 'FINISHED DEALING WITH ZONES'
966 !
967  ENDIF ! WITH_ZONES
968 !
969 ! !CCT #### DEAL WITH WEIRS
970 !
971 !----------------------------------------------------------------------
972 !
973  with_weirs = nameseu(1:1) .NE. ' '
974  IF (nplan.NE.0) with_weirs = .false.
975  IF(with_weirs) THEN
976 !
977  WRITE(lu,*) 'DEALING WITH WEIRS WITH FILE ',trim(nameseu)
978  CALL handle_weirs(nameseu, nparts, knogl, npoin2)
979  WRITE(lu,*) 'FINISHED DEALING WITH WEIRS'
980 !
981  ENDIF ! WITH_WEIRS
982 !
983 !----------------------------------------------------------------------
984 !
985  DEALLOCATE (ikle) ! #### MOVED FROM FAR ABOVE
986  DEALLOCATE(npart)
987  DEALLOCATE(epart)
988  DEALLOCATE(npoin_p)
989  DEALLOCATE(nelem_p)
990  DEALLOCATE(nptfr_p)
991  DEALLOCATE(nptir_p)
992 !
993  DEALLOCATE(ikles)
994  IF(nplan.GT.1) THEN
995  DEALLOCATE(ikles3d)
996  DEALLOCATE(ikles3d_p)
997  ENDIF
998  DEALLOCATE(ikles_p)
999  DEALLOCATE(irand)
1000  DEALLOCATE(f)
1001 !
1002  DEALLOCATE(knolg)
1003  CALL hash_table_destroy(knogl)
1004  DEALLOCATE(elelg)
1005  DEALLOCATE(kp1bor)
1006  DEALLOCATE(variable)
1007 !
1008 !----------------------------------------------------------------------
1009 !
1010  IF (timecount) THEN
1011  CALL system_clock (count=temps, count_rate=parsec)
1012  tfin = temps
1013  WRITE(lu,*) 'OVERALL TIMING: ',
1014  & (1.0*(tfin-tdeb))/(1.0*parsec),' SECONDS'
1015  WRITE(lu,*) ' '
1016  ENDIF
1017 !
1018  WRITE(lu,*) '+---- PARTEL: NORMAL TERMINATION ----+'
1019  WRITE(lu,*) ' '
1020 !
1021 !----------------------------------------------------------------------
1022 !
1023  END SUBROUTINE partel
subroutine get_bnd_npoin(FFORMAT, FID, TYPE_BND_ELEM, NPTFR, IERR)
Definition: get_bnd_npoin.f:7
subroutine handle_sections(NAMESEC, NPARTS, NELEM, NDP, IKLE, NPOIN, F, KNOGL)
subroutine hash_table_create(HT, TABLE_SIZE)
subroutine get_bnd_connectivity(FFORMAT, FID, TYP_BND_ELEM, NELEBD, NDP, IKLE_BND, IERR)
subroutine get_bnd_color(FFORMAT, FID, TYP_BND_ELEM, NELEBD, COLOR, IERR)
Definition: get_bnd_color.f:7
subroutine get_data_var_list(FFORMAT, FID, NVAR, VARLIST, UNITLIST, IERR)
integer, parameter maxnproc
subroutine partel(NAMEINP, NAMECLI, NPARTS, PMETHOD, FFORMAT, NAMESEC, NAMEZFI, NAMESEU)
Definition: partel.F:7
subroutine compute_boundary_and_interface(NPARTS, NDP_2D, NPOIN_P, NPTFR_P, ELELG, NELEM_P, IKLES, KNOGL, CUT_P, EF_I, EF_II, NPTIR_P, NBRE_EF_I, KNOLG, IRAND, PART_P, NBRE_EF)
subroutine numbering_open_boundaries(NAMEINP, IKLE, IKLES, KP1BOR, NUMLIQ, DIM_MESH, NPOIN2, NPTFR, NPOIN, NELEM2, NELBOR, LIUBOR, LIHBOR, NBOR, IFABOR, F, LISTIN)
subroutine get_bnd_ipobo(FFORMAT, FID, NPOIN, NELEBD, TYP_BND_ELEM, IPOBO, IERR)
Definition: get_bnd_ipobo.f:7
subroutine handle_friction_zones(NAMEZFI, NPARTS, NPOIN, NPOIN_P, MAX_NPOIN_P, KNOLG)
subroutine get_bnd_nelem(FFORMAT, FID, TYPE_BND_ELEM, NELEM, IERR)
Definition: get_bnd_nelem.f:7
subroutine read_mesh_info(FFORMAT, NFIC, TITLE, NVAR, NPOIN, TYP_ELEM, NELEM, NPTFR, NPTIR, NDP, NPLAN, X_ORIG, Y_ORIG, TYP_BND_ELEM, NELEBD)
Definition: read_mesh_info.f:8
character(len=3) code
integer, parameter nbmaxhalo
Y. AUDOUIN & J-M HERVOUET (EDF LAB, LNHE) 09/05/2014 V7P0 First version.
integer function hash_table_get(HT, X, Y)
subroutine write_solutions(FFORMAT, NBOR, KNOGL, NDP_BND, NELEBD, NINP, NPLAN, IKLES, TIMES, KNOLG, DATE, NELEM_P, NPOIN_P, NPTFR_P, UBOR, HBOR, CHBORD, TBOR, VBOR, BTBOR, ATBOR, LIUBOR, LIHBOR, LITBOR, LIVBOR, DATAVAL, IKLE_BND, ELELG, TYP_ELEM, TIME, TITLE, NVAR, NTIMESTEP, NPTFR, NPOIN2, NPARTS, NPOIN, NOUT, NDP, F, VARIABLE, TYP_BND_ELEM, NPTIR_P, NAMEINP, NAMECLI, COLOR)
subroutine hash_table_destroy(HT)
subroutine get_bnd_numbering(FFORMAT, FID, TYP_BND_ELEM, NPTFR, NBOR, IERR)
subroutine get_mesh_date(FFORMAT, FID, DATE, IERR)
Definition: get_mesh_date.f:7
subroutine init_dataval(DATAVAL, NPOIN, NVAR, NTIMESTEP, FFORMAT, NINP, VARIABLE)
recursive subroutine hash_table_insert(HT, X, Y, V)
subroutine handle_weirs(NAMESEU, NPARTS, KNOGL, NPOIN2)
subroutine get_mesh_coord(FFORMAT, FID, JDIM, NDIM, NPOIN, COORD, IERR)
Definition: get_mesh_coord.f:7
subroutine get_bnd_value(FFORMAT, FID, TYP_BND_ELEM, NELEBD, LIHBOR, LIUBOR, LIVBOR, HBOR, UBOR, VBOR, CHBORD, TRAC, LITBOR, TBOR, ATBOR, BTBOR, NPTFR, IERR)
Definition: get_bnd_value.f:9
subroutine get_mesh_connectivity(FFORMAT, FID, TYP_ELEM, IKLE, NELEM, NDP, IERR)
subroutine open_mesh(FFORMAT, FILE_NAME, FILE_ID, OPENMODE, IERR, MESH_NUMBER)
Definition: open_mesh.f:7
subroutine open_bnd(FFORMAT, FILE_NAME, FILE_ID, OPENMODE, IERR, MESH_NUMBER)
Definition: open_bnd.f:7
subroutine get_data_ntimestep(FFORMAT, FID, NTIMESTEP, IERR)
Definition: bief.f:3