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 .