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