169std::array< FloatArrayF< 3 >, 4 >
174 return { e [ 2 ], e [ 2 ], e [ 2 ], e [ 2 ] };
177 std::array< FloatArrayF< 3 >, 4 >directors;
183 for (
int i = 1; i <= 4; i++ ) {
188 for (
int j = 1; j <= neighbours.
giveSize(); j++ ) {
191 if ( neighbour->giveCrossSection()->giveNumber() == csNum ) {
192 auto e = neighbour->computeLocalBaseVectors();
201 std::array< FloatArrayF< 3 >, 4 >V;
202 for (
int i = 0; i < 4; ++i ) {
213 throw std::runtime_error(
"Unsupported directorType");
218std::array< FloatArrayF< 3 >, 4 >
245 for (
int i = 0; i < 4; ++i ) {
247 auto VVe =
cross(V [ i ], Ve);
248 answer.
at(1, 1 + i * 6) = answer.
at(2, 2 + i * 6) = answer.
at(3, 3 + i * 6) = h [ i ];
249 answer.
at(1, 4 + i * 6) = -iLocCoord.
at(3) / 2.0 * a [ i ] * h [ i ] * VVe.at(1);
250 answer.
at(1, 5 + i * 6) = iLocCoord.
at(3) / 2.0 * a [ i ] * h [ i ] * Ve.at(1);
251 answer.
at(2, 4 + i * 6) = -iLocCoord.
at(3) / 2.0 * a [ i ] * h [ i ] * VVe.at(2);
252 answer.
at(2, 5 + i * 6) = iLocCoord.
at(3) / 2.0 * a [ i ] * h [ i ] * Ve.at(2);
253 answer.
at(3, 4 + i * 6) = -iLocCoord.
at(3) / 2.0 * a [ i ] * h [ i ] * VVe.at(3);
254 answer.
at(3, 5 + i * 6) = iLocCoord.
at(3) / 2.0 * a [ i ] * h [ i ] * Ve.at(3);
264 answer = scs->give3dDegeneratedShellStiffMtrx(rMode, gp, tStep);
268std::array< FloatArrayF< 3 >, 4 >
271 std::array< FloatArrayF< 3 >, 4 >c;
272 for (
int i = 0; i < 4; ++i ) {
300 D_u, D_v, D_w, R_u, R_v, R_w
322 auto dn =
interp_lin.evaldNdxi(lcoords [ { 0, 1 } ]);
323 auto hk1 = dn.row< 0 >();
324 auto hk2 = dn.row< 1 >();
328 auto h =
interp_lin.evalN(lcoords [ { 0, 1 } ]);
342 double r3 = lcoords.
at(3);
348 double x1 = c [ 0 ] [ 0 ], y1 = c [ 0 ] [ 1 ];
349 double x2 = c [ 1 ] [ 0 ], y2 = c [ 1 ] [ 1 ];
350 double x3 = c [ 2 ] [ 0 ], y3 = c [ 2 ] [ 1 ];
351 double x4 = c [ 3 ] [ 0 ], y4 = c [ 3 ] [ 1 ];
355 auto V1 = V [ 0 ], V2 = V [ 1 ], V3 = V [ 2 ], V4 = V [ 3 ];
359 jacobianMatrix.
at(1, 1) = hk1.at(1) * x1 + hk1.at(2) * x2 + hk1.at(3) * x3 + hk1.at(4) * x4 + r3 / 2. * ( a1 * hk1.at(1) * V1.at(1) + a2 * hk1.at(2) * V2.at(1) + a3 * hk1.at(3) * V3.at(1) + a4 * hk1.at(4) * V4.at(1) );
360 jacobianMatrix.
at(1, 2) = hk1.at(1) * y1 + hk1.at(2) * y2 + hk1.at(3) * y3 + hk1.at(4) * y4 + r3 / 2. * ( a1 * hk1.at(1) * V1.at(2) + a2 * hk1.at(2) * V2.at(2) + a3 * hk1.at(3) * V3.at(2) + a4 * hk1.at(4) * V4.at(2) );
361 jacobianMatrix.
at(1, 3) = r3 / 2. * ( a1 * hk1.at(1) * V1.at(3) + a2 * hk1.at(2) * V2.at(3) + a3 * hk1.at(3) * V3.at(3) + a4 * hk1.at(4) * V4.at(3) );
362 jacobianMatrix.
at(2, 1) = hk2.at(1) * x1 + hk2.at(2) * x2 + hk2.at(3) * x3 + hk2.at(4) * x4 + r3 / 2. * ( a1 * hk2.at(1) * V1.at(1) + a2 * hk2.at(2) * V2.at(1) + a3 * hk2.at(3) * V3.at(1) + a4 * hk2.at(4) * V4.at(1) );
363 jacobianMatrix.
at(2, 2) = hk2.at(1) * y1 + hk2.at(2) * y2 + hk2.at(3) * y3 + hk2.at(4) * y4 + r3 / 2. * ( a1 * hk2.at(1) * V1.at(2) + a2 * hk2.at(2) * V2.at(2) + a3 * hk2.at(3) * V3.at(2) + a4 * hk2.at(4) * V4.at(2) );
364 jacobianMatrix.
at(2, 3) = r3 / 2. * ( a1 * hk2.at(1) * V1.at(3) + a2 * hk2.at(2) * V2.at(3) + a3 * hk2.at(3) * V3.at(3) + a4 * hk2.at(4) * V4.at(3) );
365 jacobianMatrix.
at(3, 1) = 1. / 2. * ( a1 * h1 * V1.at(1) + a2 * h2 * V2.at(1) + a3 * h3 * V3.at(1) + a4 * h4 * V4.at(1) );
366 jacobianMatrix.
at(3, 2) = 1. / 2. * ( a1 * h1 * V1.at(2) + a2 * h2 * V2.at(2) + a3 * h3 * V3.at(2) + a4 * h4 * V4.at(2) );
367 jacobianMatrix.
at(3, 3) = 1. / 2. * ( a1 * h1 * V1.at(3) + a2 * h2 * V2.at(3) + a3 * h3 * V3.at(3) + a4 * h4 * V4.at(3) );
368 return jacobianMatrix;
378 if ( drillType == 1 ) {
380 if ( relDrillCoeff == 0.0 ) {
381 relDrillCoeff = 0.001;
385 while ( answer.
at(j, j) == 0 ) {
390 for (
int i = j; i <= 24; i++ ) {
398 IntArray drillDofs = { 6, 12, 18, 24 };
411 for (
int j = 0; j < 4; j++ ) {
418 answer.
assemble(drillStiffness, drillDofs);
430 if ( drillType == 1 ) {
449 for (
int j = 0; j < 4; j++ ) {
453 drillMoment.
add(coeff * dV * dtheta, n);
458 drillStiffness.
resize(4, 4);
459 drillStiffness.
zero();
460 for (
int i = 1; i <= 4; i++ ) {
464 drillMoment.
beProductOf(drillStiffness, drillUnknowns);
466 answer.
assemble(drillMoment, drillDofs);
477 auto c1 = c [ 0 ], c2 = c [ 1 ], c3 = c [ 2 ], c4 = c [ 3 ];
486 double a1 = a [ 0 ], a2 = a [ 1 ], a3 = a [ 2 ], a4 = a [ 3 ];
493 auto hkx = hk [ 0 ], hky = hk [ 1 ];
497 double sb = 2 * invJ.at(1, 1) * invJ.at(3, 3);
498 double sa = 2 * invJ.at(1, 2) * invJ.at(3, 3);
499 double cb = 2 * invJ.at(2, 1) * invJ.at(3, 3);
500 double ca = 2 * invJ.at(2, 2) * invJ.at(3, 3);
504 auto V1 = V [ 0 ], V2 = V [ 1 ], V3 = V [ 2 ], V4 = V [ 3 ];
513 auto V21 =
cross(V1, V11);
514 auto V22 =
cross(V2, V12);
515 auto V23 =
cross(V3, V13);
516 auto V24 =
cross(V4, V14);
521 answer.
at(4, 1) = 1. / 32. * ( ( a1 * V1.at(1) + a2 * V2.at(1) ) * ( cb * ( 1. + r2 ) ) + ( a1 * V1.at(1) + a4 * V4.at(1) ) * ( ca * ( 1. + r1 ) ) );
522 answer.
at(4, 2) = 1. / 32. * ( ( a1 * V1.at(2) + a2 * V2.at(2) ) * ( cb * ( 1. + r2 ) ) + ( a1 * V1.at(2) + a4 * V4.at(2) ) * ( ca * ( 1. + r1 ) ) );
523 answer.
at(4, 3) = 1. / 32. * ( ( a1 * V1.at(3) + a2 * V2.at(3) ) * ( cb * ( 1. + r2 ) ) + ( a1 * V1.at(3) + a4 * V4.at(3) ) * ( ca * ( 1. + r1 ) ) );
524 answer.
at(4, 4) = -a1 / 32. * ( (
dot(V21, c1 - c2) * ( cb * ( 1. + r2 ) ) ) + (
dot(V21, c1 - c4) * ( ca * ( 1. + r1 ) ) ) );
525 answer.
at(4, 5) = a1 / 32. * ( (
dot(V11, c1 - c2) * ( cb * ( 1. + r2 ) ) ) + (
dot(V11, c1 - c4) * ( ca * ( 1. + r1 ) ) ) );
527 answer.
at(4, 7) = 1. / 32. * ( -( a1 * V1.at(1) + a2 * V2.at(1) ) * ( cb * ( 1. + r2 ) ) + ( a2 * V2.at(1) + a3 * V3.at(1) ) * ( ca * ( 1. - r1 ) ) );
528 answer.
at(4, 8) = 1. / 32. * ( -( a1 * V1.at(2) + a2 * V2.at(2) ) * ( cb * ( 1. + r2 ) ) + ( a2 * V2.at(2) + a3 * V3.at(2) ) * ( ca * ( 1. - r1 ) ) );
529 answer.
at(4, 9) = 1. / 32. * ( -( a1 * V1.at(3) + a2 * V2.at(3) ) * ( cb * ( 1. + r2 ) ) + ( a2 * V2.at(3) + a3 * V3.at(3) ) * ( ca * ( 1. - r1 ) ) );
530 answer.
at(4, 10) = -a1 / 32. * ( (
dot(V21, c1 - c2) * ( cb * ( 1. + r2 ) ) ) + (
dot(V21, c2 - c3) * ( ca * ( 1. - r1 ) ) ) );
531 answer.
at(4, 11) = a1 / 32. * ( (
dot(V11, c1 - c2) * ( cb * ( 1. + r2 ) ) ) + (
dot(V11, c2 - c3) * ( ca * ( 1. - r1 ) ) ) );
533 answer.
at(4, 13) = 1. / 32. * ( -( a3 * V3.at(1) + a4 * V4.at(1) ) * ( cb * ( 1. - r2 ) ) - ( a2 * V2.at(1) + a3 * V3.at(1) ) * ( ca * ( 1. - r1 ) ) );
534 answer.
at(4, 14) = 1. / 32. * ( -( a3 * V3.at(2) + a4 * V4.at(2) ) * ( cb * ( 1. - r2 ) ) - ( a2 * V2.at(2) + a3 * V3.at(2) ) * ( ca * ( 1. - r1 ) ) );
535 answer.
at(4, 15) = 1. / 32. * ( -( a3 * V3.at(3) + a4 * V4.at(3) ) * ( cb * ( 1. - r2 ) ) - ( a2 * V2.at(3) + a3 * V3.at(3) ) * ( ca * ( 1. - r1 ) ) );
536 answer.
at(4, 16) = -a1 / 32. * ( (
dot(V21, c4 - c3) * ( cb * ( 1. - r2 ) ) ) + (
dot(V21, c2 - c3) * ( ca * ( 1. - r1 ) ) ) );
537 answer.
at(4, 17) = a1 / 32. * ( (
dot(V11, c4 - c3) * ( cb * ( 1. - r2 ) ) ) + (
dot(V11, c2 - c3) * ( ca * ( 1. - r1 ) ) ) );
539 answer.
at(4, 19) = 1. / 32. * ( ( a3 * V3.at(1) + a4 * V4.at(1) ) * ( cb * ( 1. - r2 ) ) - ( a1 * V1.at(1) + a4 * V4.at(1) ) * ( ca * ( 1. + r1 ) ) );
540 answer.
at(4, 20) = 1. / 32. * ( ( a3 * V3.at(2) + a4 * V4.at(2) ) * ( cb * ( 1. - r2 ) ) - ( a1 * V1.at(2) + a4 * V4.at(2) ) * ( ca * ( 1. + r1 ) ) );
541 answer.
at(4, 21) = 1. / 32. * ( ( a3 * V3.at(3) + a4 * V4.at(3) ) * ( cb * ( 1. - r2 ) ) - ( a1 * V1.at(3) + a4 * V4.at(3) ) * ( ca * ( 1. + r1 ) ) );
542 answer.
at(4, 22) = -a1 / 32. * ( (
dot(V21, c4 - c3) * ( cb * ( 1. - r2 ) ) ) + (
dot(V21, c1 - c4) * ( ca * ( 1. + r1 ) ) ) );
543 answer.
at(4, 23) = a1 / 32. * ( (
dot(V11, c4 - c3) * ( cb * ( 1. - r2 ) ) ) + (
dot(V11, c1 - c4) * ( ca * ( 1. + r1 ) ) ) );
545 answer.
at(5, 1) = 1. / 32. * ( ( a1 * V1.at(1) + a2 * V2.at(1) ) * ( sb * ( 1. + r2 ) ) + ( a1 * V1.at(1) + a4 * V4.at(1) ) * ( sa * ( 1. + r1 ) ) );
546 answer.
at(5, 2) = 1. / 32. * ( ( a1 * V1.at(2) + a2 * V2.at(2) ) * ( sb * ( 1. + r2 ) ) + ( a1 * V1.at(2) + a4 * V4.at(2) ) * ( sa * ( 1. + r1 ) ) );
547 answer.
at(5, 3) = 1. / 32. * ( ( a1 * V1.at(3) + a2 * V2.at(3) ) * ( sb * ( 1. + r2 ) ) + ( a1 * V1.at(3) + a4 * V4.at(3) ) * ( sa * ( 1. + r1 ) ) );
548 answer.
at(5, 4) = -a1 / 32. * ( (
dot(V21, c1 - c2) * ( sb * ( 1. + r2 ) ) ) + (
dot(V21, c1 - c4) * ( sa * ( 1. + r1 ) ) ) );
549 answer.
at(5, 5) = a1 / 32. * ( (
dot(V11, c1 - c2) * ( sb * ( 1. + r2 ) ) ) + (
dot(V11, c1 - c4) * ( sa * ( 1. + r1 ) ) ) );
551 answer.
at(5, 7) = 1. / 32. * ( -( a1 * V1.at(1) + a2 * V2.at(1) ) * ( sb * ( 1. + r2 ) ) + ( a2 * V2.at(1) + a3 * V3.at(1) ) * ( sa * ( 1. - r1 ) ) );
552 answer.
at(5, 8) = 1. / 32. * ( -( a1 * V1.at(2) + a2 * V2.at(2) ) * ( sb * ( 1. + r2 ) ) + ( a2 * V2.at(2) + a3 * V3.at(2) ) * ( sa * ( 1. - r1 ) ) );
553 answer.
at(5, 9) = 1. / 32. * ( -( a1 * V1.at(3) + a2 * V2.at(3) ) * ( sb * ( 1. + r2 ) ) + ( a2 * V2.at(3) + a3 * V3.at(3) ) * ( sa * ( 1. - r1 ) ) );
554 answer.
at(5, 10) = -a1 / 32. * ( (
dot(V21, c1 - c2) * ( sb * ( 1. + r2 ) ) ) + (
dot(V21, c2 - c3) * ( sa * ( 1. - r1 ) ) ) );
555 answer.
at(5, 11) = a1 / 32. * ( (
dot(V11, c1 - c2) * ( sb * ( 1. + r2 ) ) ) + (
dot(V11, c2 - c3) * ( sa * ( 1. - r1 ) ) ) );
557 answer.
at(5, 13) = 1. / 32. * ( -( a3 * V3.at(1) + a4 * V4.at(1) ) * ( sb * ( 1. - r2 ) ) - ( a2 * V2.at(1) + a3 * V3.at(1) ) * ( sa * ( 1. - r1 ) ) );
558 answer.
at(5, 14) = 1. / 32. * ( -( a3 * V3.at(2) + a4 * V4.at(2) ) * ( sb * ( 1. - r2 ) ) - ( a2 * V2.at(2) + a3 * V3.at(2) ) * ( sa * ( 1. - r1 ) ) );
559 answer.
at(5, 15) = 1. / 32. * ( -( a3 * V3.at(3) + a4 * V4.at(3) ) * ( sb * ( 1. - r2 ) ) - ( a2 * V2.at(3) + a3 * V3.at(3) ) * ( sa * ( 1. - r1 ) ) );
560 answer.
at(5, 16) = -a1 / 32. * ( (
dot(V21, c4 - c3) * ( sb * ( 1. - r2 ) ) ) + (
dot(V21, c2 - c3) * ( sa * ( 1. - r1 ) ) ) );
561 answer.
at(5, 17) = a1 / 32. * ( (
dot(V11, c4 - c3) * ( sb * ( 1. - r2 ) ) ) + (
dot(V11, c2 - c3) * ( sa * ( 1. - r1 ) ) ) );
563 answer.
at(5, 19) = 1. / 32. * ( ( a3 * V3.at(1) + a4 * V4.at(1) ) * ( sb * ( 1. - r2 ) ) - ( a1 * V1.at(1) + a4 * V4.at(1) ) * ( sa * ( 1. + r1 ) ) );
564 answer.
at(5, 20) = 1. / 32. * ( ( a3 * V3.at(2) + a4 * V4.at(2) ) * ( sb * ( 1. - r2 ) ) - ( a1 * V1.at(2) + a4 * V4.at(2) ) * ( sa * ( 1. + r1 ) ) );
565 answer.
at(5, 21) = 1. / 32. * ( ( a3 * V3.at(3) + a4 * V4.at(3) ) * ( sb * ( 1. - r2 ) ) - ( a1 * V1.at(3) + a4 * V4.at(3) ) * ( sa * ( 1. + r1 ) ) );
566 answer.
at(5, 22) = -a1 / 32. * ( (
dot(V21, c4 - c3) * ( sb * ( 1. - r2 ) ) ) + (
dot(V21, c1 - c4) * ( sa * ( 1. + r1 ) ) ) );
567 answer.
at(5, 23) = a1 / 32. * ( (
dot(V11, c4 - c3) * ( sb * ( 1. - r2 ) ) ) + (
dot(V11, c1 - c4) * ( sa * ( 1. + r1 ) ) ) );
569 answer.
at(1, 1) = hkx.at(1);
570 answer.
at(1, 4) = -r3 / 2. * a1 * hkx.at(1) * V21.at(1);
571 answer.
at(1, 5) = r3 / 2. * a1 * hkx.at(1) * V11.at(1);
573 answer.
at(1, 7) = hkx.at(2);
574 answer.
at(1, 10) = -r3 / 2. * a2 * hkx.at(2) * V22.at(1);
575 answer.
at(1, 11) = r3 / 2. * a2 * hkx.at(2) * V12.at(1);
577 answer.
at(1, 13) = hkx.at(3);
578 answer.
at(1, 16) = -r3 / 2. * a3 * hkx.at(3) * V23.at(1);
579 answer.
at(1, 17) = r3 / 2. * a3 * hkx.at(3) * V13.at(1);
581 answer.
at(1, 19) = hkx.at(4);
582 answer.
at(1, 22) = -r3 / 2. * a4 * hkx.at(4) * V24.at(1);
583 answer.
at(1, 23) = r3 / 2. * a4 * hkx.at(4) * V14.at(1);
585 answer.
at(2, 2) = hky.at(1);
586 answer.
at(2, 4) = -r3 / 2. * a1 * hky.at(1) * V21.at(2);
587 answer.
at(2, 5) = r3 / 2. * a1 * hky.at(1) * V11.at(2);
589 answer.
at(2, 8) = hky.at(2);
590 answer.
at(2, 10) = -r3 / 2. * a2 * hky.at(2) * V22.at(2);
591 answer.
at(2, 11) = r3 / 2. * a2 * hky.at(2) * V12.at(2);
593 answer.
at(2, 14) = hky.at(3);
594 answer.
at(2, 16) = -r3 / 2. * a3 * hky.at(3) * V23.at(2);
595 answer.
at(2, 17) = r3 / 2. * a3 * hky.at(3) * V13.at(2);
597 answer.
at(2, 20) = hky.at(4);
598 answer.
at(2, 22) = -r3 / 2. * a4 * hky.at(4) * V24.at(2);
599 answer.
at(2, 23) = r3 / 2. * a4 * hky.at(4) * V14.at(2);
601 answer.
at(6, 1) = hky.at(1);
602 answer.
at(6, 2) = hkx.at(1);
603 answer.
at(6, 4) = -r3 / 2. * a1 * ( hkx.at(1) * V21.at(2) + hky.at(1) * V21.at(1) );
604 answer.
at(6, 5) = r3 / 2. * a1 * ( hky.at(1) * V11.at(1) + hky.at(1) * V11.at(2) );
606 answer.
at(6, 7) = hky.at(2);
607 answer.
at(6, 8) = hkx.at(2);
608 answer.
at(6, 10) = -r3 / 2. * a2 * ( hkx.at(2) * V22.at(2) + hky.at(2) * V22.at(1) );
609 answer.
at(6, 11) = r3 / 2. * a2 * ( hky.at(2) * V12.at(1) + hky.at(2) * V12.at(2) );
611 answer.
at(6, 13) = hky.at(3);
612 answer.
at(6, 14) = hkx.at(3);
613 answer.
at(6, 16) = -r3 / 2. * a3 * ( hkx.at(3) * V23.at(2) + hky.at(3) * V23.at(1) );
614 answer.
at(6, 17) = r3 / 2. * a3 * ( hky.at(3) * V13.at(1) + hky.at(3) * V13.at(2) );
616 answer.
at(6, 19) = hky.at(4);
617 answer.
at(6, 20) = hkx.at(4);
618 answer.
at(6, 22) = -r3 / 2. * a4 * ( hkx.at(4) * V24.at(2) + hky.at(4) * V24.at(1) );
619 answer.
at(6, 23) = r3 / 2. * a4 * ( hky.at(4) * V14.at(1) + hky.at(4) * V14.at(2) );
623std::array< double, 4 >
647 for (
int i = 1; i <= 3; i++ ) {
654std::array< FloatArrayF< 3 >, 3 >
670 auto help = coordD - coordC;
674 auto e2 =
cross(e3, e1);
675 return { e1, e2, e3 };
678std::array< FloatMatrixF< 3, 3 >, 4 >
696 std::array< FloatMatrixF< 3, 3 >, 4 >answer;
697 for (
int i = 0; i < 4; ++i ) {
699 auto VV =
cross(V [ i ], Ve);
701 answer [ i ].at(1, 1) =
dot(Ve, e [ 0 ]);
702 answer [ i ].at(1, 2) =
dot(Ve, e [ 1 ]);
703 answer [ i ].at(1, 3) =
dot(Ve, e [ 2 ]);
705 answer [ i ].at(2, 1) =
dot(VV, e [ 0 ]);
706 answer [ i ].at(2, 2) =
dot(VV, e [ 1 ]);
707 answer [ i ].at(2, 3) =
dot(VV, e [ 2 ]);
709 answer [ i ].at(3, 1) =
dot(V [ i ], e [ 0 ]);
710 answer [ i ].at(3, 2) =
dot(V [ i ], e [ 1 ]);
711 answer [ i ].at(3, 3) =
dot(V [ i ], e [ 2 ]);
728 for (
int i = 0; i <= 3; i++ ) {
762 throw std::runtime_error(
"unsupported tensor mode");
773 fprintf(file,
" GP %d :", i + 1);
775 fprintf(file,
" forces ");
777 fprintf(file,
" %.4e", val);
780 fprintf(file,
"\n moments ");
782 fprintf(file,
" %.4e", val);
785 fprintf(file,
"\n strains ");
787 fprintf(file,
" %.4e", val);
790 fprintf(file,
"\n curvatures ");
792 fprintf(file,
" %.4e", val);
795 for (
int j = 0; j <
nPointsZ; j++ ) {
798 fprintf(file,
"\n GP %d.%d :", i + 1, j + 1);
801 fprintf(file,
" strains ");
802 for (
auto &val : v ) {
803 fprintf(file,
" %.4e", val);
807 fprintf(file,
"\n stresses ");
808 for (
auto &val : v ) {
809 fprintf(file,
" %.4e", val);
819 if ( type == IST_ShellMomentTensor || type == IST_ShellForceTensor ) {
822 for (
int i = 0; i <
nPointsZ; i++ ) {
825 double J = thickness / 2.0;
827 if ( type == IST_ShellMomentTensor ) {
828 z = gp->giveNaturalCoordinates().at(3) * ( thickness / 2 );
832 double w = gp->giveWeight() * J * z;
842 }
else if ( type == IST_CurvatureTensor ) {
844 const auto &coords = gp->giveNaturalCoordinates();
853 for (
int i = 0; i < 4; i++ ) {
854 rotX [ i ] = dofs.
at(i * 6 + 4);
855 rotY [ i ] = dofs.
at(i * 6 + 5);
858 cLocal.
at(1) =
dot(rotY, hk [ 0 ]);
859 cLocal.
at(2) = -
dot(rotX, hk [ 1 ]);
860 cLocal.
at(6) =
dot(rotY, hk [ 1 ]) -
dot(rotX, hk [ 0 ]);
863 }
else if ( type == IST_ShellStrainTensor ) {
865 auto coords = gp->giveNaturalCoordinates();
871 this->
giveIPValue(answer, & midGP, IST_StrainTensor, tStep);
874 throw std::runtime_error(
"unknown type");
878std::array< FloatArrayF< 4 >, 2 >
881 auto dn =
interp_lin.evaldNdxi(coords [ { 0, 1 } ]);
885 auto dndx =
dot(invJ2, dn);
887 auto hkx = dndx.row< 0 >();
888 auto hky = dndx.row< 1 >();
901 if ( type == IST_StrainTensor ) {
905 }
else if ( type == IST_StressTensor ) {
909 }
else if ( type == IST_ShellMomentTensor || type == IST_ShellForceTensor || type == IST_CurvatureTensor || type == IST_ShellStrainTensor ) {
929 std::vector< FloatArray >lc(3);
930 for (
int _i = 0; _i < 4; _i++ ) {
935 answer.
at(1) = inputCoords_ElCS.at(1);
936 answer.
at(2) = inputCoords_ElCS.at(2);
937 GaussPoint _gp(
nullptr, 1, answer, 2.0, _2dPlate);
941 return inplane && outofplane;
953 for (
int _i = 1; _i <= 3; _i++ ) {
968 for (
int i = 1; i <= 3; i++ ) {
983 std::vector< FloatArrayF< 3 > >r;
993 const auto &coord = gp->giveNaturalCoordinates();
994 double u = coord.at(1);
995 double v = coord.at(2);
1001 A.
at(2, 2) += u * u;
1002 A.
at(2, 3) += u * v;
1004 A.
at(3, 2) += v * u;
1005 A.
at(3, 3) += v * v;
1007 for (
int j = 1; j <= size; j++ ) {
1008 double y = val.
at(j);
1010 r [ j ].at(2) += y * u;
1011 r [ j ].at(3) += y * v;
1016 std::vector< FloatArrayF< 3 > >b(size);
1017 for (
int i = 0; i < size; ++i ) {
1018 b [ i ] =
dot(invA, r [ i ]);
1021 double x1 = 0.0, x2 = 0.0;
1044 for (
int j = 1; j <= size; j++ ) {
1045 answer.
at(j) = b [ j ].at(1) + x1 * b [ j ].at(2) + x2 * b [ j ].at(3);
1055 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
1057 }
else if ( iEdge == 2 ) {
1059 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
1061 }
else if ( iEdge == 3 ) {
1063 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24
1065 }
else if ( iEdge == 4 ) {
1067 19, 20, 21, 22, 23, 24, 1, 2, 3, 4, 5, 6
1079 std::vector< FloatArray > lc(4);
1080 lc [ 0 ] = lcF [ 0 ];
1081 lc [ 1 ] = lcF [ 1 ];
1082 lc [ 2 ] = lcF [ 2 ];
1083 lc [ 3 ] = lcF [ 3 ];
1109 const auto &edgeNodes = this->
interp_lin.computeLocalEdgeMapping(iEdge);
1115 auto yl =
cross(e [ 2 ], xl);
1120 answer.
at(1, 1) = answer.
at(4, 4) =
dot(e [ 0 ], xl);
1121 answer.
at(1, 2) = answer.
at(4, 5) =
dot(e [ 0 ], yl);
1122 answer.
at(1, 3) = answer.
at(4, 6) =
dot(e [ 0 ], e [ 2 ]);
1123 answer.
at(2, 1) = answer.
at(5, 4) =
dot(e [ 1 ], xl);
1124 answer.
at(2, 2) = answer.
at(5, 5) =
dot(e [ 1 ], yl);
1125 answer.
at(2, 3) = answer.
at(5, 6) =
dot(e [ 1 ], e [ 2 ]);
1126 answer.
at(3, 1) = answer.
at(6, 4) =
dot(e [ 2 ], xl);
1127 answer.
at(3, 2) = answer.
at(6, 5) =
dot(e [ 2 ], yl);
1128 answer.
at(3, 3) = answer.
at(6, 6) =
dot(e [ 2 ], e [ 2 ]);
1165 for ( std::size_t i = 0; i < dn.cols(); i++ ) {
1166 double x = xyz [ i ] [ 0 ];
1167 double y = xyz [ i ] [ 1 ];
1169 jacobianMatrix(0, 0) += dn(0, i) * x;
1170 jacobianMatrix(0, 1) += dn(0, i) * y;
1171 jacobianMatrix(1, 0) += dn(1, i) * x;
1172 jacobianMatrix(1, 1) += dn(1, i) * y;
1207 if ( !
gc.testElementGraphicActivity(
this) ) {
1213 EASValsSetColor(
gc.getElementColor() );
1214 EASValsSetEdgeColor(
gc.getElementEdgeColor() );
1215 EASValsSetEdgeFlag(
true);
1216 EASValsSetFillStyle(FILL_SOLID);
1218 for (
int i=0; i<4; i++) {
1219 p [ i ].x = ( FPNum ) this->
giveNode(i+1)->giveCoordinate(1);
1220 p [ i ].y = ( FPNum ) this->
giveNode(i+1)->giveCoordinate(2);
1221 p [ i ].z = ( FPNum ) this->
giveNode(i+1)->giveCoordinate(3);
1223 go = CreateQuad3D(p);
1224 EGWithMaskChangeAttributes(WIDTH_MASK | FILL_MASK | COLOR_MASK | EDGE_COLOR_MASK | EDGE_FLAG_MASK | LAYER_MASK, go);
1225 EGAttachObject(go, ( EObjectP )
this);
1226 EMAddGraphicsToModel(ESIModel(), go);
1235 double defScale =
gc.getDefScale();
1237 if ( !
gc.testElementGraphicActivity(
this) ) {
1243 EASValsSetColor(
gc.getDeformedElementColor() );
1244 EASValsSetEdgeColor(
gc.getElementEdgeColor() );
1245 EASValsSetEdgeFlag(
true);
1246 EASValsSetFillStyle(FILL_SOLID);
1248 for (
int i=0; i<4; i++) {
1249 p [ i ].x = ( FPNum ) this->
giveNode(i+1)->giveUpdatedCoordinate(1, tStep, defScale);
1250 p [ i ].y = ( FPNum ) this->
giveNode(i+1)->giveUpdatedCoordinate(2, tStep, defScale);
1251 p [ i ].z = ( FPNum ) this->
giveNode(i+1)->giveUpdatedCoordinate(3, tStep, defScale);
1253 go = CreateQuad3D(p);
1254 EGWithMaskChangeAttributes(WIDTH_MASK | FILL_MASK | COLOR_MASK | EDGE_COLOR_MASK | EDGE_FLAG_MASK | LAYER_MASK, go);
1255 EMAddGraphicsToModel(ESIModel(), go);
1262 int indx, result = 0;
1266 double s [ 4 ], defScale;
1267 if ( !
gc.testElementGraphicActivity(
this) ) {
1284 this->
giveIPValue(a, gp, IST_ShellMomentTensor, tStep);
1288 v.
times(1. / tot_w);
1295 indx =
gc.giveIntVarIndx();
1297 s [ 0 ] = v1.
at(indx);
1298 s [ 1 ] = v2.
at(indx);
1299 s [ 2 ] = v3.
at(indx);
1300 s [ 3 ] = v4.
at(indx);
1303 for (
int i = 0; i < 4; i++ ) {
1304 if (
gc.getInternalVarsDefGeoFlag() ) {
1306 defScale =
gc.getDefScale();
1307 p [ i ].x = ( FPNum ) this->
giveNode(i + 1)->giveUpdatedCoordinate(1, tStep, defScale);
1308 p [ i ].y = ( FPNum ) this->
giveNode(i + 1)->giveUpdatedCoordinate(2, tStep, defScale);
1309 p [ i ].z = ( FPNum ) this->
giveNode(i + 1)->giveUpdatedCoordinate(3, tStep, defScale);
1311 p [ i ].x = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(1);
1312 p [ i ].y = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(2);
1313 p [ i ].z = ( FPNum ) this->
giveNode(i + 1)->giveCoordinate(3);
1317 gc.updateFringeTableMinMax(s, 3);
1318 tr = CreateQuadWD3D(p, s [ 0 ], s [ 1 ], s [ 2 ], s[3]);
1319 EGWithMaskChangeAttributes(LAYER_MASK, tr);
1320 EMAddGraphicsToModel(ESIModel(), tr);
#define REGISTER_Element(class)
void giveNodeNeighbourList(IntArray &answer, IntArray &nodeList)
virtual double give(CrossSectionProperty a, GaussPoint *gp) const
virtual int setupIntegrationPoints(IntegrationRule &irule, int npoints, Element *element)
double giveCoordinate(int i) const
const FloatArray & giveCoordinates() const
ConnectivityTable * giveConnectivityTable()
Element * giveElement(int n)
ParameterManager elementPPM
Node * giveNode(int i) const
virtual bool isActivated(TimeStep *tStep)
void initializeFrom(InputRecord &ir, int priority) override
static ParamKey IPK_Element_nip
int numberOfDofMans
Number of dofmanagers.
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
void postInitialize() override
Performs post initialization steps.
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
CrossSection * giveCrossSection()
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
void edgeLocal2global(FloatArray &answer, int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const override
virtual void boundaryEdgeEvalN(FloatArray &answer, int boundary, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual void boundarySurfaceEvalN(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
Domain * giveDomain() const
int number
Component number.
double & at(std::size_t i)
void assemble(const FloatArray &fe, const IntArray &loc)
double dotProduct(const FloatArray &x) const
Index giveSize() const
Returns the size of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
void beSubArrayOf(const FloatArray &src, const IntArray &indx)
double at(std::size_t i, std::size_t j) const
void resize(Index rows, Index cols)
void beNMatrixOf(const FloatArray &n, int nsd)
void setSubMatrix(const FloatMatrix &src, int sr, int sc)
void zero()
Zeroes all coefficient of receiver.
void plusDyadSymmUpper(const FloatArray &a, double dV)
void assemble(const FloatMatrix &src, const IntArray &loc)
double at(std::size_t i, std::size_t j) const
int giveNumber()
Returns number of receiver.
double giveNaturalCoordinate(int i) const
Returns i-th natural element coordinate of receiver.
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
double giveWeight()
Returns integration weight of receiver.
void enumerate(int maxVal)
int giveNumberOfIntegrationPoints() const
Interface * giveInterface(InterfaceType interface) override
double computeEdgeVolumeAround(GaussPoint *gp, int iEdge) override
void giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord) override
void SPRNodalRecoveryMI_giveSPRAssemblyPoints(IntArray &pap) override
std::array< FloatArrayF< 3 >, 4 > giveLocalDirectorVectors()
MaterialMode giveMaterialMode() override
void printOutputAt(FILE *file, TimeStep *tStep) override
double computeVolumeAround(GaussPoint *gp) override
void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep) override
FEInterpolation * giveInterpolation() const override
std::array< FloatArrayF< 4 >, 2 > givedNdx(const FloatArrayF< 3 > &coords)
void postInitialize() override
Performs post initialization steps.
std::array< double, 4 > giveThickness()
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
FloatMatrixF< 3, 3 > giveJacobian(const FloatArrayF< 3 > &lcoords)
void computeSurfaceNMatrixAt(FloatMatrix &answer, int iSurf, GaussPoint *sgp)
void giveSurfaceDofMapping(IntArray &answer, int iSurf) const override
void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep) override
void initializeFrom(InputRecord &ir, int priority) override
std::array< FloatArrayF< 3 >, 3 > computeLocalBaseVectors()
static ParamKey IPK_MITC4Shell_nipZ
bool computeLocalCoordinates(FloatArray &answer, const FloatArray &coords) override
void SPRNodalRecoveryMI_giveDofMansDeterminedByPatch(IntArray &answer, int pap) override
FloatArray giveMidplaneIPValue(int gpXY, InternalStateType type, TimeStep *tStep)
std::array< FloatMatrixF< 3, 3 >, 4 > computeLToDirectorRotationMatrix()
int SPRNodalRecoveryMI_giveNumberOfIP() override
void giveDofManDofIDMask(int inode, IntArray &) const override
FloatMatrix giveCharacteristicTensor(CharTensor type, GaussPoint *gp, TimeStep *tStep)
void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int=1, int=ALL_STRAINS) override
std::array< FloatArrayF< 3 >, 4 > giveDirectorVectors()
SPRPatchType SPRNodalRecoveryMI_givePatchType() override
std::array< FloatArrayF< 3 >, 4 > giveNodeCoordinates()
static ParamKey IPK_MITC4Shell_directorType
int computeLoadGToLRotationMtrx(FloatMatrix &answer) override
void NodalAveragingRecoveryMI_computeNodalValue(FloatArray &answer, int node, InternalStateType type, TimeStep *tStep) override
double computeSurfaceVolumeAround(GaussPoint *gp, int iSurf) override
MITC4Shell(int n, Domain *d)
void computeEdgeNMatrix(FloatMatrix &answer, int boundaryID, const FloatArray &lcoords) override
computes edge interpolation matrix
FloatMatrixF< 3, 3 > GtoLRotationMatrix
void setupIRForMassMtrxIntegration(IntegrationRule &iRule) override
FloatArrayF< 3 > giveLocalCoordinates(const FloatArrayF< 3 > &global)
void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) override
void computeNmatrixAt(const FloatArray &iLocCoord, FloatMatrix &answer) override
void computeSurfaceNMatrix(FloatMatrix &answer, int boundaryID, const FloatArray &lcoords) override
int computeLoadLEToLRotationMatrix(FloatMatrix &answer, int iEdge, GaussPoint *gp) override
bool computeGtoLRotationMatrix(FloatMatrix &answer) override
void giveEdgeDofMapping(IntArray &answer, int iEdge) const override
void computeGaussPoints() override
int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords) override
static FEI2dQuadLin interp_lin
Element geometry approximation.
NodalAveragingRecoveryModelInterface()
Constructor.
SPRNodalRecoveryModelInterface()
Constructor.
SpatialLocalizerInterface(Element *element)
virtual FloatArrayF< 6 > giveRealStress_3dDegeneratedShell(const FloatArrayF< 6 > &reducedStrain, GaussPoint *gp, TimeStep *tStep) const
Material * giveMaterial(IntegrationPoint *ip) const override
virtual void giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord=0)
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
virtual void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
StructuralElement(int n, Domain *d)
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
virtual void computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
int giveInternalStateAtNode(FloatArray &answer, InternalStateType type, InternalStateMode mode, int node, TimeStep *tStep) override
static FloatArrayF< 6 > transformStrainVectorTo(const FloatMatrixF< 3, 3 > &base, const FloatArrayF< 6 > &strain, bool transpose=false)
static FloatArrayF< 6 > transformStressVectorTo(const FloatMatrixF< 3, 3 > &base, const FloatArrayF< 6 > &stress, bool transpose=false)
ZZNodalRecoveryModelInterface(Element *element)
Constructor.
FloatArrayF< 6 > to_voigt_stress_33(const FloatMatrixF< 3, 3 > &t)
FloatArrayF< 6 > to_voigt_strain_33(const FloatMatrixF< 3, 3 > &t)
@ CS_DrillingType
Type of artificially added drilling stiffness for drilling DOFs.
@ CS_DirectorVectorY
Director vector component in y-axis.
@ CS_DrillingStiffness
Penalty stiffness for drilling DOFs.
@ CS_RelDrillingStiffness
Relative penalty stiffness for drilling DOFs.
@ CS_DirectorVectorX
Director vector component in x-axis.
@ CS_DirectorVectorZ
Director vector component in z-axis.
FloatMatrixF< 3, 3 > from_voigt_strain_6(const FloatArrayF< 6 > &v)
FloatMatrixF< 3, 3 > from_voigt_stress_6(const FloatArrayF< 6 > &v)
double det(const FloatMatrixF< 2, 2 > &mat)
Computes the determinant.
FloatArrayF< 3 > cross(const FloatArrayF< 3 > &x, const FloatArrayF< 3 > &y)
Computes $ x \cross y $.
double dot(const FloatArray &x, const FloatArray &y)
FloatMatrixF< N, N > inv(const FloatMatrixF< N, N > &mat, double zeropiv=1e-24)
Computes the inverse.
@ SPRNodalRecoveryModelInterfaceType
@ ZZNodalRecoveryModelInterfaceType
@ SpatialLocalizerInterfaceType
@ NodalAveragingRecoveryModelInterfaceType
FloatArrayF< N > normalize(const FloatArrayF< N > &x)
Normalizes vector (L2 norm).
FloatMatrixF< N, N > eye()
Constructs an identity matrix.
static FloatArray Vec3(const double &a, const double &b, const double &c)
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
#define OOFEG_VARPLOT_PATTERN_LAYER
#define OOFEG_DEFORMED_GEOMETRY_LAYER
#define OOFEG_DEFORMED_GEOMETRY_WIDTH
#define OOFEG_RAW_GEOMETRY_WIDTH
#define OOFEG_RAW_GEOMETRY_LAYER
#define PM_UPDATE_PARAMETER(_val, _pm, _ir, _componentnum, _paramkey, _prio)