235Tet1_3D_SUPG :: updateStabilizationCoeffs(
TimeStep *tStep)
239 double h_ugn,
sum = 0.0, vnorm, t_sugn1, t_sugn2, t_sugn3, u_1, u_2, u_3, z, Re_ugn;
240 double dscale, uscale, lscale, tscale, dt;
261 GaussPoint *gp_first = iRule->getIntegrationPoint(0);
265 for (
auto *gp: *iRule ) {
271 sum *= ( 1. / lscale / iRule->giveNumberOfIntegrationPoints() );
283 u_1 = u.
at( ( im1 ) * nsd + 1 );
284 u_2 = u.
at( ( im1 ) * nsd + 2 );
286 u_3 = u.
at( ( im1 ) * nsd + 3 );
291 vnorm =
max( vnorm, sqrt(u_1 * u_1 + u_2 * u_2 + u_3 * u_3) );
294 if ( ( vnorm == 0.0 ) || (
sum < vnorm * 1e-10 ) ) {
298 this->
t_supg = 1. / sqrt( 1. / ( t_sugn2 * t_sugn2 ) );
302 h_ugn = 2.0 * vnorm /
sum;
305 t_sugn3 = h_ugn * h_ugn / 4.0 / nu;
307 this->
t_supg = 1. / sqrt( 1. / ( t_sugn1 * t_sugn1 ) + 1. / ( t_sugn2 * t_sugn2 ) + 1. / ( t_sugn3 * t_sugn3 ) );
310 Re_ugn = vnorm * h_ugn / ( 2. * nu );
311 z = ( Re_ugn <= 3. ) ? Re_ugn / 3. : 1.0;
312 this->
t_lsic = h_ugn * vnorm * z / 2.0;
320 this->
t_supg *= uscale / lscale;
321 this->
t_pspg *= 1. / ( lscale * dscale );
322 this->
t_lsic *= ( dscale * uscale ) / ( lscale * lscale );
477 int neg = 0, pos = 0,
zero = 0, si = 0;
481 for (
double ifi: fi ) {
484 }
else if ( ifi < 0. ) {
495 }
else if ( pos == 0 ) {
499 }
else if (
zero == 4 ) {
507 if (
max(pos, neg) == 3 ) {
509 for (
int i = 1; i <= 4; i++ ) {
510 if ( ( pos > neg ) && ( fi.
at(i) < 0.0 ) ) {
515 if ( ( pos < neg ) && ( fi.
at(i) >= 0.0 ) ) {
522 x1 = this->
giveNode(si)->giveCoordinate(1);
523 y1 = this->
giveNode(si)->giveCoordinate(2);
524 z1 = this->
giveNode(si)->giveCoordinate(3);
528 double t, xi [ 3 ], yi [ 3 ], zi [ 3 ];
530 for (
int i = 0; i < 3; i++ ) {
531 ii = ( si + i ) % 4 + 1;
532 t = fi.
at(si) / ( fi.
at(si) - fi.
at(ii) );
533 xi [ i ] = x1 + t * ( this->
giveNode(ii)->giveCoordinate(1) - x1 );
534 yi [ i ] = y1 + t * ( this->
giveNode(ii)->giveCoordinate(2) - y1 );
535 zi [ i ] = z1 + t * ( this->
giveNode(ii)->giveCoordinate(3) - z1 );
539 double __vol = fabs( ( 1. / 6. ) * ( ( x1 - xi [ 0 ] ) * ( ( yi [ 1 ] - yi [ 0 ] ) * ( zi [ 2 ] - zi [ 0 ] ) - ( zi [ 1 ] - zi [ 0 ] ) * ( yi [ 2 ] - yi [ 0 ] ) ) +
540 ( y1 - yi [ 0 ] ) * ( ( zi [ 1 ] - zi [ 0 ] ) * ( xi [ 2 ] - xi [ 0 ] ) - ( xi [ 1 ] - xi [ 0 ] ) * ( zi [ 2 ] - zi [ 0 ] ) ) +
541 ( z1 - zi [ 0 ] ) * ( ( xi [ 1 ] - xi [ 0 ] ) * ( yi [ 2 ] - yi [ 0 ] ) - ( yi [ 1 ] - yi [ 0 ] ) * ( xi [ 2 ] - xi [ 0 ] ) ) ) );
545 if ( ( fabs(__vol) - vol ) < 0.0000001 ) {
546 __vol =
sgn(__vol) * vol;
549 if ( ( __vol < 0 ) || ( fabs(__vol) / vol > 1.0000001 ) ) {
555 answer.
at(2) =
min(fabs(__vol) / vol, 1.0);
556 answer.
at(1) = 1.0 - answer.
at(2);
559 answer.
at(1) =
min(fabs(__vol) / vol, 1.0);
560 answer.
at(2) = 1.0 - answer.
at(1);
565 }
else if (
max(pos, neg) == 2 ) {
569 for (
int i = 1; i <= 4; i++ ) {
570 if ( fi.
at(i) >= 0.0 ) {
582 double p1i_x [ 3 ], p1i_y [ 3 ], p1i_z [ 3 ];
583 double p2i_x [ 3 ], p2i_y [ 3 ], p2i_z [ 3 ];
587 p1i_x [ 0 ] = this->
giveNode(p1)->giveCoordinate(1);
588 p1i_y [ 0 ] = this->
giveNode(p1)->giveCoordinate(2);
589 p1i_z [ 0 ] = this->
giveNode(p1)->giveCoordinate(3);
591 p2i_x [ 0 ] = this->
giveNode(p2)->giveCoordinate(1);
592 p2i_y [ 0 ] = this->
giveNode(p2)->giveCoordinate(2);
593 p2i_z [ 0 ] = this->
giveNode(p2)->giveCoordinate(3);
596 for (
int i = 0; i < 3; i++ ) {
597 ii = ( p1 + i ) % 4 + 1;
598 if ( ( ii == p2 ) || ( ii == p1 ) ) {
602 t = fi.
at(p1) / ( fi.
at(p1) - fi.
at(ii) );
603 p1i_x [ _ind ] = p1i_x [ 0 ] + t * ( this->
giveNode(ii)->giveCoordinate(1) - p1i_x [ 0 ] );
604 p1i_y [ _ind ] = p1i_y [ 0 ] + t * ( this->
giveNode(ii)->giveCoordinate(2) - p1i_y [ 0 ] );
605 p1i_z [ _ind ] = p1i_z [ 0 ] + t * ( this->
giveNode(ii)->giveCoordinate(3) - p1i_z [ 0 ] );
607 t = fi.
at(p2) / ( fi.
at(p2) - fi.
at(ii) );
608 p2i_x [ _ind ] = p2i_x [ 0 ] + t * ( this->
giveNode(ii)->giveCoordinate(1) - p2i_x [ 0 ] );
609 p2i_y [ _ind ] = p2i_y [ 0 ] + t * ( this->
giveNode(ii)->giveCoordinate(2) - p2i_y [ 0 ] );
610 p2i_z [ _ind++ ] = p2i_z [ 0 ] + t * ( this->
giveNode(ii)->giveCoordinate(3) - p2i_z [ 0 ] );
615 double __v1 = ( ( p2i_x [ 0 ] - p1i_x [ 0 ] ) * ( p1i_y [ 1 ] - p1i_y [ 0 ] ) * ( p1i_z [ 2 ] - p1i_z [ 0 ] ) -
616 ( p2i_x [ 0 ] - p1i_x [ 0 ] ) * ( p1i_y [ 2 ] - p1i_y [ 0 ] ) * ( p1i_z [ 1 ] - p1i_z [ 0 ] ) +
617 ( p1i_x [ 2 ] - p1i_x [ 0 ] ) * ( p2i_y [ 0 ] - p1i_y [ 0 ] ) * ( p1i_z [ 1 ] - p1i_z [ 0 ] ) -
618 ( p1i_x [ 1 ] - p1i_x [ 0 ] ) * ( p2i_y [ 0 ] - p1i_y [ 0 ] ) * ( p1i_z [ 2 ] - p1i_z [ 0 ] ) +
619 ( p1i_x [ 1 ] - p1i_x [ 0 ] ) * ( p1i_y [ 2 ] - p1i_y [ 0 ] ) * ( p2i_z [ 0 ] - p1i_z [ 0 ] ) -
620 ( p1i_x [ 2 ] - p1i_x [ 0 ] ) * ( p1i_y [ 1 ] - p1i_y [ 0 ] ) * ( p2i_z [ 0 ] - p1i_z [ 0 ] ) ) / 6.0;
622 double __v2 = ( ( p2i_x [ 0 ] - p1i_x [ 1 ] ) * ( p1i_y [ 2 ] - p1i_y [ 1 ] ) * ( p2i_z [ 1 ] - p1i_z [ 1 ] ) -
623 ( p2i_x [ 0 ] - p1i_x [ 1 ] ) * ( p2i_y [ 1 ] - p1i_y [ 1 ] ) * ( p1i_z [ 2 ] - p1i_z [ 1 ] ) +
624 ( p2i_x [ 1 ] - p1i_x [ 1 ] ) * ( p2i_y [ 0 ] - p1i_y [ 1 ] ) * ( p1i_z [ 2 ] - p1i_z [ 1 ] ) -
625 ( p1i_x [ 2 ] - p1i_x [ 1 ] ) * ( p2i_y [ 0 ] - p1i_y [ 1 ] ) * ( p2i_z [ 1 ] - p1i_z [ 1 ] ) +
626 ( p1i_x [ 2 ] - p1i_x [ 1 ] ) * ( p2i_y [ 1 ] - p1i_y [ 1 ] ) * ( p2i_z [ 0 ] - p1i_z [ 1 ] ) -
627 ( p2i_x [ 1 ] - p1i_x [ 1 ] ) * ( p1i_y [ 2 ] - p1i_y [ 1 ] ) * ( p2i_z [ 0 ] - p1i_z [ 1 ] ) ) / 6.0;
629 double __v3 = ( ( p1i_x [ 2 ] - p2i_x [ 0 ] ) * ( p2i_y [ 1 ] - p2i_y [ 0 ] ) * ( p2i_z [ 2 ] - p2i_z [ 0 ] ) -
630 ( p1i_x [ 2 ] - p2i_x [ 0 ] ) * ( p2i_y [ 2 ] - p2i_y [ 0 ] ) * ( p2i_z [ 1 ] - p2i_z [ 0 ] ) +
631 ( p2i_x [ 2 ] - p2i_x [ 0 ] ) * ( p1i_y [ 2 ] - p2i_y [ 0 ] ) * ( p2i_z [ 1 ] - p2i_z [ 0 ] ) -
632 ( p2i_x [ 1 ] - p2i_x [ 0 ] ) * ( p1i_y [ 2 ] - p2i_y [ 0 ] ) * ( p2i_z [ 2 ] - p2i_z [ 0 ] ) +
633 ( p2i_x [ 1 ] - p2i_x [ 0 ] ) * ( p2i_y [ 2 ] - p2i_y [ 0 ] ) * ( p1i_z [ 2 ] - p2i_z [ 0 ] ) -
634 ( p2i_x [ 2 ] - p2i_x [ 0 ] ) * ( p2i_y [ 1 ] - p2i_y [ 0 ] ) * ( p1i_z [ 2 ] - p2i_z [ 0 ] ) ) / 6.0;
636 double __vol = fabs(__v1) + fabs(__v2) + fabs(__v3);
639 if ( ( __vol < 0 ) || ( fabs(__vol) / vol > 1.0000001 ) ) {
643 answer.
at(1) =
min(fabs(__vol) / vol, 1.0);
644 answer.
at(2) = 1.0 - answer.
at(1);
662 if ( !
gc.testElementGraphicActivity(
this) ) {
667 EASValsSetColor(
gc.getElementColor() );
668 EASValsSetEdgeColor(
gc.getElementEdgeColor() );
669 EASValsSetEdgeFlag(
true);
671 EASValsSetFillStyle(FILL_SOLID);
672 p [ 0 ].x = ( FPNum ) this->
giveNode(1)->giveCoordinate(1);
673 p [ 0 ].y = ( FPNum ) this->
giveNode(1)->giveCoordinate(2);
674 p [ 0 ].z = ( FPNum ) this->
giveNode(1)->giveCoordinate(3);
675 p [ 1 ].x = ( FPNum ) this->
giveNode(2)->giveCoordinate(1);
676 p [ 1 ].y = ( FPNum ) this->
giveNode(2)->giveCoordinate(2);
677 p [ 1 ].z = ( FPNum ) this->
giveNode(2)->giveCoordinate(3);
678 p [ 2 ].x = ( FPNum ) this->
giveNode(3)->giveCoordinate(1);
679 p [ 2 ].y = ( FPNum ) this->
giveNode(3)->giveCoordinate(2);
680 p [ 2 ].z = ( FPNum ) this->
giveNode(3)->giveCoordinate(3);
681 p [ 3 ].x = ( FPNum ) this->
giveNode(4)->giveCoordinate(1);
682 p [ 3 ].y = ( FPNum ) this->
giveNode(4)->giveCoordinate(2);
683 p [ 3 ].z = ( FPNum ) this->
giveNode(4)->giveCoordinate(3);
686 EGWithMaskChangeAttributes(WIDTH_MASK | FILL_MASK | COLOR_MASK | EDGE_COLOR_MASK | EDGE_FLAG_MASK | LAYER_MASK, go);
687 EGAttachObject(go, ( EObjectP )
this);
688 EMAddGraphicsToModel(ESIModel(), go);
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
#define OOFEG_RAW_GEOMETRY_WIDTH
#define OOFEG_RAW_GEOMETRY_LAYER