54 #ifdef IDM_USE_MMAClosestIPTransfer 58 #ifdef IDM_USE_MMAContainingElementProjection 62 #ifdef IDM_USE_MMAShapeFunctProjection 66 #ifdef IDM_USE_MMALeastSquareProjection 116 int equivStrainTypeRecord;
136 equivStrainTypeRecord = 0;
138 if ( equivStrainTypeRecord == 0 ) {
140 }
else if ( equivStrainTypeRecord == 1 ) {
142 }
else if ( equivStrainTypeRecord == 2 ) {
144 }
else if ( equivStrainTypeRecord == 3 ) {
147 }
else if ( equivStrainTypeRecord == 4 ) {
149 }
else if ( equivStrainTypeRecord == 5 ) {
151 }
else if ( equivStrainTypeRecord == 6 ) {
153 }
else if ( equivStrainTypeRecord == 7 ) {
218 dumWf1 = 2. *
gf / (
e0 *
E );
220 OOFEM_WARNING(
"Bilinear softening: wk is larger then gf allows");
223 sk = (
e0 *
E ) * ( 1 -
wk / dumWf1 );
241 if ( wk < 0.0 || wk >
wf ) {
242 OOFEM_WARNING(
"Bilinear softening: wk must be in interval <0;wf>");
245 if ( sk < 0.0 || sk >
e0 * E ) {
246 OOFEM_WARNING(
"Bilinear softening: sk must be in interval <0;ft>");
255 if ( dummy < 0.0 || dummy > 1.0 ) {
256 OOFEM_WARNING(
"Bilinear softening: wk/wf ratio (wkwf) must be in interval <0;1>");
263 if ( dummy < 0.0 || dummy > 1.0 ) {
264 OOFEM_WARNING(
"Bilinear softening: sk/ft ratio (skft) must be in interval <0;1>");
276 if (
gf == 0.0 &&
gft != 0 ) {
277 OOFEM_WARNING(
"Bilinear softening: parameters defined as for Linear_Cohesive_Crack");
280 }
else if (
gft <
gf ) {
283 }
else if (
wk == 0.0 &&
wf != 0 ) {
284 OOFEM_WARNING(
"Bilinear softening: parameters defined as for Linear_Cohesive_Crack");
286 }
else if (
wf <
wk ) {
288 }
else if (
gf == 0 &&
sk == 0.0 ) {
289 OOFEM_WARNING(
"Bilinear softening: parameters defined as for Linear_Cohesive_Crack");
308 aux *= ( 6. - (
c2 *
c2 *
c2 + 3. *
c2 *
c2 + 6. *
c2 + 6. ) * exp(-
c2) );
309 aux += ( 1. - exp(-
c2) ) /
c2;
310 aux -= 0.5 * ( 1. +
c1 *
c1 *
c1 ) * exp(-
c2);
311 wf =
gf / ( aux * E *
e0 );
313 OOFEM_WARNING(
"wf or gf must be specified for Hordijk softening law");
336 this->
md = 1. / log(E * this->
ep / this->
ft);
419 if ( this->
wf != 0.0 ) {
421 }
else if ( this->
gf != 0.0 ) {
432 if ( this->
ek != 0.0 ) {
437 }
else if ( this->
wk != 0.0 ) {
486 fullStrain.
at(3) = -nu * ( fullStrain.
at(1) + fullStrain.
at(2) ) / ( 1. - nu );
489 fullStrain.
at(2) = -nu *fullStrain.
at(1);
490 fullStrain.
at(3) = -nu *fullStrain.
at(1);
494 double posNorm = 0.0;
499 for (
int i = 1; i <= 3; i++ ) {
500 if ( principalStrains.
at(i) > 0.0 ) {
501 posNorm += principalStrains.
at(i) * principalStrains.
at(i);
505 kappa = sqrt(posNorm);
509 FloatArray stress, fullStress, principalStress;
516 for (
int i = 1; i <= 3; i++ ) {
517 if ( principalStress.
at(i) > 0.0 ) {
519 sum += principalStress.
at(i) * principalStress.
at(i);
520 }
else if ( sum < principalStress.
at(i) ) {
521 sum = principalStress.
at(i);
523 }
else if ( sum < principalStress.
at(i) ) {
524 sum = principalStress.
at(i);
532 kappa = sum / lmat->
give(
'E', gp);
551 OOFEM_ERROR(
"Elastic energy corresponding to positive part of stress not finished");
556 OOFEM_ERROR(
"Elastic energy corresponding to positive part of strain not finished");
559 kappa = sqrt( sum / lmat->
give(
'E', gp) );
568 a = (
k - 1 ) * I1e / ( 2 *
k * ( 1 - 2 * nu ) );
569 b = (
k - 1 ) * (
k - 1 ) * I1e * I1e / ( ( 1 - 2 * nu ) * ( 1 - 2 * nu ) );
570 c = 12 *
k * J2e / ( ( 1 + nu ) * ( 1 + nu ) );
571 kappa = a + 1 / ( 2 *
k ) * sqrt(b + c);
574 double kappa1 = 0.0, kappa2 = 0.0;
575 FloatArray stress, fullStress, principalStress;
581 double sum = 0., maxStress = 0.;
583 for (
int i = 1; i <= 3; i++ ) {
584 if ( principalStress.
at(i) > 0.0 && sum < principalStress.
at(i) ) {
585 sum = principalStress.
at(i);
588 kappa1 = sum / lmat->
give(
'E', gp);
591 maxStress =
max( fabs( principalStress.
at(1) ), fabs( principalStress.
at(3) ) );
592 if ( maxStress == 0. || fabs( principalStress.
at(3) ) < 1.e-6 * maxStress || fabs( principalStress.
at(1) + principalStress.
at(3) ) < 1.e-6 * maxStress ) {
594 }
else if ( principalStress.
at(1) / principalStress.
at(3) >= -0.33333 ) {
595 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);
597 kappa =
max(kappa1, 0.0);
598 kappa =
max(kappa, kappa2);
617 double posNorm = 0.0;
630 principalStrains.
at(2) = -nu *principalStrains.
at(1);
631 principalStrains.
at(3) = -nu *principalStrains.
at(1);
637 principalStrains.
at(3) = -nu * ( principalStrains.
at(1) + principalStrains.
at(2) ) / ( 1. - nu );
650 for (
int i = 1; i <= 3; i++ ) {
652 if ( principalStrains.
at(i) > 0.0 ) {
659 if ( principalStrains.
at(i) > 0.0 ) {
660 posNorm += principalStrains.
at(i) * principalStrains.
at(i);
666 double kappa = sqrt(posNorm);
668 int numberOfEl = ( dim * ( dim - 1 ) / 2 + dim );
669 answer.
resize(numberOfEl);
672 Eta.
times(1. / kappa);
679 answer.
at(1) = Eta.
at(1, 1);
680 answer.
at(2) = Eta.
at(2, 2);
681 answer.
at(3) = Eta.
at(3, 3);
682 answer.
at(4) = Eta.
at(2, 3);
683 answer.
at(5) = Eta.
at(1, 3);
684 answer.
at(6) = Eta.
at(1, 2);
686 answer.
at(1) = Eta.
at(1, 1);
688 answer.
at(1) = Eta.
at(1, 1);
689 answer.
at(2) = Eta.
at(2, 2);
690 answer.
at(3) = Eta.
at(1, 2);
693 answer.
at(1) = Eta.
at(1, 1);
694 answer.
at(2) = Eta.
at(2, 2);
695 answer.
at(3) = Eta.
at(3, 3);
696 answer.
at(4) = Eta.
at(1, 2);
699 int index = 0, dim = 0;
733 for (
int i = 1; i <= 3; i++ ) {
734 if ( principalStress.
at(i) > 0.0 ) {
736 sum += principalStress.
at(i) * principalStress.
at(i);
738 for (
int j = 1; j <= dim; j++ ) {
739 n.
at(j) = N.
at(j, i);
744 }
else if ( sum < principalStress.
at(i) ) {
745 sum = principalStress.
at(i);
748 }
else if ( sum < principalStress.
at(i) ) {
749 sum = principalStress.
at(i);
756 int numberOfEl = ( dim * ( dim - 1 ) / 2 + dim );
761 double kappa = sum / lmat->
give(
'E', gp);
764 Eta.
times(1. / kappa);
770 Eta.
times( 1. / kappa / lmat->
give(
'E', gp) / lmat->
give(
'E', gp) );
772 for (
int i = 1; i <= dim; i++ ) {
773 n.
at(i) = N.
at(i, index);
781 eta.
at(1) = Eta.
at(1, 1);
782 eta.
at(2) = Eta.
at(2, 2);
783 eta.
at(3) = Eta.
at(3, 3);
784 eta.
at(4) = Eta.
at(2, 3);
785 eta.
at(5) = Eta.
at(1, 3);
786 eta.
at(6) = Eta.
at(1, 2);
788 eta.
at(1) = Eta.
at(1, 1);
790 eta.
at(1) = Eta.
at(1, 1);
791 eta.
at(2) = Eta.
at(2, 2);
792 eta.
at(3) = Eta.
at(1, 2);
795 eta.
at(1) = Eta.
at(1, 1);
796 eta.
at(2) = Eta.
at(2, 2);
797 eta.
at(3) = Eta.
at(3, 3);
798 eta.
at(4) = 2. * Eta.
at(1, 2);
812 double kappa = sqrt( sum / lmat->
give(
'E', gp) );
814 answer.
times(1. / lmat->
give(
'E', gp) / kappa);
823 I1e = strainVector.
at(1) + strainVector.
at(2) + strainVector.
at(3);
824 double s1 = strainVector.
at(1) * strainVector.
at(1);
825 double s2 = strainVector.
at(2) * strainVector.
at(2);
826 double s3 = strainVector.
at(3) * strainVector.
at(3);
827 J2e = 1. / 2. * ( s1 + s2 + s3 ) - 1. / 6. * ( I1e * I1e );
853 if ( this->gf != 0. ) {
855 wf = this->gf / E /
e0;
857 wf = 2. * gf / E /
e0;
862 wf = this->
wk / ( e0 * E - this->
sk ) * ( e0 * E );
874 minGf = E * e0 * e0 * Le;
876 minGf = E * e0 * e0 * Le / 2.;
882 OOFEM_ERROR(
"Material number %d, decrease e0, or increase Gf from %f to Gf=%f", this->
giveNumber(), gf, minGf);
893 omega = (
ef / kappa ) * ( kappa - e0 ) / (
ef -
e0 );
899 double ef, sigmak, epsf,
ek;
902 ef = 2 * gf / E / e0 / Le;
903 sigmak = E * e0 * ( ef -
ek ) / ( ef - e0 );
904 epsf = 2 * ( gft -
gf ) / sigmak / Le + ef;
907 OOFEM_ERROR(
"The total fracture energy gft %f must be greater than the initial fracture energy gf %f", gft, gf);
910 ek = this->
wk / Le + ( this->
sk ) / E;
911 ef = ( this->
wk / ( e0 * E - this->
sk ) * ( e0 * E ) ) / Le;
913 epsf = this->wf / Le;
915 if ( ( ek > ef ) || ( ek <
e0 ) ) {
916 OOFEM_WARNING(
"ek %f is not between e0 %f and ef %f", ek, e0, ef);
920 omega = 1.0 - ( ( e0 / kappa ) * ( ek - kappa ) / ( ek -
e0 ) + ( ( sigmak / ( E * kappa ) ) * ( kappa - e0 ) / ( ek -
e0 ) ) );
921 }
else if ( kappa > ek && kappa <= epsf ) {
922 omega = 1.0 - ( ( sigmak / ( E * kappa ) ) * ( epsf - kappa ) / ( epsf - ek ) );
923 }
else if ( kappa <= e0 ) {
938 help = omega * kappa /
ef;
939 R = ( 1. - omega ) * kappa - e0 *exp(-help);
940 Lhs = kappa - e0 *exp(-help) * kappa /
ef;
947 OOFEM_ERROR(
"Unknown softening type for cohesive crack model.");
951 OOFEM_WARNING(
"damage parameter is %f, which is greater than 1, snap-back problems", omega);
959 OOFEM_WARNING(
"damage parameter is %f, which is smaller than 0, snap-back problems", omega);
980 }
else if ( kappa < ef ) {
981 return ( ef / kappa ) * ( kappa -
e0 ) / ( ef - e0 );
989 return ( kappa - e0 * exp( -( kappa - e0 ) / ( ef - e0 ) ) ) / ( kappa +
ps_alpha );
991 return 1.0 - ( e0 / kappa ) * exp( -( kappa - e0 ) / ( ef -
e0 ) );
998 return 1.0 - ( 1. -
c2 ) * ( e0 / kappa ) * exp( -( kappa - e0 ) / ( ef - e0 ) ) -
c2 * ( e0 / kappa ) * exp( -( kappa - e0 ) / (
e2 -
e0 ) );
1005 return 1.0 - ( e0 / kappa ) * exp( -pow( ( kappa - e0 ) / ( ef - e0 ),
md ) );
1012 return 1.0 - ( e0 / kappa ) * exp( -( pow(kappa,
md) - pow(e0,
md) ) / ( pow(ef,
md) - pow(e0,
md) ) );
1018 return 1.0 - ( 1.0 -
At ) * e0 / kappa -
At *exp( -
Bt * ( kappa - e0 ) );
1021 return 1.0 - exp( -pow(kappa / e0,
md) );
1025 if ( kappa <=
e1 ) {
1026 return 1.0 - exp( -pow(kappa / e0,
md) );
1028 return 1.0 -
s1 *exp( -( kappa -
e1 ) / ( ef * ( 1. + pow( ( kappa -
e1 ) /
e2,
nd ) ) ) ) / kappa;
1045 const double Le = status->
giveLe();
1054 if ( kappa <= e0 ) {
1056 }
else if ( kappa < ef ) {
1057 return ( ef * e0 ) / ( ef -
e0 ) / ( kappa * kappa );
1065 return ( e0 / ( kappa * kappa ) ) * exp( -( kappa - e0 ) / ( ef -
e0 ) + e0 / ( kappa * ( ef - e0 ) ) ) * exp( -( kappa - e0 ) / ( ef - e0 ) );
1072 return ( 1.0 -
At ) * e0 / kappa / kappa -
At *
Bt *exp( -
Bt * ( kappa - e0 ) );
1076 return md / e0 *pow(kappa,
md - 1.) * exp( -pow(kappa / e0,
md) );
1083 }
else if ( kappa <=
e1 ) {
1084 return exp( -pow(kappa / e0,
md) ) *
md / pow(e0,
md) * pow(kappa,
md - 1.);
1086 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 ) ) );
1087 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;
1093 double wf = 2. *
gf / E /
e0;
1094 if ( kappa <= e0 ) {
1096 }
else if ( kappa < wf / Le ) {
1097 return ( e0 / ( kappa * kappa ) / ( 1. - Le * e0 / wf ) );
1105 ef =
gf / E / e0 / Le;
1107 double help = exp(omega * kappa / ef);
1108 double ret = -( ( omega * ef -
ef ) * help - omega * e0 ) / ( ef * kappa * help - e0 * kappa );
1128 return om / ( 1. - om );
1148 return ps_alpha * omega / ( 1. - omega );
1164 FloatArray principalStrains, crackPlaneNormal, fullStrain, crackVect;
1182 wf = 2. * gf / E /
e0;
1187 wf = this->
wk / ( e0 * E - this->
sk ) * ( e0 * E );
1193 if ( ( kappa > e0 ) && ( ( status->
giveDamage() == 0. ) || ( status->
giveLe() == 0.0 ) ) ) {
1197 for (
int i = 2; i <= 3; i++ ) {
1198 if ( principalStrains.
at(i) > principalStrains.
at(indx) ) {
1203 crackPlaneNormal.
beColumnOf(principalDir, indx);
1207 for (
int i = 2; i <= 3; i++ ) {
1208 if ( principalStrains.
at(i) < principalStrains.
at(indx) && fabs( principalStrains.
at(i) ) > 1.e-10 ) {
1215 FloatArray stress, fullStress, principalStress, crackV(3), crackPlaneN(3);
1222 if ( principalStress.
at(1) <= 1.e-10 && principalStress.
at(2) <= 1.e-10 && principalStress.
at(3) <= 1.e-10 ) {
1226 if ( indexMin + indexMax == 3 ) {
1228 }
else if ( indexMin + indexMax == 4 ) {
1230 }
else if ( indexMin + indexMax == 5 ) {
1235 double twoPsi = ( principalStress.
at(indexMin) - principalStress.
at(indexMax) ) / 2. / ( principalStress.
at(indexMax) + principalStress.
at(indexMin) );
1236 double psi = acos(twoPsi) / 2.;
1237 for (
int i = 1; i <= 3; i++ ) {
1238 crackV.at(i) = principalDir.
at(i, indexMin);
1239 crackPlaneN = principalDir.
at(i, indexMax);
1244 FloatMatrix ux(3, 3), dyadU(3, 3), unitMtrx(3, 3), rotMtrx(3, 3);
1247 ux.at(1, 2) = -principalDir.
at(3, indexMid);
1248 ux.at(1, 3) = principalDir.
at(2, indexMid);
1249 ux.at(2, 1) = principalDir.
at(3, indexMid);
1250 ux.at(2, 3) = -principalDir.
at(1, indexMid);
1251 ux.at(3, 1) = -principalDir.
at(2, indexMid);
1252 ux.at(3, 2) = principalDir.
at(1, indexMid);
1253 u.
at(1) = principalDir.
at(1, indexMid);
1254 u.
at(2) = principalDir.
at(2, indexMid);
1255 u.
at(3) = principalDir.
at(3, indexMid);
1256 dyadU.beDyadicProductOf(u, u);
1257 unitMtrx.beUnitMatrix();
1258 unitMtrx.times( cos(psi) );
1259 ux.times( sin(psi) );
1260 dyadU.times( 1. - cos(psi) );
1262 rotMtrx.
add(unitMtrx);
1265 crackV.rotatedWith(rotMtrx,
'n');
1266 for (
int i = 1; i <= 3; i++ ) {
1267 principalDir.
at(i, indx) = crackV.at(i);
1286 double ca =
M_PI / 2.;
1287 if ( crackPlaneNormal.
at(1) != 0.0 ) {
1288 ca = atan( crackPlaneNormal.
at(2) / crackPlaneNormal.
at(1) );
1293 if ( this->gf != 0. && e0 >= ( wf / le ) ) {
1294 OOFEM_WARNING(
"Fracturing strain %e is lower than the elastic strain e0=%e, possible snap-back. Element number %d, wf %e, le %e", wf / le, e0, gp->
giveElement()->
giveLabel(),
wf, le);
1298 }
else if ( wf == 0. && e0 >= ef ) {
1299 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() );
1303 }
else if ( ef == 0. && e0 * le >= wf ) {
1304 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() );
1316 if ( static_cast< IsotropicDamageMaterial1Status * >( this->
giveStatus(gp) )->_giveProperty(aProperty, answer) ) {
1318 }
else if ( aProperty ==
e0_ID ) {
1320 }
else if ( aProperty ==
ef_ID ) {
1322 }
else if ( aProperty ==
ek_ID ) {
1324 }
else if ( aProperty ==
gf_ID ) {
1326 }
else if ( aProperty ==
wf_ID ) {
1328 }
else if ( aProperty ==
gft_ID ) {
1357 if ( status == NULL ) {
1361 if ( status != NULL ) {
1380 toMap.
at(1) = ( int ) IST_MaxEquivalentStrainLevel;
1381 toMap.
at(2) = ( int ) IST_DamageTensor;
1382 toMap.
at(3) = ( int ) IST_StrainTensor;
1411 #ifdef IDM_USE_MAPPEDSTRAIN 1441 #ifdef IDM_USE_MAPPEDSTRAIN
double At
Parameters used in Mazars damage law.
CrossSection * giveCrossSection()
double damageFunction(double kappa, GaussPoint *gp)
Returns the value of damage parameter corresponding to a given value of the damage-driving variable k...
bool isCrackBandApproachUsed()
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
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 c1
Parameters used in Hordijk's softening law.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
#define _IFT_IsotropicDamageMaterial1_wk
#define _IFT_IsotropicDamageMaterial1_ft
Base class representing general isotropic damage model.
#define _IFT_IsotropicDamageMaterial1_e1
double md
Parameter used in "smooth damage law".
For computing principal stresses.
void init(Domain *dold, IntArray &varTypes, GaussPoint *gp, Set &sourceElemSet, TimeStep *tStep, bool iCohesiveZoneGP=false)
Initializes the receiver state before mapping.
#define _IFT_IsotropicDamageMaterial1_md
For computing principal strains from engineering strains.
IntegrationPointStatus * setMaterialStatus(IntegrationPointStatus *ptr, int n)
Sets Material status managed by receiver.
Domain * domain
Link to domain object, useful for communicating with other FEM components.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
double ep
auxiliary input variablesfor softType == ST_SmoothExtended
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
Specialization of a floating point array for representing a stress state.
#define _IFT_IsotropicDamageMaterial1_At
virtual void initDamaged(double kappa, FloatArray &totalStrainVector, GaussPoint *gp)
Performs initialization, when damage first appear.
double & at(int i)
Coefficient access function.
int max(int i, int j)
Returns bigger value form two given decimals.
double gf
Determines the softening -> corresponds to the initial fracture energy.
IsotropicDamageMaterial1Status(int n, Domain *d, GaussPoint *g)
Constructor.
The class representing the general material model adaptive mapping interface.
#define _IFT_IsotropicDamageMaterial1_c1
void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir) const
Computes principal values and directions of receiver vector.
static MMAContainingElementProjection mapper
Mapper used to map internal variables in adaptivity.
double evaluatePermanentStrain(double kappa, double omega)
virtual ~IsotropicDamageMaterial1()
Destructor.
void setLe(double ls)
Sets characteristic length to given value.
#define IDM1_ITERATION_LIMIT
void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir) const
Computes the principal values and principal directions of the receiver.
EngngModel * giveEngngModel()
Returns engineering model to which receiver is associated.
#define _IFT_IsotropicDamageMaterial1_nd
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Element * giveElement()
Returns corresponding element to receiver.
virtual void finish(TimeStep *tStep)
Finishes the mapping for given time step.
int checkSnapBack
Check possible snap back flag.
#define _IFT_IsotropicDamageMaterial1_gf
Specialization of a floating point array for representing a strain state.
double complianceFunction(double kappa, GaussPoint *gp)
Returns the value of compliance parameter corresponding to a given value of the damage-driving variab...
int giveNumberOfElements() const
Returns number of elements in domain.
This class implements associated Material Status to IsotropicDamageMaterial1.
#define _IFT_IsotropicDamageMaterial1_equivstraintype
static void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir, const FloatArray &s, stressStrainPrincMode mode)
Computes principal values and directions of stress or strain vector.
Class implementing an array of integers.
int & at(int i)
Coefficient access function.
virtual int MMI_update(GaussPoint *gp, TimeStep *tStep, FloatArray *estrain=NULL)
Updates the required internal state variables from previously mapped values.
double ef
Determines ductility -> corresponds to fracturing strain.
virtual int MMI_map(GaussPoint *gp, Domain *oldd, TimeStep *tStep)
Maps the required internal state variables from old mesh oldd to given ip.
void setElementList(IntArray newElements)
Sets list of elements within set.
This class is a abstract base class for all linear elastic material models in a finite element proble...
double griff_n
Parameter used in Griffith's criterion.
void rotatedWith(FloatMatrix &r, char mode)
Returns the receiver a rotated according the change-of-base matrix r.
double k
Parameter used in Mises definition of equivalent strain.
static void giveFullSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the reduced unsymmetric Voigt vector (2nd order tensor) to full form.
void beColumnOf(const FloatMatrix &mat, int col)
Reciever will be set to a given column in a matrix.
virtual int mapVariable(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Maps and update the unknown of given type from old mesh oldd to new mesh to which gp belongs to...
EquivStrainType equivStrainType
Parameter specifying the definition of equivalent strain.
IsotropicDamageMaterial1(int n, Domain *d)
Constructor.
double wf
Determines ductility -> corresponds to crack opening in the cohesive crack model. ...
void _generateStatusVariables(GaussPoint *) const
Sets up (generates) the variables identified in randVariables array using generators given in randomV...
#define _IFT_IsotropicDamageMaterial1_k
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
#define _IFT_IsotropicDamageMaterial1_ep
double giveLe()
Returns characteristic length stored in receiver.
virtual double give(int aProperty, GaussPoint *gp)
Returns the value of material property 'aProperty'.
#define _IFT_IsotropicDamageMaterial1_e2
virtual void giveStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the stiffness matrix for giveRealStressVector of receiver in given integration point...
#define _IFT_IsotropicDamageMaterial1_checkSnapBack
virtual void updateYourself(TimeStep *tStep)
Updates internal state of receiver after finishing time step.
double wk
Determines the softening for the bilinear law -> corresponds to the crack opening at the knee point...
static void giveReducedSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full unsymmetric Voigt vector (2nd order tensor) to reduced form.
Element * giveElement(int n)
Service for accessing particular domain fe element.
void setTempDamage(double newDamage)
Sets the temp damage level to given value.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record of receiver.
double damageFunctionPrime(double kappa, GaussPoint *gp)
Returns the value of compliance parameter corresponding to a given value of the damage-driving variab...
double dotProduct(const FloatArray &x) const
Computes the dot product (or inner product) of receiver and argument.
double maxOmega
Maximum limit on omega. The purpose is elimination of a too compliant material which may cause conver...
This class implements an isotropic linear elastic material in a finite element problem.
void setCrackAngle(double ca)
Sets crack angle to given value.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
#define _IFT_IsotropicDamageMaterial1_skft
Abstract base class for all random materials.
void times(double f)
Multiplies receiver by factor f.
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.
Set of elements, boundaries, edges and/or nodes.
virtual double give(int aProperty, GaussPoint *gp)
Returns the value of material property 'aProperty'.
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 computeEta(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)
Computes derivative of the equivalent strain with regards to strain.
Set * sourceElemSet
Cached source element set used to map internal variables (adaptivity), created on demand...
void resizeWithValues(int s, int allocChunk=0)
Checks size of receiver towards requested bounds.
virtual double give(int aProperty, GaussPoint *gp)
Returns the value of material property 'aProperty'.
bool isEmpty() const
Returns true if receiver is empty.
double at(int i, int j) const
Coefficient access function.
Abstract base class for all random constitutive model statuses.
LinearElasticMaterial * giveLinearElasticMaterial()
Returns reference to undamaged (bulk) material.
#define _IFT_IsotropicDamageMaterial1_wf
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
int giveIndexMaxElem(void)
Returns index (between 1 and Size) of maximum element in the array.
#define _IFT_IsotropicDamageMaterial1_alphaps
int giveIndexMinElem(void)
Returns index (between 1 and Size) of minimum element in the array.
Abstract base class representing a material status information.
#define _IFT_IsotropicDamageMaterial1_ef
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
Class representing vector of real numbers.
void plusDyadSymmUpper(const FloatArray &a, double dV)
Adds to the receiver the dyadic product .
virtual double giveCharacteristicSize(GaussPoint *gp, FloatArray &normalToCrackPlane, ElementCharSizeMethod method)
Returns characteristic element size for a given integration point and given direction.
double e1
Parameters used if softType = 7 (extended smooth damage law)
Implementation of matrix containing floating point numbers.
IRResultType
Type defining the return values of InputRecord reading operations.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
int permStrain
Indicator of the type of permanent strain formulation (0 = standard damage with no permanent strain) ...
#define _IFT_IsotropicDamageMaterial1_ecsm
IntegrationPointStatus * giveMaterialStatus()
Returns reference to associated material status (NULL if not defined).
double giveTempDamage()
Returns the temp. damage level.
double e0
Equivalent strain at stress peak (or a similar parameter).
#define _IFT_IsotropicDamageMaterial1_sk
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
virtual void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Computes the real stress vector for given total strain and integration point.
SofteningType softType
Parameter specifying the type of softening (damage law).
void giveInputRecord(DynamicInputRecord &ir)
void add(const FloatMatrix &a)
Adds matrix to the receiver.
double sk
Determines the softening for the bilinear law -> corresponds to the stress at the knee point...
#define _IFT_IsotropicDamageMaterial1_Bt
void followedBy(const IntArray &b, int allocChunk=0)
Appends array b at the end of receiver.
void zero()
Zeroes all coefficients of receiver.
void beDyadicProductOf(const FloatArray &vec1, const FloatArray &vec2)
Assigns to the receiver the dyadic product .
#define _IFT_IsotropicDamageMaterial1_c2
void times(double s)
Multiplies receiver with scalar.
#define _IFT_IsotropicDamageMaterial1_gft
static void computeStrainInvariants(const FloatArray &strainVector, double &I1e, double &J2e)
Computes invariants I1 and J2 of the strain tensor from the strain components stored in a vector...
virtual int MMI_finish(TimeStep *tStep)
Finishes the mapping for given time step.
virtual IRResultType initializeFrom(InputRecord *ir)
void zero()
Zeroes all coefficient of receiver.
#define _IFT_IsotropicDamageMaterial1_wkwf
InterfaceType
Enumerative type, used to identify interface type.
ElementCharSizeMethod ecsMethod
Method used for evaluation of characteristic element size.
#define _IFT_IsotropicDamageMaterial1_e0
double gft
Determines the softening for the bilinear law -> corresponds to the total fracture energy...
#define _IFT_IsotropicDamageMaterial1_ek
REGISTER_Material(DummyMaterial)
void computeDamageParamForCohesiveCrack(double &omega, double kappa, GaussPoint *gp)
computes the value of damage parameter omega, based on a given value of equivalent strain...
double ps_alpha
Parameters used by the model with permanent strain.
virtual TimeStep * giveCurrentStep(bool force=false)
Returns current time step.
int giveSize() const
Returns the size of receiver.
the oofem namespace is to define a context or scope in which all oofem names are defined.
double ek
Determines the softening for the bilinear law -> corresponds to the strain at the knee point...
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
#define _IFT_IsotropicDamageMaterial1_damageLaw
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
void setTempKappa(double newKappa)
Sets the temp scalar measure of the largest strain level to given value.
void symmetrized()
Initializes the lower half of the receiver according to the upper half.
int damageLaw
Temporary parameter reading type of softening law, used in other isotropic damage material models...
This class implements associated Material Status to IsotropicDamageMaterial.
virtual void computeEquivalentStrain(double &kappa, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)
Computes the equivalent strain measure from given strain vector (full form).
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.
#define _IFT_IsotropicDamageMaterial1_n
LinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
void resize(int s)
Resizes receiver towards requested size.
virtual Material * giveMaterial(IntegrationPoint *ip)=0
Returns the material associated with the GP.
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
void setCrackVector(FloatArray cv)
Sets crack vector to given value. This is useful for plotting cracks as a vector field (paraview etc...