46 #define _MAZARS_MODEL_ITER_TOL 1.e-15 47 #define _MAZARS_MODEL_MAX_ITER 400. 81 if ( result !=
IRRT_OK )
return result;
83 if ( result !=
IRRT_OK )
return result;
85 if ( result !=
IRRT_OK )
return result;
94 }
else if ( ver == 0 ) {
104 this->
Bc = (
Ac - 1.0 ) / (
Ac *
e0 );
132 double posNorm = 0.0;
144 strainb.
at(3) = -
nu * ( strainb.
at(1) + strainb.
at(2) ) / ( 1. -
nu );
145 }
else if ( ndim == 1 ) {
146 strainb.
at(2) = -
nu *strainb.
at(1);
147 strainb.
at(3) = -
nu *strainb.
at(1);
151 principalStrains.
resize(3);
152 for (
int i = 1; i <= 3; i++ ) {
153 principalStrains.
at(i) = strainb.
at(i);
170 for (
int i = 1; i <= 3; i++ ) {
171 if ( principalStrains.
at(i) > 0.0 ) {
172 posNorm += principalStrains.
at(i) * principalStrains.
at(i);
176 kappa = sqrt(posNorm);
218 answer.
resize(ndim, ndim);
219 for (
int i = 1; i <= ndim; i++ ) {
220 for (
int j = 1; j <= ndim; j++ ) {
222 answer.
at(i, j) = 1. /
E;
224 answer.
at(i, j) = -
nu /
E;
236 double gt,
gc, alpha_t, alpha_c, alpha, eqStrain2;
238 if ( kappa <= this->
e0 ) {
261 for (
int i = 1; i <= ndim; i++ ) {
262 if ( sigp.
at(i) < 0. ) {
274 epsi.
at(3) = -
nu * ( epsi.
at(1) + epsi.
at(2) ) / ( 1. -
nu );
275 epsti.
at(3) = -
nu * ( epsti.
at(1) + epsti.
at(2) ) / ( 1. -
nu );
276 }
else if ( ndim == 1 ) {
279 epsi.
at(2) = epsi.
at(3) = -
nu *epsi.
at(1);
280 epsti.
at(2) = epsti.
at(3) = -
nu *epsti.
at(1);
326 for (
int i = 1; i <= 3; i++ ) {
327 if ( epsi.
at(i) > 0.0 ) {
328 eqStrain2 += epsi.
at(i) * epsi.
at(i);
329 alpha += epsti.
at(i) * epsi.
at(i);
333 if ( eqStrain2 > 0. ) {
339 }
else if ( alpha < 0. ) {
343 if ( this->
beta == 1. ) {
345 alpha_c = 1. - alpha;
346 }
else if ( alpha <= 0. ) {
349 }
else if ( alpha < 1. ) {
350 alpha_t = pow(alpha, this->
beta);
351 alpha_c = pow( ( 1. - alpha ), this->
beta );
357 omega = alpha_t * gt + alpha_c *
gc;
369 gt = 1.0 - ( this->
e0 / kappa ) * exp( ( this->
e0 - kappa ) / this->
ef );
371 gt = 1.0 - ( 1.0 - this->
At ) * this->
e0 / kappa - this->
At *exp( -this->
Bt * ( kappa - this->
e0 ) );
379 double aux, hCurrt, kappaRefT, dgt, R;
381 hCurrt = status->
giveLe();
385 gt = 1.0 - ( this->
e0 / kappaRefT ) * exp( ( this->
e0 - kappaRefT ) / this->
ef );
386 dgt = this->
e0 / kappaRefT / kappaRefT + this->
e0 / kappaRefT / this->
ef;
387 dgt *= exp( ( this->
e0 - kappaRefT ) / this->
ef );
389 gt = 1.0 - ( 1.0 - this->
At ) * this->
e0 / kappaRefT - this->
At *exp( -this->
Bt * ( kappaRefT - this->
e0 ) );
390 dgt = ( 1.0 - this->
At ) * this->
e0 / kappaRefT / kappaRefT + this->
At *exp( -this->
Bt * ( kappaRefT - this->
e0 ) ) * this->
Bt;
393 aux = 1 + gt * (
hReft / hCurrt - 1.0 );
394 R = kappaRefT * aux - kappa;
396 if ( ( gt < 0. ) || ( gt > 1.0 ) ) {
400 return gt * (
hReft * kappaRefT ) / ( hCurrt * kappa );
403 aux += dgt * kappaRefT * (
hReft / hCurrt - 1.0 );
404 kappaRefT += -R / aux;
407 OOFEM_ERROR(
"tension objectivity iteration internal error - no convergence");
416 gc = 1.0 - ( 1.0 - this->
Ac ) * this->
e0 / kappa - this->
Ac *exp( -this->
Bc * ( kappa - this->
e0 ) );
422 double aux, hCurrc, kappaRefC, dgc, R;
427 gc = 1.0 - ( 1.0 - this->
Ac ) * this->
e0 / kappaRefC - this->
Ac *exp( -this->
Bc * ( kappaRefC - this->
e0 ) );
428 aux = 1 + gc * (
hRefc / hCurrc - 1.0 );
429 R = kappaRefC * aux - kappa;
431 return gc * (
hRefc * kappaRefC ) / ( hCurrc * kappa );
434 dgc = ( 1.0 - this->
Ac ) * this->
e0 / kappaRefC / kappaRefC + this->
Ac *exp( -this->
Bc * ( kappaRefC - this->
e0 ) ) * this->
Bc;
435 aux += dgc * kappaRefC * (
hRefc / hCurrc - 1.0 );
436 kappaRefC += -R / aux;
439 OOFEM_ERROR(
"compression objectivity iteration internal error - no convergence");
446 int indmin = 1, indmax = 1;
448 FloatArray principalStrains, crackPlaneNormal(3);
452 if ( ( kappa > this->
e0 ) && ( status->
giveDamage() == 0. ) ) {
457 crackPlaneNormal.
zero();
458 crackPlaneNormal.
at(1) = 1.0;
467 principalDir.
resize(2, 2);
472 if ( principalStrains.
at(1) > principalStrains.
at(2) ) {
481 for (
int i = 2; i <= 3; i++ ) {
482 if ( principalStrains.
at(i) > principalStrains.
at(indmax) ) {
486 if ( principalStrains.
at(i) < principalStrains.
at(indmin) ) {
492 for (
int i = 1; i <= principalStrains.
giveSize(); i++ ) {
493 crackPlaneNormal.
at(i) = principalDir.
at(i, indmax);
500 for (
int i = 1; i <= principalStrains.
giveSize(); i++ ) {
501 crackPlaneNormal.
at(i) = principalDir.
at(i, indmin);
enum oofem::IsotropicDamageMaterial::loaUnloCriterium llcriteria
MazarsMaterial(int n, Domain *d)
Constructor.
double giveDamage()
Returns the last equilibrated damage level.
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
double giveLec()
Returns characteristic length stored in receiver.
For computing principal strains from engineering strains.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
double beta
Beta coefficient reducing the effect of shear; default val = 1.06.
#define _IFT_MazarsMaterial_hreft
#define _IFT_MazarsMaterial_ac
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
#define _IFT_MazarsMaterial_bt
double & at(int i)
Coefficient access function.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
#define _IFT_MazarsMaterial_beta
static MMAContainingElementProjection mapper
Mapper used to map internal variables in adaptivity.
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
void setLe(double ls)
Sets characteristic length to given value.
double lec
Characteristic element length for compression, fixed as square from element size (for 2d)...
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Element * giveElement()
Returns corresponding element to receiver.
double computeGc(double kappa, GaussPoint *gp)
This class implements associated Material Status to IsotropicDamageMaterial1.
static void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir, const FloatArray &s, stressStrainPrincMode mode)
Computes principal values and directions of stress or strain vector.
virtual int read(int *data, int count)=0
Reads count integer values into array pointed by data.
double ef
Determines ductility -> corresponds to fracturing strain.
double computeGt(double kappa, GaussPoint *gp)
double hReft
Reference elem-length for objectivity.
virtual void computeEquivalentStrain(double &kappa, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)
Computes the equivalent strain measure from given strain vector (full form).
#define _MAZARS_MODEL_ITER_TOL
static void giveFullSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the reduced unsymmetric Voigt vector (2nd order tensor) to full form.
EquivStrainType equivStrainType
Parameter specifying the definition of equivalent strain.
virtual int write(const int *data, int count)=0
Writes count integer values from array pointed by data.
double giveLe()
Returns characteristic length stored in receiver.
#define _IFT_IsotropicLinearElasticMaterial_n
double E
Elastic parameters.
#define _IFT_MazarsMaterial_version
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
#define _IFT_IsotropicLinearElasticMaterial_e
virtual void computeDamageParam(double &omega, double kappa, const FloatArray &strain, GaussPoint *gp)
Computes the value of damage parameter omega, based on given value of equivalent strain.
bool isEmpty() const
Returns true if receiver is empty.
double at(int i, int j) const
Coefficient access function.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
#define _IFT_MazarsMaterial_at
virtual ~MazarsMaterial()
Destructor.
Class representing vector of real numbers.
Implementation of matrix containing floating point numbers.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
double At
Model parameters related to the shape of uniaxial stress-strain diagrams.
IRResultType
Type defining the return values of InputRecord reading operations.
virtual void initDamaged(double kappa, FloatArray &totalStrainVector, GaussPoint *gp)
Perfoms initialization, when damage first appear.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
double e0
Equivalent strain at stress peak (or a similar parameter).
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
void zero()
Zeroes all coefficients of receiver.
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
Returns the size of element in the given direction, in some cases adjusted (e.g.
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
This class implements a simple local isotropic damage model for concrete in tension.
#define _IFT_MazarsMaterial_ef
virtual IRResultType initializeFrom(InputRecord *ir)
#define _IFT_MazarsMaterial_e0
REGISTER_Material(DummyMaterial)
void setLec(double ls)
Sets characteristic length to given value.
#define _MAZARS_MODEL_MAX_ITER
#define _IFT_MazarsMaterial_hrefc
MazarsMaterialStatus(int n, Domain *d, GaussPoint *g)
Constructor.
int giveSize() const
Returns the size of receiver.
This class implements associated Material Status to MazarsMaterial.
the oofem namespace is to define a context or scope in which all oofem names are defined.
#define _IFT_MazarsMaterial_bc
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
void beInverseOf(const FloatMatrix &src)
Modifies receiver to become inverse of given parameter.
void giveNormalBlockOfElasticCompliance(FloatMatrix &answer, GaussPoint *gp)
Class representing integration point in finite element program.
#define OOFEM_WARNING(...)
IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Class representing solution step.
enum oofem::MazarsMaterial::mazarsModelVariant modelVersion
LinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
void resize(int s)
Resizes receiver towards requested size.
int giveNumberOfSpatialDimensions(GaussPoint *gp)