60IntArray Quad1MindlinShell3D::shellOrdering = { 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23 };
108 FloatArray forceX, forceY, forceZ, glob_gravity, gravity, n;
125 forceX.
add(density * gravity.
at(1) * dV, n);
126 forceY.
add(density * gravity.
at(2) * dV, n);
127 forceZ.
add(density * gravity.
at(3) * dV, n);
133 answer.
at(1) = forceX.
at(1);
134 answer.
at(2) = forceY.
at(1);
135 answer.
at(3) = forceZ.
at(1);
137 answer.
at(7) = forceX.
at(2);
138 answer.
at(8) = forceY.
at(2);
139 answer.
at(9) = forceZ.
at(2);
141 answer.
at(13) = forceX.
at(3);
142 answer.
at(14) = forceY.
at(3);
143 answer.
at(15) = forceZ.
at(3);
145 answer.
at(19) = forceX.
at(4);
146 answer.
at(20) = forceY.
at(4);
147 answer.
at(21) = forceZ.
at(4);
155Quad1MindlinShell3D::computeSurfaceLoadVectorAt(
FloatArray &answer,
Load *load,
156 int iSurf,
TimeStep *tStep, ValueModeType mode)
172 answer.
at(3) += n.
at(1) * pressure.
at(1) * dV;
173 answer.
at(9) += n.
at(2) * pressure.
at(1) * dV;
174 answer.
at(15) += n.
at(3) * pressure.
at(1) * dV;
175 answer.
at(21) += n.
at(4) * pressure.
at(1) * dV;
182 OOFEM_ERROR(
"only supports constant pressure boundary load.");
193 auto dn = tmp.second;
194 auto n = this->
interp.evalN(localCoords);
203 ns = this->
interp.evalN(lc);
213 for (
int i = 0; i < 4; ++i ) {
216 answer(0, 0 + i * 5) = dn(0, i);
217 answer(1, 1 + i * 5) = dn(1, i);
218 answer(2, 0 + i * 5) = dn(1, i);
219 answer(2, 1 + i * 5) = dn(0, i);
223 answer(3 + 0, 2 + 2 + i * 5) = dn(0, i);
224 answer(3 + 1, 2 + 1 + i * 5) = -dn(1, i);
225 answer(3 + 2, 2 + 2 + i * 5) = dn(1, i);
226 answer(3 + 2, 2 + 1 + i * 5) = -dn(0, i);
229 answer(3 + 3, 2 + 0 + i * 5) = dns(0, i);
230 answer(3 + 3, 2 + 2 + i * 5) = ns [ i ];
231 answer(3 + 4, 2 + 0 + i * 5) = dns(1, i);
232 answer(3 + 4, 2 + 1 + i * 5) = -ns [ i ];
241 double x1, x2, x3, x4;
242 double y1, y2, y3, y4;
243 double Ax, Bx, Cx, Ay, By, Cy;
245 double r = localCoords [ 0 ];
246 double s = localCoords [ 1 ];
258 Ax = x1 - x2 - x3 + x4;
259 Bx = x1 - x2 + x3 - x4;
260 Cx = x1 + x2 - x3 - x4;
262 Ay = y1 - y2 - y3 + y4;
263 By = y1 - y2 + y3 - y4;
264 Cy = y1 + y2 - y3 - y4;
270 double rz = sqrt(
sqr(Cx + r * Bx) +
sqr(Cy + r * By) ) / ( 16 * detJ );
271 double sz = sqrt(
sqr(Ax + s * Bx) +
sqr(Ay + s * By) ) / ( 16 * detJ );
275 OOFEM_WARNING(
"The MITC4 implementation isn't verified yet. Highly experimental");
281 double c_b = dxdr(0);
282 double s_b = dxdr(1);
283 double c_a = dxds(0);
284 double s_a = dxds(1);
287 answer(6, 2 + 5 * 0) = rz * s_b * ( ( 1 + s ) ) - sz * s_a * ( ( 1 + r ) );
288 answer(6, 2 + 5 * 1) = rz * s_b * ( -( 1 + s ) ) - sz * s_a * ( ( 1 - r ) );
289 answer(6, 2 + 5 * 2) = rz * s_b * ( -( 1 - s ) ) - sz * s_a * ( -( 1 - r ) );
290 answer(6, 2 + 5 * 3) = rz * s_b * ( ( 1 - s ) ) - sz * s_a * ( -( 1 + r ) );
292 answer(6, 3 + 5 * 0) = rz * s_b * ( y2 - y1 ) * 0.5 * ( 1 + s ) - sz * s_a * ( y4 - y1 ) * 0.5 * ( 1 + r );
293 answer(6, 4 + 5 * 0) = rz * s_b * ( x1 - x2 ) * 0.5 * ( 1 + s ) - sz * s_a * ( x1 - x4 ) * 0.5 * ( 1 + r );
295 answer(6, 3 + 5 * 1) = rz * s_b * ( y2 - y1 ) * 0.5 * ( 1 + s ) - sz * s_a * ( y3 - x2 ) * 0.5 * ( 1 + r );
296 answer(6, 4 + 5 * 1) = rz * s_b * ( x1 - x2 ) * 0.5 * ( 1 + s ) - sz * s_a * ( x2 - x3 ) * 0.5 * ( 1 + r );
298 answer(6, 3 + 5 * 2) = rz * s_b * ( y3 - y4 ) * 0.5 * ( 1 - s ) - sz * s_a * ( y3 - y2 ) * 0.5 * ( 1 - r );
299 answer(6, 4 + 5 * 2) = rz * s_b * ( x4 - x3 ) * 0.5 * ( 1 - s ) - sz * s_a * ( x2 - x3 ) * 0.5 * ( 1 - r );
301 answer(6, 3 + 5 * 3) = rz * s_b * ( y3 - y4 ) * 0.5 * ( 1 - s ) - sz * s_a * ( y4 - y1 ) * 0.5 * ( 1 - r );
302 answer(6, 4 + 5 * 3) = rz * s_b * ( x4 - x3 ) * 0.5 * ( 1 - s ) - sz * s_a * ( x1 - x4 ) * 0.5 * ( 1 - r );
305 answer(7, 2 + 5 * 0) = -rz * c_b * ( ( 1 + s ) ) + sz * c_a * ( ( 1 + r ) );
306 answer(7, 2 + 5 * 1) = -rz * c_b * ( -( 1 + s ) ) + sz * c_a * ( ( 1 - r ) );
307 answer(7, 2 + 5 * 2) = -rz * c_b * ( -( 1 - s ) ) + sz * c_a * ( -( 1 - r ) );
308 answer(7, 2 + 5 * 3) = -rz * c_b * ( ( 1 - s ) ) + sz * c_a * ( -( 1 + r ) );
310 answer(7, 3 + 5 * 0) = -rz * c_b * ( y2 - y1 ) * 0.5 * ( 1 + s ) + sz * c_a * ( y4 - y1 ) * 0.5 * ( 1 + r );
311 answer(7, 4 + 5 * 0) = -rz * c_b * ( x1 - x2 ) * 0.5 * ( 1 + s ) + sz * c_a * ( x1 - x4 ) * 0.5 * ( 1 + r );
313 answer(7, 3 + 5 * 1) = -rz * c_b * ( y2 - y1 ) * 0.5 * ( 1 + s ) + sz * c_a * ( y3 - x2 ) * 0.5 * ( 1 + r );
314 answer(7, 4 + 5 * 1) = -rz * c_b * ( x1 - x2 ) * 0.5 * ( 1 + s ) + sz * c_a * ( x2 - x3 ) * 0.5 * ( 1 + r );
316 answer(7, 3 + 5 * 2) = -rz * c_b * ( y3 - y4 ) * 0.5 * ( 1 - s ) + sz * c_a * ( y3 - y2 ) * 0.5 * ( 1 - r );
317 answer(7, 4 + 5 * 2) = -rz * c_b * ( x4 - x3 ) * 0.5 * ( 1 - s ) + sz * c_a * ( x2 - x3 ) * 0.5 * ( 1 - r );
319 answer(7, 3 + 5 * 3) = -rz * c_b * ( y3 - y4 ) * 0.5 * ( 1 - s ) + sz * c_a * ( y4 - y1 ) * 0.5 * ( 1 - r );
320 answer(7, 4 + 5 * 3) = -rz * c_b * ( x4 - x3 ) * 0.5 * ( 1 - s ) + sz * c_a * ( x1 - x4 ) * 0.5 * ( 1 - r );
370 bool drillCoeffFlag =
false;
383 if ( useUpdatedGpRecord ) {
392 if ( drillCoeff > 0. ) {
394 for (
int j = 0; j < 4; j++ ) {
398 drillMoment.
add(drillCoeff * dV * dtheta, n);
399 drillCoeffFlag =
true;
407 if ( drillCoeffFlag ) {
420 bool drillCoeffFlag =
false;
435 if ( drillCoeff > 0. ) {
437 for (
int j = 0; j < 4; j++ ) {
441 drillCoeffFlag =
true;
450 if ( drillCoeffFlag ) {
469 answer = { D_u, D_v, D_w, R_u, R_v, R_w };
479 auto n =
cross(u, v);
480 answer = n /
norm(n);
496 return detJ * weight;
512 for (
int i = 0; i < 4; i++ ) {
513 answer(i * 6 + 0, i * 6 + 0) = mass * 0.25;
514 answer(i * 6 + 1, i * 6 + 1) = mass * 0.25;
515 answer(i * 6 + 2, i * 6 + 2) = mass * 0.25;
525 if ( type == IST_ShellForceTensor || type == IST_ShellStrainTensor ) {
526 if ( type == IST_ShellForceTensor ) {
531 answer.
at(1) = s.
at(1);
532 answer.
at(2) = s.
at(2);
534 answer.
at(4) = s.
at(8);
535 answer.
at(5) = s.
at(7);
536 answer.
at(6) = s.
at(3);
538 }
else if ( type == IST_ShellMomentTensor || type == IST_CurvatureTensor ) {
539 if ( type == IST_ShellMomentTensor ) {
544 answer.
at(1) = s.
at(4);
545 answer.
at(2) = s.
at(5);
549 answer.
at(6) = s.
at(6);
561 answer = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
562 }
else if ( iEdge == 2 ) {
563 answer = { 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 };
564 }
else if ( iEdge == 3 ) {
565 answer = { 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
566 }
else if ( iEdge == 4 ) {
567 answer = { 19, 20, 21, 22, 23, 24, 1, 2, 3, 4, 5, 6 };
596 const auto &edgeNodes = this->
interp.computeLocalEdgeMapping(iEdge);
598 auto nodeA = this->
giveNode(edgeNodes.at(1) );
599 auto nodeB = this->
giveNode(edgeNodes.at(2) );
601 double dx = nodeB->giveCoordinate(1) - nodeA->giveCoordinate(1);
602 double dy = nodeB->giveCoordinate(2) - nodeA->giveCoordinate(2);
603 double length = sqrt(dx * dx + dy * dy);
608 answer.
at(1, 1) = 1.0;
611 answer.
at(3, 2) = -answer.
at(2, 3);
612 answer.
at(3, 3) = answer.
at(2, 2);
627 auto e2 =
cross(e3, e1);
630 for (
int i = 1; i <= 3; i++ ) {
636 for (
int i = 1; i <= 4; i++ ) {
648 for (
int i = 0; i < 4; i++ ) {
675 for (
int i = 1; i < 5; i++ ) {
686 for (
int i = 1; i < 5; i++ ) {
double length(const Vector &a)
#define REGISTER_Element(class)
void computeValueAt(FloatArray &answer, TimeStep *tStep, const FloatArray &coords, ValueModeType mode) override
virtual double give(CrossSectionProperty a, GaussPoint *gp) const
virtual int setupIntegrationPoints(IntegrationRule &irule, int npoints, Element *element)
const FloatArray & giveCoordinates() const
ParameterManager elementPPM
Node * giveNode(int i) const
virtual double giveLengthInDir(const FloatArray &normalToCrackPlane)
static ParamKey IPK_Element_activityTimeFunction
void initializeFrom(InputRecord &ir, int priority) override
int numberOfDofMans
Number of dofmanagers.
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
CrossSection * giveCrossSection()
void local2global(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const override
static FloatArrayF< 4 > evalN(const FloatArrayF< 2 > &lcoords)
Domain * giveDomain() const
int number
Component number.
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 zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
void beSubArrayOf(const FloatArray &src, const IntArray &indx)
void plusProductSymmUpper(const FloatMatrix &a, const FloatMatrix &b, double dV)
void resize(Index rows, Index cols)
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
void setSubMatrix(const FloatMatrix &src, int sr, int sc)
void zero()
Zeroes all coefficient of receiver.
double giveDeterminant() const
void plusDyadSymmUpper(const FloatArray &a, double dV)
void assemble(const FloatMatrix &src, const IntArray &loc)
double at(std::size_t i, std::size_t j) const
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
IntegrationPointStatus * giveMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default)
double giveWeight()
Returns integration weight of receiver.
virtual bcGeomType giveBCGeoType() const
virtual bcValType giveBCValType() const
virtual void computeComponentArrayAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
Quad1MindlinShell3D(int n, Domain *d)
void computeBodyLoadVectorAt(FloatArray &answer, Load *load, TimeStep *tStep, ValueModeType mode) override
virtual void computeLCS()
double computeEdgeVolumeAround(GaussPoint *gp, int iEdge) override
void computeVectorOfUnknowns(ValueModeType mode, TimeStep *tStep, FloatArray &shellUnknowns, FloatArray &drillUnknowns)
void initializeFrom(InputRecord &ir, int priority) override
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
void computeMidPlaneNormal(FloatArray &answer, const GaussPoint *gp) override
int computeLoadLEToLRotationMatrix(FloatMatrix &answer, int iEdge, GaussPoint *gp) override
void giveDofManDofIDMask(int inode, IntArray &) const override
Element_Geometry_Type giveGeometryType() const override
void computeLumpedMassMatrix(FloatMatrix &answer, TimeStep *tStep) override
void giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord=0) override
void computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) override
double giveCharacteristicLength(const FloatArray &normalToCrackPlane) override
static IntArray drillOrdering
Ordering for the drilling dofs (the out-of-plane rotations).
void SPRNodalRecoveryMI_giveSPRAssemblyPoints(IntArray &pap) override
void SPRNodalRecoveryMI_giveDofMansDeterminedByPatch(IntArray &answer, int pap) override
bool computeGtoLRotationMatrix(FloatMatrix &answer) override
static IntArray shellOrdering
Ordering for the normal shell stiffness (everything but the out-of-plane rotations).
Interface * giveInterface(InterfaceType it) override
static FEI2dQuadLin interp
FEInterpolation * giveInterpolation() const override
double computeVolumeAround(GaussPoint *gp) override
void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep) override
static ParamKey IPK_Quad1MindlinShell3D_reducedIntegration
void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep) override
void giveEdgeDofMapping(IntArray &answer, int iEdge) const override
void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int=1, int=ALL_STRAINS) override
void computeGaussPoints() override
std::vector< FloatArray > lnodes
Cached nodal coordinates in local c.s.,.
bool reducedIntegrationFlag
Flag controlling reduced (one - point) integration for shear.
FloatMatrix lcsMatrix
Cached coordinates in local c.s.,.
void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) override
SPRNodalRecoveryModelInterface()
Constructor.
virtual FloatMatrixF< 8, 8 > give3dShellStiffMtrx(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const =0
virtual FloatArrayF< 8 > giveGeneralizedStress_Shell(const FloatArrayF< 8 > &generalizedStrain, GaussPoint *gp, TimeStep *tStep) const =0
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
StructuralElement(int n, Domain *d)
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
ZZNodalRecoveryModelInterface(Element *element)
Constructor.
#define OOFEM_WARNING(...)
double norm(const FloatArray &x)
@ CS_DrillingStiffness
Penalty stiffness for drilling DOFs.
@ BodyLoadBGT
Distributed body load.
FloatArrayF< 3 > cross(const FloatArrayF< 3 > &x, const FloatArrayF< 3 > &y)
Computes $ x \cross y $.
@ SPRNodalRecoveryModelInterfaceType
@ ZZNodalRecoveryModelInterfaceType
FloatArrayF< N > normalize(const FloatArrayF< N > &x)
Normalizes vector (L2 norm).
#define PM_UPDATE_PARAMETER(_val, _pm, _ir, _componentnum, _paramkey, _prio)