35 #include "../sm/Elements/Shells/shell7base.h" 36 #include "../sm/Materials/structuralms.h" 37 #include "../sm/Loads/constantpressureload.h" 80 OOFEM_ERROR(
"Elements derived from Shell7Base only supports layered cross section");
91 OOFEM_ERROR(
"Shell7Base derived elements only supports layered cross section");
147 answer = { D_u, D_v, D_w, W_u, W_v, W_w, Gamma };
174 answer.
add(N.
at(i), ( xbar + zeta * M ));
235 nodeCoords = (xbar + zeta*M);
236 G1.
add(dNdxi.
at(i, 1), nodeCoords);
237 G2.
add(dNdxi.
at(i, 2), nodeCoords);
261 for (
int i = 1; i <= edgeNodes.
giveSize(); i++ ) {
264 nodeCoords = (xbar + zeta*M);
265 G1.
add(dNdxi.
at(i), nodeCoords);
317 for (
int i = 1; i <= edgeNodes.
giveSize(); i++ ) {
342 for (
int i = 1; i <= nDofMan; i++ ) {
344 G1.
add(dNdxi.
at(i, 1), * nodeI);
345 G2.add(dNdxi.
at(i, 2), * nodeI);
348 M.beVectorProductOf(G1, G2);
364 double dgamdxi1, dgamdxi2, gam;
367 double fac1 = ( zeta + 0.5 * gam * zeta * zeta );
368 double fac2 = ( 0.5 * zeta * zeta );
369 double fac3 = ( 1.0 + zeta * gam );
371 g1 = dxdxi1 + fac1*dmdxi1 + fac2*dgamdxi1*m;
372 g2 = dxdxi2 + fac1*dmdxi2 + fac2*dgamdxi2*m;
385 double zeta = lcoords.
at(3);
398 dxdxi = { 3, genEpsEdge.
at(1), genEpsEdge.
at(2), genEpsEdge.
at(3) };
399 dmdxi = { genEpsEdge.
at(4), genEpsEdge.
at(5), genEpsEdge.
at(6) };
400 m = { genEpsEdge.
at(7), genEpsEdge.
at(8), genEpsEdge.
at(9) };
401 double dgamdxi = genEpsEdge.
at(10);
402 double gam = genEpsEdge.
at(11);
404 double fac1 = ( zeta + 0.5 * gam * zeta * zeta );
405 double fac2 = ( 0.5 * zeta * zeta );
406 double fac3 = ( 1.0 + zeta * gam );
409 g2 = dxdxi + fac1*dmdxi + fac2*dgamdxi*m;
445 for (
int i = 1; i <= nLoads; i++ ) {
450 if ( dynamic_cast< ConstantPressureLoad * >( load ) ) {
453 answer.
add(K_pressure);
467 double dgam1, dgam2, gam;
471 double a = zeta + 0.5 * gam * zeta * zeta;
472 double b = 0.5 * zeta * zeta;
473 double c = 1.0 + gam * zeta;
480 aEye=eye; aEye.
times(a);
488 bdg1eye = eye; bdg1eye.times(b*dgam1);
489 bdg2eye = eye; bdg2eye.
times(b*dgam2);
502 lambda[ 2 ].
at(1,13) = lambda[ 2 ].
at(2,14) = lambda[ 2 ].
at(3,15) = c;
515 m = { genEps.
at(13), genEps.
at(14), genEps.
at(15) };
516 double gam = genEps.
at(18);
519 double a = zeta + 0.5 * gam * zeta * zeta;
520 double b = 0.5 * zeta * zeta;
525 lambda.
at(1,1) = lambda.
at(2,2) = lambda.
at(3,3) = 1.0;
526 lambda.
at(1,4) = lambda.
at(2,5) = lambda.
at(3,6) = a;
535 FloatMatrix A [ 3 ] [ 3 ], lambda[ 3 ], A_lambda(3,18), LB;
540 answer.
resize(ndofs, ndofs); tempAnswer.
resize(ndofs, ndofs);
546 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
550 const FloatArray &lCoords = gp->giveNaturalCoordinates();
563 for (
int i = 0; i < 3; i++) {
565 for (
int j = 0; j < 3; j++) {
566 A_lambda.addProductOf(A[i][j], lambda[j]);
568 L.plusProductSymmUpper(lambda[i], A_lambda, 1.0);
580 answer.
assemble(tempAnswer, ordering, ordering);
596 for (
int I = 1; I <= 3; I++) {
597 for (
int J = I; J <= 3; J++) {
598 A[I - 1][J - 1].
resize(3, 3);
599 A[I - 1][J - 1].
zero();
601 for (
int k = 1; k <= 3; k++) {
602 for (
int l = 1; l <= 3; l++) {
603 for (
int m = 1; m <= 3; m++) {
604 for (
int n = 1; n <= 3; n++) {
648 answer.
resize(ndof, ndof);
650 for (
auto *ip: iRule ) {
651 lcoords.at(1) = ip->giveNaturalCoordinate(1);
652 lcoords.at(2) = ip->giveNaturalCoordinate(2);
661 load->
computeValueAt(pressure, tStep, ip->giveNaturalCoordinates(), VM_Total);
674 L.beTProductOf(lambdaN, W2L);
675 L.times( -pressure.
at(1) );
697 answer.
at(2, 3) = v.
at(1);
698 answer.
at(3, 2) = -v.
at(1);
699 answer.
at(1, 3) = -v.
at(2);
700 answer.
at(3, 1) = v.
at(2);
701 answer.
at(1, 2) = v.
at(3);
702 answer.
at(2, 1) = -v.
at(3);
731 static_cast< StructuralMaterial *
>( mat )->giveFirstPKStressVector_3d(vP, gp, vF, tStep);
768 case IST_CauchyStressTensor:
810 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
814 const FloatArray &lCoords = gp->giveNaturalCoordinates();
843 PG1.beColumnOf(PG, 1);
844 PG2.beColumnOf(PG, 2);
849 sectionalForces.
clear();
875 double gam, dg1, dg2;
905 OOFEM_ERROR(
"Shell7Base :: computeLumpedMassMatrix - No lumping algorithm implemented");
926 for (
auto &gp: iRule ) {
927 const FloatArray &lCoords = gp->giveNaturalCoordinates();
931 m = { unknowns.
at(4), unknowns.
at(5), unknowns.
at(6) };
932 double gam = unknowns.
at(7);
941 double rho = mat->
give(
'd', gp);
947 mass.
at(1, 1) = mass.
at(2, 2) = mass.
at(3, 3) = factors.
at(1);
948 mass.
at(1, 4) = mass.
at(2, 5) = mass.
at(3, 6) = factors.
at(2);
949 mass.
at(1, 7) = factors.
at(3) * m.
at(1);
950 mass.
at(2, 7) = factors.
at(3) * m.
at(2);
951 mass.
at(3, 7) = factors.
at(3) * m.
at(3);
952 mass.
at(4, 4) = mass.
at(5, 5) = mass.
at(6, 6) = factors.
at(4);
953 mass.
at(4, 7) = factors.
at(5) * m.
at(1);
954 mass.
at(5, 7) = factors.
at(5) * m.
at(2);
955 mass.
at(6, 7) = factors.
at(5) * m.
at(3);
962 NtmN.
times(dA * rho);
967 answer.
resize(ndofs, ndofs);
980 double a1 = coeff.
at(1);
981 double a2 = coeff.
at(2);
982 double a3 = coeff.
at(3);
988 double gam2 = gam * gam;
991 factors.
at(1) = a3 * h + ( a1 * h3 ) / 12.;
992 factors.
at(2) = h3 * ( 40. * a2 + 20. * a3 * gam + 3. * a1 * h2 * gam ) / 480.;
993 factors.
at(3) = h3 * ( 20. * a3 + 3. * a1 * h2 ) / 480. * 1.0;
994 factors.
at(4) = ( 28. * a3 * h3 * ( 80. + 3. * h2 * gam2 ) + 3. * h5 * ( 112. * a2 * gam + a1 * ( 112. + 5. * h2 * gam2 ) ) ) / 26880.;
995 factors.
at(5) = h5 * ( 56. * a2 + 28. * a3 * gam + 5. * a1 * h2 * gam ) / 8960.;
996 factors.
at(6) = h5 * ( 28. * a3 + 5. * a1 * h2 ) / 8960.;
1012 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
1024 const FloatArray &lCoords = gp->giveNaturalCoordinates();
1038 double rho = mat->
give(
'd', gp);
1044 answer.
assemble(M, ordering, ordering);
1062 double gam, dgam, dA;
1066 for (
auto &gp: iRule ) {
1067 const FloatArray &lCoords = gp->giveNaturalCoordinates();
1074 m = { a.
at(4), a.
at(5), a.
at(6) };
1076 dm = { da.
at(4), da.
at(5), da.
at(6) };
1079 double a1, a2, a3, h, h2, h3, h5, fac1, fac2, fac3, rho;
1083 rho = mat->
give(
'd', gp);
1100 fac1 = rho * h3 * ( 20. * a3 + 3. * a1 * h2 ) / 240.;
1101 fac2 = rho * h5 * ( 56. * a2 + 28. * a3 * gam + 5. * a1 * h2 * gam ) / 4480.;
1102 fac3 = rho * h5 * ( 28. * a3 + 5. * a1 * h2 ) / 4480.;
1103 fm.
at(1) = fac1 * dm.
at(1) * dgam;
1104 fm.
at(2) = fac1 * dm.
at(2) * dgam;
1105 fm.
at(3) = fac1 * dm.
at(3) * dgam;
1106 fm.
at(4) = fac2 * dm.
at(1) * dgam;
1107 fm.
at(5) = fac2 * dm.
at(2) * dgam;
1108 fm.
at(6) = fac2 * dm.
at(3) * dgam;
1123 if ( type != ExternalForcesVector ) {
1159 xi = pLoad->giveLoadOffset();
1162 else if (
ConstantSurfaceLoad* sLoad = dynamic_cast< ConstantSurfaceLoad * >( surfLoad ) ) {
1163 xi = sLoad->giveLoadOffset();
1174 FloatArray Fp, fp, genEps, genEpsC, lCoords(3), traction, solVecC;
1176 for (
auto *ip: *iRule ) {
1177 lCoords.
at(1) = ip->giveNaturalCoordinate(1);
1178 lCoords.at(2) = ip->giveNaturalCoordinate(2);
1207 OOFEM_ERROR(
"incompatible load surface must be 0 for this element");
1217 lcoords.
at(3) = pLoad->giveLoadOffset();
1224 traction.
times( -load.
at(1) );
1225 }
else if (
ConstantSurfaceLoad* sLoad = dynamic_cast< ConstantSurfaceLoad * >( surfLoad ) ) {
1229 lcoords.at(3) = sLoad->giveLoadOffset();
1235 traction.
assemble(tempTraction,sLoad->giveDofIDs());
1280 const FloatArray &lCoords = gp->giveNaturalCoordinates();
1293 FloatArray distrForces(3), distrMoments(3), t1, t2;
1294 distrForces = { components.
at(1), components.
at(2), components.
at(3)};
1295 distrMoments = { components.
at(4), components.
at(5), components.
at(6) };
1298 fT.addSubVector(t1,1);
1299 fT.addSubVector(t2,4);
1300 fT.at(7) = components.
at(7);
1304 for (
int i = 1; i <= 7; i++) {
1305 fT.at(i) = components.
at(i);
1308 OOFEM_ERROR(
"Shell7Base :: computeTractionForce - does not support local coordinate system");
1316 if (map2elementDOFs) {
1332 OOFEM_ERROR(
"Shell7Base :: computeBodyLoadVectorAt - currently not implemented");
1370 if ( type == IST_DirectorField ) {
1400 if ( !elem->
giveIPValue(stressVector, gp, type, tStep) ) {
1401 stressVector.
resize(size);
1402 stressVector.
zero();
1434 sum += fullAnswer.
at(i, j);
1473 recoveredValues.resize(numNodes);
1475 for (
int i = 1; i <= numNodes; i++ ) {
1477 recoveredValues[i-1].resize(9);
1479 for (
int j = 1; j <= recoveredSize; j++ ) {
1480 temp.
at(j) = nValProd.
at(i,j) / nnMatrix.
at(i);
1582 for (
int iEdge = 1; iEdge <= numEdges; iEdge++ ) {
1588 int ndofs_x = 3 * edgeNodes.
giveSize();
1589 for (
int i = 1, j = 0; i <= edgeNodes.
giveSize(); i++, j += 3 ) {
1592 solVec.
at(1 + j) = Xi->
at(1);
1593 solVec.
at(2 + j) = Xi->
at(2);
1594 solVec.
at(3 + j) = Xi->
at(3);
1595 solVec.
at(ndofs_x + 1 + j) = Mi.
at(1);
1596 solVec.
at(ndofs_x + 2 + j) = Mi.
at(2);
1597 solVec.
at(ndofs_x + 3 + j) = Mi.
at(3);
1608 dphidxi1 = { genEps.
at(1), genEps.
at(2), genEps.
at(3) };
1609 dphidxi2 = { genEps.
at(4), genEps.
at(5), genEps.
at(6) };
1610 dmdxi1 = { genEps.
at(7), genEps.
at(8), genEps.
at(9) };
1611 dmdxi2 = { genEps.
at(10), genEps.
at(11), genEps.
at(12) };
1612 m = { genEps.
at(13), genEps.
at(14), genEps.
at(15) };
1613 dgamdxi1 = genEps.
at(16);
1614 dgamdxi2 = genEps.
at(17);
1615 gam = genEps.
at(18);
1627 x = { temp.
at(1), temp.
at(2), temp.
at(3) };
1628 m = { temp.
at(4), temp.
at(5), temp.
at(6) };
1660 answer.
at(1, 1 + j) = N.
at(i);
1661 answer.
at(2, 2 + j) = N.
at(i);
1662 answer.
at(3, 3 + j) = N.
at(i);
1663 answer.
at(4, ndofs_xm + 1 + j) = N.
at(i);
1664 answer.
at(5, ndofs_xm + 2 + j) = N.
at(i);
1665 answer.
at(6, ndofs_xm + 3 + j) = N.
at(i);
1666 answer.
at(7, ndofs_xm * 2 + i) = N.
at(i);
1696 for (
int i = 1, j = 0; i <= ndofman; i++, j += 3 ) {
1697 answer.
at(1, 1 + j) = dNdxi.
at(i);
1698 answer.
at(2, 2 + j) = dNdxi.
at(i);
1699 answer.
at(3, 3 + j) = dNdxi.
at(i);
1703 for (
int i = 1, j = 0; i <= ndofman; i++, j += 3 ) {
1704 answer.
at(4, ndofs_xm + 1 + j) = dNdxi.
at(i);
1705 answer.
at(5, ndofs_xm + 2 + j) = dNdxi.
at(i);
1706 answer.
at(6, ndofs_xm + 3 + j) = dNdxi.
at(i);
1707 answer.
at(7, ndofs_xm + 1 + j) = N.
at(i);
1708 answer.
at(8, ndofs_xm + 2 + j) = N.
at(i);
1709 answer.
at(9, ndofs_xm + 3 + j) = N.
at(i);
1713 for (
int i = 1, j = 0; i <= ndofman; i++, j += 1 ) {
1714 answer.
at(10, ndofs_xm * 2 + 1 + j) = dNdxi.
at(i);
1715 answer.
at(11, ndofs_xm * 2 + 1 + j) = N.
at(i);
1728 answer.
resize(18, ndofs);
1745 for (
int i = 1, j = 0; i <= ndofman; i++, j += 3 ) {
1746 answer.
at(1, 1 + j) = dNdxi.
at(i, 1);
1747 answer.
at(2, 2 + j) = dNdxi.
at(i, 1);
1748 answer.
at(3, 3 + j) = dNdxi.
at(i, 1);
1749 answer.
at(4, 1 + j) = dNdxi.
at(i, 2);
1750 answer.
at(5, 2 + j) = dNdxi.
at(i, 2);
1751 answer.
at(6, 3 + j) = dNdxi.
at(i, 2);
1755 for (
int i = 1, j = 0; i <= ndofman; i++, j += 3 ) {
1756 answer.
at(7, ndofs_xm + 1 + j) = dNdxi.
at(i, 1);
1757 answer.
at(8, ndofs_xm + 2 + j) = dNdxi.
at(i, 1);
1758 answer.
at(9, ndofs_xm + 3 + j) = dNdxi.
at(i, 1);
1759 answer.
at(10, ndofs_xm + 1 + j) = dNdxi.
at(i, 2);
1760 answer.
at(11, ndofs_xm + 2 + j) = dNdxi.
at(i, 2);
1761 answer.
at(12, ndofs_xm + 3 + j) = dNdxi.
at(i, 2);
1762 answer.
at(13, ndofs_xm + 1 + j) = N.
at(i);
1763 answer.
at(14, ndofs_xm + 2 + j) = N.
at(i);
1764 answer.
at(15, ndofs_xm + 3 + j) = N.
at(i);
1768 for (
int i = 1, j = 0; i <= ndofman; i++, j += 1 ) {
1769 answer.
at(16, ndofs_xm * 2 + 1 + j) = dNdxi.
at(i, 1);
1770 answer.
at(17, ndofs_xm * 2 + 1 + j) = dNdxi.
at(i, 2);
1771 answer.
at(18, ndofs_xm * 2 + 1 + j) = N.
at(i);
1795 answer.
at(1, 1 + j) = N.
at(i);
1796 answer.
at(2, 2 + j) = N.
at(i);
1797 answer.
at(3, 3 + j) = N.
at(i);
1798 answer.
at(4, ndofs_xm + 1 + j) = N.
at(i);
1799 answer.
at(5, ndofs_xm + 2 + j) = N.
at(i);
1800 answer.
at(6, ndofs_xm + 3 + j) = N.
at(i);
1801 answer.
at(7, ndofs_xm * 2 + i) = N.
at(i);
1818 globalCoords.
clear();
1822 globalCoords.
add(N.at(i), ( xbar + zeta * M ));
1834 globalCoords.
clear();
1838 globalCoords.
add(N.
at(i), ( xbar + zeta * M ));
1851 double fac = ( zeta + 0.5 * gam * zeta * zeta );
1852 globalCoords = x + fac*m;
1858 vtkPieces.resize(1);
1859 this->
giveShellExportData(vtkPieces[0], primaryVarsToExport, internalVarsToExport, cellVarsToExport, tStep );
1867 const int numCellNodes = 15;
1868 int numTotalNodes = numCellNodes*numCells;
1873 std::vector <FloatArray> nodeCoords;
1880 for (
int layer = 1; layer <= numCells; layer++ ) {
1891 for (
int i = 1; i <= numCellNodes; i++ ) {
1892 nodes.
at(i) = val++;
1897 offset += numCellNodes;
1908 std::vector<FloatArray> updatedNodeCoords;
1910 std::vector<FloatArray> values;
1911 for (
int fieldNum = 1; fieldNum <= primaryVarsToExport.
giveSize(); fieldNum++ ) {
1914 for (
int layer = 1; layer <= numCells; layer++ ) {
1916 if ( type == DisplacementVector ) {
1919 for (
int j = 1; j <= numCellNodes; j++ ) {
1920 u = updatedNodeCoords[j-1];
1928 for (
int j = 1; j <= numCellNodes; j++ ) {
1939 for (
int fieldNum = 1; fieldNum <= internalVarsToExport.
giveSize(); fieldNum++ ) {
1948 for (
int layer = 1; layer <= numCells; layer++ ) {
1950 for (
int j = 1; j <= numCellNodes; j++ ) {
1962 for (
int i = 1; i <= cellVarsToExport.
giveSize(); i++ ) {
1965 for (
int layer = 1; layer <= numCells; layer++ ) {
2003 inod.printYourself(
"recovered-värden");
2021 recoveredValues.resize(numNodes);
2027 for (
int i = 1; i <= numNodes; i++ ) {
2029 double distOld = 3.0;
2031 for (
int j = 0; j < iRule->giveNumberOfIntegrationPoints(); ++j ) {
2035 double dist = nodeCoords.
distance(ipCoords);
2036 if ( dist < distOld ) {
2037 closestIPArray.
at(i) = j;
2044 for (
int i = 1; i <= numNodes; i++ ) {
2048 recoveredValues[i-1].resize(9);
2054 recoveredValues[i-1] = ipValues;
2069 recoveredValues.resize(numNodes);
2073 int numIP = iRule->giveNumberOfIntegrationPoints();
2077 if (numNodes > numIP) {
2078 OOFEM_ERROR(
"Least square fit not possible for more nodes than IP:s per layer.");
2082 FloatMatrix Nbar, NbarTNbar, NbarTNbarInv, Nhat, ipValues, temprecovedValues, temprecovedValuesT;
2083 Nbar.
resize(numIP,numNodes);
2088 for (
int i = 0; i < numIP; i++ ) {
2089 ip = iRule->getIntegrationPoint(i);
2099 tempIPvalues.
zero();
2100 tempIPvalues.
at(1) = 7.8608e+09 * ( 0.2 - ipGlobalCoords.
at(1) ) * ipGlobalCoords.
at(3);
2105 std::vector<FloatArray> nodes;
2120 IntArray strangeNodeNumbering = {2, 1, 3, 5, 4, 6, 7, 9, 8, 10, 12, 11, 13, 14, 15 };
2121 for (
int i = 0; i < numNodes; i++ ) {
2124 nodalStresses.
beColumnOf(temprecovedValuesT,i+1);
2125 recoveredValues[strangeNodeNumbering(i)-1] =
convV6ToV9Stress(nodalStresses);
2127 recoveredValues[strangeNodeNumbering(i)-1].beColumnOf(temprecovedValuesT,i+1);
2143 int numIP = iRule->giveNumberOfIntegrationPoints();
2149 Nbar.
resize(numIP,numNodes);
2151 if ( valueType ==
ISVT_TENSOR_S3 ) { numSC = 6; }
else { numSC = 9; };
2152 ipValues.
resize(numIP,numSC);
2154 for (
int i = 0; i < numIP; i++ ) {
2155 ip = iRule->getIntegrationPoint(i);
2161 std::vector<FloatArray> nodes;
2181 int numEltIP = iRule->giveNumberOfIntegrationPoints();
2182 eltIPvalues.
clear();
2183 eltPolynomialValues.
clear();
2186 for (
int iIP = 0; iIP < numEltIP; iIP++ ) {
2187 ip = iRule->getIntegrationPoint(iIP);
2198 IpCoords.
at(2)*IpCoords.
at(3),IpCoords.
at(1)*IpCoords.
at(3),IpCoords.
at(1)*IpCoords.
at(2),
2199 IpCoords.
at(1)*IpCoords.
at(1),IpCoords.
at(2)*IpCoords.
at(2)};
2209 tractionTop.
zero(); tractionBtm.
zero();
2213 for (
int i = 1; i <= numLoads; i++ ) {
2224 double xi = sLoad->giveLoadOffset();
2225 tractionBC.assemble(tempBC,sLoad->giveDofIDs());
2227 OOFEM_ERROR(
"Number of stress components don't match");
2257 if (numThicknessIP < 2) {
2259 OOFEM_ERROR(
"To few thickness IP per layer to do polynomial fit");
2264 int numWedgeIP = numInPlaneIP*numThicknessIP;
2267 double zeroThicknessLevel = - 0.5 * totalThickness;
2270 FloatMatrix dSmatLayer(3,numInPlaneIP), SmatOld(3,numInPlaneIP);
2274 std::vector <FloatMatrix> dSmatIP; dSmatIP.resize(numberOfLayers);
2275 std::vector <FloatMatrix> dSmat; dSmat.resize(numberOfLayers);
2276 std::vector <FloatMatrix> dSmatIPupd; dSmatIPupd.resize(numberOfLayers);
2277 std::vector <FloatMatrix> dSmatupd; dSmatupd.resize(numberOfLayers);
2280 FloatMatrix tractionTop(3,numInPlaneIP), tractionBtm(3,numInPlaneIP);
2282 SmatOld = tractionBtm;
2291 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
2316 dSmatIP[layer-1].beSubMatrixOf(dSmatLayerIP, 3, 3, 1, numWedgeIP);
2317 dSmat[layer-1].beSubMatrixOf(dSmatLayer, 3, 3, 1, numInPlaneIP);
2324 SmatOld.
add(dSmatLayer);
2333 SmatOld.
add(dSmat[layer-1]);
2342 zeroThicknessLevel = - 0.5 * totalThickness;
2347 integratedStress.
beSubMatrixOf(SmatOld, 3, 3, 1, numInPlaneIP);
2350 fitRecoveredStress2BC(dSmatIPupd, dSmat, dSmatIP, integratedStress, tempTractionBtm, tempTractionTop, zeroThicknessLevel, {1});
2353 FloatArray zeros(numInPlaneIP); zeros.zero();
2354 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
2361 fitRecoveredStress2BC(dSmatIPupd, dSmatupd, dSmat, dSmatIP, SmatOld, tractionBtm, tractionTop, zeroThicknessLevel, {0.0,0.0,1.0}, 1, numberOfLayers);
2363 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
2375 transverseStress.clear();
2379 if (numThicknessIP < 2) {
2381 OOFEM_ERROR(
"To few thickness IP per layer to do polynomial fit");
2386 double zeroThicknessLevel = - 0.5 * totalThickness;
2391 std::vector <FloatMatrix> dSmatIP; dSmatIP.resize(numberOfLayers);
2392 std::vector <FloatMatrix> dSmat; dSmat.resize(numberOfLayers);
2393 std::vector <FloatMatrix> dSmatIPupd; dSmatIPupd.resize(numberOfLayers);
2394 std::vector <FloatMatrix> dSmatupd; dSmatupd.resize(numberOfLayers);
2397 FloatMatrix tractionTop(3,numInPlaneIP), tractionBtm(3,numInPlaneIP);
2399 SmatOld = tractionBtm;
2409 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
2433 SmatOld.
add(dSmat[layer-1]);
2440 zeroThicknessLevel = - 0.5 * totalThickness;
2443 transverseStress.resize(numberOfLayers-1);
2444 fitRecoveredStress2BC(dSmatIPupd, dSmatupd, dSmat, dSmatIP, SmatOld, tractionBtm, tractionTop, zeroThicknessLevel, {0.0,0.0,1.0}, 1, numberOfLayers);
2446 for (
int layer = 1 ; layer < numberOfLayers ; layer++ ) {
2447 transverseStress[layer-1] = dSmatupd[layer-1];
2475 dSmatLayer.
clear(); dSmatLayer.
resize(3,numInPlaneIP);
2476 dSmatLayerIP.
clear(); dSmatLayerIP.
resize(3,numInPlaneIP*numThicknessIP);
2482 int numSampledIP = 0, numCoefficents = 11;
2486 patchIpValues.
zero();
2492 for (
int patchElNum : patchEls) {
2500 int numEltIP = iRule->giveNumberOfIntegrationPoints();
2503 for (
int iIP = 0; iIP < numEltIP; iIP++ ) {
2504 ip = iRule->getIntegrationPoint(iIP);
2509 patchEl->
giveIPValue(tempIPvalues, ip, IST_StressTensor, tStep);
2521 IpCoords.
at(2)*IpCoords.
at(3),IpCoords.
at(1)*IpCoords.
at(3),IpCoords.
at(1)*IpCoords.
at(2),
2522 IpCoords.
at(1)*IpCoords.
at(1),IpCoords.
at(2)*IpCoords.
at(2),
2523 IpCoords.
at(1)*IpCoords.
at(1)*IpCoords.
at(3),IpCoords.
at(2)*IpCoords.
at(2)*IpCoords.
at(3)};
2543 patchEl->
giveSPRcontribution(eltIPvalues,eltPolynomialValues,layer,IST_StressTensor,tStep);
2548 patchIpValues.
setSubMatrix(eltIPvalues,numSampledIP+1,1);
2552 numSampledIP += numEltIP;
2555 if (numSampledIP < numCoefficents*numThicknessIP) {
2557 OOFEM_ERROR(
"To few in-plane IP to do polynomial fit");
2577 aSiz.
resize(2,numCoefficents*2);
2578 aSzz.
resize(1,numCoefficents*3);
2579 for (
int iCol = 1; iCol <= numCoefficents; iCol++) {
2580 aSiz.
at(1,iCol) = a.
at(iCol,1);
2581 aSiz.
at(1,iCol+numCoefficents) = a.
at(iCol,6);
2582 aSiz.
at(2,iCol) = a.
at(iCol,6);
2583 aSiz.
at(2,iCol+numCoefficents) = a.
at(iCol,2);
2584 aSzz.
at(1,iCol) = a.
at(iCol,1);
2585 aSzz.
at(1,iCol+numCoefficents) = 2.0*a.
at(iCol,6);
2586 aSzz.
at(1,iCol+2*numCoefficents) = a.
at(iCol,2);
2593 dSmatLayerIP.
zero();
2602 GaussPoint *gp = iRuleL->getIntegrationPoint(j);
2605 GPcoords.
at(3) = zeroThicknessLevel;
2618 for (
int i = 0; i < numThicknessIP; i++ ) {
2620 int point = i*numInPlaneIP + j;
2622 GaussPoint *gp = iRuleL->getIntegrationPoint(point);
2646 dSmatLayerIP.
at(1,point+1) = dS.
at(1) + dSBtm.
at(1);
2647 dSmatLayerIP.
at(2,point+1) = dS.
at(2) + dSBtm.
at(2);
2657 dSmatLayerIP.
at(3,point+1) = dSzz.
at(1) + dSzzBtm.
at(1);
2666 GPcoords.at(3) = thickness + zeroThicknessLevel;
2675 dSmatLayer.
at(1,j+1) = dS.
at(1) + dSBtm.
at(1);
2676 dSmatLayer.
at(2,j+1) = dS.
at(2) + dSBtm.
at(2);
2686 dSmatLayer.
at(3,j+1) = dSzz.
at(1) + dSzzBtm.
at(1);
2694 int numCoefficents2 = 2;
2701 int numEltIP = iRuleL->giveNumberOfIntegrationPoints();
2702 for (
int iIP = 0; iIP < numEltIP; iIP++ ) {
2703 ip = iRuleL->getIntegrationPoint(iIP);
2707 this->
giveIPValue(tempIPvalues, ip, IST_StressTensor, tStep);
2714 IpCoords.
at(3) -= zeroThicknessLevel;
2736 a2Szz.
resize(1,numCoefficents2*2);
2752 for (
int i = 0; i < numThicknessIP; i++ ) {
2754 int point = i*numInPlaneIP + j;
2756 GaussPoint *gp = iRuleL->getIntegrationPoint(point);
2759 GPcoords.
at(3) -= zeroThicknessLevel;
2769 dSmatLayerIP.
at(3,point+1) += dSzz2.
at(1);
2772 GPcoords.at(3) = thickness;
2786 dSmatLayer.
at(3,j+1) += dSzz2.
at(1);
2793 Shell7Base :: fitRecoveredStress2BC(std::vector<FloatMatrix> &answer1, std::vector<FloatMatrix> &answer2, std::vector<FloatMatrix> &dSmat, std::vector<FloatMatrix> &dSmatIP,
FloatMatrix &SmatOld,
FloatMatrix &tractionBtm,
FloatMatrix &tractionTop,
double zeroThicknessLevel,
FloatArray fulfillBC,
int startLayer,
int endLayer)
2801 int numberOfLayers = startLayer - endLayer + 1;
2804 double totalThickness = 0.0;
2808 for (
int layer = startLayer ; layer <= endLayer; layer++ ) {
2814 OOFEM_ERROR(
"Number of stress components don't match");
2822 for (
int iSC = 1; iSC <= numSC; iSC++) {
2826 intError.
at(iSC,j+1) = tractionTop.
at(iSC,j+1) - SmatOld.
at(iSC,j+1);
2827 C1.
at(iSC,j+1) = (1.0/totalThickness)*intError.
at(iSC,j+1);
2828 SOld.
at(iSC,j+1) = tractionBtm.
at(iSC,j+1) - 0.5*(1.0 - fulfillBC.
at(iSC))*intError.
at(iSC,j+1);
2835 for (
int layer = startLayer ; layer <= endLayer; layer++ ) {
2838 answer1[layer-startLayer].resize(numSC,numInPlaneIP*numThicknessIP);
2839 answer2[layer-startLayer].resize(numSC,numInPlaneIP);
2841 for (
int iSC = 1; iSC <= numSC; iSC++) {
2852 for (
int i = 0 ; i < numThicknessIP ; i++ ) {
2854 int point = i*numInPlaneIP + j;
2856 GaussPoint *gp = iRuleL->getIntegrationPoint(point);
2859 GPcoords.
at(3) -= zeroThicknessLevel;
2862 answer1[layer-startLayer].at(iSC,point+1) = dSmatIP[layer-startLayer].at(iSC,point+1) + C1.
at(iSC,j+1)*GPcoords.
at(3) + SOld.
at(iSC,j+1);
2866 SOld.
at(iSC,j+1) += dSmat[layer-startLayer].at(iSC,j+1) + C1.
at(iSC,j+1)*GPcoords.
at(3);
2870 answer2[layer-startLayer] = SOld;
2887 for (
int i = 0; i < numThicknessIP; i++ ) {
2888 int point = i*numInPlaneIP + j;
2894 GaussPoint *gp = iRuleL->getIntegrationPoint(point);
2898 Sold.
at(5) = dSmatLayerIP.
at(1,point+1);
2899 Sold.
at(4) = dSmatLayerIP.
at(2,point+1);
2900 Sold.
at(3) = dSmatLayerIP.
at(3,point+1);
2902 Sold.
at(8) = Sold.
at(5);
2903 Sold.
at(7) = Sold.
at(4);
2922 for (
int i = 0; i < numThicknessIP; i++ ) {
2923 int point = i*numInPlaneIP + j;
2928 GaussPoint *gp = iRuleL->getIntegrationPoint(point);
2940 Sold.
at(5) = dSmatLayerIP.
at(1,point+1);
2941 Sold.
at(4) = dSmatLayerIP.
at(2,point+1);
2943 Sold.
at(8) = Sold.
at(5);
2944 Sold.
at(7) = Sold.
at(4);
2962 for (
int i = 0; i < numThicknessIP; i++ ) {
2963 int point = i*numInPlaneIP + j;
2964 dSzzMatLayerIP.
at(1,point+1) += SzzMatOld.
at(j+1);
2967 GaussPoint *gp = iRuleL->getIntegrationPoint(point);
2971 Sold.
at(3) = dSzzMatLayerIP.
at(1,point+1);
2995 answer = {0,1,0,0, 0,coords.
at(3),coords.
at(2),2.0*coords.
at(1), 0,
2996 0,0,1,0,coords.
at(3), 0,coords.
at(1), 0,2.0*coords.
at(2)};
3024 answer = {0,coords.
at(3),0,0,0,0.5*coords.
at(3)*coords.
at(3),coords.
at(2)*coords.
at(3),2.0*coords.
at(1)*coords.
at(3),0,coords.
at(1)*coords.
at(3)*coords.
at(3),0,
3025 0,0,coords.
at(3),0,0.5*coords.
at(3)*coords.
at(3),0,coords.
at(1)*coords.
at(3),0,2.0*coords.
at(2)*coords.
at(3),0,coords.
at(2)*coords.
at(3)*coords.
at(3)};
3055 answer = {0,0,0,0,0,0,0,coords.
at(3)*coords.
at(3),0,(1.0/3.0)*coords.
at(3)*coords.
at(3)*coords.
at(3),0,
3056 0,0,0,0,0,0,0.5*coords.
at(3)*coords.
at(3),0,0,0,0,
3057 0,0,0,0,0,0,0,0,coords.
at(3)*coords.
at(3),0,(1.0/3.0)*coords.
at(3)*coords.
at(3)*coords.
at(3)};
3073 Shell7Base :: computeBmatrixForStressRecAt(
FloatArray &lcoords,
FloatMatrix &answer,
int layer,
bool intSzz)
3086 std::vector<FloatArray> nodes;
3098 int ndofs = numNodes*3;
3100 for (
int i = 1, j = 0; i <= numNodes; i++, j += 3 ) {
3101 answer.
at(1, j + 1) = dNdx.
at(i, 1);
3102 answer.
at(1, j + 3) = dNdx.
at(i, 2);
3103 answer.
at(2, j + 2) = dNdx.
at(i, 2);
3104 answer.
at(2, j + 3) = dNdx.
at(i, 1);
3107 int ndofs = numNodes*2;
3109 for (
int i = 1, j = 0; i <= numNodes; i++, j += 2 ) {
3110 answer.
at(1, j + 1) = dNdx.
at(i, 1);
3111 answer.
at(1, j + 2) = dNdx.
at(i, 2);
3134 nodes[i-1].resize(3);
3135 nodes[i-1] = coords;
3153 localCoords.
at(3) = 1.0;
3155 nodes[i-1].resize(3);
3156 nodes[i-1] = coords;
3174 nodes[i-1].resize(3);
3175 nodes[i-1] = coords;
3190 answer.
at(1) = V6.
at(1);
3191 answer.
at(2) = V6.
at(2);
3192 answer.
at(3) = V6.
at(3);
3193 answer.
at(4) = answer.
at(7) = V6.
at(4);
3194 answer.
at(5) = answer.
at(8) = V6.
at(5);
3195 answer.
at(6) = answer.
at(9) = V6.
at(6);
3213 interLamStresses.resize(numInterfaceIP);
3214 FloatArray vSLower, vSUpper, nCov, vSMean(6), stressVec;
3217 for (
int i = 1; i <= numInterfaceIP; i++ ) {
3219 this->
giveIPValue(vSUpper, ip, IST_CauchyStressTensor, tStep);
3221 this->
giveIPValue(vSLower, ip, IST_CauchyStressTensor, tStep);
3224 vSMean = 0.5 * ( vSUpper + vSLower );
3227 interLamStresses.at(i-1).resize( stressVec.
giveSize() );
3228 interLamStresses.at(i-1) = stressVec;
3276 return voigtIndices[ind1][ind2];
double giveDeterminant() const
Returns the trace (sum of diagonal components) of the receiver.
void setInternalVarInNode(int varNum, int nodeNum, FloatArray valueArray)
CrossSection * giveCrossSection()
void CopyIPvaluesToNodes(std::vector< FloatArray > &recoveredValues, int layer, InternalStateType type, TimeStep *tStep)
void temp_computeBoundaryVectorOf(IntArray &dofIdArray, int boundary, ValueModeType u, TimeStep *tStep, FloatArray &answer)
virtual int giveNumberOfNodes() const
Returns the number of geometric nodes of the receiver.
void evalInitialContravarBaseVectorsAt(const FloatArray &lCoords, FloatMatrix &Gcon)
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
The element interface required by NodalAvergagingRecoveryModel.
int giveNumberOfColumns() const
Returns number of columns of receiver.
void setCellVar(int varNum, int cellNum, FloatArray valueArray)
FloatArray initialSolutionVector
void subtract(const FloatArray &src)
Subtracts array src to receiver.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void postInitialize()
Performs post initialization steps.
virtual const IntArray & giveOrderingEdgeNodes() const =0
virtual void giveLocalNodeCoords(FloatMatrix &answer)
Returns a matrix containing the local coordinates for each node corresponding to the interpolation...
virtual void NodalAveragingRecoveryMI_computeNodalValue(FloatArray &answer, int node, InternalStateType type, TimeStep *tStep)
Computes the element value in given node.
virtual void evaldNdxi(FloatMatrix &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the matrix of derivatives of interpolation functions (shape functions) at given point...
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)=0
Evaluates the array of interpolation functions (shape functions) at given point.
int nlGeometry
Flag indicating if geometrical nonlinearities apply.
FloatArray convV6ToV9Stress(const FloatArray &V6)
void beVectorProductOf(const FloatArray &v1, const FloatArray &v2)
Computes vector product (or cross product) of vectors given as parameters, , and stores the result in...
std::vector< std::vector< int > > voigtIndices
static void giveGeneralizedStrainComponents(FloatArray genEps, FloatArray &dphidxi1, FloatArray &dphidxi2, FloatArray &dmdxi1, FloatArray &dmdxi2, FloatArray &m, double &dgamdxi1, double &dgamdxi2, double &gam)
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
Returns local vector of unknowns.
void nodalLeastSquareFitFromIP(std::vector< FloatArray > &recoveredValues, int layer, InternalStateType type, TimeStep *tStep)
virtual Element * ZZNodalRecoveryMI_giveElement()
void giveZintegratedPolynomialGradientForStressRecAt(FloatArray &answer, FloatArray &coords)
void NodalRecoveryMI_computeNNMatrix(FloatArray &answer, int layer, InternalStateType type)
virtual void evaluateFailureCriteriaQuantities(FailureCriteriaStatus *fc, TimeStep *tStep)
virtual IntegrationRule * giveIntegrationRule(int i)
void giveUnknownsAt(const FloatArray &lcoords, FloatArray &solVec, FloatArray &x, FloatArray &m, double &gam, TimeStep *tStep)
Domain * domain
Link to domain object, useful for communicating with other FEM components.
int giveLayerMaterial(int layer)
Wrapper around cell with vertex coordinates stored in FloatArray**.
virtual void vtkEvalUpdatedGlobalCoordinateAt(const FloatArray &localCoords, int layer, FloatArray &globalCoords, TimeStep *tStep)
The element interface required by ZZNodalRecoveryModel.
Abstract base class for "structural" finite elements with geometrical nonlinearities.
virtual void vtkEvalInitialGlobalCZCoordinateAt(const FloatArray &localCoords, int interface, FloatArray &globalCoords)
void computeStressMatrix(FloatMatrix &answer, FloatArray &genEps, GaussPoint *gp, Material *mat, TimeStep *tStep)
virtual int giveNumberOfEdgeDofManagers()=0
Load is specified in global c.s.
void setNumberOfNodes(int numNodes)
double & at(int i)
Coefficient access function.
virtual void giveRecoveredTransverseInterfaceStress(std::vector< FloatMatrix > &transverseStress, TimeStep *tStep)
void beSubMatrixOf(const FloatMatrix &src, int topRow, int bottomRow, int topCol, int bottomCol)
Assigns to the receiver the sub-matrix of another matrix.
virtual void giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord=0)
Evaluates nodal representation of real internal forces.
int giveGlobalNumber() const
std::vector< FloatArray > initialEdgeSolutionVectors
ValueModeType
Type representing the mode of UnknownType or CharType, or similar types.
This class implements a boundary load (force, moment,...) that acts directly on a boundary of some fi...
void setNumberOfInternalVarsToExport(int numVars, int numNodes)
This class implements a structural material status information.
void giveFictiousCZNodeCoordsForExport(std::vector< FloatArray > &nodes, int interface)
void clear()
Clears receiver (zero size).
int giveInterpolationOrder()
Returns the interpolation order.
Elements with geometry defined as EGT_Composite are exported using individual pieces.
LayeredCrossSection * layeredCS
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
virtual double giveGlobalZcoordInLayer(double xi, int layer)
virtual void giveLocalNodeCoords(FloatMatrix &answer)
Returns a matrix containing the local coordinates for each node corresponding to the interpolation...
virtual void giveDofManDofIDMask(int inode, IntArray &) const
Returns dofmanager dof mask for node.
ConnectivityTable * giveConnectivityTable()
Returns receiver's associated connectivity table.
virtual void computeValueAt(FloatArray &answer, TimeStep *tStep, const FloatArray &coords, ValueModeType mode)=0
Computes components values of load at given point - global coordinates (coordinates given)...
virtual int checkConsistency()
Performs consistency check.
virtual int checkConsistency()
Performs consistency check.
virtual double giveUnknown(ValueModeType mode, TimeStep *tStep)=0
The key method of class Dof.
virtual CoordSystType giveCoordSystMode()
Returns receiver's coordinate system.
void beVectorForm(const FloatMatrix &aMatrix)
Reciever will be a vector with 9 components formed from a 3x3 matrix.
void giveSPRcontribution(FloatMatrix &eltIPvalues, FloatMatrix &eltPolynomialValues, int layer, InternalStateType type, TimeStep *tStep)
Abstract base class for all finite elements.
InternalStateValueType
Determines the type of internal variable.
virtual int giveNumberOfDofs()
#define _IFT_Shell7base_recoverStress
virtual void edgeComputeBmatrixAt(const FloatArray &lCoords, FloatMatrix &answer, int li=1, int ui=ALL_STRAINS)
void computeLinearizedStiffness(GaussPoint *gp, StructuralMaterial *mat, TimeStep *tStep, FloatMatrix A[3][3])
virtual void computeComponentArrayAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
Computes boundary condition value - its components values at given time.
virtual void giveLocalNodeCoords(FloatMatrix &answer)
Returns a matrix containing the local coordinates for each node corresponding to the interpolation...
void plusDyadUnsym(const FloatArray &a, const FloatArray &b, double dV)
Adds to the receiver the product .
int giveSymVoigtIndex(int ind1, int ind2)
Class implementing an array of integers.
int & at(int i)
Coefficient access function.
MatResponseMode
Describes the character of characteristic material matrix.
void setNumberOfCells(int numCells)
virtual void computeBodyLoadVectorAt(FloatArray &answer, Load *forLoad, TimeStep *tStep, ValueModeType mode)
Computes the load vector due to body load acting on receiver, at given time step. ...
virtual int giveNumberOfDofManagers() const
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
Computes the global coordinates from given element's local coordinates.
virtual FEInterpolation * giveInterpolation() const
virtual void edgeGiveUpdatedSolutionVector(FloatArray &answer, const int iedge, TimeStep *tStep)
virtual void edgeEvaldNdxi(FloatArray &answer, int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the matrix of derivatives of edge interpolation functions (shape functions) at given point...
virtual void recoverShearStress(TimeStep *tStep)
Abstract base class representing integration rule.
void setupInitialSolutionVector()
This class implements a layered cross section in a finite element problem.
virtual double computeVolumeAroundLayer(GaussPoint *mastergp, int layer)=0
void NodalRecoveryMI_recoverValues(std::vector< FloatArray > &recoveredValues, int layer, InternalStateType type, TimeStep *tStep)
void setSubMatrix(const FloatMatrix &src, int sr, int sc)
Adds the given matrix as sub-matrix to receiver.
virtual const IntArray & giveOrderingNodes() const =0
void beColumnOf(const FloatMatrix &mat, int col)
Reciever will be set to a given column in a matrix.
void giveL2contribution(FloatMatrix &ipValues, FloatMatrix &Nbar, int layer, InternalStateType type, TimeStep *tStep)
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
void setNodeCoords(int nodeNum, FloatArray &coords)
void edgeEvalCovarBaseVectorsAt(const FloatArray &lCoords, const int iedge, FloatMatrix &gcov, TimeStep *tStep)
void beMatrixForm(const FloatArray &aArray)
void computeSectionalForcesAt(FloatArray §ionalForces, IntegrationPoint *ip, Material *mat, TimeStep *tStep, FloatArray &genEpsC, double zeta)
double distance(const FloatArray &x) const
Computes the distance between position represented by receiver and position given as parameter...
Class representing a general abstraction for finite element interpolation class.
virtual void giveCompositeExportData(std::vector< VTKPiece > &vtkPieces, IntArray &primaryVarsToExport, IntArray &internalVarsToExport, IntArray cellVarsToExport, TimeStep *tStep)
double computeIntegralThick()
Returns the total thickness of all layers.
void computeSectionalForces(FloatArray &answer, TimeStep *tStep, FloatArray &solVec, int useUpdatedGpRecord=0)
virtual double give(int aProperty, GaussPoint *gp)
Returns the value of material property 'aProperty'.
virtual void giveEdgeDofMapping(IntArray &answer, int iEdge) const =0
Assembles edge dof mapping mask, which provides mapping between edge local DOFs and "global" element ...
void setCellType(int cellNum, int type)
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Prints output of receiver to stream, for given time step.
void evalInitialCovarBaseVectorsAt(const FloatArray &lCoords, FloatMatrix &Gcov)
double giveNaturalCoordinate(int i) const
Returns i-th natural element coordinate of receiver.
virtual void giveShellExportData(VTKPiece &vtkPiece, IntArray &primaryVarsToExport, IntArray &internalVarsToExport, IntArray cellVarsToExport, TimeStep *tStep)
void NodalRecoveryMI_computeNValProduct(FloatMatrix &answer, int layer, InternalStateType type, TimeStep *tStep)
const IntArray & giveDofManArray() const
virtual void evalCovarNormalAt(FloatArray &nCov, const FloatArray &lCoords, FloatArray &genEpsC, TimeStep *tStep)
void setNumberOfPrimaryVarsToExport(int numVars, int numNodes)
Abstract base class representing a boundary load (force, momentum, ...) that acts directly on a bound...
void giveUpdatedSolutionVector(FloatArray &answer, TimeStep *tStep)
Material * giveMaterial(int n)
Service for accessing particular domain material model.
Element * giveElement(int n)
Service for accessing particular domain fe element.
std::vector< FloatArray > initialNodeDirectors
void edgeEvalInitialDirectorAt(const FloatArray &lCoords, FloatArray &answer, const int iEdge)
double dotProduct(const FloatArray &x) const
Computes the dot product (or inner product) of receiver and argument.
virtual int computeGlobalCoordinatesOnEdge(FloatArray &answer, const FloatArray &lcoords, const int iEdge)
virtual const IntArray & giveOrderingDofTypes() const =0
virtual void giveMassFactorsAt(GaussPoint *gp, FloatArray &answer, double &gam)
This class implements a boundary load (force, moment,...) that acts directly on a boundary of some fi...
double giveLayerThickness(int layer)
virtual void edgeComputeNmatrixAt(const FloatArray &lCoords, FloatMatrix &answer)
void setNumberOfCellVarsToExport(int numVars, int numCells)
void computeBoundaryEdgeLoadVector(FloatArray &answer, BoundaryLoad *load, int boundary, CharType type, ValueModeType mode, TimeStep *tStep, bool global)
Computes the contribution of the given load at the given boundary edge.
virtual double giveWeight()
Returns integration weight of receiver.
int giveVoigtIndex(int ind1, int ind2)
UnknownType
Type representing particular unknown (its physical meaning).
virtual void NodalAveragingRecoveryMI_computeSideValue(FloatArray &answer, int side, InternalStateType type, TimeStep *tStep)
void times(double f)
Multiplies receiver by factor f.
static FEI3dTrQuad interpolationForCZExport
FloatArray & giveInitialNodeDirector(int i)
virtual void ZZNodalRecoveryMI_ComputeEstimatedInterpolationMtrx(FloatArray &answer, GaussPoint *gp, InternalStateType type)
void updateLayerTransvShearStressesSR(FloatMatrix &dSmatLayerIP, FloatMatrix &SmatOld, int layer)
void computeInterLaminarStressesAt(int interfaceNum, TimeStep *tStep, std::vector< FloatArray > &interLamStresses)
CoordSystType
Load coordinate system type.
void setupInitialEdgeSolutionVector()
Wrapper around element definition to provide FEICellGeometry interface.
virtual void evalCovarBaseVectorsAt(const FloatArray &lCoords, FloatMatrix &gcov, FloatArray &genEps, TimeStep *tStep)
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
double giveLayerMidZ(int layer)
void plusProductSymmUpper(const FloatMatrix &a, const FloatMatrix &b, double dV)
Adds to the receiver the product .
void giveLayerContributionToSR(FloatMatrix &dSmat, FloatMatrix &dSmatLayerIP, int layer, double zeroThicknessLevel, TimeStep *tStep)
static FEI3dWedgeQuad interpolationForExport
virtual int giveApproxOrder()=0
IntArray upperInterfacePoints
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix^T and anArray.
Abstract base class for all material models.
double at(int i, int j) const
Coefficient access function.
void giveElementNeighbourList(IntArray &answer, IntArray &elemList)
Returns list of neighboring elements to given elements (they are included too).
FloatArray & giveInitialSolutionVector()
void giveFictiousNodeCoordsForExport(std::vector< FloatArray > &nodes, int layer)
virtual void computeTractionForce(FloatArray &answer, const int iedge, BoundaryLoad *edgeLoad, TimeStep *tStep, ValueModeType mode, bool map2elementDOFs=false)
const FloatArray & giveGlobalCoordinates()
void setPrimaryVarInNode(int varNum, int nodeNum, FloatArray valueArray)
int numberOfGaussPoints
Number of integration points as specified by nip.
void computeThicknessMappingCoeff(GaussPoint *gp, FloatArray &answer)
void subtract(const FloatMatrix &a)
Subtracts matrix from the receiver.
virtual void evalInitialCovarNormalAt(FloatArray &nCov, const FloatArray &lCoords)
virtual int computeNumberOfDofs()
Computes or simply returns total number of element's local DOFs.
void edgeEvalInitialCovarBaseVectorsAt(const FloatArray &lCoords, const int iedge, FloatArray &G1, FloatArray &G3)
Class representing vector of real numbers.
Load is specified in global c.s. but follows the deformation.
void plusDyadSymmUpper(const FloatArray &a, double dV)
Adds to the receiver the dyadic product .
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Prints output of receiver to stream, for given time step.
Implementation of matrix containing floating point numbers.
virtual void vtkEvalInitialGlobalCoordinateAt(const FloatArray &localCoords, int layer, FloatArray &globalCoords)
IRResultType
Type defining the return values of InputRecord reading operations.
virtual double give(CrossSectionProperty a, GaussPoint *gp)
Returns the value of cross section property at given point.
GaussPoint * getIntegrationPoint(int n)
Access particular integration point of receiver.
static void computeIPAverage(FloatArray &answer, IntegrationRule *iRule, Element *elem, InternalStateType isType, TimeStep *tStep)
Computes a cell average of an InternalStateType varible based on the weights in the integrationpoints...
void beMatrixFormOfStress(const FloatArray &aArray)
Reciever will be a 3x3 matrix formed from a vector with either 9 or 6 components. ...
virtual double give(CrossSectionProperty a, GaussPoint *gp)
Returns the value of cross section property at given point.
void setOffset(int cellNum, int offset)
virtual double giveGlobalZcoord(const FloatArray &lCoords)
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
void beSubArrayOf(const FloatArray &src, const IntArray &indx)
Extract sub vector form src array and stores the result into receiver.
IntegrationPointStatus * giveMaterialStatus()
Returns reference to associated material status (NULL if not defined).
void assemble(const FloatArray &fe, const IntArray &loc)
Assembles the array fe (typically, the load vector of a finite element) into the receiver, using loc as location array.
void addSubVectorCol(const FloatArray &src, int sr, int sc)
Adds given vector to receiver starting at given position.
This class represent a 7 parameter shell element.
virtual double computeAreaAround(GaussPoint *gp, double xi)=0
double computeNorm() const
Computes the norm (or length) of the vector.
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
virtual void computeLumpedMassMatrix(FloatMatrix &answer, TimeStep *tStep)
Computes lumped mass matrix of receiver.
virtual void computeMassMatrix(FloatMatrix &answer, TimeStep *tStep)
Computes mass matrix of receiver.
virtual void printYourself() const
Print receiver on stdout.
Class representing a general abstraction for surface finite element interpolation class...
void fitRecoveredStress2BC(std::vector< FloatMatrix > &answer1, std::vector< FloatMatrix > &answer2, std::vector< FloatMatrix > &dSmat, std::vector< FloatMatrix > &dSmatIP, FloatMatrix &SmatOld, FloatMatrix &tractionBtm, FloatMatrix &tractionTop, double zeroThicknessLevel, FloatArray fulfillBC, int startLayer, int endLayer)
void add(const FloatMatrix &a)
Adds matrix to the receiver.
void updateLayerTransvNormalStressSR(FloatMatrix &dSzzMatLayerIP, FloatArray &SzzMatOld, int layer)
virtual void setupInitialNodeDirectors()
Dof * giveDofWithID(int dofID) const
Returns DOF with given dofID; issues error if not present.
virtual void computeMassMatrixNum(FloatMatrix &answer, TimeStep *tStep)
void zero()
Zeroes all coefficients of receiver.
void computeFAt(const FloatArray &lCoords, FloatMatrix &answer, FloatArray &genEps, TimeStep *tStep)
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int li=1, int ui=ALL_STRAINS)
Computes the geometrical matrix of receiver in given integration point.
virtual void edgeEvalN(FloatArray &answer, int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo)=0
Evaluates the array of edge interpolation functions (shape functions) at given point.
void beTProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
void letStressVectorBe(const FloatArray &v)
Assigns stressVector to given vector v.
void computePressureTangentMatrix(FloatMatrix &answer, Load *load, const int iSurf, TimeStep *tStep)
void setColumn(const FloatArray &src, int c)
Sets the values of the matrix in specified column.
virtual Interface * giveInterface(InterfaceType t)
Interface requesting service.
void times(double s)
Multiplies receiver with scalar.
void beTranspositionOf(const FloatMatrix &src)
Assigns to the receiver the transposition of parameter.
virtual void computeBulkTangentMatrix(FloatMatrix &answer, FloatArray &solVec, TimeStep *tStep)
void printYourself() const
Prints matrix to stdout. Useful for debugging.
void recoverValuesFromIP(std::vector< FloatArray > &nodes, int layer, InternalStateType type, TimeStep *tStep, stressRecoveryType SRtype=copyIPvalue)
virtual void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
Computes the stiffness matrix of receiver.
void beSymVectorForm(const FloatMatrix &aMatrix)
Reciever will be a vector with 6 components formed from a 3x3 matrix.
Abstract base class for all "structural" constitutive models.
std::vector< std::unique_ptr< IntegrationRule > > integrationRulesArray
List of integration rules of receiver (each integration rule contains associated integration points a...
virtual int SetUpPointsOnTriangle(int, MaterialMode mode)
Sets up receiver's integration points on triangular (area coords) integration domain.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual FloatArray * giveCoordinates()
void beProductTOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
void zero()
Zeroes all coefficient of receiver.
Domain * giveDomain() const
InterfaceType
Enumerative type, used to identify interface type.
void setConnectivity(int cellNum, IntArray &nodes)
void computeConvectiveMassForce(FloatArray &answer, TimeStep *tStep)
static void giveDualBase(FloatMatrix &base1, FloatMatrix &base2)
virtual double edgeComputeLengthAround(GaussPoint *gp, const int iedge)
Load is base abstract class for all loads.
The element interface required by LayeredCrossSection.
void updateLayerTransvStressesSR(FloatMatrix &dSmatLayerIP, int layer)
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
virtual void computeCauchyStressVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
InternalStateValueType giveInternalStateValueType(InternalStateType type)
int giveNumIntegrationPointsInLayer()
virtual void give3dMaterialStiffnessMatrix_dPdF(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
int giveSize() const
Returns the size of receiver.
void giveTractionBC(FloatMatrix &tractionTop, FloatMatrix &tractionBtm, TimeStep *tStep)
the oofem namespace is to define a context or scope in which all oofem names are defined.
virtual int giveNumberOfEdgeDofs()=0
void assemble(const FloatMatrix &src, const IntArray &loc)
Assembles the contribution using localization array into receiver.
void clear()
Sets size of receiver to be an empty matrix. It will have zero rows and zero columns size...
void beInverseOf(const FloatMatrix &src)
Modifies receiver to become inverse of given parameter.
double normalize()
Normalizes receiver.
Node * giveNode(int i) const
Returns reference to the i-th node of element.
Shell7Base(int n, Domain *d)
void computePressureForce(FloatArray &answer, FloatArray solVec, const int iSurf, BoundaryLoad *surfLoad, TimeStep *tStep, ValueModeType mode)
virtual void computeValueAt(FloatArray &answer, TimeStep *tStep, const FloatArray &coords, ValueModeType mode)
Computes components values of load at given point - global coordinates (coordinates given)...
int giveNumberOfRows() const
Returns number of rows of receiver.
Load * giveLoad(int n)
Service for accessing particular domain load.
void addSubVectorRow(const FloatArray &src, int sr, int sc)
Adds given vector to receiver starting at given position.
virtual int SetUpPointsOnWedge(int nPointsTri, int nPointsDepth, MaterialMode mode)
Sets up receiver's integration points on a wedge integration domain.
virtual int SetUpPointsOnLine(int nPoints, MaterialMode mode)
Sets up receiver's integration points on unit line integration domain.
void symmetrized()
Initializes the lower half of the receiver according to the upper half.
void computeBoundaryVectorOf(const IntArray &bNodes, const IntArray &dofIDMask, ValueModeType u, TimeStep *tStep, FloatArray &answer, bool padding=false)
Boundary version of computeVectorOf.
FloatArray & giveInitialEdgeSolutionVector(int i)
void giveFictiousUpdatedNodeCoordsForExport(std::vector< FloatArray > &nodes, int layer, TimeStep *tStep)
Class representing integration point in finite element program.
IntArray lowerInterfacePoints
IntArray boundaryLoadArray
void computeLambdaNMatrix(FloatMatrix &lambda, FloatArray &genEps, double zeta)
virtual void computeLocalEdgeMapping(IntArray &edgeNodes, int iedge)=0
void computeLambdaGMatrices(FloatMatrix lambda[3], FloatArray &genEps, double zeta)
Class representing solution step.
FloatMatrix giveAxialMatrix(const FloatArray &vec)
void add(const FloatArray &src)
Adds array src to receiver.
virtual double evaldNdx(FloatMatrix &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)=0
Evaluates the matrix of derivatives of interpolation functions (shape functions) at given point...
void giveZ2integratedPolynomial2GradientForStressRecAt(FloatArray &answer, FloatArray &coords)
void evalInitialDirectorAt(const FloatArray &lCoords, FloatArray &answer)
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
virtual void postInitialize()
Performs post initialization steps.
virtual void computeNmatrixAt(const FloatArray &iLocCoords, FloatMatrix &answer)
Computes interpolation matrix for element unknowns.
void computePressureForceAt(GaussPoint *gp, FloatArray &answer, const int iSurf, FloatArray genEps, BoundaryLoad *surfLoad, TimeStep *tStep, ValueModeType mode)
Class representing Gaussian-quadrature integration rule.
void resize(int s)
Resizes receiver towards requested size.
void plusProduct(const FloatMatrix &b, const FloatArray &s, double dV)
Adds the product .