The TELEMAC-MASCARET system  trunk
partel_prelim.F
Go to the documentation of this file.
1 ! *********************
2  PROGRAM partel_prelim
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 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
74 !
76  IMPLICIT NONE
77 !
78 ! MAXIMUM GEOMETRICAL MULTIPLICITY OF A NODE (VARIABLE AUSSI
79 ! PRESENTE DANS LA BIEF, NE PAS CHANGER L'UNE SANS L'AUTRE)
80  INTEGER, PARAMETER :: NBMAXNSHARE = 10
81 !
82  INTEGER, PARAMETER :: MAXNPROC = 100000 ! MAX PARTITION NUMBER [00000..99999]
83  INTEGER, PARAMETER :: MAXADDCH = 10 ! MAX ADDED SUFFIX LENGTH
84  INTEGER, PARAMETER :: MAXVAR = 100 ! MAX NUMBER OF VARIABLES
85  INTEGER, PARAMETER :: MAXALLVARLENGTH = 3200 ! MAXVAR*32 FOR ALLVAR
86 !
87  INTEGER NVAR, NPLAN
88  INTEGER NELEM, NPOIN, NDP, NELEM2, NPOIN2, NDUM
89  INTEGER IB(10)
90 !
91  INTEGER, ALLOCATABLE :: IKLES(:)
92  INTEGER, ALLOCATABLE :: IKLES3D(:)
93  INTEGER, ALLOCATABLE :: IRAND(:)
94 !
95  REAL, ALLOCATABLE :: F(:,:)
96 !
97  REAL TIMES
98 !
99  INTEGER :: NINP=10
100  INTEGER TIME(3), DATE(3)
101 !
102  CHARACTER(LEN=80) :: TITLE
103  CHARACTER(LEN=32) :: VARI
104  CHARACTER(LEN=PATH_LEN) :: NAMEINP
105 !
106  INTEGER I, J, K, ERR
107  INTEGER ISTOP, ISTART, ILOOP
108  INTEGER I_LEN, I_S, I_SP, I_LENINP
109 !
110  LOGICAL IS
111 !
112 ! METISOLOGY
113 !
114  INTEGER NPARTS
115  INTEGER, ALLOCATABLE :: EPART(:), NPART(:)
116 !
117 !----------------------------------------------------------------------
118 !
119  lng=2 ! JE NE PARLE FRANCAIS, JE SUIS BARBARIEN
120  lu=6 ! FORTRAN STANDARD OUPUT CHANNEL
121 !
122 ! INTRODUCE YOURSELF
123 !
124 ! IF (ID .EQ. 0) THEN
125 ! WRITE(LU,*) ' '
126 ! WRITE(LU,*) '+-------------------------------------------------+'
127 ! WRITE(LU,*) ' PRELIMINARY TASK FOR PARTEL '
128 ! WRITE(LU,*) ' PARALLEL VERSION DEVELOPPED BY '
129 ! WRITE(LU,*) ' CHRISTOPHE DENIS (SINETICS)'
130 ! WRITE(LU,*) ' PARTEL (C) COPYRIGHT 2000-2002 '
131 ! WRITE(LU,*) ' BUNDESANSTALT FUER WASSERBAU, KARLSRUHE'
132 ! WRITE(LU,*) ' '
133 ! WRITE(LU,*) ' METIS 4.0.1 (C) COPYRIGHT 1998 '
134 ! WRITE(LU,*) ' REGENTS OF THE UNIVERSITY OF MINNESOTA '
135 ! WRITE(LU,*) ' '
136 ! WRITE(LU,*) ' BIEF 5.9 (C) COPYRIGHT 2010 EDF'
137 ! WRITE(LU,*) '+-------------------------------------------------+'
138 ! WRITE(LU,*) ' LUN MAI 31 17:21:20 CEST 2010 '
139 ! WRITE(LU,*) ' '
140 ! WRITE(LU,*) '+-----------------------------------------------+'
141 ! END IF
142 !
143 !----------------------------------------------------------------------
144 ! NAMES OF THE INPUT FILES:
145  INQUIRE (file='RESULT_SEQ_METIS',exist=is)
146  IF (is) THEN
147  CALL plante(0)
148  stop
149  END IF
150  OPEN(unit=72,file='PARTEL.PAR')
151  READ(72,*) nameinp
152  READ(72,*)
153  READ(72,*) nparts
154  READ(72,*)
155  CLOSE(72)
156 !
157  INQUIRE (file=nameinp,exist=is)
158  IF (.NOT.is) THEN
159  WRITE (lu,'('' FILE DOES NOT EXIST: '',A30)') nameinp
160  CALL plante(1)
161  stop
162  END IF
163 !
164  i_s = len(nameinp)
165  i_sp = i_s + 1
166  DO i=1,i_s
167  IF (nameinp(i_sp-i:i_sp-i) .NE. ' ') EXIT
168  ENDDO
169  i_len=i_sp - i
170  i_leninp = i_len
171 !
172  IF (i_leninp > path_len) THEN
173  WRITE(lu,*) ' '
174  WRITE(lu,*) 'ATTENTION:'
175  WRITE(lu,*) 'THE NAME OF THE INPUT FILE:'
176  WRITE(lu,*) nameinp
177  WRITE(lu,*) 'IS LONGER THAN ',path_len,' CHARACTERS'
178  WRITE(lu,*) 'WHICH IS THE LONGEST APPLICABLE NAME FOR TELEMAC '
179  WRITE(lu,*) 'INPUT AND OUTPUT FILES. STOPPED. '
180  CALL plante(1)
181  stop
182  ENDIF
183 !
184  OPEN(ninp,file=nameinp,status='OLD',form='UNFORMATTED')
185  rewind ninp
186 !
187  READ (ninp) title
188  READ (ninp) i, j
189  nvar = i + j
190  istart = 42
191  DO i=1,nvar
192  READ(ninp) vari
193  DO j=1,32
194  IF(vari(j:j).EQ.' ') vari(j:j) = '-'
195  END DO
196  istop = istart+20
197  IF (istop.GT.maxallvarlength) THEN
198  WRITE(lu,*) 'VARIABLE NAMES TOO LONG FOR STRIN ALLVAR'
199  WRITE(lu,*) 'STOPPED.'
200  CALL plante(1)
201  stop
202  ENDIF
203  istart=istop+1
204  ENDDO
205 !
206 ! READ THE REST OF THE SELAFIN FILE
207 ! 10 INTEGERS, THE FIRST IS THE NUMBER OF RECORDS (TIMESTEPS)
208 !
209  READ (ninp) (ib(i), i=1,10)
210  IF (ib(8).NE.0.OR.ib(9).NE.0) THEN
211  WRITE(lu,*) 'THIS IS A PARTIAL OUTPUT FILE'
212  WRITE(lu,*) 'MAYBE MEET GRETEL BEFORE...'
213  ENDIF
214  nplan = ib(7)
215 !
216  IF (ib(10).EQ.1) THEN
217  READ(ninp) date(1), date(2), date(3), time(1), time(2), time(3)
218  ENDIF
219 !
220  READ (ninp) nelem,npoin,ndp,ndum
221  IF (nplan.GT.1) THEN
222  npoin2 = npoin/nplan
223  nelem2 = nelem/(nplan-1)
224  IF (mod(npoin,nplan).NE.0) THEN
225  WRITE (lu,*) 'BUT NPOIN2 /= NPOIN3/NPLAN!'
226  CALL plante(1)
227  stop
228  ENDIF
229  IF (mod(nelem,(nplan-1)).NE.0) THEN
230  WRITE (lu,*) 'BUT NELEM2 /= NELEM3/NPLAN!'
231  CALL plante(1)
232  stop
233  ENDIF
234  ELSE
235  npoin2 = npoin
236  nelem2 = nelem
237  ENDIF
238 !
239  IF (ndp.EQ.3) THEN
240 ! WRITE(LU,*) 'THE INPUT FILE ASSUMED TO BE 2D SELAFIN'
241  ELSEIF (ndp.EQ.6) THEN
242 ! WRITE(LU,*) 'THE INPUT FILE ASSUMED TO BE 3D SELAFIN'
243  ELSE
244 ! WRITE(LU,*) 'THE ELEMENTS ARE NEITHER TRIANGLES NOR PRISMS!'
245 ! WRITE(LU,*) 'NDP = ',NDP
246  CALL plante(1)
247  stop
248  ENDIF
249 !
250 ! NOW LET US ALLOCATE
251 !
252  ALLOCATE (ikles(nelem2*3),stat=err)
253  CALL check_allocate (err, 'IKLES')
254  IF(nplan.GT.1) THEN
255  ALLOCATE (ikles3d(nelem*ndp),stat=err)
256  CALL check_allocate (err, 'IKLES3D')
257  ENDIF
258  ALLOCATE (irand(npoin),stat=err)
259  CALL check_allocate (err, 'IRAND')
260 ! NVAR+2 : FIRST TWO FUNCTIONS ARE X AND Y
261 ! NPOIN IS 3D HERE IN 3D
262  ALLOCATE (f(npoin,nvar+2),stat=err)
263  CALL check_allocate (err, 'IRAND')
264 !
265 ! CONNECTIVITY TABLE:
266 !
267  IF(nplan.EQ.0) THEN
268  READ(ninp) ((ikles((k-1)*ndp+j),j=1,ndp),k=1,nelem)
269  ELSE
270  READ(ninp) ((ikles3d((k-1)*ndp+j),j=1,ndp),k=1,nelem)
271  DO j=1,3
272  DO k=1,nelem2
273  ikles((k-1)*3+j)=ikles3d((k-1)*6+j)
274  ENDDO
275  ENDDO
276  ENDIF
277 !
278  READ(ninp) (irand(j),j=1,npoin)
279  READ(ninp) (f(j,1),j=1,npoin)
280  READ(ninp) (f(j,2),j=1,npoin)
281 !
282  iloop = 0
283 ! DO
284 !
285 ! READ THE TIME STEP
286 !
287  READ(ninp) times
288  iloop = iloop + 1
289 !
290 ! READ THE TIME VARIABLES; NO 1 AND 2 ARE X,Y
291 !
292  DO k=3,nvar+2
293  READ(ninp) (f(j,k), j=1,npoin)
294  END DO
295 ! END DO
296 ! STOP
297  CLOSE (ninp)
298 !
299  ALLOCATE (epart(nelem2),stat=err)
300  CALL check_allocate (err, 'EPART')
301  ALLOCATE (npart(npoin2),stat=err)
302  CALL check_allocate (err, 'NPART')
303  !WRITE(*,*) NELEM2,NPOIN2,NPARTS
304 !
305  CALL partitioner(1, nelem2, npoin, 3, nparts, ikles, epart, npart)
306 !
307  OPEN(unit=256,file='RESULT_SEQ_METIS')
308  DO i=1,nelem2
309  WRITE(256,*) epart(i)
310  END DO
311 
312  !WRITE(*,*) 'END OF THE PRELIMINARY PART OF PARTEL'
313 !
314  END PROGRAM partel_prelim
program partel_prelim
Definition: partel_prelim.F:3
integer, parameter path_len