35 #include "../sm/CrossSections/layeredcrosssection.h" 36 #include "../sm/Elements/structuralelement.h" 37 #include "../sm/Materials/structuralmaterial.h" 38 #include "../sm/Materials/structuralms.h" 62 int layer = ( gpnum - 1 ) / gpsperlayer + 1;
66 double c = cos(rot *
M_PI / 180.);
67 double s = sin(rot *
M_PI / 180.);
71 rotStrain.
at(1) = c * c * strain.
at(1) - c *s *strain.
at(6) + s *s *strain.
at(2);
72 rotStrain.
at(2) = c * c * strain.
at(2) + c *s *strain.
at(6) + s *s *strain.
at(1);
73 rotStrain.
at(3) = strain.
at(3);
74 rotStrain.
at(4) = c * strain.
at(4) + s *strain.
at(5);
75 rotStrain.
at(5) = c * strain.
at(5) - s *strain.
at(4);
76 rotStrain.
at(6) = ( c * c - s * s ) * strain.
at(6) + 2 * c * s * ( strain.
at(1) - strain.
at(2) );
78 static_cast< StructuralMaterial *
>(layerMat)->giveRealStressVector_3d(rotStress, gp, rotStrain, tStep);
81 c *c * rotStress.
at(1) + 2 * c * s * rotStress.
at(6) + s * s * rotStress.
at(2),
82 c * c * rotStress.
at(2) - 2 * c * s * rotStress.
at(6) + s * s * rotStress.
at(1),
84 c * rotStress.
at(4) - s * rotStress.
at(5),
85 c * rotStress.
at(5) + s * rotStress.
at(4),
86 ( c * c - s * s ) * rotStress.
at(6) - c * s * ( rotStress.
at(1) - rotStress.
at(2) ),
89 static_cast< StructuralMaterial *
>(layerMat)->giveRealStressVector_3d(answer, gp, strain, tStep);
92 OOFEM_ERROR(
"Only cubes and wedges are meaningful for layered cross-sections");
123 double layerThick, layerZCoord, top, bottom, layerZeta;
140 layerZCoord = 0.5 * ( ( 1. - layerZeta ) * bottom + ( 1. + layerZeta ) * top );
143 interface->computeStrainVectorInLayer(layerStrain, strain, masterGp, layerGp, tStep);
144 dynamic_cast< StructuralMaterial *
>(layerMat)->giveRealStressVector_PlaneStress(reducedLayerStress, layerGp, layerStrain, tStep);
145 answer.
at(1) += reducedLayerStress.
at(1) * layerThick;
146 answer.
at(2) += reducedLayerStress.
at(2) * layerThick * layerZCoord;
147 answer.
at(3) += reducedLayerStress.
at(3) * layerThick * ( 5. / 6. );
153 status->letTempStressVectorBe(answer);
179 int layer = ( gpnum - 1 ) / gpsperlayer + 1;
181 static_cast< StructuralMaterial *
>(layerMat)->give3dMaterialStiffnessMatrix(answer, rMode, gp, tStep);
185 double c = cos(rot *
M_PI / 180.);
186 double s = sin(rot *
M_PI / 180.);
189 { c *c, s *s, 0, 0, 0, -c *s },
190 { s *s, c *c, 0, 0, 0, c *s },
191 { 0, 0, 1, 0, 0, 0 },
192 { 0, 0, 0, c, s, 0 },
193 { 0, 0, 0, -s, c, 0 },
194 { 2 * c * s, -2 * c * s, 0, 0, 0, c * c - s * s }
199 OOFEM_ERROR(
"Only cubes and wedges are meaningful for layered cross-sections");
209 double totThick = 0.;
217 totThick += layerThick;
218 dynamic_cast< StructuralMaterial *
>(layerMat)->givePlaneStressStiffMtrx(subAnswer, rMode, slaveGP, tStep);
219 subAnswer.
times(layerThick);
220 answer.
add(subAnswer);
222 answer.
times(1./totThick);
243 double layerThick, layerWidth, layerZCoord, top, bottom, layerZeta;
255 if ( interface == NULL ) {
256 OOFEM_ERROR(
"element with no layer support encountered");
267 layerZCoord = 0.5 * ( ( 1. - layerZeta ) * bottom + ( 1. + layerZeta ) * top );
270 interface->computeStrainVectorInLayer(layerStrain, strain, gp, layerGp, tStep);
278 answer.
at(1) += reducedLayerStress.
at(1) * layerWidth * layerThick;
279 answer.
at(2) += reducedLayerStress.
at(1) * layerWidth * layerThick * layerZCoord;
280 answer.
at(3) += reducedLayerStress.
at(2) * layerWidth * layerThick;
304 double layerThick, layerWidth, layerZCoord, top, bottom, layerZeta;
316 if ( interface == NULL ) {
317 OOFEM_ERROR(
"element with no layer support encountered");
328 layerZCoord = 0.5 * ( ( 1. - layerZeta ) * bottom + ( 1. + layerZeta ) * top );
331 interface->computeStrainVectorInLayer(layerStrain, strain, gp, layerGp, tStep);
335 double c = cos(rot *
M_PI / 180.);
336 double s = sin(rot *
M_PI / 180.);
340 c *c * layerStrain.
at(1) - c * s * layerStrain.
at(5) + s * s * layerStrain.
at(2),
341 c * c * layerStrain.
at(2) + c * s * layerStrain.
at(5) + s * s * layerStrain.
at(1),
342 c * layerStrain.
at(3) + s * layerStrain.
at(4),
343 c * layerStrain.
at(4) - s * layerStrain.
at(3),
344 ( c * c - s * s ) * layerStrain.
at(5) + c * s * ( layerStrain.
at(1) - layerStrain.
at(2) ),
349 reducedLayerStress = {
350 c *c * rotStress.
at(1) + 2 * c * s * rotStress.
at(5) + s * s * rotStress.
at(2),
351 c * c * rotStress.
at(2) - 2 * c * s * rotStress.
at(5) + s * s * rotStress.
at(1),
352 c * rotStress.
at(3) - s * rotStress.
at(4),
353 c * rotStress.
at(4) + s * rotStress.
at(3),
354 ( c * c - s * s ) * rotStress.
at(5) - c * s * ( rotStress.
at(1) - rotStress.
at(2) ),
360 answer.
at(1) += reducedLayerStress.
at(1) * layerWidth * layerThick * layerZCoord;
361 answer.
at(2) += reducedLayerStress.
at(2) * layerWidth * layerThick * layerZCoord;
362 answer.
at(3) += reducedLayerStress.
at(5) * layerWidth * layerThick * layerZCoord;
363 answer.
at(4) += reducedLayerStress.
at(4) * layerWidth * layerThick;
364 answer.
at(5) += reducedLayerStress.
at(3) * layerWidth * layerThick;
382 double layerThick, layerWidth, layerZCoord, top, bottom, layerZeta;
394 if ( interface == NULL ) {
395 OOFEM_ERROR(
"element with no layer support encountered");
406 layerZCoord = 0.5 * ( ( 1. - layerZeta ) * bottom + ( 1. + layerZeta ) * top );
409 interface->computeStrainVectorInLayer(layerStrain, strain, gp, layerGp, tStep);
413 double c = cos(rot *
M_PI / 180.);
414 double s = sin(rot *
M_PI / 180.);
418 c *c * layerStrain.
at(1) - c * s * layerStrain.
at(5) + s * s * layerStrain.
at(2),
419 c * c * layerStrain.
at(2) + c * s * layerStrain.
at(5) + s * s * layerStrain.
at(1),
420 c * layerStrain.
at(3) + s * layerStrain.
at(4),
421 c * layerStrain.
at(4) - s * layerStrain.
at(3),
422 ( c * c - s * s ) * layerStrain.
at(5) + c * s * ( layerStrain.
at(1) - layerStrain.
at(2) ),
427 reducedLayerStress = {
428 c *c * rotStress.
at(1) + 2 * c * s * rotStress.
at(5) + s * s * rotStress.
at(2),
429 c * c * rotStress.
at(2) - 2 * c * s * rotStress.
at(5) + s * s * rotStress.
at(1),
430 c * rotStress.
at(3) - s * rotStress.
at(4),
431 c * rotStress.
at(4) + s * rotStress.
at(3),
432 ( c * c - s * s ) * rotStress.
at(5) - c * s * ( rotStress.
at(1) - rotStress.
at(2) ),
439 answer.
at(1) += reducedLayerStress.
at(1) * layerWidth * layerThick;
440 answer.
at(2) += reducedLayerStress.
at(2) * layerWidth * layerThick;
441 answer.
at(3) += reducedLayerStress.
at(5) * layerWidth * layerThick;
443 answer.
at(4) += reducedLayerStress.
at(1) * layerWidth * layerThick * layerZCoord;
444 answer.
at(5) += reducedLayerStress.
at(2) * layerWidth * layerThick * layerZCoord;
445 answer.
at(6) += reducedLayerStress.
at(5) * layerWidth * layerThick * layerZCoord;
447 answer.
at(7) += reducedLayerStress.
at(4) * layerWidth * layerThick;
448 answer.
at(8) += reducedLayerStress.
at(3) * layerWidth * layerThick;
466 OOFEM_ERROR(
"Not supported in given cross-section (yet).");
472 OOFEM_ERROR(
"Not supported in given cross-section (yet).");
485 if ( mode == _2dBeam ) {
487 }
else if ( mode == _3dBeam ) {
489 }
else if ( mode == _2dPlate ) {
491 }
else if ( mode == _3dShell ) {
497 int layer = ( gpnum - 1 ) / gpsperlayer + 1;
525 double layerThick, layerWidth, layerZCoord, top, bottom, layerZeta;
543 double c = cos(rot *
M_PI / 180.);
544 double s = sin(rot *
M_PI / 180.);
546 { c *c, s *s, 0, 0, -c *s },
547 { s *s, c *c, 0, 0, c *s },
550 { 2 * c * s, -2 * c * s, 0, 0, c * c - s * s }
561 layerZCoord = 0.5 * ( ( 1. - layerZeta ) * bottom + ( 1. + layerZeta ) * top );
562 layerZCoord2 = layerZCoord * layerZCoord;
568 answer.
at(1, 1) += layerMatrix.
at(1, 1) * layerWidth * layerThick * layerZCoord2;
569 answer.
at(1, 2) += layerMatrix.
at(1, 2) * layerWidth * layerThick * layerZCoord2;
570 answer.
at(1, 3) += layerMatrix.
at(1, 5) * layerWidth * layerThick * layerZCoord2;
572 answer.
at(2, 1) += layerMatrix.
at(2, 1) * layerWidth * layerThick * layerZCoord2;
573 answer.
at(2, 2) += layerMatrix.
at(2, 2) * layerWidth * layerThick * layerZCoord2;
574 answer.
at(2, 3) += layerMatrix.
at(2, 5) * layerWidth * layerThick * layerZCoord2;
576 answer.
at(3, 1) += layerMatrix.
at(5, 1) * layerWidth * layerThick * layerZCoord2;
577 answer.
at(3, 2) += layerMatrix.
at(5, 2) * layerWidth * layerThick * layerZCoord2;
578 answer.
at(3, 3) += layerMatrix.
at(5, 5) * layerWidth * layerThick * layerZCoord2;
581 answer.
at(4, 4) += layerMatrix.
at(4, 4) * layerWidth * layerThick;
582 answer.
at(4, 5) += layerMatrix.
at(4, 3) * layerWidth * layerThick;
583 answer.
at(5, 4) += layerMatrix.
at(3, 4) * layerWidth * layerThick;
584 answer.
at(5, 5) += layerMatrix.
at(3, 3) * layerWidth * layerThick;
605 double layerThick, layerWidth, layerZCoord, top, bottom, layerZeta;
627 { c *c, s *s, 0, 0, -c *s },
628 { s *s, c *c, 0, 0, c *s },
631 { 2 * c * s, -2 * c * s, 0, 0, c * c - s * s }
642 layerZCoord = 0.5 * ( ( 1. - layerZeta ) * bottom + ( 1. + layerZeta ) * top );
643 layerZCoord2 = layerZCoord * layerZCoord;
648 answer.
at(1, 1) += layerMatrix.
at(1, 1) * layerWidth * layerThick;
649 answer.
at(1, 2) += layerMatrix.
at(1, 2) * layerWidth * layerThick;
650 answer.
at(1, 3) += layerMatrix.
at(1, 5) * layerWidth * layerThick;
652 answer.
at(2, 1) += layerMatrix.
at(2, 1) * layerWidth * layerThick;
653 answer.
at(2, 2) += layerMatrix.
at(2, 2) * layerWidth * layerThick;
654 answer.
at(2, 3) += layerMatrix.
at(2, 5) * layerWidth * layerThick;
656 answer.
at(3, 1) += layerMatrix.
at(5, 1) * layerWidth * layerThick;
657 answer.
at(3, 2) += layerMatrix.
at(5, 2) * layerWidth * layerThick;
658 answer.
at(3, 3) += layerMatrix.
at(5, 5) * layerWidth * layerThick;
662 answer.
at(4, 4) += layerMatrix.
at(1, 1) * layerWidth * layerThick * layerZCoord2;
663 answer.
at(4, 5) += layerMatrix.
at(1, 2) * layerWidth * layerThick * layerZCoord2;
664 answer.
at(4, 6) += layerMatrix.
at(1, 5) * layerWidth * layerThick * layerZCoord2;
666 answer.
at(5, 4) += layerMatrix.
at(2, 1) * layerWidth * layerThick * layerZCoord2;
667 answer.
at(5, 5) += layerMatrix.
at(2, 2) * layerWidth * layerThick * layerZCoord2;
668 answer.
at(5, 6) += layerMatrix.
at(2, 5) * layerWidth * layerThick * layerZCoord2;
670 answer.
at(6, 4) += layerMatrix.
at(5, 1) * layerWidth * layerThick * layerZCoord2;
671 answer.
at(6, 5) += layerMatrix.
at(5, 2) * layerWidth * layerThick * layerZCoord2;
672 answer.
at(6, 6) += layerMatrix.
at(5, 5) * layerWidth * layerThick * layerZCoord2;
675 answer.
at(7, 7) += layerMatrix.
at(4, 4) * layerWidth * layerThick;
676 answer.
at(7, 8) += layerMatrix.
at(4, 3) * layerWidth * layerThick;
677 answer.
at(8, 7) += layerMatrix.
at(3, 4) * layerWidth * layerThick;
678 answer.
at(8, 8) += layerMatrix.
at(3, 3) * layerWidth * layerThick;
709 double layerThick, layerWidth, layerZCoord, top, bottom, layerZeta;
736 layerZCoord = 0.5 * ( ( 1. - layerZeta ) * bottom + ( 1. + layerZeta ) * top );
737 layerZCoord2 = layerZCoord * layerZCoord;
742 answer.
at(1, 1) += layerMatrix.
at(1, 1) * layerWidth * layerThick;
743 answer.
at(1, 3) += layerMatrix.
at(1, 2) * layerWidth * layerThick;
745 answer.
at(2, 2) += layerMatrix.
at(1, 1) * layerWidth * layerThick * layerZCoord2;
746 answer.
at(2, 3) += layerMatrix.
at(1, 2) * layerWidth * layerThick * layerZCoord2;
748 answer.
at(3, 1) += layerMatrix.
at(2, 1) * layerWidth * layerThick;
749 answer.
at(3, 3) += layerMatrix.
at(2, 2) * layerWidth * layerThick;
792 int size = gradientStressVector3d->
giveSize();
799 gradientStressVector3d->
at(3) = 0.;
802 for (
int i = 2; i <= 5; i++ ) {
803 gradientStressVector3d->
at(i) = 0.;
811 return gradientStressVector3d;
826 if ( gradientStrainVector3d->
giveSize() != 6 ) {
832 gradientStrainVector3d->
at(3) = 0.;
835 for (
int i = 2; i <= 5; i++ ) {
836 gradientStrainVector3d->
at(i) = 0.;
844 return gradientStrainVector3d;
869 OOFEM_WARNING(
"numberOfLayers does not equal given number of layer rotations. ");
880 OOFEM_WARNING(
"numberOfLayers does not equal given number of thicknesses. ");
892 OOFEM_WARNING(
"numberOfLayers does not equal given number of materials. ");
953 this->
layerMidZ.
at(j) = layerBottomZ + thickness * 0.5;
954 layerBottomZ += thickness;
991 int points1 = ( int ) floor(
cbrt(
double ( npoints ) ) + 0.5);
1004 if ( npoints == 2 ) {
1038 if ( slave == NULL ) {
1047 double currentZTopCoord, currentZCoord, bottom, top;
1062 currentZCoord = currentZTopCoord - this->
layerThicks.
at(j + 1) / 2.0;
1063 if ( masterCoords.
giveSize() > 0 ) {
1064 zCoord.
at(1) = masterCoords.
at(1);
1067 if ( masterCoords.
giveSize() > 1 ) {
1068 zCoord.
at(2) = masterCoords.
at(2);
1071 zCoord.
at(3) = ( 2.0 * currentZCoord - top - bottom ) / ( top - bottom );
1103 printf(
"Cross Section with properties: \n");
1105 printf(
"Layer Materials: \n");
1107 printf(
"Thickness of each layer: \n");
1110 printf(
"Width of each layer: \n");
1182 if ( masterMode == _2dPlate ) {
1184 }
else if ( masterMode == _2dBeam ) {
1185 return _2dBeamLayer;
1186 }
else if ( masterMode == _PlaneStress ) {
1187 return _PlaneStress;
1188 }
else if ( masterMode == _3dShell ) {
1190 }
else if ( masterMode == _3dDegeneratedShell ) {
1191 return _3dDegeneratedShell;
1192 }
else if ( masterMode == _3dMat ) {
1212 }
else if ( aProperty ==
CS_Area ) {
1228 double dh = 2.0/noLayers;
1230 double lowXi = -1.0;
1232 for (
int i = 1; i <= noLayers; i++)
1234 if (lCoords.
at(3) > lowXi && lCoords.
at(3) < lowXi+dh)
1240 OOFEM_ERROR(
"LayeredCrossSection :: giveLayer - the actual integration point can not be associated with a layer in the cross section");
1253 }
else if ( aProperty ==
CS_Area ) {
1272 if ( this->
area <= 0.0 ) {
1298 answer.
resize(numInterfaces);
1300 for (
int i = 1; i <= numInterfaces; i++ ) {
1303 answer.
at(i) = interfaceZ * ( 2.0 / totalThickness );
1315 integrationRulesArray.clear();
1316 integrationRulesArray.reserve( numberOfLayers );
1319 integrationRulesArray.back()->SetUpPointsOnWedge(numInPlanePoints, numPointsThickness, _3dMat);
1341 double scaleFactor = 0.999;
1345 for (
GaussPoint *gp: *layerIntegrationRulesArray [ layer - 1 ] ) {
1350 double deltaxi = gp->giveNaturalCoordinates().at(3) * this->
giveLayerThickness(layer) / totalThickness;
1351 double xinew = xiMid_i + deltaxi * scaleFactor;
1352 FloatArray lcoords = gp->giveNaturalCoordinates();
1353 lcoords.
at(3) = xinew;
1354 gp->setNaturalCoordinates(lcoords);
1363 int startIndx,
int endIndx,
bool dynamic) :
1377 int nPoints = nPointsTri * nPointsThickness;
1382 FloatArray coords_xi1, coords_xi2, coords_xi, weights_tri, weights_thickness;
1391 if ( nPointsThickness != 1 ) {
1395 for (
int i = 1, ind = 0; i <= nPointsThickness; i++ ) {
1396 for (
int j = 1; j <= nPointsTri; j++ ) {
1398 new GaussPoint(
this, 1, {coords_xi1.
at(j), coords_xi2.
at(j), coords_xi.
at(i)},
1399 weights_tri.
at ( j ) *weights_thickness.
at ( i ), mode);
1402 if ( i == 1 && nPointsThickness > 1 ) {
1404 }
else if ( i == nPointsThickness && nPointsThickness > 1 ) {
1423 for (
int i = 1; this->giveNumberOfLayers(); i++ ) {
1424 Material *mat = this->giveDomain()->giveMaterial( this->giveLayerMaterial(i) );
1425 if ( !dynamic_cast< StructuralMaterial * >(mat) ) {
1442 int gpsperlayer = ngps / this->numberOfLayers;
1443 int layer = ( gpnum - 1 ) / gpsperlayer + 1;
1444 Material *layerMat = this->domain->giveMaterial( this->giveLayerMaterial(layer) );
1445 if ( this->layerRots.at(layer) != 0. ) {
1448 double rot = this->layerRots.at(layer);
1449 double c = cos(rot *
M_PI / 180.);
1450 double s = sin(rot *
M_PI / 180.);
1452 int ret = layerMat->
giveIPValue(rotVal, gp, type, tStep);
1460 c *c * rotVal.
at(1) + 2 * c * s * rotVal.
at(6) + s * s * rotVal.
at(2),
1461 c * c * rotVal.
at(2) - 2 * c * s * rotVal.
at(6) + s * s * rotVal.
at(1),
1463 c * rotVal.
at(4) - s * rotVal.
at(5),
1464 c * rotVal.
at(5) + s * rotVal.
at(4),
1465 ( c * c - s * s ) * rotVal.
at(6) - c * s * ( rotVal.
at(1) - rotVal.
at(2) ),
1469 c *c * rotVal.
at(1) + c * s * rotVal.
at(6) + s * s * rotVal.
at(2),
1470 c * c * rotVal.
at(2) - c * s * rotVal.
at(6) + s * s * rotVal.
at(1),
1472 c * rotVal.
at(4) - s * rotVal.
at(5),
1473 c * rotVal.
at(5) + s * rotVal.
at(4),
1474 ( c * c - s * s ) * rotVal.
at(6) - 2 * c * s * ( rotVal.
at(1) - rotVal.
at(2) ),
1478 c *rotVal.
at(1) - s * rotVal.
at(2), s * rotVal.
at(1) +c * rotVal.
at(2), rotVal.
at(3)
1487 return layerMat->
giveIPValue(answer, gp, type, tStep);
1494 return this->giveDomain()->giveMaterial( this->giveLayerMaterial(layer) )->giveIPValue(answer, gp, type, tStep);
1502 double average = 0.;
1503 for (
int layer = 1; layer <= numberOfLayers; ++layer ) {
1504 Material *mat = this->giveDomain()->giveMaterial( giveLayerMaterial(layer) );
1505 average += mat->
give(aProperty, gp) * giveLayerThickness(layer);
1507 return average / this->totalThick;
virtual FloatArray * imposeStressConstrainsOnGradient(GaussPoint *gp, FloatArray *gradientStressVector3d)
Returns modified gradient of stress vector, which is used to bring stresses back to yield surface...
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
void printYourself()
Prints the receiver on screen.
int number
Component number.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
#define _IFT_LayeredCrossSection_nlayers
virtual void giveStiffnessMatrix_PlaneStress(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
void printYourself() const
Prints receiver on stdout.
virtual Material * giveMaterial(IntegrationPoint *ip)
Returns the material associated with the GP.
int numberOfIntegrationPoints
num integration points per layer
#define _IFT_LayeredCrossSection_midsurf
IntegrationPointStatus * setMaterialStatus(IntegrationPointStatus *ptr, int n)
Sets Material status managed by receiver.
static void giveTriCoordsAndWeights(int nPoints, FloatArray &coords_xi1, FloatArray &coords_xi2, FloatArray &weights)
Domain * domain
Link to domain object, useful for communicating with other FEM components.
int giveLayerMaterial(int layer)
static void giveLineCoordsAndWeights(int nPoints, FloatArray &coords_xi, FloatArray &weights)
virtual int checkConsistency()
Allows programmer to test some internal data, before computation begins.
virtual contextIOResultType saveIPContext(DataStream &stream, ContextMode mode, GaussPoint *gp)
Stores integration point state to output stream.
virtual void give2dPlateStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Method for computing 2d plate stiffness matrix.
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
#define _IFT_LayeredCrossSection_layerRotations
virtual FloatArray * imposeStrainConstrainsOnGradient(GaussPoint *gp, FloatArray *gradientStressVector3d)
Returns modified gradient of strain vector, which is used to compute plastic strain increment...
bool hasSlaveGaussPoint()
True if gauss point has slave points.
void zero()
Sets all component to zero.
double & at(int i)
Coefficient access function.
virtual void giveRealStress_PlaneStrain(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
virtual void give3dShellStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Method for computing 3d shell stiffness matrix.
This class implements a structural material status information.
virtual void giveGeneralizedStress_Plate(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)
int giveNumber()
Returns receiver number.
virtual int SetUpPointsOnWedgeLayers(int nPointsTri, int nPointsDepth, MaterialMode mode, const FloatArray &layerThickness)
Sets up receiver's integration points on a wedge integration domain divided into layers in the zeta-d...
virtual int SetUpPointsOn3dDegShellLayers(int nPointsXY, int nPointsZ, MaterialMode mode, const FloatArray &layerThickness)
Sets up receiver's integration points on shell integration domain wih layers.
FloatArray layerThicks
Thickness for each layer.
virtual void givePlateLayerStiffMtrx(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Method for computing 2d plate layer stiffness matrix of receiver.
REGISTER_CrossSection(EmptyCS)
virtual contextIOResultType restoreIPContext(DataStream &stream, ContextMode mode, GaussPoint *gp)
Reads integration point state to output stream.
Abstract base class for all finite elements.
InternalStateValueType
Determines the type of internal variable.
void mapLayerGpCoordsToShellCoords(std::vector< std::unique_ptr< IntegrationRule > > &layerIntegrationRulesArray)
symmetric 3x3 tensor, packed with off diagonal components multiplied by 2 (engineering strain vector...
Element * giveElement()
Returns corresponding element to receiver.
MaterialMode giveCorrespondingSlaveMaterialMode(MaterialMode mode)
virtual MaterialMode giveMaterialMode()
Returns material mode for receiver integration points.
virtual contextIOResultType restoreIPContext(DataStream &stream, ContextMode mode, GaussPoint *gp)
Reads integration point state to output stream.
CrossSectionProperty
List of properties possibly stored in a cross section.
GaussPoint * giveSlaveGaussPoint(int index)
Returns index-th slave gauss point of receiver.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
MaterialMode
Type representing material mode of integration point.
virtual FloatArray * imposeStressConstrainsOnGradient(GaussPoint *gp, FloatArray *)
Returns modified gradient of stress vector, which is used to bring stresses back to yield surface...
int & at(int i)
Coefficient access function.
MatResponseMode
Describes the character of characteristic material matrix.
void giveInterfaceXiCoords(FloatArray &answer)
virtual int giveIPValue(FloatArray &answer, GaussPoint *ip, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
virtual void giveStiffnessMatrix_3d(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Method for computing the stiffness matrix.
Abstract base class representing integration rule.
double midSurfaceXiCoordFromBottom
virtual void give2dBeamStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the stiffness matrix for 2d beams.
IntArray layerMaterials
Material of each layer.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
double sum() const
Computes the sum of receiver values.
#define _IFT_LayeredCrossSection_interfacematerials
double computeIntegralThick()
Returns the total thickness of all layers.
const char * __MaterialModeToString(MaterialMode _value)
virtual double give(int aProperty, GaussPoint *gp)
Returns the value of material property 'aProperty'.
Abstract base class for all "structural" finite elements.
virtual void giveRealStressVector_2dBeamLayer(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedE, TimeStep *tStep)
Default implementation relies on giveRealStressVector_StressControl.
double giveNaturalCoordinate(int i) const
Returns i-th natural element coordinate of receiver.
virtual void giveStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the stiffness matrix for giveRealStressVector of receiver in given integration point...
virtual void printYourself()
Prints receiver state on stdout. Useful for debugging.
virtual void giveGeneralizedStress_PlateSubSoil(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)
#define _IFT_LayeredCrossSection_thicks
FloatArray layerMidZ
z-coord of the mid plane for each layer
Dictionary propertyDictionary
Dictionary for storing cross section parameters (like dimensions).
Material * giveMaterial(int n)
Service for accessing particular domain material model.
double dotProduct(const FloatArray &x) const
Computes the dot product (or inner product) of receiver and argument.
int giveLayer(GaussPoint *gp)
virtual FloatArray * imposeStrainConstrainsOnGradient(GaussPoint *gp, FloatArray *)
Returns modified gradient of strain vector, which is used to compute plastic strain increment...
double midSurfaceZcoordFromBottom
double giveLayerThickness(int layer)
virtual int SetUpPointsOnWedge(int nPointsTri, int nPointsDepth, MaterialMode mode)
Sets up receiver's integration points on a wedge integration domain.
virtual void giveGeneralizedStress_Beam2d(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)
Computes the generalized stress vector for given strain and integration point.
void setupLayeredIntegrationRule(std::vector< std::unique_ptr< IntegrationRule > > &layerIntegrationRulesArray, Element *el, int numInPlanePoints)
int giveNumber()
Returns number of receiver.
FloatArray layerWidths
Width for each layer.
void times(double f)
Multiplies receiver by factor f.
Number of layers that makes up the cross section.
void rotatedWith(const FloatMatrix &r, char mode= 'n')
Returns the receiver 'a' transformed using give transformation matrix r.
virtual int SetUpPointsOnCubeLayers(int nPoints1, int nPoints2, int nPointsDepth, MaterialMode mode, const FloatArray &layerThickness)
Sets up receiver's integration points on unit cube integration domain divided into layers in the zeta...
double giveLayerMidZ(int layer)
virtual void createMaterialStatus(GaussPoint &iGP)
virtual void giveRealStress_1d(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
virtual void giveStiffnessMatrix_PlaneStrain(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
IntArray upperInterfacePoints
virtual contextIOResultType saveIPContext(DataStream &stream, ContextMode mode, GaussPoint *gp)
Stores integration point state to output stream.
void setupLayerMidPlanes()
Abstract base class for all material models.
double at(int i, int j) const
Coefficient access function.
void resize(int n)
Checks size of receiver towards requested bounds.
virtual contextIOResultType saveIPContext(DataStream &stream, ContextMode mode, GaussPoint *gp)
Stores integration point state to output stream.
IntArray interfacerMaterials
Interface (cohesive zone) material for each interface.
IntegrationRule * giveIntegrationRule()
Returns corresponding integration rule to receiver.
virtual void giveRealStress_PlaneStress(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
virtual void giveRealStress_3dDegeneratedShell(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
virtual integrationDomain giveIntegrationDomain() const
Returns integration domain for receiver, used to initialize integration point over receiver volume...
Abstract base class representing a material status information.
void add(int val)
Adds given scalar to all values of receiver.
Class representing vector of real numbers.
virtual void give3dBeamStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the stiffness matrix for 2d beams.
virtual void giveCharMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the stiffness matrix of receiver in given integration point, respecting its history...
Implementation of matrix containing floating point numbers.
#define _IFT_LayeredCrossSection_widths
virtual ~LayeredIntegrationRule()
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.
double cbrt(double x)
Returns the cubic root of x.
virtual contextIOResultType restoreIPContext(DataStream &stream, ContextMode mode, GaussPoint *gp)
Reads integration point state to output stream.
virtual double give(CrossSectionProperty a, GaussPoint *gp)
Returns the value of cross section property at given point.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
#define _IFT_LayeredCrossSection_layermaterials
virtual const char * giveClassName() const =0
virtual bool isCharacteristicMtrxSymmetric(MatResponseMode mode)
Check for symmetry of stiffness matrix.
virtual int hasMaterialModeCapability(MaterialMode mode)
Tests if material supports material mode.
FloatArray layerRots
Rotation of the material in each layer.
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
std::vector< GaussPoint * > gaussPoints
List of slave integration points.
virtual void give2dPlateSubSoilStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Method for computing subsoil stiffness matrix for plates.
virtual void printYourself() const
Print receiver on stdout.
virtual int setupIntegrationPoints(IntegrationRule &irule, int npoints, Element *element)
Sets up integration rule for the given element.
virtual void giveGeneralizedStress_Shell(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)
void add(const FloatMatrix &a)
Adds matrix to the receiver.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
int giveNumberOfIntegrationPoints() const
Returns number of integration points of receiver.
void zero()
Zeroes all coefficients of receiver.
virtual void giveGeneralizedStress_Beam3d(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)
virtual Interface * giveInterface(InterfaceType t)
Interface requesting service.
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
Abstract base class for all "structural" constitutive models.
integrationDomain giveIntegrationDomain() const
Returns the domain for the receiver.
int setUpIntegrationPoints(integrationDomain intdomain, int nPoints, MaterialMode matMode)
Initializes the receiver.
void zero()
Zeroes all coefficient of receiver.
virtual void give2dBeamLayerStiffMtrx(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Method for computing 2d beam layer stiffness matrix of receiver.
LayeredIntegrationRule(int n, Element *e, int startIndx, int endIndx, bool dynamic=false)
virtual void giveRealStress_Warping(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
The element interface required by LayeredCrossSection.
InternalStateValueType giveInternalStateValueType(InternalStateType type)
int giveNumIntegrationPointsInLayer()
virtual void give3dDegeneratedShellStiffMtrx(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)
Method for computing 3d shell stiffness matrix on degenerated shell elements.
virtual void giveMembraneRotStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Method for computing membrane stiffness matrix with added drilling stiffness.
int giveSize() const
Returns the size of receiver.
the oofem namespace is to define a context or scope in which all oofem names are defined.
virtual void giveRealStressVector_PlateLayer(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedE, TimeStep *tStep)
Default implementation relies on giveRealStressVector_StressControl.
virtual void giveGeneralizedStress_MembraneRot(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)
GaussPoint * giveSlaveGaussPoint(GaussPoint *gp, int slaveIndex)
#define _IFT_LayeredCrossSection_nintegrationpoints
Class representing integration point in finite element program.
IntArray lowerInterfacePoints
#define OOFEM_WARNING(...)
Class representing solution step.
std::vector< GaussPoint * > gaussPoints
Array containing integration points.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
void add(const FloatArray &src)
Adds array src to receiver.
virtual void giveStiffnessMatrix_1d(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
void resize(int s)
Resizes receiver towards requested size.
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
virtual void giveRealStress_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)