37 1 JLT ,CAND_B ,CAND_E ,CB_LOC ,CE_LOC ,
38 2 X1 ,X2 ,X3 ,X4 ,Y1 ,
39 3 Y2 ,Y3 ,Y4 ,Z1 ,Z2 ,
40 4 Z3 ,Z4 ,XI ,YI ,ZI ,
41 5 NX1 ,NX2 ,NX3 ,NX4 ,NY1 ,
42 6 NY2 ,NY3 ,NY4 ,NZ1 ,NZ2 ,
43 7 NZ3 ,NZ4 ,LB1 ,LB2 ,LB3 ,
44 8 LB4 ,LC1 ,LC2 ,LC3 ,LC4 ,
45 9 P1 ,P2 ,P3 ,P4 ,IX1 ,
46 A IX2 ,IX3 ,IX4 ,NSVG ,STIF ,
47 B JLT_NEW,GAPV ,INACTI ,CAND_P ,N_SCUT ,
49 D VZI ,MSI ,KINI ,SURF ,IBAG ,
50 E ITAB ,IRECT ,I_STOK ,IXS ,NFT ,
51 F CoG ,Seff ,Delta ,X)
63 use element_mod ,
only : nixs
67#include "implicit_f.inc"
78 INTEGER,INACTI, CAND_B(*),CB_LOC(MVSIZ),NFT,
79 . CAND_E(*),CE_LOC(MVSIZ), NSVG(MVSIZ), KINI(*), IXS(NIXS,*)
80 INTEGER IX1(MVSIZ), IX2(MVSIZ), IX3(MVSIZ), IX4(MVSIZ),
81 . INDEX(MVSIZ),IBAG, ITAB(*),IRECT(4,*),I_STOK
83 . NX1(MVSIZ), NX2(MVSIZ), NX3(MVSIZ), NX4(MVSIZ),
84 . NY1(MVSIZ), NY2(MVSIZ), NY3(MVSIZ), NY4(MVSIZ),
85 . NZ1(MVSIZ), NZ2(MVSIZ), NZ3(MVSIZ), NZ4(MVSIZ),
86 . LB1(MVSIZ), LB2(MVSIZ), LB3(MVSIZ), LB4(MVSIZ),
87 . LC1(MVSIZ), LC2(MVSIZ), LC3(MVSIZ), LC4(MVSIZ),
88 . X1(MVSIZ), X2(MVSIZ), X3(MVSIZ), X4(MVSIZ),
89 . Y1(MVSIZ), Y2(MVSIZ), Y3(MVSIZ), Y4(MVSIZ),
90 . Z1(MVSIZ), Z2(MVSIZ), Z3(MVSIZ), Z4(MVSIZ),
91 . XI(MVSIZ), YI(MVSIZ), ZI(MVSIZ), STIF(MVSIZ),
92 . P1(MVSIZ), (MVSIZ), P3(MVSIZ), P4(MVSIZ),
93 . gapv(mvsiz), cand_p(*),
103 my_real :: node(16,2)
107 INTEGER :: I, J, NIN, IB, IFT,ILT, K, Q, L
108 INTEGER :: NBCUT , IE, IEDG_LAG, IEDG_SCUT
109 INTEGER :: ICUT, IDX_LAG(7), IDX_SCUT(7)
110 INTEGER :: TAG_SCUT(4,NBCUT_MAX), TAG_NOD(4,NBCUT_MAX)
111 INTEGER :: IS_ON_SCUT(NBCUT_MAX), NP, Snod_On_Lag(6)
113 INTEGER :: IADD(4,6), NCUT(NBCUT_MAX), NP_RECT(MVSIZ),ITMP, NN
114 INTEGER :: HULL_PT, HULL_IDX(24)
115 INTEGER :: NP_INTER, NP_LAG, NP_SURF, NODE_NUM,brickID, ListP(4), NBCUT_ADD
116 my_real :: NODE_XY(2,24), NODE_XYZ(3,24), PS, MARGE
117 my_real :: dist_pcut(nbcut_max, 4,i_stok)
119 my_real :: normal(3), basis(3), ph(3,nbcut_max,4),p(3,4), a,b,c,d , a2,b2,c2 ,a2b2, l2, dist(4), pph(3,4)
120 my_real :: distance(4), edge(4),
area_tria(4)
121 my_real :: sh(3,nbcut_max,8), s(3,8)
122 my_real :: scut_pts(3,6)
123 my_real :: k1(2),k2(2),k3(2),k4(2)
124 my_real :: point(3),ratio,cog3,p_grav(3,nbcut_max,mvsiz),ss2(4), s2, sel(mvsiz)
126 . x0(mvsiz), y0(mvsiz), z0(mvsiz),
127 . x01(mvsiz), x02(mvsiz), x03(mvsiz), x04(mvsiz),
128 . y01(mvsiz), y02(mvsiz), y03(mvsiz), y04(mvsiz),
129 . z01(mvsiz), z02(mvsiz), z03(mvsiz), z04(mvsiz)
135 . nnx1(mvsiz), nnx2(mvsiz), nnx3(mvsiz), nnx4(mvsiz),
136 . nny1(mvsiz), nny2(mvsiz), nny3(mvsiz), nny4(mvsiz),
137 . nnz1(mvsiz), nnz2(mvsiz), nnz3(mvsiz), nnz4(mvsiz)
139 . val1,val2,val3, v1(3), v2(3), v3(3), m(3,3,nbcut_max),vec(3),
141 .
interp(2), wet_ratio(0:4), z(3), stria(4), dsum, numgrav, pgrav(3),
142 . cumul_val1, cumul_val2
144 my_real,
DIMENSION(3) :: pt1,pt2,pt3,pt4
146 INTEGER :: N_INTP_LAG(1:4,NBCUT_MAX)
150 LOGICAL BOOL, ATYP1, ATYP2, ATYP3
154 my_real :: xp1(3), xp2(3), xp3(3), xp4(3)
158 INTEGER,
EXTERNAL :: ISONPOLYG
161 INTEGER IAD1,ILAG0,ISCUT0,ILAGk,ISCUTk,IIB,NTRIA,
164 TYPE(POLYGON) :: , PolyTria(4), POLYresult
169 my_real :: p(3,npts),
i22aera(3), c(3)
173 integer,
external :: GetProjectedFaceType
263 ce_loc(1:jlt) = cand_e(1:jlt)
264 cb_loc(1:jlt) = cand_b(1:jlt)
271 IF(ix3(i)/=ix4(i))
THEN
273 x0(i) = fourth*(x1(i)+x2(i)+x3(i)+x4(i))
274 y0(i) = fourth*(y1(i)+y2(i)+y3(i)+y4(i))
275 z0(i) = fourth*(z1(i)+z2(i)+z3(i)+z4(i))
289 IF(np_rect(i)==4)
THEN
293 x01(i) = x1(i) - x0(i)
294 y01(i) = y1(i) - y0(i)
295 z01(i) = z1(i) - z0(i)
297 x02(i) = x2(i) - x0(i)
298 y02(i) = y2(i) - y0(i)
299 z02(i) = z2(i) - z0(i)
301 x03(i) = x3(i) - x0(i)
302 y03(i) = y3(i) - y0(i)
303 z03(i) = z3(i) - z0(i)
305 x04(i) = x4(i) - x0(i)
306 y04(i) = y4(i) - y0(i)
307 z04(i) = z4(i) - z0(i)
309 sx0 = y01(i)*z02(i) - z01(i)*y02(i)
310 sy0 = z01(i)*x02(i) - x01(i)*z02(i)
311 sz0 = x01(i)*y02(i) - y01(i)*x02(i)
312 ss2(1) = sqrt(
max(em30,sx0*sx0 + sy0*sy0 + sz0*sz0))
313 sel(i) = sel(i) + ss2(1)
316 nnx1(i) = sx0 * ss2(1)
317 nny1(i) = sy0 * ss2(1)
318 nnz1(i) = sz0 * ss2(1)
320 sx0 = y02(i)*z03(i) - z02(i)*y03(i)
321 sy0 = z02(i)*x03(i) - x02(i)*z03(i)
322 sz0 = x02(i)*y03(i) - y02(i)*x03(i)
323 ss2(2) = sqrt(
max(em30,sx0*sx0 + sy0*sy0 + sz0*sz0))
324 sel(i) = sel(i) + ss2(2)
327 nnx2(i) = sx0 * ss2(2)
328 nny2(i) = sy0 * ss2(2)
329 nnz2(i) = sz0 * ss2(2)
331 sx0 = y03(i)*z04(i) - z03(i)*y04(i)
332 sy0 = z03(i)*x04(i) - x03(i)*z04(i)
333 sz0 = x03(i)*y04(i) - y03(i)*x04(i)
334 ss2(3) = sqrt(
max(em30,sx0*sx0 + sy0*sy0 + sz0*sz0))
335 sel(i) = sel(i) + ss2(3)
338 nnx3(i) = sx0 * ss2(3)
339 nny3(i) = sy0 * ss2(3)
340 nnz3(i) = sz0 * ss2(3)
342 sx0 = y04(i)*z01(i) - z04(i)*y01(i)
343 sy0 = z04(i)*x01(i) - x04(i)*z01(i)
344 sz0 = x04(i)*y01(i) - y04(i)*x01(i)
345 ss2(4) = sqrt(
max(em30,sx0*sx0 + sy0*sy0 + sz0*sz0))
346 sel(i) = sel(i) + ss2(4)
349 nnx4(i) = sx0 * ss2(4)
350 nny4(i) = sy0 * ss2(4)
351 nnz4(i) = sz0 * ss2(4)
353 sel(i) = half * sel(i)
357 x01(i) = x1(i) - x0(i)
358 y01(i) = y1(i) - y0(i)
359 z01(i) = z1(i) - z0(i)
361 x02(i) = x2(i) - x0(i)
362 y02(i) = y2(i) - y0(i)
363 z02(i) = z2(i) - z0(i)
365 sx0 = y01(i)*z02(i) - z01(i)*y02(i)
366 sy0 = z01(i)*x02(i) - x01(i)*z02(i)
367 sz0 = x01(i)*y02(i) - y01(i)*x02(i)
368 ss2(1) = sqrt(
max(em30,sx0*sx0 + sy0*sy0 + sz0*sz0))
372 nnx1(i) = sx0 * ss2(1)
373 nny1(i) = sy0 * ss2(1)
374 nnz1(i) = sz0 * ss2(1)
391 IF(np_rect(i)==4)
THEN
392 surf(1,iabs(cand_e(i))) = fourth*(nnx1(i) + nnx2(i) + nnx3(i) + nnx4(i))
393 surf(2,iabs(cand_e(i))) = fourth*(nny1(i) + nny2(i) + nny3(i) + nny4(i))
394 surf(3,iabs(cand_e(i))) = fourth*(nnz1(i) + nnz2(i) + nnz3(i) + nnz4(i))
396 surf(1,iabs(cand_e(i))) = nnx1(i)
397 surf(2,iabs(cand_e(i))) = nny1(i)
398 surf(3,iabs(cand_e(i))) = nnz1(i)
401#include "lockoff.inc"
421! print *,
" | LAGRANGIAN PROJECTIONS |"
448 dist_pcut(1:nbcut_max , 1:4 , 1:
ncande) = ep30
471!
brick_list()%Pol9woNodes(j) = 1 (cell 9 does not have nodes on this face = closed surface hypothesis)
486 p(1:3,1) = (/ x1(ie), y1(ie), z1(ie) /)
487 p(1:3,2) = (/ x2(ie), y2(ie), z2(ie) /)
488 p(1:3,3) = (/ x3(ie), y3(ie), z3(ie) /)
489 p(1:3,4) = (/ x4(ie), y4(ie), z4(ie) /)
492 delta(1:4,icut,i) = zero
493 normal(1:3) =
brick_list(nin,ib)%PCUT(icut)%N(1:3)
494 basis(1:3) =
brick_list(nin,ib)%PCUT(icut)%B(1:3)
495 n_scut(1:3,icut,i) = normal(1:3)
500 d = -a*basis(1) -b*basis(2) -c*basis(3)
504 l2 = one /
max(em30,a2+b2+c2)
507 ph( 1,icut,j) = (b2+c2)*p(1,j) - a*b*p(2,j) - a*c*p(3,j) - d*a
508 ph( 2,icut,j) = -a*b*p(1,j) + (a2+c2)*p(2,j) - b*c*p(3,j) - d*b
509 ph( 3,icut,j) = -a*c*p(1,j) - b*c*p(2,j) + (a2+b2)*p(3,j) - d*c
510 ph(1:3,icut,j) = l2 * ph(1:3,icut,j)
511 pph(1:3,j) = p(1:3,j) - ph(1:3,icut,j)
512 dist(j) = sum( pph(1:3,j) * pph(1:3,j) )
513 dist_pcut(icut,j,i) = dist(j)
518 s(1:3,j) =
brick_list(nin,ib)%PCUT(icut)%P(1:3,j)
521 sh( 1,icut,j) = (b2+c2)*s(1,j) - a*b*s(2,j) - a*c*s(3,j) - d*a
522 sh( 2,icut,j) = -a*b*s(1,j) + (a2+c2)*s(2,j) - b*c*s(3,j) - d*b
523 sh( 3,icut,j) = -a*c*s(1,j) - b*c*s(2,j) + (a2+b2)*s(3,j) - d*c
524 sh(1:3,icut,j) = l2 * sh(1:3,icut,j)
534 nbcut_add = nbcut_add + 1
535 delta(1:4,icut,i) = zero
536 normal(1:3) =
brick_list(nin,ib)%PCUT(icut)%N(1:3)
537 basis(1:3) =
brick_list(nin,ib)%PCUT(icut)%B(1:3)
538 n_scut(1:3,icut,i) = normal(1:3)
543 d = -a*basis(1) -b*basis(2)
547 l2 = one /
max(em30,a2+b2+c2)
550 ph( 1,icut,j) = (b2+c2)*p(1,j) - a*b*p(2,j) - a*c*p(
551 ph( 2,icut,j) = -a*b*p
552 ph( 3,icut,j) = -a*c*p(1,j) -
553 ph(1:3,icut,j) = l2 * ph(1:3,icut,j)
554 pph(1:3,j) = p(1:3,j) - ph(1:3,icut,j)
555 dist(j) = sum( pph(1:3,j) * pph(1:3,j) )
556 dist_pcut(icut,j,i) = dist
561 s(1:3,j) =
brick_list(nin,ib)%PCUT(icut)%P(1:3,j)
564 sh( 1,icut,j) = (b2+c2)*s(1,j) - a*b*s(2,j) - a*c*s(3,j) - d*a
565 sh( 2,icut,j) = -a*b*s(1,j) + (a2+c2)*s(2,j) - b*c*s(3,j) - d*b
566 sh( 3,icut,j) = -a*c*s(1,j) - b*c*s(2,j) + (a2+b2)*s(3,j) - d*c
567 sh(1:3,icut,j) = l2 * sh(1:3,icut,j)
631 normal(1:3) =
brick_list(nin,ib)%PCUT(icut)%N(1:3)
635 IF (a==zero . and. b==zero)
THEN
636 v1 = (/ one,zero,zero /)
637 v2 = (/ zero,one,zero /)
638 ELSEIF(a==zero . and. c==zero)
THEN
639 v1 = (/ one,zero,zero /)
640 v2 = (/ zero,zero,one /)
641 ELSEIF(b==zero . and. c==zero)
THEN
642 v1 = (/ zero,one,zero /)
643 v2 = (/ zero,zero,one /)
646 v1 = (/ -b, a , zero /)
647 v2 = (/ -c, zero, a /)
649 v1 = (/ one, zero, zero /)
650 v2 = (/ zero, -c, b /)
656 v1 = v1 / sqrt(sum(v1*v1))
657 ps = v1(1)*v2(1) + v1(2)*v2(2) +v1(3)*v2
659 v2 = v2 / sqrt(sum(v2*v2))
661 v3 = normal / sqrt(sum(normal*normal))
669 print *,
" ORTHONORMAL BASIS :"
670 write (*,fmt='(a,f20.10,a1,f20.10,a1,f20.10)
')" V1=", V1(1),",",V1(2),",",V1(3)
671 write (*,FMT='(a,f20.10,a1,f20.10,a1,f20.10)
')" V2=", V2(1),",",V2(2),",",V2(3)
672 write (*,FMT='(a,f20.10,a1,f20.10,a1,f20.10)
')" V3=", V3(1),",",V3(2),",",V3(3)
674 !new coordinates in the projection plane (dim=2)
675 !no need to invert the matrix because it is orthogonal
677 VAL1 = M(1,1,ICUT)*Ph(1,ICUT,J) + M(2,1,ICUT)*Ph(2,ICUT,J) + M(3,1,ICUT)*Ph(3,ICUT,J)
678 VAL2 = M(1,2,ICUT)*Ph(1,ICUT,J) + M(2,2,ICUT)*Ph(2,ICUT,J) + M(3,2,ICUT)*Ph(3,ICUT,J)
684 NP = BRICK_LIST(NIN,IB)%PCUT(ICUT)%NP
686 VAL1 = M(1,1,ICUT)*Sh(1,ICUT,J) + M(2,1,ICUT)*Sh(2,ICUT,J) + M(3,1,ICUT)*Sh(3,ICUT,J)
687 VAL2 = M(1,2,ICUT)*Sh(1,ICUT,J) + M(2,2,ICUT)*Sh(2,ICUT,J) + M(3,2,ICUT)*Sh(3,ICUT,J)
696 IF(NBCUT_ADD > 0)THEN
699 NP = BRICK_LIST(NIN,IB)%PCUT(ICUT)%NP
703 NORMAL(1:3) = BRICK_LIST(NIN,IB)%PCUT(ICUT)%N(1:3)
707 IF (a==ZERO . AND. b==ZERO)THEN
708 V1 = (/ ONE,ZERO,ZERO /)
709 V2 = (/ ZERO,ONE,ZERO /)
710 ELSEIF(a==ZERO . AND. c==ZERO)THEN
711 V1 = (/ ONE,ZERO,ZERO /)
712 V2 = (/ ZERO,ZERO,ONE /)
713 ELSEIF(b==ZERO . AND. c==ZERO)THEN
714 V1 = (/ ZERO,ONE,ZERO /)
715 V2 = (/ ZERO,ZERO,ONE /)
718 V1 = (/ -b, a , ZERO /)
719 V2 = (/ -c, ZERO, a /)
721 V1 = (/ ONE, ZERO, ZERO /)
722 V2 = (/ ZERO, -c, b /)
725 !hyopothesis : V1, V2 are non colinear, ||V1||=1
726 !V2~ = labmda1 * V1 + lambda2 * V2 (V2~ is generated by (V1,V2) )
727 !let set lambda1 = <V1,V2>, then lambda2=-1
728 V1 = V1 / SQRT(SUM(V1*V1))
729 PS = V1(1)*V2(1) + V1(2)*V2(2) +V1(3)*V2(3)
731 V2 = V2 / SQRT(SUM(V2*V2))
733 V3 = NORMAL / SQRT(SUM(NORMAL*NORMAL))
735 !third direction is Pcut normal
736 !change of basis matrix
740.AND.
if(IBUG22_Swet==-1 INT22>0 )then
741 print *," ORTHONORMAL BASIS _additional Scut (closed surf hypothesis) :"
742 write (*,FMT='(a,f20.10,a1,f20.10,a1,f20.10)
')" V1=", V1(1),",",V1(2),",",V1(3)
743 write (*,FMT='(a,f20.10,a1,f20.10,a1,f20.10)
')" V2=", V2(1),",",V2(2),",",V2(3)
744 write (*,FMT='(a,f20.10,a1,f20.10,a1,f20.10)
')" V3=", V3(1),",",V3(2),",",V3(3)
746 !new coordinates in the projection plane (dim=2)
747 !no need to invert the matrix because it is orthogonal
749 VAL1 = M(1,1,ICUT)*Ph(1,ICUT,J) + M(2,1,ICUT)*Ph(2,ICUT,J) + M(3,1,ICUT)*Ph(3,ICUT,J)
750 VAL2 = M(1,2,ICUT)*Ph(1,ICUT,J) + M(2,2,ICUT)*Ph(2,ICUT,J) + M(3,2,ICUT)*Ph(3,ICUT,J)
752 Ph(1:3,ICUT,J) = (/VAL1,VAL2,VAL3/)
754 NP = BRICK_LIST(NIN,IB)%PCUT(ICUT)%NP
756 VAL1 = M(1,1,ICUT)*Sh(1,ICUT,J) + M(2,1,ICUT)*Sh(2,ICUT,J) + M(3,1,ICUT)*Sh(3,ICUT,J)
757 VAL2 = M(1,2,ICUT)*Sh(1,ICUT,J) + M(2,2,ICUT)*Sh(2,ICUT,J) + M(3,2,ICUT)*Sh(3,ICUT,J)
759 Sh(1:3,ICUT,J) = (/VAL1,VAL2,VAL3/)
762 ENDIF !(NBCUT_ADD > 0)
767 !POLYGONAL CLIPPING (SCUT with projected segment)
769! Projected Segment might be non convex. In this case it is decomposed into 2 triangles (hourglass shape)
770! If projected segment is convex then it is splitted into 4 triangles (required for parith on)
774 P_Grav(1:3,ICUT,I) = ZERO
776 NP = BRICK_LIST(NIN,IB)%PCUT(ICUT)%NP !BUG line was missing !
778 PolySCUT%NumNodes = NP+1 !
780 PolySCUT%node(J,1:2) = Sh(1:2,ICUT,J)
782 PolySCUT%node(NP+1,:) = PolySCUT%node(1,:)
783 CALL SetCounterClockWisePolyg( PolySCUT, VAL2 )
785 ITYP = GetProjectedFaceType(
786 . Ph(1:2,ICUT,1), Ph(1:2,ICUT,2), Ph(1:2,ICUT,3), Ph(1:2,ICUT,4), InterP, ListP )
789 IF(NP_RECT(I)==3) THEN
797 PolyTria(1)%NumNodes = 3+1
798 PolyTria(1)%node(1,1:2) = Ph(1:2,ICUT,ListP(1))
799 PolyTria(1)%node(2,1:2) = Ph(1:2,ICUT,ListP(2))
800 PolyTria(1)%node(3,1:2) = InterP(1:2)
801 PolyTria(1)%node(4,:) = PolyTria(1)%node(1,:)
802 CALL SetCounterClockWisePolyg( PolyTria(1), Stria(1) )
805 PolyTria(2)%NumNodes = 3+1
806 PolyTria(2)%node(1,1:2) = Ph(1:2,ICUT,ListP(3))
807 PolyTria(2)%node(2,1:2) = Ph(1:2,ICUT,ListP(4))
808 PolyTria(2)%node(3,1:2) = InterP(1:2)
809 PolyTria(2)%node(4,:) = PolyTria(2)%node(1,:)
810 CALL SetCounterClockWisePolyg( PolyTria(2), Stria(2) )
814 PolyTria(3)%NumNodes = 3+1
815 PolyTria(3)%node(1,1:2) = Ph(1:2,ICUT,ListP(2))
816 PolyTria(3)%node(2,1:2) = Ph(1:2,ICUT,ListP(3))
817 PolyTria(3)%node(3,1:2) = InterP(1:2)
818 PolyTria(3)%node(4,:) = PolyTria(3)%node(1,:)
819 CALL SetCounterClockWisePolyg( PolyTria(3), Stria(3) )
822 PolyTria(4)%NumNodes = 3+1
823 PolyTria(4)%node(1,1:2) = Ph(1:2,ICUT,ListP(1))
824 PolyTria(4)%node(2,1:2) = Ph(1:2,ICUT,ListP(4))
825 PolyTria(4)%node(3,1:2) = InterP(1:2)
826 PolyTria(4)%node(4,:) = PolyTria(4)%node(1,:)
827 CALL SetCounterClockWisePolyg( PolyTria(4), Stria(4) )
830 Cumul_VAL2 = SUM(Stria(1:4))
833.AND.
if(IBUG22_Swet==-1 INT22>0 )then
834 print *, " |-----------i22wetsurf.F--------|"
835 print *, " | LAGRANGIAN PROJECTIONS |"
836 print *, " |-------------------------------|"
838 brickID = BRICK_LISt(NIN,IB)%ID
839 write (*,FMT='(a,1i10,a,i2)
') " --------brickID=",ixs(11,brickID), " ICUT=", ICUT
841 write (*,FMT='(a,1i10)
') " N1=",ITAB(IRECT(1,K))
842 write (*,FMT='(a,1i10)
') " N2=",ITAB(IRECT(2,K))
843 write (*,FMT='(a,1i10)
') " N3=",ITAB(IRECT(3,K))
844 write (*,FMT='(a,1i10)
') " N4=",ITAB(IRECT(4,K))
845 write (*,FMT='(a)
' ) " Projected Tria"
846 write (*,FMT='(a,3f30.16)
') " *createnode ",Ph(1:2,ICUT,1),ZERO
847 write (*,FMT='(a,3f30.16)
') " *createnode ",Ph(1:2,ICUT,2),ZERO
848 write (*,FMT='(a,3f30.16)
') " *createnode ",Ph(1:2,ICUT,3),ZERO
849 write (*,FMT='(a,3f30.16)
') " *createnode ",Ph(1:2,ICUT,4),ZERO
850 write (*,FMT='(a,1i1)
' ) " ityp=",ITYP
851 write (*,FMT='(a)
' ) " PolySCUT"
852 write (*,FMT='(a,3f30.16)
') " *createnode ",PolySCUT%node(1,1:2),ZERO
853 write (*,FMT='(a,3f30.16)
') " *createnode ",PolySCUT%node(2,1:2),ZERO
854 write (*,FMT='(a,3f30.16)
') " *createnode ",PolySCUT%node(3,1:2),ZERO
855 write (*,FMT='(a,3f30.16)
') " *createnode ",PolySCUT%node(4,1:2),ZERO
856 write (*,FMT='(a,1i10)
') " NTRIA=",NTRIA
863 POLYresult%NumNodes = 0
871 CALL PolygonalClipping( PolyTria(J),PolySCUT, POLYresult)
872 IF(POLYresult%NumNodes==0)CYCLE
874 pt1(1:2) = PolyTria(J)%node(1,1:2) ; pt1(3)=ZERO
875 pt2(1:2) = PolyTria(J)%node(2,1:2) ; pt2(3)=ZERO
876 pt3(1:2) = PolyTria(J)%node(3,1:2) ; pt3(3)=ZERO
878.AND.
if(IBUG22_Swet==-1 INT22>0 )then
879 write (*,FMT='(a,1i10)
') " --TRIA #", J
880 write (*,FMT='(a,3f30.16)
') " *createnode ",PolyTria(J)%node(1,1:2),ZERO
881 write (*,FMT='(a,3f30.16)
') " *createnode ",PolyTria(J)%node(2,1:2),ZERO
882 write (*,FMT='(a,3f30.16)
') " *createnode ",PolyTria(J)%node(3,1:2),ZERO
883 write (*,FMT='(a,1i10)
') " ->clip nodes", POLYresult%NumNodes
884 do k=1,POLYresult%NumNodes-1
885 write (*,FMT='(a,3f45.35)
') " *createnode ",POLYresult%node(k,1:2),ZERO
890 !Gravity center estimation / To be updated later / must also be Parith ON
891 IF(POLYresult%NumNodes-1>0)THEN
892 DO k=1,POLYresult%NumNodes-1
895 PGrav(1) = PGrav(1) + POLYresult%node(k,1)
896 PGrav(2) = PGrav(2) + POLYresult%node(k,2)
898 PGrav(1) = PGrav(1) / (POLYresult%NumNodes-1)
899 PGrav(2) = PGrav(2) / (POLYresult%NumNodes-1)
902 P_Grav(1,ICUT,I) = P_Grav(1,ICUT,I) + PGrav(1)
903 P_Grav(2,ICUT,I) = P_Grav(2,ICUT,I) + PGrav(2)
904 NumGrav = Numgrav + ONE
906.AND.
IF(POLYresult%NumNodes > 0 STria(J)/=ZERO)THEN
907 pt1(1:2) = PolyTria(J)%node(1,1:2) ; pt1(3)=ZERO
908 pt2(1:2) = PolyTria(J)%node(2,1:2) ; pt2(3)=ZERO
909 pt3(1:2) = PolyTria(J)%node(3,1:2) ; pt3(3)=ZERO
910 CALL SetCounterClockWisePolyg(POLYresult ,VAL)
911 VAL = MAX(ZERO,MIN(VAL,Stria(J)))
912 Cumul_VAL1 = Cumul_VAL1 + VAL
913.AND.
if(IBUG22_Swet==-1 INT22>0 )write (*,FMT='(a,1f30.16)
') " -> Tria Wet Surf=", VAL
914.AND.
if(IBUG22_Swet==-1 INT22>0 )write (*,FMT='(a,1f30.16)
') " -> Tria Surf =", Stria(J)
915.AND.
if(IBUG22_Swet==-1 INT22>0 )write (*,FMT='(a,1f30.16)
') " -> cumulated Wet Surf=", Cumul_VAL1
916.AND.
if(IBUG22_Swet==-1 INT22>0 )write (*,FMT='(a,1f30.16)
') " -> Sum of tria Surf=", Cumul_VAL2
918 !post-condition testing
919 WET_RATIO(J) = VAL/Stria(J)
920.OR.
IF(WET_RATIO(J)<-EM06 WET_RATIO(J)-ONE>EM06)THEN
921 print *, "***error: inter22 topology issue while computing wet surface",WET_RATIO(J),VAL1,VAL2
924 ENDDO !next J=1,NTRIA
926 WET_RATIO(0) = Cumul_VAL1 !sum of wet surfaces for all triangles composing the lagrangian face.
928.OR.
IF(WET_RATIO(0) == ZERO Cumul_VAL2==ZERO)THEN
932 WET_RATIO(0) = WET_RATIO(0) / Cumul_VAL2
935 WET_RATIO(0) = MAX(ZERO,MIN(WET_RATIO(0),ONE))
936 SEFF(ICUT,I) = Cumul_VAL1
938 SEFF(ICUT,I) = WET_RATIO(0) * Sel(I)
941.AND.
if(IBUG22_Swet==-1 INT22>0 )then
942 write (*,FMT='(a,1f30.16)
') " Sum Wet Surf =",Cumul_VAL1
943 write (*,FMT='(a,1f30.16)
') " Total Surf =",Cumul_VAL2
944 write (*,FMT='(a,1f30.16)
') " RATIO =",WET_RATIO(0)
950 P_Grav(1,ICUT,I) = P_Grav(1,ICUT,I) / NumGrav
951 P_Grav(2,ICUT,I) = P_Grav(2,ICUT,I) / NumGrav
953 !---sWeighting factors using pressure load center
954 !InterPolation using gravity centers of clipped polygons
957 !2d projected segment
958 pt1(1:2) = Ph(1:2,ICUT,ListP(1))
959 pt2(1:2) = Ph(1:2,ICUT,ListP(2))
960 pt3(1:2) = Ph(1:2,ICUT,ListP(3))
961 pt4(1:2) = Ph(1:2,ICUT,ListP(4))
975 !distance of each point from wet polygon gravity center
976 distance(1) = SQRT( (P_grav(1,ICUT,I)-Pt1(1))**2 + (P_grav(2,ICUT,I)-Pt1(2))**2 )
977 distance(2) = SQRT( (P_grav(1,ICUT,I)-Pt2(1))**2 + (P_grav(2,ICUT,I)-Pt2(2))**2 )
978 distance(3) = SQRT( (P_grav(1,ICUT,I)-Pt3(1))**2 + (P_grav(2,ICUT,I)-Pt3(2))**2 )
979 distance(4) = SQRT( (P_grav(1,ICUT,I)-Pt4(1))**2 + (P_grav(2,ICUT,I)-Pt4(2))**2 )
986 edge(1) = SQRT ( (Pt1(1)-Pt2(1))**2 + (Pt1(2)-Pt2(2))**2 )
987 edge(2) = SQRT ( (Pt2(1)-Pt3(1))**2 + (Pt2(2)-Pt3(2))**2 )
988 edge(3) = SQRT ( (Pt3(1)-Pt4(1))**2 + (Pt3(2)-Pt4(2))**2 )
989 edge(4) = SQRT ( (Pt4(1)-Pt1(1))**2 + (Pt4(2)-Pt1(2))**2 )
990 IF(NP_RECT(I)==3)THEN
991 edge(3) = SQRT ( (Pt3(1)-Pt1(1))**2 + (Pt3(2)-Pt1(2))**2 )
999 Area_tria(1) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1005 Area_tria(2) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1007 IF(NP_RECT(I)==4)THEN
1012 Area_tria(3) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1018 Area_tria(4) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1024 Area_tria(3) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1029 Dsum = SUM(Area_tria(1:NP_RECT(I)))
1035 IF(NP_RECT(I)==4)THEN
1036 !delta(1,ICUT,I) = HALF*(Area_tria(2)+Area_tria(3))/Dsum
1037 !delta(2,ICUT,I) = HALF*(Area_tria(3)+Area_tria(4))/Dsum
1038 !delta(3,ICUT,I) = HALF*(Area_tria(1)+Area_tria(4))/Dsum
1039 !delta(4,ICUT,I) = HALF*(Area_tria(1)+Area_tria(2))/Dsum
1040 !uniform loading: same weight
1041 delta(1:4,ICUT,I) = FOURTH
1043 !delta(1,ICUT,I) = (Area_tria(2))/Dsum
1044 !delta(2,ICUT,I) = (Area_tria(3))/Dsum
1045 !delta(3,ICUT,I) = (Area_tria(1))/Dsum
1046 !delta(4,ICUT,I) = ZERO
1047 !uniform loading : same weight
1048 delta(1:4,ICUT,I) = THIRD
1049 delta(4 ,ICUT,I) = ZERO
1052 !write (*,FMT='(a,3e30.16)
') "CoG = ", P_grav(1:2,ICUT,I)
1053 !write (*,FMT='(a,4e30.16)
') "dist = ", distance(1:4)
1070 NP = BRICK_LIST(NIN,IB)%PCUT(ICUT)%NP
1072 P_Grav(1:3,ICUT,I) = ZERO
1076 PolySCUT%NumNodes = NP+1
1078 PolySCUT%node(J,1:2) = Sh(1:2,ICUT,J)
1080 PolySCUT%node(NP+1,:) = PolySCUT%node(1,:)
1081 CALL SetCounterClockWisePolyg( PolySCUT, VAL2 )
1085 ITYP = GetProjectedFaceType(Ph(1:2,ICUT,1), Ph(1:2,ICUT,2), Ph(1:2,ICUT,3), Ph(1:2,ICUT,4), InterP, ListP)
1088 IF(ITYP/=0)NTRIA = 2
1089 IF(NP_RECT(I)==3) THEN
1097 PolyTria(1)%NumNodes = 3+1
1098 PolyTria(1)%node(1,1:2) = Ph(1:2,ICUT,ListP(1))
1099 PolyTria(1)%node(2,1:2) = Ph(1:2,ICUT,ListP(2))
1100 PolyTria(1)%node(3,1:2) = InterP(1:2)
1101 PolyTria(1)%node(4,:) = PolyTria(1)%node(1,:)
1102 CALL SetCounterClockWisePolyg( PolyTria(1), Stria(1) )
1105 PolyTria(2)%NumNodes = 3+1
1106 PolyTria(2)%node(1,1:2) = Ph(1:2,ICUT,ListP(3))
1107 PolyTria(2)%node(2,1:2) = Ph(1:2,ICUT,ListP(4))
1108 PolyTria(2)%node(3,1:2) = InterP(1:2)
1109 PolyTria(2)%node(4,:) = PolyTria(2)%node(1,:)
1110 CALL SetCounterClockWisePolyg( PolyTria(2), Stria(2) )
1114 PolyTria(3)%NumNodes = 3+1
1115 PolyTria(3)%node(1,1:2) = Ph(1:2,ICUT,ListP(2))
1116 PolyTria(3)%node(2,1:2) = Ph(1:2,ICUT,ListP(3))
1117 PolyTria(3)%node(3,1:2) = InterP(1:2)
1118 PolyTria(3)%node(4,:) = PolyTria(3)%node(1,:)
1119 CALL SetCounterClockWisePolyg( PolyTria(3), Stria(3) )
1122 PolyTria(4)%NumNodes = 3+1
1123 PolyTria(4)%node(1,1:2) = Ph(1:2,ICUT,ListP(1))
1124 PolyTria(4)%node(2,1:2) = Ph(1:2,ICUT,ListP(4))
1125 PolyTria(4)%node(3,1:2) = InterP(1:2)
1126 PolyTria(4)%node(4,:) = PolyTria(4)%node(1,:)
1127 CALL SetCounterClockWisePolyg( PolyTria(4), Stria(4) )
1130 Cumul_VAL2 = SUM(Stria(1:4))
1132 !-------OUTPUT------
1133.AND.
if(IBUG22_Swet==-1 INT22>0 )then
1134 print *, " |-----------i22wetsurf.F--------|"
1135 print *, " | LAGRANGIAN PROJECTIONS |"
1136 print *, " |-------------------------------|"
1138 brickID = BRICK_LISt(NIN,IB)%ID
1139 write (*,FMT='(a,1i10,a,i2)
') " --------brickID=",ixs(11,brickID), " ICUT=", ICUT
1140 write (*,FMT='(a )
') " additional Scut (closed surf. hypothesis."
1141 write (*,FMT='(a,1i10)
') " N1=",ITAB(IRECT(1,CE_LOC(I)))
1142 write (*,FMT='(a,1i10)
') " N2=",ITAB(IRECT(2,CE_LOC(I)))
1143 write (*,FMT='(a,1i10)
') " N3=",ITAB(IRECT(3,CE_LOC(I)))
1144 write (*,FMT='(a,1i10)
') " N4=",ITAB(IRECT(4,CE_LOC(I)))
1145 write (*,FMT='(a)
' ) " Projected Tria"
1146 write (*,FMT='(a,3f30.16)
') " *createnode ",Ph(1:2,ICUT,1),ZERO
1147 write (*,FMT='(a,3f30.16)
') " *createnode ",Ph(1:2,ICUT,2),ZERO
1148 write (*,FMT='(a,3f30.16)
') " *createnode ",Ph(1:2,ICUT,3),ZERO
1149 write (*,FMT='(a,3f30.16)
') " *createnode ",Ph(1:2,ICUT,4),ZERO
1150 write (*,FMT='(a,1i1)
' ) " ityp=",ITYP
1151 write (*,FMT='(a)
' ) " PolySCUT"
1152 write (*,FMT='(a,3f30.16)
') " *createnode ",PolySCUT%node(1,1:2),ZERO
1153 write (*,FMT='(a,3f30.16)
') " *createnode ",PolySCUT%node(2,1:2),ZERO
1154 write (*,FMT='(a,3f30.16)
') " *createnode ",PolySCUT%node(3,1:2),ZERO
1155 write (*,FMT='(a,3f30.16)
') " *createnode ",PolySCUT%node(4,1:2),ZERO
1156 write (*,FMT='(a,1i10)
') " NTRIA=",NTRIA
1163 POLYresult%NumNodes = 0
1171 CALL PolygonalClipping( PolyTria(J),PolySCUT, POLYresult)
1172 IF(POLYresult%NumNodes==0)CYCLE
1174 pt1(1:2) = PolyTria(J)%node(1,1:2) ; pt1(3)=ZERO
1175 pt2(1:2) = PolyTria(J)%node(2,1:2) ; pt2(3)=ZERO
1176 pt3(1:2) = PolyTria(J)%node(3,1:2) ; pt3(3)=ZERO
1178.AND.
if(IBUG22_Swet==-1 INT22>0 )then
1179 write (*,FMT='(a,1i10)
') " --TRIA #", J
1180 write (*,FMT='(a,3f30.16)
') " *createnode ",PolyTria(J)%node(1,1:2),ZERO
1181 write (*,FMT='(a,3f30.16)
') " *createnode ",PolyTria(J)%node(2,1:2),ZERO
1182 write (*,FMT='(a,3f30.16)
') " *createnode ",PolyTria(J)%node(3,1:2),ZERO
1183 write (*,FMT='(a,1i10)
') " ->clip nodes", POLYresult%NumNodes
1184 do k=1,POLYresult%NumNodes-1
1185 write (*,FMT='(a,3f45.35)
') " *createnode ",POLYresult%node(k,1:2),ZERO
1190 !Gravity center estimation / To be updated later / must also be Parith ON
1191 IF(POLYresult%NumNodes-1>0)THEN
1192 DO k=1,POLYresult%NumNodes-1
1193 P_Grav(1,ICUT,I) = P_Grav(1,ICUT,I) + POLYresult%node(k,1)
1194 P_Grav(2,ICUT,I) = P_Grav(2,ICUT,I) + POLYresult%node(k,2)
1195 PGrav(1) = PGrav(1) + POLYresult%node(k,1)
1196 PGrav(2) = PGrav(2) + POLYresult%node(k,2)
1198 PGrav(1) = PGrav(1) / (POLYresult%NumNodes-1)
1199 PGrav(2) = PGrav(2) / (POLYresult%NumNodes-1)
1202 P_Grav(1,ICUT,I) = P_Grav(1,ICUT,I) + PGrav(1)
1203 P_Grav(2,ICUT,I) = P_Grav(2,ICUT,I) + PGrav(2)
1204 NumGrav = Numgrav + ONE
1206.AND.
IF(POLYresult%NumNodes > 0 STria(J)/=ZERO)THEN
1207 pt1(1:2) = PolyTria(J)%node(1,1:2) ; pt1(3)=ZERO
1208 pt2(1:2) = PolyTria(J)%node(2,1:2) ; pt2(3)=ZERO
1209 pt3(1:2) = PolyTria(J)%node(3,1:2) ; pt3(3)=ZERO
1210 CALL SetCounterClockWisePolyg(POLYresult ,VAL)
1211 VAL = MAX(ZERO,MIN(VAL,Stria(J)))
1212 Cumul_VAL1 = Cumul_VAL1 + VAL
1213.AND.
if(IBUG22_Swet==-1 INT22>0 )write (*,FMT='(a,1f30.16)
') " -> Tria Wet Surf=", VAL
1214.AND.
if(IBUG22_Swet==-1 INT22>0 )write (*,FMT='(a,1f30.16)
') " -> Tria Surf =", Stria(J)
1215.AND.
if(IBUG22_Swet==-1 INT22>0 )write (*,FMT='(a,1f30.16)
') " -> cumulated Wet Surf=", Cumul_VAL1
1216.AND.
if(IBUG22_Swet==-1 INT22>0 )write (*,FMT='(a,1f30.16)
') " -> Sum of tria Surf=", Cumul_VAL2
1218 !post-condition testing
1219 WET_RATIO(J) = VAL/Stria(J)
1220.OR.
IF(WET_RATIO(J)<-EM06 WET_RATIO(J)-ONE>EM06)THEN
1221 print *, "***error: inter22 topology issue while computing wet surface",WET_RATIO(J),VAL1,VAL2
1224 ENDDO !next J=1,NTRIA
1226 WET_RATIO(0) = Cumul_VAL1 !sum of wet surfaces for all triangles composing the lagrangian face.
1228.OR.
IF(WET_RATIO(0) == ZERO Cumul_VAL2==ZERO)THEN
1232 WET_RATIO(0) = WET_RATIO(0) / Cumul_VAL2
1235 WET_RATIO(0) = MAX(ZERO,MIN(WET_RATIO(0),ONE))
1236 SEFF(ICUT,I) = Cumul_VAL1
1238 SEFF(ICUT,I) = WET_RATIO(0) * Sel(I)
1240 !-------OUTPUT------
1241.AND.
if(IBUG22_Swet==-1 INT22>0 )then
1242 write (*,FMT='(a,1f30.16)
') " Sum Wet Surf =",Cumul_VAL1
1243 write (*,FMT='(a,1f30.16)
') " Total Surf =",Cumul_VAL2
1244 write (*,FMT='(a,1f30.16)
') " RATIO =",WET_RATIO(0)
1250 P_Grav(1,ICUT,I) = P_Grav(1,ICUT,I) /NumGrav
1251 P_Grav(2,ICUT,I) = P_Grav(2,ICUT,I) /NumGrav
1253 !---sWeighting factors using pressure load center
1254 !InterPolation using gravity centers of clipped polygons
1255 !NP_RECT(I) = 3 or 4
1257 !2d projected segment
1258 pt1(1:2) = Ph(1:2,ICUT,ListP(1))
1259 pt2(1:2) = Ph(1:2,ICUT,ListP(2))
1260 pt3(1:2) = Ph(1:2,ICUT,ListP(3))
1261 pt4(1:2) = Ph(1:2,ICUT,ListP(4))
1275 !distance of each point from wet polygon gravity center
1276 distance(1) = SQRT( (P_grav(1,ICUT,I)-Pt1(1))**2 + (P_grav(2,ICUT,I)-Pt1(2))**2 )
1277 distance(2) = SQRT( (P_grav(1,ICUT,I)-Pt2(1))**2 + (P_grav(2,ICUT,I)-Pt2(2))**2 )
1278 distance(3) = SQRT( (P_grav(1,ICUT,I)-Pt3(1))**2 + (P_grav(2,ICUT,I)-Pt3(2))**2 )
1279 distance(4) = SQRT( (P_grav(1,ICUT,I)-Pt4(1))**2 + (P_grav(2,ICUT,I)-Pt4(2))**2 )
1286 edge(1) = SQRT ( (Pt1(1)-Pt2(1))**2 + (Pt1(2)-Pt2(2))**2 )
1287 edge(2) = SQRT ( (Pt2(1)-Pt3(1))**2 + (Pt2(2)-Pt3(2))**2 )
1288 edge(3) = SQRT ( (Pt3(1)-Pt4(1))**2 + (Pt3(2)-Pt4(2))**2 )
1289 edge(4) = SQRT ( (Pt4(1)-Pt1(1))**2 + (Pt4(2)-Pt1(2))**2 )
1290 IF(NP_RECT(I)==3)THEN
1291 edge(3) = SQRT ( (Pt3(1)-Pt1(1))**2 + (Pt3(2)-Pt1(2))**2 )
1299 Area_tria(1) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1305 Area_tria(2) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1307 IF(NP_RECT(I)==4)THEN
1312 Area_tria(3) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1318 Area_tria(4) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1324 Area_tria(3) = SQRT( ABS(s2*(s2-a)*(s2-b)*(s2-c)) )
1329 Dsum = SUM(Area_tria(1:NP_RECT(I)))
1332 print *, "Warning: inter22 - nodal forces computation"
1335 IF(NP_RECT(I)==4)THEN
1336 delta(1,ICUT,I) = HALF*(Area_tria(2)+Area_tria(3))/Dsum
1337 delta(2,ICUT,I) = HALF*(Area_tria(3)+Area_tria(4))/Dsum
1338 delta(3,ICUT,I) = HALF*(Area_tria(1)+Area_tria(4))/Dsum
1339 delta(4,ICUT,I) = HALF*(Area_tria(1)+Area_tria(2))/Dsum
1340 !uniform loading : same weight
1341 delta(1:4,ICUT,I) = FOURTH
1343 delta(1,ICUT,I) = (Area_tria(2))/Dsum
1344 delta(2,ICUT,I) = (Area_tria(3))/Dsum
1345 delta(3,ICUT,I) = (Area_tria(1))/Dsum
1346 delta(4,ICUT,I) = ZERO
1347 !uniform loading : same weight
1348 delta(1:4,ICUT,I) = THIRD
1349 delta(4,ICUT,I) = ZERO
1352 !write (*,FMT='(a,3e30.16)
') "CoG = ", P_grav(1:2,ICUT,I)
1353 !write (*,FMT='(a,4e30.16)
') "dist = ", distance(1:4)
1360 ENDDO!next I (couple)
subroutine i22wetsurf(jlt, cand_b, cand_e, cb_loc, ce_loc, x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, xi, yi, zi, nx1, nx2, nx3, nx4, ny1, ny2, ny3, ny4, nz1, nz2, nz3, nz4, lb1, lb2, lb3, lb4, lc1, lc2, lc3, lc4, p1, p2, p3, p4, ix1, ix2, ix3, ix4, nsvg, stif, jlt_new, gapv, inacti, cand_p, n_scut, index, vxi, vyi, vzi, msi, kini, surf, ibag, itab, irect, i_stok, ixs, nft, cog, seff, delta, x)