The TELEMAC-MASCARET system  trunk
cpikle3.f
Go to the documentation of this file.
1 ! ******************
2  SUBROUTINE cpikle3
3 ! ******************
4 !
5  &(ikle3,ikles,nelem2,nelmax2,npoin2,nplan,knolg)
6 !
7 !***********************************************************************
8 ! BIEF V6P2 21/08/2010
9 !***********************************************************************
10 !
11 !brief EXTENDS THE CONNECTIVITY TABLE.
12 !+
13 !+ BUILDS HERE THE CONNECTIVITY FOR A MESH OF PRISMS
14 !+ SPLIT IN TETRAHEDRONS.
15 !code
16 !+ DIFFERENT WAYS OF SPLITTING PRISMS :
17 !+
18 !+ TO ENSURE MATCHING OF TETRAHEDRONS, FACES OF TRIANGLES ARE "SIGNED"
19 !+ WITH 1 OR 2 DEPENDING OF THE GLOBAL NUMBERS OF THEIR POINTS, TAKEN IN
20 !+ COUNTER-CLOCKWISE DIRECTION. A FACE 1 IN A TRIANGLE WILL BE 2 IN ITS
21 !+ NEIGHBOUR AND THIS IS USED TO HAVE A CORRECT SPLITTING. THE SPLITTING
22 !+ DEPENDING ON THE "SIGNS" OF THE 3 FACES IS GIVEN IN ARRAY TETRA.
23 !+
24 !+
25 !+ TETRA(2,2,2,3,4)
26 !+
27 !+ FIRST 3 DIMENSIONS : TYPE OF FACE
28 !+ 1 : CUT RECTANGLE BETWEEN LOW-LEFT AND HIGH-RIGHT
29 !+ 2 : CUT RECTANGLE BETWEEN HIGH-LEFT AND LOW-RIGHT
30 !+
31 !+ 4TH DIMENSION : NUMBER OF TETRAHEDRON
32 !+ 5TH DIMENSION : 4 POINTS OF THE TETRAHEDRON (IN LOCAL PRISM NUMBERING)
33 !+
34 !+ 1 1 2 SPLITTING
35 !+
36 !+ TETRA(1,1,2,1,1)= 1
37 !+ TETRA(1,1,2,1,2)= 2
38 !+ TETRA(1,1,2,1,3)= 3
39 !+ TETRA(1,1,2,1,4)= 6
40 !+
41 !+ TETRA(1,1,2,2,1)= 4
42 !+ TETRA(1,1,2,2,2)= 6
43 !+ TETRA(1,1,2,2,3)= 5
44 !+ TETRA(1,1,2,2,4)= 1
45 !+
46 !+ TETRA(1,1,2,3,1)= 5
47 !+ TETRA(1,1,2,3,2)= 2
48 !+ TETRA(1,1,2,3,3)= 1
49 !+ TETRA(1,1,2,3,4)= 6
50 !+
51 !+ 2 1 1 SPLITTING
52 !+
53 !+ TETRA(2,1,1,1,1)= 1
54 !+ TETRA(2,1,1,1,2)= 2
55 !+ TETRA(2,1,1,1,3)= 3
56 !+ TETRA(2,1,1,1,4)= 4
57 !+
58 !+ TETRA(2,1,1,2,1)= 4
59 !+ TETRA(2,1,1,2,2)= 6
60 !+ TETRA(2,1,1,2,3)= 5
61 !+ TETRA(2,1,1,2,4)= 2
62 !+
63 !+ TETRA(2,1,1,3,1)= 6
64 !+ TETRA(2,1,1,3,2)= 3
65 !+ TETRA(2,1,1,3,3)= 2
66 !+ TETRA(2,1,1,3,4)= 4
67 !+
68 !+ 1 2 1 SPLITTING
69 !+
70 !+ TETRA(1,2,1,1,1)= 1
71 !+ TETRA(1,2,1,1,2)= 2
72 !+ TETRA(1,2,1,1,3)= 3
73 !+ TETRA(1,2,1,1,4)= 5
74 !+
75 !+ TETRA(1,2,1,2,1)= 4
76 !+ TETRA(1,2,1,2,2)= 6
77 !+ TETRA(1,2,1,2,3)= 5
78 !+ TETRA(1,2,1,2,4)= 3
79 !+
80 !+ TETRA(1,2,1,3,1)= 4
81 !+ TETRA(1,2,1,3,2)= 1
82 !+ TETRA(1,2,1,3,3)= 3
83 !+ TETRA(1,2,1,3,4)= 5
84 !+
85 !+ 2 2 1 SPLITTING
86 !+
87 !+ TETRA(2,2,1,1,1)= 1
88 !+ TETRA(2,2,1,1,2)= 2
89 !+ TETRA(2,2,1,1,3)= 3
90 !+ TETRA(2,2,1,1,4)= 4
91 !+
92 !+ TETRA(2,2,1,2,1)= 4
93 !+ TETRA(2,2,1,2,2)= 6
94 !+ TETRA(2,2,1,2,3)= 5
95 !+ TETRA(2,2,1,2,4)= 3
96 !+
97 !+ TETRA(2,2,1,3,1)= 5
98 !+ TETRA(2,2,1,3,2)= 2
99 !+ TETRA(2,2,1,3,3)= 4
100 !+ TETRA(2,2,1,3,4)= 3
101 !+
102 !+ 1 2 2 SPLITTING
103 !+
104 !+ TETRA(1,2,2,1,1)= 1
105 !+ TETRA(1,2,2,1,2)= 2
106 !+ TETRA(1,2,2,1,3)= 3
107 !+ TETRA(1,2,2,1,4)= 5
108 !+
109 !+ TETRA(1,2,2,2,1)= 4
110 !+ TETRA(1,2,2,2,2)= 6
111 !+ TETRA(1,2,2,2,3)= 5
112 !+ TETRA(1,2,2,2,4)= 1
113 !+
114 !+ TETRA(1,2,2,3,1)= 6
115 !+ TETRA(1,2,2,3,2)= 3
116 !+ TETRA(1,2,2,3,3)= 5
117 !+ TETRA(1,2,2,3,4)= 1
118 !+
119 !+ 2 1 2 SPLITTING
120 !+
121 !+ TETRA(2,1,2,1,1)= 1
122 !+ TETRA(2,1,2,1,2)= 2
123 !+ TETRA(2,1,2,1,3)= 3
124 !+ TETRA(2,1,2,1,4)= 6
125 !+
126 !+ TETRA(2,1,2,2,1)= 4
127 !+ TETRA(2,1,2,2,2)= 6
128 !+ TETRA(2,1,2,2,3)= 5
129 !+ TETRA(2,1,2,2,4)= 2
130 !+
131 !+ TETRA(2,1,2,3,1)= 4
132 !+ TETRA(2,1,2,3,2)= 1
133 !+ TETRA(2,1,2,3,3)= 6
134 !+ TETRA(2,1,2,3,4)= 2
135 !
136 !note IMPORTANT : ON EACH LAYER THE BOTTOM TETRAHEDRONS MUST BE
137 !+ TREATED FIRST, SO THAT IKLE SENT TO SUBROUTINE
138 !+ VOISIN BE THE SAME AS WITH PRISMS OR TRIANGLES
139 !+ FOR THE NELEM2 FIRST ELEMENTS.
140 !+ CONSEQUENTLY THE FIRSt 3 POINTS OF TETRAHEDRON 1
141 !+ ARE ALWAYS 1,2 AND 3.
142 !
143 !history J-M HERVOUET (LNH)
144 !+ 23/08/99
145 !+ V5P3
146 !+
147 !
148 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
149 !+ 13/07/2010
150 !+ V6P0
151 !+ Translation of French comments within the FORTRAN sources into
152 !+ English comments
153 !
154 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
155 !+ 21/08/2010
156 !+ V6P0
157 !+ Creation of DOXYGEN tags for automated documentation and
158 !+ cross-referencing of the FORTRAN sources
159 !
160 !history J-M HERVOUET (LNH)
161 !+ 28/11/2011
162 !+ V6P2
163 !+ Use of KNOLG in case of parallelism, to get the same splitting of
164 !+ than in scalar mode. Loops on planes and elements swapped.
165 !
166 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
167 !| IKLE3 |<->| 3D CONNECTIVITY TABLE
168 !| IKLES |-->| 2D CONNECTIVITY TABLE WITH DIMENSION (3,NELEM2)
169 !| KNOLG |-->| GIVES THE ORIGINAL GLOBAL NUMBER OF POINTS
170 !| NELEM2 |-->| NUMBER OF ELEMENTS IN 2D
171 !| NELMAX2 |-->| MAXIMUM NUMBER OF ELEMENTS IN 2D
172 !| NPLAN |-->| NUMBER OF PLANES
173 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D
174 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
175 !
176  USE bief, ONLY : ncsize
177  USE declarations_telemac, ONLY : tetra
178 !
180  IMPLICIT NONE
181 !
182 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
183 !
184  INTEGER, INTENT(IN) :: NELEM2,NELMAX2,NPOIN2,NPLAN
185 ! NPOIN3 BUT ONLY FILLED TO NPOIN2
186  INTEGER, INTENT(IN) :: KNOLG(*)
187  INTEGER, INTENT(INOUT) :: IKLES(3,nelem2)
188  INTEGER, INTENT(INOUT) :: IKLE3(nelmax2,3,nplan-1,4)
189 !
190 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
191 !
192  INTEGER IELEM,I,K,L,IGLOB(6),S1,S2,S3,I1,I2,I3
193 !
194 ! TETRA : SEE EXPLANATIONS ABOVE, THE 0 CORRESPOND TO SITUATIONS
195 ! THAT NEVER HAPPEN (TETRA(1,1,1,... OR TETRA(2,2,2,...)
196 ! INTEGER TETRA(2,2,2,3,4)
197 ! DATA TETRA / 0,1,1,1,1,1,1,0,0,4,4,4,4,4,4,0,0,6,4,5,5,4,6,0,
198 ! & 0,2,2,2,2,2,2,0,0,6,6,6,6,6,6,0,0,3,1,2,2,1,3,0,
199 ! & 0,3,3,3,3,3,3,0,0,5,5,5,5,5,5,0,0,2,3,4,1,6,5,0,
200 ! & 0,4,5,4,6,6,5,0,0,2,3,3,1,2,1,0,0,4,5,3,6,2,1,0 /
201 !
202 !-----------------------------------------------------------------------
203 !
204 ! BOTTOM AND TOP OF ALL LAYERS
205 !
206  IF(nplan.GE.2) THEN
207 !
208 ! LOOP ON THE TRIANGLES
209 !
210  DO ielem = 1,nelem2
211 !
212  i1=ikles(1,ielem)
213  i2=ikles(2,ielem)
214  i3=ikles(3,ielem)
215 !
216 ! IN PARALLEL, IT IS NOT SURE THAT THE MESH PARTITIONER KEEPS
217 ! THE SAME RANK BETWEEN POINTS, SO WE USE HERE THE ORIGINAL
218 ! GLOBAL NUMBERS
219 !
220  IF(ncsize.GT.1) THEN
221  i1=knolg(i1)
222  i2=knolg(i2)
223  i3=knolg(i3)
224  ENDIF
225 !
226  IF(i1.GT.i2) THEN
227  s1=1
228  ELSE
229  s1=2
230  ENDIF
231  IF(i2.GT.i3) THEN
232  s2=1
233  ELSE
234  s2=2
235  ENDIF
236  IF(i3.GT.i1) THEN
237  s3=1
238  ELSE
239  s3=2
240  ENDIF
241 !
242 ! LOOP ON THE PLANES
243 !
244  DO i = 1,nplan-1
245 !
246 ! GLOBAL NUMBERS OF THE 6 POINTS OF THE PRISM
247 !
248  iglob(1) = ikles(1,ielem) + (i-1)*npoin2
249  iglob(2) = ikles(2,ielem) + (i-1)*npoin2
250  iglob(3) = ikles(3,ielem) + (i-1)*npoin2
251  iglob(4) = ikles(1,ielem) + i *npoin2
252  iglob(5) = ikles(2,ielem) + i *npoin2
253  iglob(6) = ikles(3,ielem) + i *npoin2
254 !
255  DO k=1,3
256  DO l=1,4
257  ikle3(ielem,k,i,l) = iglob(tetra(s1,s2,s3,k,l))
258  ENDDO
259  ENDDO
260 !
261  ENDDO
262  ENDDO
263  ELSE
264  WRITE(lu,*) 'CPIKLE3 : MINIMUM OF 2 PLANES NEEDED'
265  CALL plante(1)
266  stop
267  ENDIF
268 !
269 !-----------------------------------------------------------------------
270 !
271  RETURN
272  END
integer, dimension(2, 2, 2, 3, 4) tetra
subroutine cpikle3(IKLE3, IKLES, NELEM2, NELMAX2, NPOIN2, NPLAN, KNOLG)
Definition: cpikle3.f:7
Definition: bief.f:3