65#define TRSUPG_ZERO_VOF 1.e-8
71TR1_2D_SUPG2_AXI :: TR1_2D_SUPG2_AXI(
int n,
Domain *aDomain) :
79TR1_2D_SUPG2_AXI :: initializeFrom(
InputRecord &ir,
int priority)
81 SUPGElement :: initializeFrom(ir, priority);
87 if (flag && (
vof > 0.0)) {
112 SUPGElement :: giveInputRecord(input);
124TR1_2D_SUPG2_AXI :: computeGaussPoints()
163 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
169 for (
int i = 1; i <= 3; i++ ) {
170 for (
int j = 1; j <= 3; j++ ) {
172 _val = n.
at(i) * n.
at(j) * rho * dV;
173 answer.
at(2 * i - 1, 2 * j - 1) += _val;
174 answer.
at(2 * i, 2 * j) += _val;
177 u = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
178 v = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
179 answer.
at(2 * i - 1, 2 * j - 1) += ( u *
b [ i - 1 ] + v *
c [ j - 1 ] ) * n.
at(j) * rho *
t_supg * dV;
180 answer.
at(2 * i, 2 * j) += ( u *
b [ i - 1 ] + v *
c [ j - 1 ] ) * n.
at(j) * rho *
t_supg * dV;
195 double dudx, dudy, dvdx, dvdy, _u, _v;
200 dudx =
b [ 0 ] * u.
at(1) +
b [ 1 ] * u.
at(3) +
b [ 2 ] * u.
at(5);
201 dudy =
c [ 0 ] * u.
at(1) +
c [ 1 ] * u.
at(3) +
c [ 2 ] * u.
at(5);
202 dvdx =
b [ 0 ] * u.
at(2) +
b [ 1 ] * u.
at(4) +
b [ 2 ] * u.
at(6);
203 dvdy =
c [ 0 ] * u.
at(2) +
c [ 1 ] * u.
at(4) +
c [ 2 ] * u.
at(6);
206 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
212 _u = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
213 _v = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
216 for (
int i = 1; i <= 3; i++ ) {
217 answer.
at(2 * i - 1) += rho * n.
at(i) * ( _u * dudx + _v * dudy ) * dV;
218 answer.
at(2 * i) += rho * n.
at(i) * ( _u * dvdx + _v * dvdy ) * dV;
222 for (
int i = 1; i <= 3; i++ ) {
223 answer.
at(2 * i - 1) += ( _u *
b [ i - 1 ] + _v *
c [ i - 1 ] ) * ( _u * dudx + _v * dudy ) * rho *
t_supg * dV;
224 answer.
at(2 * i) += ( _u *
b [ i - 1 ] + _v *
c [ i - 1 ] ) * ( _u * dvdx + _v * dvdy ) * rho *
t_supg * dV;
241 int w_dof_addr, u_dof_addr, dij;
244 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
250 _u = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
251 _v = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
254 for (
int i = 1; i <= 2; i++ ) {
255 for (
int k = 1; k <= 3; k++ ) {
256 for (
int j = 1; j <= 2; j++ ) {
257 for (
int m = 1; m <= 3; m++ ) {
258 w_dof_addr = ( k - 1 ) * 2 + i;
259 u_dof_addr = ( m - 1 ) * 2 + j;
262 answer.
at(w_dof_addr, u_dof_addr) += dV * rho * n.
at(k) * ( dij * _u *
b [ m - 1 ] + dij * _v *
c [ m - 1 ] );
269 for (
int i = 1; i <= 2; i++ ) {
270 for (
int k = 1; k <= 3; k++ ) {
271 for (
int j = 1; j <= 2; j++ ) {
272 for (
int m = 1; m <= 3; m++ ) {
273 w_dof_addr = ( k - 1 ) * 2 + i;
274 u_dof_addr = ( m - 1 ) * 2 + j;
277 answer.
at(w_dof_addr, u_dof_addr) += dV *
t_supg * rho *
278 ( _u *
b [ k - 1 ] + _v *
c [ k - 1 ] ) * ( dij * _u *
b [ m - 1 ] + dij * _v *
c [ m - 1 ] );
302 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
309 stress =
mat->computeDeviatoricStressAxi(eps, gp, tStep);
316 double _u = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
317 double _v = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
319 for (
int i = 1; i <= 3; i++ ) {
320 answer.
at(2 * i - 1) -=
t_supg * ( _u *
b [ i - 1 ] + _v *
c [ i - 1 ] ) * ( stress.
at(1) / _r ) * dV / Re;
321 answer.
at(2 * i) -=
t_supg * ( _u *
b [ i - 1 ] + _v *
c [ i - 1 ] ) * ( stress.
at(4) / _r ) * dV / Re;
331TR1_2D_SUPG2_AXI :: computeDiffusionDerivativeTerm_MB(
FloatMatrix &answer, MatResponseMode mode,
TimeStep *tStep)
344 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
350 _d =
mat->computeTangentAxi(mode, gp, tStep);
359 stress =
mat->computeDeviatoricStressAxi(eps, gp, tStep);
363 double _u = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
364 double _v = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
366 for (
int i = 1; i <= 3; i++ ) {
367 for (
int j = 1; j <= 6; j++ ) {
371 answer.
at(2 * i - 1, j) -=
t_supg * ( _u *
b [ i - 1 ] + _v *
c [ i - 1 ] ) * ( _db.
at(1, j) / _r ) * dV;
372 answer.
at(2 * i, j) -=
t_supg * ( _u *
b [ i - 1 ] + _v *
c [ i - 1 ] ) * ( _db.
at(4, j) / _r ) * dV;
380 answer.
times(1. / Re);
394 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
400 for (
int i = 1; i <= 3; i++ ) {
401 for (
int j = 1; j <= 3; j++ ) {
402 answer.
at(2 * i - 1, j) -=
b [ i - 1 ] * n.
at(j) * dV;
403 answer.
at(2 * i, j) -=
c [ i - 1 ] * n.
at(j) * dV;
405 answer.
at(2 * i - 1, j) -= n.
at(i) * n.
at(j) * dV / _r;
410 _u = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
411 _v = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
412 for (
int i = 1; i <= 3; i++ ) {
413 for (
int j = 1; j <= 3; j++ ) {
414 answer.
at(2 * i - 1, j) += ( _u *
b [ i - 1 ] + _v *
c [ i - 1 ] ) *
b [ j - 1 ] * dV *
t_supg;
415 answer.
at(2 * i, j) += ( _u *
b [ i - 1 ] + _v *
c [ i - 1 ] ) *
c [ j - 1 ] * dV *
t_supg;
430 b [ 0 ],
c [ 0 ],
b [ 1 ],
c [ 1 ],
b [ 2 ],
c [ 2 ]
433 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
438 for (
int i = 1; i <= 6; i++ ) {
439 for (
int j = 1; j <= 6; j++ ) {
440 answer.
at(i, j) += dV *
t_lsic * rho * n [ i - 1 ] * n [ j - 1 ];
456 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
461 for (
int i = 1; i <= 3; i++ ) {
462 for (
int j = 1; j <= 3; j++ ) {
463 answer.
at(j, 2 * i - 1) +=
b [ i - 1 ] * n.
at(j) * dV;
464 answer.
at(j, 2 * i) +=
c [ i - 1 ] * n.
at(j) * dV;
466 answer.
at(i, 1 + ( j - 1 ) * 2) += n.
at(i) * n.
at(j) * dV / _r;
477 double dudx, dudy, dvdx, dvdy, _u, _v;
485 dudx =
b [ 0 ] * u.
at(1) +
b [ 1 ] * u.
at(3) +
b [ 2 ] * u.
at(5);
486 dudy =
c [ 0 ] * u.
at(1) +
c [ 1 ] * u.
at(3) +
c [ 2 ] * u.
at(5);
487 dvdx =
b [ 0 ] * u.
at(2) +
b [ 1 ] * u.
at(4) +
b [ 2 ] * u.
at(6);
488 dvdy =
c [ 0 ] * u.
at(2) +
c [ 1 ] * u.
at(4) +
c [ 2 ] * u.
at(6);
490 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
495 _u = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
496 _v = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
498 for (
int i = 1; i <= 3; i++ ) {
499 answer.
at(i) +=
t_pspg * dV * (
b [ i - 1 ] * ( _u * dudx + _v * dudy ) +
c [ i - 1 ] * ( _u * dvdx + _v * dvdy ) );
511 int w_dof_addr, u_dof_addr, d1j, d2j, km1, mm1;
518 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
523 _u = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
524 _v = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
526 for (
int k = 1; k <= 3; k++ ) {
528 for (
int j = 1; j <= 2; j++ ) {
529 for (
int m = 1; m <= 3; m++ ) {
531 u_dof_addr = ( m - 1 ) * 2 + j;
535 answer.
at(w_dof_addr, u_dof_addr) +=
t_pspg * dV * (
b [ km1 ] * ( _u * d1j *
b [ mm1 ] + _v * d1j *
c [ mm1 ] ) +
c [ km1 ] * ( _u * d2j *
b [ mm1 ] + _v * d2j *
c [ mm1 ] ) );
557 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
564 stress = (1. / Re) *
mat->computeDeviatoricStressAxi(eps, gp, tStep);
565 for (
int i = 1; i <= 3; i++ ) {
566 answer.
at(i) -=
t_pspg * (
b [ i - 1 ] * stress.
at(1) +
c [ i - 1 ] * stress.
at(4) ) * dV / rho / _r;
586 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
590 double rho =
mat->give(
'd', gp);
593 _d =
mat->computeTangentAxi(TangentStiffness, gp, tStep);
598 for (
int i = 1; i <= 3; i++ ) {
599 for (
int j = 1; j <= 6; j++ ) {
600 answer.
at(i, j) -=
t_pspg * (
b [ i - 1 ] * ( _db.
at(1, j) / _r ) +
c [ i - 1 ] * ( _db.
at(4, j) / _r ) ) * dV / rho;
606 answer.
times(1. / Re);
622 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
627 for (
int i = 1; i <= 3; i++ ) {
628 for (
int j = 1; j <= 3; j++ ) {
629 answer.
at(i, 2 * j - 1) +=
t_pspg * dV *
b [ i - 1 ] * n.
at(j);
630 answer.
at(i, 2 * j) +=
t_pspg * dV *
c [ i - 1 ] * n.
at(j);
643 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
646 double rho =
mat->give(
'd', gp);
650 for (
int i = 1; i <= 3; i++ ) {
651 for (
int j = 1; j <= 3; j++ ) {
652 answer.
at(i, j) +=
t_pspg * dV * (
b [ i - 1 ] *
b [ j - 1 ] +
c [ i - 1 ] *
c [ j - 1 ] ) / rho;
658#ifdef TR1_2D_SUPG2_DEBUG
662 TR1_2D_SUPG :: computePressureTerm_MC(test, tStep);
664 for (
int i = 1; i <= 3; i++ ) {
665 for (
int j = 1; j <= 3; j++ ) {
666 if ( fabs( ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j) ) >= 1.e-8 ) {
667 OOFEM_ERROR(
"test failure (err=%e)", ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j));
690 for (
int i = 1; i <= nLoads; i++ ) {
694 load->computeComponentArrayAt(gVector, tStep, VM_Total);
696 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
700 double coeff = rho * dV;
702 u = nV.
at(1) * un.
at(1) + nV.
at(2) * un.
at(3) + nV.
at(3) * un.
at(5);
703 v = nV.
at(1) * un.
at(2) + nV.
at(2) * un.
at(4) + nV.
at(3) * un.
at(6);
705 answer.
at(1) += coeff * ( gVector.
at(1) * ( nV.
at(1) +
t_supg * (
b [ 0 ] * u +
c [ 0 ] * v ) ) );
706 answer.
at(2) += coeff * ( gVector.
at(2) * ( nV.
at(1) +
t_supg * (
b [ 0 ] * u +
c [ 0 ] * v ) ) );
707 answer.
at(3) += coeff * ( gVector.
at(1) * ( nV.
at(2) +
t_supg * (
b [ 1 ] * u +
c [ 1 ] * v ) ) );
708 answer.
at(4) += coeff * ( gVector.
at(2) * ( nV.
at(2) +
t_supg * (
b [ 1 ] * u +
c [ 1 ] * v ) ) );
709 answer.
at(5) += coeff * ( gVector.
at(1) * ( nV.
at(3) +
t_supg * (
b [ 2 ] * u +
c [ 2 ] * v ) ) );
710 answer.
at(6) += coeff * ( gVector.
at(2) * ( nV.
at(3) +
t_supg * (
b [ 2 ] * u +
c [ 2 ] * v ) ) );
718 int n1, n2, code, sid;
719 double tx, ty, l, side_r;
729 n2 = ( n1 == 3 ? 1 : n1 + 1 );
733 l = sqrt(tx * tx + ty * ty);
735 side_r = 0.5 * (
giveNode(n2)->giveCoordinate(1) +
giveNode(n1)->giveCoordinate(1) );
742 for (
int i = 1; i <= numLoads; i++ ) {
751 bLoad->computeValueAt(t, tStep, coords, VM_Total);
755 answer.
at( ( n1 - 1 ) * 2 + 1 ) += t.
at(1) * side_r * l / 2.;
756 answer.
at(n1 * 2) += t.
at(2) * side_r * l / 2.;
758 answer.
at( ( n2 - 1 ) * 2 + 1 ) += t.
at(1) * side_r * l / 2.;
759 answer.
at(n2 * 2) += t.
at(2) * side_r * l / 2.;
778 for (
int i = 1; i <= nLoads; i++ ) {
784 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
787 double coeff =
t_pspg * dV;
789 answer.
at(1) += coeff * (
b [ 0 ] * gVector.
at(1) +
c [ 0 ] * gVector.
at(2) );
790 answer.
at(2) += coeff * (
b [ 1 ] * gVector.
at(1) +
c [ 1 ] * gVector.
at(2) );
791 answer.
at(3) += coeff * (
b [ 2 ] * gVector.
at(1) +
c [ 2 ] * gVector.
at(2) );
802TR1_2D_SUPG2_AXI :: updateStabilizationCoeffs(
TimeStep *tStep)
806 int i, j, k, l, w_dof_addr, u_dof_addr, ip, ifluid;
807 double __g_norm, __gamma_norm, __gammav_norm, __beta_norm, __betav_norm, __c_norm, __e_norm, __k_norm, __Re;
808 double __t_p1, __t_p2, __t_p3, __t_pv1, __t_pv2, __t_pv3;
809 double nu, nu0, nu1, usum, vsum, rho, dV, u1, u2;
822 nu =
vof * nu0 + ( 1. -
vof ) * nu1;
826 this->computeVectorOfVelocities(VM_Acceleration, tStep, a);
828 usum = un.
at(1) + un.
at(3) + un.
at(5);
829 vsum = un.
at(2) + un.
at(4) + un.
at(6);
835 double ar3 =
area / 3.0;
837 __tmp.
at(1, 1) = __tmp.
at(1, 2) = __tmp.
at(1, 3) =
b [ 0 ] * ar3;
838 __tmp.
at(3, 1) = __tmp.
at(3, 2) = __tmp.
at(3, 3) =
b [ 1 ] * ar3;
839 __tmp.
at(5, 1) = __tmp.
at(5, 2) = __tmp.
at(5, 3) =
b [ 2 ] * ar3;
841 __tmp.
at(2, 1) = __tmp.
at(2, 2) = __tmp.
at(2, 3) =
c [ 0 ] * ar3;
842 __tmp.
at(4, 1) = __tmp.
at(4, 2) = __tmp.
at(4, 3) =
c [ 1 ] * ar3;
843 __tmp.
at(6, 1) = __tmp.
at(6, 2) = __tmp.
at(6, 3) =
c [ 2 ] * ar3;
849 for ( k = 1; k <= 3; k++ ) {
850 for ( l = 1; l <= 3; l++ ) {
851 __tmp.
at(k, l * 2 - 1) = ar3 *
b [ k - 1 ] * ( usum *
b [ l - 1 ] + vsum *
c [ l - 1 ] );
852 __tmp.
at(k, l * 2) = ar3 *
c [ k - 1 ] * ( usum *
b [ l - 1 ] + vsum *
c [ l - 1 ] );
862 __tmp.
at(1, 1) = __tmp.
at(1, 3) = __tmp.
at(1, 5) = ar3 *
b [ 0 ];
863 __tmp.
at(1, 2) = __tmp.
at(1, 4) = __tmp.
at(1, 6) = ar3 *
c [ 0 ];
864 __tmp.
at(2, 1) = __tmp.
at(2, 3) = __tmp.
at(2, 5) = ar3 *
b [ 1 ];
865 __tmp.
at(2, 2) = __tmp.
at(2, 4) = __tmp.
at(2, 6) = ar3 *
c [ 1 ];
866 __tmp.
at(3, 1) = __tmp.
at(3, 3) = __tmp.
at(3, 5) = ar3 *
b [ 2 ];
867 __tmp.
at(3, 2) = __tmp.
at(3, 4) = __tmp.
at(3, 6) = ar3 *
c [ 2 ];
875 for ( ifluid = 0; ifluid < 2; ifluid++ ) {
881 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
882 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
883 for ( i = 1; i <= 2; i++ ) {
884 for ( k = 1; k <= 3; k++ ) {
885 for ( l = 1; l <= 3; l++ ) {
886 w_dof_addr = ( k - 1 ) * 2 + i;
887 u_dof_addr = ( l - 1 ) * 2 + i;
888 __tmp.
at(w_dof_addr, u_dof_addr) += rho * dV * n.
at(k) * ( u1 *
b [ l - 1 ] + u2 *
c [ l - 1 ] );
900 b [ 0 ],
c [ 0 ],
b [ 1 ],
c [ 1 ],
b [ 2 ],
c [ 2 ]
902 for ( ifluid = 0; ifluid < 2; ifluid++ ) {
907 for ( i = 1; i <= 6; i++ ) {
908 for ( j = 1; j <= 6; j++ ) {
909 __tmp.
at(i, j) += dV * rho * __n [ i - 1 ] * __n [ j - 1 ];
920 for ( ifluid = 0; ifluid < 2; ifluid++ ) {
926 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
927 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
928 for ( k = 1; k <= 3; k++ ) {
929 for ( l = 1; l <= 3; l++ ) {
930 __tmp.
at(k * 2 - 1, l * 2 - 1) += rho * dV * ( u1 *
b [ k - 1 ] + u2 *
c [ k - 1 ] ) * ( u1 *
b [ l - 1 ] + u2 *
c [ l - 1 ] );
931 __tmp.
at(k * 2, l * 2) += rho * dV * ( u1 *
b [ k - 1 ] + u2 *
c [ k - 1 ] ) * ( u1 *
b [ l - 1 ] + u2 *
c [ l - 1 ] );
938 double u_1, u_2, vnorm = 0.;
940 for ( i = 1; i <= 3; i++ ) {
942 u_1 = u.
at( ( im1 ) * 2 + 1 );
943 u_2 = u.
at( ( im1 ) * 2 + 2 );
944 vnorm =
max( vnorm, sqrt(u_1 * u_1 + u_2 * u_2) );
947 if ( vnorm == 0.0 ) {
951 this->
t_supg = 1. / sqrt( 1. / ( t_sugn2 * t_sugn2 ) );
955 __Re = vnorm * vnorm * __c_norm / __k_norm / nu;
957 __t_p1 = __g_norm / __gamma_norm;
959 __t_p3 = __t_p1 * __Re;
960 this->
t_pspg = 1. / sqrt( 1. / ( __t_p1 * __t_p1 ) + 1. / ( __t_p2 * __t_p2 ) + 1. / ( __t_p3 * __t_p3 ) );
963 __t_pv2 = __t_pv1 * __gammav_norm / __betav_norm;
964 __t_pv3 = __t_pv1 * __Re;
965 this->
t_supg = 1. / sqrt( 1. / ( __t_pv1 * __t_pv1 ) + 1. / ( __t_pv2 * __t_pv2 ) + 1. / ( __t_pv3 * __t_pv3 ) );
967 this->
t_lsic = __c_norm / __e_norm;
972 double h_ugn,
sum = 0.0, vnorm, t_sugn1, t_sugn2, t_sugn3, u_1, u_2, z, Re_ugn;
973 double dscale, uscale, lscale, tscale, dt;
997 nu =
vof * nu0 + ( 1. -
vof ) * nu1;
1002 for (
int i = 1; i <= 3; i++ ) {
1004 sum += fabs(u.
at( ( im1 ) * 2 + 1 ) *
b [ im1 ] / lscale + u.
at(im1 * 2 + 2) *
c [ im1 ] / lscale);
1013 for (
int i = 1; i <= 3; i++ ) {
1015 u_1 = u.
at( ( im1 ) * 2 + 1 );
1016 u_2 = u.
at( ( im1 ) * 2 + 2 );
1017 vnorm =
max( vnorm, sqrt(u_1 * u_1 + u_2 * u_2) );
1020 if ( ( vnorm == 0.0 ) || (
sum < vnorm * 1e-10 ) ) {
1024 this->
t_supg = 1. / sqrt( 1. / ( t_sugn2 * t_sugn2 ) );
1028 h_ugn = 2.0 * vnorm /
sum;
1031 t_sugn3 = h_ugn * h_ugn / 4.0 / nu;
1033 this->
t_supg = 1. / sqrt( 1. / ( t_sugn1 * t_sugn1 ) + 1. / ( t_sugn2 * t_sugn2 ) + 1. / ( t_sugn3 * t_sugn3 ) );
1036 Re_ugn = vnorm * h_ugn / ( 2. * nu );
1037 z = ( Re_ugn <= 3. ) ? Re_ugn / 3. : 1.0;
1038 this->
t_lsic = h_ugn * vnorm * z / 2.0;
1046 this->
t_supg *= uscale / lscale;
1047 this->
t_pspg *= 1. / ( lscale * dscale );
1048 this->
t_lsic *= ( dscale * uscale ) / ( lscale * lscale );
1061TR1_2D_SUPG2_AXI :: computeCriticalTimeStep(
TimeStep *tStep)
1123TR1_2D_SUPG2_AXI :: computeLEPLICVolumeFraction(
const FloatArray &n,
const double p,
LEPlic *matInterface,
bool updFlag)
1129 if ( answer > 1.000000001 ) {
1130 OOFEM_WARNING(
"VOF fraction out of bounds, vof = %e\n", answer);
1138TR1_2D_SUPG2_AXI :: formMaterialVolumePoly(
Polygon &matvolpoly,
LEPlic *matInterface,
1149 for (
int i = 1; i <= 3; i++ ) {
1154 x = this->
giveNode(i)->giveCoordinate(1);
1155 y = this->
giveNode(i)->giveCoordinate(2);
1170TR1_2D_SUPG2_AXI :: formVolumeInterfacePoly(
Polygon &matvolpoly,
LEPlic *matInterface,
1181 for (
int i = 1; i <= 3; i++ ) {
1186 x = this->
giveNode(i)->giveCoordinate(1);
1187 y = this->
giveNode(i)->giveCoordinate(2);
1190 if ( ( nx * x + ny * y +
p ) >= 0. ) {
1191 nodeIn [ i - 1 ] =
true;
1193 nodeIn [ i - 1 ] =
false;
1197 if ( nodeIn [ 0 ] && nodeIn [ 1 ] && nodeIn [ 2 ] ) {
1198 for (
int i = 1; i <= 3; i++ ) {
1203 x = this->
giveNode(i)->giveCoordinate(1);
1204 y = this->
giveNode(i)->giveCoordinate(2);
1212 }
else if ( !( nodeIn [ 0 ] || nodeIn [ 1 ] || nodeIn [ 2 ] ) ) {
1215 for (
int i = 1; i <= 3; i++ ) {
1216 next = i < 3 ? i + 1 : 1;
1217 if ( nodeIn [ i - 1 ] ) {
1223 this->
giveNode(i)->giveCoordinate(2) );
1229 if ( nodeIn [ next - 1 ] ^ nodeIn [ i - 1 ] ) {
1237 x = this->
giveNode(i)->giveCoordinate(1);
1238 y = this->
giveNode(i)->giveCoordinate(2);
1239 tx = this->
giveNode(next)->giveCoordinate(1) - x;
1240 ty = this->
giveNode(next)->giveCoordinate(2) - y;
1243 double s, sd = nx * tx + ny * ty;
1244 if ( fabs(sd) > 1.e-10 ) {
1245 s = ( -
p - ( nx * x + ny * y ) ) / sd;
1250 if ( nodeIn [ i - 1 ] ) {
1279TR1_2D_SUPG2_AXI :: updateVolumePolygons(
Polygon &referenceFluidPoly,
Polygon &secondFluidPoly,
int &rfPoints,
int &sfPoints,
1292 rfPoints = sfPoints = 0;
1293 referenceFluidPoly.
clear();
1294 secondFluidPoly.
clear();
1296 for (
int i = 1; i <= 3; i++ ) {
1297 x = this->
giveNode(i)->giveCoordinate(1);
1298 y = this->
giveNode(i)->giveCoordinate(2);
1300 if ( ( nx * x + ny * y +
p ) >= 0. ) {
1301 nodeIn [ i - 1 ] =
true;
1303 nodeIn [ i - 1 ] =
false;
1307 if ( nodeIn [ 0 ] && nodeIn [ 1 ] && nodeIn [ 2 ] ) {
1308 for (
int i = 1; i <= 3; i++ ) {
1309 x = this->
giveNode(i)->giveCoordinate(1);
1310 y = this->
giveNode(i)->giveCoordinate(2);
1318 }
else if ( !( nodeIn [ 0 ] || nodeIn [ 1 ] || nodeIn [ 2 ] ) ) {
1319 for (
int i = 1; i <= 3; i++ ) {
1320 x = this->
giveNode(i)->giveCoordinate(1);
1321 y = this->
giveNode(i)->giveCoordinate(2);
1330 for (
int i = 1; i <= 3; i++ ) {
1331 next = i < 3 ? i + 1 : 1;
1332 if ( nodeIn [ i - 1 ] ) {
1334 this->
giveNode(i)->giveCoordinate(2) );
1340 this->
giveNode(i)->giveCoordinate(2) );
1346 if ( nodeIn [ next - 1 ] ^ nodeIn [ i - 1 ] ) {
1348 x = this->
giveNode(i)->giveCoordinate(1);
1349 y = this->
giveNode(i)->giveCoordinate(2);
1350 tx = this->
giveNode(next)->giveCoordinate(1) - x;
1351 ty = this->
giveNode(next)->giveCoordinate(2) - y;
1353 double s, sd = nx * tx + ny * ty;
1354 if ( fabs(sd) > 1.e-10 ) {
1355 s = ( -
p - ( nx * x + ny * y ) ) / sd;
1363 if ( nodeIn [ i - 1 ] ) {
1387TR1_2D_SUPG2_AXI :: truncateMatVolume(
const Polygon &matvolpoly,
double &volume)
1393 g.
clip(clip, me, matvolpoly);
1395 EASValsSetColor(
gc [ 0 ].getActiveCrackColor() );
1401 return volume /
area;
1405TR1_2D_SUPG2_AXI :: formMyVolumePoly(
Polygon &me,
LEPlic *matInterface,
bool updFlag)
1412 for (
int i = 1; i <= 3; i++ ) {
1417 x = this->
giveNode(i)->giveCoordinate(1);
1418 y = this->
giveNode(i)->giveCoordinate(2);
1428TR1_2D_SUPG2_AXI :: computeMyVolume(
LEPlic *matInterface,
bool updFlag)
1430 double x1, x2, x3, y1, y2, y3;
1439 return 0.5 * ( x2 * y3 + x1 * y2 + y1 * x3 - x2 * y1 - x3 * y2 - x1 * y3 );
1453 for (
int i = 1; i <= 3; i++ ) {
1458 for (
int i = 1; i <= 3; i++ ) {
1459 center.
at(1) += this->
giveNode(i)->giveCoordinate(1);
1460 center.
at(2) += this->
giveNode(i)->giveCoordinate(2);
1464 center.
times(1. / 3.);
1468TR1_2D_SUPG2_AXI :: updateIntegrationRules()
1475 for (
int i = 0; i < 2; i++ ) {
1480 for (
int i = 1; i <= 3; i++ ) {
1481 x = this->
giveNode(i)->giveCoordinate(1);
1482 y = this->
giveNode(i)->giveCoordinate(2);
1484 myPoly [ 1 ].addVertex(v);
1489 for (
int i = 1; i <= 3; i++ ) {
1490 x = this->
giveNode(i)->giveCoordinate(1);
1491 y = this->
giveNode(i)->giveCoordinate(2);
1493 myPoly [ 0 ].addVertex(v);
1510 for (
int i = 0; i < 2; i++ ) {
1511 if (
c [ i ] == 3 ) {
1513 approx = & triaApprox;
1514 }
else if (
c [ i ] == 4 ) {
1516 approx = & quadApprox;
1517 }
else if (
c [ i ] == 0 ) {
1520 OOFEM_ERROR(
"cannot set up integration domain for %d vertex polygon",
c [ i ]);
1527 Polygon :: PolygonVertexIterator it(
myPoly + i);
1528 while ( it.giveNext(&
p) ) {
1529 vcoords [ i ].push_back( *
p->getCoords() );
1545 gp->setSubPatchCoordinates( gp->giveNaturalCoordinates() );
1546 gp->setNaturalCoordinates(lc);
1552 double dV, __area = 0.0;
1553 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
1562 double __err = fabs(__area-
area)/
area;
1563 if (__err > 1.e-6) {
1567 for (ifluid = 0; ifluid< 2; ifluid++) {
1585 r1 = this->
giveNode(1)->giveCoordinate(1);
1586 r2 = this->
giveNode(2)->giveCoordinate(1);
1587 r3 = this->
giveNode(3)->giveCoordinate(1);
1593 return n1 * r1 + n2 * r2 + n3 * r3;
1610 return _r *
det * weight;
1620 _b.
at(1, 1) =
b [ 0 ];
1622 _b.
at(1, 3) =
b [ 1 ];
1624 _b.
at(1, 5) =
b [ 2 ];
1626 _b.
at(2, 1) = 1. / _r;
1628 _b.
at(2, 3) = 1. / _r;
1630 _b.
at(2, 5) = 1. / _r;
1633 _b.
at(3, 2) =
c [ 0 ];
1635 _b.
at(3, 4) =
c [ 1 ];
1637 _b.
at(3, 6) =
c [ 2 ];
1638 _b.
at(4, 1) =
c [ 0 ];
1639 _b.
at(4, 2) =
b [ 0 ];
1640 _b.
at(4, 3) =
c [ 1 ];
1641 _b.
at(4, 4) =
b [ 1 ];
1642 _b.
at(4, 5) =
c [ 2 ];
1643 _b.
at(4, 6) =
b [ 2 ];
1672TR1_2D_SUPG2_AXI :: printOutputAt(FILE *file,
TimeStep *tStep)
1675 SUPGElement :: printOutputAt(file, tStep);
1690TR1_2D_SUPG2_AXI :: NodalAveragingRecoveryMI_computeNodalValue(
FloatArray &answer,
int node,
1704TR1_2D_SUPG2_AXI :: SPRNodalRecoveryMI_giveSPRAssemblyPoints(
IntArray &pap)
1713TR1_2D_SUPG2_AXI :: SPRNodalRecoveryMI_giveDofMansDeterminedByPatch(
IntArray &answer,
int pap)
1726TR1_2D_SUPG2_AXI :: SPRNodalRecoveryMI_giveNumberOfIP()
1731TR1_2D_SUPG2_AXI :: SPRNodalRecoveryMI_givePatchType()
1754return SUPGElement :: giveInternalStateAtNode(answer, type, mode, node, tStep);
1763 if ( !
gc.testElementGraphicActivity(
this) ) {
1768 EASValsSetColor(
gc.getElementColor() );
1769 EASValsSetEdgeColor(
gc.getElementEdgeColor() );
1770 EASValsSetEdgeFlag(
true);
1772 p [ 0 ].x = ( FPNum ) this->
giveNode(1)->giveCoordinate(1);
1773 p [ 0 ].y = ( FPNum ) this->
giveNode(1)->giveCoordinate(2);
1775 p [ 1 ].x = ( FPNum ) this->
giveNode(2)->giveCoordinate(1);
1776 p [ 1 ].y = ( FPNum ) this->
giveNode(2)->giveCoordinate(2);
1778 p [ 2 ].x = ( FPNum ) this->
giveNode(3)->giveCoordinate(1);
1779 p [ 2 ].y = ( FPNum ) this->
giveNode(3)->giveCoordinate(2);
1782 go = CreateTriangle3D(
p);
1783 EGWithMaskChangeAttributes(WIDTH_MASK | COLOR_MASK | EDGE_COLOR_MASK | EDGE_FLAG_MASK | LAYER_MASK, go);
1784 EGAttachObject(go, ( EObjectP )
this);
1785 EMAddGraphicsToModel(ESIModel(), go);
1790 int i, indx, result = 0;
1796 if ( !
gc.testElementGraphicActivity(
this) ) {
1803 if ( (
gc.giveIntVarType() == IST_VOFFraction ) && (
gc.giveIntVarMode() ==
ISM_local ) ) {
1806 EASValsSetColor(
gc.getStandardSparseProfileColor() );
1843 if ( result != 3 ) {
1847 indx =
gc.giveIntVarIndx();
1849 s [ 0 ] = v1.
at(indx);
1850 s [ 1 ] = v2.
at(indx);
1851 s [ 2 ] = v3.
at(indx);
1854 for ( i = 0; i < 3; i++ ) {
1855 p [ i ].x = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(1);
1856 p [ i ].y = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(2);
1861 gc.updateFringeTableMinMax(s, 3);
1862 tr = CreateTriangleWD3D(
p, s [ 0 ], s [ 1 ], s [ 2 ]);
1863 EGWithMaskChangeAttributes(LAYER_MASK, tr);
1864 EMAddGraphicsToModel(ESIModel(), tr);
1866 double landScale =
gc.getLandScale();
1868 for ( i = 0; i < 3; i++ ) {
1869 p [ i ].x = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(1);
1870 p [ i ].y = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(2);
1871 p [ i ].z = s [ i ] * landScale;
1875 EASValsSetColor(
gc.getDeformedElementColor() );
1877 EASValsSetFillStyle(FILL_SOLID);
1878 tr = CreateTriangle3D(
p);
1879 EGWithMaskChangeAttributes(WIDTH_MASK | COLOR_MASK | FILL_MASK | LAYER_MASK, tr);
1881 gc.updateFringeTableMinMax(s, 3);
1882 EASValsSetFillStyle(FILL_SOLID);
1883 tr = CreateTriangleWD3D(
p, s [ 0 ], s [ 1 ], s [ 2 ]);
1884 EGWithMaskChangeAttributes(FILL_MASK | LAYER_MASK, tr);
1887 EMAddGraphicsToModel(ESIModel(), tr);
#define REGISTER_Element(class)
Node * giveNode(int i) const
IntArray boundaryLoadArray
IntArray * giveBodyLoadArray()
Returns array containing load numbers of loads acting on element.
int numberOfDofMans
Number of dofmanagers.
IntArray * giveBoundaryLoadArray()
Returns array containing load numbers of boundary loads acting on element.
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
int material
Number of associated material.
CrossSection * giveCrossSection()
const Element_Geometry_Type giveGeometryType() const override
const Element_Geometry_Type giveGeometryType() const override
double giveTransformationJacobian(const FloatArray &lcoords, const FEICellGeometry &cellgeo) const override
int global2local(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const override
virtual const Element_Geometry_Type giveGeometryType() const =0
virtual double giveTransformationJacobian(const FloatArray &lcoords, const FEICellGeometry &cellgeo) const
virtual void local2global(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
Domain * giveDomain() const
Domain * domain
Link to domain object, useful for communicating with other FEM components.
int number
Component number.
void computeVectorOfVelocities(ValueModeType mode, TimeStep *tStep, FloatArray &velocities)
double computeNorm() const
void plusProduct(const FloatMatrix &b, const FloatArray &s, double dV)
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
void resize(Index rows, Index cols)
void plusProductUnsym(const FloatMatrix &a, const FloatMatrix &b, double dV)
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
void zero()
Zeroes all coefficient of receiver.
double computeFrobeniusNorm() const
double at(std::size_t i, std::size_t j) const
virtual double giveReynoldsNumber()=0
double giveNaturalCoordinate(int i) const
Returns i-th natural element coordinate of receiver.
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
const FloatArray & giveSubPatchCoordinates() const
Returns local sub-patch coordinates of the receiver.
double giveWeight()
Returns integration weight of receiver.
virtual bcGeomType giveBCGeoType() const
virtual bcValType giveBCValType() const
void clip(Polygon &result, const Polygon &a, const Polygon &b)
double giveVolumeFraction()
FloatArray normal
Interface segment normal.
void setPermanentVolumeFraction(double v)
double p
Line constant of line segment representing interface.
double vof
Volume fraction of reference fluid in element.
double giveUpdatedXCoordinate(int num)
void giveUpdatedCoordinate(FloatArray &answer, int num)
double giveUpdatedYCoordinate(int num)
virtual void computeComponentArrayAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
GraphicObj * draw(oofegGraphicContext &, bool filled, int layer=OOFEG_DEBUG_LAYER)
double computeVolume() const
IntArray boundaryCodes
Boundary sides codes.
IntArray boundarySides
Array of boundary sides.
std::vector< FloatArray > vcoords[2]
double computeVolumeAroundID(GaussPoint *gp, integrationDomain id, const std::vector< FloatArray > &idpoly)
void formVolumeInterfacePoly(Polygon &matvolpoly, LEPlic *matInterface, const FloatArray &normal, const double p, bool updFlag) override
Assembles receiver material polygon based solely on given interface line.
Material * _giveMaterial(int indx)
void computeBMtrx(FloatMatrix &answer, GaussPoint *gp)
void formMyVolumePoly(Polygon &myPoly, LEPlic *mat_interface, bool updFlag) override
Assembles receiver volume.
int giveInternalStateAtNode(FloatArray &answer, InternalStateType type, InternalStateMode mode, int node, TimeStep *tStep) override
void updateVolumePolygons(Polygon &referenceFluidPoly, Polygon &secondFluidPoly, int &rfPoints, int &sfPoints, const FloatArray &normal, const double p, bool updFlag)
double computeRadiusAt(GaussPoint *gp)
void formMaterialVolumePoly(Polygon &matvolpoly, LEPlic *matInterface, const FloatArray &normal, const double p, bool updFlag) override
Assembles the true element material polygon (takes receiver vof into accout).
void computeNVector(FloatArray &answer, GaussPoint *gp)
double computeMyVolume(LEPlic *matInterface, bool updFlag) override
Computes the volume of receiver.
static ParamKey IPK_TR1_2D_SUPG_vof
void computeNMtrx(FloatArray &answer, GaussPoint *gp)
TR1_2D_SUPG(int n, Domain *d)
static ParamKey IPK_TR1_2D_SUPG_pvof
virtual void initGeometry()
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
static ParamKey IPK_TR1_2D_SUPG_mat1
static ParamKey IPK_TR1_2D_SUPG_mat0
double giveTimeIncrement()
Returns solution step associated time increment.
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
void setCoords(double x, double y)
#define OOFEM_WARNING(...)
#define FMElement_PrescribedTractionBC
bcGeomType
Type representing the geometric character of loading.
@ BodyLoadBGT
Distributed body load.
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
InternalStateMode
Determines the mode of internal variable.
double det(const FloatMatrixF< 2, 2 > &mat)
Computes the determinant.
double sum(const FloatArray &x)
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
#define OOFEG_DEBUG_LAYER
#define OOFEG_VARPLOT_PATTERN_LAYER
#define OOFEG_DEFORMED_GEOMETRY_WIDTH
#define OOFEG_RAW_GEOMETRY_WIDTH
#define OOFEG_RAW_GEOMETRY_LAYER
#define PM_UPDATE_PARAMETER_AND_REPORT(_val, _pm, _ir, _componentnum, _paramkey, _prio, _flag)
#define PM_UPDATE_PARAMETER(_val, _pm, _ir, _componentnum, _paramkey, _prio)