The TELEMAC-MASCARET system  trunk
eleb3dt.f
Go to the documentation of this file.
1 ! ******************
2  SUBROUTINE eleb3dt
3 ! ******************
4 !
5  &(ikle3,nbor,nelbor,nelbor2d,iklbor,neleb,nelebx,nulone,
6  & nelem2,npoin2,nplan,netage,nptfr,iklbor2d,neleb2d,nelebx2d)
7 !
8 !***********************************************************************
9 ! BIEF V7P0 19/03/2014
10 !***********************************************************************
11 !
12 !brief CASE OF PRISMS SPLIT IN TETRAHEDRONS.
13 !+ BUILDS THE 3D MESH.
14 !+
15 !+ INPUT: 3D MESH ARRAYS FILLED BY A PRELIMINARY CALL
16 !+ TO ELEBD.
17 !+
18 !+ OUTPUT: ARRAYS COMPLETE IN 3D.
19 !
20 !history J-M HERVOUET(LNH)
21 !+ 23/08/99
22 !+ V5P3
23 !+
24 !
25 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
26 !+ 13/07/2010
27 !+ V6P0
28 !+ Translation of French comments within the FORTRAN sources into
29 !+ English comments
30 !
31 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
32 !+ 21/08/2010
33 !+ V6P0
34 !+ Creation of DOXYGEN tags for automated documentation and
35 !+ cross-referencing of the FORTRAN sources
36 !
37 !history J-M HERVOUET(LNHE)
38 !+ 12/08/2011
39 !+ V6P2
40 !+ Arguments NELEB and NELEBX added.
41 !
42 !history J-M HERVOUET(EDF LAB, LNHE)
43 !+ 27/01/2014
44 !+ V7P0
45 !+ In parallel, boundary elements that correspond to another subdomain
46 !+ are given a IKLBOR that reduces the element to a point.
47 !+ The previous version had IKLBOR = 0 which causes a crash when
48 !+ checking bounds.
49 !
50 !history J-M HERVOUET (EDF LAB, LNHE)
51 !+ 19/03/2014
52 !+ V7P0
53 !+ Boundary segments have now their own numbering, independent of
54 !+ boundary points numbering.
55 !
56 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
57 !| IKLBOR |<--| CONNECTIVITY TABLE FOR BOUNDARY ELEMENTS
58 !| | | HERE DECLARED AS IKLBOR(NELEBX,3)
59 !| | | BUT FILLED AS IKLBOR(NELEB2D,2,NETAGE,3)
60 !| | | 2 IS THE NUMBER OF TETRAHEDRONS FORMING A
61 !| | | VERTICAL RECTANGLE IN THE BORDER.
62 !| | | 3 IS THE NUMBER OF POINTS IN EVERY TRIANGLE
63 !| | | FORMING THIS RECTANGLE
64 !| IKLBOR2D |<--| CONNECTIVITY TABLE FOR BOUNDARY ELEMENTS IN 2D
65 !| IKLE3 |<--| CONNECTIVITY TABLE IN 3D, FOR TETRAHEDRONS
66 !| | | HERE DECLARED AS IKLE3(NELEM2,3,NETAGE,4)
67 !| | | 3 IS THE NUMBER OF TETRAHEDRONS PER PRISM
68 !| | | (TETRAHEDRONS ARE NUMBERED ACCORDINGLY)
69 !| | | 4 IS THE NUMBER OF POINTS IN A TETRAHEDRA.
70 !| NBOR |-->| GLOBAL NUMBER OF BOUNDARY POINTS IN 2D
71 !| NELBOR |-->| FOR THE KTH BOUNDARY EDGE, GIVES THE CORRESPONDING
72 !| | | ELEMENT (FROM MESH3D).
73 !| NELBOR2D |-->| FOR THE KTH BOUNDARY EDGE, GIVES THE CORRESPONDING
74 !| | | ELEMENT (FROM MESH2D).
75 !| NELEB |-->| NUMBER OF BOUNDARY ELEMENTS
76 !| NELEB2D |-->| NUMBER OF BOUNDARY ELEMENTS OF 2D MESH
77 !| NELEBX |-->| MAXIMUM NUMBER OF BOUNDARY ELEMENTS
78 !| | | USED AS FIRST DIMENSION OF IKLBOR
79 !| NELEBX2D |-->| MAXIMUM NUMBER OF BOUNDARY ELEMENTS IN 2D MESH
80 !| NELEM2 |-->| NUMBER OF ELEMENTS IN 2D
81 !| NETAGE |-->| NUMBER OF PLANES - 1
82 !| NPLAN |-->| NUMBER OF PLANES
83 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D
84 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
85 !| NULONE |-->| GOES WITH ARRAY NELBOR. NELBOR GIVES THE
86 !| | | ADJACENT ELEMENT, NULONE GIVES THE LOCAL
87 !| | | NUMBER OF THE FIRST NODE OF THE BOUNDARY EDGE
88 !| | | I.E. 1, 2 OR 3 FOR TRIANGLES.
89 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
90 !
91  USE bief, ex_eleb3dt => eleb3dt
92 !
94  IMPLICIT NONE
95 !
96 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
97 !
98  INTEGER, INTENT(IN) :: NELEM2,NPOIN2,NPLAN,NETAGE,NPTFR
99  INTEGER, INTENT(IN) :: NELEBX,NELEB2D,NELEBX2D
100  INTEGER, INTENT(INOUT) :: NELEB
101  INTEGER, INTENT(INOUT) :: IKLE3(nelem2,3,netage,4)
102  INTEGER, INTENT(INOUT) :: IKLBOR(nelebx,3)
103  INTEGER, INTENT(IN) :: IKLBOR2D(nelebx2d,2),NELBOR2D(nelebx2d)
104  INTEGER, INTENT(INOUT) :: NULONE(nelebx,3),NELBOR(nelebx)
105  INTEGER, INTENT(INOUT) :: NBOR(nptfr*nplan)
106 !
107 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
108 !
109  LOGICAL OK(2)
110 !
111  INTEGER IELEM,IPOIN,T(3),IELEB,IELEB3,IPTFR2
112  INTEGER IETAGE,IPTFR,IL1,IL2,IL3,IL4,IG(2,2,3),IL(2,2,3),IPLAN
113  INTEGER :: IG1,IG2,IG3,IG4,NUM1(12),NUM2(12),NUM3(12),K,L,M,N
114 !
115  parameter( num1 = (/
116  & 1 , 2 , 4 , 1 , 3 , 2 , 2 , 3 , 4 , 3 , 1 , 4 /) )
117  parameter( num2 = (/
118  & 2 , 4 , 1 , 3 , 2 , 1 , 3 , 4 , 2 , 1 , 4 , 3 /) )
119  parameter( num3 = (/
120  & 4 , 1 , 2 , 2 , 1 , 3 , 4 , 2 , 3 , 4 , 3 , 1 /) )
121 !
122 !***********************************************************************
123 !
124 ! CONNECTIVITY TABLES FOR BOUNDARY FACES --> IKLBOR , NBOR3 ,
125 ! CORRESPONDENCE BETWEEN LOCAL BOUNDARY NUMBERS AND 3D LOCAL NUMBERS --> NULONE
126 !
127 ! COMPLETING NBOR
128 !
129  DO iptfr = 1,nptfr
130  ipoin = nbor(iptfr)
131  DO iplan = 2,nplan
132  nbor(iptfr +(iplan-1)*nptfr)=ipoin+(iplan-1)*npoin2
133  ENDDO
134  ENDDO
135 !
136 ! LATERAL BOUNDARIES :
137 ! FOR EACH RECTANGULAR FACE SPLIT IN TWO TRIANGLES
138 ! THE LOWER TRIANGLE IS NUMBER 1, THE HIGHER IS NUMBER 2
139 !
140  DO ieleb = 1,neleb2d
141 !
142  iptfr =iklbor2d(ieleb,1)
143  iptfr2=iklbor2d(ieleb,2)
144 !
145 ! TRIANGLE TOUCHING THE BOUNDARY IN 2D
146  ielem = nelbor2d(ieleb)
147 !
148  DO ietage = 1,netage
149 !
150 ! 3D BOUNDARY NUMBERING OF THE 4 POINTS OF THE RECTANGULAR FACE
151 !
152  il1 = iptfr + (ietage-1)*nptfr
153  il2 = iptfr2 + (ietage-1)*nptfr
154  il3 = il2 + nptfr
155  il4 = il1 + nptfr
156 !
157 ! 3D GLOBAL NUMBERING OF THE 4 POINTS OF THE RECTANGULAR FACE
158 !
159  ig1 = nbor(iptfr) + (ietage-1)*npoin2
160  ig2 = nbor(iptfr2) + (ietage-1)*npoin2
161  ig3 = ig2 + npoin2
162  ig4 = ig1 + npoin2
163 !
164 ! NUMBERS OF THE 3 TETRAHEDRONS POSSIBLY TOUCHING THE FACE
165 !
166  t(1) = (ietage-1)*3*nelem2+ielem
167  t(2) = t(1) + nelem2
168  t(3) = t(2) + nelem2
169 !
170 ! LOOKS FOR THE LOWER TRIANGLE (CAN BE 1-2-4 OR 1-2-3)
171 !
172 ! 2 POSSIBLE FORMS OF THE LOWER TRIANGLE (GLOBAL AND BOUNDARY)
173  ig(1,1,1)=ig1
174  ig(1,1,2)=ig2
175  ig(1,1,3)=ig4
176  ig(1,2,1)=ig1
177  ig(1,2,2)=ig2
178  ig(1,2,3)=ig3
179  il(1,1,1)=il1
180  il(1,1,2)=il2
181  il(1,1,3)=il4
182  il(1,2,1)=il1
183  il(1,2,2)=il2
184  il(1,2,3)=il3
185 ! 2 POSSIBLE FORMS OF THE HIGHER TRIANGLE (GLOBAL AND BOUNDARY)
186  ig(2,1,1)=ig1
187  ig(2,1,2)=ig3
188  ig(2,1,3)=ig4
189  ig(2,2,1)=ig2
190  ig(2,2,2)=ig3
191  ig(2,2,3)=ig4
192  il(2,1,1)=il1
193  il(2,1,2)=il3
194  il(2,1,3)=il4
195  il(2,2,1)=il2
196  il(2,2,2)=il3
197  il(2,2,3)=il4
198 !
199  ok(1)=.false.
200  ok(2)=.false.
201 !
202 ! K=1 LOWER TRIANGLE K=2 HIGHER TRIANGLE
203  DO k=1,2
204 ! 2 POSSIBLE SPLITS
205  DO l=1,2
206 ! 12 WAYS FOR A TETRAHEDRON OF PRESENTING ITS FACES
207  DO m=1,12
208 ! 3 POSSIBLE TETRAHEDRONS
209  DO n=1,3
210  IF(ig(k,l,1).EQ.ikle3(ielem,n,ietage,num1(m)).AND.
211  & ig(k,l,2).EQ.ikle3(ielem,n,ietage,num2(m)).AND.
212  & ig(k,l,3).EQ.ikle3(ielem,n,ietage,num3(m))) THEN
213 ! STORAGE LIKE IKLBOR(NELEB2D,2,NETAGE,3)
214  ieleb3=(2*ietage+k-3)*neleb2d+ieleb
215  iklbor(ieleb3,1) = il(k,l,1)
216  iklbor(ieleb3,2) = il(k,l,2)
217  iklbor(ieleb3,3) = il(k,l,3)
218  nelbor(ieleb3) = t(n)
219  nulone(ieleb3,1) = num1(m)
220  nulone(ieleb3,2) = num2(m)
221  nulone(ieleb3,3) = num3(m)
222  ok(k) = .true.
223  ENDIF
224  ENDDO
225  ENDDO
226  ENDDO
227  ENDDO
228  IF(.NOT.ok(1).OR..NOT.ok(2)) THEN
229  WRITE(lu,*) 'PB IN ELEB3DT IELEM=',ielem,' IPTFR=',iptfr
230  CALL plante(1)
231  stop
232  ENDIF
233 !
234  ENDDO
235 !
236  ENDDO
237 !
238 !-----------------------------------------------------------------------
239 !
240 ! NELEB IS THE 3D VALUE
241 !
242  neleb=2*neleb2d*netage
243 !
244 !-----------------------------------------------------------------------
245 !
246  RETURN
247  END
subroutine eleb3dt(IKLE3, NBOR, NELBOR, NELBOR2D, IKLBOR, NELEB, NELEBX, NULONE, NELEM2, NPOIN2, NPLAN, NETAGE, NPTFR, IKLBOR2D, NELEB2D, NELEBX2D)
Definition: eleb3dt.f:8
Definition: bief.f:3