39
40
41
45 use element_mod , only : nixs,nixc,nixtg
46
47
48
49#include "implicit_f.inc"
50#include "com04_c.inc"
51
52
53
54 INTEGER IXS(NIXS,*),IPARTS(*),TAGBUF(*),
55 . KNOD2ELS(*),NOD2ELS(*),
56 . IXS10(6,*),IXS16(8,*),IXS20(12,*),
57 . KNOD2ELC(*),NOD2ELC(*),KNOD2ELTG(*),NOD2ELTG(*),
58 . IXC(NIXC,*),IXTG(NIXTG,*),IPARTC(*),IPARTTG(*)
59 INTEGER IEXT,NSEG,FLAG,IFRE,NSEG0
60 CHARACTER(LEN=NCHARKEY) :: KEY
61 INTEGER :: NINDX, NINDX_SOL, NINDX_SOL10
62 INTEGER, DIMENSION(*) :: INDX,INDX_SOL, INDX_SOL10
63 TYPE(PART_TYPE), DIMENSION(*) :: SURF_ELM
64
65 TYPE (SURF_) :: IGRSURF
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 INTEGER N,J,K,JS,KS,II,JJ,,K2,LL,FACE(4),FC10(3),NN,KK,I1,
94 . NI(4),NS(4),MI(4),MS(4),NMIN,MMIN,NF,MF,IPERM,N1,N2,I
95 INTEGER FACES(4,6),PWR(7),
96 . FACES10(3,6),NNS,ISHEL,ISEG
97 INTEGER, DIMENSION(:), ALLOCATABLE :: NODTAG,FASTAG
98
99 LOGICAL :: FLAG_PART
100
101
102 INTEGER :: NUM_PART,NUM_ELM
103 INTEGER :: ID_PART,JS_PART, JS_ELM
104 DATA faces/4,3,2,1,
105 . 5,6,7,8,
106 . 1,2,6,5,
107 . 3,4,8,7,
108 . 2,3,7,6,
109 . 1,5,8,4/
110 DATA faces10/0,0,0,
111 . 0,0,0,
112 . 3,6,4,
113 . 5,6,2,
114 . 1,2,3,
115 . 4,5,1/
116 DATA pwr/1,2,4,8,16,32,64/
117
118 ALLOCATE(nodtag(numnod),fastag(numels))
119
120 fastag=0
121
122 IF(iext==1)THEN
123
124
125 DO js=1,numels8+numels10
126 IF(key(1:6)=='GRBRIC')THEN
127 IF (tagbuf(js)==0) cycle
128 ELSE
129 IF (tagbuf(iparts(js))==0) cycle
130 END IF
131 DO jj=1,6
132 DO ii=1,4
133 ns(ii)=ixs(faces(ii,jj)+1,js)
134 END DO
135
136
137 DO k1=1,3
138 DO k2=k1+1,4
139 IF(ns(k2)==ns(k1))ns(k2)=0
140 END DO
141 END DO
142 nf=0
143 DO k1=1,4
144 n1=ns(k1)
145 IF(n1/=0)THEN
146 nf=nf+1
147 ns(nf)=n1
148 END IF
149 END DO
150 IF (nf < 3)cycle
151
152
153 nmin=ns(1)
154 DO ii=2,nf
155 nmin=
min(nmin,ns(ii))
156 END DO
157 DO iperm=1,nf
158 IF(nmin==ns(iperm).AND.
159 . ns(mod(iperm,nf)+1)/=ns(iperm))THEN
160 DO ii=1,nf
161 ni(ii)=ns(mod(ii+iperm-2,nf)+1)
162 END DO
163 EXIT
164 END IF
165 END DO
166
167
168 DO k=knod2els(ni(1))+1,knod2els(ni(1)+1)
169 ks=nod2els(k)
170 IF(ks==js .OR. ks > numels8+numels10)cycle
171 IF (key(1:6)=='GRBRIC'.AND.tagbuf(ks)==0.AND.ifre==0)cycle
172 IF (key(1:6)/='GRBRIC'.AND.tagbuf(iparts(ks))==0)cycle
173 DO ii=1,nf
174 nodtag(ni(ii))=0
175 END DO
176 DO ii=1,8
177 nodtag(ixs(ii+1,ks))=1
178 END DO
179 nn=0
180 DO ii=1,nf
181 nn=nn+nodtag(ni(ii))
182 END DO
183 IF(nn==nf)THEN
184 DO kk=1,6
185 DO ii=1,4
186 ms(ii)=ixs(faces(ii,kk)+1,ks)
187 END DO
188
189
190 DO k1=1,3
191 DO k2=k1+1,4
192 IF(ms(k2)==ms(k1))ms(k2)=0
193 END DO
194 END DO
195 mf=0
196 DO k1=1,4
197 n1=ms(k1)
198 IF(n1/=0)THEN
199 mf=mf+1
200 ms(mf)=n1
201 END IF
202 END DO
203 IF(mf /= nf)cycle
204
205
206 mmin=ms(1)
207 DO ii=2,mf
208 mmin=
min(mmin,ms(ii))
209 END DO
210 DO iperm=1,mf
211 IF(mmin==ms(iperm).AND.
212 . ms(mod(iperm,mf)+1)/=ms(iperm))THEN
213 DO ii=1,mf
214 mi(ii)=ms(mod(ii+iperm-2,mf)+1)
215 END DO
216 EXIT
217 END IF
218 END DO
219 IF(mi(1)==ni(1).AND.mi(nf)==ni(2))THEN
220
221 fastag(js)=fastag(js)+pwr(jj)
222 GO TO 300
223 END IF
224 END DO
225 END IF
226 END DO
227 300 CONTINUE
228 END DO
229 END DO
230 END IF
231
232 IF(key(1:6)/='GRBRIC') THEN
233 flag_part=.true.
234 num_part = nindx
235 ELSE
236 flag_part=.false.
237 num_part = 1
238 num_elm = nindx_sol
239 ENDIF
240 DO js_part=1,num_part
241 IF(flag_part) THEN
242 id_part = indx(js_part)
243 num_elm = surf_elm(id_part)%NSOL
244 ENDIF
245 DO js_elm=1,num_elm
246 IF(flag_part) THEN
247 js = surf_elm(id_part)%SOL_PART( js_elm )
248 ELSE
249 js = indx_sol( js_elm )
250
251 ENDIF
252
253
254
255
256 ll=fastag(js)
257 DO jj=1,6
258 IF(mod(ll,pwr(jj+1))/pwr(jj)/=0)cycle
259
260
261 DO k1=1,4
262 i1 =faces(k1,jj)+1
263 face(k1)=ixs(i1,js)
264 END DO
265 DO k1=1,4
266 n1=face(k1)
267 DO k2=1,4
268 IF(k2/=k1)THEN
269 n2=face(k2)
270 IF(n2==n1)face(k2)=0
271 END IF
272 END DO
273 END DO
274 nn=0
275 DO k1=1,4
276 n1=face(k1)
277 IF(n1/=0)THEN
278 nn=nn+1
279 face(nn)=n1
280 END IF
281 END DO
282
283 IF(flag == 0 .and. nn == 3) THEN
284 ks = 0
285 ishel = 0
286 DO k=knod2eltg(face(1))+1,knod2eltg(face(1)+1)
287 ks=nod2eltg(k)
288 ishel = 0
289 DO i=1,3
290 DO j=1,3
291 IF(face(i) == ixtg(j+1,ks)) ishel = ishel + 1
292 ENDDO
293 ENDDO
294 IF (ishel == 3)EXIT
295 ks = 0
296 ENDDO
297 IF(ks == 0)THEN
298 nseg = nseg + 1
299 ELSEIF (iabs(tagbuf(iparttg(ks))) /= 1) THEN
300 nseg = nseg + 1
301 ENDIF
302 ELSEIF(flag == 0 .and. nn == 4) THEN
303 ks = 0
304 ishel = 0
305 DO k=knod2elc(face(1))+
306 ks=nod2elc(k)
307 ishel = 0
308 DO i=1,4
309 DO j=1,4
310 IF(face(i) == ixc(j+1,ks)) ishel = ishel + 1
311 ENDDO
312 ENDDO
313 IF (ishel == 4)EXIT
314 ks = 0
315 ENDDO
316 IF(ks == 0)THEN
317 nseg = nseg + 1
318 ELSEIF (iabs(tagbuf(ipartc(ks))) /= 1)THEN
319 nseg = nseg + 1
320 ENDIF
321 ELSEIF(nn==3)THEN
322 ks = 0
323 ishel = 0
324 DO k=knod2eltg(face(1))+1,knod2eltg(face(1)+1)
325 ks=nod2eltg(k)
326 ishel = 0
327 DO i=1,3
328 DO j=1,3
329 IF(face(i) == ixtg(j+1,ks)) ishel = ishel + 1
330 ENDDO
331 ENDDO
332 IF (ishel == 3)EXIT
333 ks = 0
334 ENDDO
335 IF(ks == 0)THEN
336 nseg = nseg + 1
337 iseg = nseg
338 CALL ssurf10(face(1),face(2),face(3),face(3),js,
339 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
340 ELSEIF (iabs(tagbuf(iparttg(ks))) /= 1)THEN
341 nseg = nseg + 1
342 iseg = nseg
343 CALL ssurf10(face(1),face(2),face(3),face(3),js,
344 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
345 ENDIF
346 ELSEIF(nn==4)THEN
347 ks = 0
348 ishel = 0
349 DO k=knod2elc(face(1))+1,knod2elc(face(1)+1)
350 ks=nod2elc(k)
351 ishel = 0
352 DO i=1,4
353 DO j=1,4
354 IF(face(i) == ixc(j+1,ks)) ishel = ishel + 1
355 ENDDO
356 ENDDO
357 IF (ishel == 4)EXIT
358 ks = 0
359 ENDDO
360 IF(ks == 0)THEN
361 nseg = nseg + 1
362 iseg = nseg
363 CALL ssurf10(face(1),face(2),face(3),face(4),js,
364 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
365 ELSEIF (iabs(tagbuf(ipartc(ks))) /= 1 ) THEN
366 nseg = nseg + 1
367 iseg = nseg
368 CALL ssurf10(face(1),face(2),face(3),face(4),js,
369 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
370 ENDIF
371 END IF
372
373 END DO
374
375 ENDDO
376 ENDDO
377
378 IF(key(1:6)/='GRBRIC') THEN
379 flag_part=.true.
380 num_part = nindx
381 ELSE
382 flag_part=.false.
383 num_part = 1
384 num_elm = nindx_sol10
385 ENDIF
386
387 DO js_part=1,num_part
388 IF(flag_part) THEN
389 id_part = indx(js_part)
390 num_elm = surf_elm(id_part)%NSOL10
391 ENDIF
392
393 DO js_elm=1,num_elm
394 IF(flag_part) THEN
395 js = surf_elm(id_part)%SOL10_PART( js_elm )
396 ELSE
397 js = indx_sol10( js_elm )
398 ENDIF
399 j = js - numels8
400
401
402
403
404
405 ll=fastag(js)
406 DO jj=3,6
407 IF(mod(ll,pwr(jj+1))/pwr(jj) /= 0)cycle
408
409
410 DO k1=1,4
411 face(k1)=ixs(faces(k1,jj)+1,js)
412 END DO
413 DO k1=1,3
414 DO k2=k1+1,4
415 IF(face(k2) == face(k1)) face(k2)=0
416 END DO
417 END DO
418 nn=0
419 DO k1=1,4
420 IF(face(k1) /= 0)THEN
421 nn=nn+1
422 face(nn)=face(k1)
423 END IF
424 END DO
425
426 IF(nn == 3)THEN
427 nns=1
428 fc10(1)=ixs10(faces10(1,jj),j)
429 fc10(2)=ixs10(faces10(2,jj),j)
430 fc10(3)=ixs10(faces10(3,jj),j)
431 IF(fc10(1) /= 0)nns=nns+1
432 IF(fc10(2) /= 0)nns=nns+1
433 IF(fc10(3) /= 0)nns=nns+1
434 IF(nns == 3)nns=2
435 nseg=nseg+nns
436 IF (flag == 1 .and. nns == 4) THEN
437
438 iseg = nseg-nns+1
439 CALL ssurf10(face(1),fc10(1),fc10(3),fc10(3),js,
440 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
441 iseg = nseg-nns+2
442 CALL ssurf10(face(2),fc10(2),fc10(1),fc10(1),js,
443 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
444 iseg = nseg-nns+3
445 CALL ssurf10(face(3),fc10(3),fc10(2),fc10(2),js,
446 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
447 iseg = nseg-nns+4
448 CALL ssurf10(fc10(1),fc10(2),fc10(3),fc10(3),js,
449 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
450 ELSEIF (flag == 1 .and. nns == 3) THEN
451
452 IF(fc10(1) == 0)THEN
453 iseg = nseg-nns+1
454 CALL ssurf10(face(1),face(2),fc10(2),fc10(3),js,
455 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
456 iseg = nseg-nns+2
457 CALL ssurf10(face(3),fc10(3),fc10(2),fc10(2),js,
458 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
459 ELSEIF(fc10(2) == 0)THEN
460 iseg = nseg-nns+1
461 CALL ssurf10(face(2),face(3),fc10(3),fc10(1),js,
462 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
463 iseg = nseg-nns+2
464 CALL ssurf10(face(1),fc10(1),fc10(3),fc10(3),js,
465 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
466 ELSEIF(fc10(3) == 0)THEN
467 iseg = nseg-nns+1
468 CALL ssurf10(face(3),face(1),fc10(1),fc10(2),js,
469 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
470 iseg = nseg-nns+2
471 CALL ssurf10(face(2),fc10(2),fc10(1),fc10(1),js,
472 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
473 ENDIF
474 ELSEIF (flag == 1 .and. nns == 2) THEN
475
476 IF(fc10(1) /= 0)THEN
477 iseg = nseg-nns+1
478 CALL ssurf10(face(3),face(1),fc10(1),fc10(1),js,
479 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
480 iseg = nseg-nns+2
481 CALL ssurf10(face(2),face(3),fc10(1),fc10(1),js,
482 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
483 ELSEIF(fc10(2) /= 0)THEN
484 iseg = nseg-nns+1
485 CALL ssurf10(face(1),face(2),fc10(2),fc10(2),js,
486 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
487 iseg = nseg-nns+2
488 CALL ssurf10(face(3),face(1),fc10(2),fc10(2),js,
489 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
490 ELSEIF(fc10(3) /= 0)THEN
491 iseg = nseg-nns+1
492 CALL ssurf10(face(2),face(3),fc10(3),fc10(3),js,
493 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
494 iseg = nseg-nns+2
495 CALL ssurf10(face(1),face(2),fc10(3),fc10(3),js,
496 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
497 ENDIF
498 ELSEIF (flag == 1 .and. nns == 1) THEN
499
500 iseg = nseg-nns+1
501 CALL ssurf10(face(1),face(2),face(3),face(3),js,
502 . nseg0 ,iseg ,igrsurf%NODES,igrsurf%ELTYP,igrsurf%ELEM)
503 END IF
504 END IF
505
506 END DO
507
508 ENDDO
509 ENDDO
510
511 DEALLOCATE(nodtag,fastag)
512 RETURN
integer, parameter ncharkey
subroutine ssurf10(n1, n2, n3, n4, js, nseg0, iseg, surf_nodes, surf_eltyp, surf_elem)