36
37
38
39 USE my_alloc_mod
42 use element_mod , only : nixs,nixc,nixtg
43
44
45
46#include "implicit_f.inc"
47#include "com04_c.inc"
48
49
50
51 INTEGER IEXT,NSEG,IAD_SURF
52 INTEGER IXS(NIXS,*),IXS10(6,*),IXC(NIXC,*),IXTG(NIXTG,*),
53 . KNOD2ELS(*),NOD2ELS(*),KNOD2ELC(*),NOD2ELC(*),
54 . KNOD2ELTG(*),NOD2ELTG(*),BUFTMPSURF(*),IPARTS(*)
55 CHARACTER(LEN=NCHARFIELD) :: KEYSET
56
57 TYPE (SET_) :: CLAUSE
58
59
60
61 INTEGER J,K,JS,KS,II,JJ,K1,K2,LL,FACE(4),FC10(3),NN,KK,I1,
62 . NI(4),NS(4),MI(4),MS(4),NMIN,MMIN,NF,MF,IPERM,N1,N2,I
63 INTEGER FACES(4,6),PWR(7),
64 . FACES10(3,6),NNS,ISHEL,NB_SOLID,IND
65 INTEGER, DIMENSION(:), ALLOCATABLE:: SOLID_TAG,PART_TAG
66 INTEGER, DIMENSION(:), ALLOCATABLE :: NODTAG
67 INTEGER, DIMENSION(:), ALLOCATABLE :: FASTAG
68
69
70 DATA faces/4,3,2,1,
71 . 5,6,7,8,
72 . 1,2,6,5,
73 . 3,4,8,7,
74 . 2,3,7,6,
75 . 1,5,8,4/
76 DATA faces10/0,0,0,
77 . 0,0,0,
78 . 3,6,4,
79 . 5,6,2,
80 . 1,2,3,
81 . 4,5,1/
82 DATA pwr/1,2,4,8,16,32,64/
83
84 CALL my_alloc(solid_tag,numels)
85 CALL my_alloc(part_tag,npart)
86 CALL my_alloc(nodtag,numnod)
87 CALL my_alloc(fastag,numels)
88
89 solid_tag(1:numels)=0
90 part_tag(1:npart)=0
91
92 DO i=1, clause%NB_PART
93 part_tag(clause%PART(i))=1
94 ENDDO
95
96 DO i=1, clause%NB_SOLID
97 solid_tag(clause%SOLID(i))=1
98 ENDDO
99
100 fastag=0
101
102 IF (iext == 1) THEN
103
104 nb_solid = clause%NB_SOLID
105 DO ind=1,nb_solid
106 js = clause%SOLID(ind)
107 IF (solid_tag(js)==0) cycle
108 DO jj=1,6
109 DO ii=1,4
110 ns(ii)=ixs(faces(ii,jj)+1,js)
111 END DO
112
113
114
115 DO k1=1,3
116 DO k2=k1+1,4
117 IF(ns(k2)==ns(k1))ns(k2)=0
118 END DO
119 END DO
120 nf=0
121 DO k1=1,4
122 n1=ns(k1)
123 IF(n1/=0)THEN
124 nf=nf+1
125 ns(nf)=n1
126 END IF
127 END DO
128 IF (nf < 3)cycle
129
130
131
132 nmin=ns(1)
133 DO ii=2,nf
134 nmin=
min(nmin,ns(ii))
135 END DO
136 DO iperm=1,nf
137 IF(nmin==ns(iperm).AND.
138 . ns(mod(iperm,nf)+1)/=ns(ipermTHEN
139 DO ii=1,nf
140 ni(ii)=ns(mod(ii+iperm-2,nf)+1)
141 END DO
142 EXIT
143 END IF
144 END DO
145
146
147
148 DO k=knod2els(ni(1))+1,knod2els(ni(1)+1)
149 ks=nod2els(k)
150 IF (ks==js .OR. ks > numels8
151 IF (keyset == 'SOLID' .AND. solid_tag(ks)==0) cycle
152 IF (keyset == 'PART' .AND. part_tag(iparts(ks))==0) cycle
153
154 DO ii=1,nf
155 nodtag(ni(ii))=0
156 END DO
157 DO ii=1,8
158 nodtag(ixs(ii+1,ks))=1
159 END DO
160 nn=0
161 DO ii=1,nf
162 nn=nn+nodtag(ni(ii))
163 END DO
164 IF(nn==nf)THEN
165 DO kk=1,6
166 DO ii=1,4
167 ms(ii)=ixs(faces(ii,kk)+1,ks)
168 END DO
169
170
171
172 DO k1=1,3
173 DO k2=k1+1,4
174 IF(ms(k2)==ms(k1))ms(k2)=0
175 END DO
176 END DO
177 mf=0
178 DO k1=1,4
179 n1=ms(k1)
180 IF(n1/=0)THEN
181 mf=mf+1
182 ms(mf)=n1
183 END IF
184 END DO
185 IF(mf /= nf)cycle
186
187
188
189 mmin=ms(1)
190 DO ii=2,mf
191 mmin=
min(mmin,ms(ii))
192 END DO
193 DO iperm=1,mf
194 IF(mmin==ms(iperm).AND.
195 . ms(mod(iperm,mf)+1)/=ms(iperm))THEN
196 DO ii=1,mf
197 mi(ii)=ms(mod(ii+iperm-2,mf)+1)
198 END DO
199 EXIT
200 END IF
201 END DO
202 IF(mi(1)==ni(1).AND.mi(nf)==ni(2))THEN
203
204 fastag(js)=fastag(js)+pwr(jj)
205 GO TO 300
206 END IF
207 END DO
208 END IF
209 END DO
210 300 CONTINUE
211 END DO
212 END DO
213 END IF
214
215
216
217
218
219
220
221
222
223
224 nb_solid = clause%NB_SOLID
225 DO ind=1,nb_solid
226 js = clause%SOLID(ind)
227 IF (solid_tag(js)==0) cycle
228
229 IF (js > numels8) cycle
230
231 ll=fastag(js)
232 DO jj=1,6
233 IF(mod(ll,pwr(jj+1))/pwr(jj)/=0)cycle
234
235
236 DO k1=1,4
237 i1 =faces(k1,jj)+1
238 face(k1)=ixs(i1,js)
239 END DO
240 DO k1=1,4
241 n1=face(k1)
242 DO k2=1,4
243 IF(k2/=k1)THEN
244 n2=face(k2)
245 IF(n2==n1)face(k2)=0
246 END IF
247 END DO
248 END DO
249 nn=0
250 DO k1=1,4
251 n1=face(k1)
252 IF(n1/=0)THEN
253 nn=nn+1
254 face(nn)=n1
255 END IF
256 END DO
257
258 IF(nn==3)THEN
259 ks = 0
260 ishel = 0
261 DO k=knod2eltg(face(1))+1,knod2eltg(face(1)+1)
262 ks=nod2eltg(k)
263 ishel = 0
264 DO i=1,3
265 DO j=1,3
266 IF(face(i) == ixtg(j+1,ks)) ishel = ishel + 1
267 ENDDO
268 ENDDO
269 IF (ishel == 3)EXIT
270 ks = 0
271 ENDDO
272
273 IF(ks == 0 .OR. ishel == 3)THEN
274 nseg = nseg + 1
275 CALL surf_segment(face(1) ,face(2) ,face(3) ,face(3) ,js ,
276 . buftmpsurf ,iad_surf ,1)
277 ENDIF
278 ELSEIF(nn==4)THEN
279 ks = 0
280 ishel = 0
281 DO k=knod2elc(face(1))+1,knod2elc(face(1)+1)
282 ks=nod2elc(k)
283 ishel = 0
284 DO i=1,4
285 DO j=1,4
286 IF(face(i) == ixc(j+1,ks)) ishel = ishel + 1
287 ENDDO
288 ENDDO
289 IF (ishel == 4)EXIT
290 ks = 0
291 ENDDO
292 IF(ks == 0 .OR. ishel == 4)THEN
293 nseg = nseg + 1
294 CALL surf_segment(face(1) ,face(2) ,face(3) ,face(4) ,js ,
295 . buftmpsurf ,iad_surf ,1)
296 ENDIF
297 END IF
298
299 END DO
300 END DO
301
302
303
304
305
306
307
308
309
310
311 nb_solid = clause%NB_SOLID
312 DO ind=1,nb_solid
313 js = clause%SOLID(ind)
314 IF (solid_tag(js)==0) cycle
315
316 j = js - numels8
317 IF (j <= 0) cycle
318
319 ll=fastag(js)
320 DO jj=3,6
321 IF(mod(ll,pwr(jj+1))/pwr(jj) /= 0)cycle
322
323
324
325 DO k1=1,4
326 face(k1)=ixs(faces(k1,jj)+1,js)
327 END DO
328 DO k1=1,3
329 DO k2=k1+1,4
330 IF(face(k2) == face(k1)) face(k2)=0
331 END DO
332 END DO
333 nn=0
334 DO k1=1,4
335 IF(face(k1) /= 0)THEN
336 nn=nn+1
337 face(nn)=face(k1)
338 END IF
339 END DO
340
341 IF(nn == 3)THEN
342 nns=1
343 fc10(1)=ixs10(faces10(1,jj),j)
344 fc10(2)=ixs10(faces10(2,jj),j)
345 fc10(3)=ixs10(faces10(3,jj),j)
346 IF(fc10(1) /= 0)nns=nns+1
347 IF(fc10(2) /= 0)nns=nns+1
348 IF(fc10(3) /= 0)nns=nns+1
349 IF(nns == 3)nns=2
350 nseg=nseg+nns
351 IF (nns == 4) THEN
352
353 CALL surf_segment(face(1) ,fc10(1) ,fc10(3) ,fc10(3) ,js ,
354 . buftmpsurf ,iad_surf ,1)
355 CALL surf_segment(face(2) ,fc10(2) ,fc10(1) ,fc10(1) ,js ,
356 . buftmpsurf ,iad_surf ,1)
357 CALL surf_segment(face(3) ,fc10(3) ,fc10(2) ,fc10(2) ,js ,
358
359 CALL surf_segment(fc10(1) ,fc10(2) ,fc10(3) ,fc10(3) ,js ,
360 . buftmpsurf ,iad_surf ,1)
361 ELSEIF (nns == 3) THEN
362
363 IF(fc10(1) == 0)THEN
364 CALL surf_segment(face(1) ,face(2) ,fc10(2) ,fc10(3) ,js ,
365 . buftmpsurf ,iad_surf ,1)
366 CALL surf_segment(face(3) ,fc10(3) ,fc10(2) ,fc10(2) ,js ,
367 . buftmpsurf ,iad_surf ,1)
368 ELSEIF(fc10(2) == 0)THEN
369 CALL surf_segment(face(2) ,face(3) ,fc10(3) ,fc10(1) ,js ,
370 . buftmpsurf ,iad_surf ,1)
371 CALL surf_segment(face(1) ,fc10(1) ,fc10(3) ,fc10(3) ,js ,
372 . buftmpsurf ,iad_surf ,1)
373 ELSEIF(fc10(3) == 0)THEN
375 . buftmpsurf ,iad_surf ,1)
376 CALL surf_segment(face(2) ,fc10(2) ,fc10(1) ,fc10(1) ,js ,
377 . buftmpsurf ,iad_surf ,1)
378 ENDIF
379 ELSEIF (nns == 2) THEN
380
381 IF(fc10(1) /= 0)THEN
382 CALL surf_segment(face(3) ,face(1) ,fc10(1) ,fc10(1) ,js ,
383 . buftmpsurf ,iad_surf ,1)
384 CALL surf_segment(face(2) ,face(3) ,fc10(1) ,fc10(1) ,js ,
385 . buftmpsurf ,iad_surf ,1)
386 ELSEIF(fc10(2) /= 0)THEN
387 CALL surf_segment(face(1) ,face(2) ,fc10(2) ,fc10(2) ,js ,
388 . buftmpsurf ,iad_surf ,1)
389 CALL surf_segment(face(3) ,face(1) ,fc10(2) ,fc10(2) ,js ,
390 . buftmpsurf ,iad_surf ,1)
391 ELSEIF(fc10(3) /= 0)THEN
392 CALL surf_segment(face(2) ,face(3) ,fc10(3) ,fc10(3) ,js ,
393 . buftmpsurf ,iad_surf ,1)
394 CALL surf_segment(face(1) ,face(2) ,fc10(3) ,fc10(3) ,js ,
395 . buftmpsurf ,iad_surf ,1)
396 ENDIF
397 ELSEIF (nns == 1) THEN
398
399 CALL surf_segment(face(1) ,face(2) ,face(3) ,face(3) ,js ,
400 . buftmpsurf ,iad_surf ,1)
401 END IF
402 END IF
403
404 END DO
405 END DO
406
407 DEALLOCATE(nodtag)
408 DEALLOCATE(fastag)
409 RETURN
integer, parameter ncharfield
subroutine surf_segment(n1, n2, n3, n4, elem, buftmpsurf, iad_surf, eltyp)