54#ifdef IDM_USE_MMAClosestIPTransfer
58#ifdef IDM_USE_MMAContainingElementProjection
62#ifdef IDM_USE_MMAShapeFunctProjection
66#ifdef IDM_USE_MMALeastSquareProjection
78IsotropicDamageMaterial1 :: ~IsotropicDamageMaterial1()
88 int equivStrainTypeRecord;
89 IsotropicDamageMaterial :: initializeFrom(ir);
90 RandomMaterialExtensionInterface :: initializeFrom(ir);
97 equivStrainTypeRecord = 0;
99 if ( equivStrainTypeRecord == 0 ) {
101 }
else if ( equivStrainTypeRecord == 1 ) {
103 }
else if ( equivStrainTypeRecord == 2 ) {
105 }
else if ( equivStrainTypeRecord == 3 ) {
108 }
else if ( equivStrainTypeRecord == 4 ) {
110 }
else if ( equivStrainTypeRecord == 5 ) {
112 }
else if ( equivStrainTypeRecord == 6 ) {
114 }
else if ( equivStrainTypeRecord == 7 ) {
178 dumWf1 = 2. *
gf / (
e0 *
E );
182 sk = (
e0 *
E ) * ( 1 -
wk / dumWf1 );
200 if ( wk < 0.0 || wk >
wf ) {
203 if ( sk < 0.0 || sk >
e0 *
E ) {
212 if ( dummy < 0.0 || dummy > 1.0 ) {
219 if ( dummy < 0.0 || dummy > 1.0 ) {
230 if (
gf == 0.0 &&
gft != 0 ) {
231 OOFEM_WARNING(
"Bilinear softening: parameters defined as for Linear_Cohesive_Crack");
234 }
else if (
gft <
gf ) {
236 }
else if (
wk == 0.0 &&
wf != 0 ) {
237 OOFEM_WARNING(
"Bilinear softening: parameters defined as for Linear_Cohesive_Crack");
239 }
else if (
wf <
wk ) {
241 }
else if (
gf == 0 &&
sk == 0.0 ) {
242 OOFEM_WARNING(
"Bilinear softening: parameters defined as for Linear_Cohesive_Crack");
261 aux *= ( 6. - (
c2 *
c2 *
c2 + 3. *
c2 *
c2 + 6. *
c2 + 6. ) * exp(-
c2) );
262 aux += ( 1. - exp(-
c2) ) /
c2;
263 aux -= 0.5 * ( 1. +
c1 *
c1 *
c1 ) * exp(-
c2);
288 this->
md = 1. / log(
E * this->
ep / this->
ft);
347 this->
mapper.initializeFrom(ir);
356 this->
mapper.giveInputRecord(input);
357 IsotropicDamageMaterial :: giveInputRecord(input);
358 RandomMaterialExtensionInterface :: giveInputRecord(input);
376 if ( this->
wf != 0.0 ) {
378 }
else if ( this->
gf != 0.0 ) {
389 if ( this->
ek != 0.0 ) {
394 }
else if ( this->
wk != 0.0 ) {
445 StructuralMaterial :: giveFullSymVectorForm( fullStrain, strain, gp->
giveMaterialMode() );
448 double nu = lmat->give(
NYxz, gp);
449 fullStrain.
at(3) = -nu * ( fullStrain.
at(1) + fullStrain.
at(2) ) / ( 1. - nu );
451 double nu = lmat->give(
NYxz, gp);
452 fullStrain.
at(2) = -nu *fullStrain.
at(1);
453 fullStrain.
at(3) = -nu *fullStrain.
at(1);
457 double posNorm = 0.0;
462 for (
int i = 1; i <= 3; i++ ) {
463 if ( principalStrains.
at(i) > 0.0 ) {
464 posNorm += principalStrains.
at(i) * principalStrains.
at(i);
468 return sqrt(posNorm);
472 FloatArray stress, fullStress, principalStress;
475 lmat->giveStiffnessMatrix(de, SecantStiffness, gp, tStep);
477 StructuralMaterial :: giveFullSymVectorForm( fullStress, stress, gp->
giveMaterialMode() );
479 for (
int i = 1; i <= 3; i++ ) {
480 if ( principalStress.
at(i) > 0.0 ) {
482 sum += principalStress.
at(i) * principalStress.
at(i);
483 }
else if (
sum < principalStress.
at(i) ) {
484 sum = principalStress.
at(i);
486 }
else if (
sum < principalStress.
at(i) ) {
487 sum = principalStress.
at(i);
495 return sum / lmat->give(
'E', gp);
502 lmat->giveStiffnessMatrix(de, SecantStiffness, gp, tStep);
510 StructuralMaterial :: giveFullSymVectorForm( fullStress, stress, gp->
giveMaterialMode() );
514 OOFEM_ERROR(
"Elastic energy corresponding to positive part of stress not finished");
519 OOFEM_ERROR(
"Elastic energy corresponding to positive part of strain not finished");
522 return sqrt(
sum / lmat->give(
'E', gp) );
524 double nu = lmat->give(
NYxz, NULL);
531 a = (
k - 1 ) * I1e / ( 2 *
k * ( 1 - 2 * nu ) );
532 b = (
k - 1 ) * (
k - 1 ) * I1e * I1e / ( ( 1 - 2 * nu ) * ( 1 - 2 * nu ) );
533 c = 12 *
k * J2e / ( ( 1 + nu ) * ( 1 + nu ) );
534 return a + 1 / ( 2 *
k ) * sqrt(b + c);
536 double kappa1 = 0.0, kappa2 = 0.0;
537 FloatArray stress, fullStress, principalStress;
539 lmat->giveStiffnessMatrix(de, SecantStiffness, gp, tStep);
541 StructuralMaterial :: giveFullSymVectorForm( fullStress, stress, gp->
giveMaterialMode() );
543 double sum = 0., maxStress = 0.;
545 for (
int i = 1; i <= 3; i++ ) {
546 if ( principalStress.
at(i) > 0.0 &&
sum < principalStress.
at(i) ) {
547 sum = principalStress.
at(i);
550 kappa1 =
sum / lmat->give(
'E', gp);
553 maxStress =
max( fabs( principalStress.
at(1) ), fabs( principalStress.
at(3) ) );
554 if ( maxStress == 0. || fabs( principalStress.
at(3) ) < 1.e-6 * maxStress || fabs( principalStress.
at(1) + principalStress.
at(3) ) < 1.e-6 * maxStress ) {
556 }
else if ( principalStress.
at(1) / principalStress.
at(3) >= -0.33333 ) {
557 kappa2 = -( principalStress.
at(1) - principalStress.
at(3) ) * ( principalStress.
at(1) - principalStress.
at(3) ) / this->
griff_n / ( principalStress.
at(1) + principalStress.
at(3) ) / lmat->give(
'E', gp);
559 return max(
max(kappa1, 0.0), kappa2);
579 double posNorm = 0.0;
592 principalStrains.
at(2) = -nu *principalStrains.
at(1);
593 principalStrains.
at(3) = -nu *principalStrains.
at(1);
599 principalStrains.
at(3) = -nu * ( principalStrains.
at(1) + principalStrains.
at(2) ) / ( 1. - nu );
612 for (
int i = 1; i <= 3; i++ ) {
614 if ( principalStrains.
at(i) > 0.0 ) {
620 if ( principalStrains.
at(i) > 0.0 ) {
621 posNorm += principalStrains.
at(i) * principalStrains.
at(i);
627 double kappa = sqrt(posNorm);
629 int numberOfEl = ( dim * ( dim - 1 ) / 2 + dim );
630 answer.
resize(numberOfEl);
633 Eta.
times(1. / kappa);
640 answer.
at(1) = Eta.
at(1, 1);
641 answer.
at(2) = Eta.
at(2, 2);
642 answer.
at(3) = Eta.
at(3, 3);
643 answer.
at(4) = Eta.
at(2, 3);
644 answer.
at(5) = Eta.
at(1, 3);
645 answer.
at(6) = Eta.
at(1, 2);
647 answer.
at(1) = Eta.
at(1, 1);
649 answer.
at(1) = Eta.
at(1, 1);
650 answer.
at(2) = Eta.
at(2, 2);
651 answer.
at(3) = Eta.
at(1, 2);
654 answer.
at(1) = Eta.
at(1, 1);
655 answer.
at(2) = Eta.
at(2, 2);
656 answer.
at(3) = Eta.
at(3, 3);
657 answer.
at(4) = Eta.
at(1, 2);
660 int index = 0, dim = 0;
694 for (
int i = 1; i <= 3; i++ ) {
695 if ( principalStress.
at(i) > 0.0 ) {
697 sum += principalStress.
at(i) * principalStress.
at(i);
699 for (
int j = 1; j <= dim; j++ ) {
700 n.
at(j) =
N.at(j, i);
705 }
else if (
sum < principalStress.
at(i) ) {
706 sum = principalStress.
at(i);
709 }
else if (
sum < principalStress.
at(i) ) {
710 sum = principalStress.
at(i);
717 int numberOfEl = ( dim * ( dim - 1 ) / 2 + dim );
722 double kappa =
sum / lmat->
give(
'E', gp);
725 Eta.
times(1. / kappa);
731 Eta.
times( 1. / kappa / lmat->
give(
'E', gp) / lmat->
give(
'E', gp) );
733 for (
int i = 1; i <= dim; i++ ) {
734 n.
at(i) =
N.at(i, index);
742 eta.
at(1) = Eta.
at(1, 1);
743 eta.
at(2) = Eta.
at(2, 2);
744 eta.
at(3) = Eta.
at(3, 3);
745 eta.
at(4) = Eta.
at(2, 3);
746 eta.
at(5) = Eta.
at(1, 3);
747 eta.
at(6) = Eta.
at(1, 2);
749 eta.
at(1) = Eta.
at(1, 1);
751 eta.
at(1) = Eta.
at(1, 1);
752 eta.
at(2) = Eta.
at(2, 2);
753 eta.
at(3) = Eta.
at(1, 2);
756 eta.
at(1) = Eta.
at(1, 1);
757 eta.
at(2) = Eta.
at(2, 2);
758 eta.
at(3) = Eta.
at(3, 3);
759 eta.
at(4) = 2. * Eta.
at(1, 2);
773 double kappa = sqrt(
sum / lmat->
give(
'E', gp) );
776 answer.
times(1. / lmat->
give(
'E', gp) / kappa);
786IsotropicDamageMaterial1 :: computeStrainInvariants(
const FloatArray &strainVector,
double &I1e,
double &J2e)
788 I1e = strainVector.
at(1) + strainVector.
at(2) + strainVector.
at(3);
789 double s1 = strainVector.
at(1) * strainVector.
at(1);
790 double s2 = strainVector.
at(2) * strainVector.
at(2);
791 double s3 = strainVector.
at(3) * strainVector.
at(3);
792 J2e = 1. / 2. * (
s1 + s2 + s3 ) - 1. / 6. * ( I1e * I1e );
808IsotropicDamageMaterial1 :: computeDamageParamForCohesiveCrack(
double kappa,
GaussPoint *gp)
const
817 if ( this->gf != 0. ) {
819 wf = this->gf /
E /
e0;
833 double Le = status->
giveLe();
840 minGf =
E *
e0 *
e0 * Le;
842 minGf =
E *
e0 *
e0 * Le / 2.;
848 OOFEM_ERROR(
"Material number %d, decrease e0, or increase Gf from %f to Gf=%f", this->
giveNumber(),
gf, minGf);
859 omega = (
ef / kappa ) * ( kappa -
e0 ) / (
ef -
e0 );
865 double ef, sigmak, epsf,
ek;
870 epsf = 2 * (
gft -
gf ) / sigmak / Le +
ef;
873 OOFEM_ERROR(
"The total fracture energy gft %f must be greater than the initial fracture energy gf %f",
gft,
gf);
876 ek = this->
wk / Le + ( this->
sk ) /
E;
877 ef = ( this->
wk / (
e0 *
E - this->
sk ) * (
e0 *
E ) ) / Le;
879 epsf = this->wf / Le;
886 omega = 1.0 - ( (
e0 / kappa ) * (
ek - kappa ) / (
ek -
e0 ) + ( ( sigmak / (
E * kappa ) ) * ( kappa -
e0 ) / (
ek -
e0 ) ) );
887 }
else if ( kappa >
ek && kappa <= epsf ) {
888 omega = 1.0 - ( ( sigmak / (
E * kappa ) ) * ( epsf - kappa ) / ( epsf -
ek ) );
889 }
else if ( kappa <=
e0 ) {
904 help = omega * kappa /
ef;
905 R = ( 1. - omega ) * kappa -
e0 *exp(-help);
906 Lhs = kappa -
e0 *exp(-help) * kappa /
ef;
913 double eps_k = this->
w_k/Le + this->
f_k/
E;
914 double eps_r = this->
w_r/Le + this->
f_r/
E;
915 double eps_f = this->
w_f/Le ;
917 if ( kappa >
e0 && kappa <= eps_k ) {
918 double slope=((
f_k - f_t)/
w_k);
919 omega =
E/(
E+slope*Le) - (f_t)/(kappa*(
E+slope*Le));
920 }
else if ( kappa > eps_k && kappa <= eps_r ) {
922 omega =
E/(
E+slope*Le) +(1.0/kappa)*(
w_k*slope-
f_k)/(Le*slope+
E);
923 }
else if ( kappa > eps_r && kappa <= eps_f ) {
925 omega =
E/(
E+slope*Le) +(1.0/kappa)*(
w_r*slope-
f_r)/(Le*slope+
E);
930 OOFEM_ERROR(
"Unknown softening type for cohesive crack model.");
934 OOFEM_WARNING(
"damage parameter is %f, which is greater than 1, snap-back problems", omega);
942 OOFEM_WARNING(
"damage parameter is %f, which is smaller than 0, snap-back problems", omega);
954IsotropicDamageMaterial1 :: damageFunction(
double kappa,
GaussPoint *gp)
const
966 }
else if ( kappa <
ef ) {
967 return (
ef / kappa ) * ( kappa -
e0 ) / (
ef -
e0 );
975 return ( kappa -
e0 * exp( -( kappa -
e0 ) / (
ef -
e0 ) ) ) / ( kappa +
ps_alpha );
977 return 1.0 - (
e0 / kappa ) * exp( -( kappa -
e0 ) / (
ef -
e0 ) );
984 return 1.0 - ( 1. -
c2 ) * (
e0 / kappa ) * exp( -( kappa -
e0 ) / (
ef -
e0 ) ) -
c2 * (
e0 / kappa ) * exp( -( kappa -
e0 ) / (
e2 -
e0 ) );
991 return 1.0 - (
e0 / kappa ) * exp( -pow( ( kappa -
e0 ) / (
ef -
e0 ),
md ) );
998 return 1.0 - (
e0 / kappa ) * exp( -( pow(kappa,
md) - pow(
e0,
md) ) / ( pow(
ef,
md) - pow(
e0,
md) ) );
1004 return 1.0 - ( 1.0 -
At ) *
e0 / kappa -
At *exp( -
Bt * ( kappa -
e0 ) );
1007 return 1.0 - exp( -pow(kappa /
e0,
md) );
1011 if ( kappa <=
e1 ) {
1012 return 1.0 - exp( -pow(kappa /
e0,
md) );
1014 return 1.0 -
s1 *exp( -( kappa -
e1 ) / (
ef * ( 1. + pow( ( kappa -
e1 ) /
e2,
nd ) ) ) ) / kappa;
1024IsotropicDamageMaterial1 :: damageFunctionPrime(
double kappa,
GaussPoint *gp)
const
1030 const double Le = status->
giveLe();
1039 if ( kappa <=
e0 ) {
1041 }
else if ( kappa <
ef ) {
1042 return (
ef *
e0 ) / (
ef -
e0 ) / ( kappa * kappa );
1051 return (
e0 / (
ef -
e0 ) / kappa +
e0 / ( kappa * kappa ) ) * exp( -( kappa -
e0 ) / (
ef -
e0 ) );
1058 return ( 1.0 -
At ) *
e0 / kappa / kappa -
At *
Bt *exp( -
Bt * ( kappa -
e0 ) );
1062 return md /
e0 *pow(kappa,
md - 1.) * exp( -pow(kappa /
e0,
md) );
1069 }
else if ( kappa <=
e1 ) {
1070 return exp( -pow(kappa /
e0,
md) ) *
md / pow(
e0,
md) * pow(kappa,
md - 1.);
1072 double a = ( (
ef * ( 1. + pow( ( kappa -
e1 ) /
e2,
nd ) ) ) -
ef *
nd * pow( ( kappa -
e1 ) /
e2,
nd ) ) / (
ef * ( 1. + pow( ( kappa -
e1 ) /
e2,
nd ) ) ) / (
ef * ( 1. + pow( ( kappa -
e1 ) /
e2,
nd ) ) );
1073 double answer =
s1 * exp( -( kappa -
e1 ) / (
ef * ( 1. + pow( ( kappa -
e1 ) /
e2,
nd ) ) ) ) / kappa / kappa +
s1 *exp( -( kappa -
e1 ) / (
ef * ( 1. + pow( ( kappa -
e1 ) /
e2,
nd ) ) ) ) / kappa * a;
1080 if ( kappa <=
e0 ) {
1082 }
else if ( kappa <
wf / Le ) {
1083 return (
e0 / ( kappa * kappa ) / ( 1. - Le *
e0 /
wf ) );
1093 double help = exp(omega * kappa /
ef);
1094 double ret = -( ( omega *
ef -
ef ) * help - omega *
e0 ) / (
ef * kappa * help -
e0 * kappa );
1095 if ( std :: isnan(ret) ) {
1105 double Le = status->
giveLe();
1107 double eps_k = this->
w_k/Le + this->
f_k/
E;
1108 double eps_r = this->
w_r/Le + this->
f_r/
E;
1109 double eps_f = this->
w_f/Le ;
1111 if ( kappa <=
e0 ) {
1113 }
else if ( kappa >
e0 && kappa <= eps_k ) {
1114 double slope=((
f_k - f_t)/
w_k);
1115 return (f_t)/(
E+slope*Le)*(1.0/(kappa*kappa));
1116 }
else if ( kappa > eps_k && kappa <= eps_r ) {
1118 return -(
w_k*slope-
f_k)/(Le*slope+
E)*(1.0/(kappa*kappa));
1119 }
else if ( kappa > eps_r && kappa <= eps_f ) {
1121 return -(
w_r*slope-
f_r)/(Le*slope+
E)*(1.0/(kappa*kappa));
1134IsotropicDamageMaterial1 :: complianceFunction(
double kappa,
GaussPoint *gp)
const
1137 return om / ( 1. - om );
1141IsotropicDamageMaterial1 :: evaluatePermanentStrain(
double kappa,
double omega)
const
1157 return ps_alpha * omega / ( 1. - omega );
1174 FloatArray principalStrains, crackPlaneNormal, fullStrain, crackVect;
1201 StructuralMaterial :: giveFullSymVectorForm( fullStrain, strainVector, gp->
giveMaterialMode() );
1204 if ( ( kappa >
e0 ) && ( ( status->giveDamage() == 0. ) || ( status->giveLe() == 0.0 ) ) ) {
1208 for (
int i = 2; i <= 3; i++ ) {
1209 if ( principalStrains.
at(i) > principalStrains.
at(indx) ) {
1214 crackPlaneNormal.
beColumnOf(principalDir, indx);
1218 for (
int i = 2; i <= 3; i++ ) {
1219 if ( principalStrains.
at(i) < principalStrains.
at(indx) && fabs( principalStrains.
at(i) ) > 1.e-10 ) {
1226 FloatArray stress, fullStress, principalStress, crackV(3);
1231 StructuralMaterial :: giveFullSymVectorForm( fullStress, stress, gp->
giveMaterialMode() );
1233 if ( principalStress.
at(1) <= 1.e-10 && principalStress.
at(2) <= 1.e-10 && principalStress.
at(3) <= 1.e-10 ) {
1237 if ( indexMin + indexMax == 3 ) {
1239 }
else if ( indexMin + indexMax == 4 ) {
1241 }
else if ( indexMin + indexMax == 5 ) {
1246 double twoPsi = ( principalStress.
at(indexMin) - principalStress.
at(indexMax) ) / 2. / ( principalStress.
at(indexMax) + principalStress.
at(indexMin) );
1247 double psi = acos(twoPsi) / 2.;
1248 for (
int i = 1; i <= 3; i++ ) {
1249 crackV.
at(i) = principalDir.
at(i, indexMin);
1255 FloatMatrix ux(3, 3), dyadU(3, 3), unitMtrx(3, 3), rotMtrx(3, 3);
1258 ux.at(1, 2) = -principalDir.
at(3, indexMid);
1259 ux.at(1, 3) = principalDir.
at(2, indexMid);
1260 ux.at(2, 1) = principalDir.
at(3, indexMid);
1261 ux.at(2, 3) = -principalDir.
at(1, indexMid);
1262 ux.at(3, 1) = -principalDir.
at(2, indexMid);
1263 ux.at(3, 2) = principalDir.
at(1, indexMid);
1264 u.
at(1) = principalDir.
at(1, indexMid);
1265 u.
at(2) = principalDir.
at(2, indexMid);
1266 u.
at(3) = principalDir.
at(3, indexMid);
1267 dyadU.beDyadicProductOf(u, u);
1268 unitMtrx.beUnitMatrix();
1269 unitMtrx.times( cos(psi) );
1270 ux.times( sin(psi) );
1271 dyadU.times( 1. - cos(psi) );
1273 rotMtrx.
add(unitMtrx);
1277 for (
int i = 1; i <= 3; i++ ) {
1278 principalDir.
at(i, indx) = crackV.
at(i);
1288 status->setCrackVector(crackVect);
1297 double ca =
M_PI / 2.;
1298 if ( crackPlaneNormal.
at(1) != 0.0 ) {
1299 ca = atan( crackPlaneNormal.
at(2) / crackPlaneNormal.
at(1) );
1302 status->setCrackAngle(ca);
1304 if ( this->gf != 0. &&
e0 >= (
wf / le ) ) {
1309 }
else if (
wf == 0. &&
e0 >=
ef ) {
1310 OOFEM_WARNING(
"Fracturing strain ef=%e is lower than the elastic strain e0=%f, possible snap-back. Increase fracturing strain to %f. Element number %d",
ef,
e0,
e0, gp->
giveElement()->
giveLabel() );
1314 }
else if (
ef == 0. &&
e0 * le >=
wf ) {
1315 OOFEM_WARNING(
"Crack opening at zero stress wf=%f is lower than the elastic displacement w0=%f, possible snap-back. Increase crack opening wf to %f. Element number %d",
wf,
e0 * le,
e0 * le, gp->
giveElement()->
giveLabel() );
1324IsotropicDamageMaterial1 :: give(
int aProperty,
GaussPoint *gp)
const
1329 }
else if ( aProperty ==
e0_ID ) {
1331 }
else if ( aProperty ==
ef_ID ) {
1333 }
else if ( aProperty ==
ek_ID ) {
1335 }
else if ( aProperty ==
gf_ID ) {
1337 }
else if ( aProperty ==
wf_ID ) {
1339 }
else if ( aProperty ==
gft_ID ) {
1342 return IsotropicDamageMaterial :: give(aProperty, gp);
1376 if ( !stream.
read(input) ) {
1385std::unique_ptr<MaterialStatus>
1388 return std::make_unique<IsotropicDamageMaterial1Status>(gp);
1411 toMap.
at(1) = ( int ) IST_MaxEquivalentStrainLevel;
1412 toMap.
at(2) = ( int ) IST_DamageTensor;
1413 toMap.
at(3) = ( int ) IST_StrainTensor;
1432 result =
mapper.mapVariable(intVal, gp, IST_MaxEquivalentStrainLevel, tStep);
1437 result =
mapper.mapVariable(intVal, gp, IST_DamageTensor, tStep);
1442#ifdef IDM_USE_MAPPEDSTRAIN
1443 result =
mapper.mapVariable(intVal, gp, IST_StrainTensor, tStep);
1472#ifdef IDM_USE_MAPPEDSTRAIN
1487 this->
mapper.finish(tStep);
1492IsotropicDamageMaterial1Status :: IsotropicDamageMaterial1Status(
GaussPoint *g) :
#define REGISTER_Material(class)
virtual Material * giveMaterial(IntegrationPoint *ip) const =0
hidden by virtual oofem::Material* TransportCrossSection::giveMaterial() const
virtual int read(int *data, std::size_t count)=0
Reads count integer values into array pointed by data.
virtual int write(const int *data, std::size_t count)=0
Writes count integer values from array pointed by data.
int giveNumberOfElements() const
Returns number of elements in domain.
Element * giveElement(int n)
int giveGlobalNumber() const
virtual double giveCharacteristicSize(GaussPoint *gp, FloatArray &normalToCrackPlane, ElementCharSizeMethod method)
CrossSection * giveCrossSection()
Domain * domain
Link to domain object, useful for communicating with other FEM components.
double dotProduct(const FloatArray &x) const
Index giveSize() const
Returns the size of receiver.
void resizeWithValues(Index s, std::size_t allocChunk=0)
void beColumnOf(const FloatMatrix &mat, int col)
void zero()
Zeroes all coefficients of receiver.
void rotatedWith(FloatMatrix &r, char mode)
int giveIndexMinElem(void)
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
bool isEmpty() const
Returns true if receiver is empty.
int giveIndexMaxElem(void)
void add(const FloatMatrix &a)
void resize(Index rows, Index cols)
void zero()
Zeroes all coefficient of receiver.
void beDyadicProductOf(const FloatArray &vec1, const FloatArray &vec2)
void plusDyadSymmUpper(const FloatArray &a, double dV)
double at(std::size_t i, std::size_t j) const
bool hasMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default) const
IntegrationPointStatus * setMaterialStatus(std::unique_ptr< IntegrationPointStatus > ptr, IntegrationPointStatusIDType key=IPSID_Default)
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
void updateYourself(TimeStep *tStep)
IntegrationPointStatus * giveMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default)
Element * giveElement()
Returns corresponding element to receiver.
void followedBy(const IntArray &b, int allocChunk=0)
SofteningType softType
Parameter specifying the type of softening (damage law).
double e0
Equivalent strain at stress peak (or a similar parameter).
double wf
Determines ductility -> corresponds to crack opening in the cohesive crack model.
static MMAContainingElementProjection mapper
Mapper used to map internal variables in adaptivity.
double md
Parameter used in "smooth damage law".
double ek
Determines the softening for the bilinear law -> corresponds to the strain at the knee point.
void initializeFrom(InputRecord &ir) override
void saveContext(DataStream &stream, ContextMode mode) override
double griff_n
Parameter used in Griffith's criterion.
double wk
Determines the softening for the bilinear law -> corresponds to the crack opening at the knee point.
void giveInputRecord(DynamicInputRecord &input) override
double ps_alpha
Parameters used by the model with permanent strain.
double k
Parameter used in Mises definition of equivalent strain.
MaterialStatus * giveStatus(GaussPoint *gp) const override
static void computeStrainInvariants(const FloatArray &strainVector, double &I1e, double &J2e)
bool isCrackBandApproachUsed() const
EquivStrainType equivStrainType
Parameter specifying the definition of equivalent strain.
double computeDamageParamForCohesiveCrack(double kappa, GaussPoint *gp) const
std::unique_ptr< MaterialStatus > CreateStatus(GaussPoint *gp) const override
ElementCharSizeMethod ecsMethod
Method used for evaluation of characteristic element size.
@ EST_ElasticEnergyPositiveStrain
@ EST_ElasticEnergyPositiveStress
Set * sourceElemSet
Cached source element set used to map internal variables (adaptivity), created on demand.
double c1
Parameters used in Hordijk's softening law.
double sk
Determines the softening for the bilinear law -> corresponds to the stress at the knee point.
double w_k
Parameters used in Trilinear_Cohesive_Crack softening law.
void restoreContext(DataStream &stream, ContextMode mode) override
double At
Parameters used in Mazars damage law.
double ef
Determines ductility -> corresponds to fracturing strain.
double give(int aProperty, GaussPoint *gp) const override
int damageLaw
Temporary parameter reading type of softening law, used in other isotropic damage material models.
double damageFunction(double kappa, GaussPoint *gp) const
double gft
Determines the softening for the bilinear law -> corresponds to the total fracture energy.
int checkSnapBack
Check possible snap back flag.
double e1
Parameters used if softType = 7 (extended smooth damage law).
double ep
auxiliary input variablesfor softType == ST_SmoothExtended
@ ST_BiLinear_Cohesive_Crack
@ ST_Exponential_Cohesive_Crack
@ ST_Linear_Cohesive_Crack
@ ST_Hordijk_Cohesive_Crack
@ ST_Trilinear_Cohesive_Crack
IsotropicDamageMaterialStatus(GaussPoint *g)
Constructor.
void updateYourself(TimeStep *tStep) override
void setTempKappa(double newKappa)
Sets the temp scalar measure of the largest strain level to given value.
double giveLe() const
Returns characteristic length stored in receiver.
double giveTempDamage() const
Returns the temp. damage level.
void setTempDamage(double newDamage)
Sets the temp damage level to given value.
double maxOmega
Maximum limit on omega. The purpose is elimination of a too compliant material which may cause conver...
LinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
int permStrain
Indicator of the type of permanent strain formulation (0 = standard damage with no permanent strain).
IsotropicDamageMaterial(int n, Domain *d)
Constructor.
void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const override
MaterialModelMapperInterface()
Constructor.
virtual double give(int aProperty, GaussPoint *gp) const
RandomMaterialExtensionInterface()
Constructor.
void _generateStatusVariables(GaussPoint *) const
RandomMaterialStatusExtensionInterface()
void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir) const override
void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir) const override
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
static void giveReducedSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full unsymmetric Voigt vector (2nd order tensor) to reduced form.
virtual void giveStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
static void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir, const FloatArray &s, stressStrainPrincMode mode)
#define OOFEM_WARNING(...)
#define _IFT_IsotropicDamageMaterial1_nd
#define _IFT_IsotropicDamageMaterial1_wkwf
#define _IFT_IsotropicDamageMaterial1_w_f
#define _IFT_IsotropicDamageMaterial1_k
#define _IFT_IsotropicDamageMaterial1_gft
#define _IFT_IsotropicDamageMaterial1_ek
#define _IFT_IsotropicDamageMaterial1_c1
#define IDM1_ITERATION_LIMIT
#define _IFT_IsotropicDamageMaterial1_gf
#define _IFT_IsotropicDamageMaterial1_Bt
#define _IFT_IsotropicDamageMaterial1_wk
#define _IFT_IsotropicDamageMaterial1_f_k
#define _IFT_IsotropicDamageMaterial1_n
#define _IFT_IsotropicDamageMaterial1_md
#define _IFT_IsotropicDamageMaterial1_w_r
#define _IFT_IsotropicDamageMaterial1_e0
#define _IFT_IsotropicDamageMaterial1_equivstraintype
#define _IFT_IsotropicDamageMaterial1_ecsm
#define _IFT_IsotropicDamageMaterial1_sk
#define _IFT_IsotropicDamageMaterial1_ep
#define _IFT_IsotropicDamageMaterial1_ef
#define _IFT_IsotropicDamageMaterial1_e2
#define _IFT_IsotropicDamageMaterial1_wf
#define _IFT_IsotropicDamageMaterial1_skft
#define _IFT_IsotropicDamageMaterial1_w_k
#define _IFT_IsotropicDamageMaterial1_e1
#define _IFT_IsotropicDamageMaterial1_c2
#define _IFT_IsotropicDamageMaterial1_ft
#define _IFT_IsotropicDamageMaterial1_alphaps
#define _IFT_IsotropicDamageMaterial1_f_r
#define _IFT_IsotropicDamageMaterial1_At
#define _IFT_IsotropicDamageMaterial1_damageLaw
#define _IFT_IsotropicDamageMaterial1_checkSnapBack
#define _IFT_IsotropicLinearElasticMaterial_e
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ principal_strain
For computing principal strains from engineering strains.
@ principal_stress
For computing principal stresses.
double sum(const FloatArray &x)
@ RandomMaterialStatusExtensionInterfaceType
@ MaterialModelMapperInterfaceType
@ ECSM_ProjectionCentered
@ CIO_IOERR
General IO error.