The TELEMAC-MASCARET system  trunk
stoseg51.f
Go to the documentation of this file.
1 ! *******************
2  SUBROUTINE stoseg51
3 ! *******************
4 !
5  &(ifabor,nelmax,ielm,ikle,nbor,
6  & gloseg,maxseg,eltseg,oriseg,nelbor,nulone,nelmax2,
7  & nelem2,nptfr2,npoin2,nplan,knolg,nseg2d,iklbor,neleb,nelebx)
8 !
9 !***********************************************************************
10 ! BIEF V7P0 25/03/2014
11 !***********************************************************************
12 !
13 !brief BUILDS THE DATA STRUCTURE FOR EDGE-BASED STORAGE
14 !+ OF PRISMS CUT INTO TETRAHEDRONS:
15 !+ GLOSEG, ELTSEG, ORISEG. GLOSEG must be already filled for
16 !+ horizontal segments of the first layer.
17 !code
18 !+ LOCAL NUMBERING OF SEGMENTS CHOSEN HERE IN THE ORIGINAL PRISM
19 !+
20 !+ HORIZONTAL
21 !+
22 !+ 01 : POINT 1 TO 2 (OR THE OPPOSITE DEPENDING OF ORISEG)
23 !+ 02 : POINT 2 TO 3 (OR THE OPPOSITE DEPENDING OF ORISEG)
24 !+ 03 : POINT 3 TO 1 (OR THE OPPOSITE DEPENDING OF ORISEG)
25 !+ 04 : POINT 4 TO 5 (OR THE OPPOSITE DEPENDING OF ORISEG)
26 !+ 05 : POINT 5 TO 6 (OR THE OPPOSITE DEPENDING OF ORISEG)
27 !+ 06 : POINT 6 TO 4 (OR THE OPPOSITE DEPENDING OF ORISEG)
28 !+
29 !+ VERTICAL
30 !+
31 !+ 07 : POINT 1 TO 4
32 !+ 08 : POINT 2 TO 5
33 !+ 09 : POINT 3 TO 6
34 !+
35 !+ CROSSED
36 !+
37 !+ 10 : POINT 1 TO 5 OR POINT 2 TO 4
38 !+ 11 : POINT 2 TO 6 OR POINT 3 TO 5
39 !+ 12 : POINT 3 TO 4 OR POINT 1 TO 6
40 !+
41 !+
42 !+ LOCAL NUMBERING OF SEGMENTS IN THE TETRAHEDRON (SEE ISEGT)
43 !+
44 !+ 01 : POINT 1 TO 2 (OR THE OPPOSITE DEPENDING OF ORISEG)
45 !+ 02 : POINT 2 TO 3 (OR THE OPPOSITE DEPENDING OF ORISEG)
46 !+ 03 : POINT 3 TO 1 (OR THE OPPOSITE DEPENDING OF ORISEG)
47 !+ 04 : POINT 1 TO 4 (OR THE OPPOSITE DEPENDING OF ORISEG)
48 !+ 05 : POINT 2 TO 4 (OR THE OPPOSITE DEPENDING OF ORISEG)
49 !+ 06 : POINT 3 TO 4 (OR THE OPPOSITE DEPENDING OF ORISEG)
50 !+
51 !+
52 !
53 !history J-M HERVOUET (LNHE)
54 !+ 24/08/2011
55 !+ V6P2
56 !+ Copied from STOSEG41 and modified.
57 !
58 !history J-M HERVOUET (EDF LAB, LNHE)
59 !+ 26/03/2014
60 !+ V7P0
61 !+ Boundary segments have now their own numbering, independent of
62 !+ boundary points numbering.
63 !
64 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
65 !| ELTSEG |<--| SEGMENTS OF EVERY TRIANGLE.
66 !| GLOSEG |<--| GLOBAL NUMBERS OF POINTS OF SEGMENTS.
67 !| IELM |-->| 11: TRIANGLES.
68 !| | | 21: QUADRILATERALS.
69 !| IFABOR |-->| ELEMENTS BEHIND THE EDGES OF A TRIANGLE
70 !| | | IF NEGATIVE OR ZERO, THE EDGE IS A LIQUID
71 !| | | BOUNDARY
72 !| IKLBOR |-->| CONNECTIVITY OF BOUNDARY SEGMENTS IN 2D
73 !| IKLE |-->| CONNECTIVITY TABLE.
74 !| KNOLG |-->| GLOBAL NUMBER OF A LOCAL POINT IN PARALLEL
75 !| MAXSEG |<--| MAXIMUM NUMBER OF SEGMENTS
76 !| NBOR |-->| GLOBAL NUMBERS OF BOUNDARY POINTS.
77 !| NELBOR |-->| NUMBER OF ELEMENT CONTAINING SEGMENT K OF
78 !| | | THE BOUNDARY.
79 !| NELEB |-->| NUMBER OF BOUNDARY ELEMENTS IN 2D.
80 !| NELEBX |-->| MAXIMUM NUMBER OF BOUNDARY ELEMENTS IN 2D.
81 !| NELEM2 |-->| NUMBER OF ELEMENTS IN 2D
82 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS IN 3D
83 !| NELMAX2 |-->| MAXIMUM NUMBER OF ELEMENTS IN 2D
84 !| NPLAN |-->| NUMBER OF PLANES IN THE 3D MESH OF PRISMS
85 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D
86 !| NPTFR2 |-->| NUMBER OF BOUNDARY POINTS IN 2D
87 !| NULONE |-->| LOCAL NUMBER OF BOUNDARY POINTS IN A BOUNDARY
88 !| | | ELEMENT.
89 !| | | HERE THE 3D NULONE IS PASSED THOUGH IT IS HERE
90 !| | | USED AS THE 2D ONE. HENCE BOTH MUST BEGIN BY
91 !| | | THE SAME BOUNDARY ELEMENTS OF THE LOWER PLANE.
92 !| ORISEG |<--| ORIENTATION OF SEGMENTS OF EVERY TRIANGLE.
93 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
94 !
95  USE bief, ex_stoseg51 => stoseg51
96  USE declarations_telemac, ONLY : isegt
97 !
99  IMPLICIT NONE
100 !
101 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
102 !
103  INTEGER, INTENT(IN) :: NELMAX,NELMAX2,MAXSEG,IELM,NELEBX,NELEB
104  INTEGER, INTENT(IN) :: NELEM2,NPTFR2,NPOIN2,NPLAN,NSEG2D
105  INTEGER, INTENT(IN) :: NBOR(nptfr2)
106  INTEGER, INTENT(IN) :: IKLBOR(nelebx,2)
107  INTEGER, INTENT(IN) :: IFABOR(nelmax2,*),IKLE(nelmax,4)
108  INTEGER, INTENT(IN) :: NELBOR(nelebx),NULONE(nelebx)
109  INTEGER, INTENT(INOUT) :: GLOSEG(maxseg,2)
110  INTEGER, INTENT(INOUT) :: ELTSEG(nelmax,6),ORISEG(nelmax,6)
111  INTEGER, INTENT(IN) :: KNOLG(*)
112 !
113 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
114 !
115  INTEGER I1,I2,I3,I4,I5,I6,IELEM,J1,J2,I,ISEG,II1,II2,II3
116  INTEGER ISEG01,ISEG02,ISEG03,ISEG04,ISEG05,ISEG06
117  INTEGER ISEG07,ISEG08,ISEG09,ISEG10,ISEG11,ISEG12
118  INTEGER IPLAN,ISEG2D,ISEG3D,IELEM3D,NSEGH,NSEGV
119 ! THE SIX SEGMENTS IN A TETRAHEDRON
120 ! ISEGT(ISEG,1 OR 2) : FIRST OR SECOND POINT OF SEGMENT ISEG
121 ! INTEGER ISEGT(6,2)
122 ! DATA ISEGT/1,2,3,1,2,3,2,3,1,4,4,4/
123 !
124 !-----------------------------------------------------------------------
125 !
126  IF(ielm.NE.51) THEN
127  WRITE(lu,501) ielm
128 501 FORMAT(1x,'STOSEG51 (BIEF): UNEXPECTED ELEMENT: ',1i6)
129  CALL plante(1)
130  stop
131  ENDIF
132 !
133 !-----------------------------------------------------------------------
134 !
135 ! BUILDS 2D SEGMENTS (THE FIRST IN THE NUMBERING)
136 !
137  nsegh=nseg2d*nplan
138  nsegv=(nplan-1)*npoin2
139 !
140 ! BUILDING 2D VALUES (THAT WILL COINCIDE WITH FIRST LAYER OF THE 3D
141 ! MESH). NOTE THAT NELMAX IS TRANSMITTED, A 3D VALUE, AND IT WILL
142 ! DIMENSION ELTSEG AND ORISEG AS ELTSEG(NELMAX,3) AND ORISEG(NELMAX,3)
143 ! IN STOSEG, SO THAT AFTER THE 3D ORISEG WILL BE PARTLY BUT CORRECTLY
144 ! FILLED. THE SAME IS DONE WITH GLOSEG, WITH DIMENSION MAXSEG
145 !
146 ! IKLBOR, NELBOR AND NULONE ARE HERE THE 2D VALUES (SEE INBIEF)
147 !
148  CALL stoseg(ifabor,nelem2,nelmax,nelmax2,11,ikle,nbor,nptfr2,
149  & gloseg,maxseg,eltseg,oriseg,nseg2d,
150  & nelbor,nulone,knolg,iklbor,nelebx,neleb)
151 !
152 !-----------------------------------------------------------------------
153 !
154 ! COMPLETES HORIZONTAL SEGMENTS (1,2,3,4,5,6 OF PRISMS)
155 ! SAME SEGMENTS AND SAME NUMBERING THAN WITH PRISMS
156 !
157  DO iplan=2,nplan
158  DO iseg2d=1,nseg2d
159  iseg3d=iseg2d+(iplan-1)*nseg2d
160  gloseg(iseg3d,1)=gloseg(iseg2d,1)+npoin2*(iplan-1)
161  gloseg(iseg3d,2)=gloseg(iseg2d,2)+npoin2*(iplan-1)
162  ENDDO
163  ENDDO
164 !
165 ! VERTICAL SEGMENTS (7,8,9 OF PRISMS)
166 ! SAME SEGMENTS AND SAME NUMBERING THAN WITH PRISMS
167 !
168  DO iplan=1,nplan-1
169  DO i=1,npoin2
170  iseg3d=nsegh+npoin2*(iplan-1)+i
171  gloseg(iseg3d,1)=npoin2*(iplan-1)+i
172  gloseg(iseg3d,2)=npoin2*(iplan )+i
173  ENDDO
174  ENDDO
175 !
176 !-----------------------------------------------------------------------
177 !
178 ! NOW COMPLETING ELTSEG AND ORISEG (THEY ARE ALREADY CORRECT FOR
179 ! THE TETRAHEDRONS WITH A SIDE ON THE BOTTOM, WHICH ARE THE FIRST
180 ! NELEM2 ELEMENTS
181 !
182 ! ALSO COMPLETING GLOSEG FOR CROSSED SEGMENTS
183 !
184 ! PRINCIPLE : NUMBERS OF SEGMENTS IN THE PRISM ARE KNOWN (ISEG01,...)
185 ! THEN WE LOOK AT TETRAHEDRA SEGMENTS AND LOOK FOR THE
186 ! CORRESPONDING SEGMENT IN THE PRISM. NOT VERY CONCISE
187 ! NOR CLEVER BUT EFFICIENT...
188 !
189 ! ARRAY ELTSEG GIVES GLOBAL NUMBERS OF SEGMENTS IN A PRISM
190 ! ARRAY ORISEG GIVES ORIENTATION OF SEGMENT
191 !
192 ! EVERY FORMER PRISM IS EXAMINED
193 !
194  DO iplan=1,nplan-1
195  DO ielem=1,nelem2
196 !
197 ! THE SIX GLOBAL NUMBERS OF POINTS IN THE PRISM
198 ! IKLE HAS BEEN BUILT SO THAT IT COINCIDES WITH IKLE2D ON THE
199 ! FIRST LAYER (SEE CPIKLE3).
200 !
201  ii1=ikle(ielem,1)
202  ii2=ikle(ielem,2)
203  ii3=ikle(ielem,3)
204  i1=ii1+(iplan-1)*npoin2
205  i2=ii2+(iplan-1)*npoin2
206  i3=ii3+(iplan-1)*npoin2
207  i4=i1+npoin2
208  i5=i2+npoin2
209  i6=i3+npoin2
210 !
211 ! GLOBAL NUMBERS OF THE 12 SEGMENTS IN THE PRISM
212 ! I.E. THE 12 DIFFERENT SEGMENTS FORMED BY TETRAHEDRONS
213 !
214 ! HORIZONTAL
215 ! HERE ELTSEG COMES OUT FROM STOSEG
216 ! AND HAS A TRIANGLE NUMBERING
217  iseg01=eltseg(ielem,1)+nseg2d*(iplan-1)
218  iseg02=eltseg(ielem,2)+nseg2d*(iplan-1)
219  iseg03=eltseg(ielem,3)+nseg2d*(iplan-1)
220  iseg04=iseg01+nseg2d
221  iseg05=iseg02+nseg2d
222  iseg06=iseg03+nseg2d
223 ! VERTICAL
224  iseg07=nsegh+i1
225  iseg08=nsegh+i2
226  iseg09=nsegh+i3
227 ! CROSSED (NUMBERED AS HORIZONTAL LOWER SEGMENTS IN PRISMS)
228  iseg10=nsegh+nsegv+iseg01
229  iseg11=nsegh+nsegv+iseg02
230  iseg12=nsegh+nsegv+iseg03
231 !
232 ! EVERY TETRAHEDRON IN THE PRISM
233 !
234  DO i=1,3
235 !
236 ! EVERY SEGMENT IN THE PRISM
237 !
238  DO iseg=1,6
239 ! SEE NUMBERING OF TETRAHEDRONS IN CPIKLE3
240  ielem3d=3*nelem2*(iplan-1)+(i-1)*nelem2+ielem
241  j1=ikle(ielem3d,isegt(iseg,1))
242  j2=ikle(ielem3d,isegt(iseg,2))
243 ! LOWER HORIZONTAL SEGMENTS
244  IF((j1.EQ.i1.AND.j2.EQ.i2).OR.
245  & (j1.EQ.i2.AND.j2.EQ.i1)) THEN
246  eltseg(ielem3d,iseg)=iseg01
247  IF(j1.EQ.i1) THEN
248 ! SAME SEGMENT SAME ORIENTATION THAN IN 2D
249  oriseg(ielem3d,iseg)=oriseg(ielem,1)
250  ELSE
251  oriseg(ielem3d,iseg)=3-oriseg(ielem,1)
252  ENDIF
253  ELSEIF((j1.EQ.i2.AND.j2.EQ.i3).OR.
254  & (j1.EQ.i3.AND.j2.EQ.i2)) THEN
255  eltseg(ielem3d,iseg)=iseg02
256  IF(j1.EQ.i2) THEN
257  oriseg(ielem3d,iseg)=oriseg(ielem,2)
258  ELSE
259  oriseg(ielem3d,iseg)=3-oriseg(ielem,2)
260  ENDIF
261  ELSEIF((j1.EQ.i3.AND.j2.EQ.i1).OR.
262  & (j1.EQ.i1.AND.j2.EQ.i3)) THEN
263  eltseg(ielem3d,iseg)=iseg03
264  IF(j1.EQ.i3) THEN
265  oriseg(ielem3d,iseg)=oriseg(ielem,3)
266  ELSE
267  oriseg(ielem3d,iseg)=3-oriseg(ielem,3)
268  ENDIF
269 ! UPPER HORIZONTAL SEGMENTS
270  ELSEIF((j1.EQ.i4.AND.j2.EQ.i5).OR.
271  & (j1.EQ.i5.AND.j2.EQ.i4)) THEN
272  eltseg(ielem3d,iseg)=iseg04
273  IF(j1.EQ.i4) THEN
274  oriseg(ielem3d,iseg)=oriseg(ielem,1)
275  ELSE
276  oriseg(ielem3d,iseg)=3-oriseg(ielem,1)
277  ENDIF
278  ELSEIF((j1.EQ.i5.AND.j2.EQ.i6).OR.
279  & (j1.EQ.i6.AND.j2.EQ.i5)) THEN
280  eltseg(ielem3d,iseg)=iseg05
281  IF(j1.EQ.i5) THEN
282  oriseg(ielem3d,iseg)=oriseg(ielem,2)
283  ELSE
284  oriseg(ielem3d,iseg)=3-oriseg(ielem,2)
285  ENDIF
286  ELSEIF((j1.EQ.i6.AND.j2.EQ.i4).OR.
287  & (j1.EQ.i4.AND.j2.EQ.i6)) THEN
288  eltseg(ielem3d,iseg)=iseg06
289  IF(j1.EQ.i6) THEN
290  oriseg(ielem3d,iseg)=oriseg(ielem,3)
291  ELSE
292  oriseg(ielem3d,iseg)=3-oriseg(ielem,3)
293  ENDIF
294 ! VERTICAL SEGMENTS
295  ELSEIF((j1.EQ.i1.AND.j2.EQ.i4).OR.
296  & (j1.EQ.i4.AND.j2.EQ.i1)) THEN
297  eltseg(ielem3d,iseg)=iseg07
298  IF(j1.EQ.i1) THEN
299  oriseg(ielem3d,iseg)=1
300  ELSE
301  oriseg(ielem3d,iseg)=2
302  ENDIF
303  ELSEIF((j1.EQ.i2.AND.j2.EQ.i5).OR.
304  & (j1.EQ.i5.AND.j2.EQ.i2)) THEN
305  eltseg(ielem3d,iseg)=iseg08
306  IF(j1.EQ.i2) THEN
307  oriseg(ielem3d,iseg)=1
308  ELSE
309  oriseg(ielem3d,iseg)=2
310  ENDIF
311  ELSEIF((j1.EQ.i3.AND.j2.EQ.i6).OR.
312  & (j1.EQ.i6.AND.j2.EQ.i3)) THEN
313  eltseg(ielem3d,iseg)=iseg09
314  IF(j1.EQ.i3) THEN
315  oriseg(ielem3d,iseg)=1
316  ELSE
317  oriseg(ielem3d,iseg)=2
318  ENDIF
319 ! CROSSED SEGMENTS
320  ELSEIF((j1.EQ.i1.AND.j2.EQ.i5).OR.
321  & (j1.EQ.i5.AND.j2.EQ.i1).OR.
322  & (j1.EQ.i2.AND.j2.EQ.i4).OR.
323  & (j1.EQ.i4.AND.j2.EQ.i2) ) THEN
324  eltseg(ielem3d,iseg)=iseg10
325  IF(j1.EQ.i1.OR.j1.EQ.i2) THEN
326  oriseg(ielem3d,iseg)=1
327  gloseg(iseg10,1)=j1
328  gloseg(iseg10,2)=j2
329  ELSE
330  oriseg(ielem3d,iseg)=2
331  gloseg(iseg10,1)=j2
332  gloseg(iseg10,2)=j1
333  ENDIF
334  ELSEIF((j1.EQ.i2.AND.j2.EQ.i6).OR.
335  & (j1.EQ.i6.AND.j2.EQ.i2).OR.
336  & (j1.EQ.i3.AND.j2.EQ.i5).OR.
337  & (j1.EQ.i5.AND.j2.EQ.i3) ) THEN
338  eltseg(ielem3d,iseg)=iseg11
339  IF(j1.EQ.i2.OR.j1.EQ.i3) THEN
340  oriseg(ielem3d,iseg)=1
341  gloseg(iseg11,1)=j1
342  gloseg(iseg11,2)=j2
343  ELSE
344  oriseg(ielem3d,iseg)=2
345  gloseg(iseg11,1)=j2
346  gloseg(iseg11,2)=j1
347  ENDIF
348  ELSEIF((j1.EQ.i3.AND.j2.EQ.i4).OR.
349  & (j1.EQ.i4.AND.j2.EQ.i3).OR.
350  & (j1.EQ.i1.AND.j2.EQ.i6).OR.
351  & (j1.EQ.i6.AND.j2.EQ.i1) ) THEN
352  eltseg(ielem3d,iseg)=iseg12
353  IF(j1.EQ.i3.OR.j1.EQ.i1) THEN
354  oriseg(ielem3d,iseg)=1
355  gloseg(iseg12,1)=j1
356  gloseg(iseg12,2)=j2
357  ELSE
358  oriseg(ielem3d,iseg)=2
359  gloseg(iseg12,1)=j2
360  gloseg(iseg12,2)=j1
361  ENDIF
362  ELSE
363  WRITE(lu,*) 'PROBLEM IN STOSEG51'
364  WRITE(lu,*) 'FOR IPLAN=',iplan,' IELEM=',ielem
365  WRITE(lu,*) 'I=',i,' ISEG=',iseg,' IELEM3D=',ielem3d
366  WRITE(lu,*) 'J1=',j1,' J2=',j2
367  WRITE(lu,*) 'I1=',i1,' I2=',i2,' I3=',i3
368  WRITE(lu,*) 'I4=',i4,' I5=',i5,' I6=',i6
369  CALL plante(1)
370  stop
371  ENDIF
372  ENDDO
373 !
374  ENDDO
375 !
376 ! END OF LOOP ON THE 3 TETRAHEDRONS
377 !
378  ENDDO
379  ENDDO
380 !
381 ! CHECKING
382 !
383 ! LOOP ON TETRAHEDRA
384  DO ielem3d=1,3*nelem2*(nplan-1)
385 ! LOOP ON LOCAL SEGMENTS
386  DO i=1,6
387 ! GLOBAL POINTS SEEN BY TETRAHEDRON
388  j1=ikle(ielem3d,isegt(i,1))
389  j2=ikle(ielem3d,isegt(i,2))
390 ! GLOBAL POINTS SEEN BY GLOSEG
391  iseg=eltseg(ielem3d,i)
392  i1=gloseg(iseg,1)
393  i2=gloseg(iseg,2)
394  IF(oriseg(ielem3d,i).EQ.1) THEN
395  IF(j1.NE.i1.OR.j2.NE.i2) THEN
396  WRITE(lu,*) ' '
397  WRITE(lu,*) 'ERROR IN STOSEG51'
398  WRITE(lu,*) 'ELEMENT ',ielem3d,' SEGMENT ',i
399  WRITE(lu,*) 'POINTS ',j1,j2
400  WRITE(lu,*) 'GLOBAL SEGMENT ',iseg
401  WRITE(lu,*) 'POINTS ',i1,i2
402  CALL plante(1)
403  stop
404  ENDIF
405  ELSE
406  IF(j1.NE.i2.OR.j2.NE.i1) THEN
407  WRITE(lu,*) ' '
408  WRITE(lu,*) 'ERROR IN STOSEG51'
409  WRITE(lu,*) 'ELEMENT ',ielem3d,' SEGMENT ',i
410  WRITE(lu,*) 'POINTS ',j1,j2
411  WRITE(lu,*) 'GLOBAL SEGMENT ',iseg
412  WRITE(lu,*) 'POINTS ',i1,i2
413  CALL plante(1)
414  stop
415  ENDIF
416  ENDIF
417  ENDDO
418  ENDDO
419 !
420 !-----------------------------------------------------------------------
421 !
422  RETURN
423  END
integer, dimension(6, 2) isegt
subroutine stoseg51(IFABOR, NELMAX, IELM, IKLE, NBOR, GLOSEG, MAXSEG, ELTSEG, ORISEG, NELBOR, NULONE, NELMAX2, NELEM2, NPTFR2, NPOIN2, NPLAN, KNOLG, NSEG2D, IKLBOR, NELEB, NELEBX)
Definition: stoseg51.f:9
subroutine stoseg(IFABOR, NELEM, NELMAX, NELMAX2, IELM, IKLE, NBOR, NPTFR, GLOSEG, MAXSEG, ELTSEG, ORISEG, NSEG, NELBOR, NULONE, KNOLG, IKLBOR, NELEBX, NELEB)
Definition: stoseg.f:9
Definition: bief.f:3