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