35
36
37
38#include "implicit_f.inc"
39
40
41
42#include "units_c.inc"
43
44
45
46 INTEGER NPPMAX, IPOLY(6+NPPMAX,*), POLB(*), , NPHMAX,
47 . POLH(NPHMAX+2,*),NPOLH, NRPMAX, IBRIC, INFO, NPOLHMAX
48 INTEGER TAGELA(*)
49 INTEGER NEL, INZ
51 . rpoly(nrpmax,*), lmin
52
53
54
55 INTEGER I, ICMAX, II, J, JJ, K, KK, IEL
56 INTEGER L, LL, ITY, JMIN, PMIN, POLD, NEDGE, NVERTEX
57 INTEGER IMIN, IMAX, I1, I2, I3, I4, N1, N2, K1, K2
58 INTEGER M1, M2, L1, L2
59 INTEGER ITAG(2,NPOLB), POLEDG(NPOLB,NPPMAX+1), ITYP()
60 INTEGER NTYP(3), REDIR(4), TEMP1(4), TEMP2(4)
61 INTEGER NNP, NHOL, NSEG, NELP, JTAG(3), NTRI3(NPOLB,NPPMAX)
62 INTEGER, ALLOCATABLE :: EDGPOL(:,:)
63 INTEGER, ALLOCATABLE :: EDGVER(:,:)
64 INTEGER, ALLOCATABLE :: EDGLOC(:,:)
65 INTEGER, ALLOCATABLE :: PSEG(:,:),PTRI(:,:)
67 . x1, y1, z1, x2, y2, z2, xx1, yy1, zz1, xx2, yy2, zz2,
68 . dd11, dd12, dd21, dd22, tole
70 . tst12, tst13, tst21, tst32, tst14,
71 . nx, ny, nz, nx1, ny1, nz1
73 . x0, y0, z0, nrm1, vx1, vy1, vz1, vx2, vy2, vz2,
74 . vx, vy, vz
76 . alpha13, alpha14
77 my_real,
ALLOCATABLE :: xx(:), yy(:), zz(:)
78 my_real,
ALLOCATABLE :: pnodes(:,:), pholes(:,:)
79
80 tole=epsilon(zero)*0.5*lmin*lmin
81
82
83
84 DO ii=1,npolb
85 i=polb(ii)
86 nnp=ipoly(2,i)
87 nhol=0
88 ALLOCATE(pnodes(2,nnp), pseg(2,nnp),ptri(3,2*nnp),pholes(2,1))
89 ptri(1:3,1:2*nnp) = 0
90
91
92 nx=rpoly(2,i)
93 ny=rpoly(3,i)
94 nz=rpoly(4,i)
95
96 x0=rpoly(5,i)
97 y0=rpoly(6,i)
98 z0=rpoly(7,i)
99 x1=rpoly(8,i)
100 y1=rpoly(9,i)
101 z1=rpoly(10,i)
102 nrm1=sqrt((x1-x0)**2+(y1-y0)**2+(z1-z0)**2)
103 vx1=(x1-x0)/nrm1
104 vy1=(y1-y0)/nrm1
105 vz1=(z1-z0)/nrm1
106 vx2=ny*vz1-nz*vy1
107 vy2=nz*vx1-nx*vz1
108 vz2=nx*vy1-ny*vx1
109
110 pnodes(1,1)=zero
111 pnodes(2,1)=zero
112 DO j=2,nnp
113 x1=rpoly(4+3*(j-1)+1,i)
114 y1=rpoly(4+3*(j-1)+2,i)
115 z1=rpoly(4+3*(j-1)+3,i)
116 vx=x1-x0
117 vy=y1-y0
118 vz=z1-z0
119 pnodes(1,j)=vx*vx1+vy*vy1+vz*vz1
120 pnodes(2,j)=vx*vx2+vy*vy2+vz*vz2
121 pseg(1,j-1)=j-1
122 pseg(2,j-1)=j
123 ENDDO
124 pseg(1,nnp)=nnp
125 pseg(2,nnp)=1
126 nseg=nnp
127
128 nelp = 0
129 CALL c_tricall(pnodes, pseg, pholes, ptri, nnp,
130 . nseg, nhol, nelp )
131
132
133
134
135
136
137
138
139
140
141 DO j=1,nnp
142 n1=j
143 n2=j+1
144 IF(j==nnp) n2=1
145 DO k=1,nelp
146 jtag(k)=0
147 DO l=1,3
148 IF(ptri(l,k) == n1) jtag(k)=jtag(k)+1
149 IF(ptri(l,k) == n2) jtag(k)=jtag(k)+1
150 ENDDO
151 ENDDO
152 DO k=1,nelp
153 IF(jtag(k) /= 2) cycle
154 DO l=1,3
155 IF(ptri(l,k) == n1 .OR. ptri(l,k) == n2) cycle
156 ntri3(ii,j) = ptri(l,k)
157 ENDDO
158 ENDDO
159 ENDDO
160
161 DEALLOCATE(pnodes, pseg, ptri, pholes)
162 ENDDO
163
164
165
166
167
168
169
170 ALLOCATE (xx(npolb*nppmax*2))
171 ALLOCATE (yy(npolb*nppmax*2))
172 ALLOCATE (zz(npolb*nppmax*2))
173 ALLOCATE (edgver(npolb*nppmax,2))
174 DO i=1,npolb
175 DO j=1,nppmax+1
176 poledg(i,j)=0
177 ENDDO
178 ENDDO
179 nedge=0
180 nvertex=0
181 DO i=1,npolb
182 ii=polb(i)
183 poledg(i,1)=ipoly(2,ii)
184 DO j=1,ipoly(2,ii)
185 jj=j+1
186 IF(poledg(i,jj) > 0) cycle
187 nedge=nedge+1
188 poledg(i,jj)=nedge
189 x1=rpoly(4+3*(j-1)+1,ii)
190 y1=rpoly(4+3*(j-1)+2,ii)
191 z1=rpoly(4+3*(j-1)+3,ii)
192 nvertex=nvertex+1
193 edgver(nedge,1)=nvertex
194 xx(nvertex)=x1
195 yy(nvertex)=y1
196 zz(nvertex)=z1
197 IF (j==ipoly(2,ii)) jj=1
198 x2=rpoly(4+3*(jj-1)+1,ii)
199 y2=rpoly(4+3*(jj-1)+2,ii)
200 z2=rpoly(4+3*(jj-1)+3,ii)
201 nvertex=nvertex+1
202 edgver(nedge,2)=nvertex
203 xx(nvertex)=x2
204 yy(nvertex)=y2
205 zz(nvertex)=z2
206 DO k=1,npolb
207 IF (k==i) cycle
208 kk=polb(k)
209 DO l=1,ipoly(2,kk)
210 ll=l+1
211 IF (l==ipoly(2,kk)) ll=1
212 xx1=rpoly(4+3*(l-1)+1,kk)
213 yy1=rpoly(4+3*(l-1)+2,kk)
214 zz1=rpoly(4+3*(l-1)+3,kk)
215 xx2=rpoly(4+3*(ll-1)+1,kk)
216 yy2=rpoly(4+3*(ll-1)+2,kk)
217 zz2=rpoly(4+3*(ll-1)+3,kk)
218 dd11=(xx1-x1)**2+(yy1-y1)**2+(zz1-z1)**2
219 dd21=(xx2-x1)**2+(yy2-y1)**2+(zz2-z1)**2
220 dd12=(xx1-x2)**2+(yy1-y2)**2+(zz1-z2)**2
221 dd22=(xx2-x2)**2+(yy2-y2)**2+(zz2-z2)**2
222 IF ((dd11<=tole.AND.dd22<=tole).OR.
223 . (dd21<=tole.AND.dd12<=tole)) THEN
224 poledg(k,l+1)=nedge
225 ENDIF
226 ENDDO
227 ENDDO
228 ENDDO
229 ENDDO
230
231
232
233
234
235
236 ALLOCATE(edgpol(nedge,5))
237 ALLOCATE(edgloc(nedge,4))
238 DO i=1,nedge
239 DO j=1,4
240 edgpol(i,j)=0
241 edgloc(i,j)=0
242 ENDDO
243 edgpol(i,5)=0
244 ENDDO
245 DO i=1,npolb
246 DO j=1,poledg(i,1)
247 k=poledg(i,j+1)
248 IF(k==0) cycle
249 kk=edgpol(k,1)
250 kk=kk+1
251 IF(kk > 4) THEN
252 n1=edgver(k,1)
253 n2=edgver(k,2)
254 WRITE(iout,'(A,I5,A /A,1P3G20.13,A/A,1P3G20.13,A)')
255 . ' FVMBAG MESH ERROR : EDGE N1N2 IS CONNECTED TO ',kk,
256 . ' POLYGONS BUT THE LIMIT IS 4',
257 . ' N1 = (',xx(n1),yy(n1),zz(n1),')',
258 . ' N2 = (',xx(n2),yy(n2),zz(n2),')'
260 ENDIF
261 edgpol(k,1)=kk
262 edgpol(k,kk+1)=i
263 edgloc(k,kk)=j
264 ENDDO
265 ENDDO
266
267 DO i=1,npolb
268 itag(1,i)=0
269 itag(2,i)=0
270 ii=polb(i)
271 ity=ipoly(1,ii)
272 iel=ipoly(3,ii)
273 IF(ity == 1 .AND. tagela(iel) > nel) ity=3
274 ityp(i)=ity
275 ENDDO
276
277
278
279 DO j=1,nedge
280 n1=edgver(j,1)
281 n2=edgver(j,2)
282 DO k=1,3
283 ntyp(k)=0
284 ENDDO
285 l=edgpol(j,1)
286 DO k=1,l
287 ii=edgpol(j,k+1)
288 IF(ityp(ii) == 1) ntyp(1)=ntyp(1)+1
289 IF(ityp(ii) == 2) ntyp(2)=ntyp(2)+1
290 IF(ityp(ii) == 3) ntyp(3)=ntyp(3)+1
291 ENDDO
292 IF(l == 1) THEN
293 WRITE(iout,'(/2(A,I5),A,2(/A,1P3G20.13,A))')
294 . ' FVMBAG MESH ERROR : BRICK ',ibric,' LAYER ',inz,
295 . ' EDGE N1N2 IS CONNECTED TO ONLY 1 POLYGON',
296 . ' N1 = (',xx(n1),yy(n1),zz(n1),')',
297 . ' N2 = (',xx(n2),yy(n2),zz(n2),')'
299 ELSEIF(l == 2 .AND. ntyp(3) == 1) THEN
300 WRITE(iout,'(/2(A,I5),2A,2(/A,1P3G20.13,A))')
301 . ' FVMBAG MESH ERROR : BRICK ',ibric,' LAYER ',inz,
302 . ' EDGE N1N2 IS CONNECTED TO 2 POLYGONS BUT ONLY 1',
303 . ' INTERNAL POLYGON',
304 . ' N1 = (',xx(n1),yy(n1),zz(n1),')',
305 . ' N2 = (',xx(n2),yy(n2),zz(n2),')'
307 ELSEIF(l == 3 .AND. ntyp(3) == 2) THEN
308 WRITE(iout,'(/2(A,I5),2A,2(/A,1P3G20.13,A))')
309 . ' FVMBAG MESH ERROR : BRICK ',ibric,' LAYER ',inz,
310 . ' EDGE N1N2 IS CONNECTED TO 3 POLYGONS 2 BEING',
311 . ' INTERNAL POLYGONS',
312 . ' N1 = (',xx(n1),yy(n1),zz(n1),')',
313 . ' N2 = (',xx(n2),yy(n2),zz(n2),')'
315 ELSEIF(l == 4) THEN
316 IF(ntyp(3) == 1) THEN
317 WRITE(iout,'(/2(A,I5),2A,2(/A,1P3G20.13,A))')
318 . ' FVMBAG MESH ERROR : BRICK ',ibric,' LAYER ',inz,
319 . ' EDGE N1N2 IS CONNECTED TO 4 POLYGONS ONLY 1 BEING',
320 . ' INTERNAL POLYGON',
321 . ' N1 = (',xx(n1),yy(n1),zz(n1),')',
322 . ' N2 = (',xx(n2),yy(n2),zz(n2),')'
324 ELSEIF( ntyp(3) >= 3) THEN
325 WRITE(iout,'(/2(A,I5),2A,2(/A,1P3G20.13,A))')
326 . ' FVMBAG MESH ERROR : BRICK ',ibric,' LAYER ',inz,
327 . ' EDGE N1N2 IS CONNECTED TO 4 POLYGONS 3 BEING',
328 . ' INTERNAL POLYGONS',
329 . ' N1 = (',xx(n1),yy(n1),zz(n1),')',
330 . ' N2 = (',xx(n2),yy(n2),zz(n2),')'
332 ENDIF
333 ELSEIF(l >= 5) THEN
334 WRITE(iout,'(/2(A,I5),A,2(/A,1P3G20.13,A))')
335 . ' FVMBAG MESH ERROR : BRICK ',ibric,' LAYER ',inz,
336 . ' EDGE N1N2 IS CONNECTED TO MORE THAN 4 POLYGONS',
337 . ' N1 = (',xx(n1),yy(n1),zz(n1),')',
338 . ' N2 = (',xx(n2),yy(n2),zz(n2),')'
340 ENDIF
341 ENDDO
342
343
344
345 DO j=1,nedge
346 IF(edgpol(j,1) == 2 ) cycle
347 DO k=1,edgpol(j,1)
348 temp1(k)=edgpol(j,k+1)
349 temp2(k)=edgloc(j,k)
350 ENDDO
351 i=1
352 DO k=1,edgpol(j,1)
353 l=edgpol(j,k+1)
354 IF(ityp(l) == 3) THEN
355 redir(i)=k
356 i=i+1
357 ENDIF
358 ENDDO
359 DO k=1,edgpol(j,1)
360 l=edgpol(j,k+1)
361 IF(ityp(l) /= 3) THEN
362 redir(i)=k
363 i=i+1
364 ENDIF
365 ENDDO
366 DO k=1,edgpol(j,1)
367 edgpol(j,k+1)=temp1(redir(k))
368 edgloc(j,k) =temp2(redir(k))
369 ENDDO
370 ENDDO
371
372
373
374
375
376 icmax=0
377
378
379
380 DO j=1,nedge
381 IF(edgpol(j,1) < 4) cycle
382 i1=edgpol(j,2)
383 i2=edgpol(j,3)
384 i3=edgpol(j,4)
385 i4=edgpol(j,5)
386 ii=polb(i1)
387 nx=rpoly(2,ii)
388 ny=rpoly(3,ii)
389 nz=rpoly(4,ii)
390 n1=edgver(j,1)
391 x1=xx(n1)
392 y1=yy(n1)
393 z1=zz(n1)
394 jj=edgloc(j,2)
395 jj=ntri3(i2,jj)
396 ii=polb(i2)
397 x2=rpoly(4+3*(jj-1)+1,ii)
398 y2=rpoly(4+3*(jj-1)+2,ii)
399 z2=rpoly(4+3*(jj-1)+3,ii)
400 tst12=nx*(x2-x1)+ny*(y2-y1)+nz*(z2-z1)
401
402 jj=edgloc(j,3)
403 jj=ntri3(i3,jj)
404 ii=polb(i3)
405 nx1=rpoly(2,ii)
406 ny1=rpoly(3,ii)
407 nz1=rpoly(4,ii)
408 x2=rpoly(4+3*(jj-1)+1,ii)
409 y2=rpoly(4+3*(jj-1)+2,ii)
410 z2=rpoly(4+3*(jj-1)+3,ii)
411 vx=x2-x1
412 vy=y2-y1
413 vz=z2-z1
414 tst13=nx*vx+ny*vy+nz*vz
415 alpha13=acos(nx*nx1+ny*ny1+nz*nz1)
416
417 jj=edgloc(j,4)
418 jj=ntri3(i4,jj)
419 ii=polb(i4)
420 nx1=rpoly(2,ii)
421 ny1=rpoly(3,ii)
422 nz1=rpoly(4,ii)
423 x2=rpoly(4+3*(jj-1)+1,ii)
424 y2=rpoly(4+3*(jj-1)+2,ii)
425 z2=rpoly(4+3*(jj-1)+3,ii)
426 vx=x2-x1
427 vy=y2-y1
428 vz=z2-z1
429 tst14=nx*vx+ny*vy+nz*vz
430 alpha14=acos(nx*nx1+ny*ny1+nz*nz1)
431
432 ii=polb(i2)
433 nx=rpoly(2,ii)
434 ny=rpoly(3,ii)
435 nz=rpoly(4,ii)
436 jj=edgloc(j,1)
437 jj=ntri3(i1,jj)
438 ii=polb(i1)
439 x2=rpoly(4+3*(jj-1)+1,ii)
440 y2=rpoly(4+3*(jj-1)+2,ii)
441 z2=rpoly(4+3*(jj-1)+3,ii)
442 tst21=nx*(x2-x1)+ny*(y2-y1)+nz*(z2-z1)
443
444 IF(tst12*tst21 < zero) THEN
445 n2=edgver(j,2)
446 WRITE(iout,'(/2(A,I5),2A,2(/A,1P3G20.13,A))')
447 . ' FVMBAG MESH ERROR : BRICK ',ibric,' LAYER ',inz,
448 ' WRONG NORMAL ORIENTATION OF INTERNAL SURFACE ELEMENTS'
449 . ' CONNECTED TO EDGE N1N2',
450 . ' N1 = (',xx(n1),yy(n1),zz(n1),')',
451 . ' N2 = (',xx(n2),yy(n2),zz(n2),')'
453 ELSE
454 icmax=icmax+1
455 itag(1,i1)=icmax
456 itag(1,i2)=icmax
457 ENDIF
458
459 IF(tst13 > zero .AND. tst14 > zero) THEN
460 IF(alpha13 < alpha14) THEN
461 icmax=icmax+1
462 itag(2,i1)=icmax
463 itag(1,i3)=icmax
464 icmax=icmax+1
465 itag(2,i2)=icmax
466 itag(1,i4)=icmax
467 ELSE
468 icmax=icmax+1
469 itag(2,i1)=icmax
470 itag(1,i4)=icmax
471 icmax=icmax+1
472 itag(2,i2)=icmax
473 itag(1,i3)=icmax
474 ENDIF
475 ELSEIF(tst13 < zero .AND. tst14 < zero) THEN
476 IF(alpha13 < alpha14) THEN
477 icmax=icmax+1
478 itag(2,i1)=icmax
479 itag(1,i4)=icmax
480 icmax=icmax+1
481 itag(2,i2)=icmax
482 itag(1,i3)=icmax
483 ELSE
484 icmax=icmax+1
485 itag(2,i1)=icmax
486 itag(1,i3)=icmax
487 icmax=icmax+1
488 itag(2,i2)=icmax
489 itag(1,i4)=icmax
490 ENDIF
491 ELSEIF(tst13 > zero .AND. tst14 < zero) THEN
492 icmax=icmax+1
493 itag(2,i1)=icmax
494 itag(1,i3)=icmax
495 icmax=icmax+1
496 itag(2,i2)=icmax
497 itag(1,i4)=icmax
498 ELSEIF(tst13 < zero .AND. tst14 > zero) THEN
499 icmax=icmax+1
500 itag(2,i1)=icmax
501 itag(1,i4)=icmax
502 icmax=icmax+1
503 itag(2,i2)=icmax
504 itag(1,i3)=icmax
505 ENDIF
506 ENDDO
507
508
509
510 DO j=1,nedge
511 IF(edgpol(j,1) /= 3) cycle
512 i1=edgpol(j,2)
513 i2=edgpol(j,3)
514 IF(ityp(i2) /= 3) cycle
515 i3=edgpol(j,4)
516 n1=edgver(j,1)
517 x1=xx(n1)
518 y1=yy(n1)
519 z1=zz(n1)
520
521 ii=polb(i1)
522 nx=rpoly(2,ii)
523 ny=rpoly(3,ii)
524 nz=rpoly(4,ii)
525 jj=edgloc(j,2)
526 jj=ntri3(i2,jj)
527 ii=polb(i2)
528 x2=rpoly(4+3*(jj-1)+1,ii)
529 y2=rpoly(4+3*(jj-1)+2,ii)
530 z2=rpoly(4+3*(jj-1)+3,ii)
531 tst12=nx*(x2-x1)+ny*(y2-y1)+nz*(z2-z1)
532 IF(tst12 < zero) THEN
533 k1=1
534 k2=2
535 ELSE
536 k1=2
537 k2=1
538 ENDIF
539
540 ii=polb(i2)
541 nx=rpoly(2,ii)
542 ny=rpoly(3,ii)
543 nz=rpoly(4,ii)
544 jj=edgloc(j,2)
545 jj=ntri3(i1,jj)
546 ii=polb(i1)
547 x2=rpoly(4+3*(jj-1)+1,ii)
548 y2=rpoly(4+3*(jj-1)+2,ii)
549 z2=rpoly(4+3*(jj-1)+3,ii)
550 tst21=nx*(x2-x1)+ny*(y2-y1)+nz*(z2-z1)
551 IF(tst21 < zero) THEN
552 l1=1
553 l2=2
554 ELSE
555 l1=2
556 l2=1
557 ENDIF
558
559 ii=polb(i3)
560 nx=rpoly(2,ii)
561 ny=rpoly(3,ii)
562 nz=rpoly(4,ii)
563 jj=edgloc(j,2)
564 jj=ntri3(i2,jj)
565 ii=polb(i2)
566 x2=rpoly(4+3*(jj-1)+1,ii)
567 y2=rpoly(4+3*(jj-1)+2,ii)
568 z2=rpoly(4+3*(jj-1)+3,ii)
569 tst32=nx*(x2-x1)+ny*(y2-y1)+nz*(z2-z1)
570 IF(tst32 < zero) THEN
571 m1=1
572 m2=2
573 ELSE
574 m1=2
575 m2=1
576 ENDIF
577
578 IF (itag(k1,i1) == 0 .AND. itag(l1,i2) == 0) THEN
579 icmax=icmax+1
580 itag(k1,i1)=icmax
581 itag(l1,i2)=icmax
582 ELSEIF(itag(k1,i1) == 0 .AND. itag(l1,i2) /= 0) THEN
583 itag(k1,i1)=itag(l1,i2)
584 ELSEIF(itag(k1,i1) /= 0. and. itag(l1,i2) == 0) THEN
585 itag(l1,i2)=itag(k1,i1)
586 ELSEIF(itag(k1,i1) /= 0 .AND. itag(l1,i2) /= 0) THEN
587 IF(itag(k1,i1) /= itag(l1,i2)) THEN
588 imin=
min(itag(l1,i2),itag(k1,i1))
589 imax=
max(itag(l1,i2),itag(k1,i1))
590 DO i=1,npolb
591 IF(itag(1,i) == imax) itag(1,i)=imin
592 IF(ityp(i) /= 3) cycle
593 IF(itag(2,i) == imax) itag(2,i)=imin
594 ENDDO
595 ENDIF
596 ENDIF
597
598 IF(itag(m1,i3) == 0 .AND. itag(l2,i2) == 0) THEN
599 icmax=icmax+1
600 itag(m1,i3)=icmax
601 itag(l2,i2)=icmax
602 ELSEIF(itag(m1,i3) /= 0 .AND. itag(l2,i2) == 0) THEN
603 itag(l2,i2)=itag(m1,i3)
604 ELSEIF(itag(m1,i3) == 0 .AND. itag(l2,i2) /= 0) THEN
605 itag(m1,i3)=itag(l2,i2)
606 ELSEIF(itag(m1,i3) /= 0 .AND. itag(l2,i2) /= 0) THEN
607 IF(itag(m1,i3) /= itag(l2,i2)) THEN
608 imin=
min(itag(m1,i3),itag(l2,i2))
609 imax=
max(itag(m1,i3),itag(l2,i2))
610 DO i=1,npolb
611 IF(itag(1,i) == imax) itag(1,i)=imin
612 IF(ityp(i) /= 3) cycle
613 IF(itag(2,i) == imax) itag(2,i)=imin
614 ENDDO
615 ENDIF
616 ENDIF
617
618 IF(itag(m2,i3) == 0 .AND. itag(k2,i1) == 0) THEN
619 icmax=icmax+1
620 itag(m2,i3)=icmax
621 itag(k2,i1)=icmax
622 ELSEIF(itag(m2,i3) /= 0 .AND. itag(k2,i1) == 0) THEN
623 itag(k2,i1)=itag(m2,i3)
624 ELSEIF(itag(m2,i3) == 0 .AND. itag(k2,i1) /= 0) THEN
625 itag(m2,i3)=itag(k2,i1)
626 ELSEIF(itag(m2,i3) /= 0 .AND. itag(k2,i1) /= 0) THEN
627 IF(itag(m2,i3) /= itag(k2,i1)) THEN
628 imin=
min(itag(m2,i3),itag(k2,i1))
629 imax=
max(itag(m2,i3),itag(k2,i1))
630 DO i=1,npolb
631 IF(itag(1,i) == imax) itag(1,i)=imin
632 IF(ityp(i) /= 3) cycle
633 IF(itag(2,i) == imax) itag(2,i)=imin
634 ENDDO
635 ENDIF
636 ENDIF
637 ENDDO
638
639
640
641 DO j=1,nedge
642 IF(edgpol(j,1) /= 3) cycle
643 i1=edgpol(j,2)
644 i2=edgpol(j,3)
645 IF(ityp(i2) == 3) cycle
646 i3=edgpol(j,4)
647 ii=polb(i1)
648 nx=rpoly(2,ii)
649 ny=rpoly(3,ii)
650 nz=rpoly(4,ii)
651 n1=edgver(j,1)
652 x1=xx(n1)
653 y1=yy(n1)
654 z1=zz(n1)
655 jj=edgloc(j,2)
656 jj=ntri3(i2,jj)
657 ii=polb(i2)
658 x2=rpoly(4+3*(jj-1)+1,ii)
659 y2=rpoly(4+3*(jj-1)+2,ii)
660 z2=rpoly(4+3*(jj-1)+3,ii)
661 tst12=nx*(x2-x1)+ny*(y2-y1)+nz*(z2-z1)
662 IF(tst12 < zero) THEN
663 k1=1
664 k2=2
665 ELSE
666 k1=2
667 k2=1
668 ENDIF
669 IF (itag(k1,i1) == 0 .AND. itag(1,i2) == 0) THEN
670 icmax=icmax+1
671 itag(k1,i1)=icmax
672 itag(1,i2)=icmax
673 IF(itag(1,i3) == 0) THEN
674 icmax=icmax+1
675 itag(k2,i1)=icmax
676 itag(1,i3)=icmax
677 ELSE
678 itag(k2,i1)=itag(1,i3)
679 ENDIF
680 ELSEIF(itag(k1,i1) == 0 .AND. itag(1,i2) /= 0) THEN
681 itag(k1,i1)=itag(1,i2)
682 IF(itag(1,i3) == 0) THEN
683 icmax=icmax+1
684 itag(k2,i1)=icmax
685 itag(1,i3)=icmax
686 ELSE
687 itag(k2,i1)=itag(1,i3)
688 ENDIF
689 ELSEIF(itag(k1,i1) /= 0. and. itag(1,i2) == 0) THEN
690 itag(1,i2)=itag(k1,i1)
691 IF(itag(1,i3) == 0) THEN
692 itag(1,i3)=itag(k2,i1)
693 ELSEIF(itag(1,i3) /= itag(k2,i1)) THEN
694 imin=
min(itag(1,i3),itag(k2,i1))
695 imax=
max(itag(1,i3),itag(k2,i1))
696 DO i=1,npolb
697 IF(itag(1,i) == imax) itag(1,i)=imin
698 IF(ityp(i) /= 3) cycle
699 IF(itag(2,i) == imax) itag(2,i)=imin
700 ENDDO
701 ENDIF
702 ELSEIF(itag(k1,i1) /= 0 .AND. itag(1,i2) /= 0) THEN
703 IF(itag(k1,i1) /= itag(1,i2)) THEN
704 imin=
min(itag(1,i2),itag(k1,i1))
705 imax=
max(itag(1,i2),itag(k1,i1))
706 DO i=1,npolb
707 IF(itag(1,i) == imax) itag(1,i)=imin
708 IF(ityp(i) /= 3) cycle
709 IF(itag(2,i) == imax) itag(2,i)=imin
710 ENDDO
711 ENDIF
712 IF(itag(1,i3) == 0) THEN
713 itag(1,i3)=itag(k2,i1)
714 ELSEIF(itag(1,i3) /= itag(k2,i1)) THEN
715 imin=
min(itag(1,i3),itag(k2,i1))
716 imax=
max(itag(1,i3),itag(k2,i1))
717 DO i=1,npolb
718 IF(itag(1,i) == imax) itag(1,i)=imin
719 IF(ityp(i) /= 3) cycle
720 IF(itag(2,i) == imax) itag(2,i)=imin
721 ENDDO
722 ENDIF
723 ENDIF
724 ENDDO
725
726
727
728
729 DO j=1,nedge
730 IF(edgpol(j,1) > 2) cycle
731 i1=edgpol(j,2)
732 i2=edgpol(j,3)
733 IF((ityp(i1) /= 3 .AND. ityp(i2) /= 3) .OR.
734 . (ityp(i1) == 3 .AND. ityp(i2) == 3) ) THEN
735 IF (itag(1,i1) == 0 .AND. itag(1,i2) == 0) THEN
736 icmax=icmax+1
737 itag(1,i1)=icmax
738 itag(1,i2)=icmax
739 ELSEIF(itag(1,i1) == 0 .AND. itag(1,i2) /= 0) THEN
740 itag(1,i1)=itag(1,i2)
741 ELSEIF(itag(1,i1) /= 0. and. itag(1,i2) == 0) THEN
742 itag(1,i2)=itag(1,i1)
743 ELSEIF(itag(1,i1) /= itag(1,i2)) THEN
744 imin=
min(itag(1,i1),itag(1,i2))
745 imax=
max(itag(1,i1),itag(1,i2))
746 DO i=1,npolb
747 IF(itag(1,i) == imax) itag(1,i)=imin
748 IF(ityp(i) /= 3) cycle
749 IF(itag(2,i) == imax) itag(2,i)=imin
750 ENDDO
751 ENDIF
752 ENDIF
753
754 IF(ityp(i1) == 3 .AND. ityp(i2) == 3) THEN
755 IF (itag(2,i1) == 0 .AND. itag(2,i2) == 0) THEN
756 icmax=icmax+1
757 itag(2,i1)=icmax
758 itag(2,i2)=icmax
759 ELSEIF(itag(2,i1) == 0 .AND. itag(2,i2) /= 0) THEN
760 itag(2,i1)=itag(2,i2)
761 ELSEIF(itag(2,i1) /= 0. and. itag(2,i2) == 0) THEN
762 itag(2,i2)=itag(2,i1)
763 ELSEIF(itag(2,i1) /= itag(2,i2)) THEN
764 imin=
min(itag(2,i1),itag(2,i2))
765 imax=
max(itag(2,i1),itag(2,i2))
766 DO i=1,npolb
767 IF(itag(1,i) == imax) itag(1,i)=imin
768 IF(ityp(i) /= 3) cycle
769 IF(itag(2,i) == imax) itag(2,i)=imin
770 ENDDO
771 ENDIF
772 ENDIF
773 ENDDO
774
775 DEALLOCATE (edgpol)
776 DEALLOCATE (edgloc)
777 DEALLOCATE (edgver)
778 DEALLOCATE (xx,yy,zz)
779
780 npolh=0
781 DO i=1,icmax
782 ii=0
783 DO j=1,npolb
784 IF (itag(1,j) == i .OR. itag(2,j) == i) ii=ii+1
785 ENDDO
786 IF (ii/=0) npolh=npolh+1
787 ENDDO
788 IF (npolh>npolhmax) THEN
789 info=1
790 npolhmax=npolh
791 RETURN
792 ENDIF
793
794 npolh=0
795 DO i=1,icmax
796 ii=0
797 DO j=1,npolb
798 IF (itag(1,j) == i .OR. itag(2,j) == i) ii=ii+1
799 ENDDO
800 IF (ii/=0) THEN
801 npolh=npolh+1
802 polh(1,npolh)=ii
803 polh(2,npolh)=ibric
804 ii=0
805 DO j=1,npolb
806 IF (itag(1,j) == i .OR. itag(2,j) == i) THEN
807 ii=ii+1
808 jj=polb(j)
809 polh(2+ii,npolh)=jj
810 ity=ityp(j)
811 IF (ity == 1) THEN
812 ipoly(5,jj)=npolh
813 ELSEIF(ity == 2) THEN
814 IF (ipoly(5,jj)==0) THEN
815 ipoly(5,jj)=npolh
816 ELSE
817 ipoly(6,jj)=npolh
818 ENDIF
819 ELSEIF(ity == 3) THEN
820 IF(itag(1,j) == i) THEN
821 ipoly(5,jj)=npolh
822 ELSEIF(itag(2,j) == i) THEN
823 ipoly(6,jj)=npolh
824 ENDIF
825 ENDIF
826 ENDIF
827 ENDDO
828
829
830
831 DO j=1,polh(1,npolh)
832 jmin=j
833 pmin=polh(2+j,npolh)
834 DO k=j+1,polh(1,npolh)
835 IF (polh(2+k,npolh)<pmin) THEN
836 jmin=k
837 pmin=polh(2+k,npolh)
838 ENDIF
839 ENDDO
840 pold=polh(2+j,npolh)
841 polh(2+j,npolh)=pmin
842 polh(2+jmin,npolh)=pold
843 ENDDO
844 ENDIF
845 ENDDO
846
847 info=0
848 RETURN
subroutine c_tricall(pnodes, pseg, pholes, ptri, nnp, nseg, nhol, nelp)