69Shell7BaseXFEM :: checkConsistency()
71 Shell7Base :: checkConsistency();
76Shell7BaseXFEM :: postInitialize()
78 Shell7Base :: postInitialize();
82 int numEI =
xMan->giveNumberOfEnrichmentItems();
85 for (
int i = 1; i <= numEI; i++ ) {
114 for (
int i = 1; i <= neighbors.
giveSize(); i++ ) {
122 for (
int j = 1; j <= damageArray.giveSize(); j++ ) {
123 if (damageArrayNeigh.
at(j) > damageArray.at(j) ) {
124 damageArray.at(j) = damageArrayNeigh.
at(j);
133 for (
int j = 1; j <= damageArray.giveSize(); j++ ) {
134 damageArray.at(j) = 1.0;
137 status->layerDamageValues = damageArray;
169void Shell7BaseXFEM :: initializeFrom(
InputRecord &ir,
int priority)
171 Shell7Base :: initializeFrom(ir, priority);
174 OOFEM_ERROR(
"'czmaterial' this keyword is not in use anymore! Instead define cz material for each interface in the cross secton, ex: interfacematerials 3 x x x ");
179Shell7BaseXFEM :: hasCohesiveZone(
int interfaceNum)
181 if ( interfaceNum <= this->
layeredCS->giveNumberOfLayers()-1 ) {
182 return this->
layeredCS->giveInterfaceMaterialNum(interfaceNum) > 0;
192 return Shell7Base :: giveInterface(it);
196 return Shell7Base :: giveInterface(it);
202Shell7BaseXFEM :: giveDofManDofIDMask(
int inode,
IntArray &answer)
const
207 Shell7Base :: giveDofManDofIDMask(inode, answer);
212 for (
int i = 1; i <=
xMan->giveNumberOfEnrichmentItems(); i++ ) {
227 auto gcov = Shell7Base :: evalCovarBaseVectorsAt(lCoords, genEpsC, tStep);
231 std :: vector< double > ef;
232 for (
int i = 1; i <= this->
xMan->giveNumberOfEnrichmentItems(); i++ ) {
237 auto gcovd = Shell7Base :: evalCovarBaseVectorsAt(lCoords, dGenEps, tStep);
274 plus.
at(3) += 1.0e-9;
277 auto minus = lCoords;
278 minus.
at(3) -= 2.0e-9;
281 return gplus - gminus;
285Shell7BaseXFEM :: giveNumberOfDofs()
288 int nDofs = Shell7Base :: giveNumberOfDofs();
293 for (
int j = 1; j <= this->
xMan->giveNumberOfEnrichmentItems(); j++ ) {
309 Shell7Base :: edgeGiveUpdatedSolutionVector(answer, iedge, tStep);
322 Shell7Base :: giveDofManDofIDMask(0, fieldDofId);
325 IntArray ordering_temp, activeDofsArrayTemp;
330 int activeDofPos = 0, activeDofIndex = 0, orderingDofIndex = 0;
332 IntArray dofManDofIdMask, dofManDofIdMaskAll;
336 if ( ei ==
nullptr ) {
337 Shell7Base :: giveDofManDofIDMask(i, dofManDofIdMask);
344 for (
int j = 1; j <= dofManDofIdMask.
giveSize(); j++ ) {
347 ordering_temp .
at(activeDofPos) = orderingDofIndex + pos;
348 activeDofsArrayTemp.
at(activeDofPos) = activeDofIndex + j;
351 orderingDofIndex += dofManDofIdMaskAll.
giveSize();
352 activeDofIndex += fieldDofId.
giveSize();
354 dofManDofIdMask.
clear();
358 int numActiveDofs = activeDofPos;
359 orderingArray.
resize(numActiveDofs), activeDofsArray.
resize(numActiveDofs);
361 for (
int i = 1; i <= numActiveDofs; i++ ) {
362 orderingArray.
at(i) = ordering_temp.
at(i);
363 activeDofsArray.
at(i) = activeDofsArrayTemp.
at(i);
369Shell7BaseXFEM :: giveInternalForcesVector(
FloatArray &answer,
TimeStep *tStep,
int useUpdatedGpRecord)
387 for (
int i = 1; i <= this->
xMan->giveNumberOfEnrichmentItems(); i++ ) {
406 for (
int j = 1; j <= this->
xMan->giveNumberOfEnrichmentItems(); j++ ) {
407 if ( this->
xMan->giveEnrichmentItem(j)->isElementEnriched(
this) ) {
424 int ndofs = Shell7Base :: giveNumberOfDofs();
425 int numberOfLayers = this->
layeredCS->giveNumberOfLayers();
426 FloatArray f(ndofs), genEps, ftemp, lCoords, Nd;
430 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
434 lCoords = gp->giveNaturalCoordinates();
464 auto PG =
dot(P, Gcon);
465 auto PG1 = PG.column(0);
466 auto PG2 = PG.column(1);
467 auto PG3 = PG.column(2);
476 return sectionalForces;
484 double levelSet = 0.0;
486 levelSet = lCoords.
at(3) -
dynamic_cast< Delamination *
>( ei )->giveDelamXiCoord();
487 }
else if (
dynamic_cast< Crack *
>( ei ) ) {
505 double levelSet = 0.0;
508 levelSet = xiLoad -
dynamic_cast< Delamination *
>( ei )->giveDelamXiCoord();
509 }
else if (
dynamic_cast< Crack *
>( ei ) ) {
510 Crack *crack =
dynamic_cast< Crack *
>( ei );
516 IntArray edgeNodes, globalNums;
517 static_cast< FEInterpolation3d*
>(this->giveInterpolation())->computeLocalEdgeMapping(edgeNodes, edge);
518 globalNums.resize(edgeNodes.giveSize());
519 for (
int i = 1; i <= edgeNodes.giveSize(); i++ ) {
520 globalNums.at(i) = this->giveNode(edgeNodes.at(i))->giveGlobalNumber();
523 crack->interpLevelSet(levelSet,
N, globalNums);
534Shell7BaseXFEM :: evaluateHeavisideXi(
double xi,
ShellCrack *ei)
538 double xiTop = ei->
xiTop;
554Shell7BaseXFEM :: evaluateCutHeaviside(
const double xi,
const double xiBottom,
const double xiTop)
const
560 if ( ( xiBottom <= xi ) && ( xi <= xiTop ) ) {
572 int numZones = this->
layeredCS->giveNumberOfLayers() - 1;
576 for (
int i = 0; i < numZones; i++ ) {
582 mat->
giveIPValue(ipValues, gp, IST_DamageScalar, tStep);
584 double val = ipValues.
at(1);
606 answerTemp.
resize(Shell7Base :: giveNumberOfDofs() );
613 (this->
layeredCS->giveInterfaceMaterial(delamNum) );
620 lCoords.
at(1) = gp->giveNaturalCoordinate(1);
621 lCoords.
at(2) = gp->giveNaturalCoordinate(2);
631 F = this->
computeFAt(lCoords, genEpsC, tStep);
636 jump.rotatedWith(Q,
'n');
646 double zeta = xi * this->
layeredCS->computeIntegralThick() * 0.5;
651 answerTemp.
add(dA, Fcoh);
654 int ndofs = Shell7Base :: giveNumberOfDofs();
657 answer.
assemble(answerTemp, ordering);
665 Shell7Base :: updateYourself(tStep);
667 for (
int i = 0; i < this->
layeredCS->giveNumberOfLayers() - 1; i++ ) {
692 answer.
resize(ndofs, ndofs);
696 for (
int i = 1; i <= this->
xMan->giveNumberOfEnrichmentItems(); i++ ) {
702 for (
int j = 1; j <= this->
xMan->giveNumberOfEnrichmentItems(); j++ ) {
703 for (
int k = j; k <= this->
xMan->giveNumberOfEnrichmentItems(); k++ ) {
738 FloatMatrix answerTemp, Ncoh_j, Ncoh_k, temp, tangent;
739 int nDofs = Shell7Base :: giveNumberOfDofs();
740 answerTemp.
resize(nDofs, nDofs);
746 (this->
layeredCS->giveInterfaceMaterial(delamNum) );
750 for (
auto &gp: *iRuleL ) {
751 FloatArrayF<3> lCoords = { gp->giveNaturalCoordinate(1), gp->giveNaturalCoordinate(2), xi};
772 answerTemp.
add(dA,tangent);
775 answer.
resize(nDofs, nDofs);
778 answer.
assemble(answerTemp, ordering, ordering);
792 perturbedCoords.
at(3) = lCoords.
at(3) + 1.0e-9;
795 perturbedCoords.
at(3) = lCoords.
at(3) - 1.0e-9;
809 answer.
resize(ndofs, ndofs);
812 int numberOfLayers = this->
layeredCS->giveNumberOfLayers();
824 KOrdered.
resize(ndofs,ndofs);
828 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
832 const FloatArray &lCoords = gp->giveNaturalCoordinates();
833 Shell7Base :: computeBmatrixAt(lCoords,B);
836 Shell7Base :: computeLinearizedStiffness(gp, layerMaterial, tStep, A);
844 KOrdered.
assemble(KCC, ordering, ordering);
846 answer.
assemble(tempRed, orderingC, orderingC);
849 int numEI = this->
xMan->giveNumberOfEnrichmentItems();
850 for (
int m = 1; m <= numEI; m++ ) {
859 KOrdered.
assemble(KDC, ordering, ordering);
867 for (
int k = 1; k <= numEI; k++ ) {
878 KOrdered.
assemble(KDD, ordering, ordering);
905 for (
int k = 1; k <= nLoads; k++ ) {
908 Load *load = this->
domain->giveLoad(load_number);
909 std :: vector< double > efM, efK;
915 for (
auto &gp: *iRule ) {
921 answer.
assemble(KCC, orderingC, orderingC);
924 int numEI = this->
xMan->giveNumberOfEnrichmentItems();
925 for (
int m = 1; m <= numEI; m++ ) {
936 if ( efM[0] > 0.1 ) {
938 answer.
assemble(tempRed, orderingC, orderingJ);
940 answer.
assemble(tempRedT, orderingJ, orderingC);
944 for (
int k = 1; k <= numEI; k++ ) {
949 if ( efM[0] > 0.1 && efK[0] > 0.1 ) {
953 answer.
assemble(tempRed, orderingJ, orderingK);
978 Shell7Base :: computeBmatrixAt(lCoords,B);
989 for (
int i = 0; i < 3; i++) {
990 A_lambdaC.zero(); A_lambdaD.
zero();
991 for (
int j = 0; j < 3; j++) {
992 A_lambdaC.addProductOf(A[i][j], lambdaC[j]);
1011 answer.
resize(ndofs, ndofs);
1014 int numberOfLayers = this->
layeredCS->giveNumberOfLayers();
1024 Shell7Base :: computeBulkTangentMatrix(KCC, solVec, tStep );
1026 answer.
assemble(KCC, orderingC, orderingC);
1029 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
1033 const FloatArray &lCoords = gp->giveNaturalCoordinates();
1036 Shell7Base :: computeLinearizedStiffness(gp, layerMaterial, tStep, A);
1043 int numEI = this->
xMan->giveNumberOfEnrichmentItems();
1044 for (
int m = 1; m <= numEI; m++ ) {
1057 for (
int k = 1; k <= numEI; k++ ) {
1091for (
int k = 1; k <= nLoads; k++ ) {
1094 Load *load = this->
domain->giveLoad(load_number);
1095 std :: vector< double > efM, efK;
1101 for (
auto &gp: *iRule ) {
1107 answer.
assemble(KCC, orderingC, orderingC);
1110 int numEI = this->
xMan->giveNumberOfEnrichmentItems();
1111 for (
int m = 1; m <= numEI; m++ ) {
1122 if ( efM[0] > 0.1 ) {
1124 answer.
assemble(tempRed, orderingC, orderingJ);
1126 answer.
assemble(tempRedT, orderingJ, orderingC);
1130for (
int k = 1; k <= numEI; k++ ) {
1135 if ( efM[0] > 0.1 && efK[0] > 0.1 ) {
1139 answer.
assemble(tempRed, orderingJ, orderingK);
1162 std::array<FloatMatrixF<3,18>, 3> lambda1, lambda2;
1168 int eiNum1 = 0, eiNum2 = 0;
1191 int ndofs = Shell7Base :: giveNumberOfDofs();
1195 L.
zero(); A_lambda.zero();
1197 if ( eiNum1 == eiNum2 ) {
1200 for (
int i = 0; i < 3; i++) {
1202 for (
int j = 0; j < 3; j++) {
1203 A_lambda.addProductOf(A[i][j], lambda1[j]);
1205 L.plusProductSymmUpper(lambda1[i], A_lambda, 1.0);
1213 for (
int j = 0; j < 3; j++ ) {
1214 for (
int k = 0; k < 3; k++ ) {
1222 KdIJ.
resize(ndofs,ndofs);
1226 KdIJ.
assemble(KDDtemp, ordering, ordering);
1231std::array<FloatMatrixF<3,18>, 3>
1232Shell7BaseXFEM :: computeLambdaGMatricesDis(
double zeta)
1241 std::array<FloatMatrixF<3,18>, 3> lambda;
1243 lambda[ 0 ].at(1,1) = lambda[ 0 ].at(2,2) = lambda[ 0 ].at(3,3) = 1.;
1244 lambda[ 0 ].at(1,7) = lambda[ 0 ].at(2,8) = lambda[ 0 ].at(3,9) = a;
1247 lambda[ 1 ].at(1,4) = lambda[ 1 ].at(2,5) = lambda[ 1 ].at(3,6) = 1.;
1248 lambda[ 1 ].at(1,10) = lambda[ 1 ].at(2,11) = lambda[ 1 ].at(3,12) = a;
1251 lambda[ 2 ].at(1,13) = lambda[ 2 ].at(2,14) = lambda[ 2 ].at(3,15) = c;
1258Shell7BaseXFEM :: computeLambdaNMatrixDis(
double zeta)
1265 lambda_xd.
at(1,1) = lambda_xd.
at(2,2) = lambda_xd.
at(3,3) = 1.0;
1266 lambda_xd.
at(1,4) = lambda_xd.
at(2,5) = lambda_xd.
at(3,6) = zeta;
1295 auto g1 = gcov.column(0);
1296 auto g2 = gcov.column(1);
1305 auto W2L =
dot(W2,lambdaGC[0]) -
dot(W1,lambdaGC[1]);
1306 auto LCC =-pressure.
at(1) *
Tdot(lambdaNC, W2L);
1308 W2L =
dot(W2,lambdaGD[0]) -
dot(W1,lambdaGD[1]);
1309 auto LCD = -pressure.
at(1) *
Tdot(lambdaNC, W2L);
1311 W2L =
dot(W2,lambdaGD[0]) -
dot(W1,lambdaGD[1]);
1312 auto LDD = -pressure.
at(1) *
Tdot(lambdaND, W2L);
1319 int ndofs = Shell7Base :: giveNumberOfDofs();
1323 KCC.
assemble(KCCtemp, ordering, ordering);
1324 KCD.
assemble(KCDtemp, ordering, ordering);
1325 KDD.
assemble(KDDtemp, ordering, ordering);
1343 int numberOfLayers =
layeredCS->giveNumberOfLayers();
1345 FloatMatrix M11(18, 18), M12(18, 18), M13(18, 6), M22(18, 18), M23(18, 6), M33(6, 6);
1353 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
1365 FloatArray localCoords = gp->giveNaturalCoordinates();
1384 double fac2 = 2.0 * zeta * ( 2.0 + gam * zeta );
1385 double fac3 = 2.0 * zeta * zeta;
1386 double fac4 = zeta * zeta * ( 2.0 + gam * zeta ) * ( 2.0 + gam * zeta );
1387 double fac5 = zeta * zeta * zeta * ( 2.0 + gam * zeta );
1388 double fac6 = zeta * zeta * zeta * zeta;
1389 FloatMatrix mass11(3, 3), mass12(3, 3), mass13(3, 1), mass21(3, 3), mass22(3, 3), mass23(3, 1), mass31(1, 3), mass32(1, 3), mass33(1, 1);
1391 mass11.at(1, 1) = mass11.at(2, 2) = mass11.at(3, 3) = fac1;
1392 mass12.at(1, 1) = mass12.at(2, 2) = mass12.at(3, 3) = fac2;
1393 mass13.at(1, 1) = fac3 * m.
at(1);
1394 mass13.at(2, 1) = fac3 * m.
at(2);
1395 mass13.at(3, 1) = fac3 * m.
at(3);
1396 mass22.at(1, 1) = mass22.at(2, 2) = mass22.at(3, 3) = fac4;
1397 mass23.at(1, 1) = fac5 * m.
at(1);
1398 mass23.at(2, 1) = fac5 * m.
at(2);
1399 mass23.at(3, 1) = fac5 * m.
at(3);
1401 mass21.beTranspositionOf(mass12);
1402 mass31.beTranspositionOf(mass13);
1403 mass32.beTranspositionOf(mass23);
1407 double rho = mat->
give(
'd', gp);
1409 FloatMatrix M11temp, M12temp, M13temp, M22temp, M23temp, M33temp;
1416 M11.add(0.25 * rho * dV, M11temp);
1417 M12.add(0.25 * rho * dV, M12temp);
1418 M13.add(0.25 * rho * dV, M13temp);
1419 M22.add(0.25 * rho * dV, M22temp);
1420 M23.add(0.25 * rho * dV, M23temp);
1421 M33.
add(0.25 * rho * dV, M33temp);
1424 answer.
resize(ndofs, ndofs);
1427 const IntArray &ordering_phibar = this->giveOrdering(Midplane);
1428 const IntArray &ordering_m = this->giveOrdering(Director);
1429 const IntArray &ordering_gam = this->giveOrdering(InhomStrain);
1430 answer.
assemble(M11, ordering_phibar, ordering_phibar);
1431 answer.
assemble(M12, ordering_phibar, ordering_m);
1432 answer.
assemble(M13, ordering_phibar, ordering_gam);
1433 answer.
assemble(M22, ordering_m, ordering_m);
1434 answer.
assemble(M23, ordering_m, ordering_gam);
1435 answer.
assemble(M33, ordering_gam, ordering_gam);
1441 answer.
assemble(M21, ordering_m, ordering_phibar);
1442 answer.
assemble(M31, ordering_gam, ordering_phibar);
1443 answer.
assemble(M32, ordering_gam, ordering_m);
1454 if ( type != ExternalForcesVector ) {
1465 Shell7Base :: computeTractionForce(fT, boundary, edgeLoad, tStep, mode,
true);
1472 coordsTemp.
at(1) = 0.0;
1473 edgeLoad->
computeValueAt(componentsTemp, tStep, coordsTemp, VM_Total);
1482 for (
int i = 1; i <= this->
xMan->giveNumberOfEnrichmentItems(); i++ ) {
1489 answer.
assemble(tempRed, ordering);
1516 for (
auto &gp : *iRule ) {
1517 const auto &lCoords = gp->giveNaturalCoordinates();
1522 if ( coordSystType == Load :: CST_UpdatedGlobal ) {
1529 FloatArray distrForces, distrMoments, t1, t2;
1530 distrForces = { components.
at(1), components.
at(2), components.
at(3) };
1531 distrMoments = { components.
at(4), components.
at(5), components.
at(6) };
1534 fT.addSubVector(t1,1);
1535 fT.addSubVector(t2,4);
1536 fT.at(7) = components.
at(7);
1538 }
else if( coordSystType == Load :: CST_Global ) {
1540 for (
int i = 1; i <= 7; i++) {
1541 fT.at(i) = components.
at(i);
1544 OOFEM_ERROR(
"ModShell7Base :: computeTractionForce - does not support local coordinate system");
1549 Nftemp.beTProductOf(
N, fT*dL);
1555 answer.
resize( Shell7Base :: giveNumberOfDofs() );
1568 FloatArray fT(7), components, lCoords, gCoords, Nf;
1571 answer.
resize( Shell7Base :: giveNumberOfDofs() );
1573 Nf.
resize( Shell7Base :: giveNumberOfDofs() );
1575 for (
auto &gp : iRule ) {
1576 const FloatArray &lCoordsEdge = gp->giveNaturalCoordinates();
1584 lCoords.
at(3) = components.
at(8);
1588 if ( coordSystType == Load :: CST_UpdatedGlobal ) {
1594 FloatArray distrForces, distrMoments, t1, t2;
1595 distrForces = { components.
at(1), components.
at(2), components.
at(3) };
1596 distrMoments = { components.
at(4), components.
at(5), components.
at(6) };
1599 fT.addSubVector(t1,1);
1600 fT.addSubVector(t2,4);
1601 fT.at(7) = components.
at(7);
1603 }
else if( coordSystType == Load :: CST_Global ) {
1605 for (
int i = 1; i <= 7; i++) {
1606 fT.at(i) = components.
at(i);
1609 OOFEM_ERROR(
"ModShell7Base :: computeTractionForce - does not support local coordinate system");
1625 double zeta = lcoords.
at(3);
1639 double dgamdxi = genEpsEdge.
at(10);
1640 double gam = genEpsEdge.
at(11);
1642 double fac1 = ( zeta + 0.5 * gam * zeta * zeta );
1643 double fac2 = ( 0.5 * zeta * zeta );
1644 double fac3 = ( 1.0 + zeta * gam );
1646 const auto g2 =
normalize(dxdxi + fac1*dmdxi + fac2*dgamdxi*m);
1728 if ( ei &&
dynamic_cast< ShellCrack*
>(ei) ) {
1730 int ndofs = Shell7Base :: giveNumberOfDofs();
1732 answer.
resize(18, ndofs);
1761 for (
int i = 1, j = 0; i <= ndofman; i++, j += 3 ) {
1766 std :: vector< double > efGP;
1775 answer.
at(1, 1 + j) = dNdxi.
at(i, 1) * factor;
1776 answer.
at(2, 2 + j) = dNdxi.
at(i, 1) * factor;
1777 answer.
at(3, 3 + j) = dNdxi.
at(i, 1) * factor;
1778 answer.
at(4, 1 + j) = dNdxi.
at(i, 2) * factor;
1779 answer.
at(5, 2 + j) = dNdxi.
at(i, 2) * factor;
1780 answer.
at(6, 3 + j) = dNdxi.
at(i, 2) * factor;
1783 answer.
at(7, ndofs_xm + 1 + j) = dNdxi.
at(i, 1) * factor;
1784 answer.
at(8, ndofs_xm + 2 + j) = dNdxi.
at(i, 1) * factor;
1785 answer.
at(9, ndofs_xm + 3 + j) = dNdxi.
at(i, 1) * factor;
1786 answer.
at(10, ndofs_xm + 1 + j) = dNdxi.
at(i, 2) * factor;
1787 answer.
at(11, ndofs_xm + 2 + j) = dNdxi.
at(i, 2) * factor;
1788 answer.
at(12, ndofs_xm + 3 + j) = dNdxi.
at(i, 2) * factor;
1789 answer.
at(13, ndofs_xm + 1 + j) =
N.at(i) * factor;
1790 answer.
at(14, ndofs_xm + 2 + j) =
N.at(i) * factor;
1791 answer.
at(15, ndofs_xm + 3 + j) =
N.at(i) * factor;
1794 answer.
at(16, ndofs_xm * 2 + 1 + i-1) = dNdxi.
at(i, 1) * factor;
1795 answer.
at(17, ndofs_xm * 2 + 1 + i-1) = dNdxi.
at(i, 2) * factor;
1796 answer.
at(18, ndofs_xm * 2 + 1 + i-1) =
N.at(i) * factor;
1803 Shell7Base :: computeBmatrixAt(lCoords, answer);
1810 Shell7Base :: computeBmatrixAt(lCoords, answer);
1821 double levelSetNode = 0.0;
1823 std :: vector< double >efNode;
1835 return efNode [ 0 ];
1853 int ndofs = Shell7Base :: giveNumberOfDofs();
1866 if ( ei &&
dynamic_cast< Crack*
>(ei) ) {
1876 std :: vector< double > efGP;
1883 answer.
at(1, 1 + j) = factor;
1884 answer.
at(2, 2 + j) = factor;
1885 answer.
at(3, 3 + j) = factor;
1886 answer.
at(4, ndofs_xm + 1 + j) = factor;
1887 answer.
at(5, ndofs_xm + 2 + j) = factor;
1888 answer.
at(6, ndofs_xm + 3 + j) = factor;
1889 answer.
at(7, ndofs_xm * 2 + i) = factor;
1896 Shell7Base :: computeNmatrixAt(lCoords, answer);
1903 Shell7Base :: computeNmatrixAt(lCoords, answer);
1928 if ( ei &&
dynamic_cast< Crack*
>(ei) ) {
1948 std :: vector< double > efGP;
1953 answer.
at(1, 1 + j) =
N.at(i) * factor;
1954 answer.
at(2, 2 + j) =
N.at(i) * factor;
1955 answer.
at(3, 3 + j) =
N.at(i) * factor;
1956 answer.
at(4, ndofs_xm + 1 + j) =
N.at(i) * factor;
1957 answer.
at(5, ndofs_xm + 2 + j) =
N.at(i) * factor;
1958 answer.
at(6, ndofs_xm + 3 + j) =
N.at(i) * factor;
1959 answer.
at(7, ndofs_xm * 2 + i) =
N.at(i) * factor;
1965 Shell7Base :: edgeComputeNmatrixAt(lCoords, answer);
1972 Shell7Base :: edgeComputeNmatrixAt(lCoords, answer);
1989 if ( ei &&
dynamic_cast< Crack*
>(ei) ) {
2014 for (
int i = 1, j = 0; i <= ndofman; i++, j += 3 ) {
2016 std :: vector< double > efGP;
2022 answer.
at(1, 1 + j) = dNdxi.
at(i) * factor;
2023 answer.
at(2, 2 + j) = dNdxi.
at(i) * factor;
2024 answer.
at(3, 3 + j) = dNdxi.
at(i) * factor;
2036 answer.
at(4, ndofs_xm + 1 + j) = dNdxi.
at(i) * factor;
2037 answer.
at(5, ndofs_xm + 2 + j) = dNdxi.
at(i) * factor;
2038 answer.
at(6, ndofs_xm + 3 + j) = dNdxi.
at(i) * factor;
2039 answer.
at(7, ndofs_xm + 1 + j) =
N.at(i) * factor;
2040 answer.
at(8, ndofs_xm + 2 + j) =
N.at(i) * factor;
2041 answer.
at(9, ndofs_xm + 3 + j) =
N.at(i) * factor;
2053 answer.
at(10, ndofs_xm * 2 + 1 + i-1) = dNdxi.
at(i) * factor;
2054 answer.
at(11, ndofs_xm * 2 + 1 + i-1) =
N.at(i) * factor;
2061 Shell7Base :: edgeComputeBmatrixAt(lCoords, answer);
2068 Shell7Base :: edgeComputeBmatrixAt(lCoords, answer);
2088 Shell7Base :: giveUnknownsAt(localCoords, solVec, xc, mc, gamc, tStep);
2089 double fac_cont = ( zeta + 0.5 * gamc * zeta * zeta );
2090 auto globalCoords = xc + fac_cont * mc;
2096 for (
int i = 1; i <= this->
xMan->giveNumberOfEnrichmentItems(); i++ ) {
2105 double fac_disc = ( zeta + 0.5 * gamd * zeta * zeta );
2106 auto xtemp = xd + fac_disc * md;
2107 globalCoords += xtemp;
2111 return globalCoords;
2123 x = {vec.
at(1), vec.
at(2), vec.
at(3)};
2124 m = {vec.
at(4), vec.
at(5), vec.
at(6)};
2130Shell7BaseXFEM :: giveCompositeExportData(std::vector< ExportRegion > &vtkPieces,
IntArray &primaryVarsToExport,
IntArray &internalVarsToExport,
IntArray cellVarsToExport,
TimeStep *tStep )
2132 vtkPieces.resize(1);
2133 this->
giveShellExportData(vtkPieces[0], primaryVarsToExport, internalVarsToExport, cellVarsToExport, tStep );
2141 this->
giveCZExportData(vtkPiece, primaryVarsToExport, internalVarsToExport, cellVarsToExport, tStep );
2148 int numSubCells = 1;
2150 int numLayers = this->
layeredCS->giveNumberOfLayers();
2154 for (
int i = 1; i <= numLayers; i++ ) {
2158 int numCellNodes = 15;
2160 int numTotalNodes = numCellNodes*numCells;
2165 std::vector <FloatArray> nodeCoords;
2168 int currentCell = 1;
2173 for (
int layer = 1; layer <= numLayers; layer++ ) {
2176 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2179 if ( numSubCells == 1 ) {
2180 nodeCoords = Shell7Base :: giveFictiousNodeCoordsForExport(layer);
2185 for (
int node = 1; node <= numCellNodes; node++ ) {
2191 for (
int i = 1; i <= numCellNodes; i++ ) {
2192 nodes.
at(i) = val++;
2197 offset += numCellNodes;
2198 vtkPiece.
setOffset(currentCell, offset);
2211 std::vector<FloatArray> updatedNodeCoords;
2213 std::vector<FloatArray> values;
2214 for (
int fieldNum = 1; fieldNum <= primaryVarsToExport.
giveSize(); fieldNum++ ) {
2225 for (
int layer = 1; layer <= numLayers; layer++ ) {
2228 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2230 if ( type == DisplacementVector ) {
2231 auto nodeCoords = numSubCells == 1 ?
2232 Shell7Base :: giveFictiousNodeCoordsForExport(layer) :
2235 for (
int j = 1; j <= numCellNodes; j++ ) {
2236 u = updatedNodeCoords[j-1];
2244 for (
int j = 1; j <= numCellNodes; j++ ) {
2258 for (
int fieldNum = 1; fieldNum <= internalVarsToExport.
giveSize(); fieldNum++ ) {
2263 for (
int layer = 1; layer <= numLayers; layer++ ) {
2266 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2269 for (
int j = 1; j <= numCellNodes; j++ ) {
2281 for (
int i = 1; i <= cellVarsToExport.
giveSize(); i++ ) {
2285 for (
int layer = 1; layer <= numLayers; layer++ ) {
2287 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2289 VTKXMLExportModule :: computeIPAverage(average, iRuleL.get(),
this, type, tStep);
2293 vtkPiece.
setCellVar(type, currentCell, average);
2309 wedgeToTriMap = { 1, 2, 3, 1, 2, 3, 4, 5, 6, 4, 5, 6, 1, 2, 3 };
2315 for (
int enrItIndex = 1; enrItIndex <= nEnrIt; enrItIndex++ ) {
2318 for (
int layer = 1; layer <= numLayers; layer++ ) {
2322 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2323 FloatArray nodeLocalXi1Coords, nodeLocalXi2Coords, nodeLocalXi3Coords, nodeLocalXi3CoordsMapped;
2324 if ( numSubCells == 1) {
2330 for (
int nodeIndx = 1; nodeIndx <= numCellNodes; nodeIndx++ ) {
2334 lCoords.
beColumnOf(localNodeCoords, nodeIndx);
2338 if ( xfemstype == XFEMST_LevelSetPhi ) {
2343 }
else if ( xfemstype == XFEMST_LevelSetGamma ) {
2347 }
else if ( xfemstype == XFEMST_NodeEnrMarker ) {
2367std::vector<FloatArray>
2368Shell7BaseXFEM :: giveFictiousNodeCoordsForExport(
int layer,
int subCell)
2372 FloatArray nodeLocalXi1Coords, nodeLocalXi2Coords, nodeLocalXi3Coords;
2382 localCoords.
at(1) = nodeLocalXi1Coords.
at(i);
2383 localCoords.
at(2) = nodeLocalXi2Coords.
at(i);
2384 localCoords.
at(3) = nodeLocalXi3Coords.
at(i);
2394std::vector<FloatArray>
2395Shell7BaseXFEM :: giveFictiousCZNodeCoordsForExport(
int layer,
int subCell)
2398 FloatArray nodeLocalXi1Coords, nodeLocalXi2Coords, nodeLocalXi3Coords;
2414std::vector<FloatArray>
2415Shell7BaseXFEM :: giveFictiousUpdatedNodeCoordsForExport(
int layer,
TimeStep *tStep,
int subCell)
2418 FloatArray nodeLocalXi1Coords, nodeLocalXi2Coords, nodeLocalXi3Coords;
2423 if ( subCell == 0) {
2435 double scaleFactor = 0.9999;
2436 double totalThickness = this->
layeredCS->computeIntegralThick();
2437 double zMid_i = this->
layeredCS->giveLayerMidZ(layer);
2438 double xiMid_i = 1.0 - 2.0 * ( totalThickness - this->
layeredCS->giveMidSurfaceZcoordFromBottom() - zMid_i ) / totalThickness;
2439 double deltaxi = localCoords.
at(3) * this->
layeredCS->giveLayerThickness(layer) / totalThickness;
2440 localCoords.
at(3) = xiMid_i + deltaxi * scaleFactor;
2448std::vector<FloatArray>
2449Shell7BaseXFEM :: giveFictiousUpdatedCZNodeCoordsForExport(
int interface,
TimeStep *tStep,
int subCell)
2452 FloatArray nodeLocalXi1Coords, nodeLocalXi2Coords, nodeLocalXi3Coords;
2457 if ( subCell == 0) {
2467 localCoords.
at(3) = 1.0;
2469 double scaleFactor = 0.9999;
2470 double totalThickness = this->
layeredCS->computeIntegralThick();
2471 double zMid_i = this->
layeredCS->giveLayerMidZ(interface);
2472 double xiMid_i = 1.0 - 2.0 * ( totalThickness - this->
layeredCS->giveMidSurfaceZcoordFromBottom() - zMid_i ) / totalThickness;
2473 double deltaxi = localCoords.
at(3) * this->
layeredCS->giveLayerThickness(interface) / totalThickness;
2474 localCoords.
at(3) = xiMid_i + deltaxi * scaleFactor;
2487 for (
int i = 1; i <= 15; i++ ){
2488 double scaleFactor = 0.9999;
2489 double totalThickness = this->
layeredCS->computeIntegralThick();
2490 double zMid_i = this->
layeredCS->giveLayerMidZ(layer);
2491 double xiMid_i = 1.0 - 2.0 * ( totalThickness - this->
layeredCS->giveMidSurfaceZcoordFromBottom() - zMid_i ) / totalThickness;
2492 double deltaxi = local.
at(i) * this->
layeredCS->giveLayerThickness(layer) / totalThickness;
2493 local.
at(i) = xiMid_i + deltaxi * scaleFactor;
2495 answer.
at(i) = local.
at(i);
2504 double scale = 0.9999;
2505 double z = 1.0*scale;
2516 double alpha1 = scale;
double alpha2 = (1.0-alpha1)*0.5;
double alpha3 = alpha2;
2517 g1.resizeWithValues(2); g2.resizeWithValues(2); g3.resizeWithValues(2);
2518 auto gs1 = alpha1*g1 + alpha2*g2 + alpha3*g3;
2519 auto gs2 = alpha2*g1 + alpha1*g2 + alpha3*g3;
2520 auto gs3 = alpha2*g1 + alpha3*g2 + alpha1*g3;
2532 double a = loc1.
at(1);
2533 double b = loc2.
at(1);
2534 double c = loc3.
at(1);
2535 double d = loc12.
at(1);
2536 double e = loc23.
at(1);
2537 double f = loc31.
at(1);
2538 nodeLocalXi1Coords = { a, b, c, a, b, c, d, e, f, d, e, f, a, b, c };
2546 nodeLocalXi2Coords = { a, b, c, a, b, c, d, e, f, d, e, f, a, b, c };
2548 nodeLocalXi3Coords = { -z, -z, -z, z, z, z, -z, -z, -z, z, z, z, 0., 0., 0. };
2559 double scale = 0.999;
2563 auto g1 = this->
allTri[subCell-1].giveVertex(1);
2564 auto g2 = this->
allTri[subCell-1].giveVertex(2);
2565 auto g3 = this->
allTri[subCell-1].giveVertex(3);
2568 double alpha1 = scale;
double alpha2 = (1.0-alpha1)*0.5;
double alpha3 = alpha2;
2569 auto gs1 = alpha1*g1 + alpha2*g2 + alpha3*g3;
2570 auto gs2 = alpha2*g1 + alpha1*g2 + alpha3*g3;
2571 auto gs3 = alpha2*g1 + alpha3*g2 + alpha1*g3;
2583 double a = loc1.
at(1);
2584 double b = loc2.
at(1);
2585 double c = loc3.
at(1);
2586 double d = loc12.
at(1);
2587 double e = loc23.
at(1);
2588 double f = loc31.
at(1);
2589 nodeLocalXi1Coords = { a, b, c, d, e, f };
2597 nodeLocalXi2Coords = { a, b, c, d, e, f };
2599 nodeLocalXi3Coords = { 0., 0., 0., 0., 0., 0. };
2609 int numSubCells = 1;
2610 if ( this->
allTri.size() ) {
2611 numSubCells = (int)this->
allTri.size();
2614 int numInterfaces = this->
layeredCS->giveNumberOfLayers()-1;
2615 int numCells = numInterfaces * numSubCells;
2617 int numCellNodes = 6;
2619 int numTotalNodes = numCellNodes*numCells;
2626 int currentCell = 1;
2631 for (
int layer = 1; layer <= numInterfaces; layer++ ) {
2633 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2636 auto nodeCoords = numSubCells == 1 ?
2637 Shell7Base :: giveFictiousCZNodeCoordsForExport(layer) :
2640 for (
int node = 1; node <= numCellNodes; node++ ) {
2646 for (
int i = 1; i <= numCellNodes; i++ ) {
2647 nodes.
at(i) = val++;
2652 offset += numCellNodes;
2653 vtkPiece.
setOffset(currentCell, offset);
2665 std::vector<FloatArray> values;
2666 for (
int fieldNum = 1; fieldNum <= primaryVarsToExport.
giveSize(); fieldNum++ ) {
2670 for (
int layer = 1; layer <= numInterfaces; layer++ ) {
2671 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2673 if ( type == DisplacementVector ) {
2674 auto nodeCoords = numSubCells == 1 ?
2675 Shell7Base :: giveFictiousCZNodeCoordsForExport(layer) :
2680 for (
int j = 1; j <= numCellNodes; j++ ) {
2681 auto u = updatedNodeCoords[j-1] - nodeCoords[j-1];
2688 for (
int j = 1; j <= numCellNodes; j++ ) {
2702 for (
int fieldNum = 1; fieldNum <= internalVarsToExport.
giveSize(); fieldNum++ ) {
2707 for (
int layer = 1; layer <= numInterfaces; layer++ ) {
2708 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2711 for (
int j = 1; j <= numCellNodes; j++ ) {
2724 for (
int i = 1; i <= cellVarsToExport.
giveSize(); i++ ) {
2728 for (
int layer = 1; layer <= numInterfaces; layer++ ) {
2729 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2730 if ( type == IST_CrossSectionNumber ) {
2739 vtkPiece.
setCellVar(type, currentCell, average);
2755 IntArray wedgeToTriMap({15, 1, 2, 3, 1, 2, 3, 4, 5, 6, 4, 5, 6, 1, 2, 3} );
2763 for (
int enrItIndex = 1; enrItIndex <= nEnrIt; enrItIndex++ ) {
2766 for (
int layer = 1; layer <= numInterfaces; layer++ ) {
2769 for (
int subCell = 1; subCell <= numSubCells; subCell++ ) {
2770 FloatArray nodeLocalXi1Coords, nodeLocalXi2Coords, nodeLocalXi3Coords, nodeLocalXi3CoordsMapped;
2771 if ( numSubCells == 1) {
2777 for (
int nodeIndx = 1; nodeIndx <= numCellNodes; nodeIndx++ ) {
2781 lCoords.
beColumnOf(localNodeCoords, nodeIndx);
2786 if ( xfemstype == XFEMST_LevelSetPhi ) {
2790 }
else if ( xfemstype == XFEMST_LevelSetGamma ) {
2794 }
else if ( xfemstype == XFEMST_NodeEnrMarker ) {
2822 recoveredValues.resize(numNodes);
2830 for (
int i = 1; i <= numNodes; i++ ) {
2832 double distOld = 3.0;
2833 for (
int j = 0; j < iRule->giveNumberOfIntegrationPoints(); j++ ) {
2836 if ( dist < distOld ) {
2837 closestIPArray.
at(i) = j;
2846 for (
int i = 1; i <= numNodes; i++ ) {
2847 if ( this->
layeredCS->giveInterfaceMaterial(interfce) ) {
2849 this->
layeredCS->giveInterfaceMaterial(interfce)->giveIPValue(ipValues, ip, type, tStep);
2854 if ( ipValues.
giveSize() == 0 && type == IST_AbaqusStateVector) {
2855 recoveredValues[i-1].resize(23);
2856 recoveredValues[i-1].zero();
2857 }
else if ( ipValues.
giveSize() == 0 ) {
2859 recoveredValues[i-1].zero();
2864 recoveredValues[i-1] = ipValues;
2885 int numberOfLayers = this->
layeredCS->giveNumberOfLayers();
2890 IntArray delaminationInterface; delaminationInterface.
clear();
2891 IntArray interfaceEI(numberOfLayers-1);
2893 bool hasDelamination =
false;
2894 int numEI = this->
xMan->giveNumberOfEnrichmentItems();
2895 for (
int iEI = 1; iEI <= numEI; iEI++ ) {
2899 hasDelamination =
true;
2904 delaminationInterface.
followedBy(delaminationInterfaceNum);
2905 interfaceEI.
at(delaminationInterfaceNum) = iEI;
2908 delaminationInterface.
sort();
2910 if ( hasDelamination ) {
2913 int numThicknessIP = this->
layeredCS->giveNumIntegrationPointsInLayer();
2914 if (numThicknessIP < 2) {
2916 OOFEM_ERROR(
"To few thickness IP per layer to do polynomial fit");
2919 int numDel = delaminationInterface.
giveSize();
2923 std::vector <FloatMatrix> tractionBC; tractionBC.resize(numDel+2);
2933 tractionBC[0].at(1,i) = tractionBtm.
at(1);
2934 tractionBC[0].at(2,i) = tractionBtm.
at(2);
2935 tractionBC[0].at(3,i) = tractionBtm.
at(3);
2936 tractionBC[numDel+1].at(1,i) = tractionTop.
at(1);
2937 tractionBC[numDel+1].at(2,i) = tractionTop.
at(2);
2938 tractionBC[numDel+1].at(3,i) = tractionTop.
at(3);
2942 for (
int iDel = 1 ; iDel <= numDel ; iDel++) {
2946 int interfaceNum = delaminationInterface.
at(iDel);
2955 OOFEM_ERROR(
"Interface IPs doesn't match the element IPs");
2962 FloatArray lCoords(3), nCov, CZPKtraction(3);
2967 lCoords.
at(1) = gp->giveNaturalCoordinate(1);
2968 lCoords.
at(2) = gp->giveNaturalCoordinate(2);
2992 this->
computeFAt(lCoords, F, genEpsC, tStep);
2997 jump.rotatedWith(Q,
'n');
3005 if (intMatStatus == 0) {
3015 tractionBC[iDel].at(1,iIGP) = CZPKtraction.
at(1);
3016 tractionBC[iDel].at(2,iIGP) = CZPKtraction.
at(2);
3017 tractionBC[iDel].at(3,iIGP) = CZPKtraction.
at(3);
3023 tractionBC[iDel].zero();
3029 double totalThickness = this->
layeredCS->computeIntegralThick();
3030 double zeroThicknessLevel = - 0.5 * totalThickness;
3036 delaminationInterface.
followedBy(numberOfLayers);
3037 for (
int topLayer : delaminationInterface) {
3038 SmatOld = tractionBC[iInt];
3039 int numDelLayers = topLayer-layerOld;
3040 std::vector <FloatMatrix> dSmatIP; dSmatIP.
resize(numDelLayers);
3041 std::vector <FloatMatrix> dSmat; dSmat.
resize(numDelLayers);
3042 std::vector <FloatMatrix> dSmatIPupd; dSmatIPupd.resize(numDelLayers);
3043 std::vector <FloatMatrix> dSmatupd; dSmatupd.resize(numDelLayers);
3047 for (
int delLayer = 1 ; delLayer <= numDelLayers; delLayer++ ) {
3048 this->
giveLayerContributionToSR(dSmat[delLayer-1], dSmatIP[delLayer-1], delLayer+layerOld, zeroThicknessLevel + dz, tStep);
3049 SmatOld.
add(dSmat[delLayer-1]);
3050 dz += this->
layeredCS->giveLayerThickness(delLayer+layerOld);
3055 this->
fitRecoveredStress2BC(dSmatIPupd, dSmatupd, dSmat, dSmatIP, SmatOld, tractionBC[iInt], tractionBC[iInt+1], zeroThicknessLevel, {0.0,0.0,1.0}, layerOld+1, topLayer);
3057 for (
int layer = 1 ; layer <= numDelLayers; layer++ ) {
3061 zeroThicknessLevel += dz;
3062 layerOld = topLayer;
3066 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
3081 zeroThicknessLevel += this->
layeredCS->giveLayerThickness(layer);
3084 if ( layerHasBC.at(layer+1) ) {
3094 if (iRuleI->giveNumberOfIntegrationPoints() !=
numInPlaneIP ) {
3095 OOFEM_ERROR(
"Interface IPs doesn't match the element IPs");
3098 FloatArray lCoords(3), nCov, CZPKtraction(3);
3099 CZPKtraction.
zero();
3104 lCoords.
at(1) = gp->giveNaturalCoordinate(1);
3105 lCoords.
at(2) = gp->giveNaturalCoordinate(2);
3108 FloatArray GPcoords = gp->giveGlobalCoordinates();
3126 if (intMatStatus == 0) {
3139 SmatOld.
at(1,iIGP) = CZPKtraction.
at(1);
3140 SmatOld.
at(2,iIGP) = CZPKtraction.
at(2);
3141 SmatOld.
at(3,iIGP) = CZPKtraction.
at(3);
3159 Shell7Base :: recoverShearStress(tStep);
3173 failedInterfaces.
clear();
3174 std :: vector < FloatMatrix > transverseInterfaceStresses;
3175 if (recoverStresses) {
3185 this->
giveLayeredCS()->giveInterfaceXiCoords(interfaceXiCoords);
3188 for (
int iInterface = 1 ; iInterface < this->
layeredCS->giveNumberOfLayers() ; iInterface++ ) {
3190 bool initiateElt =
false;
3191 int interfaceMatNumber(this->
giveLayeredCS()->giveInterfaceMaterialNum(iInterface));
3205 if (temp.
giveSize() == 1 && temp.
at(1) > 0) {
3214 OOFEM_ERROR(
"Intitiation stress for delaminations not found or incorrect on CZ-material" );
3219 for (
int iGP = 1 ; iGP <= transverseInterfaceStresses[iInterface-1].giveNumberOfColumns() ; iGP++ ) {
3220 if ( transverseInterfaceStresses[iInterface-1].giveNumberOfRows() != numSC ) {
3221 OOFEM_ERROR(
"Wrong number of stress components" );
3226 interfaceStresses.
beColumnOf(transverseInterfaceStresses[iInterface-1],iGP);
3230 GaussPoint *gp = iRuleI->getIntegrationPoint(iGP-1);
3233 lCoords.
at(3) = interfaceXiCoords.
at(iInterface);
3247 double S1(interfaceStresses.
at(1));
3248 double S2(interfaceStresses.
at(2));
3249 double N(interfaceStresses.
at(3));
3253 double NM = 0.5*(
N + fabs(
N));
3254 double failCrit = NM*NM/(sigF.
at(3)*sigF.
at(3)) + (S1*S1 + S2*S2)/(sigF.
at(1)*sigF.
at(1));
3255 if (failCrit > (initiationFactors.
at(iInterface)*initiationFactors.
at(iInterface))) {
3257 failurestresses.
at(1,iInterface) = NM;
3258 failurestresses.
at(2,iInterface) = sqrt(S1*S1 + S2*S2);
3288 if (failedInterfaces.
giveSize() > 0) {
3289 printf(
" Delamination criterion was activated in element %i : \n",this->
giveGlobalNumber() );
3290 for (
auto iInterface : failedInterfaces) {
3291 printf(
" Interface %i - NM = %f, S = %f \n",iInterface,failurestresses.
at(1,iInterface),failurestresses.
at(2,iInterface));
3300 transverseStress.clear();
3301 int numberOfLayers = this->
layeredCS->giveNumberOfLayers();
3302 transverseStress.resize(numberOfLayers-1);
3303 int numThicknessIP = this->
layeredCS->giveNumIntegrationPointsInLayer();
3306 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
3308 if (layer < numberOfLayers) {
3315 for (
int i = 0; i < numThicknessIP; i++ ) {
3321 this->
giveIPValue(tempIPvalues, ip, IST_StressTensor, tStep);
3323 for (
int iInt = layer-1 ; iInt <= layer ; iInt++ ) {
3324 if ( iInt > 0 && iInt < numberOfLayers ) {
3325 transverseStress[iInt-1].at(1,j+1) += (0.5/numThicknessIP)*tempIPvalues.
at(5);
3326 transverseStress[iInt-1].at(2,j+1) += (0.5/numThicknessIP)*tempIPvalues.
at(4);
3327 transverseStress[iInt-1].at(3,j+1) += (0.5/numThicknessIP)*tempIPvalues.
at(3);
3337Shell7BaseXFEM :: giveRecoveredTransverseInterfaceStress(std::vector<FloatMatrix> &transverseStress,
TimeStep *tStep)
3339 transverseStress.clear();
3342 int numberOfLayers = this->
layeredCS->giveNumberOfLayers();
3344 IntArray delaminationInterface; delaminationInterface.
clear();
3345 IntArray interfaceEI(numberOfLayers-1);
3347 bool hasDelamination =
false;
3348 int numEI = this->
xMan->giveNumberOfEnrichmentItems();
3349 for (
int iEI = 1; iEI <= numEI; iEI++ ) {
3353 hasDelamination =
true;
3357 delaminationInterface.
followedBy(delaminationInterfaceNum);
3358 interfaceEI.
at(delaminationInterfaceNum) = iEI;
3361 delaminationInterface.
sort();
3363 if ( hasDelamination ) {
3364 transverseStress.resize(numberOfLayers-1);
3367 int numThicknessIP = this->
layeredCS->giveNumIntegrationPointsInLayer();
3368 if (numThicknessIP < 2) {
3370 OOFEM_ERROR(
"To few thickness IP per layer to do polynomial fit");
3373 int numDel = delaminationInterface.
giveSize();
3377 std::vector <FloatMatrix> tractionBC; tractionBC.resize(numDel+2);
3383 for (
int iDel = 1 ; iDel <= numDel ; iDel++) {
3387 int interfaceNum = delaminationInterface.
at(iDel);
3395 OOFEM_ERROR(
"Interface IPs doesn't match the element IPs");
3398 (this->
layeredCS->giveInterfaceMaterial(interfaceNum) );
3400 FloatArray lCoords(3), nCov, CZPKtraction(3);
3401 CZPKtraction.
zero();
3404 for (
auto &gp : *iRuleI ) {
3406 lCoords.
at(1) = gp->giveNaturalCoordinate(1);
3407 lCoords.
at(2) = gp->giveNaturalCoordinate(2);
3427 this->
computeFAt(lCoords, F, genEpsC, tStep);
3432 jump.rotatedWith(Q,
'n');
3440 if (intMatStatus == 0) {
3449 tractionBC[iDel].at(1,iIGP) = CZPKtraction.
at(1);
3450 tractionBC[iDel].at(2,iIGP) = CZPKtraction.
at(2);
3451 tractionBC[iDel].at(3,iIGP) = CZPKtraction.
at(3);
3456 tractionBC[iDel].zero();
3461 double totalThickness = this->
layeredCS->computeIntegralThick();
3462 double zeroThicknessLevel = - 0.5 * totalThickness;
3468 delaminationInterface.
followedBy(numberOfLayers);
3469 for (
int topLayer : delaminationInterface) {
3470 SmatOld = tractionBC[iInt];
3471 int numDelLayers = topLayer-layerOld;
3472 std::vector <FloatMatrix> dSmatIP; dSmatIP.
resize(numDelLayers);
3473 std::vector <FloatMatrix> dSmat; dSmat.
resize(numDelLayers);
3474 std::vector <FloatMatrix> dSmatIPupd; dSmatIPupd.resize(numDelLayers);
3475 std::vector <FloatMatrix> dSmatupd; dSmatupd.resize(numDelLayers);
3479 for (
int delLayer = 1 ; delLayer <= numDelLayers; delLayer++ ) {
3480 this->
giveLayerContributionToSR(dSmat[delLayer-1], dSmatIP[delLayer-1], delLayer+layerOld, zeroThicknessLevel + dz, tStep);
3481 SmatOld.
add(dSmat[delLayer-1]);
3482 dz += this->
layeredCS->giveLayerThickness(delLayer+layerOld);
3487 this->
fitRecoveredStress2BC(dSmatIPupd, dSmatupd, dSmat, dSmatIP, SmatOld, tractionBC[iInt], tractionBC[iInt+1], zeroThicknessLevel, {0.0,0.0,1.0}, layerOld+1, topLayer);
3489 for (
int delLayer = 1 ; delLayer <= numDelLayers; delLayer++ ) {
3490 if ( (delLayer + layerOld) < numberOfLayers ) {
3491 transverseStress[delLayer+layerOld-1] = dSmatupd[delLayer-1];
3495 zeroThicknessLevel += dz;
3496 layerOld = topLayer;
3501 Shell7Base :: giveRecoveredTransverseInterfaceStress(transverseStress, tStep);
void computeValueAt(FloatArray &answer, TimeStep *tStep, const FloatArray &coords, ValueModeType mode) override
int giveApproxOrder() override=0
CoordSystType giveCoordSystMode() override
void giveElementNeighbourList(IntArray &answer, const IntArray &elemList)
int giveDelamInterfaceNum() const
double giveBoundingDelamXiCoord() const
double giveDelamXiCoord() const
void evaluateEnrFuncAt(std ::vector< double > &oEnrFunc, const FloatArray &iGlobalCoord, const FloatArray &iLocalCoord, int iNodeInd, const Element &iEl) const override
int giveGlobalNumber() const
std::vector< Dof * >::const_iterator findDofWithDofId(DofIDItem dofID) const
const FloatArray & giveCoordinates() const
std::vector< Dof * >::iterator begin()
int giveGlobalNumber() const
Node * giveNode(int i) const
IntArray boundaryLoadArray
virtual FEInterpolation * giveInterpolation() const
const IntArray & giveDofManArray() const
int numberOfDofMans
Number of dofmanagers.
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
virtual int giveNumberOfDofManagers() const
DofManager * giveDofManager(int i) const
CrossSection * giveCrossSection()
virtual bool computeLocalCoordinates(FloatArray &answer, const FloatArray &gcoords)
bool evalNodeEnrMarkerInNode(double &oNodeEnrMarker, int iNodeInd) const
virtual void giveEIDofIdArray(IntArray &answer) const
bool evalLevelSetTangInNode(double &oLevelSet, int iNodeInd, const FloatArray &iGlobalCoord) const
bool isElementEnriched(const Element *element) const
bool isDofManEnriched(const DofManager &iDMan) const
virtual void evaluateEnrFuncAt(std ::vector< double > &oEnrFunc, const FloatArray &iGlobalCoord, const FloatArray &iLocalCoord, int iNodeInd, const Element &iEl) const =0
bool evalLevelSetNormalInNode(double &oLevelSet, int iNodeInd, const FloatArray &iGlobalCoord) const
Stores all neccessary data (of a region) in a VTKPiece so it can be exported later.
void setCellVar(InternalStateType type, int cellNum, FloatArray valueArray)
void setInternalVarInNode(InternalStateType type, int nodeNum, FloatArray valueArray)
void setInternalXFEMVarInNode(int varNum, int eiNum, int nodeNum, FloatArray valueArray)
void setCellType(int cellNum, int type)
void setNumberOfCellVarsToExport(const IntArray &cellVars, int numCells)
void setNumberOfInternalVarsToExport(const IntArray &ists, int numNodes)
void setNumberOfInternalXFEMVarsToExport(int numVars, int numEnrichmentItems, int numNodes)
void setNumberOfPrimaryVarsToExport(const IntArray &primVars, int numNodes)
void setConnectivity(int cellNum, IntArray &nodes)
void setPrimaryVarInNode(UnknownType type, int nodeNum, FloatArray valueArray)
void setOffset(int cellNum, int offset)
void setNumberOfCells(int numCells)
void setNodeCoords(int nodeNum, const FloatArray &coords)
void setNumberOfNodes(int numNodes)
Domain * giveDomain() const
Domain * domain
Link to domain object, useful for communicating with other FEM components.
std ::vector< std ::vector< FloatArray > > quantities
double & at(std::size_t i)
void assemble(const FloatArray &fe, const IntArray &loc)
void plusProduct(const FloatMatrix &b, const FloatArray &s, double dV)
double dotProduct(const FloatArray &x) const
Index giveSize() const
Returns the size of receiver.
void resizeWithValues(Index s, std::size_t allocChunk=0)
void beColumnOf(const FloatMatrix &mat, int col)
virtual void printYourself() const
void zero()
Zeroes all coefficients of receiver.
void rotatedWith(FloatMatrix &r, char mode)
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
void subtract(const FloatArray &src)
void beSubArrayOf(const FloatArray &src, const IntArray &indx)
double at(std::size_t i, std::size_t j) const
static FloatMatrixF< N, M > fromColumns(FloatArrayF< N > const (&x)[M]) noexcept
void rotatedWith(const FloatMatrix &r, char mode='n')
void plusProductSymmUpper(const FloatMatrix &a, const FloatMatrix &b, double dV)
void add(const FloatMatrix &a)
void resize(Index rows, Index cols)
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
void beSubMatrixOf(const FloatMatrix &src, Index topRow, Index bottomRow, Index topCol, Index bottomCol)
void plusProductUnsym(const FloatMatrix &a, const FloatMatrix &b, double dV)
int giveNumberOfColumns() const
Returns number of columns of receiver.
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
void addProductOf(const FloatMatrix &a, const FloatMatrix &b)
void beTranspositionOf(const FloatMatrix &src)
void zero()
Zeroes all coefficient of receiver.
void beLocalCoordSys(const FloatArray &normal)
*Prints matrix to stdout Useful for debugging void printYourself() const
void assemble(const FloatMatrix &src, const IntArray &loc)
double at(std::size_t i, std::size_t j) const
void subtract(const FloatMatrix &a)
void beTProductOf(const FloatMatrix &a, const FloatMatrix &b)
static FloatMatrix fromCols(std ::initializer_list< FloatArray >mat)
int SetUpPointsOnLine(int nPoints, MaterialMode mode) override
double giveNaturalCoordinate(int i) const
Returns i-th natural element coordinate of receiver.
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
void interpLevelSet(double &oLevelSet, const FloatArray &iN, const IntArray &iNodeInd) const
void followedBy(const IntArray &b, int allocChunk=0)
virtual void computeValueAt(FloatArray &answer, TimeStep *tStep, const FloatArray &coords, ValueModeType mode)=0
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual double give(int aProperty, GaussPoint *gp) const
std::vector< IntArray > activeDofsArrays
FEI3dTrQuad interpolationForCZExport
void edgeGiveUpdatedSolutionVector(FloatArray &answer, const int iedge, TimeStep *tStep) override
virtual void discComputeStiffness(FloatMatrix &LCC, FloatMatrix &LDD, FloatMatrix &LDC, IntegrationPoint *ip, int layer, FloatMatrix A[3][3], TimeStep *tStep)
void computeCohesiveTangent(FloatMatrix &answer, TimeStep *tStep)
IntArray numSubDivisionsArray
double evaluateCutHeaviside(const double xi, const double xiBottom, const double xiTop) const
void giveDisUnknownsAt(const FloatArrayF< 3 > &lCoords, EnrichmentItem *ei, const FloatArray &solVec, FloatArrayF< 3 > &x, FloatArrayF< 3 > &m, double &gam, TimeStep *tStep)
FloatMatrixF< 3, 7 > computeLambdaNMatrixDis(double zeta)
void mapXi3FromLocalToShell(FloatArray &answer, FloatArray &local, int layer)
void edgeComputeEnrichedNmatrixAt(const FloatArray &lCoords, FloatMatrix &answer, EnrichmentItem *ei, const int edge)
FloatArray computeSectionalForcesAt(IntegrationPoint *ip, Material *mat, TimeStep *tStep, FloatArray &genEps, double zeta)
static ParamKey IPK_Shell7BaseXFEM_CohesiveZoneMaterial
void computeDiscGeneralizedStrainVector(FloatArray &dGenEps, const FloatArray &lCoords, EnrichmentItem *ei, TimeStep *tStep)
std ::vector< Triangle > allTri
std::vector< FloatArray > giveFictiousCZNodeCoordsForExport(int layer, int subCell)
void computeEnrTractionForce(FloatArray &answer, const int iedge, BoundaryLoad *edgeLoad, TimeStep *tStep, ValueModeType mode, EnrichmentItem *ei)
int giveNumberOfDofs() override
std ::vector< std ::unique_ptr< IntegrationRule > > czIntegrationRulesArray
void discComputeSectionalForces(FloatArray &answer, TimeStep *tStep, FloatArray &solVec, FloatArray &solVecD, EnrichmentItem *ei)
void giveAverageTransverseInterfaceStress(std::vector< FloatMatrix > &transverseStress, TimeStep *tStep)
IntArray DelaminatedInterfaceList
void computeCohesiveNmatrixAt(const FloatArray &lCoords, FloatMatrix &answer, EnrichmentItem *ei)
Shell7BaseXFEM(int n, Domain *d)
FloatArrayF< 3 > computeInterfaceJumpAt(int interf, const FloatArrayF< 3 > &lCoords, TimeStep *tStep)
void recoverValuesFromCZIP(std::vector< FloatArray > &recoveredValues, int interfce, InternalStateType type, TimeStep *tStep)
void computeOrderingArray(IntArray &orderingArray, IntArray &activeDofsArray, EnrichmentItem *ei)
std ::vector< std ::vector< Triangle > > crackSubdivisions
std::vector< FloatArray > giveFictiousUpdatedNodeCoordsForExport(int layer, TimeStep *tStep, int subCell)
void computePressureTangentMatrixDis(FloatMatrix &KCC, FloatMatrix &KCD, FloatMatrix &KDD, IntegrationPoint *ip, Load *load, const int iSurf, TimeStep *tStep)
virtual void OLDcomputeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
double evaluateHeavisideXi(double xi, ShellCrack *ei)
void jump(FloatMatrix lambda, FloatArray deltaUnknowns)
std::vector< FloatArray > giveFictiousUpdatedCZNodeCoordsForExport(int layer, TimeStep *tStep, int subCell)
void giveCZExportData(ExportRegion &vtkPiece, IntArray &primaryVarsToExport, IntArray &internalVarsToExport, IntArray cellVarsToExport, TimeStep *tStep)
double evaluateLevelSet(const FloatArray &lCoords, EnrichmentItem *ei)
void giveRecoveredTransverseInterfaceStress(std::vector< FloatMatrix > &transverseStress, TimeStep *tStep) override
void giveLocalNodeCoordsForExport(FloatArray &nodeLocalXi1Coords, FloatArray &nodeLocalXi2Coords, FloatArray &nodeLocalXi3Coords, int subCell, int layer, FloatMatrix &localNodeCoords)
void computeDiscSolutionVector(IntArray &dofIdArray, TimeStep *tStep, FloatArray &solVecD)
void edgeComputeEnrichedBmatrixAt(const FloatArray &lCoords, FloatMatrix &answer, EnrichmentItem *ei, const int edge)
bool hasCohesiveZone(int interfaceNum)
void computeCohesiveForces(FloatArray &answer, TimeStep *tStep, FloatArray &solVec, FloatArray &solVecD, EnrichmentItem *ei, EnrichmentItem *coupledToEi)
double EvaluateEnrFuncInDofMan(int dofManNum, EnrichmentItem *ei)
std::vector< FloatArray > giveFictiousNodeCoordsForExport(int layer, int subCell)
std::array< FloatMatrixF< 3, 18 >, 3 > computeLambdaGMatricesDis(double zeta)
FloatArrayF< 3 > vtkEvalUpdatedGlobalCoordinateAt(const FloatArrayF< 3 > &localCoords, int layer, TimeStep *tStep) override
void giveShellExportData(ExportRegion &vtkPiece, IntArray &primaryVarsToExport, IntArray &internalVarsToExport, IntArray cellVarsToExport, TimeStep *tStep) override
void giveMaxCZDamages(FloatArray &answer, TimeStep *tStep)
void giveDofManDofIDMask(int inode, IntArray &answer) const override
void giveLocalCZNodeCoordsForExport(FloatArray &nodeLocalXi1Coords, FloatArray &nodeLocalXi2Coords, FloatArray &nodeLocalXi3Coords, int subCell, FloatMatrix &localNodeCoords)
void computeEnrichedBmatrixAt(const FloatArray &lCoords, FloatMatrix &answer, EnrichmentItem *ei)
void computeEnrichedNmatrixAt(const FloatArray &lCoords, FloatMatrix &answer, EnrichmentItem *ei)
void computeCohesiveTangentAt(FloatMatrix &answer, TimeStep *tStep, Delamination *dei, EnrichmentItem *ei_j, EnrichmentItem *ei_k)
FloatMatrixF< 3, 3 > evalCovarBaseVectorsAt(const FloatArrayF< 3 > &lCoords, FloatArray &solVec, TimeStep *tStep) override
std::vector< IntArray > orderingArrays
virtual void discComputeBulkTangentMatrix(FloatMatrix &KdIJ, IntegrationPoint *ip, EnrichmentItem *eiI, EnrichmentItem *eiJ, int layer, FloatMatrix A[3][3], TimeStep *tStep)
FEI3dWedgeQuad interpolationForExport
void computeTripleProduct(FloatMatrix &answer, const FloatMatrix &a, const FloatMatrix &b, const FloatMatrix &c)
FloatMatrixF< 3, 3 > edgeEvalEnrCovarBaseVectorsAt(const FloatArrayF< 3 > &lCoords, const int iedge, TimeStep *tStep, EnrichmentItem *ei)
FloatMatrixF< 3, 3 > computeStressMatrix(FloatArray &genEps, GaussPoint *gp, Material *mat, TimeStep *tStep)
virtual FloatArrayF< 3 > evalCovarNormalAt(const FloatArrayF< 3 > &lCoords, FloatArray &genEpsC, TimeStep *tStep)
void giveLayerContributionToSR(FloatMatrix &dSmat, FloatMatrix &dSmatLayerIP, int layer, double zeroThicknessLevel, TimeStep *tStep)
virtual double edgeComputeLengthAround(GaussPoint *gp, const int iedge)
FloatMatrixF< 3, 7 > computeLambdaNMatrix(FloatArray &genEps, double zeta)
std::array< FloatMatrixF< 3, 18 >, 3 > computeLambdaGMatrices(FloatArray &genEps, double zeta)
virtual double giveGlobalZcoord(const FloatArrayF< 3 > &lCoords)
void giveTractionBC(FloatMatrix &tractionTop, FloatMatrix &tractionBtm, TimeStep *tStep)
Shell7Base(int n, Domain *d)
void NodalRecoveryMI_recoverValues(std::vector< FloatArray > &recoveredValues, int layer, InternalStateType type, TimeStep *tStep)
virtual double computeVolumeAroundLayer(GaussPoint *mastergp, int layer)=0
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
virtual FloatArrayF< 3 > vtkEvalInitialGlobalCoordinateAt(const FloatArrayF< 3 > &localCoords, int layer)
LayeredCrossSection * giveLayeredCS()
void recoverValuesFromIP(std::vector< FloatArray > &nodes, int layer, InternalStateType type, TimeStep *tStep, stressRecoveryType SRtype=copyIPvalue)
virtual const IntArray & giveOrderingNodes() const =0
FloatMatrixF< 3, 3 > evalInitialContravarBaseVectorsAt(const FloatArrayF< 3 > &lCoords)
void computeSectionalForces(FloatArray &answer, TimeStep *tStep, FloatArray &solVec, int useUpdatedGpRecord=0)
LayeredCrossSection * layeredCS
FloatMatrixF< 3, 3 > computeFAt(const FloatArrayF< 3 > &lCoords, FloatArray &genEps, TimeStep *tStep)
static FloatArrayF< 9 > convV6ToV9Stress(const FloatArrayF< 6 > &V6)
virtual FloatArrayF< 3 > evalInitialCovarNormalAt(const FloatArrayF< 3 > &lCoords)
virtual int giveNumberOfEdgeDofs()=0
void updateLayerTransvStressesSR(FloatMatrix &dSmatLayerIP, int layer)
virtual double computeAreaAround(GaussPoint *gp, double xi)=0
int computeNumberOfDofs() override
void giveEdgeDofMapping(IntArray &answer, int iEdge) const override=0
void computeNmatrixAt(const FloatArray &iLocCoords, FloatMatrix &answer) override
FloatMatrixF< 3, 3 > giveAxialMatrix(const FloatArrayF< 3 > &vec)
virtual const IntArray & giveOrderingDofTypes() const =0
void giveUpdatedSolutionVector(FloatArray &answer, TimeStep *tStep)
void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int li=1, int ui=ALL_STRAINS) override
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)
int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords) override
virtual int giveNumberOfEdgeDofManagers()=0
void giveUnknownsAt(const FloatArrayF< 3 > &lcoords, const FloatArray &solVec, FloatArrayF< 3 > &x, FloatArrayF< 3 > &m, double &gam, TimeStep *tStep)
virtual FloatArrayF< 3 > vtkEvalInitialGlobalCZCoordinateAt(const FloatArrayF< 3 > &localCoords, int interface)
const FloatArrayF< 3 > & giveTempFirstPKTraction() const
Returns the const pointer to receiver's temporary first Piola-Kirchhoff traction vector.
const FloatArrayF< 3 > & giveFirstPKTraction() const
Returns the const pointer to receiver's first Piola-Kirchhoff traction vector.
virtual FloatArrayF< 3 > giveFirstPKTraction_3d(const FloatArrayF< 3 > &jump, const FloatMatrixF< 3, 3 > &F, GaussPoint *gp, TimeStep *tStep) const
virtual FloatMatrixF< 3, 3 > give3dStiffnessMatrix_dTdj(MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) const
virtual FloatArray giveInterfaceStrength()
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
static void computeIPAverage(FloatArray &answer, IntegrationRule *iRule, Element *elem, InternalStateType isType, TimeStep *tStep)
XfemElementInterface(Element *e)
Constructor.
EnrichmentItem * giveEnrichmentItem(int n)
int giveNumberOfEnrichmentItems() const
FloatMatrixF< M, N > transpose(const FloatMatrixF< N, M > &mat)
Constructs transposed matrix.
FloatMatrixF< N, P > Tdot(const FloatMatrixF< M, N > &a, const FloatMatrixF< M, P > &b)
Computes .
GaussPoint IntegrationPoint
int giveInternalStateTypeSize(InternalStateValueType valType)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
InternalStateValueType
Determines the type of internal variable.
@ ISVT_TENSOR_S3
Symmetric 3x3 tensor.
FloatArrayF< 3 > cross(const FloatArrayF< 3 > &x, const FloatArrayF< 3 > &y)
Computes $ x \cross y $.
const double DISC_DOF_SCALE_FAC
double dot(const FloatArray &x, const FloatArray &y)
FloatMatrixF< 2, 2 > local_cs(const FloatArrayF< 2 > &normal)
FloatMatrixF< M, M > unrotate(FloatMatrixF< N, N > &a, const FloatMatrixF< M, N > &r)
Computes .
@ XfemElementInterfaceType
InternalStateValueType giveInternalStateValueType(InternalStateType type)
FloatArrayF< N > normalize(const FloatArrayF< N > &x)
Normalizes vector (L2 norm).
double distance(const FloatArray &x, const FloatArray &y)
#define _IFT_Shell7BaseXFEM_CohesiveZoneMaterial