The TELEMAC-MASCARET system  trunk
stoseg41.f
Go to the documentation of this file.
1 ! *******************
2  SUBROUTINE stoseg41
3 ! *******************
4 !
5  &(ifabor,nelmax,ielm,ikle,nbor,
6  & gloseg,maxseg,eltseg,oriseg,nelbor,nulone,nelmax2,
7  & nelem2,nptfr2,npoin2,nplan,knolg,nseg2d,iklbor,nelebx,neleb)
8 !
9 !***********************************************************************
10 ! BIEF V7P0 19/03/2014
11 !***********************************************************************
12 !
13 !brief BUILDS THE DATA STRUCTURE FOR EDGE-BASED STORAGE
14 !+ IN PRISMS.
15 !code
16 !+ LOCAL NUMBERING OF SEGMENTS CHOSEN HERE IN A PRISM
17 !+
18 !+ HORIZONTAL
19 !+
20 !+ 01 : POINT 1 TO 2 (OR THE OPPOSITE DEPENDING OF ORISEG)
21 !+ 02 : POINT 2 TO 3 (OR THE OPPOSITE DEPENDING OF ORISEG)
22 !+ 03 : POINT 3 TO 1 (OR THE OPPOSITE DEPENDING OF ORISEG)
23 !+ 04 : POINT 4 TO 5 (OR THE OPPOSITE DEPENDING OF ORISEG)
24 !+ 05 : POINT 5 TO 6 (OR THE OPPOSITE DEPENDING OF ORISEG)
25 !+ 06 : POINT 6 TO 4 (OR THE OPPOSITE DEPENDING OF ORISEG)
26 !+
27 !+ VERTICAL
28 !+
29 !+ 07 : POINT 1 TO 4
30 !+ 08 : POINT 2 TO 5
31 !+ 09 : POINT 3 TO 6
32 !+
33 !+ CROSSED
34 !+
35 !+ 10 : POINT 1 TO 5
36 !+ 11 : POINT 2 TO 4
37 !+ 12 : POINT 2 TO 6
38 !+ 13 : POINT 3 TO 5
39 !+ 14 : POINT 3 TO 4
40 !+ 15 : POINT 1 TO 6
41 !
42 !history JMH
43 !+ 11/08/09
44 !+
45 !+ CROSSED AND VERTICAL SEGMENTS INVERTED IN THE NUMBERING.
46 !
47 !history JMH
48 !+ 16/10/09
49 !+
50 !+ NUMBERING OF CROSSED SEGMENTS CHANGED, TO FACILITATE
51 !
52 !history J-M HERVOUET (LNHE)
53 !+ 19/10/2009
54 !+ V6P0
55 !+
56 !
57 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
58 !+ 13/07/2010
59 !+ V6P0
60 !+ Translation of French comments within the FORTRAN sources into
61 !+ English comments
62 !
63 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
64 !+ 21/08/2010
65 !+ V6P0
66 !+ Creation of DOXYGEN tags for automated documentation and
67 !+ cross-referencing of the FORTRAN sources
68 !
69 !history J-M HERVOUET (EDF LAB, LNHE)
70 !+ 19/03/2014
71 !+ V7P0
72 !+ Boundary segments have now their own numbering, independent of
73 !+ boundary points numbering.
74 !
75 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
76 !| ELTSEG |<--| SEGMENTS OF EVERY TRIANGLE.
77 !| GLOSEG |<--| GLOBAL NUMBERS OF POINTS OF SEGMENTS.
78 !| IELM |-->| 11: TRIANGLES.
79 !| | | 21: QUADRILATERALS.
80 !| IFABOR |-->| ELEMENTS BEHIND THE EDGES OF A TRIANGLE
81 !| | | IF NEGATIVE OR ZERO, THE EDGE IS A LIQUID
82 !| | | BOUNDARY
83 !| IKLBOR |-->| CONNECTIVITY OF BOUNDARY SEGMENTS IN D
84 !| IKLE |-->| CONNECTIVITY TABLE.
85 !| KNOLG |-->| GLOBAL NUMBER OF A LOCAL POINT IN PARALLEL
86 !| MAXSEG |<--| MAXIMUM NUMBER OF SEGMENTS
87 !| NBOR |-->| GLOBAL NUMBERS OF BOUNDARY POINTS.
88 !| NELBOR |-->| NUMBER OF ELEMENT CONTAINING SEGMENT K OF
89 !| | | THE BOUNDARY.
90 !| NELEB |-->| NUMBER OF BOUNDARY ELEMENTS
91 !| NELEBX |-->| MAXIMUM NUMBER OF BOUNDARY ELEMENTS
92 !| NELEM2 |-->| NUMBER OF ELEMENTS IN 2D
93 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS IN 3D
94 !| NELMAX2 |-->| MAXIMUM NUMBER OF ELEMENTS IN 2D
95 !| NPLAN |-->| NUMBER OF PLANES IN THE 3D MESH OF PRISMS
96 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D
97 !| NPTFR2 |-->| NUMBER OF BOUNDARY POINTS IN 2D
98 !| NULONE |-->| LOCAL NUMBER OF BOUNDARY POINTS IN A BOUNDARY
99 !| | | ELEMENT.
100 !| | | HERE THE 3D NULONE IS PASSED THOUGH IT IS HERE
101 !| | | USED AS THE 2D ONE. HENCE BOTH MUST BEGIN BY
102 !| | | THE SAME BOUNDARY ELEMENTS OF THE LOWER PLANE.
103 !| ORISEG |<--| ORIENTATION OF SEGMENTS OF EVERY TRIANGLE.
104 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
105 !
106  USE bief, ex_stoseg41 => stoseg41
107 !
109  IMPLICIT NONE
110 !
111 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
112 !
113  INTEGER, INTENT(IN) :: NELMAX,NELMAX2,MAXSEG,IELM
114  INTEGER, INTENT(IN) :: NELEM2,NPTFR2,NPOIN2,NPLAN,NSEG2D
115  INTEGER, INTENT(IN) :: NELEB,NELEBX
116  INTEGER, INTENT(IN) :: NBOR(nptfr2)
117  INTEGER, INTENT(IN) :: IFABOR(nelmax2,*),IKLE(nelmax,6)
118  INTEGER, INTENT(IN) :: NELBOR(nptfr2),NULONE(nptfr2)
119  INTEGER, INTENT(IN) :: IKLBOR(nelebx,2)
120  INTEGER, INTENT(INOUT) :: GLOSEG(maxseg,2)
121  INTEGER, INTENT(INOUT) :: ELTSEG(nelmax,15),ORISEG(nelmax,15)
122  INTEGER, INTENT(IN) :: KNOLG(*)
123 !
124 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
125 !
126  INTEGER I1,I2,I3,IELEM,I,ONE,TWO
127  INTEGER IPLAN,ISEG2D,ISEG3D,IELEM3D,NSEGH,NSEGV,NELEB2D
128 !
129 !-----------------------------------------------------------------------
130 !
131  IF(ielm.NE.41) THEN
132  WRITE(lu,501) ielm
133 501 FORMAT(1x,'STOSEG41 (BIEF) : UNEXPECTED ELEMENT: ',1i6)
134  CALL plante(1)
135  stop
136  ENDIF
137 !
138 !-----------------------------------------------------------------------
139 !
140 ! BUILDS 2D SEGMENTS (THE FIRST IN THE NUMBERING)
141 !
142 ! NOTE:
143 ! IN PARALLEL MODE, THE NUMBER OF SEGMENTS IN THE CONTOUR LINE IS NOT NPTFR2
144 ! NSEG2D=(3*NELEM2+NPTFR2)/2
145  nsegh=nseg2d*nplan
146  nsegv=(nplan-1)*npoin2
147  neleb2d=neleb/(nplan-1)
148 !
149  CALL stoseg(ifabor,nelem2,nelmax,nelmax2,11,ikle,nbor,nptfr2,
150  & gloseg,maxseg,eltseg,oriseg,nseg2d,
151  & nelbor,nulone,knolg,iklbor,nelebx,neleb2d)
152 !
153 !-----------------------------------------------------------------------
154 !
155 ! COMPLETES HORIZONTAL SEGMENTS (1,2,3,4,5,6)
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)
166 !
167  DO iplan=1,nplan-1
168  DO i=1,npoin2
169  iseg3d=nsegh+npoin2*(iplan-1)+i
170  gloseg(iseg3d,1)=npoin2*(iplan-1)+i
171  gloseg(iseg3d,2)=npoin2*(iplan )+i
172  ENDDO
173  ENDDO
174 !
175 !-----------------------------------------------------------------------
176 !
177 ! ARRAY ELTSEG GIVES GLOBAL NUMBERS OF SEGMENTS IN A PRISM
178 ! ARRAY ORISEG GIVES ORIENTATION OF SEGMENT
179 !
180 ! COMPLETES SEGMENTS 1,2,3
181 !
182  IF(nplan.GT.2) THEN
183  DO iplan=2,nplan-1
184  DO ielem=1,nelem2
185  ielem3d=ielem+(iplan-1)*nelem2
186  eltseg(ielem3d,1)=eltseg(ielem,1)+nseg2d*(iplan-1)
187  eltseg(ielem3d,2)=eltseg(ielem,2)+nseg2d*(iplan-1)
188  eltseg(ielem3d,3)=eltseg(ielem,3)+nseg2d*(iplan-1)
189  oriseg(ielem3d,1)=oriseg(ielem,1)
190  oriseg(ielem3d,2)=oriseg(ielem,2)
191  oriseg(ielem3d,3)=oriseg(ielem,3)
192  ENDDO
193  ENDDO
194  ENDIF
195 !
196 ! SEGMENTS 4,5,6 (=SEGMENTS 1,2,3 + NSEG2D)
197 !
198  DO iplan=1,nplan-1
199  DO ielem=1,nelem2
200  ielem3d=ielem+(iplan-1)*nelem2
201  eltseg(ielem3d,4)=eltseg(ielem3d,1)+nseg2d
202  eltseg(ielem3d,5)=eltseg(ielem3d,2)+nseg2d
203  eltseg(ielem3d,6)=eltseg(ielem3d,3)+nseg2d
204  oriseg(ielem3d,4)=oriseg(ielem,1)
205  oriseg(ielem3d,5)=oriseg(ielem,2)
206  oriseg(ielem3d,6)=oriseg(ielem,3)
207  ENDDO
208  ENDDO
209 !
210 ! SEGMENTS 7,8,9 (VERTICAL SEGMENTS) SEE SECTION 3)
211 !
212  DO iplan=1,nplan-1
213  DO ielem=1,nelem2
214  ielem3d=ielem+(iplan-1)*nelem2
215  i1=ikle(ielem,1)
216  i2=ikle(ielem,2)
217  i3=ikle(ielem,3)
218  eltseg(ielem3d,7)=nsegh+npoin2*(iplan-1)+i1
219  eltseg(ielem3d,8)=nsegh+npoin2*(iplan-1)+i2
220  eltseg(ielem3d,9)=nsegh+npoin2*(iplan-1)+i3
221  oriseg(ielem3d,7)=1
222  oriseg(ielem3d,8)=1
223  oriseg(ielem3d,9)=1
224  ENDDO
225  ENDDO
226 !
227 ! SEGMENTS 10 TO 15 (CROSSED SEGMENTS)
228 !
229 ! THE PROBLEM IS TO FIND A GLOBAL NUMBERING OF CROSSED SEGMENTS
230 ! WHICH IS INDEPENDENT OF THE PRISM CONSIDERED, SO THAT WHEN
231 ! ASSEMBLING THE ISEG3D IS THE CORRECT ONE
232 ! HERE WE TAKE AS CROSSED SEGMENT 1 THE ONE THAT STARTS
233 ! FROM THE ORIGIN OF THE ORIENTED HORIZONTAL SEGMENT
234 !
235 ! FOR EVERY VERTICAL RECTANGLE IN A PRISM
236 ! WHEN THE HORIZONTAL SEGMENT HAS ORISEG = 1, THE CROSSED
237 ! SEGMENT NUMBER 1 IS THUS THE 10,12 OR 14
238 ! WHEN THE HORIZONTAL SEGMENT HAS ORISEG = 2, THE CROSSED
239 ! SEGMENT NUMBER 1 IS THUS THE 11,13 OR 15
240 !
241 ! IN THE GLOBAL NUMBERING OF SEGMENTS
242 ! THE ORISEG=1 SEGMENTS ARE PUT FIRST (NSEG2D PER LAYER)
243 ! THE ORISEG=2 SEGMENTS ARE PUT AFTER (NSEG2D PER LAYER)
244 !
245  DO iplan=1,nplan-1
246  DO ielem=1,nelem2
247  ielem3d=ielem+(iplan-1)*nelem2
248  DO i=1,3
249  iseg2d=eltseg(ielem,i)
250  iseg3d=nsegh+nsegv+nseg2d*2*(iplan-1)+iseg2d
251  one=iseg3d
252  two=iseg3d+nseg2d
253  IF(oriseg(ielem,i).EQ.1) THEN
254  eltseg(ielem3d,8+2*i) =one
255  eltseg(ielem3d,8+2*i+1)=two
256  ELSE
257  eltseg(ielem3d,8+2*i+1)=one
258  eltseg(ielem3d,8+2*i) =two
259  ENDIF
260 ! ONE: FOLLOWS ISEG2D
261  gloseg(one,1)=gloseg(iseg2d,1)+(iplan-1)*npoin2
262  gloseg(one,2)=gloseg(iseg2d,2)+(iplan )*npoin2
263 ! BACKWARDS WITH RESPECT TO ISEG2D
264  gloseg(two,1)=gloseg(iseg2d,2)+(iplan-1)*npoin2
265  gloseg(two,2)=gloseg(iseg2d,1)+(iplan )*npoin2
266  ENDDO
267  oriseg(ielem3d,10)=1
268  oriseg(ielem3d,11)=1
269  oriseg(ielem3d,12)=1
270  oriseg(ielem3d,13)=1
271  oriseg(ielem3d,14)=1
272  oriseg(ielem3d,15)=1
273  ENDDO
274  ENDDO
275 !
276 !-----------------------------------------------------------------------
277 !
278  RETURN
279  END
subroutine stoseg41(IFABOR, NELMAX, IELM, IKLE, NBOR, GLOSEG, MAXSEG, ELTSEG, ORISEG, NELBOR, NULONE, NELMAX2, NELEM2, NPTFR2, NPOIN2, NPLAN, KNOLG, NSEG2D, IKLBOR, NELEBX, NELEB)
Definition: stoseg41.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