37 #include "../sm/Elements/graddpelement.h" 38 #include "../sm/Materials/structuralms.h" 39 #include "../sm/CrossSections/structuralcrosssection.h" 40 #include "../sm/Elements/nlstructuralelement.h" 41 #include "../sm/Materials/graddpmaterialextensioninterface.h" 79 for (
int i = 1; i <=
nlSize; i++ ) {
101 double nlCumulatedStrain;
109 OOFEM_ERROR(
"Material doesn't implement the required DpGrad interface!");
117 }
else if ( nlGeo == 1 ) {
162 if ( matMode == _3dMat || matMode == _PlaneStrain ) {
166 }
else if ( matMode == _PlaneStress ) {
169 }
else if ( matMode == _1dMat ) {
202 double localCumulatedStrain = 0.;
220 aux.
add(-dV * localCumulatedStrain, Nk);
241 }
else if ( nlGeo == 1 ) {
265 double localCumulatedStrain = 0.;
283 OOFEM_ERROR(
"Material doesn't implement the required DpGrad interface!");
290 }
else if ( nlGeo == 1 ) {
305 answerK.
add(-dV * localCumulatedStrain, Nk);
306 answerK.
add(kappa * dV, Nk);
309 double l = lStiff.
at(1, 1);
367 FloatMatrix answer_uu, answer_ku, answer_uk, answer_kk;
376 OOFEM_ERROR(
"Material doesn't implement the required DpGrad interface!");
383 }
else if ( nlGeo == 1 ) {
400 if ( matStiffSymmFlag ) {
411 double dl1, dl2, dl3;
425 n1 = {dLdS.
at(1, 1), dLdS.
at(2, 1)};
426 n2 = {dLdS.
at(1, 2), dLdS.
at(2, 2)};
432 dL1.at(1, 1) = dl1 * n1.
at(1) * n1.
at(1) + dl2 * n2.
at(1) * n2.
at(1);
433 dL1.at(1, 2) = dl1 * n1.
at(2) * n1.
at(2) + dl2 * n2.
at(2) * n2.
at(2);
434 dL1.at(1, 3) = dl1 * n1.
at(1) * n1.
at(2) + dl2 * n2.
at(1) * n2.
at(2);
445 dL2.at(1, 1) = dl3 * ( n1.
at(1) * n2.
at(1) + n1.
at(1) * n2.
at(1) );
446 dL2.at(1, 2) = dl3 * ( n1.
at(2) * n2.
at(2) + n1.
at(2) * n2.
at(2) );
447 dL2.at(1, 3) = dl3 * ( n1.
at(2) * n2.
at(1) + n1.
at(1) * n2.
at(2) );
463 double l = lStiff.
at(1, 1);
474 answer_uu.
add(initialStressMatrix);
477 if ( matStiffSymmFlag ) {
527 OOFEM_ERROR(
"Material doesn't implement the required DpGrad interface!");
531 }
else if ( nlGeo == 1 ) {
542 if ( matStiffSymmFlag ) {
552 answer.
add(initialStressMatrix);
555 if ( matStiffSymmFlag ) {
579 OOFEM_ERROR(
"Material doesn't implement the required DpGrad interface!");
598 double dl1, dl2, dl3;
601 FloatMatrix Bk, BktM22, BktM22Gk, BktM12, BktM12Gk, M22(2, 2), M12(2, 2);
602 FloatMatrix dL1(1, 3), dL2(1, 3), result1, result2, dLdS, n(2, 2);
613 n.
at(1, 1) = dLdS.
at(1, 1);
614 n.
at(1, 2) = dLdS.
at(1, 2);
615 n.
at(2, 1) = dLdS.
at(2, 1);
616 n.
at(2, 2) = dLdS.
at(2, 2);
619 M22.at(1, 1) = n.
at(1, 2) * n.
at(1, 2);
620 M22.at(1, 2) = n.
at(1, 2) * n.
at(2, 2);
621 M22.at(2, 1) = n.
at(2, 2) * n.
at(1, 2);
622 M22.at(2, 2) = n.
at(2, 2) * n.
at(2, 2);
624 dL1.at(1, 1) = dl1 * n.
at(1, 1) * n.
at(1, 1) + dl2 *n.
at(1, 2) * n.
at(1, 2);
625 dL1.at(1, 2) = dl1 * n.
at(2, 1) * n.
at(2, 1) + dl2 *n.
at(2, 2) * n.
at(2, 2);
626 dL1.at(1, 3) = dl1 * n.
at(1, 1) * n.
at(2, 1) + dl2 *n.
at(1, 2) * n.
at(2, 2);
634 answer.
add(dV, result1);
641 M12.
at(1, 1) = n.
at(1, 1) * n.
at(1, 2) + n.
at(1, 2) * n.
at(1, 1);
642 M12.
at(1, 2) = n.
at(1, 1) * n.
at(2, 2) + n.
at(1, 2) * n.
at(2, 1);
643 M12.
at(2, 1) = n.
at(2, 1) * n.
at(1, 2) + n.
at(2, 2) * n.
at(1, 1);
644 M12.
at(2, 2) = n.
at(2, 1) * n.
at(2, 2) + n.
at(2, 2) * n.
at(2, 1);
646 dL2.at(1, 1) = dl3 * ( n.
at(1, 1) * n.
at(1, 2) + n.
at(1, 1) * n.
at(1, 2) );
647 dL2.at(1, 2) = dl3 * ( n.
at(2, 1) * n.
at(2, 2) + n.
at(2, 1) * n.
at(2, 2) );
648 dL2.at(1, 3) = dl3 * ( n.
at(1, 2) * n.
at(2, 1) + n.
at(1, 1) * n.
at(2, 2) );
655 answer.
add(dV, result2);
682 OOFEM_ERROR(
"Material doesn't implement the required DpGrad interface!");
692 double l = lStiff.
at(1, 1);
719 OOFEM_ERROR(
"Material doesn't implement the required DpGrad interface!");
CrossSection * giveCrossSection()
virtual void givePDGradMatrix_ku(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Left lower block.
virtual void computeBkappaMatrixAt(GaussPoint *gp, FloatMatrix &answer)=0
virtual IRResultType initializeFrom(InputRecord *ir)
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
void giveLocalInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
Returns local vector of unknowns.
void computeDisplacementDegreesOfFreedom(FloatArray &answer, TimeStep *tStep)
virtual IntegrationRule * giveIntegrationRule(int i)
Domain * domain
Link to domain object, useful for communicating with other FEM components.
void computeStiffnessMatrix(FloatMatrix &, MatResponseMode, TimeStep *)
Abstract base class for "structural" finite elements with geometrical nonlinearities.
double & at(int i)
Coefficient access function.
virtual StructuralElement * giveStructuralElement()=0
This class implements a structural material status information.
virtual void givePDGradMatrix_LD(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Stress-based averaging.
void giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
EngngModel * giveEngngModel()
Returns engineering model to which receiver is associated.
void plusDyadUnsym(const FloatArray &a, const FloatArray &b, double dV)
Adds to the receiver the product .
MaterialMode
Type representing material mode of integration point.
int & at(int i)
Coefficient access function.
MatResponseMode
Describes the character of characteristic material matrix.
virtual void givePDGradMatrix_uk(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Right upper block.
virtual void givePDGradMatrix_uu(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Left upper block.
void computeNonlocalDegreesOfFreedom(FloatArray &answer, TimeStep *tStep)
void plusProductUnsym(const FloatMatrix &a, const FloatMatrix &b, double dV)
Adds to the receiver the product .
const char * __MaterialModeToString(MaterialMode _value)
Abstract base class for all "structural" finite elements.
virtual Interface * giveMaterialInterface(InterfaceType t, IntegrationPoint *ip)
virtual double computeVolumeAround(GaussPoint *gp)
Returns volume related to given integration point.
virtual void computeNkappaMatrixAt(GaussPoint *gp, FloatArray &answer)=0
void giveNonlocalInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
void computeStiffnessMatrix_uu(FloatMatrix &, MatResponseMode, TimeStep *)
virtual void giveFirstPKStressVectorGrad(FloatArray &answer1, double &answer2, GaussPoint *gp, const FloatArray &totalStrain, double nonlocalDamageDrivningVariable, TimeStep *tStep)
double dotProduct(const FloatArray &x) const
Computes the dot product (or inner product) of receiver and argument.
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
Material interface for gradient material models.
virtual void givePDGradMatrix_kk(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Right lower block.
virtual bool isCharacteristicMtrxSymmetric(MatResponseMode rMode)
Check for symmetry of stiffness matrix.
virtual fMode giveFormulation()
Indicates type of non linear computation (total or updated formulation).
void computeLocalStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
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 .
void setDisplacementLocationArray()
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix^T and anArray.
double at(int i, int j) const
Coefficient access function.
void computeNonlocalGradient(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
void resize(int n)
Checks size of receiver towards requested bounds.
virtual void giveRealStressVectorGrad(FloatArray &answer1, double &answer2, GaussPoint *gp, const FloatArray &totalStrain, double nonlocalDamageDrivningVariable, TimeStep *tStep)
gradient - based giveRealStressVector
virtual NLStructuralElement * giveNLStructuralElement()=0
void computeStiffnessMatrix_uk(FloatMatrix &, MatResponseMode, TimeStep *)
int giveGeometryMode()
Returns the geometry mode describing the formulation used in the internal work 0 - Engineering (small...
void computeNonlocalCumulatedStrain(double &answer, GaussPoint *gp, TimeStep *tStep)
Class representing vector of real numbers.
Implementation of matrix containing floating point numbers.
IRResultType
Type defining the return values of InputRecord reading operations.
virtual void giveCauchyStressVectorGrad(FloatArray &answer1, double &answer2, GaussPoint *gp, const FloatArray &totalStrain, double nonlocalDamageDrivningVariable, TimeStep *tStep)
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 computeStressVectorAndLocalCumulatedStrain(FloatArray &answer, double localCumulatedPlasticStrain, GaussPoint *gp, TimeStep *tStep)
void add(const FloatMatrix &a)
Adds matrix to the receiver.
void zero()
Zeroes all coefficients of receiver.
void beTProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS)=0
Computes the geometrical matrix of receiver in given integration point.
void zero()
Zeroes all coefficient of receiver.
Domain * giveDomain() const
virtual void computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer)
Computes a matrix which, multiplied by the column matrix of nodal displacements, gives the displaceme...
void computeDeformationGradientVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
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 computeStiffnessMatrix_ku(FloatMatrix &, MatResponseMode, TimeStep *)
void assemble(const FloatMatrix &src, const IntArray &loc)
Assembles the contribution using localization array into receiver.
void clear()
Sets size of receiver to be an empty matrix. It will have zero rows and zero columns size...
void computeStiffnessMatrix_kk(FloatMatrix &, MatResponseMode, TimeStep *)
void symmetrized()
Initializes the lower half of the receiver according to the upper half.
virtual void computeInitialStressMatrix(FloatMatrix &answer, TimeStep *tStep)
Computes the initial stiffness matrix of receiver.
Class representing integration point in finite element program.
Class representing solution step.
void setNonlocalLocationArray()
void add(const FloatArray &src)
Adds array src to receiver.
void resize(int s)
Resizes receiver towards requested size.
void plusProduct(const FloatMatrix &b, const FloatArray &s, double dV)
Adds the product .