34
35
36
37
38
39
40
41
43 use element_mod , only : nixs
44
45
46
47#include "implicit_f.inc"
48
49
50
51
52
53
54
55
56 INTEGER, INTENT(IN) :: NBRIC, NTGI, NB_NODE, TBRIC(2, NBRIC), IXS(NIXS, *)
57 INTEGER, INTENT(IN) :: IBUF(*), ELEM(3, NTGI)
58 INTEGER, INTENT(INOUT) :: TFAC(12, NBRIC)
59
60
61
62 INTEGER :: II, KK, KKK, KKKK, JJ, CONNECT_MAX, NODEID, COUNT, ELID, ELID1
63 INTEGER :: NSEG, IFACE, ITYPE, NNODE, NSURFNODE, SUM
64 INTEGER, DIMENSION(:), ALLOCATABLE :: IFLAG
65 INTEGER, DIMENSION(:, :), ALLOCATABLE :: N_E_CONNECT, N_E_CONNECT_LOCID
66 INTEGER, TARGET :: REDIRT(4), REDIRP(6), REDIRB(8), REDIRPY(5),
67 . NOD8(6), NOD3(4), NOD6(5), NOD5(5),
68 . FAC8(4,6), FAC4(3,4), FAC6(4,5), FAC5(4,5), NFACE(4)
69 INTEGER, DIMENSION(:), POINTER :: REDIR, NOD
70 INTEGER, DIMENSION(:,:), POINTER :: FAC
71 DATA fac4 /1,5,3,
72 . 3,5,6,
73 . 6,5,1,
74 . 1,3,6/
75 DATA fac8 /1,4,3,2,
76 . 5,6,7,8,
77 . 1,2,6,5,
78 . 2,3,7,6,
79 . 3,4,8,7,
80 . 4,1,5,8/
81 DATA fac6 /1,3,2,0,
82 . 5,6,7,0,
83 . 1,2,6,5,
84 . 2,3,7,6,
85 . 3,4,8,7/
86 DATA nod6 /3,3,4,4,4/
87 DATA nod8 /4,4,4,4,4,4/
88 DATA nod3 /3,3,3,3/
89 DATA fac5 /1,2,5,0,
90 . 2,3,5,0,
91 . 3,4,5,0,
92 . 4,1,5,0,
93 . 1,4,3,2/
94 DATA nod5 /3,3,3,3,4/
95 DATA nface/6,4,5,5/
96
97 LOGICAL :: FACE_OK
98 INTEGER, TARGET :: nothing(1,1)
99
100
101
102
103 redir => nothing(:,1)
104 nod => nothing(:,1)
105 fac => nothing
106 nnode = 0
107
108 redirt(1)=1
109 redirt(2)=3
110 redirt(3)=5
111 redirt(4)=6
112
113 DO kk = 1, 8
114 redirb(kk) = kk
115 ENDDO
116
117 redirp(1)=1
118 redirp(2)=2
119 redirp(3)=3
120 redirp(4)=5
121 redirp(5)=6
122 redirp(6)=7
123
124 DO kk = 1, 5
125 redirpy(kk) = kk
126 ENDDO
127
128
129
130
131 nseg = ntgi
132
133
134 ALLOCATE(iflag(nb_node))
135 iflag(1:nb_node) = 0
136 DO ii = 1, nbric
137 elid = tbric(1, ii)
138 itype = tbric(2, ii)
139 SELECT CASE(itype)
140 CASE(1)
141
142 nnode = 8
143 redir => redirb(1:8)
144 CASE(2)
145
146 nnode = 4
147 redir => redirt(1:4)
148 CASE(3)
149
150 nnode = 6
151 redir => redirp(1:6)
152 CASE(4)
153
154 nnode = 5
155 redir => redirpy(1:5)
156 CASE DEFAULT
157 nnode = -huge(nnode)
158 redir => null()
160 END SELECT
161 DO kk = 1, nnode
162 nodeid = ixs(1 + redir(kk), elid)
163 iflag(nodeid) = iflag(nodeid) + 1
164 ENDDO
165 ENDDO
166
167 connect_max = maxval(iflag(1:nb_node))
168
169
170 ALLOCATE(n_e_connect(nb_node, connect_max + 1))
171 ALLOCATE(n_e_connect_locid(nb_node, connect_max + 1))
172 n_e_connect(1:nb_node, 1:connect_max + 1) = 0
173 n_e_connect_locid(1:nb_node, 1:connect_max + 1) = 0
174 DO ii = 1, nbric
175 elid = tbric(1, ii)
176 itype = tbric(2, ii)
177 SELECT CASE(itype)
178 CASE(1)
179
180 nnode = 8
181 redir => redirb(1:8)
182 CASE(2)
183
184 nnode = 4
185 redir => redirt(1:4)
186 CASE(3)
187
188 nnode = 6
189 redir => redirp(1:6)
190 CASE(4)
191
192 nnode = 5
193 redir => redirpy(1:5)
194 CASE DEFAULT
196 END SELECT
197 DO kk = 1, nnode
198 nodeid = ixs(1 + redir(kk), elid)
199 count = n_e_connect(nodeid, 1)
200 count = count + 1
201 n_e_connect(nodeid, 1) = count
202 n_e_connect(nodeid, count + 1) = elid
203 n_e_connect_locid(nodeid, count + 1) = ii
204 ENDDO
205 ENDDO
206
207
208 iflag(1:nb_node) = 0
209 count = 0
210
211 DO ii = 1, nseg
212 nsurfnode = 3
213
214 DO kk = 1, nsurfnode
215 kkk = ibuf(elem(kk, ii))
216 iflag(kkk) = 1
217 ENDDO
218 DO kk = 1, nsurfnode
219 kkk = ibuf(elem(kk, ii))
220 DO jj = 1, n_e_connect(kkk, 1)
221 elid = n_e_connect(kkk, 1 + jj)
222 itype = tbric(2, ii)
223 SELECT CASE(itype)
224 CASE(1)
225
226 nnode = 8
227 redir => redirb(1:8)
228 fac => fac8(1:4, 1:6)
229 nod => nod8(1:6)
230 CASE(2)
231
232 nnode = 4
233 redir => redirt(1:4)
234 fac => fac4(1:3, 1:4)
235 nod => nod3(1:4)
236 CASE(3)
237
238 nnode = 6
239 redir => redirp(1:6)
240 fac => fac6(1:4, 1:5)
241 nod => nod6(1:5)
242 CASE(4)
243
244 nnode = 5
245 redir => redirpy(1:5)
246 fac => fac5(1:4, 1:5)
247 nod => nod5(1:5)
248 CASE DEFAULT
250 END SELECT
251 sum = 0
252 DO kkkk = 1, nnode
253 nodeid = ixs(1 + redir(kkkk), elid)
254 sum = sum + iflag(nodeid)
255 ENDDO
256 IF (sum == nsurfnode) THEN
257
258 face_ok = .false.
259 DO iface = 1, nface(itype)
260 sum = 0
261 DO kkkk = 1, nod(
iface)
262 sum = sum + iflag(ixs(1 + fac(kkkk,
iface), elid))
263 ENDDO
264 IF (sum == nsurfnode) THEN
265 face_ok = .true.
266 ENDIF
267 IF (face_ok) THEN
268 EXIT
269 ENDIF
270 ENDDO
271 IF (.NOT. face_ok) THEN
273 ELSE
274 elid1 = n_e_connect_locid(kkk, 1 + jj)
275 tfac(2 *
iface - 1, elid1) = -2
276 count = count + 1
277 ENDIF
278 ENDIF
279 ENDDO
280 ENDDO
281
282 DO kk = 1, nsurfnode
283 kkk = ibuf(elem(kk, ii))
284 iflag(kkk) = 0
285 ENDDO
286 ENDDO
287
288
289 DEALLOCATE(iflag)
290 DEALLOCATE(n_e_connect)
291 DEALLOCATE(n_e_connect_locid)
integer function iface(ip, n)