58Masonry02 :: hasMaterialModeCapability(MaterialMode mode)
const
63 return mode == _2dInterface;
69 MPlasticMaterial2 :: initializeFrom(ir);
104 const FloatArray &strainSpaceHardeningVariables)
const
109 double k1 = strainSpaceHardeningVariables.
at(1);
111 double ft = this->
ft0 * exp( ( -1.0 ) * this->
ft0 * k1 / this->
gfI );
112 return stressVector.
at(1) - ft;
113 }
else if ( isurf == 2 ) {
115 double k2 = strainSpaceHardeningVariables.
at(2);
118 double c = this->
c0 * exp( ( -1.0 ) * this->
c0 * k2 / this->
gfII );
122 return fabs( stressVector.
at(2) ) + stressVector.
at(1) * tanfi - c;
136 }
else if ( isurf == 3 ) {
137 double s1 = stressVector.
at(1);
138 double s2 = stressVector.
at(2);
140 return this->
Cnn * s1 * s1 + this->
Css * s2 * s2 + this->
Cn * s1 - st * st;
148 const FloatArray &strainSpaceHardeningVariables)
const
155 }
else if ( isurf == 2 ) {
158 double k2 = strainSpaceHardeningVariables.
at(2);
159 double c = this->
c0 * exp( ( -1.0 ) * this->
c0 * k2 / this->
gfII );
163 double ny =
sgn( stressVector.
at(2) );
172 answer.
at(2) =
sgn( stressVector.
at(2) );
188 }
else if ( isurf == 3 ) {
189 answer.
at(1) = 2.0 *this->
Cnn *stressVector.
at(1) + this->
Cn;
190 answer.
at(2) = 2.0 *this->
Css *stressVector.
at(2);
204 double help = this->
gfI * this->
c0 / ( this->
gfII * this->
ft0 );
209 if ( activeConditionMap.
at(1) && activeConditionMap.
at(2) ) {
210 if ( ( dlambda.
at(1) > 0. ) && ( dlambda.
at(2) > 0. ) ) {
211 answer.
at(1) = sqrt( dlambda.
at(1) * dlambda.
at(1) + ( help * dlambda.
at(2) ) * ( help * dlambda.
at(2) ) );
212 answer.
at(2) = sqrt( ( dlambda.
at(1) / help ) * ( dlambda.
at(1) / help ) + dlambda.
at(2) * dlambda.
at(2) );
213 }
else if ( dlambda.
at(1) > 0. ) {
214 answer.
at(1) = dlambda.
at(1);
215 answer.
at(2) = dlambda.
at(1) / help;
216 }
else if ( dlambda.
at(2) > 0. ) {
217 answer.
at(1) = help * dlambda.
at(2);
218 answer.
at(2) = dlambda.
at(2);
220 }
else if ( activeConditionMap.
at(1) ) {
221 if ( dlambda.
at(1) > 0. ) {
222 answer.
at(1) = dlambda.
at(1);
223 answer.
at(2) = dlambda.
at(1) / help;
226 if ( dlambda.
at(2) > 0. ) {
227 answer.
at(1) = help * dlambda.
at(2);
228 answer.
at(2) = dlambda.
at(2);
232 double p1 = 2.0 *this->
Cnn *stress.
at(1) + this->
Cn;
233 double p2 = 2.0 *this->
Css *stress.
at(2);
235 if ( dlambda.
at(3) > 0. ) {
236 answer.
at(3) = dlambda.
at(3) * sqrt(p1 * p1 + p2 * p2);
264 answer.
resize(3, actSurf);
267 double help = this->
gfI * this->
c0 / ( this->
gfII * this->
ft0 );
268 double k1 = sqrt( dlambda.
at(1) * dlambda.
at(1) +
269 ( help * dlambda.
at(2) ) * ( help * dlambda.
at(2) ) );
270 double k2 = sqrt( ( dlambda.
at(1) / help ) * ( dlambda.
at(1) / help ) +
271 dlambda.
at(2) * dlambda.
at(2) );
273 double p1 = 2.0 *this->
Cnn *fullStressVector.
at(1) + this->
Cn;
274 double p2 = 2.0 *this->
Css *fullStressVector.
at(2);
276 if ( ( indx = activeConditionMap.
at(1) ) ) {
277 if ( dlambda.
at(1) > 0. ) {
278 if ( activeConditionMap.
at(2) ) {
280 double dl1 = dlambda.
at(1);
281 answer.
at(1, indx) = dl1 / k1;
282 answer.
at(2, indx) = dl1 / k2 / help / help;
285 answer.
at(1, indx) = 0.;
286 answer.
at(2, indx) = 0.;
290 answer.
at(1, indx) = 1.;
291 answer.
at(2, indx) = 0.0;
301 if ( ( indx = activeConditionMap.
at(2) ) ) {
302 if ( dlambda.
at(2) > 0. ) {
303 if ( activeConditionMap.
at(1) ) {
305 double dl2 = dlambda.
at(2);
306 answer.
at(1, indx) = help * help * dl2 / k1;
307 answer.
at(2, indx) = dl2 / k2;
310 answer.
at(1, indx) = 0.;
311 answer.
at(2, indx) = 0.;
315 answer.
at(1, indx) = 0.0;
317 answer.
at(2, indx) = 1.0;
322 if ( ( indx = activeConditionMap.
at(3) ) ) {
323 if ( dlambda.
at(3) < 0. ) {
324 answer.
at(3, indx) = 0.0;
326 answer.
at(3, indx) = sqrt(p1 * p1 + p2 * p2);
336 const FloatArray &strainSpaceHardeningVariables)
const
341 answer.
at(1) = ( -1.0 ) * this->
ft0 * exp( ( -1.0 ) * this->
ft0 * strainSpaceHardeningVariables.
at(1) / this->gfI ) * ( -1.0 ) * this->
ft0 / this->
gfI;
344 }
else if ( isurf == 2 ) {
347 double k2 = strainSpaceHardeningVariables.
at(2);
348 double c = this->
c0 * exp( ( -1.0 ) * this->
c0 * k2 / this->
gfII );
355 answer.
at(2) = ( -1.0 ) * ( stressVector.
at(1) * (
tanfir -
tanfi0 ) /
c0 + 1.0 ) * c * ( -1.0 ) * this->
c0 / this->
gfII;
358 double k2 = strainSpaceHardeningVariables.
at(2);
359 double c = this->
c0 * exp( ( -1.0 ) * this->
c0 * k2 / this->
gfII );
362 answer.
at(2) = ( -1.0 ) * c * ( -1.0 ) * this->
c0 / this->
gfII;
378 }
else if ( isurf == 3 ) {
384 answer.
at(3) = -2.0 * st * gt;
398 double p1 = 2.0 *this->
Cnn *fullStressVector.
at(1) + this->
Cn;
399 double p2 = 2.0 *this->
Css *fullStressVector.
at(2);
401 if ( activeConditionMap.
at(3) ) {
402 if ( dlambda.
at(3) >= 0. ) {
403 double c = 0.5 * dlambda.
at(3) / sqrt(p1 * p1 + p2 * p2);
404 answer.
at(3, 1) = 4.0 * c * this->
Cnn * p1;
405 answer.
at(3, 2) = 4.0 * c * this->
Css * p2;
414 const FloatArray &strainSpaceHardeningVariables)
const
417 gradientMatrix.
resize(2, 2);
418 gradientMatrix.
zero();
421 gradientMatrix.
at(1, 1) = 2.0 * this->
Cnn;
422 gradientMatrix.
at(2, 2) = 2.0 * this->
Css;
428 const FloatArray &strainSpaceHardeningVariables)
const
431 gradientMatrix.
resize(2, 3);
432 gradientMatrix.
zero();
438 double k2 = strainSpaceHardeningVariables.
at(2);
439 double c = this->
c0 * exp( ( -1.0 ) * this->
c0 * k2 / this->
gfII );
462std::unique_ptr<MaterialStatus>
482 MatResponseMode rMode,
488 MaterialMode mMode = gp->giveMaterialMode();
494 MPlasticMaterial2 :: giveStiffnessMatrix(answer, rMode, gp, tStep);
500Masonry02 :: give2dInterfaceMaterialStiffnessMatrix(
FloatMatrix &answer, MatResponseMode mode,
503 if ( mode == TangentStiffness ) {
521 if ( mode == _2dInterface ) {
523 answer.
at(1, 1) =
kn;
524 answer.
at(2, 2) =
ks;
525 answer.
at(1, 2) = answer.
at(2, 1) = 0.0;
543Masonry02 :: computeF3HardeningLaw(
double k)
const
547 if ( ( k > 0. ) && ( k <
kp ) ) {
550 }
else if ( ( k >=
kp ) && ( k <
km ) ) {
551 double h = ( k -
kp ) / (
km -
kp );
553 }
else if ( k >=
km ) {
556 }
else if ( k <= 0. ) {
561 if ( ( k >= 0. ) && ( k <
kp ) ) {
564 }
else if ( ( k >=
kp ) && ( k <
km ) ) {
565 double h = ( k -
kp ) / (
km -
kp );
567 }
else if ( k >=
km ) {
570 }
else if ( k < 0. ) {
572 return max(
sic + grad * k, 0.);
573 }
else if ( ( k < 0. ) && ( k > -
kp ) ) {
577 }
else if ( k <= -
kp ) {
586Masonry02 :: computeF3HardeningGradient(
double k)
const
591 }
else if ( k == 0. ) {
593 }
else if ( k <
km ) {
611 }
else if ( ( k >= 0. ) && ( k <
kp ) ) {
614 }
else if ( ( k >=
kp ) && ( k <
km ) ) {
615 double h = ( k -
kp ) / (
km -
kp );
617 }
else if ( k >=
km ) {
619 double result = (
smc -
src ) * exp( m * ( k -
km ) / ( (
smc -
src ) ) ) * m / ( (
smc -
src ) );
633 if ( (
sic + grad * k ) <= 0. ) {
638 }
else if ( ( k >= 0. ) && ( k <
kp ) ) {
641 }
else if ( ( k >=
kp ) && ( k <
km ) ) {
642 double h = ( k -
kp ) / (
km -
kp );
644 }
else if ( k >=
km ) {
647 }
else if ( ( k < 0. ) && ( k > -
kp ) ) {
651 }
else if ( k <= -
kp ) {
#define REGISTER_Material(class)
void zero()
Zeroes all coefficients of receiver.
void resize(Index rows, Index cols)
void zero()
Zeroes all coefficient of receiver.
double at(std::size_t i, std::size_t j) const
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
enum oofem::MPlasticMaterial2::ReturnMappingAlgoType rmType
LinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
functType
Type that allows to distinguish between yield function and loading function.
MPlasticMaterial2(int n, Domain *d)
enum oofem::MPlasticMaterial2::plastType plType
int nsurf
Number of yield surfaces.
virtual FloatMatrix giveElastoPlasticStiffnessMatrix(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
virtual FloatMatrix giveConsistentStiffnessMatrix(MatResponseMode, GaussPoint *gp, TimeStep *tStep) const
double computeF3HardeningLaw(double k) const
Cap mode related functions.
double kn
Elastic properties.
double computeF3HardeningGradient(double k) const
double Cnn
Cap mode parameters.
double tanfi0
Initial friction angle.
double tanpsi
Dilatancy angle.
int giveSizeOfReducedHardeningVarsVector(GaussPoint *) const override
void computeReducedElasticModuli(FloatMatrix &answer, GaussPoint *gp, TimeStep *tStep) const override
double tanfir
Residual friction angle.
double ft0
Tensile strength.
double c0
Initial cohesion of joint.
double sic
Cap mode parameters.
void give2dInterfaceMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) const
#define _IFT_Masonry02_sm
#define _IFT_Masonry02_ft0
#define _IFT_Masonry02_kp
#define _IFT_Masonry02_cnn
#define _IFT_Masonry02_tanfi0
#define _IFT_Masonry02_gfi
#define _IFT_Masonry02_tanfir
#define _IFT_Masonry02_kn
#define _IFT_Masonry02_cplane
#define _IFT_Masonry02_si
#define _IFT_Masonry02_cn
#define _IFT_Masonry02_ks
#define _IFT_Masonry02_sr
#define _IFT_Masonry02_css
#define _IFT_Masonry02_sp
#define _IFT_Masonry02_c0
#define _IFT_Masonry02_gfii
#define _IFT_Masonry02_tanpsi
#define _IFT_Masonry02_kr
#define _IFT_Masonry02_km
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
double sgn(double i)
Returns the signum of given value (if value is < 0 returns -1, otherwise returns 1).