49
50
51
53
54
55
56#include "implicit_f.inc"
57
58
59
60#include "com01_c.inc"
61#include "units_c.inc"
62#include "sysunit.inc"
63#include "task_c.inc"
64
65
66
67 INTEGER IBUF(*), ELEM(3,*), (*), BRIC(8,*),
68 . NEL, NBRIC, TBRIC(13,*), NBA, NELA, NNA, TBA(2,*),
69 . TFACA(12,*), TAGELS(*), IBUFA(*), ELEMA(3,*), TAGELA(*),
70 . IXS(NIXS,*), NNF
72 . x(3,*), xb(3,*), rvolu(*), sfac(6,4,*), dxm
73
74
75
76 INTEGER ILVOUT, NLAYER, NFACMAX, NPPMAX, I, J, IEL, N1, N2, N3,
77 . NN1, NN2, NN3, GRBRIC, IAD, NPOLY, NNS, ITAGB(NBRIC),
78 . NVMAX, NG, INFO, ICUT, NVERTS, NF1, NF2, NF3, NF4, NS,
79 . NSMAX, NV, K, KK, NNP, NPOLMAX, NRPMAX, N, M, MM, NPOLH,
80 . NPOLB, ITY, NN, NPHMAX, NPOLHMAX, JJ, JJJ, ,
81 . NNS_OLD, NNP_OLD, NPA, JMAX, IMAX, JJMAX, NP, NNTR,
82 . NPOLY_OLD, IPSURF, IC1, IC2, NHOL, NELP, NPOLH_OLD,
83 . L, LL, IFV, NNS2, NPOLY2, NPL, POLC, NSPOLY, NCPOLY,
84 . NPOLHF, NNB, FILEN, LENP, LENH, IP, JMIN, LENIMAX,
85 . LENRMAX, KKK, NSEG, IMIN, NFAC, , NN4, IB, IFOUND,
86 . ITAGBA(NBA), IBSA(NBA), NALL, III,
87 . NNS_ANIM, NBZ, NBNEDGE, NNS3, NPOLY_NEW, NNSP, NEDGE,
88 . ITYZ, INZ, J0, NNS1, K0, I1, I2, IDEP, NSTR, NCTR, IIZ,
89 . NNSA
90 parameter(nvmax=12)
92 . volg, x1, y1, z1, x2, y2, z2, x3, y3, z3, x12, y12, z12,
93 . x13, y13, z13, nrx, nry, nrz, area2, elarea(nel),
94 .
norm(3,nel), xbmax, ybmax, zbmax, xbmin, ybmin, zbmin,
95 . xc, yc, zc, xx, yy, zz, pp(3,3), xl7(3), bcenter(3),
96 . bhalfsize(3), xtmax, ytmax, ztmax, xtmin, ytmin, ztmin,
97 . tverts(9), tmptri(3,3), tmpbox(3,8), tmpnorm(3,6), tole,
98 . xg, yg, zg, fv0(3), fv1(3), fv2(3), fu0(3), fu1(3),
99 . fu2(3), quad(3,4), nr(3),
area, nx, ny, nz, nnx,
100 . nny, nnz, x0, y0, z0, lmax2, tole2, dd, vm, volumin,
101 . areamax, volph, areap, areael, vpx, vpy, vpz,
102 . v1x, v1y, v1z, v2x, v2y, v2z, nrm1, vx, vy, vz, ss,
103 . normf(3,4), ksi, eta, vx1, vy1, vz1, vx2, vy2, vz2,
104 . vmin, vtmp, x4, y4, z4, x14, y14, z14, norma(3,nela),
105 . dd2, xn(3), zlmin, zlmax, zl, vnorm, vx3, vy3, vz3, lz,
106 . dz,
alpha, gamai, cpai, cpbi, cpci, rmwi, pini, ti, cpi,
107 . cvi, rhoi, zl1, zl2, zl3, zlc, val, xxx(3,nnf),
108 . xxxa(3,nna)
109 CHARACTER CHFVB*7, CHMESH*5, FILNAM*116
110
111 INTEGER, ALLOCATABLE :: FACET(:,:), IPOLY(:,:),
112 . IELNOD(:,:), POLH(:,:), IPOLY_F(:,:),
113 . POLH_F(:,:), IFVNOD(:), IFVNOD_OLD(:),
114 . REDIR_POLY(:), PSEG(:,:), REDIR(:),
115 . PTRI(:,:), REDIR_POLH(:), POLB(:),
116 . IPOLY_OLD(:), POLH_NEW(:,:), ITAGT(:),
117 . TRI(:,:), ADR(:), ADR_OLD(:), IMERGED(:),
118 . IPOLY_F_OLD(:,:), INEDGE(:,:), NREF(:,:),
119 . IZ(:,:), LEDGE(:), IFVNOD2(:,:), ITAGN(:)
121 . , ALLOCATABLE :: normt(:,:), poly(:,:), rpoly(:,:),
122 . rpoly_f(:,:), volu(:), pnodes(:,:),
123 . pholes(:,:), rpoly_old(:), volusort(:),
124 . volu_old(:), rpoly_f_old(:,:),
125 . rfvnod_old(:,:), xnew(:,:), rnedge(:,:),
126 . aref(:,:), rfvnod2(:,:), xns(:,:),
127 . xns2(:,:), xxxsa(:,:)
128
129 INTEGER FAC(4,6), FACNOR(4,6), FAC4(3,4)
130 DATA fac /1,4,3,2,
131 . 5,6,7,8,
132 . 1,2,6,5,
133 . 2,3,7,6,
134 . 3,4,8,7,
135 . 4,1,5,8/
137 . 3,4,5,6,
138 . 1,4,2,6,
139 . 1,5,2,3,
140 . 1,6,2,4,
141 . 1,3,2,5/
142 DATA fac4 /1,5,3,
143 . 3,5,6,
144 . 6,5,1,
145 . 1,3,6/
146
147 TYPE polygone
148 INTEGER IZ(3), NNSP
149 INTEGER, DIMENSION(:), POINTER :: IPOLY, IELNOD
150 INTEGER, DIMENSION(:,:), POINTER :: NREF
152 . , DIMENSION(:), POINTER :: rpoly
154 . , DIMENSION(:,:), POINTER :: aref
155 TYPE(POLYGONE), POINTER :: PTR
156 END TYPE polygone
157 TYPE(POLYGONE), POINTER :: FIRST, PTR_PREC, PTR_CUR, PTR_TMP,
158 . PTR_OLD, FIRST2, PTR_CUR2, PTR_PREC2,
159 . PTR_TMP2
160
161 TYPE polyhedre
162 INTEGER RANK
163 INTEGER, DIMENSION(:), POINTER :: POLH
164 TYPE(POLYHEDRE), POINTER :: PTR
165 END TYPE polyhedre
166 TYPE(POLYHEDRE), POINTER :: PHFIRST, PH_PREC, PH_CUR, PH_TMP
167
168
169
170
171
172
173
174
175
176
177
178
179
180C
181
182
183
184
185
186
187 ifv=ivolu(45)
189 ALLOCATE(xxxsa(3,nnsa))
190 IF (nspmd == 1) THEN
191
193 i1=
fvspmd(ifv)%IBUF_L(1,i)
194 i2=
fvspmd(ifv)%IBUF_L(2,i)
195 xxx(1,i1)=x(1,i2)
196 xxx(2,i1)=x(2,i2)
197 xxx(3,i1)=x(3,i2)
198 ENDDO
200 i1=
fvspmd(ifv)%IBUFA_L(1,i)
201 i2=
fvspmd(ifv)%IBUFA_L(2,i)
202 xxxa(1,i1)=x(1,i2)
203 xxxa(2,i1)=x(2,i2)
204 xxxa(3,i1)=x(3,i2)
205 ENDDO
207 i1=
fvspmd(ifv)%IBUFSA_L(1,i)
208 i2=
fvspmd(ifv)%IBUFSA_L(2,i)
209 xxxsa(1,i1)=x(1,i2)
210 xxxsa(2,i1)=x(2,i2)
211 xxxsa(3,i1)=x(3,i2)
212 ENDDO
213 ELSE
215 . 2 )
216 IF (ispmd/=
fvspmd(ifv)%PMAIN-1)
RETURN
217 ENDIF
218 NULLIFY(first)
219 NULLIFY(phfirst)
220
221 ilvout=ivolu(44)
222
223 nlayer=ivolu(40)
224 nfacmax=ivolu(41)
225 nppmax=ivolu(42)
226
227 DO i=1,nbric
228 tbric(7,i)=0
229 DO j=1,6
230 tbric(7+j,i)=0
231 ENDDO
232 ENDDO
233
234
235
236 volg=zero
237 DO iel=1,nel
238 n1=elem(1,iel)
239 n2=elem(2,iel)
240 n3=elem(3,iel)
241 x1=xxx(1,n1)
242 x2=xxx(1,n2)
243 x3=xxx(1,n3)
244 y1=xxx(2,n1)
245 y2=xxx(2,n2)
246 y3=xxx(2,n3)
247 z1=xxx(3,n1)
248 z2=xxx(3,n2)
249 z3=xxx(3,n3)
250 x12=x2-x1
251 y12=y2-y1
252 z12=z2-z1
253 x13=x3-x1
254 y13=y3-y1
255 z13=z3-z1
256 nrx=y12*z13-z12*y13
257 nry=z12*x13-x12*z13
258 nrz=x12*y13-y12*x13
259 area2=sqrt(nrx**2+nry**2+nrz**2)
260 elarea(iel)=half*area2
261 norm(1,iel)=nrx/area2
262 norm(2,iel)=nry/area2
263 norm(3,iel)=nrz/area2
264
265 volg=volg+one_over_6*(x1*nrx+y1*nry+z1*nrz)
266 ENDDO
267
268 DO iel=1,nela
269 n1=elema(1,iel)
270 n2=elema(2,iel)
271 n3=elema(3,iel)
272 IF (tagela(iel)>0) THEN
273 x1=xxx(1,n1)
274 y1=xxx(2,n1)
275 z1=xxx(3,n1)
276 x2=xxx(1,n2)
277 y2=xxx(2,n2)
278 z2=xxx(3,n2)
279 x3=xxx(1,n3)
280 y3=xxx(2,n3)
281 z3=xxx(3,n3)
282 ELSEIF (tagela(iel)<0) THEN
283 x1=xxxa(1,n1)
284 y1=xxxa(2,n1)
285 z1=xxxa(3,n1)
286 x2=xxxa(1,n2)
287 y2=xxxa(2,n2)
288 z2=xxxa(3,n2)
289 x3=xxxa(1,n3)
290 y3=xxxa(2,n3)
291 z3=xxxa(3,n3)
292 ENDIF
293 x12=x2-x1
294 y12=y2-y1
295 z12=z2-z1
296 x13=x3-x1
297 y13=y3-y1
298 z13=z3-z1
299 nrx=y12*z13-z12*y13
300 nry=z12*x13-x12*z13
301 nrz=x12*y13-y12*x13
302 area2=sqrt(nrx**2+nry**2+nrz**2)
303 norma(1,iel)=nrx/area2
304 norma(2,iel)=nry/area2
305 norma(3,iel)=nrz/area2
306 ENDDO
307
308
309
310 npoly=0
311 nns=0
312 npoly2=0
313 nns2=0
314 IF (nela==0) THEN
315 npoly=0
316 npolh=0
317 GOTO 370
318 ENDIF
319
320 DO i=1,nbric
321 itagb(i)=0
322 ENDDO
323
324 IF (ilvout/=0) THEN
325 WRITE(istdo,*)
326 WRITE(istdo,'(A25,I10,A23)')
327 . ' ** MONITORED VOLUME ID: ',ivolu(1),' - BUILDING POLYGONS **'
328 ENDIF
329
330
331 NULLIFY(first2)
332 DO i=1,nbric
333
334
335 ptr_old => ptr_cur
336 npoly_old=npoly
337 nns_old=nns
338 100 CONTINUE
339 IF (ALLOCATED(facet)) DEALLOCATE(facet)
340 IF (ALLOCATED(tri)) DEALLOCATE(tri)
341 IF (ALLOCATED(normt)) DEALLOCATE(normt)
342 IF (ALLOCATED(poly)) DEALLOCATE(poly)
343 ALLOCATE(facet(6,1+nfacmax), tri(nfacmax,4),
344 . normt(3,nfacmax), poly(3,nvmax))
345 DO j=1,6
346 facet(j,1)=0
347 ENDDO
348
349 xbmax=-ep30
350 ybmax=-ep30
351 zbmax=-ep30
352 xbmin=ep30
353 ybmin=ep30
354 zbmin=ep30
355 xc=zero
356 yc=zero
357 zc=zero
358 DO j=1,8
359 xx=xb(1,bric(j,i))
360 yy=xb(2,bric(j,i))
361 zz=xb(3,bric(j,i))
368 xc=xc+one_over_8*xx
369 yc=yc+one_over_8*yy
370 zc=zc+one_over_8*zz
371 ENDDO
372
373 pp(1,1)=sfac(4,2,i)
374 pp(2,1)=sfac(4,3,i)
375 pp(3,1)=sfac(4,4,i)
376 pp(1,2)=sfac(5,2,i)
377 pp(2,2)=sfac(5,3,i)
378 pp(3,2)=sfac(5,4,i)
379 pp(1,3)=sfac(2,2,i)
380 pp(2,3)=sfac(2,3,i)
381 pp(3,3)=sfac(2,4,i)
382
383 xx=xb(1,bric(7,i))
384 yy=xb(2,bric(7,i))
385 zz=xb(3,bric(7,i))
386 xl7(1)=pp(1,1)*(xx-xc)+pp(2,1)*(yy-yc)+pp(3,1)*(zz-zc)
387 xl7(2)=pp(1,2)*(xx-xc)+pp(2,2)*(yy-yc)+pp(3,2)*(zz-zc)
388 xl7(3)=pp(1,3)*(xx-xc)+pp(2,3)*(yy-yc)+pp(3,3)*(zz-zc)
389 bcenter(1)=zero
390 bcenter(2)=zero
391 bcenter(3)=zero
392 bhalfsize(1)=xl7(1)
393 bhalfsize(2)=xl7(2)
394 bhalfsize(3)=xl7(3)
395 info=0
396 DO iel=1,nela
397 n1=elema(1,iel)
398 n2=elema(2,iel)
399 n3=elema(3,iel)
400 IF (tagela(iel)>0) THEN
401 x1=xxx(1,n1)
402 y1=xxx(2,n1)
403 z1=xxx(3,n1)
404 x2=xxx(1,n2)
405 y2=xxx(2,n2)
406 z2=xxx(3,n2)
407 x3=xxx(1,n3)
408 y3=xxx(2,n3)
409 z3=xxx(3,n3)
410 ELSEIF (tagela(iel)<0) THEN
411 x1=xxxa(1,n1)
412 y1=xxxa(2,n1)
413 z1=xxxa(3,n1)
414 x2=xxxa(1,n2)
415 y2=xxxa(2,n2)
416 z2=xxxa(3,n2)
417 x3=xxxa(1,n3)
418 y3=xxxa(2,n3)
419 z3=xxxa(3,n3)
420 ENDIF
427 IF (xbmax<xtmin.OR.ybmax<ytmin.OR.zbmax<ztmin.OR.
428 . xbmin>xtmax.OR.ybmin>ytmax.OR.zbmin>ztmax)
429 . cycle
430
431 tverts(1)=pp(1,1)*(x1-xc)+pp(2,1)*(y1-yc)+pp(3,1)*(z1-zc)
432 tverts(2)=pp(1,2)*(x1-xc)+pp(2,2)*(y1-yc)+pp(3,2)*(z1-zc)
433 tverts(3)=pp(1,3)*(x1-xc)+pp(2,3)*(y1-yc)+pp(3,3)*(z1-zc)
434 tverts(4)=pp(1,1)*(x2-xc)+pp(2,1)*(y2-yc)+pp(3,1)*(z2-zc)
435 tverts(5)=pp(1,2)*(x2-xc)+pp(2,2)*(y2-yc)+pp(3,2)*(z2-zc)
436 tverts(6)=pp(1,3)*(x2-xc)+pp(2,3)*(y2-yc)+pp(3,3)*(z2-zc)
437 tverts(7)=pp(1,1)*(x3-xc)+pp(2,1)*(y3-yc)+pp(3,1)*(z3-zc)
438 tverts(8)=pp(1,2)*(x3-xc)+pp(2,2)*(y3-yc)+pp(3,2)*(z3-zc)
439 tverts(9)=pp(1,3)*(x3-xc)+pp(2,3)*(y3-yc)+pp(3,3)*(z3-zc)
440
441 CALL tribox3(icut, bcenter, bhalfsize, tverts)
442
443 IF (icut==0) THEN
444 tole=em5
445
446 xg=third*(x1+x2+x3)
447 yg=third*(y1+y2+y3)
448 zg=third*(z1+z2+z3)
449 x1=xg+(one+tole)*(x1-xg)
450 y1=yg+(one+tole)*(y1-yg)
451 z1=zg+(one+tole)*(z1-zg)
452 x2=xg+(one+tole)*(x2-xg)
453 y2=yg+(one+tole)*(y2-yg)
454 z2=zg+(one+tole)*(z2-zg)
455 x3=xg+(one+tole)*(x3-xg)
456 y3=yg+(one+tole)*(y3-yg)
457 z3=zg+(one+tole)*(z3-zg)
458
459 tverts(1)=pp(1,1)*(x1-xc)+pp(2,1)*(y1-yc)+pp(3,1)*(z1-zc)
460 tverts(2)=pp(1,2)*(x1-xc)+pp(2,2)*(y1-yc)+pp(3,2)*(z1-zc)
461 tverts(3)=pp(1,3)*(x1-xc)+pp(2,3)*(y1-yc)+pp(3,3)*(z1-zc)
462 tverts(4)=pp(1,1)*(x2-xc)+pp(2,1)*(y2-yc)+pp(3,1)*(z2-zc)
463 tverts(5)=pp(1,2)*(x2-xc)+pp(2,2)*(y2-yc)+pp(3,2)*(z2-zc)
464 tverts(6)=pp(1,3)*(x2-xc)+pp(2,3)*(y2-yc)+pp(3,3)*(z2-zc)
465 tverts(7)=pp(1,1)*(x3-xc)+pp(2,1)*(y3-yc)+pp(3,1)*(z3-zc)
466 tverts(8)=pp(1,2)*(x3-xc)+pp(2,2)*(y3-yc)+pp(3,2)*(z3-zc)
467 tverts(9)=pp(1,3)*(x3-xc)+pp(2,3)*(y3-yc)+pp(3,3)*(z3-zc)
468
469 CALL tribox3(icut, bcenter, bhalfsize, tverts)
470 IF (icut==1) icut=2
471 ENDIF
472
473 IF (icut>=1) THEN
474 IF (icut==1) THEN
475 tbric(7,i)=2
476 tmptri(1,1)=x1
477 tmptri(2,1)=y1
478 tmptri(3,1)=z1
479 tmptri(1,2)=x2
480 tmptri(2,2)=y2
481 tmptri(3,2)=z2
482 tmptri(1,3)=x3
483 tmptri(2,3)=y3
484 tmptri(3,3)=z3
485 DO j=1,8
486 tmpbox(1,j)=xb(1,bric(j,i))
487 tmpbox(2,j)=xb(2,bric(j,i))
488 tmpbox(3,j)=xb(3,bric(j,i))
489 ENDDO
490 DO j=1,6
491 tmpnorm(1,j)=-sfac(j,2,i)
492 tmpnorm(2,j)=-sfac(j,3,i)
493 tmpnorm(3,j)=-sfac(j,4,i)
494 ENDDO
495 CALL itribox(tmptri, tmpbox, tmpnorm, nverts, poly,
496 . nvmax )
497 IF (nverts>0) THEN
498 npoly=npoly+1
499 IF (.NOT.ASSOCIATED(first)) THEN
500 ALLOCATE(first)
501 ptr_cur => first
502 ELSE
503 ALLOCATE(ptr_cur)
504 ptr_prec%PTR => ptr_cur
505 ENDIF
506 ALLOCATE(ptr_cur%IPOLY(6+nverts),
507 . ptr_cur%IELNOD(nverts),
508 . ptr_cur%RPOLY(4+3*nverts))
509 ptr_cur%IPOLY(1)=1
510 ptr_cur%IPOLY(2)=nverts
511 ptr_cur%IPOLY(3)=iel
512 ptr_cur%IPOLY(4)=i
513 ptr_cur%IPOLY(5)=0
514 ptr_cur%IPOLY(6)=0
515 ptr_cur%RPOLY(1)=zero
516 ptr_cur%RPOLY(2)=norma(1,iel)
517 ptr_cur%RPOLY(3)=norma(2,iel)
518 ptr_cur%RPOLY(4)=norma(3,iel)
519 DO j=1,nverts
520 nns=nns+1
521 ptr_cur%IPOLY(6+j)=nns
522 ptr_cur%IELNOD(j)=iel
523 ptr_cur%RPOLY(4+3*(j-1)+1)=poly(1,j)
524 ptr_cur%RPOLY(4+3*(j-1)+2)=poly(2,j)
525 ptr_cur%RPOLY(4+3*(j-1)+3)=poly(3,j)
526 ENDDO
527 ptr_prec => ptr_cur
528 ENDIF
529 ENDIF
530
531 tole=em5
532
533 xg=third*(x1+x2+x3)
534 yg=third*(y1+y2+y3)
535 zg=third*(z1+z2+z3)
536 x1=xg+(one+tole)*(x1-xg)
537 y1=yg+(one+tole)*(y1-yg)
538 z1=zg+(one+tole)*(z1-zg)
539 x2=xg+(one+tole)*(x2-xg)
540 y2=yg+(one+tole)*(y2-yg)
541 z2=zg+(one+tole)*(z2-zg)
542 x3=xg+(one+tole)*(x3-xg)
543 y3=yg+(one+tole)*(y3-yg)
544 z3=zg+(one+tole)*(z3-zg)
545
546 fv0(1)=x1
547 fv0(2)=y1
548 fv0(3)=z1
549 fv1(1)=x2
550 fv1(2)=y2
551 fv1(3)=z2
552 fv2(1)=x3
553 fv2(2)=y3
554 fv2(3)=z3
555 DO j=1,6
556 nf1=bric(fac(1,j),i)
557 nf2=bric(fac(2,j),i)
558 nf3=bric(fac(3,j),i)
559 nf4=bric(fac(4,j),i)
560 fu0(1)=xb(1,nf1)
561 fu0(2)=xb(2,nf1)
562 fu0(3)=xb(3,nf1)
563 fu1(1)=xb(1,nf2)
564 fu1(2)=xb(2,nf2)
565 fu1(3)=xb(3,nf2)
566 fu2(1)=xb(1,nf3)
567 fu2(2)=xb(2,nf3)
568 fu2(3)=xb(3,nf3)
569
570 CALL tritri3(icut, fv0, fv1, fv2, fu0, fu1, fu2)
571 IF (icut==1) THEN
572 tbric(7+j,i)=2
573 ns=facet(j,1)
574 ns=ns+1
575 facet(j,1)=ns
576 IF (ns>nfacmax) THEN
577 info=1
578 ELSE
579 facet(j,1+ns)=iel
580 ENDIF
581 cycle
582 ENDIF
583
584 fu1(1)=xb(1,nf3)
585 fu1(2)=xb(2,nf3)
586 fu1(3)=xb(3,nf3)
587 fu2(1)=xb(1,nf4)
588 fu2(2)=xb(2,nf4)
589 fu2(3)=xb(3,nf4)
590
591 CALL tritri3(icut, fv0, fv1, fv2, fu0, fu1, fu2)
592 IF (icut==1) THEN
593 tbric(7+j,i)=2
594 ns=facet(j,1)
595 ns=ns+1
596 facet(j,1)=ns
597 IF (ns>nfacmax) THEN
598 info=1
599 ELSE
600 facet(j,1+ns)=iel
601 ENDIF
602 ENDIF
603 ENDDO
604 ENDIF
605 ENDDO
606
607 IF (info==1) THEN
608 nsmax=0
609 DO j=1,6
610 nsmax=
max(nsmax,facet(j,1))
611 ENDDO
612 nfacmax=nsmax
613
614 IF (npoly_old>0) THEN
615 ptr_cur => ptr_old%PTR
616 ELSE
617 ptr_cur => first
618 ENDIF
619 DO j=1,npoly-npoly_old
620 ptr_tmp => ptr_cur%PTR
621 DEALLOCATE(ptr_cur%IPOLY, ptr_cur%RPOLY,
622 . ptr_cur%IELNOD)
623 DEALLOCATE(ptr_cur)
624 ptr_cur => ptr_tmp
625 ENDDO
626 IF (npoly_old>0) THEN
627 ptr_prec => ptr_old
628 ELSE
629 NULLIFY(first)
630 ENDIF
631 npoly=npoly_old
632 nns=nns_old
633
634 GOTO 100
635 ENDIF
636
637 IF (tbric(7,i)<=1) THEN
638 DEALLOCATE(facet, tri, normt, poly)
639 cycle
640 END IF
641 DO j=1,6
642 nv=tbric(j,i)
643 IF (nv==0) cycle
644 IF (itagb(nv)==1) cycle
645 IF (tbric(7+j,i)==2) THEN
646 DO k=1,4
647 kk=fac(k,j)
648 quad(1,k)=xb(1,bric(kk,i))
649 quad(2,k)=xb(2,bric(kk,i))
650 quad(3,k)=xb(3,bric(kk,i))
651 ENDDO
652 ns=facet(j,1)
653 DO k=1,ns
654 iel=facet(j,1+k)
655 IF (tagela(iel)>0) THEN
656 DO l=1,3
657 ll=elema(l,iel)
658 tri(k,l)=ll
659 ENDDO
660 ELSEIF (tagela(iel)<0) THEN
661 DO l=1,3
662 ll=-elema(l,iel)
663 tri(k,l)=ll
664 ENDDO
665 ENDIF
666 tri(k,4)=iel
667 normt(1,k)=norma(1,iel)
668 normt(2,k)=norma(2,iel)
669 normt(3,k)=norma(3,iel)
670 ENDDO
671 DO k=1,4
672 normf(1,k)=sfac(
facnor(k,j),2,i)
673 normf(2,k)=sfac(
facnor(k,j),3,i)
674 normf(3,k)=sfac(
facnor(k,j),4,i)
675 ENDDO
676 nr(1)=sfac(j,2,i)
677 nr(2)=sfac(j,3,i)
678 nr(3)=sfac(j,4,i)
679
680 nnp=0
681 npolmax=nlayer
682
683 200 CONTINUE
684 nrpmax=nppmax*3+4
685 IF (ALLOCATED(ipoly)) DEALLOCATE(ipoly)
686 IF (ALLOCATED(rpoly)) DEALLOCATE(rpoly)
687 IF (ALLOCATED(ielnod)) DEALLOCATE(ielnod)
688 ALLOCATE(ipoly(6+nppmax+1+npolmax,npolmax),
689 . rpoly(nrpmax+3*npolmax,npolmax),
690 . ielnod(nppmax,npolmax))
691
692 CALL facepoly(quad, tri, ns, ipoly, rpoly,
693 . nr, normf, normt, nfacmax, nnp,
694 . nrpmax, i, nv, dxm , npolmax,
695 . nppmax, info, ielnod, xxx, elema,
696 . ibuf, nela, i, j, ivolu(1),
697 . ilvout, ibufa, tagela, xxxa )
698 IF (info==1) GOTO 200
699
700 DO n=1,nnp
701 IF (ipoly(1,n)==-1) cycle
702 npoly2=npoly2+1
703 IF (.NOT.ASSOCIATED(first2)) THEN
704 ALLOCATE(first2)
705 ptr_cur2 => first2
706 ELSE
707 ALLOCATE(ptr_cur2)
708 ptr_prec2%PTR => ptr_cur2
709 ENDIF
710 nn=ipoly(2,n)
711 nhol=ipoly(6+nn+1,n)
712 ALLOCATE(ptr_cur2%IPOLY(6+nn+1+nhol),
713 . ptr_cur2%IELNOD(nn),
714 . ptr_cur2%RPOLY(4+3*nn+3*nhol))
715 DO m=1,6
716 ptr_cur2%IPOLY(m)=ipoly(m,n)
717 ENDDO
718 DO m=1,4
719 ptr_cur2%RPOLY(m)=rpoly(m,n)
720 ENDDO
721 DO m=1,ipoly(2,n)
722 nns2=nns2+1
723 ptr_cur2%IPOLY(6+m)=nns2
724 mm=ielnod(m,n)
725 ptr_cur2%IELNOD(m)=facet(j,1+mm)
726 ptr_cur2%RPOLY(4+3*(m-1)+1)=rpoly(4+3*(m-1)+1,n)
727 ptr_cur2%RPOLY(4+3*(m-1)+2)=rpoly(4+3*(m-1)+2,n)
728 ptr_cur2%RPOLY(4+3*(m-1)+3)=rpoly(4+3*(m-1)+3,n)
729 ENDDO
730 ptr_cur2%IPOLY(6+nn+1)=nhol
731 DO m=1,nhol
732 ptr_cur2%IPOLY(6+nn+1+m)=ipoly(6+nn+1+m,n)
733 ptr_cur2%RPOLY(4+3*nn+3*(m-1)+1)=
734 . rpoly(4+3*nn+3*(m-1)+1,n)
735 ptr_cur2%RPOLY(4+3*nn+3*(m-1)+2)=
736 . rpoly(4+3*nn+3*(m-1)+2,n)
737 ptr_cur2%RPOLY(4+3*nn+3*(m-1)+3)=
738 . rpoly(4+3*nn+3*(m-1)+3,n)
739 ENDDO
740 ptr_prec2 => ptr_cur2
741 ENDDO
742
743 DEALLOCATE(ipoly, rpoly, ielnod)
744 ENDIF
745 ENDDO
746 itagb(i)=1
747
748 DEALLOCATE(facet, tri, normt, poly)
749 ENDDO
750
751 ptr_cur2 => first2
752 ptr_prec => ptr_cur
753 DO i=1,npoly2
754 npoly=npoly+1
755 ALLOCATE(ptr_cur)
756 ptr_prec%PTR => ptr_cur
757 nn=ptr_cur2%IPOLY(2)
758 nhol=ptr_cur2%IPOLY(6+nn+1)
759 ALLOCATE(ptr_cur%IPOLY(6+nn+1+nhol),
760 . ptr_cur%IELNOD(nn),
761 . ptr_cur%RPOLY(4+3*nn+3*nhol))
762 DO j=1,6
763 ptr_cur%IPOLY(j)=ptr_cur2%IPOLY(j)
764 ENDDO
765 DO j=1,4
766 ptr_cur%RPOLY(j)=ptr_cur2%RPOLY(j)
767 ENDDO
768 DO j=1,nn
769 ptr_cur%IPOLY(6+j)=nns+ptr_cur2%IPOLY(6+j)
770 ptr_cur%IELNOD(j)=ptr_cur2%IELNOD(j)
771 ptr_cur%RPOLY(4+3*(j-1)+1)=ptr_cur2%RPOLY(4+3*(j-1)+1)
772 ptr_cur%RPOLY(4+3*(j-1)+2)=ptr_cur2%RPOLY(4+3*(j-1)+2)
773 ptr_cur%RPOLY(4+3*(j-1)+3)=ptr_cur2%RPOLY(4+3*(j-1)+3)
774 ENDDO
775 ptr_cur%IPOLY(6+nn+1)=nhol
776 DO j=1,nhol
777 ptr_cur%IPOLY(6+nn+1+j)=ptr_cur2%IPOLY(6+nn+1+j)
778 ptr_cur%RPOLY(4+3*nn+3*(j-1)+1)=
779 . ptr_cur2%RPOLY(4+3*nn+3*(j-1)+1)
780 ptr_cur%RPOLY(4+3*nn+3*(j-1)+2)=
781 . ptr_cur2%RPOLY(4+3*nn+3*(j-1)+2)
782 ptr_cur%RPOLY(4+3*nn+3*(j-1)+3)=
783 . ptr_cur2%RPOLY(4+3*nn+3*(j-1)+3)
784 ENDDO
785 ptr_tmp2 => ptr_cur2%PTR
786 DEALLOCATE(ptr_cur2%IPOLY, ptr_cur2%RPOLY, ptr_cur2%IELNOD)
787 DEALLOCATE(ptr_cur2)
788 ptr_cur2 => ptr_tmp2
789 ptr_prec => ptr_cur
790 ENDDO
791
792 nns=nns+nns2
793
794
795
796 nbz=ivolu(65)
797 IF (nbz>1) THEN
798 ptr_cur => first
799 DO i=1,npoly
800 ptr_cur%NNSP=0
801 ptr_cur => ptr_cur%PTR
802 ENDDO
803
804 vx3=rvolu(35)
805 vy3=rvolu(36)
806 vz3=rvolu(37)
807 vx1=rvolu(38)
808 vy1=rvolu(39)
809 vz1=rvolu(40)
810
811 vnorm=sqrt(vx3**2+vy3**2+vz3**2)
812 vx3=vx3/vnorm
813 vy3=vy3/vnorm
814 vz3=vz3/vnorm
815 ss=vx3*vx1+vy3*vy1+vz3*vz1
816 vx1=vx1-ss*vx3
817 vy1=vy1-ss*vy3
818 vz1=vz1-ss*vz3
819 vnorm=sqrt(vx1**2+vy1**2+vz1**2)
820 vx1=vx1/vnorm
821 vy1=vy1/vnorm
822 vz1=vz1/vnorm
823 vx2=vy3*vz1-vz3*vy1
824 vy2=vz3*vx1-vx3*vz1
825 vz2=vx3*vy1-vy3*vx1
826
827 x0=rvolu(41)
828 y0=rvolu(42)
829 z0=rvolu(43)
830 lz=rvolu(53)
831 dz=two*lz/nbz
833
834 zbmin=ep30
835 zbmax=-ep30
836 DO iel=1,nel
837 n1=elem(1,iel)
838 n2=elem(2,iel)
839 n3=elem(3,iel)
840 x1=xxx(1,n1)
841 x2=xxx(1,n2)
842 x3=xxx(1,n3)
843 y1=xxx(2,n1)
844 y2=xxx(2,n2)
845 y3=xxx(2,n3)
846 z1=xxx(3,n1)
847 z2=xxx(3,n2)
848 z3=xxx(3,n3)
849 x12=x2-x1
850 y12=y2-y1
851 z12=z2-z1
852 x13=x3-x1
853 y13=y3-y1
854 z13=z3-z1
855 zl1=(x1-x0)*vx3+(y1-y0)*vy3+(z1-z0)*vz3
856 zl2=(x2-x0)*vx3+(y2-y0)*vy3+(z2-z0)*vz3
857 zl3=(x3-x0)*vx3+(y3-y0)*vy3+(z3-z0)*vz3
864 ENDDO
865
866 x0=x0-lz*vx3
867 y0=y0-lz*vy3
868 z0=z0-lz*vz3
869 zlc=-lz
870 ALLOCATE(inedge(6,npoly*nppmax), rnedge(6,npoly*nppmax))
871 nbnedge=0
872 nns3=0
873 npoly_new=npoly
874 iiz=0
875 DO i=1,nbz+1
876 IF (zlc<zbmin.OR.zlc>zbmax) THEN
877 x0=x0+dz*vx3
878 y0=y0+dz*vy3
879 z0=z0+dz*vz3
880 zlc=zlc+dz
881 cycle
882 ENDIF
883 iiz=iiz+1
884 ptr_cur => first
885 DO j=1,npoly
886 zlmin=ep30
887 zlmax=-ep30
888 DO k=1,ptr_cur%IPOLY(2)
889 xx=ptr_cur%RPOLY(4+3*(k-1)+1)
890 yy=ptr_cur%RPOLY(4+3*(k-1)+2)
891 zz=ptr_cur%RPOLY(4+3*(k-1)+3)
892 zl=(xx-x0)*vx3+(yy-y0)*vy3+(zz-z0)*vz3
895 ENDDO
896 IF (zlmin*zlmax<zero) THEN
897 ity=ptr_cur%IPOLY(1)
898 nn=ptr_cur%IPOLY(2)
899 nhol=0
900 IF (ity==2) nhol=ptr_cur%IPOLY(6+nn+1)
901 ALLOCATE(ipoly(6+2*nn+1+nhol,nn),
902 . rpoly(4+3*2*nn+3*nhol,nn),
903 . ielnod(2*nn,nn),
904 . nref(2,nn), aref(4,nn),
905 . iz(3,nn))
907 . ipoly, rpoly, ptr_cur%IPOLY, ptr_cur%RPOLY, inedge,
908 . rnedge, nbnedge, vx3, vy3, vz3,
909 . x0, y0, z0, nref, aref,
910 . nn, nhol, iiz, iz, nns3,
911 . nnp , nnsp, ielnod, ptr_cur%IELNOD)
912
913 ptr_tmp => ptr_cur%PTR
914 npoly_new=npoly_new-1
915 DO n=1,nnp
916 npoly_new=npoly_new+1
917 IF (n==1) THEN
918 DEALLOCATE(ptr_cur%IPOLY, ptr_cur%RPOLY,
919 . ptr_cur%IELNOD)
920 ELSE
921 ALLOCATE(ptr_cur)
922 ptr_prec%PTR => ptr_cur
923 ptr_cur%NNSP=0
924 ENDIF
925 nn=ipoly(2,n)
926 nhol=ipoly(6+nn+1,n)
927 ALLOCATE(ptr_cur%IPOLY(6+nn+1+nhol),
928 . ptr_cur%IELNOD(nn),
929 . ptr_cur%RPOLY(4+3*nn+3*nhol))
930 DO m=1,6
931 ptr_cur%IPOLY(m)=ipoly(m,n)
932 ENDDO
933 DO m=1,4
934 ptr_cur%RPOLY(m)=rpoly(m,n)
935 ENDDO
936 DO m=1,nn
937 mm=ipoly(6+m,n)
938 ptr_cur%IPOLY(6+m)=mm
939 ptr_cur%IELNOD(m)=ielnod(m,n)
940 ptr_cur%RPOLY(4+3*(m-1)+1)=rpoly(4+3*(m-1)+1,n)
941 ptr_cur%RPOLY(4+3*(m-1)+2)=rpoly(4+3*(m-1)+2,n)
942 ptr_cur%RPOLY(4+3*(m-1)+3)=rpoly(4+3*(m-1)+3,n)
943 ENDDO
944 nhol=ipoly(6+nn+1,n)
945 ptr_cur%IPOLY(6+nn+1)=nhol
946 DO m=1,nhol
947 ptr_cur%IPOLY(6+nn+1+m)=ipoly(6+nn+1+m,n)
948 ptr_cur%RPOLY(4+3*nn+3*(m-1)+1)=
949 . rpoly(4+3*nn+3*(m-1)+1,n)
950 ptr_cur%RPOLY(4+3*nn+3*(m-1)+2)=
951 . rpoly(4+3*nn+3*(m-1)+2,n)
952 ptr_cur%RPOLY(4+3*nn+3*(m-1)+3)=
953 . rpoly(4+3*nn+3*(m-1)+3,n)
954 ENDDO
955 ptr_cur%IZ(1)=1
956 ptr_cur%IZ(2)=iz(2,n)
957 IF (n==nnp) THEN
958 ptr_cur%NNSP=nnsp
959 ALLOCATE(ptr_cur%NREF(3,nnsp),
960 . ptr_cur%AREF(4,nnsp))
961 DO m=1,nnsp
962 nns3=nns3+1
963 ptr_cur%NREF(1,m)=nns3
964 ptr_cur%NREF(2,m)=nref(1,m)
965 ptr_cur%NREF(3,m)=nref(2,m)
966 ptr_cur%AREF(1,m)=aref(1,m)
967 ptr_cur%AREF(2,m)=aref(2,m)
968 ptr_cur%AREF(3,m)=aref(3,m)
969 ptr_cur%AREF(4,m)=aref(4,m)
970 ENDDO
971 ENDIF
972 ptr_prec => ptr_cur
973 IF (n==nnp) ptr_cur%PTR => ptr_tmp
974 ENDDO
975
976 DEALLOCATE(ipoly, rpoly, ielnod, nref, aref, iz)
977 ELSE
978 IF (zlmin==zero) THEN
979 nn=ptr_cur%IPOLY(2)
980 ALLOCATE(nref(2,2*nn), aref(4,2*nn))
982 . ptr_cur%IPOLY, ptr_cur%RPOLY, vx3, vy3, vz3,
983 . nbnedge, inedge, rnedge, x0, y0,
984 . z0, iiz , nns3, nref, aref,
985 . nnsp )
986
987 IF (nnsp>0) THEN
988 ALLOCATE(ptr_cur%NREF(3,nnsp),
989 . ptr_cur%AREF(4,nnsp))
990 ptr_cur%NNSP=nnsp
991 DO n=1,nnsp
992 nns3=nns3+1
993 ptr_cur%NREF(1,n)=nns3
994 ptr_cur%NREF(2,n)=nref(1,n)
995 ptr_cur%NREF(3,n)=nref(2,n)
996
997 ptr_cur%AREF(2,n)=aref(2,n)
998 ptr_cur%AREF(3,n)=aref(3,n)
999 ptr_cur%AREF(4,n)=aref(4,n)
1000 ENDDO
1001 ENDIF
1002 DEALLOCATE(nref, aref)
1003 ENDIF
1004 IF (zlmin>=zero) THEN
1005 ptr_cur%IZ(1)=1
1006 ptr_cur%IZ(2)=iiz+1
1007 ELSEIF (iiz==1.AND.zlmax<=zero) THEN
1008 ptr_cur%IZ(1)=1
1009 ptr_cur%IZ(2)=1
1010 ENDIF
1011 ptr_prec => ptr_cur
1012 ENDIF
1013 ptr_cur => ptr_cur%PTR
1014 ENDDO
1015 npoly=npoly_new
1016 x0=x0+dz*vx3
1017 y0=y0+dz*vy3
1018 z0=z0+dz*vz3
1019 zlc=zlc+dz
1020 ENDDO
1021
1022 ALLOCATE(redir(nns))
1023 ptr_cur => first
1024 nns=0
1025 DO i=1,npoly
1026 nn=ptr_cur%IPOLY(2)
1027 DO j=1,nn
1028 jj=ptr_cur%IPOLY(6+j)
1029 IF (jj>0) THEN
1030 nns=nns+1
1031 redir(jj)=nns
1032 ENDIF
1033 ENDDO
1034 ptr_cur => ptr_cur%PTR
1035 ENDDO
1036
1037 ptr_cur => first
1038 DO i=1,npoly
1039 nnsp=ptr_cur%NNSP
1040 IF (nnsp>0) THEN
1041 DO j=1,nnsp
1042 n1=ptr_cur%NREF(2,j)
1043 n2=ptr_cur%NREF(3,j)
1044 IF (n1>0) ptr_cur%NREF(2,j)=redir(n1)
1045 IF (n2>0) ptr_cur%NREF(3,j)=redir(n2)
1046 ENDDO
1047 ENDIF
1048 ptr_cur => ptr_cur%PTR
1049 ENDDO
1050 DEALLOCATE(redir)
1051
1052 ptr_cur => first
1053 DO i=1,npoly
1054 ptr_prec => ptr_cur
1055 ptr_cur => ptr_cur%PTR
1056 ENDDO
1057 ALLOCATE(ledge(nbnedge))
1058 DO i=1,iiz
1059 DO j=1,nbric
1060 nedge=0
1061 DO k=1,nbnedge
1062 IF (inedge(6,k)/=i) cycle
1063 IF (inedge(1,k)==1.AND.inedge(5,k)/=j) cycle
1064 IF (inedge(1,k)==2.AND.inedge(4,k)/=j.AND.
1065 . inedge(5,k)/=j) cycle
1066 nedge=nedge+1
1067 ledge(nedge)=k
1068 ENDDO
1069 IF (nedge==0) cycle
1070 ALLOCATE(ipoly(6+2*nedge+1+nedge,nedge),
1071 . rpoly(4+6*nedge+3*nedge,nedge),
1072 . iz(3,nedge), ielnod(nedge,nedge))
1073
1074 CALL horipoly(inedge, rnedge, ledge, nedge, ipoly,
1075 . rpoly, iz, ielnod, nnp, vx3,
1076 . vy3, vz3, i , j )
1077
1078 DO n=1,nnp
1079 IF (ipoly(1,n)==-1) cycle
1080 npoly=npoly+1
1081 ALLOCATE(ptr_cur)
1082 ptr_prec%PTR => ptr_cur
1083 nn=ipoly(2,n)
1084 nhol=ipoly(6+nn+1,n)
1085 ALLOCATE(ptr_cur%IPOLY(6+nn+1+nhol),
1086 . ptr_cur%RPOLY(4+3*nn+3*nhol),
1087 . ptr_cur%IELNOD(nn))
1088 ptr_cur%NNSP=0
1089 DO m=1,6
1090 ptr_cur%IPOLY(m)=ipoly(m,n)
1091 ENDDO
1092 DO m=1,4
1093 ptr_cur%RPOLY(m)=rpoly(m,n)
1094 ENDDO
1095 DO m=1,nn
1096 ptr_cur%IPOLY(6+m)=ipoly(6+m,n)
1097 ptr_cur%IELNOD(m)=ielnod(m,n)
1098 ptr_cur%RPOLY(4+3*(m-1)+1)=rpoly(4+3*(m-1)+1,n)
1099 ptr_cur%RPOLY(4+3*(m-1)+2)=rpoly(4+3*(m-1)+2,n)
1100 ptr_cur%RPOLY(4+3*(m-1)+3)=rpoly(4+3*(m-1)+3,n)
1101 ENDDO
1102 nhol=ipoly(6+nn+1,n)
1103 ptr_cur%IPOLY(6+nn+1)=nhol
1104 DO m=1,nhol
1105 ptr_cur%IPOLY(6+nn+1+m)=ipoly(6+nn+1+m,n)
1106 ptr_cur%RPOLY(4+3*nn+3*(m-1)+1)=
1107 . rpoly(4+3*nn+3*(m-1)+1,n)
1108 ptr_cur%RPOLY(4+3*nn+3*(m-1)+2)=
1109 . rpoly(4+3*nn+3*(m-1)+2,n)
1110 ptr_cur%RPOLY(4+3*nn+3*(m-1)+3)=
1111 . rpoly(4+3*nn+3*(m-1)+3,n)
1112 ENDDO
1113 DO m=1,3
1114 ptr_cur%IZ(m)=iz(m,n)
1115 ENDDO
1116 ptr_prec => ptr_cur
1117 ENDDO
1118
1119 DEALLOCATE(ipoly, rpoly, iz, ielnod)
1120 ENDDO
1121 ENDDO
1122 DEALLOCATE(ledge)
1123 ELSE
1124 ptr_cur => first
1125 DO i=1,npoly
1126 ptr_cur%NNSP=0
1127 ptr_cur%IZ(1)=1
1128 ptr_cur%IZ(2)=1
1129 ptr_cur => ptr_cur%PTR
1130 iiz=0
1131 ENDDO
1132 ENDIF
1133
1134
1135
1136 npolh=0
1137 IF (ilvout/=0) WRITE(istdo,'(A25,I10,A24)')
1138 . ' ** MONITORED VOLUME ID: ',ivolu(1),' - BUILDING POLYHEDRA **'
1139
1140 DO i=1,nbric
1142
1143 IF (tbric(7,i)/=2) cycle
1144
1145 npolb=0
1146 nppmax=0
1147 ptr_cur => first
1148 DO j=1,npoly
1149 ity=ptr_cur%IPOLY(1)
1150 IF ((ity==1.AND.ptr_cur%IPOLY(4)==i).OR.
1151 . (ity==2.AND.
1152 . (ptr_cur%IPOLY(3)==i.OR.ptr_cur%IPOLY(4)==i))) THEN
1153 npolb=npolb+1
1154 nppmax=
max(nppmax,ptr_cur%IPOLY(2))
1155 ENDIF
1156 ptr_cur => ptr_cur%PTR
1157 ENDDO
1158 IF (npolb==0) cycle
1159
1160 nrpmax=4+3*nppmax
1161 ALLOCATE(polb(npolb), ipoly(6+nppmax,npolb),
1162 . rpoly(nrpmax,npolb), redir(npolb))
1163 DO inz=1,iiz+1
1164 npolb=0
1165 ptr_cur => first
1166 DO j=1,npoly
1167 ity=ptr_cur%IPOLY(1)
1168 ityz=ptr_cur%IZ(1)
1169 IF (((ity==1.AND.ptr_cur%IPOLY(4)==i).OR.
1170 . (ity==2.AND.(ptr_cur%IPOLY(3)==i.OR.
1171 . ptr_cur%IPOLY(4)==i)))
1172 . .AND.
1173 . ((ityz==1.AND.ptr_cur%IZ(2)==inz).OR.
1174 . (ityz==2.AND.(ptr_cur%IZ(2)==inz.OR.
1175 . ptr_cur%IZ(3)==inz)))) THEN
1176 npolb=npolb+1
1177 redir(npolb)=j
1178 nn=ptr_cur%IPOLY(2)
1179 DO k=1,6+nn
1180 ipoly(k,npolb)=ptr_cur%IPOLY(k)
1181 ENDDO
1182 DO k=1,4+3*nn
1183 rpoly(k,npolb)=ptr_cur%RPOLY(k)
1184 ENDDO
1185 polb(npolb)=npolb
1186 ENDIF
1187 ptr_cur => ptr_cur%PTR
1188 ENDDO
1189 IF (npolb==0) cycle
1190
1191 nphmax=npolb
1192 npolhmax=nlayer
1193 300 CONTINUE
1194 IF (ALLOCATED(polh)) DEALLOCATE(polh)
1195 ALLOCATE(polh(nphmax+2,npolhmax))
1196
1197 CALL polyhedr(ipoly, rpoly , polb, npolb, polh,
1198 . nnp, nrpmax , nphmax, i, dxm ,
1199 . info , npolhmax, nppmax, rvolu(50))
1200 IF (info==1) GOTO 300
1201
1202 ptr_cur => first
1203 npl=1
1204 polc=redir(polb(npl))
1205 DO j=1,npoly
1206 IF (j==polc) THEN
1207 ity=ptr_cur%IPOLY(1)
1208 IF (ity==1) THEN
1209 ptr_cur%IPOLY(5)=npolh+ipoly
1210 ELSEIF (ity==2) THEN
1211 IF (ptr_cur%IPOLY(5)==0) THEN
1212 ptr_cur%IPOLY(5)=npolh+ipoly(5,npl)
1213 ELSE
1214 ptr_cur%IPOLY(6)=npolh+ipoly(6,npl)
1215 ENDIF
1216 ENDIF
1217 IF (npl==npolb) GOTO 350
1218 npl=npl+1
1219 polc=redir(polb(npl))
1220 ENDIF
1221 ptr_cur => ptr_cur%PTR
1222 ENDDO
1223 350 CONTINUE
1224
1225 DO n=1,nnp
1226 npolh=npolh+1
1227 IF (.NOT.ASSOCIATED(phfirst)) THEN
1228 ALLOCATE(phfirst)
1229 ph_cur => phfirst
1230 ELSE
1231 ALLOCATE
1232 ph_prec%PTR => ph_cur
1233 ENDIF
1234 nn=polh(1,n)
1235 ALLOCATE(ph_cur%POLH(2+nn))
1236 ph_cur%RANK=npolh
1237 ph_cur%POLH(1)=polh(1,n)
1238 ph_cur%POLH(2)=polh(2,n)
1239 DO m=1,nn
1240 ph_cur%POLH(2+m)=redir(polh(2+m,n))
1241 ENDDO
1242 ph_prec => ph_cur
1243 ENDDO
1244
1245 ENDDO
1246 DEALLOCATE(ipoly, rpoly, polb, polh, redir)
1247 ENDDO
1248
1249
1250
1251 370 CONTINUE
1252
1253 ptr_cur => first
1254 lenimax=0
1255 lenrmax=0
1256 nns=0
1257 nns2=0
1258 DO i=1,npoly
1259 nn=ptr_cur%IPOLY(2)
1260 nns=nns+nn
1261 nns2=nns2+ptr_cur%NNSP
1262 IF (ptr_cur%IPOLY(1)==1) THEN
1263 lenimax=
max(lenimax,6+nn+1)
1264 lenrmax=
max(lenrmax,4+3*nn)
1265 ELSEIF (ptr_cur%IPOLY(1)==2) THEN
1266 nhol=ptr_cur%IPOLY(6+nn+1)
1267 lenimax=
max(lenimax,6+nn+1+nhol)
1268 lenrmax=
max(lenrmax,4+3*nn+3*nhol)
1269 ENDIF
1270 ptr_cur => ptr_cur%PTR
1271 ENDDO
1272 ph_cur => phfirst
1273 nphmax=0
1274 DO i=1,npolh
1275 nn=ph_cur%POLH(1)
1276 nphmax=
max(nphmax,nn)
1277 ph_cur => ph_cur%PTR
1278 ENDDO
1279
1280 npoly_old=npoly
1281 npolh_old=npolh
1282 IF (nba>0) THEN
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370 ALLOCATE(itagn(nnsa))
1371 npolh=npolh+nba
1372 DO i=1,nba
1373 itagba(i)=0
1374 ENDDO
1375
1376 DO i=1,nnsa
1377 itagn(i)=0
1378 ENDDO
1379 DO iel=1,nel
1380 n1=
fvspmd(ifv)%ELEMSA(1,iel)
1381 n2=
fvspmd(ifv)%ELEMSA(2,iel)
1382 n3=
fvspmd(ifv)%ELEMSA(3,iel)
1383 IF (n1>0) itagn(n1)=1
1384 IF (n1>0) itagn(n2)=1
1385 IF (n1>0) itagn(n3)=1
1386 ENDDO
1387
1388 DO i=1,nba
1389 nfac=tba(2,i)
1390 nnp=0
1391 DO j=1,nfac
1392 ity=tfaca(2*(j-1)+1,i)
1393 IF (ity==1) THEN
1394
1395 nv=tfaca(2*(j-1)+2,i)
1396 IF (itagba(nv)==0) THEN
1397 lenimax=
max(lenimax,6+3+1)
1398 lenrmax=
max(lenrmax,6+3*3)
1399 IF (nfac==4) THEN
1400 npoly=npoly+1
1401 nns=nns+3
1402 ELSEIF (nfac==6) THEN
1403 npoly=npoly+2
1404 nns=nns+6
1405 ENDIF
1406 ENDIF
1407 IF (nfac==4) THEN
1408 nnp=nnp+1
1409 ELSEIF (nfac==6) THEN
1410 nnp=nnp+2
1411 ENDIF
1412 ELSEIF (ity==2) THEN
1413
1414 IF (nfac==4) THEN
1415 npoly=npoly+1
1416 nns=nns+3
1417 nnp=nnp+1
1418 ELSEIF (nfac==6) THEN
1419 npoly=npoly+2
1420 nns=nns+6
1421 nnp=nnp+2
1422 ENDIF
1423 ELSEIF (ity==3) THEN
1424
1425 ptr_cur => first
1426 DO k=1,npoly_old
1427 ity=ptr_cur%IPOLY(1)
1428 IF (ity==1) THEN
1429 iel=ptr_cur%IPOLY(3)
1430 IF (-tagela(iel)==i) nnp=nnp+1
1431 ENDIF
1432 ptr_cur => ptr_cur%PTR
1433 ENDDO
1434 ENDIF
1435 ENDDO
1436 itagba(i)=1
1437 nphmax=
max(nphmax,nnp)
1438
1439 nall=1
1440 IF (nfac==4) THEN
1441 DO j=1,4
1442 jj=
fvspmd(ifv)%IXSA(2*(j-1)+1,i)
1443 nall=nall*itagn(jj)
1444 ENDDO
1445 ELSEIF (nfac==6) THEN
1446 DO j=1,8
1448 nall=nall*itagn(jj)
1449 ENDDO
1450 ENDIF
1451 ibsa(i)=nall
1452 ENDDO
1453
1454 ENDIF
1455
1456 ALLOCATE(ipoly_f(lenimax,npoly), rpoly_f(lenrmax,npoly),
1457 . polh_f(2+nphmax,npolh), ifvnod(nns), volu(npolh),
1458 . ifvnod2(2,nns2), rfvnod2(4,nns2), xns(3,nns),
1459 . xns2(3,nns2))
1460
1461 npoly=npoly_old
1462 npolh=npolh_old
1463 ptr_cur => first
1464 nns=0
1465 DO i=1,npoly
1466 nn=ptr_cur%IPOLY(2)
1467 DO j=1,nn
1468 jj=ptr_cur%IPOLY(6+j)
1469 IF (jj>0) THEN
1470 nns=nns+1
1471 xns(1,nns)=ptr_cur%RPOLY(4+3*(j-1)+1)
1472 xns(2,nns)=ptr_cur%RPOLY(4+3*(j-1)+2)
1473 xns(3,nns)=ptr_cur%RPOLY(4+3*(j-1)+3)
1474 ENDIF
1475 ENDDO
1476 ptr_cur => ptr_cur%PTR
1477 ENDDO
1478
1479 nns=0
1480 ptr_cur => first
1481 DO i=1,npoly
1482 nn=ptr_cur%IPOLY(2)
1483 DO j=1,6
1484 ipoly_f(j,i)=ptr_cur%IPOLY(j)
1485 ENDDO
1486 DO j=1,4+3*nn
1487 rpoly_f(j,i)=ptr_cur%RPOLY(j)
1488 ENDDO
1489 DO j=1,nn
1490 jj=ptr_cur%IPOLY(6+j)
1491 IF (jj>0) THEN
1492 nns=nns+1
1493 ipoly_f(6+j,i)=nns
1494 ifvnod(nns)=ptr_cur%IELNOD(j)
1495 ELSE
1496 ipoly_f(6+j,i)=jj
1497 ENDIF
1498 ENDDO
1499 IF (ptr_cur%IPOLY(1)==1) THEN
1500 ipoly_f(4,i)=ipoly_f(5,i)
1501 ipoly_f(5,i)=0
1502 ELSEIF (ptr_cur%IPOLY(1)==2) THEN
1503 nhol=ptr_cur%IPOLY(6+nn+1)
1504 ipoly_f(6+nn+1,i)=nhol
1505 DO j=1,nhol
1506 ipoly_f(6+nn+1+j,i)=ptr_cur%IPOLY(6+nn+1+j)
1507 rpoly_f(4+3*nn+3*(j-1)+1,i)=
1508 . ptr_cur%RPOLY(4+3*nn+3*(j-1)+1)
1509 rpoly_f(4+3*nn+3*(j-1)+2,i)=
1510 . ptr_cur%RPOLY(4+3*nn+3*(j-1)+2)
1511 rpoly_f(4+3*nn+3*(j-1)+3,i)=
1512 . ptr_cur%RPOLY(4+3*nn+3*(j-1)+3)
1513 ENDDO
1514 ENDIF
1515 nnsp=ptr_cur%NNSP
1516 IF (nnsp>0) THEN
1517 DO j=1,nnsp
1518 jj=ptr_cur%NREF(1,j)
1519 ifvnod2(1,jj)=ptr_cur%NREF(2,j)
1520 ifvnod2(2,jj)=ptr_cur%NREF(3,j)
1521 rfvnod2(1,jj)=ptr_cur%AREF(1,j)
1522 rfvnod2(2,jj)=ptr_cur%AREF(2,j)
1523 rfvnod2(3,jj)=ptr_cur%AREF(3,j)
1524 rfvnod2(4,jj)=ptr_cur%AREF(4,j)
1525 ENDDO
1526 ENDIF
1527 ptr_tmp => ptr_cur%PTR
1528 DEALLOCATE(ptr_cur%IPOLY, ptr_cur%RPOLY, ptr_cur%IELNOD)
1529 IF (nnsp>0) DEALLOCATE(ptr_cur%NREF, ptr_cur%AREF)
1530 DEALLOCATE(ptr_cur)
1531 ptr_cur => ptr_tmp
1532 ENDDO
1533
1534 DO i=1,nns2
1535 n1=ifvnod2(1,i)
1536 n2=ifvnod2(2,i)
1537 idep=0
1538 IF (n1<0) THEN
1539 ii=-n1
1540 IF (ifvnod2(1,ii)/=n2.AND.ifvnod2(2,ii)/=n2) THEN
1541 WRITE(istdo,*) 'PROBLEM DEPENDANT NODE ',i
1543 ENDIF
1544 n1=ifvnod2(1,ii)
1545 n2=ifvnod2(2,ii)
1546 idep=1
1547 ELSEIF (n2<0) THEN
1548 ii=-n2
1549 IF (ifvnod2(1,ii)/=n1.AND.ifvnod2(2,ii)/=n1) THEN
1550 WRITE(istdo,*) 'PROBLEM DEPENDANT NODE ',i
1552 ENDIF
1553 n1=ifvnod2(1,ii)
1554 n2=ifvnod2(2,ii)
1555 idep=1
1556 ENDIF
1557 ifvnod2(1,i)=n1
1558 ifvnod2(2,i)=n2
1559 IF (idep==1) THEN
1560
1561 ii=1
1562 val=abs(xns(1,n1)-xns(1,n2))
1563 DO j=2,3
1564 IF (abs(xns(j,n1)-xns(j,n2))>val) THEN
1565 ii=j
1566 val=abs(xns(j,n1)-xns(j,n2))
1567 ENDIF
1568 ENDDO
1569 rfvnod2(1,i)=(rfvnod2(ii+1,i)-xns(ii,n2))/
1570 . (xns(ii,n1)-xns(ii,n2))
1571 ENDIF
1572 ENDDO
1573
1574 ph_cur => phfirst
1575 DO i=1,npolh
1576 nn=ph_cur%POLH(1)
1577 DO j=1,2+nn
1578 polh_f(j,i)=ph_cur%POLH(j)
1579 ENDDO
1580 ph_tmp => ph_cur%PTR
1581 DEALLOCATE(ph_cur%POLH)
1582 DEALLOCATE(ph_cur)
1583 ph_cur => ph_tmp
1584 ENDDO
1585
1586 IF (nba>0) THEN
1587 DO i=1,nba
1588 itagba(i)=0
1589 ENDDO
1590
1591 npoly_old=npoly
1592 DO i=1,nba
1593 ii=tba(1,i)
1594 nfac=tba(2,i)
1595 nnp=0
1596 DO j=1,nfac
1597 ity=tfaca(2*(j-1)+1,i)
1598 IF (ity==1) THEN
1599
1600 nv=tfaca(2*(j-1)+2,i)
1601 IF (itagba(nv)==0) THEN
1602 IF (nfac==4) THEN
1603 npoly=npoly+1
1604 n1=fac4(1,j)
1605 n2=fac4(2,j)
1606 n3=fac4(3,j)
1607 ipoly_f(1,npoly)=2
1608 ipoly_f(2,npoly)=3
1609 ipoly_f(3,npoly)=0
1610 ipoly_f(4,npoly)=0
1611 ipoly_f(5,npoly)=npolh+i
1612 ipoly_f(6,npoly)=npolh+nv
1613 ipoly_f(6+1,npoly)=nns+1
1614 ipoly_f(6+2,npoly)=nns+2
1615 ipoly_f(6+3,npoly)=nns+3
1616 ipoly_f(6+3+1,npoly)=0
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636 nn1=
fvspmd(ifv)%IXSA(n1,i)
1637 nn2=
fvspmd(ifv)%IXSA(n2,i)
1638 nn3=
fvspmd(ifv)%IXSA(n3,i)
1639 ifvnod(nns+1)=-nn1
1640 ifvnod(nns+2)=-nn2
1641 ifvnod(nns+3)=-nn3
1642 nns=nns+3
1643 x1=xxxsa(1,nn1)
1644 y1=xxxsa(2,nn1)
1645 z1=xxxsa(3,nn1)
1646 x2=xxxsa(1,nn2)
1647 y2=xxxsa(2,nn2)
1648 z2=xxxsa(3,nn2)
1649 x3=xxxsa(1,nn3)
1650 y3=xxxsa(2,nn3)
1651 z3=xxxsa(3,nn3)
1652
1653 x12=x2-x1
1654 y12=y2-y1
1655 z12=z2-z1
1656 x13=x3-x1
1657 y13=y3-y1
1658 z13=z3-z1
1659 nrx=y12*z13-z12*y13
1660 nry=z12*x13-x12*z13
1661 nrz=x12*y13-y12*x13
1662 area2=sqrt(nrx**2+nry**2+nrz**2)
1663 rpoly_f(2,npoly)=nrx/area2
1664 rpoly_f(3,npoly)=nry/area2
1665 rpoly_f(4,npoly)=nrz/area2
1666 rpoly_f(4+1,npoly)=x1
1667 rpoly_f(4+2,npoly)=y1
1668 rpoly_f(4+3,npoly)=z1
1669 rpoly_f(4+4,npoly)=x2
1670 rpoly_f(4+5,npoly)=y2
1671 rpoly_f(4+6,npoly)=z2
1672 rpoly_f(4+7,npoly)=x3
1673 rpoly_f(4+8,npoly)=y3
1674 rpoly_f(4+9,npoly)=z3
1675
1676 nnp=nnp+1
1677 polh_f(2+nnp,npolh+i)=npoly
1678 ELSEIF (nfac==6) THEN
1679 n1=fac(1,j)
1680 n2=fac(2,j)
1681 n3=fac(3,j)
1682 n4=fac(4,j)
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701 nn1=
fvspmd(ifv)%IXSA(n1,i)
1702 nn2=
fvspmd(ifv)%IXSA(n2,i)
1703 nn3=
fvspmd(ifv)%IXSA(n3,i)
1704 nn4=
fvspmd(ifv)%IXSA(n4,i)
1705 x1=xxxsa(1,nn1)
1706 y1=xxxsa(2,nn1)
1707 z1=xxxsa(3,nn1)
1708 x2=xxxsa(1,nn2)
1709 y2=xxxsa(2,nn2)
1710 z2=xxxsa(3,nn2)
1711 x3=xxxsa(1,nn3)
1712 y3=xxxsa(2,nn3)
1713 z3=xxxsa(3,nn3
1714 x4=xxxsa(1,nn4)
1715 y4=xxxsa(2,nn4)
1716 z4=xxxsa(3,nn4)
1717
1718
1719 npoly=npoly+1
1720 ipoly_f(1,npoly)=2
1721 ipoly_f(2,npoly)=3
1722 ipoly_f(3,npoly)=0
1723 ipoly_f(4,npoly)=0
1724 ipoly_f(5,npoly)=npolh+i
1725 ipoly_f(6,npoly)=npolh+nv
1726 ipoly_f(6+1,npoly)=nns+1
1727 ipoly_f(6+2,npoly)=nns+2
1728 ipoly_f(6+3,npoly)=nns+3
1729 ipoly_f(6+3+1,npoly)=0
1730 ifvnod(nns+1)=-nn1
1731 ifvnod(nns+2)=-nn2
1732 ifvnod(nns+3)=-nn3
1733 nns=nns+3
1734 x12=x2-x1
1735 y12=y2-y1
1736 z12=z2-z1
1737 x13=x3-x1
1738 y13=y3-y1
1739 z13=z3-z1
1740 nrx=y12*z13-z12*y13
1741 nry=z12*x13-x12*z13
1742 nrz=x12*y13-y12*x13
1743 area2=sqrt(nrx**2+nry**2+nrz**2)
1744 rpoly_f(2,npoly)=nrx/area2
1745 rpoly_f(3,npoly)=nry/area2
1746 rpoly_f(4,npoly)=nrz/area2
1747 rpoly_f(4+1,npoly)=x1
1748 rpoly_f(4+2,npoly)=y1
1749 rpoly_f(4+3,npoly)=z1
1750 rpoly_f(4+4,npoly)=x2
1751 rpoly_f(4+5,npoly)=y2
1752 rpoly_f(4+6,npoly)=z2
1753 rpoly_f(4+7,npoly)=x3
1754 rpoly_f(4+8,npoly)=y3
1755 rpoly_f(4+9,npoly)=z3
1756
1757 nnp=nnp+1
1758 polh_f(2+nnp,npolh+i)=npoly
1759
1760 npoly=npoly+1
1761 ipoly_f(1,npoly)=2
1762 ipoly_f(2,npoly)=3
1763 ipoly_f(3,npoly)=0
1764 ipoly_f(4,npoly)=0
1765 ipoly_f(5,npoly)=npolh+i
1766 ipoly_f(6,npoly)=npolh+nv
1767 ipoly_f(6+1,npoly)=nns+1
1768 ipoly_f(6+2,npoly)=nns+2
1769 ipoly_f(6+3,npoly)=nns+3
1770 ipoly_f(6+3+1,npoly)=0
1771 ifvnod(nns+1)=-nn1
1772 ifvnod(nns+2)=-nn3
1773 ifvnod(nns+3)=-nn4
1774 nns=nns+3
1775 x13=x3-x1
1776 y13=y3-y1
1777 z13=z3-z1
1778 x14=x4-x1
1779 y14=y4-y1
1780 z14=z4-z1
1781 nrx=y13*z14-z13*y14
1782 nry=z13*x14-x13*z14
1783 nrz=x13*y14-y13*x14
1784 area2=sqrt(nrx**2+nry**2+nrz**2)
1785 rpoly_f(2,npoly)=nrx/area2
1786 rpoly_f(3,npoly)=nry/area2
1787 rpoly_f(4,npoly)=nrz/area2
1788 rpoly_f(4+1,npoly)=x1
1789 rpoly_f(4+2,npoly)=y1
1790 rpoly_f(4+3,npoly)=z1
1791 rpoly_f(4+4,npoly)=x3
1792 rpoly_f(4+5,npoly)=y3
1793 rpoly_f(4+6,npoly)=z3
1794 rpoly_f(4+7,npoly)=x4
1795 rpoly_f(4+8,npoly)=y4
1796 rpoly_f(4+9,npoly)=z4
1797
1798 nnp=nnp+1
1799 polh_f(2+nnp,npolh+i)=npoly
1800 ENDIF
1801 ELSE
1802 DO k=1,polh_f(1,npolh+nv)
1803 kk=polh_f(2+k,npolh+nv)
1804 IF (ipoly_f(1,kk)==2.AND.
1805 . ipoly_f(6,kk)==npolh+i) THEN
1806 nnp=nnp+1
1807 polh_f(2+nnp,npolh+i)=kk
1808 ENDIF
1809 ENDDO
1810 ENDIF
1811 ELSEIF (ity==2) THEN
1812
1813 ELSEIF (ity==3) THEN
1814
1815 DO k=1,npoly_old
1816 ity=ipoly_f(1,k)
1817 IF (ity==1) THEN
1818 iel=ipoly_f(3,k)
1819 IF (-tagela(iel)==i) THEN
1820 nnp=nnp+1
1821 polh_f(2+nnp,npolh+i)=k
1822 ipoly_f(1,k)=2
1823 ipoly_f(3,k)=0
1824 ip=ipoly_f(4,k)
1825 ipoly_f(4,k)=0
1826 ipoly_f(5,k)=ip
1827 ipoly_f(6,k)=npolh+i
1828 ENDIF
1829 ENDIF
1830 ENDDO
1831 ENDIF
1832 ENDDO
1833 polh_f(1,npolh+i)=nnp
1834 polh_f(2,npolh+i)=-i
1835 itagba(i)=1
1836 ENDDO
1837
1838 npolh=npolh+nba
1839
1840 DO i=1,npoly_old
1841 IF (ipoly_f(1,i)==1) THEN
1842 iel=ipoly_f(3,i)
1843 IF (tagela(iel)>0) ipoly_f(3,i)=tagela(iel)
1844 ENDIF
1845 ENDDO
1846
1847 DO iel=1,nel
1848 IF (tagels(iel)>0) THEN
1849 npoly=npoly+1
1850 ipoly_f(1,npoly)=1
1851 ipoly_f(2,npoly)=3
1852 ipoly_f(3,npoly)=iel
1853 ipoly_f(4,npoly)=npolh_old+tagels(iel)
1854 ipoly_f(5,npoly)=0
1855 ipoly_f(6,npoly)=0
1856 ipoly_f(7,npoly)=nns+1
1857 ipoly_f(8,npoly)=nns+2
1858 ipoly_f(9,npoly)=nns+3
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884 nn1=
fvspmd(ifv)%ELEMSA(1,iel)
1885 nn2=
fvspmd(ifv)%ELEMSA(2,iel)
1886 nn3=
fvspmd(ifv)%ELEMSA(3,iel)
1887 ifvnod(nns+1)=-nn1
1888 ifvnod(nns+2)=-nn2
1889 ifvnod(nns+3)=-nn3
1890 nns=nns+3
1891 rpoly_f(1,npoly)=elarea(iel)
1892 rpoly_f(2,npoly)=
norm(1,iel)
1893 rpoly_f(3,npoly)=
norm(2,iel)
1894 rpoly_f(4,npoly)=
norm(3,iel)
1895 x1=xxxsa(1,nn1)
1896 y1=xxxsa(2,nn1)
1897 z1=xxxsa(3,nn1)
1898 x2=xxxsa(1,nn2)
1899 y2=xxxsa(2,nn2)
1900 z2=xxxsa(3,nn2)
1901 x3=xxxsa(1,nn3)
1902 y3=xxxsa(2,nn3)
1903 z3=xxxsa(3,nn3)
1904
1905 rpoly_f(5,npoly)=x1
1906 rpoly_f(6,npoly)=y1
1907 rpoly_f(7,npoly)=z1
1908 rpoly_f(8,npoly)=x2
1909 rpoly_f(9,npoly)=y2
1910 rpoly_f(10,npoly)=z2
1911 rpoly_f(11,npoly)=x3
1912 rpoly_f(12,npoly)=y3
1913 rpoly_f(13,npoly)=z3
1914
1915 nnp=polh_f(1,npolh_old+tagels(iel))
1916 nnp=nnp+1
1917 polh_f(1,npolh_old+tagels(iel))=nnp
1918 polh_f(2+nnp,npolh_old+tagels(iel))=npoly
1919 ENDIF
1920 ENDDO
1921 ENDIF
1922
1923
1924
1925 DO i=1,npoly
1926 ity=ipoly_f(1,i)
1927 nn=ipoly_f(2,i)
1928 nhol=0
1929 IF (ity==2) nhol=ipoly_f(6+nn+1,i)
1931 nx=rpoly_f(2,i)
1932 ny=rpoly_f(3,i)
1933 nz=rpoly_f(4,i)
1934 IF (nhol==0) THEN
1935 x1=rpoly_f(5,i)
1936 y1=rpoly_f(6,i)
1937 z1=rpoly_f(7,i)
1938 DO j=1,nn-2
1939 jj=j+1
1940 jjj=jj+1
1941 x2=rpoly_f(4+3*(jj-1)+1,i)
1942 y2=rpoly_f(4+3*(jj-1)+2,i)
1943 z2=rpoly_f(4+3*(jj-1)+3,i)
1944 x3=rpoly_f(4+3*(jjj-1)+1,i)
1945 y3=rpoly_f(4+3*(jjj-1)+2,i)
1946 z3=rpoly_f(4+3*(jjj-1)+3,i)
1947 x12=x2-x1
1948 y12=y2-y1
1949 z12=z2-z1
1950 x13=x3-x1
1951 y13=y3-y1
1952 z13=z3-z1
1953 nnx=y12*z13-z12*y13
1954 nny=z12*x13-x12*z13
1955 nnz=x12*y13-y12*x13
1957 ENDDO
1958 ELSE
1959 ALLOCATE(adr(nhol))
1960 DO j=1,nhol
1961 adr(j)=ipoly_f(6+nn+1+j,i)
1962 ENDDO
1963 adr(nhol+1)=nn
1964 x1=rpoly_f(5,i)
1965 y1=rpoly_f(6,i)
1966 z1=rpoly_f(7,i)
1967 DO j=1,adr(1)-2
1968 jj=j+1
1969 jjj=jj+1
1970 x2=rpoly_f(4+3*(jj-1)+1,i)
1971 y2=rpoly_f(4+3*(jj-1)+2,i)
1972 z2=rpoly_f(4+3*(jj-1)+3,i)
1973 x3=rpoly_f(4+3*(jjj-1)+1,i)
1974 y3=rpoly_f(4+3*(jjj-1)+2,i)
1975 z3=rpoly_f(4+3*(jjj-1)+3,i)
1976 x12=x2-x1
1977 y12=y2-y1
1978 z12=z2-z1
1979 x13=x3-x1
1980 y13=y3-y1
1981 z13=z3-z1
1982 nnx=y12*z13-z12*y13
1983 nny=z12*x13-x12*z13
1984 nnz=x12*y13-y12*x13
1986 ENDDO
1988
1989 DO j=1,nhol
1990 x1=rpoly_f(4+3*adr(j)+1,i)
1991 y1=rpoly_f(4+3*adr(j)+2,i)
1992 z1=rpoly_f(4+3*adr(j)+3,i)
1993 area2=zero
1994 DO k=adr(j)+1,adr(j+1)-2
1995 kk=k+1
1996 kkk=kk+1
1997 x2=rpoly_f(4+3*(kk-1)+1,i)
1998 y2=rpoly_f(4+3*(kk-1)+2,i)
1999 z2=rpoly_f(4+3*(kk-1)+3,i)
2000 x3=rpoly_f(4+3*(kkk-1)+1,i)
2001 y3=rpoly_f(4+3*(kkk-1)+2,i)
2002 z3=rpoly_f(4+3*(kkk-1)+3,i)
2003 x12=x2-x1
2004 y12=y2-y1
2005 z12=z2-z1
2006 x13=x3-x1
2007 y13=y3-y1
2008 z13=z3-z1
2009 nnx=y12*z13-z12*y13
2010 nny=z12*x13-x12*z13
2011 nnz=x12*y13-y12*x13
2012 area2=area2+(nnx*nx+nny*ny+nnz*nz)
2013 ENDDO
2015 ENDDO
2016 DEALLOCATE(adr)
2017 ENDIF
2018 rpoly_f(1,i)=half*abs(
area)
2019 ENDDO
2020
2021
2022
2023 DO i=1,npolh
2024 volu(i)=zero
2025 DO j=1,polh_f(1,i)
2026 jj=polh_f(2+j,i)
2028 ity=ipoly_f(1,jj)
2029 IF (ity==1) THEN
2030 nx=rpoly_f(2,jj)
2031 ny=rpoly_f(3,jj)
2032 nz=rpoly_f(4,jj)
2033 ELSEIF (ity==2) THEN
2034 IF (ipoly_f(5,jj)==i) THEN
2035 nx=rpoly_f(2,jj)
2036 ny=rpoly_f(3,jj)
2037 nz=rpoly_f(4,jj)
2038 ELSEIF (ipoly_f(6,jj)==i) THEN
2039 nx=-rpoly_f(2,jj)
2040 ny=-rpoly_f(3,jj)
2041 nz=-rpoly_f(4,jj)
2042 ENDIF
2043 ENDIF
2044 x1=rpoly_f(5,jj)
2045 y1=rpoly_f(6,jj)
2046 z1=rpoly_f(7,jj)
2047 volu(i)=volu(i)+third*
area*(x1*nx+y1*ny+z1*nz)
2048 ENDDO
2049 ENDDO
2050
2051
2052
2053 nns_old=nns
2054 ALLOCATE(ifvnod_old(nns_old), redir(nns_old))
2055 DO i=1,nns_old
2056 ifvnod_old(i)=ifvnod(i)
2057 ENDDO
2058 nns_old=0
2059 nns=0
2060
2061 tole=rvolu(50)
2062 DO i=1,npoly
2063 nnp_old=ipoly_f(2,i)
2064
2065 lmax2=zero
2066 x0=rpoly_f(5,i)
2067 y0=rpoly_f(6,i)
2068 z0=rpoly_f(7,i)
2069 DO j=2,nnp_old
2070 x1=rpoly_f(4+3*(j-1)+1,i)
2071 y1=rpoly_f(4+3*(j-1)+2,i)
2072 z1=rpoly_f(4+3*(j-1)+3,i)
2073 lmax2=
max(lmax2,(x1-x0)**2+(y1-y0)**2+(z1-z0)**2)
2074 x0=x1
2075 y0=y1
2076 z0=z1
2077 ENDDO
2078 x1=rpoly_f(5,i)
2079 y1=rpoly_f(6,i)
2080 z1=rpoly_f(7,i)
2081 lmax2=
max(lmax2,(x1-x0)**2+(y1-y0)**2+(z1-z0)**2)
2082 tole2=tole**2*lmax2
2083
2084 nhol=0
2085 IF (ipoly_f(1,i)==2) nhol=ipoly_f(6+nnp_old+1,i)
2086 ALLOCATE(ipoly_old(nnp_old), rpoly_old(3*nnp_old),
2087 . adr_old(nhol+2), adr(nhol+2))
2088 DO j=1,nnp_old
2089 ipoly_old(j)=ipoly_f(6+j,i)
2090 ENDDO
2091 DO j=1,3*nnp_old
2092 rpoly_old(j)=rpoly_f(4+j,i)
2093 ENDDO
2094 nnp=0
2095 IF (nhol==0) THEN
2096 x0=rpoly_f(5,i)
2097 y0=rpoly_f(6,i)
2098 z0=rpoly_f(7,i)
2099 IF (ipoly_old(1)>0) THEN
2100 nns_old=nns_old+1
2101 nns=nns+1
2102 redir(nns_old)=nns
2103 ipoly_f(7,i)=nns
2104 ifvnod(nns)=ifvnod_old(nns_old)
2105 ELSE
2106 ipoly_f(7,i)=ipoly_old(1)
2107 ENDIF
2108 nnp=nnp+1
2109 j0=1
2110 nns1=nns
2111 DO j=2,nnp_old
2112 IF (ipoly_old(j)>0) nns_old=nns_old+1
2113 x1=rpoly_old(3*(j-1)+1)
2114 y1=rpoly_old(3*(j-1)+2)
2115 z1=rpoly_old(3*(j-1)+3)
2116 dd=(x1-x0)**2+(y1-y0)**2+(z1-z0)**2
2117 IF (dd>tole2) THEN
2118 nnp=nnp+1
2119 IF (ipoly_old(j)>0) THEN
2120 nns=nns+1
2121 ifvnod(nns)=ifvnod_old(nns_old)
2122 rpoly_f(4+3*(nnp-1)+1,i)=x1
2123 rpoly_f(4+3*(nnp-1)+2,i)=y1
2124 rpoly_f(4+3*(nnp-1)+3,i)=z1
2125 ipoly_f(6+nnp,i)=nns
2126 ELSE
2127 rpoly_f(4+3*(nnp-1)+1,i)=x1
2128 rpoly_f(4+3*(nnp-1)+2,i)=y1
2129 rpoly_f(4+3*(nnp-1)+3,i)=z1
2130 ipoly_f(6+nnp,i)=ipoly_old(j)
2131 ENDIF
2132 x0=x1
2133 y0=y1
2134 z0=z1
2135 ELSEIF (ipoly_old(j)>0.AND.
2136 . ipoly_old(j0)<0) THEN
2137 nns=nns+1
2138 ifvnod(nns)=ifvnod_old(nns_old)
2139 rpoly_f(4+3*(nnp-1)+1,i)=x1
2140 rpoly_f(4+3*(nnp-1)+2,i)=y1
2141 rpoly_f(4+3*(nnp-1)+3,i)=z1
2142 ipoly_f(6+nnp,i)=nns
2143 ENDIF
2144 IF (ipoly_old(j)>0) redir(nns_old)=nns
2145 j0=j
2146 ENDDO
2147 x1=rpoly_f(5,i)
2148 y1=rpoly_f(6,i)
2149 z1=rpoly_f(7,i)
2150 dd=(x1-x0)**2+(y1-y0)**2+(z1-z0)**2
2151 IF (dd<=tole2.AND.ipoly_old(1)>0) THEN
2152 redir(nns_old)=nns1
2153 nns=nns-1
2154 nnp=nnp-1
2155 ELSEIF (dd<=tole2.AND.ipoly_old(1)<0) THEN
2156 nnp=nnp-1
2157 rpoly_f(5,i)=x0
2158 rpoly_f(6,i)=y0
2159 rpoly_f(7,i)=z0
2160 ipoly_f(7,i)=nns
2161 ENDIF
2162 ipoly_f(6+nnp+1,i)=0
2163 ELSE
2164 adr_old(1)=0
2165 adr(1)=0
2166 DO j=1,nhol
2167 adr_old(j+1)=ipoly_f(6+nnp_old+1+j,i)
2168 ENDDO
2169 adr_old(nhol+2)=nnp_old
2170 DO j=1,nhol+1
2171 x0=rpoly_f(4+3*adr(j)+1,i)
2172 y0=rpoly_f(4+3*adr(j)+2,i)
2173 z0=rpoly_f(4+3*adr(j)+3,i)
2174 IF (ipoly_old(adr_old(j)+1)>0) THEN
2175 nns_old=nns_old+1
2176 nns=nns+1
2177 redir(nns_old)=nns
2178 ipoly_f(6+adr(j)+1,i)=nns
2179 ifvnod(nns)=ifvnod_old(nns_old)
2180 ELSE
2181 ipoly_f(6+adr(j)+1,i)=ipoly_old(adr_old(j)+1)
2182 ENDIF
2183 nnp=nnp+1
2184 k0=1
2185 nns1=nns
2186 DO k=adr_old(j)+2,adr_old(j+1)
2187 nns_old=nns_old+1
2188 x1=rpoly_old(3*(k-1)+1)
2189 y1=rpoly_old(3*(k-1)+2)
2190 z1=rpoly_old(3*(k-1)+3)
2191 dd=(x1-x0)**2+(y1-y0)**2+(z1-z0)**2
2192 IF (dd>tole2) THEN
2193 nnp=nnp+1
2194 IF (ipoly_old(k)>0) THEN
2195 nns=nns+1
2196 ifvnod(nns)=ifvnod_old(nns_old)
2197 rpoly_f(4+3*(nnp-1)+1,i)=x1
2198 rpoly_f(4+3*(nnp-1)+2,i)=y1
2199 rpoly_f(4+3*(nnp-1)+3,i)=z1
2200 ipoly_f(6+nnp,i)=nns
2201 ELSE
2202 rpoly_f(4+3*(nnp-1)+1,i)=x1
2203 rpoly_f(4+3*(nnp-1)+2,i)=y1
2204 rpoly_f(4+3*(nnp-1)+3,i)=z1
2205 ipoly_f(6+nnp,i)=ipoly_old(k)
2206 ENDIF
2207 x0=x1
2208 y0=y1
2209 z0=z1
2210 ELSEIF (ipoly_old(k)>0.AND.
2211 . ipoly_old(k0)<0) THEN
2212 nns=nns+1
2213 ifvnod(nns)=ifvnod_old(nns_old)
2214 rpoly_f(4+3*(nnp-1)+1,i)=x1
2215 rpoly_f(4+3*(nnp-1)+2,i)=y1
2216 rpoly_f(4+3*(nnp-1)+3,i)=z1
2217 ipoly_f(6+nnp,i)=nns
2218 ENDIF
2219 IF (ipoly_old(k)>0) redir(nns_old)=nns
2220 k0=k
2221 ENDDO
2222 x1=rpoly_f(4+3*(adr(j)-1)+1,i)
2223 y1=rpoly_f(4+3*(adr(j)-1)+2,i)
2224 z1=rpoly_f(4+3*(adr(j)-1)+3,i)
2225 dd=(x1-x0)**2+(y1-y0)**2+(z1-z0)**2
2226 IF (dd<=tole2.AND.ipoly_old(adr_old(j)+1)>0) THEN
2227 redir(nns_old)=nns1
2228 nns=nns-1
2229 nnp=nnp-1
2230 ELSEIF (dd<=tole2.AND.
2231 . ipoly_old(adr_old(j)+1)<0) THEN
2232 nnp=nnp-1
2233 rpoly_f(4+3*(adr(j)-1)+1,i)=x0
2234 rpoly_f(4+3*(adr(j)-1)+2,i)=y0
2235 rpoly_f(4+3*(adr(j)-1)+3,i)=z0
2236 ipoly_f(6+adr(j)+1,i)=nns
2237 ENDIF
2238 adr(j+1)=nnp
2239 ENDDO
2240 ipoly_f(6+nnp+1,i)=nhol
2241 DO j=1,nhol
2242 ipoly_f(6+nnp+1+j,i)=adr(j+1)
2243 rpoly_f(4+3*nnp+3*(j-1)+1,i)=
2244 . rpoly_f(4+3*nnp_old+3*(j-1)+1,i)
2245 rpoly_f(4+3*nnp+3*(j-1)+2,i)=
2246 . rpoly_f(4+3*nnp_old+3*(j-1)+2,i)
2247 rpoly_f(4+3*nnp+3*(j-1)+3,i)=
2248 . rpoly_f(4+3*nnp_old+3*(j-1)+3,i)
2249 ENDDO
2250 ENDIF
2251 ipoly_f(2,i)=nnp
2252
2253 IF (nnp<nnp_old) THEN
2254
2256 nx=rpoly_f(2,i)
2257 ny=rpoly_f(3,i)
2258 nz=rpoly_f(4,i)
2259 IF (nhol==0) THEN
2260 x1=rpoly_f(5,i)
2261 y1=rpoly_f(6,i)
2262 z1=rpoly_f(7,i)
2263 DO j=1,ipoly_f(2,i)-2
2264 jj=j+1
2265 jjj=jj+1
2266 x2=rpoly_f(4+3*(jj-1)+1,i)
2267 y2=rpoly_f(4+3*(jj-1)+2,i)
2268 z2=rpoly_f(4+3*(jj-1)+3,i)
2269 x3=rpoly_f(4+3*(jjj-1)+1,i)
2270 y3=rpoly_f(4+3*(jjj-1)+2,i)
2271 z3=rpoly_f(4+3*(jjj-1)+3,i)
2272 x12=x2-x1
2273 y12=y2-y1
2274 z12=z2-z1
2275 x13=x3-x1
2276 y13=y3-y1
2277 z13=z3-z1
2278 nnx=y12*z13-z12*y13
2279 nny=z12*x13-x12*z13
2280 nnz=x12*y13-y12*x13
2282 ENDDO
2283 ELSE
2284 x1=rpoly_f(5,i)
2285 y1=rpoly_f(6,i)
2286 z1=rpoly_f(7,i)
2287 DO j=1,adr(1)-2
2288 jj=j+1
2289 jjj=jj+1
2290 x2=rpoly_f(4+3*(jj-1)+1,i)
2291 y2=rpoly_f(4+3*(jj-1)+2,i)
2292 z2=rpoly_f(4+3*(jj-1)+3,i)
2293 x3=rpoly_f(4+3*(jjj-1)+1,i)
2294 y3=rpoly_f(4+3*(jjj-1)+2,i)
2295 z3=rpoly_f(4+3*(jjj-1)+3,i)
2296 x12=x2-x1
2297 y12=y2-y1
2298 z12=z2-z1
2299 x13=x3-x1
2300 y13=y3-y1
2301 z13=z3-z1
2302 nnx=y12*z13-z12*y13
2303 nny=z12*x13-x12*z13
2304 nnz=x12*y13-y12*x13
2306 ENDDO
2307 ENDIF
2308
2309 DO j=1,nhol
2310 x1=rpoly_f(4+3*adr(j+1)+1,i)
2311 y1=rpoly_f(4+3*adr(j+1)+2,i)
2312 z1=rpoly_f(4+3*adr(j+1)+3,i)
2313 DO k=adr(j+1)+1,adr(j+2)
2314 kk=k+1
2315 kkk=kk+1
2316 x2=rpoly_f(4+3*(kk-1)+1,i)
2317 y2=rpoly_f(4+3*(kk-1)+2,i)
2318 z2=rpoly_f(4+3*(kk-1)+3,i)
2319 x3=rpoly_f(4+3*(kkk-1)+1,i)
2320 y3=rpoly_f(4+3*(kkk-1)+2,i)
2321 z3=rpoly_f(4+3*(kkk-1)+3,i)
2322 x12=x2-x1
2323 y12=y2-y1
2324 z12=z2-z1
2325 x13=x3-x1
2326 y13=y3-y1
2327 z13=z3-z1
2328 nnx=y12*z13-z12*y13
2329 nny=z12*x13-x12*z13
2330 nnz=x12*y13-y12*x13
2332 ENDDO
2333 ENDDO
2334 rpoly_f(1,i)=half*abs(
area)
2335 ENDIF
2336
2337 DEALLOCATE(ipoly_old, rpoly_old, adr_old, adr)
2338 ENDDO
2339
2340
2341 DO i=1,nns2
2342 i1=ifvnod2(1,i)
2343 i2=ifvnod2(2,i)
2344 ifvnod2(1,i)=redir(i1)
2345 ifvnod2(2,i)=redir(i2)
2346 ENDDO
2347
2348 DEALLOCATE(ifvnod_old, redir)
2349
2350
2351
2352 nphmax=2*nphmax
2353 info=0
2354 ALLOCATE(volu_old(npolh), rpoly_f_old(lenrmax,npoly),
2355 . ipoly_f_old(lenimax,npoly))
2356 DO i=1,npolh
2357 volu_old(i)=volu(i)
2358 ENDDO
2359 DO i=1,npoly
2360 DO j=1,lenimax
2361 ipoly_f_old(j,i)=ipoly_f(j,i)
2362 ENDDO
2363 DO j=1,lenrmax
2364 rpoly_f_old(j,i)=rpoly_f(j,i)
2365 ENDDO
2366 ENDDO
2367 400 IF (ALLOCATED(polh_new)) DEALLOCATE(polh_new)
2368 IF (ALLOCATED(imerged)) DEALLOCATE(imerged)
2369 ALLOCATE(polh_new(2+nphmax,npolh), imerged(npolh))
2370
2371 IF (info==1) THEN
2372 DO i=1,npolh
2373 volu(i)=volu_old(i)
2374 ENDDO
2375 DO i=1,npoly
2376 DO j=1,lenimax
2377 ipoly_f(j,i)=ipoly_f_old(j,i)
2378 ENDDO
2379 DO j=1,lenrmax
2380 rpoly_f(j,i)=rpoly_f_old(j,i)
2381 ENDDO
2382 ENDDO
2383 ENDIF
2384
2385 DO i=1,npolh
2386 imerged(i)=0
2387 DO j=1,2+polh_f(1,i)
2388 polh_new(j,i)=polh_f(j,i)
2389 ENDDO
2390 ENDDO
2391
2392 DO i=1,npolh
2393 IF (polh_f(2,i)<0) cycle
2394 IF (volu(i)<zero) THEN
2395 DO j=1,polh_f(1,i)
2396 jj=polh_f(2+j,i)
2397 rpoly_f(1,jj)=-one
2398 ENDDO
2399 volu(i)=zero
2400 ENDIF
2401 ENDDO
2402
2403
2404 vm=zero
2405 npa=0
2406 DO i=1,npolh
2407 IF (volu(i)>zero) THEN
2408 vm=vm+volu(i)
2409 npa=npa+1
2410 ENDIF
2411 ENDDO
2412 vm=vm/npa
2413
2414 rvolu(33)=vm
2415 volumin=vm*rvolu(31)
2416 info=0
2417 DO i=1,npolh
2418 IF (polh_new(2,i)<0) THEN
2419 ii=-polh_new(2,i)
2420
2421 IF(ibsa(ii)==0) cycle
2422 ENDIF
2423
2424 IF (volu(i)<=volumin) THEN
2425 areamax=zero
2426 jmax=0
2427 imax=0
2428 DO j=1,polh_new(1,i)
2429 jj=polh_new(2+j,i)
2430 ity=ipoly_f(1,jj)
2431 IF (ity==1) cycle
2433 IF (
area>areamax)
THEN
2434 IF (ipoly_f(5,jj)==i) THEN
2435 ii=ipoly_f(6,jj)
2436 IF (polh_new(2,ii)<0) THEN
2437 iii=-polh_new(2,ii)
2438 IF (ibsa(iii)==0) cycle
2439 ENDIF
2440
2441 jmax=j
2442 imax=ii
2443 ELSEIF (ipoly_f(6,jj)==i) THEN
2444 ii=ipoly_f(5,jj)
2445 IF (polh_new(2,ii)<0) THEN
2446 iii=-polh_new(2,ii)
2447 IF (ibsa(iii)==0) cycle
2448 ENDIF
2449
2450 jmax=j
2451 imax=ii
2452 ENDIF
2454 ENDIF
2455 ENDDO
2456 IF (jmax/=0) THEN
2457 jjmax=polh_new(2+jmax,i)
2458 rpoly_f(1,jjmax)=-one
2459 ELSE
2460 jmax=1
2461 jjmax=polh_new(2+jmax,i)
2462 ity=ipoly_f(1,jjmax)
2463 IF (ity==2) rpoly_f(1,jjmax)=-one
2464
2465 imax=1
2466 ENDIF
2467 IF (imerged(imax)==1) imax=polh_new(2,imax)
2468 np=polh_new(1,imax)
2469 volu(imax)=volu(imax)+volu(i)
2470 volu(i)=-one
2471 imerged(i)=1
2472 DO j=1,polh_new(1,i)
2473 IF (j/=jmax) THEN
2474 np=np+1
2475 IF (np>nphmax) info=1
2476 IF (info==0) THEN
2477 jj=polh_new(2+j,i)
2478 polh_new(2+np,imax)=jj
2479 ity=ipoly_f(1,jj)
2480 IF (ity==2) THEN
2481 IF (ipoly_f(5,jj)==i) THEN
2482 ipoly_f(5,jj)=imax
2483 ELSEIF (ipoly_f(6,jj)==i) THEN
2484 ipoly_f(6,jj)=imax
2485 ENDIF
2486 ENDIF
2487 ELSE
2488 nphmax=
max(nphmax,np)
2489 ENDIF
2490 ENDIF
2491 ENDDO
2492 polh_new(2,i)=imax
2493 IF (info==0) polh_new(1,imax)=np
2494 ENDIF
2495 ENDDO
2496 IF (info==1) GOTO 400
2497
2498 vmin=ep30
2499 DO i=1,npolh
2500 IF (volu(i)<=zero) cycle
2501 IF (volu(i)<vmin) THEN
2502 vmin=volu(i)
2503 imin=i
2504 ENDIF
2505 DO j=1,polh_new(1,i)
2506 jj=polh_new(2+j,i)
2507 IF (ipoly_f(1,jj)==1.OR.rpoly_f(1,jj)<zero) cycle
2508 IF (ipoly_f(5,jj)==ipoly_f(6,jj)) rpoly_f(1,jj)=-one
2509 ENDDO
2510 ENDDO
2511 DEALLOCATE(volu_old, rpoly_f_old, ipoly_f_old, imerged)
2512
2513
2514
2515 volph=zero
2516 areap=zero
2517 areael=zero
2518 npolhf=0
2519 DO i=1,npolh
2520 IF (volu(i)>zero) THEN
2521 npolhf=npolhf+1
2522 volph=volph+volu(i)
2523 ENDIF
2524 ENDDO
2525 nspoly=0
2526 ncpoly=0
2527 DO i=1,npoly
2528 ity=ipoly_f(1,i)
2529 IF (ity==1.AND.rpoly_f(1,i)>zero) THEN
2530 nspoly=nspoly+1
2531 areap=areap+rpoly_f(1,i)
2532 ELSEIF (ity==2.AND.rpoly_f(1,i)>zero) THEN
2533 ncpoly=ncpoly+1
2534 ENDIF
2535 ENDDO
2536 DO iel=1,nel
2537 areael=areael+elarea(iel)
2538 ENDDO
2539
2540
2541
2542 ALLOCATE(
fvdata(ifv)%IFVNOD(3,nns+nns2),
2543 .
fvdata(ifv)%RFVNOD(2,nns+nns2))
2544 DO i=1,nns+nns2
2545 fvdata(ifv)%IFVNOD(1,i)=0
2546 ENDDO
2547
2548 nns_old=nns
2549 nns=0
2550 DO i=1,npoly
2551 nnp=ipoly_f(2,i)
2552 DO j=1,nnp
2553 IF (ipoly_f(6+j,i)>0) THEN
2554 nns=nns+1
2555 IF (ifvnod(nns)<0) THEN
2556 fvdata(ifv)%IFVNOD(1,nns)=2
2557 fvdata(ifv)%IFVNOD(2,nns)=-ifvnod(nns)
2558 cycle
2559 ENDIF
2560 fvdata(ifv)%IFVNOD(1,nns)=1
2561 iel=ifvnod(nns)
2562 fvdata(ifv)%IFVNOD(2,nns)=iel
2563 xx=rpoly_f(4+3*(j-1)+1,i)
2564 yy=rpoly_f(4+3*(j-1)+2,i)
2565 zz=rpoly_f(4+3*(j-1)+3,i)
2566
2567 n1=elema(1,iel)
2568 n2=elema(2,iel)
2569 n3=elema(3,iel)
2570 IF (tagela(iel)>0) THEN
2571 x1=xxx(1,n1)
2572 y1=xxx(2,n1)
2573 z1=xxx(3,n1)
2574 x2=xxx(1,n2)
2575 y2=xxx(2,n2)
2576 z2=xxx(3,n2)
2577 x3=xxx(1,n3)
2578 y3=xxx(2,n3)
2579 z3=xxx(3,n3)
2580 ELSEIF (tagela(iel)<0) THEN
2581 x1=xxxa(1,n1)
2582 y1=xxxa(2,n1)
2583 z1=xxxa(3,n1)
2584 x2=xxxa(1,n2)
2585 y2=xxxa(2,n2)
2586 z2=xxxa(3,n2)
2587 x3=xxxa(1,n3)
2588 y3=xxxa(2,n3)
2589 z3=xxxa(3,n3)
2590 ENDIF
2591
2592 vpx=xx-x1
2593 vpy=yy-y1
2594 vpz=zz-z1
2595 v1x=x2-x1
2596 v1y=y2-y1
2597 v1z=z2-z1
2598 v2x=x3-x1
2599 v2y=y3-y1
2600 v2z=z3-z1
2601 CALL coorloc(vpx, vpy, vpz, v1x, v1y,
2602 . v1z, v2x, v2y, v2z, ksi,
2603 . eta)
2604
2605 fvdata(ifv)%RFVNOD(1,nns)=ksi
2606 fvdata(ifv)%RFVNOD(2,nns)=eta
2607 ELSE
2608 jj=-ipoly_f(6+j,i)
2609 fvdata(ifv)%IFVNOD(1,nns_old+jj)=3
2610 fvdata(ifv)%IFVNOD(2,nns_old+jj)=ifvnod2(1,jj)
2611 fvdata(ifv)%IFVNOD(3,nns_old+jj)=ifvnod2(2,jj)
2612 fvdata(ifv)%RFVNOD(1,nns_old+jj)=rfvnod2(1,jj)
2613 ENDIF
2614 ENDDO
2615 ENDDO
2616 DO i=1,nns2
2617 IF (
fvdata(ifv)%IFVNOD(1,nns+i)==0)
THEN
2618 fvdata(ifv)%IFVNOD(1,nns+i)=3
2619 fvdata(ifv)%IFVNOD(2,nns+i)=1
2620 fvdata(ifv)%IFVNOD(3,nns+i)=2
2621 fvdata(ifv)%RFVNOD(1,nns+i)=one
2622 ENDIF
2623 ENDDO
2624
2625
2626
2627 nntr=0
2628 DO i=1,npoly
2629 nn=ipoly_f(2,i)
2630 nntr=nntr+nn
2631 ENDDO
2632 ALLOCATE(
fvdata(ifv)%IFVTRI(6,nntr),
2633 .
fvdata(ifv)%IFVPOLY(nntr),
2634 .
fvdata(ifv)%IFVTADR(npoly+1))
2635
2636 nntr=0
2637 npoly_old=npoly
2638 npoly=0
2639 ALLOCATE(redir_poly(npoly_old))
2640 DO i=1,npoly_old
2641 redir_poly(i)=0
2642 ENDDO
2643
2644 nns=0
2645 DO i=1,npoly_old
2646 IF (rpoly_f(1,i)<=zero) THEN
2647 DO j=1,ipoly_f(2,i)
2648 IF (ipoly_f(6+j,i)>0) nns=nns+1
2649 ENDDO
2650 cycle
2651 ENDIF
2652 npoly=npoly+1
2653 redir_poly(i)=npoly
2654 nnp=ipoly_f(2,i)
2655 nhol=0
2656 IF (ipoly_f(1,i)==2) nhol=ipoly_f(6+nnp+1,i)
2657 ALLOCATE(pnodes(2,nnp), pseg(2,nnp), pholes(2,nhol),
2658 . ptri(3,nnp), redir(nnp))
2659 ptri(1:3,1:nnp)=0
2660
2661 DO j=1,nnp
2662 IF (ipoly_f(6+j,i)>0) THEN
2663 nns=nns+1
2664 redir(j)=nns
2665 ELSE
2666 jj=-ipoly_f(6+j,i)
2667 redir(j)=nns_old+jj
2668 ENDIF
2669 ENDDO
2670 IF (ipoly_f(1,i)==1) THEN
2671 ipsurf=ipoly_f(3,i)
2672 ic1=0
2673 ic2=0
2674 ELSEIF (ipoly_f(1,i)==2) THEN
2675 ipsurf=0
2676 ic1=ipoly_f(5,i)
2677 ic2=ipoly_f(6,i)
2678 ENDIF
2679
2680
2681 nx=rpoly_f(2,i)
2682 ny=rpoly_f(3,i)
2683 nz=rpoly_f(4,i)
2684
2685 x0=rpoly_f(5,i)
2686 y0=rpoly_f(6,i)
2687 z0=rpoly_f(7,i)
2688 x1=rpoly_f(8,i)
2689 y1=rpoly_f(9,i)
2690 z1=rpoly_f(10,i)
2691 nrm1=sqrt((x1-x0)**2+(y1-y0)**2+(z1-z0)**2)
2692 vx1=(x1-x0)/nrm1
2693 vy1=(y1-y0)/nrm1
2694 vz1=(z1-z0)/nrm1
2695 vx2=ny*vz1-nz*vy1
2696 vy2=nz*vx1-nx*vz1
2697 vz2=nx*vy1-ny*vx1
2698
2699 pnodes(1,1)=zero
2700 pnodes(2,1)=zero
2701 IF (nhol==0) THEN
2702 DO j=2,nnp
2703 xx=rpoly_f(4+3*(j-1)+1,i)
2704 yy=rpoly_f(4+3*(j-1)+2,i)
2705 zz=rpoly_f(4+3*(j-1)+3,i)
2706 vx=xx-x0
2707 vy=yy-y0
2708 vz=zz-z0
2709 pnodes(1,j)=vx*vx1+vy*vy1+vz*vz1
2710 pnodes(2,j)=vx*vx2+vy*vy2+vz*vz2
2711 pseg(1,j-1)=j-1
2712 pseg(2,j-1)=j
2713 ENDDO
2714 pseg(1,nnp)=nnp
2715 pseg(2,nnp)=1
2716 nseg=nnp
2717 ELSE
2718 ALLOCATE(adr(nhol+1))
2719 DO j=1,nhol
2720 adr(j)=ipoly_f(6+nnp+1+j,i)
2721 ENDDO
2722 adr(nhol+1)=nnp
2723 nseg=0
2724 DO j=2,adr(1)
2725 xx=rpoly_f(4+3*(j-1)+1,i)
2726 yy=rpoly_f(4+3*(j-1)+2,i)
2727 zz=rpoly_f(4+3*(j-1)+3,i)
2728 vx=xx-x0
2729 vy=yy-y0
2730 vz=zz-z0
2731 pnodes(1,j)=vx*vx1+vy*vy1+vz*vz1
2732 pnodes(2,j)=vx*vx2+vy*vy2+vz*vz2
2733 nseg=nseg+1
2734 pseg(1,nseg)=j-1
2735 pseg(2,nseg)=j
2736 ENDDO
2737 nseg=nseg+1
2738 pseg(1,nseg)=adr(1)
2739 pseg(2,nseg)=1
2740 DO j=1,nhol
2741 xx=rpoly_f(4+3*adr(j)+1,i)
2742 yy=rpoly_f(4+3*adr(j)+2,i)
2743 zz=rpoly_f(4+3*adr(j)+3,i)
2744 vx=xx-x0
2745 vy=yy-y0
2746 vz=zz-z0
2747 pnodes(1,adr(j)+1)=vx*vx1+vy*vy1+vz*vz1
2748 pnodes(2,adr(j)+1)=vx*vx2+vy*vy2+vz*vz2
2749 DO k=adr(j)+2,adr(j+1)
2750 xx=rpoly_f(4+3*(k-1)+1,i)
2751 yy=rpoly_f(4+3*(k-1)+2,i)
2752 zz=rpoly_f(4+3*(k-1)+3,i)
2753 vx=xx-x0
2754 vy=yy-y0
2755 vz=zz-z0
2756 pnodes(1,k)=vx*vx1+vy*vy1+vz*vz1
2757 pnodes(2,k)=vx*vx2+vy*vy2+vz*vz2
2758 nseg=nseg+1
2759 pseg(1,nseg)=k-1
2760 pseg(2,nseg)=k
2761 ENDDO
2762 nseg=nseg+1
2763 pseg(1,nseg)=adr(j+1)
2764 pseg(2,nseg)=adr(j)+1
2765
2766 xx=rpoly_f(4+3*nnp+3*(j-1)+1,i)
2767 yy=rpoly_f(4+3*nnp+3*(j-1)+2,i)
2768 zz=rpoly_f(4+3*nnp+3*(j-1)+3,i)
2769 vx=xx-x0
2770 vy=yy-y0
2771 vz=zz-z0
2772 pholes(1,j)=vx*vx1+vy*vy1+vz*vz1
2773 pholes(2,j)=vx*vx2+vy*vy2+vz*vz2
2774 ENDDO
2775 ENDIF
2776
2777 nelp = 0
2778 CALL c_tricall(pnodes, pseg, pholes, ptri, nnp,
2779 . nseg, nhol, nelp )
2780
2781 fvdata(ifv)%IFVTADR(npoly)=nntr+1
2782 DO j=1,nelp
2783 nntr=nntr+1
2784 n1=ptri(1,j)
2785 n2=ptri(2,j)
2786 n3=ptri(3,j)
2787
2788 x1=rpoly_f(4+3*(n1-1)+1,i)
2789 y1=rpoly_f(4+3*(n1-1)+2,i)
2790 z1=rpoly_f(4+3*(n1-1)+3,i)
2791 x2=rpoly_f(4+3*(n2-1)+1,i)
2792 y2=rpoly_f(4+3*(n2-1)+2,i)
2793 z2=rpoly_f(4+3*(n2-1)+3,i)
2794 x3=rpoly_f(4+3*(n3-1)+1,i)
2795 y3=rpoly_f(4+3*(n3-1)+2,i)
2796 z3=rpoly_f(4+3*(n3-1)+3,i)
2797 x12=x2-x1
2798 y12=y2-y1
2799 z12=z2-z1
2800 x13=x3-x1
2801 y13=y3-y1
2802 z13=z3-z1
2803 nrx=y12*z13-z12*y13
2804 nry=z12*x13-x12*z13
2805 nrz=x12*y13-y12*x13
2806 ss=nrx*nx+nry*ny+nrz*nz
2807
2808 IF (ss>zero) THEN
2809 fvdata(ifv)%IFVTRI(1,nntr)=redir(n1)
2810 fvdata(ifv)%IFVTRI(2,nntr)=redir(n2)
2811 fvdata(ifv)%IFVTRI(3,nntr)=redir(n3)
2812 ELSE
2813 fvdata(ifv)%IFVTRI(1,nntr)=redir(n1)
2814 fvdata(ifv)%IFVTRI(2,nntr)=redir(n3)
2815 fvdata(ifv)%IFVTRI(3,nntr)=redir(n2)
2816 ENDIF
2817 fvdata(ifv)%IFVTRI(4,nntr)=ipsurf
2818 fvdata(ifv)%IFVTRI(5,nntr)=ic1
2819 fvdata(ifv)%IFVTRI(6,nntr)=ic2
2820 fvdata(ifv)%IFVPOLY(nntr)=nntr
2821 ENDDO
2822
2823 DEALLOCATE(pnodes, pseg, pholes, ptri, redir)
2824 ENDDO
2825 fvdata(ifv)%IFVTADR(npoly+1)=nntr+1
2826
2827
2828
2829 ALLOCATE(
fvdata(ifv)%IFVPOLH(2*npoly),
2830 .
fvdata(ifv)%IFVPADR(npolh+1),
2831 .
fvdata(ifv)%IDPOLH(npolh),
2832 .
fvdata(ifv)%IBPOLH(npolh))
2833 nnp=0
2834 npolh_old=npolh
2835 npolh=0
2836 ALLOCATE(redir_polh(npolh_old))
2837 DO i=1,npolh_old
2838 redir_polh(i)=0
2839 ENDDO
2840
2841 DO i=1,npolh_old
2842 IF (volu(i)<=zero) cycle
2843 npolh=npolh+1
2844 redir_polh(i)=npolh
2845 fvdata(ifv)%IFVPADR(npolh)=nnp+1
2846 DO j=1,polh_new(1,i)
2847 jj=redir_poly(polh_new(2+j,i))
2848 IF (jj==0) cycle
2849 nnp=nnp+1
2850 fvdata(ifv)%IFVPOLH(nnp)=redir_poly(polh_new(2+j,i))
2851 ENDDO
2852
2853 fvdata(ifv)%IDPOLH(npolh)=npolh
2854
2855 ii=polh_new(2,i)
2856 IF (ii>=0) ii=0
2857 IF (ii<0.AND.ibsa(-ii)==1) ii=-ii
2858 fvdata(ifv)%IBPOLH(npolh)=ii
2859 ENDDO
2860 fvdata(ifv)%IFVPADR(npolh+1)=nnp+1
2861
2862 DO i=1,nntr
2863 IF (
fvdata(ifv)%IFVTRI(4,i)==0)
THEN
2864 ic1=
fvdata(ifv)%IFVTRI(5,i)
2865 ic2=
fvdata(ifv)%IFVTRI(6,i)
2866 fvdata(ifv)%IFVTRI(5,i)=redir_polh(ic1)
2867 fvdata(ifv)%IFVTRI(6,i)=redir_polh(ic2)
2868 ENDIF
2869 ENDDO
2870
2871 ivolu(46)=nns+nns2
2872 ivolu(47)=nntr
2873 ivolu(48)=npoly
2874 ivolu(49)=npolh
2875
2882
2883 ALLOCATE(
fvdata(ifv)%MPOLH(npolh),
fvdata(ifv)%QPOLH(3,npolh),
2886 .
fvdata(ifv)%CPAPOLH(npolh),
fvdata(ifv)%CPBPOLH(npolh),
2887 .
fvdata(ifv)%CPCPOLH(npolh),
fvdata(ifv)%RMWPOLH(npolh),
2888 .
fvdata(ifv)%VPOLH_INI(npolh),
fvdata(ifv)%DTPOLH(npolh),
2889 .
fvdata(ifv)%TPOLH(npolh),
fvdata(ifv)%CPDPOLH(npolh),
2890 .
fvdata(ifv)%CPEPOLH(npolh),
fvdata(ifv)%CPFPOLH(npolh))
2891
2892 DO i=1,npolh_old
2893 ii=redir_polh(i)
2894 IF (ii==0) cycle
2895 fvdata(ifv)%VPOLH_INI(ii)=volu(i)
2896 ENDDO
2897
2898 DEALLOCATE(ipoly_f, rpoly_f, polh_f, volu, redir_poly, redir_polh,
2899 . polh_new, ifvnod, ifvnod2, rfvnod2, xns, xns2)
2900
2901
2902
2903 nstr=0
2904 nctr=0
2905 DO i=1,nntr
2906 IF (
fvdata(ifv)%IFVTRI(4,i)>0)
THEN
2907 nstr=nstr+1
2908 ELSE
2909 nctr=nctr+1
2910 ENDIF
2911 ENDDO
2912
2913 WRITE(istdo,*)
2914 WRITE(istdo,'(A25,I10,A24)')
2915 .' ** MONITORED VOLUME ID: ',ivolu(1),' - FINITE VOLUME MESH **'
2916 WRITE(istdo,'(A42,I8)')
2917 . ' NUMBER OF SURFACE POLYGONS : ',nspoly
2918 WRITE(istdo,'(A42,I8)')
2919 . ' NUMBER OF SURFACE TRIANGLES : ',nstr
2920 WRITE(istdo,'(A42,I8)')
2921 . ' NUMBER OF COMMUNICATION POLYGONS : ',ncpoly
2922 WRITE(istdo,'(A42,I8)')
2923 . ' NUMBER OF COMMUNICATION TRIANGLES : ',nctr
2924 WRITE(istdo,'(A42,I8)')
2925 . ' NUMBER OF POLYHEDRA (FINITE VOLUMES): ',npolhf
2926 IF (ilvout>=1) WRITE(istdo,'(A29,G16.9,A8,I8,A1)')
2927 . ' MIN. POLYHEDRON VOLUME : ',vmin,' (POLY. ',imin,')'
2928 IF (ilvout>=1) WRITE(istdo,'(A29,G16.9)')
2929 . ' INITIAL MERGING VOLUME : ',volumin
2930 WRITE(istdo,'(A29,G16.9,A17,G16.9,A1)')
2931 .' SUM VOLUME POLYHEDRA : ',volph,' (VOLUME AIRBAG: ',volg,')'
2932 WRITE(istdo,'(A29,G16.9,A17,G16.9,A1)')
2933 .' SUM AREA SURF. POLYGONS: ',areap,
2934 . ' (AREA AIRBAG : ',areael,')'
2935 WRITE(istdo,*)
2936 WRITE(iout,*)
2937 WRITE(iout,'(A25,I10,A24)')
2938 .' ** MONITORED VOLUME ID: ',ivolu(1),' - FINITE VOLUME MESH **'
2939 WRITE(iout,'(A42,I8)')
2940 . ' NUMBER OF SURFACE POLYGONS : ',nspoly
2941 WRITE(iout,'(A42,I8)')
2942 . ' NUMBER OF COMMUNICATION POLYGONS : ',ncpoly
2943 WRITE(iout,'(A42,I8)')
2944 . ' NUMBER OF POLYHEDRA (FINITE VOLUMES): ',npolhf
2945 IF (ilvout>=1) WRITE(iout,'(A29,G16.9,A8,I8,A1)')
2946 . ' MIN. POLYHEDRON VOLUME : ',vmin,' (POLY. ',imin,')'
2947 IF (ilvout>=1) WRITE(iout,'(A29,G16.9)')
2948 . ' INITIAL MERGING VOLUME : ',volumin
2949 WRITE(iout,'(A29,G16.9,A17,G16.9,A1)')
2950 .' SUM VOLUME POLYHEDRA : ',volph,' (VOLUME AIRBAG: ',volg,')'
2951 WRITE(iout,'(A29,G16.9,A17,G16.9,A1)')
2952 .' SUM AREA SURF. POLYGONS: ',areap,
2953 . ' (AREA AIRBAG : ',areael,')'
2954 WRITE(iout,*)
2955
2956
2957
2958 fvdata(ifv)%NPOLH_ANIM=npolh
2959 lenp=
fvdata(ifv)%IFVTADR(npoly+1)
2960 lenh=
fvdata(ifv)%IFVPADR(npolh+1)
2961 ALLOCATE(
fvdata(ifv)%IFVPOLY_ANIM(lenp),
2962 .
fvdata(ifv)%IFVTADR_ANIM(npoly+1),
2963 .
fvdata(ifv)%IFVPOLH_ANIM(lenh),
2964 .
fvdata(ifv)%IFVPADR_ANIM(npolh+1),
2965 .
fvdata(ifv)%IFVTRI_ANIM(6,nntr),
2966 .
fvdata(ifv)%REDIR_ANIM(nns+nns2),
2967 .
fvdata(ifv)%NOD_ANIM(3,nns+nns2),
2968 . redir(nns+nns2), itagt(nntr))
2969 DO i=1,lenp
2971 ENDDO
2972 DO i=1,npoly+1
2974 ENDDO
2975 DO i=1,lenh
2977 ENDDO
2978 DO i=1,npolh+1
2980 ENDDO
2981
2982 tole=em05*fac_length
2983 tole2=tole**2
2984 nns_anim=0
2985 IF (ilvout/=0) WRITE(istdo,'(A25,I10,A39)')
2986 . ' ** MONITORED VOLUME ID: ',ivolu(1),
2987 . ' - MERGING COINCIDENT NODES FOR ANIM **'
2988 ALLOCATE(pnodes(3,nns+nns2))
2989 DO i=1,nns
2990 IF (
fvdata(ifv)%IFVNOD(1,i)==1)
THEN
2991 iel=
fvdata(ifv)%IFVNOD(2,i)
2992 ksi=
fvdata(ifv)%RFVNOD(1,i)
2993 eta=
fvdata(ifv)%RFVNOD(2,i)
2994 n1=elema(1,iel)
2995 n2=elema(2,iel)
2996 n3=elema(3,iel)
2997 IF (tagela(iel)>0) THEN
2998 x1=xxx(1,n1)
2999 y1=xxx(2,n1)
3000 z1=xxx(3,n1)
3001 x2=xxx(1,n2)
3002 y2=xxx(2,n2)
3003 z2=xxx(3,n2)
3004 x3=xxx(1,n3)
3005 y3=xxx(2,n3)
3006 z3=xxx(3,n3)
3007 ELSEIF (tagela(iel)<0) THEN
3008 x1=xxxa(1,n1)
3009 y1=xxxa(2,n1)
3010 z1=xxxa(3,n1)
3011 x2=xxxa(1,n2)
3012 y2=xxxa(2,n2)
3013 z2=xxxa(3,n2)
3014 x3=xxxa(1,n3)
3015 y3=xxxa(2,n3)
3016 z3=xxxa(3,n3)
3017 ENDIF
3018 pnodes(1,i)=(one-ksi-eta)*x1+ksi*x2+eta*x3
3019 pnodes(2,i)=(one-ksi-eta)*y1+ksi*y2+eta*y3
3020 pnodes(3,i)=(one-ksi-eta)*z1+ksi*z2+eta*z3
3021 ELSEIF (
fvdata(ifv)%IFVNOD(1,i)==2)
THEN
3022
3023
3024
3025
3026
3027
3028 ii=
fvdata(ifv)%IFVNOD(2,i)
3029 pnodes(1,i)=xxxsa(1,ii)
3030 pnodes(2,i)=xxxsa(2,ii)
3031 pnodes(3,i)=xxxsa(3,ii)
3032
3033 ENDIF
3034 ENDDO
3035 DO i=1,nns2
3036 ii=nns+i
3037 i1=
fvdata(ifv)%IFVNOD(2,ii)
3038 i2=
fvdata(ifv)%IFVNOD(3,ii)
3040 pnodes(1,ii)=
alpha*pnodes(1,i1)+(one-
alpha)*pnodes(1,i2)
3041 pnodes(2,ii)=
alpha*pnodes(2,i1)+(one-
alpha)*pnodes(2,i2)
3042 pnodes(3,ii)=
alpha*pnodes(3,i1)+(one-
alpha)*pnodes(3,i2)
3043 ENDDO
3044 DO i=1,nns+nns2
3045 IF (ilvout<0)
CALL progbar_c(i,nns+nns2)
3046
3047 xx=pnodes(1,i)
3048 yy=pnodes(2,i)
3049 zz=pnodes(3,i)
3050 ifound=0
3051 DO j=1,nns_anim
3052 xn(1)=
fvdata(ifv)%NOD_ANIM(1,j)
3053 xn(2)=
fvdata(ifv)%NOD_ANIM(2,j)
3054 xn(3)=
fvdata(ifv)%NOD_ANIM(3,j)
3055 dd2=(xx-xn(1))**2+(yy-xn(2))**2+(zz-xn(3))**2
3056 IF (dd2<=tole2) THEN
3057 ifound=j
3058 EXIT
3059 ENDIF
3060 ENDDO
3061 IF (ifound==0) THEN
3062 nns_anim=nns_anim+1
3063 redir(i)=nns_anim
3064 fvdata(ifv)%REDIR_ANIM(nns_anim)=i
3065 fvdata(ifv)%NOD_ANIM(1,nns_anim)=xx
3066 fvdata(ifv)%NOD_ANIM(2,nns_anim)=yy
3067 fvdata(ifv)%NOD_ANIM(3,nns_anim)=zz
3068 ELSE
3069 redir(i)=ifound
3070 ENDIF
3071 ENDDO
3072 fvdata(ifv)%NNS_ANIM=nns_anim
3074
3075 DO i=1,nntr
3076 n1=
fvdata(ifv)%IFVTRI(1,i)
3077 n2=
fvdata(ifv)%IFVTRI(2,i)
3078 n3=
fvdata(ifv)%IFVTRI(3,i)
3079 fvdata(ifv)%IFVTRI_ANIM(1,i)=redir(n1)
3080 fvdata(ifv)%IFVTRI_ANIM(2,i)=redir(n2)
3081 fvdata(ifv)%IFVTRI_ANIM(3,i)=redir(n3)
3082 fvdata(ifv)%IFVTRI_ANIM(4,i)=
3083 .
fvdata(ifv)%IFVTRI(4,i)
3084 fvdata(ifv)%IFVTRI_ANIM(5,i)=
3085 .
fvdata(ifv)%IFVTRI(5,i)
3086 fvdata(ifv)%IFVTRI_ANIM(6,i)=
3087 .
fvdata(ifv)%IFVTRI(6,i)
3088 ENDDO
3089 DEALLOCATE(pnodes)
3090
3091 DEALLOCATE(redir, itagt)
3092 DEALLOCATE(xxxsa)
3093
3094 RETURN
3095
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
subroutine horipoly(inedge, rnedge, ledge, nedge, ipoly, rpoly, iz, ielnod, npoly, nx, ny, nz, inz, ibric)
subroutine polyhedr(ipoly, rpoly, polb, npolb, polh, npolh, nrpmax, nphmax, ibric, lmin, info, npolhmax, nppmax, tole2)
subroutine horiedge(ipoly, rpoly, nx, ny, nz, nbnedge, inedge, rnedge, x0, y0, z0, inz, nns3, nref, aref, nnsp)
subroutine facepoly(quad, tri, ntri, ipoly, rpoly, n, normf, normt, nsmax, nnp, nrpmax, nb, nv, lmin, npolmax, nppmax, info, ielnod, xxx, elema, ibuf, nela, ibric, ifac, mvid, ilvout, ibufa, tagela, xxxa)
subroutine coorloc(vpx, vpy, vpz, v1x, v1y, v1z, v2x, v2y, v2z, ksi, eta)
subroutine gpolcut(ipoly, rpoly, ipoly_old, rpoly_old, inedge, rnedge, nbnedge, nx, ny, nz, x0, y0, z0, ins, rns, nn, nhol, inz, iz, nns3, npoly, ns, ielnod, ielnod_old)
subroutine itribox(tri, box, norm, nverts, poly, nvmax)
subroutine area(d1, x, x2, y, y2, eint, stif0)
type(fvbag_spmd), dimension(:), allocatable fvspmd
type(fvbag_data), dimension(:), allocatable fvdata
void progbar_c(int *icur, int *imax)
subroutine spmd_fvb_gath(ifv, x, xxx, xxxa, xxxsa, ido)
subroutine facnor(x, d, ii, xnorm, cdg, invert)
subroutine c_tricall(pnodes, pseg, pholes, ptri, nnp, nseg, nhol, nelp)
subroutine tritri3(icut, fv0, fv1, fv2, fu0, fu1, fu2)
subroutine tribox3(icut, bcenter, bhalfsize, tverts)