68#define TRSUPG_ZERO_VOF 1.e-8
74TR1_2D_SUPG2 :: TR1_2D_SUPG2(
int n,
Domain *aDomain) :
89TR1_2D_SUPG2 :: computeNumberOfDofs()
95TR1_2D_SUPG2 :: giveDofManDofIDMask(
int inode,
IntArray &answer)
const
97 answer = {V_u, V_v, P_f};
103 SUPGElement :: initializeFrom(ir, priority);
109 if (flag && (
vof > 0.0)) {
132 SUPGElement :: giveInputRecord(input);
145TR1_2D_SUPG2 :: postInitialize()
154TR1_2D_SUPG2 :: computeGaussPoints()
163 defaultIRule = std::make_unique<GaussIntegrationRule>(1,
this, 1, 3,
true);
196 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
202 for (
int i = 1; i <= 3; i++ ) {
203 for (
int j = 1; j <= 3; j++ ) {
204 val = rho * n.
at(i) * n.
at(j) * dV;
205 answer.
at(i * 2 - 1, j * 2 - 1) += val;
206 answer.
at(i * 2, j * 2) += val;
215 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
220 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
221 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
222 for (
int i = 1; i <= 3; i++ ) {
223 for (
int j = 1; j <= 3; j++ ) {
224 val = dV * rho *
t_supg * ( u1 *
b [ i - 1 ] + u2 *
c [ i - 1 ] ) * n.
at(j);
225 answer.
at(i * 2, j * 2) += val;
226 answer.
at(i * 2 - 1, j * 2 - 1) += val;
263#ifdef TR1_2D_SUPG2_DEBUG
267 TR1_2D_SUPG :: computeAccelerationTerm_MB(test, tStep);
269 for ( i = 1; i <= 6; i++ ) {
270 for ( j = 1; j <= 6; j++ ) {
271 if ( fabs( ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j) ) >= 1.e-10 ) {
289 double dV, dudx, dudy, dvdx, dvdy, u1, u2;
294 dudx =
b [ 0 ] * u.
at(1) +
b [ 1 ] * u.
at(3) +
b [ 2 ] * u.
at(5);
295 dudy =
c [ 0 ] * u.
at(1) +
c [ 1 ] * u.
at(3) +
c [ 2 ] * u.
at(5);
296 dvdx =
b [ 0 ] * u.
at(2) +
b [ 1 ] * u.
at(4) +
b [ 2 ] * u.
at(6);
297 dvdy =
c [ 0 ] * u.
at(2) +
c [ 1 ] * u.
at(4) +
c [ 2 ] * u.
at(6);
300 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
306 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
307 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
308 for (
int i = 1; i <= 3; i++ ) {
309 answer.
at(i * 2 - 1) += rho * dV * n.
at(i) * ( u1 * dudx + u2 * dudy );
310 answer.
at(i * 2) += rho * dV * n.
at(i) * ( u1 * dvdx + u2 * dvdy );
316 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
322 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
323 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
324 for (
int i = 1; i <= 3; i++ ) {
325 answer.
at(i * 2 - 1) +=
t_supg * rho * dV * ( u1 *
b [ i - 1 ] + u2 *
c [ i - 1 ] ) * ( u1 * dudx + u2 * dudy );
326 answer.
at(i * 2) +=
t_supg * rho * dV * ( u1 *
b [ i - 1 ] + u2 *
c [ i - 1 ] ) * ( u1 * dvdx + u2 * dvdy );
337 for (
int i = 1; i <= 6; i++ ) {
338 if ( ( fabs( answer.
at(i) - _t.
at(i) ) >= 1.e-6 ) ) {
346#ifdef TR1_2D_SUPG2_DEBUG
350 TR1_2D_SUPG :: computeAdvectionTerm_MB(test, tStep);
352 for (
int i = 1; i <= 6; i++ ) {
353 if ( fabs( ( answer.
at(i) - test.
at(i) ) / test.
at(i) ) >= 1.e-10 ) {
374 int w_dof_addr, u_dof_addr, dij;
378 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
384 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
385 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
386 for (
int i = 1; i <= 2; i++ ) {
387 for (
int k = 1; k <= 3; k++ ) {
388 for (
int j = 1; j <= 2; j++ ) {
389 for (
int m = 1; m <= 3; m++ ) {
390 w_dof_addr = ( k - 1 ) * 2 + i;
391 u_dof_addr = ( m - 1 ) * 2 + j;
393 answer.
at(w_dof_addr, u_dof_addr) += rho * dV * n.
at(k) * ( u1 * dij *
b [ m - 1 ] + u2 * dij *
c [ m - 1 ] );
402 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
408 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
409 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
410 for (
int i = 1; i <= 2; i++ ) {
411 for (
int k = 1; k <= 3; k++ ) {
412 for (
int j = 1; j <= 2; j++ ) {
413 for (
int m = 1; m <= 3; m++ ) {
414 w_dof_addr = ( k - 1 ) * 2 + i;
415 u_dof_addr = ( m - 1 ) * 2 + j;
417 answer.
at(w_dof_addr, u_dof_addr) +=
t_supg * rho * dV * ( u1 *
b [ k - 1 ] + u2 *
c [ k - 1 ] ) * ( u1 * dij *
b [ m - 1 ] + u2 * dij *
c [ m - 1 ] );
425#ifdef TR1_2D_SUPG2_DEBUG
429 TR1_2D_SUPG :: computeAdvectionDerivativeTerm_MB(test, tStep);
431 for (
int i = 1; i <= 6; i++ ) {
432 for (
int j = 1; j <= 6; j++ ) {
433 if ( fabs( ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j) ) >= 1.e-8 ) {
434 OOFEM_ERROR(
"test failure (err=%e)", ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j));
454 eps.at(1) = (
b [ 0 ] * u.
at(1) +
b [ 1 ] * u.
at(3) +
b [ 2 ] * u.
at(5) );
455 eps.at(2) = (
c [ 0 ] * u.
at(2) +
c [ 1 ] * u.
at(4) +
c [ 2 ] * u.
at(6) );
456 eps.at(3) = (
b [ 0 ] * u.
at(2) +
b [ 1 ] * u.
at(4) +
b [ 2 ] * u.
at(6) +
c [ 0 ] * u.
at(1) +
c [ 1 ] * u.
at(3) +
c [ 2 ] * u.
at(5) );
466 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
471 stress = (1. / Re) *
mat->computeDeviatoricStress2D(eps, gp, tStep);
474 for (
int i = 0; i < 3; i++ ) {
477 answer.
at( ( i ) * 2 + 1 ) += dV * ( stress.
at(1) *
b [ i ] + stress.
at(3) *
c [ i ] );
478 answer.
at( ( i + 1 ) * 2 ) += dV * ( stress.
at(3) *
b [ i ] + stress.
at(2) *
c [ i ] );
489#ifdef TR1_2D_SUPG2_DEBUG
493 TR1_2D_SUPG :: computeDiffusionTerm_MB(test, tStep);
495 for (
int i = 1; i <= 6; i++ ) {
496 if ( fabs( ( answer.
at(i) - test.
at(i) ) / test.
at(i) ) >= 1.e-10 ) {
506TR1_2D_SUPG2 :: computeDiffusionDerivativeTerm_MB(
FloatMatrix &answer, MatResponseMode mode,
TimeStep *tStep)
515 _b.
at(1, 1) =
b [ 0 ];
517 _b.
at(1, 3) =
b [ 1 ];
519 _b.
at(1, 5) =
b [ 2 ];
522 _b.
at(2, 2) =
c [ 0 ];
524 _b.
at(2, 4) =
c [ 1 ];
526 _b.
at(2, 6) =
c [ 2 ];
527 _b.
at(3, 1) =
c [ 0 ];
528 _b.
at(3, 2) =
b [ 0 ];
529 _b.
at(3, 3) =
c [ 1 ];
530 _b.
at(3, 4) =
b [ 1 ];
531 _b.
at(3, 5) =
c [ 2 ];
532 _b.
at(3, 6) =
b [ 2 ];
549 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
554 _d =
mat->computeTangent2D(mode, gp, tStep);
563 answer.
times(1. / Re);
565#ifdef TR1_2D_SUPG2_DEBUG
569 TR1_2D_SUPG :: computeDiffusionDerivativeTerm_MB(test, mode, tStep);
571 for (
int i = 1; i <= 6; i++ ) {
572 for (
int j = 1; j <= 6; j++ ) {
573 if ( fabs( ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j) ) >= 1.e-8 ) {
574 OOFEM_ERROR(
"test failure (err=%e)", ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j));
591 double ar3 =
area / 3.0, coeff;
597 answer.
at(1, 1) = answer.
at(1, 2) = answer.
at(1, 3) = -
b [ 0 ] * ar3;
598 answer.
at(3, 1) = answer.
at(3, 2) = answer.
at(3, 3) = -
b [ 1 ] * ar3;
599 answer.
at(5, 1) = answer.
at(5, 2) = answer.
at(5, 3) = -
b [ 2 ] * ar3;
601 answer.
at(2, 1) = answer.
at(2, 2) = answer.
at(2, 3) = -
c [ 0 ] * ar3;
602 answer.
at(4, 1) = answer.
at(4, 2) = answer.
at(4, 3) = -
c [ 1 ] * ar3;
603 answer.
at(6, 1) = answer.
at(6, 2) = answer.
at(6, 3) = -
c [ 2 ] * ar3;
608 usum = un.
at(1) + un.
at(3) + un.
at(5);
609 vsum = un.
at(2) + un.
at(4) + un.
at(6);
612 answer.
at(1, 1) += coeff * ( usum *
b [ 0 ] *
b [ 0 ] + vsum *
c [ 0 ] *
b [ 0 ] );
613 answer.
at(1, 2) += coeff * ( usum *
b [ 0 ] *
b [ 1 ] + vsum *
c [ 0 ] *
b [ 1 ] );
614 answer.
at(1, 3) += coeff * ( usum *
b [ 0 ] *
b [ 2 ] + vsum *
c [ 0 ] *
b [ 2 ] );
616 answer.
at(3, 1) += coeff * ( usum *
b [ 1 ] *
b [ 0 ] + vsum *
c [ 1 ] *
b [ 0 ] );
617 answer.
at(3, 2) += coeff * ( usum *
b [ 1 ] *
b [ 1 ] + vsum *
c [ 1 ] *
b [ 1 ] );
618 answer.
at(3, 3) += coeff * ( usum *
b [ 1 ] *
b [ 2 ] + vsum *
c [ 1 ] *
b [ 2 ] );
620 answer.
at(5, 1) += coeff * ( usum *
b [ 2 ] *
b [ 0 ] + vsum *
c [ 2 ] *
b [ 0 ] );
621 answer.
at(5, 2) += coeff * ( usum *
b [ 2 ] *
b [ 1 ] + vsum *
c [ 2 ] *
b [ 1 ] );
622 answer.
at(5, 3) += coeff * ( usum *
b [ 2 ] *
b [ 2 ] + vsum *
c [ 2 ] *
b [ 2 ] );
624 answer.
at(2, 1) += coeff * ( usum *
b [ 0 ] *
c [ 0 ] + vsum *
c [ 0 ] *
c [ 0 ] );
625 answer.
at(2, 2) += coeff * ( usum *
b [ 0 ] *
c [ 1 ] + vsum *
c [ 0 ] *
c [ 1 ] );
626 answer.
at(2, 3) += coeff * ( usum *
b [ 0 ] *
c [ 2 ] + vsum *
c [ 0 ] *
c [ 2 ] );
628 answer.
at(4, 1) += coeff * ( usum *
b [ 1 ] *
c [ 0 ] + vsum *
c [ 1 ] *
c [ 0 ] );
629 answer.
at(4, 2) += coeff * ( usum *
b [ 1 ] *
c [ 1 ] + vsum *
c [ 1 ] *
c [ 1 ] );
630 answer.
at(4, 3) += coeff * ( usum *
b [ 1 ] *
c [ 2 ] + vsum *
c [ 1 ] *
c [ 2 ] );
632 answer.
at(6, 1) += coeff * ( usum *
b [ 2 ] *
c [ 0 ] + vsum *
c [ 2 ] *
c [ 0 ] );
633 answer.
at(6, 2) += coeff * ( usum *
b [ 2 ] *
c [ 1 ] + vsum *
c [ 2 ] *
c [ 1 ] );
634 answer.
at(6, 3) += coeff * ( usum *
b [ 2 ] *
c [ 2 ] + vsum *
c [ 2 ] *
c [ 2 ] );
646 b [ 0 ],
c [ 0 ],
b [ 1 ],
c [ 1 ],
b [ 2 ],
c [ 2 ]
649 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
655 for (
int i = 1; i <= 6; i++ ) {
656 for (
int j = 1; j <= 6; j++ ) {
657 answer.
at(i, j) += dV *
t_lsic * rho * n [ i - 1 ] * n [ j - 1 ];
663#ifdef TR1_2D_SUPG2_DEBUG
667 TR1_2D_SUPG :: computeLSICStabilizationTerm_MB(test, tStep);
669 for (
int i = 1; i <= 6; i++ ) {
670 for (
int j = 1; j <= 6; j++ ) {
671 if ( fabs( ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j) ) >= 1.e-8 ) {
672 OOFEM_ERROR(
"test failure (err=%e)", ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j));
684 TR1_2D_SUPG :: computeLinearAdvectionTerm_MC(answer, tStep);
692 double dudx, dudy, dvdx, dvdy, usum, vsum;
698 dudx =
b [ 0 ] * u.
at(1) +
b [ 1 ] * u.
at(3) +
b [ 2 ] * u.
at(5);
699 dudy =
c [ 0 ] * u.
at(1) +
c [ 1 ] * u.
at(3) +
c [ 2 ] * u.
at(5);
700 dvdx =
b [ 0 ] * u.
at(2) +
b [ 1 ] * u.
at(4) +
b [ 2 ] * u.
at(6);
701 dvdy =
c [ 0 ] * u.
at(2) +
c [ 1 ] * u.
at(4) +
c [ 2 ] * u.
at(6);
703 usum = un.
at(1) + un.
at(3) + un.
at(5);
704 vsum = un.
at(2) + un.
at(4) + un.
at(6);
708 answer.
at(1) = coeff * (
b [ 0 ] * ( dudx * usum + dudy * vsum ) +
c [ 0 ] * ( dvdx * usum + dvdy * vsum ) );
709 answer.
at(2) = coeff * (
b [ 1 ] * ( dudx * usum + dudy * vsum ) +
c [ 1 ] * ( dvdx * usum + dvdy * vsum ) );
710 answer.
at(3) = coeff * (
b [ 2 ] * ( dudx * usum + dudy * vsum ) +
c [ 2 ] * ( dvdx * usum + dvdy * vsum ) );
719 int w_dof_addr, u_dof_addr, d1j, d2j, km1, mm1;
725 double dudx [ 2 ] [ 2 ], usum [ 2 ];
728 dudx [ 0 ] [ 0 ] =
b [ 0 ] * u.
at(1) +
b [ 1 ] * u.
at(3) +
b [ 2 ] * u.
at(5);
729 dudx [ 0 ] [ 1 ] =
c [ 0 ] * u.
at(1) +
c [ 1 ] * u.
at(3) +
c [ 2 ] * u.
at(5);
730 dudx [ 1 ] [ 0 ] =
b [ 0 ] * u.
at(2) +
b [ 1 ] * u.
at(4) +
b [ 2 ] * u.
at(6);
731 dudx [ 1 ] [ 1 ] =
c [ 0 ] * u.
at(2) +
c [ 1 ] * u.
at(4) +
c [ 2 ] * u.
at(6);
732 usum [ 0 ] = un.
at(1) + un.
at(3) + un.
at(5);
733 usum [ 1 ] = un.
at(2) + un.
at(4) + un.
at(6);
737 for (
int k = 1; k <= 3; k++ ) {
739 for (
int j = 1; j <= 2; j++ ) {
740 for (
int m = 1; m <= 3; m++ ) {
742 u_dof_addr = ( m - 1 ) * 2 + j;
746 answer.
at(w_dof_addr, u_dof_addr) = coeff * ( 0.0 * d1j *
b [ km1 ] * dudx [ 0 ] [ 0 ] + d1j *
b [ km1 ] *
b [ mm1 ] * usum [ 0 ] +
747 0.0 * d2j *
b [ km1 ] * dudx [ 0 ] [ 1 ] + d1j *
b [ km1 ] *
c [ mm1 ] * usum [ 1 ] +
748 0.0 * d1j *
c [ km1 ] * dudx [ 1 ] [ 0 ] + d2j *
c [ km1 ] *
b [ mm1 ] * usum [ 0 ] +
749 0.0 * d2j *
c [ km1 ] * dudx [ 1 ] [ 1 ] + d2j *
c [ km1 ] *
c [ mm1 ] * usum [ 1 ] );
758 TR1_2D_SUPG :: computeAccelerationTerm_MC(answer, tStep);
769 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
775 for (
int i = 1; i <= 3; i++ ) {
776 for (
int j = 1; j <= 3; j++ ) {
777 answer.
at(i, j) +=
t_pspg * dV * (
b [ i - 1 ] *
b [ j - 1 ] +
c [ i - 1 ] *
c [ j - 1 ] ) / rho;
783#ifdef TR1_2D_SUPG2_DEBUG
787 TR1_2D_SUPG :: computePressureTerm_MC(test, tStep);
789 for (
int i = 1; i <= 3; i++ ) {
790 for (
int j = 1; j <= 3; j++ ) {
791 if ( fabs( ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j) ) >= 1.e-8 ) {
792 OOFEM_ERROR(
"test failure (err=%e)", ( answer.
at(i, j) - test.
at(i, j) ) / test.
at(i, j));
818 for (
int i = 1; i <= nLoads; i++ ) {
824 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
830 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
831 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
833 for ( i = 1; i <= 3; i++ ) {
834 answer.
at(i * 2 - 1) += rho * dV * gVector.
at(1) * ( n.
at(i) +
t_supg * ( u1 *
b [ i - 1 ] + u2 *
c [ i - 1 ] ) );
835 answer.
at(i * 2) += rho * dV * gVector.
at(2) * ( n.
at(i) +
t_supg * ( u1 *
b [ i - 1 ] + u2 *
c [ i - 1 ] ) );
852 for (
int i = 1; i <= nLoads; i++ ) {
855 load =
domain->giveLoad(lnum);
859 n2 = ( n1 == 3 ? 1 : n1 + 1 );
863 length = sqrt(tx * tx + ty * ty);
873 answer.
at( ( n1 - 1 ) * 2 + 1 ) += t.
at(1) *
length / 2.;
876 answer.
at( ( n2 - 1 ) * 2 + 1 ) += t.
at(1) *
length / 2.;
885#ifdef TR1_2D_SUPG2_DEBUG
889 TR1_2D_SUPG :: computeBCRhsTerm_MB(test, tStep);
891 for (
int i = 1; i <= 6; i++ ) {
892 if ( fabs( ( answer.
at(i) - test.
at(i) ) / test.
at(i) ) >= 1.e-10 ) {
903 TR1_2D_SUPG :: computeBCRhsTerm_MC(answer, tStep);
908TR1_2D_SUPG2 :: updateStabilizationCoeffs(
TimeStep *tStep)
912 int i, j, k, l, w_dof_addr, u_dof_addr, ip, ifluid;
913 double __g_norm, __gamma_norm, __gammav_norm, __beta_norm, __betav_norm, __c_norm, __e_norm, __k_norm, __Re;
914 double __t_p1, __t_p2, __t_p3, __t_pv1, __t_pv2, __t_pv3;
915 double nu, nu0, nu1, usum, vsum, rho, dV, u1, u2;
926 nu0 = this->
_giveMaterial(0)->giveCharacteristicValue(MRM_Viscosity, gp, tStep);
927 nu1 = this->
_giveMaterial(1)->giveCharacteristicValue(MRM_Viscosity, gp, tStep);
928 nu =
vof * nu0 + ( 1. -
vof ) * nu1;
932 this->computeVectorOfVelocities(VM_Acceleration, tStep, a);
935 usum = un.
at(1) + un.
at(3) + un.
at(5);
936 vsum = un.
at(2) + un.
at(4) + un.
at(6);
942 double ar3 =
area / 3.0;
944 __tmp.
at(1, 1) = __tmp.
at(1, 2) = __tmp.
at(1, 3) =
b [ 0 ] * ar3;
945 __tmp.
at(3, 1) = __tmp.
at(3, 2) = __tmp.
at(3, 3) =
b [ 1 ] * ar3;
946 __tmp.
at(5, 1) = __tmp.
at(5, 2) = __tmp.
at(5, 3) =
b [ 2 ] * ar3;
948 __tmp.
at(2, 1) = __tmp.
at(2, 2) = __tmp.
at(2, 3) =
c [ 0 ] * ar3;
949 __tmp.
at(4, 1) = __tmp.
at(4, 2) = __tmp.
at(4, 3) =
c [ 1 ] * ar3;
950 __tmp.
at(6, 1) = __tmp.
at(6, 2) = __tmp.
at(6, 3) =
c [ 2 ] * ar3;
956 for ( k = 1; k <= 3; k++ ) {
957 for ( l = 1; l <= 3; l++ ) {
958 __tmp.
at(k, l * 2 - 1) = ar3 *
b [ k - 1 ] * ( usum *
b [ l - 1 ] + vsum *
c [ l - 1 ] );
959 __tmp.
at(k, l * 2) = ar3 *
c [ k - 1 ] * ( usum *
b [ l - 1 ] + vsum *
c [ l - 1 ] );
969 __tmp.
at(1, 1) = __tmp.
at(1, 3) = __tmp.
at(1, 5) = ar3 *
b [ 0 ];
970 __tmp.
at(1, 2) = __tmp.
at(1, 4) = __tmp.
at(1, 6) = ar3 *
c [ 0 ];
971 __tmp.
at(2, 1) = __tmp.
at(2, 3) = __tmp.
at(2, 5) = ar3 *
b [ 1 ];
972 __tmp.
at(2, 2) = __tmp.
at(2, 4) = __tmp.
at(2, 6) = ar3 *
c [ 1 ];
973 __tmp.
at(3, 1) = __tmp.
at(3, 3) = __tmp.
at(3, 5) = ar3 *
b [ 2 ];
974 __tmp.
at(3, 2) = __tmp.
at(3, 4) = __tmp.
at(3, 6) = ar3 *
c [ 2 ];
982 for ( ifluid = 0; ifluid < 2; ifluid++ ) {
988 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
989 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
990 for ( i = 1; i <= 2; i++ ) {
991 for ( k = 1; k <= 3; k++ ) {
992 for ( l = 1; l <= 3; l++ ) {
993 w_dof_addr = ( k - 1 ) * 2 + i;
994 u_dof_addr = ( l - 1 ) * 2 + i;
995 __tmp.
at(w_dof_addr, u_dof_addr) += rho * dV * n.
at(k) * ( u1 *
b [ l - 1 ] + u2 *
c [ l - 1 ] );
1007 b [ 0 ],
c [ 0 ],
b [ 1 ],
c [ 1 ],
b [ 2 ],
c [ 2 ]
1009 for ( ifluid = 0; ifluid < 2; ifluid++ ) {
1014 for ( i = 1; i <= 6; i++ ) {
1015 for ( j = 1; j <= 6; j++ ) {
1016 __tmp.
at(i, j) += dV * rho * __n [ i - 1 ] * __n [ j - 1 ];
1027 for ( ifluid = 0; ifluid < 2; ifluid++ ) {
1033 u1 = n.
at(1) * un.
at(1) + n.
at(2) * un.
at(3) + n.
at(3) * un.
at(5);
1034 u2 = n.
at(1) * un.
at(2) + n.
at(2) * un.
at(4) + n.
at(3) * un.
at(6);
1035 for ( k = 1; k <= 3; k++ ) {
1036 for ( l = 1; l <= 3; l++ ) {
1037 __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 ] );
1038 __tmp.
at(k * 2, l * 2) += rho * dV * ( u1 *
b [ k - 1 ] + u2 *
c [ k - 1 ] ) * ( u1 *
b [ l - 1 ] + u2 *
c [ l - 1 ] );
1045 double u_1, u_2, vnorm = 0.;
1047 for ( i = 1; i <= 3; i++ ) {
1049 u_1 = u.
at( ( im1 ) * 2 + 1 );
1050 u_2 = u.
at( ( im1 ) * 2 + 2 );
1051 vnorm =
max( vnorm, sqrt(u_1 * u_1 + u_2 * u_2) );
1054 if ( vnorm == 0.0 ) {
1058 this->
t_supg = 1. / sqrt( 1. / ( t_sugn2 * t_sugn2 ) );
1062 __Re = vnorm * vnorm * __c_norm / __k_norm / nu;
1064 __t_p1 = __g_norm / __gamma_norm;
1066 __t_p3 = __t_p1 * __Re;
1067 this->
t_pspg = 1. / sqrt( 1. / ( __t_p1 * __t_p1 ) + 1. / ( __t_p2 * __t_p2 ) + 1. / ( __t_p3 * __t_p3 ) );
1070 __t_pv2 = __t_pv1 * __gammav_norm / __betav_norm;
1071 __t_pv3 = __t_pv1 * __Re;
1072 this->
t_supg = 1. / sqrt( 1. / ( __t_pv1 * __t_pv1 ) + 1. / ( __t_pv2 * __t_pv2 ) + 1. / ( __t_pv3 * __t_pv3 ) );
1074 this->
t_lsic = __c_norm / __e_norm;
1079 double h_ugn,
sum = 0.0, vnorm, t_sugn1, t_sugn2, t_sugn3, u_1, u_2, z, Re_ugn;
1080 double dscale, uscale, lscale, tscale, dt;
1092 double nu, nu0, nu1;
1104 nu =
vof * nu0 + ( 1. -
vof ) * nu1;
1109 for (
int i = 1; i <= 3; i++ ) {
1111 sum += fabs(u.
at( ( im1 ) * 2 + 1 ) *
b [ im1 ] / lscale + u.
at(im1 * 2 + 2) *
c [ im1 ] / lscale);
1120 for (
int i = 1; i <= 3; i++ ) {
1122 u_1 = u.
at( ( im1 ) * 2 + 1 );
1123 u_2 = u.
at( ( im1 ) * 2 + 2 );
1124 vnorm =
max( vnorm, sqrt(u_1 * u_1 + u_2 * u_2) );
1127 if ( ( vnorm == 0.0 ) || (
sum == 0.0 ) ) {
1131 this->
t_supg = 1. / sqrt( 1. / ( t_sugn2 * t_sugn2 ) );
1135 h_ugn = 2.0 * vnorm /
sum;
1138 t_sugn3 = h_ugn * h_ugn / 4.0 / nu;
1140 this->
t_supg = 1. / sqrt( 1. / ( t_sugn1 * t_sugn1 ) + 1. / ( t_sugn2 * t_sugn2 ) + 1. / ( t_sugn3 * t_sugn3 ) );
1143 Re_ugn = vnorm * h_ugn / ( 2. * nu );
1144 z = ( Re_ugn <= 3. ) ? Re_ugn / 3. : 1.0;
1145 this->
t_lsic = h_ugn * vnorm * z / 2.0;
1153 this->
t_supg *= uscale / lscale;
1154 this->
t_pspg *= 1. / ( lscale * dscale );
1155 this->
t_lsic *= ( dscale * uscale ) / ( lscale * lscale );
1168TR1_2D_SUPG2 :: computeCriticalTimeStep(
TimeStep *tStep)
1250TR1_2D_SUPG2 :: computeLEPLICVolumeFraction(
const FloatArray &n,
const double p,
LEPlic *matInterface,
bool updFlag)
1256 if ( answer > 1.000000001 ) {
1257 OOFEM_WARNING(
"VOF fraction out of bounds, vof = %e\n", answer);
1265TR1_2D_SUPG2 :: formMaterialVolumePoly(
Polygon &matvolpoly,
LEPlic *matInterface,
1276 for (
int i = 1; i <= 3; i++ ) {
1281 x = this->
giveNode(i)->giveCoordinate(1);
1282 y = this->
giveNode(i)->giveCoordinate(2);
1297TR1_2D_SUPG2 :: formVolumeInterfacePoly(
Polygon &matvolpoly,
LEPlic *matInterface,
1308 for (
int i = 1; i <= 3; i++ ) {
1313 x = this->
giveNode(i)->giveCoordinate(1);
1314 y = this->
giveNode(i)->giveCoordinate(2);
1317 if ( ( nx * x + ny * y +
p ) >= 0. ) {
1318 nodeIn [ i - 1 ] =
true;
1320 nodeIn [ i - 1 ] =
false;
1324 if ( nodeIn [ 0 ] && nodeIn [ 1 ] && nodeIn [ 2 ] ) {
1325 for (
int i = 1; i <= 3; i++ ) {
1330 x = this->
giveNode(i)->giveCoordinate(1);
1331 y = this->
giveNode(i)->giveCoordinate(2);
1339 }
else if ( !( nodeIn [ 0 ] || nodeIn [ 1 ] || nodeIn [ 2 ] ) ) {
1342 for (
int i = 1; i <= 3; i++ ) {
1343 next = i < 3 ? i + 1 : 1;
1344 if ( nodeIn [ i - 1 ] ) {
1350 this->
giveNode(i)->giveCoordinate(2) );
1356 if ( nodeIn [ next - 1 ] ^ nodeIn [ i - 1 ] ) {
1364 x = this->
giveNode(i)->giveCoordinate(1);
1365 y = this->
giveNode(i)->giveCoordinate(2);
1366 tx = this->
giveNode(next)->giveCoordinate(1) - x;
1367 ty = this->
giveNode(next)->giveCoordinate(2) - y;
1370 double s, sd = nx * tx + ny * ty;
1371 if ( fabs(sd) > 1.e-10 ) {
1372 s = ( -
p - ( nx * x + ny * y ) ) / sd;
1377 if ( nodeIn [ i - 1 ] ) {
1406TR1_2D_SUPG2 :: updateVolumePolygons(
Polygon &referenceFluidPoly,
Polygon &secondFluidPoly,
int &rfPoints,
int &sfPoints,
1419 rfPoints = sfPoints = 0;
1420 referenceFluidPoly.
clear();
1421 secondFluidPoly.
clear();
1423 for (
int i = 1; i <= 3; i++ ) {
1424 x = this->
giveNode(i)->giveCoordinate(1);
1425 y = this->
giveNode(i)->giveCoordinate(2);
1427 if ( ( nx * x + ny * y +
p ) >= 0. ) {
1428 nodeIn [ i - 1 ] =
true;
1430 nodeIn [ i - 1 ] =
false;
1434 if ( nodeIn [ 0 ] && nodeIn [ 1 ] && nodeIn [ 2 ] ) {
1435 for (
int i = 1; i <= 3; i++ ) {
1436 x = this->
giveNode(i)->giveCoordinate(1);
1437 y = this->
giveNode(i)->giveCoordinate(2);
1445 }
else if ( !( nodeIn [ 0 ] || nodeIn [ 1 ] || nodeIn [ 2 ] ) ) {
1446 for (
int i = 1; i <= 3; i++ ) {
1447 x = this->
giveNode(i)->giveCoordinate(1);
1448 y = this->
giveNode(i)->giveCoordinate(2);
1457 for (
int i = 1; i <= 3; i++ ) {
1458 next = i < 3 ? i + 1 : 1;
1459 if ( nodeIn [ i - 1 ] ) {
1461 this->
giveNode(i)->giveCoordinate(2) );
1467 this->
giveNode(i)->giveCoordinate(2) );
1473 if ( nodeIn [ next - 1 ] ^ nodeIn [ i - 1 ] ) {
1475 x = this->
giveNode(i)->giveCoordinate(1);
1476 y = this->
giveNode(i)->giveCoordinate(2);
1477 tx = this->
giveNode(next)->giveCoordinate(1) - x;
1478 ty = this->
giveNode(next)->giveCoordinate(2) - y;
1480 double s, sd = nx * tx + ny * ty;
1481 if ( fabs(sd) > 1.e-10 ) {
1482 s = ( -
p - ( nx * x + ny * y ) ) / sd;
1490 if ( nodeIn [ i - 1 ] ) {
1514TR1_2D_SUPG2 :: truncateMatVolume(
const Polygon &matvolpoly,
double &volume)
1520 g.
clip(clip, me, matvolpoly);
1522 EASValsSetColor(
gc [ 0 ].getActiveCrackColor() );
1528 return volume /
area;
1532TR1_2D_SUPG2 :: formMyVolumePoly(
Polygon &me,
LEPlic *matInterface,
bool updFlag)
1539 for (
int i = 1; i <= 3; i++ ) {
1544 x = this->
giveNode(i)->giveCoordinate(1);
1545 y = this->
giveNode(i)->giveCoordinate(2);
1555TR1_2D_SUPG2 :: computeMyVolume(
LEPlic *matInterface,
bool updFlag)
1557 double x1, x2, x3, y1, y2, y3;
1566 return 0.5 * ( x2 * y3 + x1 * y2 + y1 * x3 - x2 * y1 - x3 * y2 - x1 * y3 );
1580 for (
int i = 1; i <= 3; i++ ) {
1585 for (
int i = 1; i <= 3; i++ ) {
1586 center.
at(1) += this->
giveNode(i)->giveCoordinate(1);
1587 center.
at(2) += this->
giveNode(i)->giveCoordinate(2);
1591 center.
times(1. / 3.);
1616 for (
int i = 1; i <= dofId.
giveSize(); i++ ) {
1619 for (
int j = 1; j <= 3; j++ ) {
1620 sum += lc.
at(j) * elemvector.
at(es * ( j - 1 ) + indx);
1632 OOFEM_ERROR(
"target point not in receiver volume");
1640 SUPGElement :: updateYourself(tStep);
1641 LEPlicElementInterface :: updateYourself(tStep);
1646TR1_2D_SUPG2 :: updateIntegrationRules()
1652 for (
int i = 0; i < 2; i++ ) {
1657 for (
int i = 1; i <= 3; i++ ) {
1658 x = this->
giveNode(i)->giveCoordinate(1);
1659 y = this->
giveNode(i)->giveCoordinate(2);
1661 myPoly [ 1 ].addVertex(v);
1666 for (
int i = 1; i <= 3; i++ ) {
1667 x = this->
giveNode(i)->giveCoordinate(1);
1668 y = this->
giveNode(i)->giveCoordinate(2);
1670 myPoly [ 0 ].addVertex(v);
1687 for (
int i = 0; i < 2; i++ ) {
1688 if (
c [ i ] == 3 ) {
1690 approx = & triaApprox;
1691 }
else if (
c [ i ] == 4 ) {
1693 approx = & quadApprox;
1694 }
else if (
c [ i ] == 0 ) {
1697 OOFEM_ERROR(
"cannot set up integration domain for %d vertex polygon",
c [ i ]);
1713 Polygon :: PolygonVertexIterator it(
myPoly + i);
1714 while ( it.giveNext(&
p) ) {
1715 vcoords [ i ].push_back( *
p->getCoords() );
1725 gp->setSubPatchCoordinates( gp->giveNaturalCoordinates() );
1726 gp->setNaturalCoordinates(lc);
1732 double dV, __area = 0.0;
1733 for (
int ifluid = 0; ifluid < 2; ifluid++ ) {
1741 double __err = fabs(__area -
area) /
area;
1742 if ( __err > 1.e-6 ) {
1743 OOFEM_ERROR(
"volume inconsistency (%5.2f)", __err * 100);
1769 return det * weight;
1783 if ( type == IST_VOFFraction ) {
1788 return TR1_2D_SUPG :: giveIPValue(answer, gp, type, tStep);
1793TR1_2D_SUPG2 :: NodalAveragingRecoveryMI_computeNodalValue(
FloatArray &answer,
int node,
1807TR1_2D_SUPG2 :: SPRNodalRecoveryMI_giveSPRAssemblyPoints(
IntArray &pap)
1816TR1_2D_SUPG2 :: SPRNodalRecoveryMI_giveDofMansDeterminedByPatch(
IntArray &answer,
int pap)
1829TR1_2D_SUPG2 :: SPRNodalRecoveryMI_giveNumberOfIP()
1836TR1_2D_SUPG2 :: SPRNodalRecoveryMI_givePatchType()
1843TR1_2D_SUPG2 :: printOutputAt(FILE *file,
TimeStep *tStep)
1846 SUPGElement :: printOutputAt(file, tStep);
1859 fprintf(file,
"VOF %e, density %e\n\n",
vof, rho0*
vof + rho1*(1-
vof));
1865 SUPGElement :: saveContext(stream, mode);
1866 LEPlicElementInterface :: saveContext(stream, mode);
1872 SUPGElement :: restoreContext(stream, mode);
1873 LEPlicElementInterface :: restoreContext(stream, mode);
1893return SUPGElement :: giveInternalStateAtNode(answer, type, mode, node, tStep);
1902 if ( !
gc.testElementGraphicActivity(
this) ) {
1907 EASValsSetColor(
gc.getElementColor() );
1908 EASValsSetEdgeColor(
gc.getElementEdgeColor() );
1909 EASValsSetEdgeFlag(
true);
1911 p [ 0 ].x = ( FPNum ) this->
giveNode(1)->giveCoordinate(1);
1912 p [ 0 ].y = ( FPNum ) this->
giveNode(1)->giveCoordinate(2);
1914 p [ 1 ].x = ( FPNum ) this->
giveNode(2)->giveCoordinate(1);
1915 p [ 1 ].y = ( FPNum ) this->
giveNode(2)->giveCoordinate(2);
1917 p [ 2 ].x = ( FPNum ) this->
giveNode(3)->giveCoordinate(1);
1918 p [ 2 ].y = ( FPNum ) this->
giveNode(3)->giveCoordinate(2);
1921 go = CreateTriangle3D(
p);
1922 EGWithMaskChangeAttributes(WIDTH_MASK | COLOR_MASK | EDGE_COLOR_MASK | EDGE_FLAG_MASK | LAYER_MASK, go);
1923 EGAttachObject(go, ( EObjectP )
this);
1924 EMAddGraphicsToModel(ESIModel(), go);
1929 int i, indx, result = 0;
1935 if ( !
gc.testElementGraphicActivity(
this) ) {
1942 if ( (
gc.giveIntVarType() == IST_VOFFraction ) && (
gc.giveIntVarMode() ==
ISM_local ) ) {
1945 EASValsSetColor(
gc.getStandardSparseProfileColor() );
1982 if ( result != 3 ) {
1986 indx =
gc.giveIntVarIndx();
1988 s [ 0 ] = v1.
at(indx);
1989 s [ 1 ] = v2.
at(indx);
1990 s [ 2 ] = v3.
at(indx);
1993 for ( i = 0; i < 3; i++ ) {
1994 p [ i ].x = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(1);
1995 p [ i ].y = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(2);
2000 gc.updateFringeTableMinMax(s, 3);
2001 tr = CreateTriangleWD3D(
p, s [ 0 ], s [ 1 ], s [ 2 ]);
2002 EGWithMaskChangeAttributes(LAYER_MASK, tr);
2003 EMAddGraphicsToModel(ESIModel(), tr);
2005 double landScale =
gc.getLandScale();
2007 for ( i = 0; i < 3; i++ ) {
2008 p [ i ].x = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(1);
2009 p [ i ].y = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(2);
2010 p [ i ].z = s [ i ] * landScale;
2014 EASValsSetColor(
gc.getDeformedElementColor() );
2016 EASValsSetFillStyle(FILL_SOLID);
2017 tr = CreateTriangle3D(
p);
2018 EGWithMaskChangeAttributes(WIDTH_MASK | COLOR_MASK | FILL_MASK | LAYER_MASK, tr);
2020 gc.updateFringeTableMinMax(s, 3);
2021 EASValsSetFillStyle(FILL_SOLID);
2022 tr = CreateTriangleWD3D(
p, s [ 0 ], s [ 1 ], s [ 2 ]);
2023 EGWithMaskChangeAttributes(FILL_MASK | LAYER_MASK, tr);
2026 EMAddGraphicsToModel(ESIModel(), tr);
double length(const Vector &a)
#define REGISTER_Element(class)
void computeValueAt(FloatArray &answer, TimeStep *tStep, const FloatArray &coords, ValueModeType mode) override
virtual void giveElementDofIDMask(IntArray &answer) const
Node * giveNode(int i) const
IntArray boundaryLoadArray
IntArray * giveBodyLoadArray()
Returns array containing load numbers of loads acting on element.
int numberOfDofMans
Number of dofmanagers.
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
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()
virtual bool computeLocalCoordinates(FloatArray &answer, const FloatArray &gcoords)
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 computeVectorOfPressures(ValueModeType mode, TimeStep *tStep, FloatArray &pressures)
void computeVectorOfVelocities(ValueModeType mode, TimeStep *tStep, FloatArray &velocities)
double computeNorm() const
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 plusProductSymmUpper(const FloatMatrix &a, const FloatMatrix &b, double dV)
void resize(Index rows, Index cols)
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
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)
int findFirstIndexOf(int value) const
double giveVolumeFraction()
FloatArray normal
Interface segment normal.
void setPermanentVolumeFraction(double v)
double p
Line constant of line segment representing interface.
double giveTempVolumeFraction()
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
double computeVolumeAroundID(GaussPoint *gp, integrationDomain id, const std::vector< FloatArray > &idpoly)
void updateVolumePolygons(Polygon &referenceFluidPoly, Polygon &secondFluidPoly, int &rfPoints, int &sfPoints, const FloatArray &normal, const double p, bool updFlag)
int giveInternalStateAtNode(FloatArray &answer, InternalStateType type, InternalStateMode mode, int node, TimeStep *tStep) override
void formMyVolumePoly(Polygon &myPoly, LEPlic *mat_interface, bool updFlag) override
Assembles receiver volume.
void updateIntegrationRules()
std ::unique_ptr< IntegrationRule > defaultIRule
std::vector< FloatArray > vcoords[2]
double computeMyVolume(LEPlic *matInterface, bool updFlag) override
Computes the volume of receiver.
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 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 computeAdvectionDerivativeTerm_MB(FloatMatrix &answer, TimeStep *tStep) override
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
void computeNVector(FloatArray &answer, GaussPoint *gp)
void computeGaussPoints() override
static ParamKey IPK_TR1_2D_SUPG_vof
TR1_2D_SUPG(int n, Domain *d)
static ParamKey IPK_TR1_2D_SUPG_pvof
virtual void initGeometry()
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(...)
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)
@ SPRNodalRecoveryModelInterfaceType
@ ZZNodalRecoveryModelInterfaceType
@ EIPrimaryFieldInterfaceType
@ LEPlicElementInterfaceType
@ SpatialLocalizerInterfaceType
@ NodalAveragingRecoveryModelInterfaceType
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)