35 #include "../sm/Elements/Shells/quad1mindlinshell3d.h" 36 #include "../sm/Materials/structuralms.h" 37 #include "../sm/CrossSections/structuralcrosssection.h" 38 #include "../sm/Loads/constantpressureload.h" 56 IntArray
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;
126 forceX.
add(density * gravity.
at(1) * dV, n);
127 forceY.
add(density * gravity.
at(2) * dV, n);
128 forceZ.
add(density * gravity.
at(3) * dV, n);
134 answer.
at(1) = forceX.
at(1);
135 answer.
at(2) = forceY.
at(1);
136 answer.
at(3) = forceZ.
at(1);
138 answer.
at(7) = forceX.
at(2);
139 answer.
at(8) = forceY.
at(2);
140 answer.
at(9) = forceZ.
at(2);
142 answer.
at(13) = forceX.
at(3);
143 answer.
at(14) = forceY.
at(3);
144 answer.
at(15) = forceZ.
at(3);
146 answer.
at(19) = forceX.
at(4);
147 answer.
at(20) = forceY.
at(4);
148 answer.
at(21) = forceZ.
at(4);
215 for (
int i = 0; i < 4; ++i ) {
218 answer(0, 0 + i * 5) = dn(i, 0);
219 answer(1, 1 + i * 5) = dn(i, 1);
220 answer(2, 0 + i * 5) = dn(i, 1);
221 answer(2, 1 + i * 5) = dn(i, 0);
225 answer(3 + 0, 2 + 2 + i * 5) = dn(i, 0);
226 answer(3 + 1, 2 + 1 + i * 5) =-dn(i, 1);
227 answer(3 + 2, 2 + 2 + i * 5) = dn(i, 1);
228 answer(3 + 2, 2 + 1 + i * 5) =-dn(i, 0);
231 answer(3 + 3, 2 + 0 + i * 5) = dns(i, 0);
232 answer(3 + 3, 2 + 2 + i * 5) = ns(i);
233 answer(3 + 4, 2 + 0 + i * 5) = dns(i, 1);
234 answer(3 + 4, 2 + 1 + i * 5) = -ns(i);
243 double x1, x2, x3, x4;
244 double y1, y2, y3, y4;
245 double Ax, Bx, Cx, Ay, By, Cy;
247 double r = localCoords[0];
248 double s = localCoords[1];
260 Ax = x1 - x2 - x3 + x4;
261 Bx = x1 - x2 + x3 - x4;
262 Cx = x1 + x2 - x3 - x4;
264 Ay = y1 - y2 - y3 + y4;
265 By = y1 - y2 + y3 - y4;
266 Cy = y1 + y2 - y3 - y4;
272 double rz = sqrt(
sqr(Cx + r*Bx) +
sqr(Cy + r*By)) / ( 16 * detJ );
273 double sz = sqrt(
sqr(Ax + s*Bx) +
sqr(Ay + s*By)) / ( 16 * detJ );
277 OOFEM_WARNING(
"The MITC4 implementation isn't verified yet. Highly experimental");
283 double c_b = dxdr(0);
284 double s_b = dxdr(1);
285 double c_a = dxds(0);
286 double s_a = dxds(1);
289 answer(6, 2 + 5*0) = rz * s_b * ( (1+s)) - sz * s_a * ( (1+r));
290 answer(6, 2 + 5*1) = rz * s_b * (-(1+s)) - sz * s_a * ( (1-r));
291 answer(6, 2 + 5*2) = rz * s_b * (-(1-s)) - sz * s_a * (-(1-r));
292 answer(6, 2 + 5*3) = rz * s_b * ( (1-s)) - sz * s_a * (-(1+r));
294 answer(6, 3 + 5*0) = rz * s_b * (y2-y1) * 0.5 * (1+s) - sz * s_a * (y4-y1) * 0.5 * (1+r);
295 answer(6, 4 + 5*0) = rz * s_b * (x1-x2) * 0.5 * (1+s) - sz * s_a * (x1-x4) * 0.5 * (1+r);
297 answer(6, 3 + 5*1) = rz * s_b * (y2-y1) * 0.5 * (1+s) - sz * s_a * (y3-x2) * 0.5 * (1+r);
298 answer(6, 4 + 5*1) = rz * s_b * (x1-x2) * 0.5 * (1+s) - sz * s_a * (x2-x3) * 0.5 * (1+r);
300 answer(6, 3 + 5*2) = rz * s_b * (y3-y4) * 0.5 * (1-s) - sz * s_a * (y3-y2) * 0.5 * (1-r);
301 answer(6, 4 + 5*2) = rz * s_b * (x4-x3) * 0.5 * (1-s) - sz * s_a * (x2-x3) * 0.5 * (1-r);
303 answer(6, 3 + 5*3) = rz * s_b * (y3-y4) * 0.5 * (1-s) - sz * s_a * (y4-y1) * 0.5 * (1-r);
304 answer(6, 4 + 5*3) = rz * s_b * (x4-x3) * 0.5 * (1-s) - sz * s_a * (x1-x4) * 0.5 * (1-r);
307 answer(7, 2 + 5*0) = - rz * c_b * ( (1+s)) + sz * c_a * ( (1+r));
308 answer(7, 2 + 5*1) = - rz * c_b * (-(1+s)) + sz * c_a * ( (1-r));
309 answer(7, 2 + 5*2) = - rz * c_b * (-(1-s)) + sz * c_a * (-(1-r));
310 answer(7, 2 + 5*3) = - rz * c_b * ( (1-s)) + sz * c_a * (-(1+r));
312 answer(7, 3 + 5*0) = - rz * c_b * (y2-y1) * 0.5 * (1+s) + sz * c_a * (y4-y1) * 0.5 * (1+r);
313 answer(7, 4 + 5*0) = - rz * c_b * (x1-x2) * 0.5 * (1+s) + sz * c_a * (x1-x4) * 0.5 * (1+r);
315 answer(7, 3 + 5*1) = - rz * c_b * (y2-y1) * 0.5 * (1+s) + sz * c_a * (y3-x2) * 0.5 * (1+r);
316 answer(7, 4 + 5*1) = - rz * c_b * (x1-x2) * 0.5 * (1+s) + sz * c_a * (x2-x3) * 0.5 * (1+r);
318 answer(7, 3 + 5*2) = - rz * c_b * (y3-y4) * 0.5 * (1-s) + sz * c_a * (y3-y2) * 0.5 * (1-r);
319 answer(7, 4 + 5*2) = - rz * c_b * (x4-x3) * 0.5 * (1-s) + sz * c_a * (x2-x3) * 0.5 * (1-r);
321 answer(7, 3 + 5*3) = - rz * c_b * (y3-y4) * 0.5 * (1-s) + sz * c_a * (y4-y1) * 0.5 * (1-r);
322 answer(7, 4 + 5*3) = - rz * c_b * (x4-x3) * 0.5 * (1-s) + sz * c_a * (x1-x4) * 0.5 * (1-r);
372 bool drillCoeffFlag =
false;
385 if ( useUpdatedGpRecord ) {
394 if ( drillCoeff > 0. ) {
396 for (
int j = 0; j < 4; j++ ) {
400 drillMoment.
add(drillCoeff * dV * dtheta, n);
401 drillCoeffFlag =
true;
409 if ( drillCoeffFlag ) {
422 bool drillCoeffFlag =
false;
437 if ( drillCoeff > 0. ) {
439 for (
int j = 0; j < 4; j++ ) {
443 drillCoeffFlag =
true;
452 if ( drillCoeffFlag ) {
470 answer = {D_u, D_v, D_w, R_u, R_v, R_w};
500 return detJ * weight;
516 for (
int i = 0; i < 4; i++ ) {
517 answer(i * 6 + 0, i * 6 + 0) = mass * 0.25;
518 answer(i * 6 + 1, i * 6 + 1) = mass * 0.25;
519 answer(i * 6 + 2, i * 6 + 2) = mass * 0.25;
529 if ( type == IST_ShellForceTensor || type == IST_ShellStrainTensor ) {
530 if ( type == IST_ShellForceTensor ) {
535 answer.
at(1) = help.
at(1);
536 answer.
at(2) = help.
at(2);
538 answer.
at(4) = help.
at(8);
539 answer.
at(5) = help.
at(7);
540 answer.
at(6) = help.
at(3);
542 }
else if ( type == IST_ShellMomentTensor || type == IST_CurvatureTensor ) {
543 if ( type == IST_ShellMomentTensor ) {
548 answer.
at(1) = help.
at(4);
549 answer.
at(2) = help.
at(5);
553 answer.
at(6) = help.
at(6);
565 answer = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
566 }
else if ( iEdge == 2 ) {
567 answer = { 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18};
568 }
else if ( iEdge == 3 ) {
569 answer = {13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};
570 }
else if ( iEdge == 4 ) {
571 answer = {19, 20, 21, 22, 23, 24, 1, 2, 3, 4, 5, 6};
600 double dx, dy, length;
614 length = sqrt(dx * dx + dy * dy);
617 answer.
at(1, 1) = 1.0;
618 answer.
at(2, 2) = dx / length;
619 answer.
at(2, 3) = -dy / length;
620 answer.
at(3, 2) = -answer.
at(2, 3);
621 answer.
at(3, 3) = answer.
at(2, 2);
640 for (
int i = 1; i <= 3; i++ ) {
646 for (
int i = 1; i <= 4; i++ ) {
658 for (
int i = 0; i < 4; i++ ) {
685 for (
int i = 1; i < 5; i++ ) {
696 for (
int i = 1; i < 5; i++ ) {
double giveDeterminant() const
Returns the trace (sum of diagonal components) of the receiver.
CrossSection * giveCrossSection()
virtual void computeBodyLoadVectorAt(FloatArray &answer, Load *load, TimeStep *tStep, ValueModeType mode)
Computes the load vector due to body load acting on receiver, at given time step. ...
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
virtual void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)
Computes constitutive matrix of receiver.
The element interface required by ZZNodalRecoveryModel.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
virtual double computeVolumeAround(GaussPoint *gp)
Returns volume related to given integration point.
virtual void giveEdgeDofMapping(IntArray &answer, int iEdge) const
Assembles edge dof mapping mask, which provides mapping between edge local DOFs and "global" element ...
void beVectorProductOf(const FloatArray &v1, const FloatArray &v2)
Computes vector product (or cross product) of vectors given as parameters, , and stores the result in...
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
Returns local vector of unknowns.
virtual int computeLoadLEToLRotationMatrix(FloatMatrix &answer, int iEdge, GaussPoint *gp)
Returns transformation matrix from local edge c.s to element local coordinate system of load vector c...
virtual FEInterpolation * giveInterpolation() const
virtual void SPRNodalRecoveryMI_giveDofMansDeterminedByPatch(IntArray &answer, int pap)
virtual double giveTransformationJacobian(const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the determinant of the transformation.
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
Wrapper around cell with vertex coordinates stored in FloatArray**.
The element interface required by ZZNodalRecoveryModel.
Abstract base class for "structural" finite elements with geometrical nonlinearities.
double & at(int i)
Coefficient access function.
ValueModeType
Type representing the mode of UnknownType or CharType, or similar types.
static FEI2dQuadLin interp
This class implements a structural material status information.
void clear()
Clears receiver (zero size).
static IntArray drillOrdering
Ordering for the drilling dofs (the out-of-plane rotations)
virtual double edgeGiveTransformationJacobian(int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the edge Jacobian of transformation between local and global coordinates.
Penalty stiffness for drilling DOFs.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void computeComponentArrayAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
Computes boundary condition value - its components values at given time.
virtual void giveDofManDofIDMask(int inode, IntArray &) const
Returns dofmanager dof mask for node.
virtual double giveCoordinate(int i)
Class implementing an array of integers.
int & at(int i)
Coefficient access function.
MatResponseMode
Describes the character of characteristic material matrix.
virtual void computeMidPlaneNormal(FloatArray &answer, const GaussPoint *gp)
Computes mid-plane normal of receiver at integration point.
bool reducedIntegrationFlag
Flag controlling reduced (one - point) integration for shear.
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Sets receiver to be a - b.
void setSubMatrix(const FloatMatrix &src, int sr, int sc)
Adds the given matrix as sub-matrix to receiver.
virtual void giveJacobianMatrixAt(FloatMatrix &jacobianMatrix, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Gives the jacobian matrix at the local coordinates.
Class representing a general abstraction for finite element interpolation class.
virtual void give3dShellStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Method for computing 3d shell stiffness matrix.
double dotProduct(const FloatArray &x) const
Computes the dot product (or inner product) of receiver and argument.
virtual void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)
Computes the stress vector of receiver at given integration point, at time step tStep.
virtual void computeLocalEdgeMapping(IntArray &edgeNodes, int iedge)
DofIDItem
Type representing particular dof type.
virtual double giveWeight()
Returns integration weight of receiver.
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
virtual void SPRNodalRecoveryMI_giveSPRAssemblyPoints(IntArray &pap)
virtual bool computeGtoLRotationMatrix(FloatMatrix &answer)
Returns transformation matrix from global c.s.
#define _IFT_Quad1MindlinShell3D_ReducedIntegration
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
void plusProductSymmUpper(const FloatMatrix &a, const FloatMatrix &b, double dV)
Adds to the receiver the product .
virtual void giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord=0)
Evaluates nodal representation of real internal forces.
virtual double giveLengthInDir(const FloatArray &normalToCrackPlane)
Default implementation returns length of element projection into specified direction.
double at(int i, int j) const
Coefficient access function.
void resize(int n)
Checks size of receiver towards requested bounds.
virtual int setupIntegrationPoints(IntegrationRule &irule, int npoints, Element *element)
Sets up integration rule for the given element.
int numberOfGaussPoints
Number of integration points as specified by nip.
Class representing vector of real numbers.
void plusDyadSymmUpper(const FloatArray &a, double dV)
Adds to the receiver the dyadic product .
Implementation of matrix containing floating point numbers.
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.
virtual void computeLCS()
static IntArray shellOrdering
Ordering for the normal shell stiffness (everything but the out-of-plane rotations) ...
void beSubArrayOf(const FloatArray &src, const IntArray &indx)
Extract sub vector form src array and stores the result into receiver.
IntegrationPointStatus * giveMaterialStatus()
Returns reference to associated material status (NULL if not defined).
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
Returns the size of element in the given direction, in some cases adjusted (e.g.
void assemble(const FloatArray &fe, const IntArray &loc)
Assembles the array fe (typically, the load vector of a finite element) into the receiver, using loc as location array.
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
Void cell geometry wrapper.
virtual void computeLumpedMassMatrix(FloatMatrix &answer, TimeStep *tStep)
Computes lumped mass matrix of receiver.
void zero()
Zeroes all coefficients of receiver.
virtual bcGeomType giveBCGeoType() const
Returns geometry character of boundary condition.
virtual void computeGaussPoints()
Initializes the array of integration rules member variable.
virtual double computeEdgeVolumeAround(GaussPoint *gp, int iEdge)
Computes volume related to integration point on local edge.
std::vector< std::unique_ptr< IntegrationRule > > integrationRulesArray
List of integration rules of receiver (each integration rule contains associated integration points a...
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void giveGeneralizedStress_Shell(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)=0
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int=1, int=ALL_STRAINS)
Computes the geometrical matrix of receiver in given integration point.
void zero()
Zeroes all coefficient of receiver.
InterfaceType
Enumerative type, used to identify interface type.
virtual void computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Compute strain vector of receiver evaluated at given integration point at given time step from elemen...
Load is base abstract class for all loads.
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
void computeVectorOfUnknowns(ValueModeType mode, TimeStep *tStep, FloatArray &shellUnknowns, FloatArray &drillUnknowns)
int giveSize() const
Returns the size of receiver.
Abstract base class for all structural cross section models.
the oofem namespace is to define a context or scope in which all oofem names are defined.
void assemble(const FloatMatrix &src, const IntArray &loc)
Assembles the contribution using localization array into receiver.
virtual bcValType giveBCValType() const
Returns receiver load type.
Class implementing node in finite element mesh.
virtual ~Quad1MindlinShell3D()
double normalize()
Normalizes receiver.
Node * giveNode(int i) const
Returns reference to the i-th node of element.
virtual double evaldNdx(FloatMatrix &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the matrix of derivatives of interpolation functions (shape functions) at given point...
virtual void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
Computes the stiffness matrix of receiver.
void symmetrized()
Initializes the lower half of the receiver according to the upper half.
Quad1MindlinShell3D(int n, Domain *d)
Class representing integration point in finite element program.
#define OOFEM_WARNING(...)
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
std::vector< FloatArray > lnodes
Cached nodal coordinates in local c.s.,.
Class representing solution step.
FloatMatrix lcsMatrix
Cached coordinates in local c.s.,.
int numberOfDofMans
Number of dofmanagers.
void add(const FloatArray &src)
Adds array src to receiver.
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the array of interpolation functions (shape functions) at given point.
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
Class representing Gaussian-quadrature integration rule.
void resize(int s)
Resizes receiver towards requested size.
void plusProduct(const FloatMatrix &b, const FloatArray &s, double dV)
Adds the product .