76 if (type == MomentumBalance_StiffnessMatrix) {
78 answer.
resize(udofs,udofs);
81 }
else if (type == MomentumBalance_PressureCouplingMatrix) {
85 }
else if (type == MassBalance_PermeabilityMatrix) {
87 answer.
resize(pdofs,pdofs);
90 }
else if (type == MassBalance_CompresibilityMatrix) {
92 answer.
resize(pdofs,pdofs);
95 }
else if (type == MassBalance_StressCouplingMatrix) {
106 if (type == MomentumBalance_StressResidual) {
110 }
else if (type == MomentumBalance_PressureResidual) {
114 }
else if (type == MassBalance_StressRateResidual) {
118 }
else if (type == MassBalance_PressureResidual) {
122 }
else if (type == MassBalance_PressureRateResidual) {
126 }
else if (type == ExternalForcesVector) {
136 if ( type != ExternalForcesVector ) {
164 if ( type != ExternalForcesVector ) {
191 if (q == Variable::VariableQuantity::Displacement) {
201 for (
int i = 1; i <= 3; i++ ) {
202 answer.
at(i, 3) = nn.
at(i);
207 double test = fabs(fabs( nn.
at(3) ) - 1.0);
208 if ( test < 1.e-5 ) {
209 h1.at(1) = answer.
at(1, 1) = 1.0;
210 h1.at(2) = answer.
at(2, 1) = 0.0;
212 h1.at(1) = answer.
at(1, 1) = answer.
at(2, 3);
213 h1.at(2) = answer.
at(2, 1) = -answer.
at(1, 3);
216 h1.at(3) = answer.
at(3, 1) = 0.0;
219 for (
int i = 1; i <= 3; i++ ) {
220 answer.
at(i, 2) = h2.
at(i);
263 if (q == Variable::VariableQuantity::Displacement) {
265 int o = (num-1)*4+1-(num>4)*(num-5);
266 answer = {o, o+1, o+2};
267 }
else if (q == Variable::VariableQuantity::Pressure) {
281 if (inode >0 && inode <5) {
297 if (q == Variable::VariableQuantity::Displacement) {
298 answer={1,2,3, 5,6,7, 9,10,11, 13,14,15, 16,17,18, 19,20,21};
324#define _IFT_UPTetra21_Name "uptetra21"
341 UPBrick11(
int n,
Domain* d):
345 numberOfGaussPoints = 8;
346 this->computeGaussPoints();
351 if (q == Variable::VariableQuantity::Displacement) {
354 answer={o, o+1, o+2};
355 }
else if (q == Variable::VariableQuantity::Pressure) {
364 void giveDofManDofIDMask(
int inode,
IntArray &answer)
const override {
367 int giveNumberOfDofs()
override {
return 32; }
368 const char *giveInputRecordName()
const override {
return "upbrick11";}
369 const char *giveClassName()
const override {
return "UPBrick11"; }
372 const FEInterpolation* getGeometryInterpolation()
const override {
return &this->pInterpol;}
377 int getNumberOfSurfaceDOFs()
const override {
return 16;}
378 int getNumberOfEdgeDOFs()
const override {
return 0;}
380 if (q == Variable::VariableQuantity::Displacement) {
381 answer={1,2,3, 5,6,7, 9,10,11, 13,14,15};
383 answer ={4, 8, 12, 16};
398 virtual int giveNumberOfUDofs()
const override {
return 24;}
399 virtual int giveNumberOfPDofs()
const override {
return 8;}
400 virtual const Variable* getU()
const override {
return &u;}
401 virtual const Variable* getP()
const override {
return &p;}
402 void computeGaussPoints()
override {
403 if ( integrationRulesArray.size() == 0 ) {
404 integrationRulesArray.resize( 1 );
405 integrationRulesArray [ 0 ] = std::make_unique<GaussIntegrationRule>(1,
this);
406 integrationRulesArray [ 0 ]->SetUpPointsOnCube(numberOfGaussPoints, _3dUP);
411const FEI3dHexaLin UPBrick11::uInterpol;
412const FEI3dHexaLin UPBrick11::pInterpol;
413const Variable UPBrick11::p(&UPBrick11::pInterpol, Variable::VariableQuantity::Pressure, Variable::VariableType::scalar, 1, NULL, {11});
414const Variable UPBrick11::u(&UPBrick11::uInterpol, Variable::VariableQuantity::Displacement, Variable::VariableType::vector, 3, NULL, {1,2,3});
416#define _IFT_UPBrick11_Name "upbrick11"
433 UPQuad11(
int n,
Domain* d):
437 numberOfGaussPoints = 4;
438 this->computeGaussPoints();
443 if (q == Variable::VariableQuantity::Displacement) {
447 }
else if (q == Variable::VariableQuantity::Pressure) {
456 void giveDofManDofIDMask(
int inode,
IntArray &answer)
const override {
459 int giveNumberOfDofs()
override {
return 12; }
460 const char *giveInputRecordName()
const override {
return "upquad11";}
462 const FEInterpolation* getGeometryInterpolation()
const override {
return &this->pInterpol;}
467 int getNumberOfSurfaceDOFs()
const override {
return 0;}
472 int getNumberOfEdgeDOFs()
const override {
return 6;}
474 if (q == Variable::VariableQuantity::Displacement) {
484 virtual int giveNumberOfUDofs()
const override {
return 8;}
485 virtual int giveNumberOfPDofs()
const override {
return 4;}
486 virtual const Variable* getU()
const override {
return &u;}
487 virtual const Variable* getP()
const override {
return &p;}
488 void computeGaussPoints()
override {
489 if ( integrationRulesArray.size() == 0 ) {
490 integrationRulesArray.resize( 1 );
491 integrationRulesArray [ 0 ] = std::make_unique<GaussIntegrationRule>(1,
this);
492 integrationRulesArray [ 0 ]->SetUpPointsOnSquare(numberOfGaussPoints, _2dUP);
497const FEI2dQuadLin UPQuad11::uInterpol(1,2);
498const FEI2dQuadLin UPQuad11::pInterpol(1,2);
499const Variable UPQuad11::p(&UPQuad11::pInterpol, Variable::VariableQuantity::Pressure, Variable::VariableType::scalar, 1, NULL, {11});
500const Variable UPQuad11::u(&UPQuad11::uInterpol, Variable::VariableQuantity::Displacement, Variable::VariableType::vector, 2, NULL, {1,2});
502#define _IFT_UPQuad11_Name "upquad11"
507#define _IFT_UPSimpleMaterial_Name "upm"
508#define _IFT_UPSimpleMaterial_E "e"
509#define _IFT_UPSimpleMaterial_nu "nu"
510#define _IFT_UPSimpleMaterial_k "k"
511#define _IFT_UPSimpleMaterial_alpha "alpha"
512#define _IFT_UPSimpleMaterial_c "c"
528 tempStressVector(), tempStrainVector()
532 const FloatArray &giveStrainVector()
const {
return strainVector; }
534 const FloatArray &giveStressVector()
const {
return stressVector; }
536 const FloatArray &giveTempStrainVector()
const {
return tempStrainVector; }
538 const FloatArray &giveTempStressVector()
const {
return tempStressVector; }
540 void letTempStressVectorBe(
const FloatArray &v) { tempStressVector = v; }
542 void letTempStrainVectorBe(
const FloatArray &v) { tempStrainVector = v; }
544 void printOutputAt(FILE *file,
TimeStep *tStep)
const override {
545 MaterialStatus :: printOutputAt(file, tStep);
546 fprintf(file,
" strains ");
547 for (
auto &var : strainVector ) {
548 fprintf( file,
" %+.4e", var );
551 fprintf(file,
"\n stresses");
552 for (
auto &var : stressVector ) {
553 fprintf( file,
" %+.4e", var );
558 void initTempStatus()
override {
559 MaterialStatus :: initTempStatus();
560 tempStressVector = stressVector;
561 tempStrainVector = strainVector;
563 void updateYourself(
TimeStep *tStep)
override {
564 MaterialStatus :: updateYourself(tStep);
565 stressVector = tempStressVector;
566 strainVector = tempStrainVector;
568 const char *giveClassName()
const override {
return "UPMaterialStatus";}
584 if (type == TangentStiffness) {
587 ee =
e / ( ( 1. +
nu ) * ( 1. - 2. *
nu ) );
591 answer.
at(1, 1) = 1. -
nu;
592 answer.
at(1, 2) =
nu;
593 answer.
at(1, 3) =
nu;
594 answer.
at(2, 1) =
nu;
595 answer.
at(2, 2) = 1. -
nu;
596 answer.
at(2, 3) =
nu;
597 answer.
at(3, 1) =
nu;
598 answer.
at(3, 2) =
nu;
599 answer.
at(3, 3) = 1. -
nu;
601 answer.
at(4, 4) = ( 1. - 2. *
nu ) * 0.5;
602 answer.
at(5, 5) = ( 1. - 2. *
nu ) * 0.5;
603 answer.
at(6, 6) = ( 1. - 2. *
nu ) * 0.5;
606 }
else if (type == Permeability) {
607 if (mmode == _3dUP) {
610 answer.
times(this->k/this->muw);
611 }
else if (mmode == _2dUP) {
614 answer.
times(this->k);
620 if (type == Stress) {
622 UPMaterialStatus *status =
static_cast< UPMaterialStatus *
>( this->
giveStatus(gp) );
627 status->letTempStrainVectorBe(flux);
628 status->letTempStressVectorBe(answer);
630 }
else if (type == FluidMassBalancePressureContribution) {
639 if (type == BiotConstant) {
641 }
else if (type == CompressibilityCoefficient) {
649 Material :: initializeFrom(ir);
660 std::unique_ptr<MaterialStatus>
CreateStatus(
GaussPoint *gp)
const override {
return std::make_unique<UPMaterialStatus>(gp); }
665 UPMaterialStatus *status =
static_cast< UPMaterialStatus *
>( this->
giveStatus(gp) );
666 if ( type == IST_StrainTensor ) {
667 answer = status->giveStrainVector();
670 if ( type == IST_StressTensor ) {
671 answer = status->giveStressVector();
#define REGISTER_Material(class)
#define REGISTER_Element(class)
A Linear momentum balance equation term ($B^T\sigma(u)$).
A continuity equation term $Qp=(B)^T \alpha\bf{m}N_p$.
int giveApproxOrder() override=0
virtual int giveNumberOfDofs()
virtual const FEInterpolation * getGeometryInterpolation() const
int numberOfDofMans
Number of dofmanagers.
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
virtual Element_Geometry_Type giveGeometryType() const =0
virtual std::unique_ptr< IntegrationRule > giveBoundaryEdgeIntegrationRule(int order, int boundary, const Element_Geometry_Type) const
virtual std::unique_ptr< IntegrationRule > giveBoundarySurfaceIntegrationRule(int order, int boundary, const Element_Geometry_Type) const
int giveInterpolationOrder() const
virtual double boundarySurfaceEvalNormal(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
void assemble(const FloatArray &fe, const IntArray &loc)
void zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void beVectorProductOf(const FloatArray &v1, const FloatArray &v2)
void resize(Index rows, Index cols)
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
void zero()
Zeroes all coefficient of receiver.
double at(std::size_t i, std::size_t j) const
void beUnitMatrix()
Sets receiver to unity matrix.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
virtual int getNumberOfSurfaceDOFs() const =0
virtual void getEdgeLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q) const =0
virtual int getNumberOfEdgeDOFs() const =0
void integrateSurfaceTerm_c(FloatArray &answer, const Term &term, IntegrationRule *iRule, int isurf, TimeStep *tstep)
virtual void getSurfaceLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q) const =0
MPElement(int n, Domain *aDomain)
void integrateEdgeTerm_c(FloatArray &answer, const Term &term, IntegrationRule *iRule, int iedge, TimeStep *tstep)
void integrateTerm_c(FloatArray &answer, const Term &term, IntegrationRule *iRule, TimeStep *tstep)
void integrateTerm_dw(FloatMatrix &answer, const Term &term, IntegrationRule *iRule, TimeStep *tstep)
Material(int n, Domain *d)
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
A continuity equation term $Q^T(du\over dt)=(N)^T \alpha\bf{m}^TB du\over dt$.
A continuity equation compressibility matrix $S=(N_p)^T c\ N_p$, where $c=({\alpha-n}...
A external flux term $S=(N)^T f$, where $f$ is functor evaluating the flux.
A external flux term $S=(N)^T f$, where $f$ is functor evaluating the flux.
Base class for (3D) UP elements.
virtual int giveNumberOfUDofs() const =0
virtual int giveNumberOfPDofs() const =0
void giveCharacteristicMatrix(FloatMatrix &answer, CharType type, TimeStep *tStep) override
void computeBoundarySurfaceLoadVector(FloatArray &answer, BoundaryLoad *load, int boundary, CharType type, ValueModeType mode, TimeStep *tStep, bool global=true) override
virtual const Variable * getP() const =0
UPElement(int n, Domain *d)
void computeBoundaryEdgeLoadVector(FloatArray &answer, BoundaryLoad *load, int boundary, CharType type, ValueModeType mode, TimeStep *tStep, bool global=true) override
void giveCharacteristicVector(FloatArray &answer, CharType type, ValueModeType mode, TimeStep *tStep) override
virtual const Variable * getU() const =0
int computeFluxLBToLRotationMatrix(FloatMatrix &answer, int iSurf, const FloatArray &lc, const Variable::VariableQuantity q, char btype) override
double giveCharacteristicValue(MatResponseMode type, GaussPoint *gp, TimeStep *tStep) const override
Returns characteristic value of the receiver.
const char * giveInputRecordName() const override
void initializeFrom(InputRecord &ir) override
void giveInputRecord(DynamicInputRecord &input) override
std::unique_ptr< MaterialStatus > CreateStatus(GaussPoint *gp) const override
UPSimpleMaterial(int n, Domain *d)
void giveCharacteristicMatrix(FloatMatrix &answer, MatResponseMode type, GaussPoint *gp, TimeStep *tStep) const override
Returns characteristic matrix of the receiver.
const char * giveClassName() const override
void giveCharacteristicVector(FloatArray &answer, FloatArray &flux, MatResponseMode type, GaussPoint *gp, TimeStep *tStep) const override
Returns characteristic vector of the receiver.
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
3D Tetrahedra element with quadratic interpolation for displacements, linear interpolation for pressu...
int giveNumberOfDofs() override
void giveDofManDofIDMask(int inode, IntArray &answer) const override
void getDofManLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q, int num) const override
virtual int giveNumberOfUDofs() const override
static const FEI3dTetLin pInterpol
int getNumberOfSurfaceDOFs() const override
Element_Geometry_Type giveGeometryType() const override
int getNumberOfEdgeDOFs() const override
virtual int giveNumberOfPDofs() const override
UPTetra21(int n, Domain *d)
const FEInterpolation * getGeometryInterpolation() const override
void getInternalDofManLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q, int num) const override
void getEdgeLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q) const override
static const FEI3dTetQuad uInterpol
void computeGaussPoints() override
void getSurfaceLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q) const override
virtual const Variable * getU() const override
const char * giveInputRecordName() const override
virtual const Variable * getP() const override
oofem::VariableQuantity VariableQuantity
const FEInterpolation * interpolation
A continuity equation term ($Hp=(\grad N_p)^T f(p)$, where $f=\bf{k}/\mu \grad p$.
@ ZZNodalRecoveryModelInterfaceType
#define _IFT_UPSimpleMaterial_E
#define _IFT_UPSimpleMaterial_nu
#define _IFT_UPSimpleMaterial_alpha
#define _IFT_UPSimpleMaterial_c
#define _IFT_UPSimpleMaterial_Name
#define _IFT_UPSimpleMaterial_k