40 #include "../sm/Materials/structuralmaterial.h" 82 return mode == _3dMat || mode == _PlaneStress;
111 #define AD_TOLERANCE 1.e-10 // convergence tolerance for the internal iteration used under plane stress 112 #define AD_MAXITER 20 // maximum number of internal iterations used under plane stress 121 double epsilon1, epsilon2, ceps, seps;
126 double equivStrainInPlane = 0.;
127 if ( epsilon1 > 0. ) {
128 equivStrainInPlane += epsilon1 * epsilon1;
129 if ( epsilon2 > 0. ) {
130 equivStrainInPlane += epsilon2 * epsilon2;
133 equivStrainInPlane = sqrt(equivStrainInPlane);
140 if ( equivStrainInPlane < kappa ) {
141 ez0 = sqrt(kappa * kappa - equivStrainInPlane * equivStrainInPlane);
148 if ( equivStrainInPlane > kappa ) {
150 this->
computeDamage(tempDamage, Dn, kappa, epsilon1, epsilon2, ceps, seps, 0.);
156 double strainTraceInPlane = eps.
at(1) + eps.
at(2);
157 if ( ( ez1 + strainTraceInPlane > 0. ) || ( ez1 > ez0 ) ) {
158 bool iteration_needed =
true;
159 if ( ez0 + strainTraceInPlane > 0. ) {
162 iteration_needed = ( ( ez1 > ez0 ) || ( ez1 + strainTraceInPlane < 0. ) );
164 if ( iteration_needed ) {
168 this->
computeDamage(tempDamage, Dn, kappa, epsilon1, epsilon2, ceps, seps, ez1);
173 OOFEM_ERROR(
"No convergence in AnisotropicDamageMaterial :: giveRealStressVector for the plane stress case\n");
175 double ez2 = ( ez1 * s0 - ez0 * s1 ) / ( s0 - s1 );
176 this->
computeDamage(tempDamage, Dn, kappa, epsilon1, epsilon2, ceps, seps, ez2);
187 double equivStrain = sqrt( equivStrainInPlane * equivStrainInPlane +
macbra(ez1) *
macbra(ez1) );
188 if ( equivStrain > kappa ) {
199 #ifdef keep_track_of_dissipated_energy 214 double aux1 = ( Dx + Dy ) / 2.;
215 double aux2 = ( Dx - Dy ) / 2.;
216 double aux3 = sqrt(aux2 * aux2 + Dxy * Dxy);
223 double t = ( D1 - Dx ) / Dxy;
224 c = 1. / sqrt(1. + t * t);
226 }
else if ( Dx < Dy ) {
239 if ( Dx + Dy > 2. ) {
242 if ( Dx + Dy > 1. + Dx * Dy - Dxy * Dxy ) {
261 double tempEpsEq = 0.;
263 tempEpsEq += eps1 * eps1;
265 tempEpsEq += eps2 * eps2;
269 tempEpsEq += epsZ * epsZ;
271 tempEpsEq = sqrt(tempEpsEq);
274 if ( tempEpsEq <= kappa ) {
281 double eps1p =
macbra(eps1);
282 double eps2p =
macbra(eps2);
283 double epsZp =
macbra(epsZ);
284 double aux1 = deltaLambda * eps1p * eps1p;
285 double aux2 = deltaLambda * eps2p * eps2p;
287 tempDamage.
at(1, 1) += aux1 * ceps * ceps + aux2 * seps * seps;
288 tempDamage.
at(1, 2) += ( aux1 - aux2 ) * ceps * seps;
289 tempDamage.
at(2, 1) = tempDamage.
at(1, 2);
290 tempDamage.
at(2, 2) += aux1 * seps * seps + aux2 * ceps * ceps;
291 tempDamage.
at(3, 3) += deltaLambda * epsZp * epsZp;
294 if ( tempDamage.
at(3, 3) > 1. ) {
295 tempDamage.
at(3, 3) = 1.;
302 double D1, D2, cdam, sdam;
306 double dDx = tempDamage.
at(1, 1) - damage.
at(1, 1);
307 double dDy = tempDamage.
at(2, 2) - damage.
at(2, 2);
308 double dDxy = tempDamage.
at(1, 2) - damage.
at(1, 2);
309 double dD11 = cdam * cdam * dDx + sdam * sdam * dDy + 2. * cdam * sdam * dDxy;
310 double dD22 = sdam * sdam * dDx + cdam * cdam * dDy - 2. * cdam * sdam * dDxy;
321 tempDamage.
at(1, 1) = cdam * cdam * D1 + sdam * sdam * D2;
322 tempDamage.
at(2, 2) = sdam * sdam * D1 + cdam * cdam * D2;
323 tempDamage.
at(1, 2) = cdam * sdam * ( D1 - D2 );
324 tempDamage.
at(2, 1) = tempDamage.
at(1, 2);
332 if ( equivStrain > this->
kappa0 ) {
341 knu = 2. * ( 1. + this->
nu ) / 9.;
345 knu = 2. * ( 1. + this->
nu ) / 9.;
347 answer = ( equivStrain - aux * this->
kappa0 ) / ( equivStrain - aux * knu * this->
kappa0 );
364 double D1, D2, cdam, sdam;
369 double eps11 = cdam * cdam * inplaneStrain.
at(1) + cdam *sdam *inplaneStrain.
at(3) + sdam *sdam *inplaneStrain.
at(2);
370 double eps22 = sdam * sdam * inplaneStrain.
at(1) - cdam *sdam *inplaneStrain.
at(3) + cdam *cdam *inplaneStrain.
at(2);
373 double Dz = dam.
at(3, 3);
377 Bv =
macbra(1. - D1 - D2 - Dz);
382 double Q = ( 3. - D1 - D2 - Dz ) * Bv * ( 1. +
nu );
383 double Q1 = 3. * ( 1. - D1 ) * ( 1. - Dz ) * ( 1. - 2. *
nu );
384 double Q2 = 3. * ( 1. - D2 ) * ( 1. - Dz ) * ( 1. - 2. *
nu );
388 double answer = ( ( Q1 - Q ) * eps11 + ( Q2 - Q ) * eps22 ) / ( Q + Q1 + Q2 );
401 double D1, D2, cdam, sdam;
406 double eps11 = cdam * cdam * inplaneStrain.
at(1) + cdam *sdam *inplaneStrain.
at(3) + sdam *sdam *inplaneStrain.
at(2);
407 double eps22 = sdam * sdam * inplaneStrain.
at(1) - cdam *sdam *inplaneStrain.
at(3) + cdam *cdam *inplaneStrain.
at(2);
410 double Dz = dam.
at(3, 3);
413 double strainTrace = inplaneStrain.
at(1) + inplaneStrain.
at(2) + epsZ;
414 if ( strainTrace > 0. ) {
415 Bv =
macbra(1. - D1 - D2 - Dz);
420 double Q = ( 3. - D1 - D2 - Dz ) * Bv * ( 1. +
nu );
421 double Q1 = 3. * ( 1. - D1 ) * ( 1. - Dz ) * ( 1. - 2. *
nu );
422 double Q2 = 3. * ( 1. - D2 ) * ( 1. - Dz ) * ( 1. - 2. *
nu );
424 double answer = ( Q - Q1 ) * eps11 + ( Q - Q2 ) * eps22 + ( Q + Q1 + Q2 ) * epsZ;
437 double D1, D2, cdam, sdam;
442 double eps11 = cdam * cdam * inplaneStrain.
at(1) + cdam *sdam *inplaneStrain.
at(3) + sdam *sdam *inplaneStrain.
at(2);
443 double eps22 = sdam * sdam * inplaneStrain.
at(1) - cdam *sdam *inplaneStrain.
at(3) + cdam *cdam *inplaneStrain.
at(2);
444 double gam12 = 2. * cdam * sdam * ( inplaneStrain.
at(2) - inplaneStrain.
at(1) ) + ( cdam * cdam - sdam * sdam ) * inplaneStrain.
at(3);
475 double K =
E / ( 3. * ( 1 - 2 *
nu ) );
476 double G =
E / ( 2. * ( 1 +
nu ) );
478 double strainTrace = eps11 + eps22 + epsZ;
479 double damTrace = D1 + D2 + dam.
at(3, 3);
480 if ( strainTrace > 0. ) {
481 Bv =
macbra(1. - damTrace);
483 double B = 3. - damTrace;
486 double Bz = 1. - dam.
at(3, 3);
490 double sigm = Bv * K * strainTrace;
491 double sig11 = 2. * G * B1 * ( B2 * ( eps11 - eps22 ) + Bz * ( eps11 - epsZ ) ) / B + sigm;
492 double sig22 = 2. * G * B2 * ( B1 * ( eps22 - eps11 ) + Bz * ( eps22 - epsZ ) ) / B + sigm;
493 double sig12 = G * sqrt(B1 * B2) * gam12;
498 inplaneStress.
at(1) = cdam * cdam * sig11 - 2. * cdam * sdam * sig12 + sdam * sdam * sig22;
499 inplaneStress.
at(2) = sdam * sdam * sig11 + 2. * cdam * sdam * sig12 + cdam * cdam * sig22;
500 inplaneStress.
at(3) = cdam * sdam * ( sig11 - sig22 ) + ( cdam * cdam - sdam * sdam ) * sig12;
527 double equivStrain, kappa = 0.0, tempKappa = 0.0, traceTempD;
528 FloatArray eVals, effectiveStressVector, fullEffectiveStressVector, stressVector;
529 FloatMatrix eVecs, effectiveStressTensor, stressTensor, strainTensor;
534 if ( equivStrain <= kappa ) {
542 if ( ( equivStrain <= kappa ) && ( kappa <= this->
kappa0 ) ) {
544 effectiveStressVector.
beProductOf(de, reducedTotalStrainVector);
545 answer = effectiveStressVector;
549 strainTensor.
resize(3, 3);
551 if ( mode == _PlaneStress ) {
565 strainTensor.
at(1, 1) = reducedTotalStrainVector.
at(1);
566 strainTensor.
at(2, 2) = reducedTotalStrainVector.
at(2);
567 strainTensor.
at(3, 3) = reducedTotalStrainVector.
at(3);
568 strainTensor.
at(2, 3) = strainTensor.
at(3, 2) = reducedTotalStrainVector.
at(4) / 2.0;
569 strainTensor.
at(1, 3) = strainTensor.
at(3, 1) = reducedTotalStrainVector.
at(5) / 2.0;
570 strainTensor.
at(1, 2) = strainTensor.
at(2, 1) = reducedTotalStrainVector.
at(6) / 2.0;
572 effectiveStressVector.
beProductOf(de, reducedTotalStrainVector);
574 effectiveStressTensor.
beMatrixForm(fullEffectiveStressVector);
581 double effectiveStressTrace = effectiveStressTensor.
at(1, 1) + effectiveStressTensor.
at(2, 2) + effectiveStressTensor.
at(3, 3);
589 ImD.
at(1, 1) = ImD.
at(2, 2) = ImD.
at(3, 3) = 1;
593 ImD.
jaco_(eVals, eVecs, 40);
596 for (
int i = 1; i <= 3; i++ ) {
597 for (
int j = 1; j <= 3; j++ ) {
598 for (
int k = 1; k <= 3; k++ ) {
599 if ( eVals.
at(k) < 0.0 ) {
603 sqrtImD.
at(i, j) = sqrt( eVals.
at(1) ) * eVecs.
at(i, 1) * eVecs.
at(j, 1) + sqrt( eVals.
at(2) ) * eVecs.
at(i, 2) * eVecs.
at(j, 2) + sqrt( eVals.
at(3) ) * eVecs.
at(i, 3) * eVecs.
at(j, 3);
607 AuxMatrix.
beProductOf(effectiveStressTensor, sqrtImD);
617 for (
int i = 1; i <= 3; i++ ) {
618 for (
int j = 1; j <= 3; j++ ) {
619 scalar += ImD.
at(i, j) * effectiveStressTensor.
at(i, j);
622 if ( ( 3. - traceTempD ) < 0.0001 ) {
625 scalar = scalar / ( 3. - traceTempD );
629 AuxMatrix.
times(scalar);
637 AuxMatrix.
at(1, 1) = AuxMatrix.
at(2, 2) = AuxMatrix.
at(3, 3) = 1. / 3.;
638 if ( effectiveStressTrace > 0 ) {
639 AuxMatrix.
times( ( 1 - traceTempD ) * effectiveStressTrace );
641 AuxMatrix.
times(effectiveStressTrace);
645 stressTensor = Part1;
647 stressTensor.
add(Part3);
650 stressTensor.
times(factor);
664 #ifdef keep_track_of_dissipated_energy 681 double posNorm = 0.0;
691 fullstrain.
at(2) = -
nu *fullstrain.
at(1);
692 fullstrain.
at(3) = -
nu *fullstrain.
at(1);
697 for (
int i = 1; i <= 3; i++ ) {
698 if ( principalStrains.
at(i) > 0.0 ) {
699 posNorm += principalStrains.
at(i) * principalStrains.
at(i);
703 kappa = sqrt(posNorm);
705 OOFEM_ERROR(
"computeEquivalentStrain: unknown EquivStrainType");
828 double alpha_a, alpha_b, newAlpha, eps, maxDamage, size;
829 FloatMatrix deltaD, positiveStrainTensorSquared, resultingDamageTensor, eVecs;
835 newAlpha = ( alpha_a + alpha_b ) / 2;
836 positiveStrainTensorSquared.
beProductOf(positiveStrainTensor, positiveStrainTensor);
837 deltaD = positiveStrainTensorSquared;
838 deltaD.
times(newAlpha * deltaLambda);
840 resultingDamageTensor = tempDamageTensor;
841 resultingDamageTensor.
add(deltaD);
843 resultingDamageTensor.
jaco_(eVals, eVecs, 20);
845 maxDamage = eVals.
at(1);
846 for (
int i = 2; i <= size; i++ ) {
847 if ( eVals.
at(i) > maxDamage ) {
848 maxDamage = eVals.
at(i);
851 eps = maxDamage - damageThreshold;
855 newAlpha = ( alpha_a + alpha_b ) / 2;
856 deltaD = positiveStrainTensorSquared;
857 deltaD.
times(newAlpha * deltaLambda);
859 resultingDamageTensor = tempDamageTensor;
860 resultingDamageTensor.
add(deltaD);
862 resultingDamageTensor.
jaco_(eVals, eVecs, 20);
864 maxDamage = eVals.
at(1);
865 for (
int i = 2; i <= size; i++ ) {
866 if ( eVals.
at(i) > maxDamage ) {
867 maxDamage = eVals.
at(i);
870 eps = maxDamage - damageThreshold;
877 newAlpha = ( alpha_a + alpha_b ) / 2;
878 deltaD = positiveStrainTensorSquared;
879 deltaD.
times(newAlpha * deltaLambda);
881 resultingDamageTensor = tempDamageTensor;
882 resultingDamageTensor.
add(deltaD);
884 resultingDamageTensor.
jaco_(eVals, eVecs, 20);
886 maxDamage = eVals.
at(1);
887 for (
int i = 2; i <= size; i++ ) {
888 if ( eVals.
at(i) > maxDamage ) {
889 maxDamage = eVals.
at(i);
892 eps = maxDamage - damageThreshold;
898 }
while ( fabs(eps) > 1.0e-15 );
908 double alpha_a, alpha_b, newAlpha, eps, maxDamage, size, minVal;
916 newAlpha = ( alpha_a + alpha_b ) / 2;
917 deltaD = projPosStrainTensor;
918 deltaD.
times(newAlpha * deltaLambda);
920 resultingDamageTensor = tempDamageTensor;
921 resultingDamageTensor.
add(deltaD);
923 resultingDamageTensor.
jaco_(eVals, eVecs, 40);
925 minVal = eVals.
at(1);
926 for (
int i = 2; i <= size; i++ ) {
927 if ( eVals.
at(i) < minVal ) {
928 minVal = eVals.
at(i);
929 maxDamage = ( ( eVals.
at(1) + eVals.
at(2) + eVals.
at(3) ) - eVals.
at(i) ) / 2;
932 eps = maxDamage - damageThreshold;
936 newAlpha = ( alpha_a + alpha_b ) / 2;
937 deltaD = projPosStrainTensor;
938 deltaD.
times(newAlpha * deltaLambda);
940 resultingDamageTensor = tempDamageTensor;
941 resultingDamageTensor.
add(deltaD);
943 resultingDamageTensor.
jaco_(eVals, eVecs, 40);
945 minVal = eVals.
at(1);
946 for (
int i = 2; i <= size; i++ ) {
947 if ( eVals.
at(i) < minVal ) {
948 minVal = eVals.
at(i);
949 maxDamage = ( ( eVals.
at(1) + eVals.
at(2) + eVals.
at(3) ) - eVals.
at(i) ) / 2;
952 eps = maxDamage - damageThreshold;
959 newAlpha = ( alpha_a + alpha_b ) / 2;
960 deltaD = projPosStrainTensor;
961 deltaD.
times(newAlpha * deltaLambda);
963 resultingDamageTensor = tempDamageTensor;
964 resultingDamageTensor.
add(deltaD);
966 resultingDamageTensor.
jaco_(eVals, eVecs, 40);
968 minVal = eVals.
at(1);
969 for (
int i = 2; i <= size; i++ ) {
970 if ( eVals.
at(i) < minVal ) {
971 minVal = eVals.
at(i);
972 maxDamage = ( ( eVals.
at(1) + eVals.
at(2) + eVals.
at(3) ) - eVals.
at(i) ) / 2;
975 eps = maxDamage - damageThreshold;
981 }
while ( fabs(eps) > 1.0e-15 );
991 double alpha_a, alpha_b, newAlpha, eps, aux = 0;
992 FloatMatrix deltaD, positiveStrainTensorSquared, resultingDamageTensor, eVecs;
998 newAlpha = ( alpha_a + alpha_b ) / 2;
999 positiveStrainTensorSquared.
beProductOf(positiveStrainTensor, positiveStrainTensor);
1000 for (
int i = 1; i <= 3; i++ ) {
1001 aux = aux + vec3.
at(i) * ( positiveStrainTensorSquared.
at(i, 1) * vec3.
at(1) + positiveStrainTensorSquared.
at(i, 2) * vec3.
at(2) + positiveStrainTensorSquared.
at(i, 3) * vec3.
at(3) );
1004 deltaD.
times(newAlpha * deltaLambda * aux);
1006 resultingDamageTensor = tempDamageTensor;
1007 resultingDamageTensor.
add(deltaD);
1009 resultingDamageTensor.
jaco_(eVals, eVecs, 20);
1010 eps = eVals.
at(1) + eVals.
at(2) + eVals.
at(3) - 3 * damageThreshold;
1014 newAlpha = ( alpha_a + alpha_b ) / 2;
1016 deltaD.
times(newAlpha * deltaLambda * aux);
1018 resultingDamageTensor = tempDamageTensor;
1019 resultingDamageTensor.
add(deltaD);
1021 resultingDamageTensor.
jaco_(eVals, eVecs, 20);
1022 eps = eVals.
at(1) + eVals.
at(2) + eVals.
at(3) - 3 * damageThreshold;
1024 if ( cont == 100 ) {
1029 newAlpha = ( alpha_a + alpha_b ) / 2;
1031 deltaD.
times(newAlpha * deltaLambda * aux);
1033 resultingDamageTensor = tempDamageTensor;
1034 resultingDamageTensor.
add(deltaD);
1036 resultingDamageTensor.
jaco_(eVals, eVecs, 20);
1037 eps = eVals.
at(1) + eVals.
at(2) + eVals.
at(3) - 3 * damageThreshold;
1039 if ( cont == 100 ) {
1043 }
while ( fabs(eps) > 1.0e-15 );
1052 for (
int i = 1; i <= nRows; i++ ) {
1053 for (
int j = 1; j <= nRows; j++ ) {
1054 if ( fabs( matrix.
at(i, j) - matrix.
at(j, i) ) < 1.e-6 ) {
1071 for (
int i = 1; i <= nRows; i++ ) {
1072 for (
int j = 1; j <= nRows; j++ ) {
1073 if ( matrix.
at(i, j) != matrix.
at(j, i) ) {
1074 double Aux = ( matrix.
at(i, j) + matrix.
at(j, i) ) / 2.0;
1075 matrix.
at(i, j) = Aux;
1076 matrix.
at(j, i) = Aux;
1088 double Dc = 1.00, trD = 0;
1091 if ( ( strainTensor.
at(1, 1) + strainTensor.
at(2, 2) + strainTensor.
at(3, 3) ) < 0 ) {
1092 trD = tempDamageTensor.
at(1, 1) + tempDamageTensor.
at(2, 2) + tempDamageTensor.
at(3, 3);
1097 if ( ( tempDamageTensor.
at(1, 1) + tempDamageTensor.
at(2, 2) + tempDamageTensor.
at(3, 3) ) >= 1 ) {
1100 trD = tempDamageTensor.
at(1, 1) + tempDamageTensor.
at(2, 2) + tempDamageTensor.
at(3, 3);
1106 if ( ( strainTensor.
at(1, 1) + strainTensor.
at(2, 2) + strainTensor.
at(3, 3) ) < 0 ) {
1107 trD = tempDamageTensor.
at(1, 1) + tempDamageTensor.
at(2, 2) + tempDamageTensor.
at(3, 3);
1123 double Dc = 1.00, trD = 0;
1124 double factor = 0.0;
1125 trD = tempDamageTensor.
at(1, 1) + tempDamageTensor.
at(2, 2) + tempDamageTensor.
at(3, 3);
1127 if ( tempFlag == 0 ) {
1128 if ( ( strainTensor.
at(1, 1) + strainTensor.
at(2, 2) + strainTensor.
at(3, 3) ) < 0 ) {
1130 if ( ( 1.0 - trD ) < tempStoredFactor ) {
1133 if ( ( 1.0 - trD ) <= ( 1.0 - Dc ) ) {
1139 factor = tempStoredFactor;
1144 if ( tempFlag == 1 ) {
1145 if ( ( strainTensor.
at(1, 1) + strainTensor.
at(2, 2) + strainTensor.
at(3, 3) ) < 0 ) {
1164 if ( mode == ElasticStiffness ) {
1174 strainTensor.
resize(3, 3);
1175 strainTensor.
zero();
1176 strainTensor.
at(1, 1) = reducedTotalStrainVector.
at(1);
1177 strainTensor.
at(2, 2) = reducedTotalStrainVector.
at(2);
1178 strainTensor.
at(3, 3) = reducedTotalStrainVector.
at(3);
1179 strainTensor.
at(2, 3) = reducedTotalStrainVector.
at(4) / 2.0;
1180 strainTensor.
at(3, 2) = reducedTotalStrainVector.
at(4) / 2.0;
1181 strainTensor.
at(1, 3) = reducedTotalStrainVector.
at(5) / 2.0;
1182 strainTensor.
at(3, 1) = reducedTotalStrainVector.
at(5) / 2.0;
1183 strainTensor.
at(1, 2) = reducedTotalStrainVector.
at(6) / 2.0;
1184 strainTensor.
at(2, 1) = reducedTotalStrainVector.
at(6) / 2.0;
1188 for (
int j = 4; j <= 6; j++ ) {
1189 for (
int i = 1; i <= 6; i++ ) {
1190 answer.
at(i, j) = answer.
at(i, j) / 2.0;
1201 if ( mode == ElasticStiffness ) {
1209 damageTensor.
resize(3, 3);
1210 damageTensor.
zero();
1216 secantOperator.
resize(6, 6);
1218 double C11, C12, C13, C16, C21, C22, C23, C26, C61, C62, C63, C66, q, r, s;
1219 C11 = secantOperator.
at(1, 1);
1220 C12 = secantOperator.
at(1, 2);
1221 C13 = secantOperator.
at(1, 3);
1222 C16 = secantOperator.
at(1, 6);
1223 C21 = secantOperator.
at(2, 1);
1224 C22 = secantOperator.
at(2, 2);
1225 C23 = secantOperator.
at(2, 3);
1226 C26 = secantOperator.
at(2, 6);
1227 C61 = secantOperator.
at(6, 1);
1228 C62 = secantOperator.
at(6, 2);
1229 C63 = secantOperator.
at(6, 3);
1230 C66 = secantOperator.
at(6, 6);
1237 if ( ( stressVector.
at(1) + stressVector.
at(2) ) < 1.0e-5 ) {
1240 q = strainTensor.
at(3, 3) / ( stressVector.
at(1) + stressVector.
at(2) );
1244 r = 1. / ( 1. - C13 * q );
1245 s = 1. / ( 1. - q * C23 - C23 * q * q * r * C13 );
1247 answer.
at(2, 1) = s * ( C21 + C11 * C23 * q * r );
1248 answer.
at(2, 2) = s * ( C22 + C12 * C23 * q * r );
1249 answer.
at(2, 3) = s * ( C26 + C16 * C23 * q * r ) * 1. / 2.;
1250 answer.
at(1, 1) = r * ( C11 + C13 * q * answer.
at(2, 1) );
1251 answer.
at(1, 2) = r * ( C12 + C13 * q * answer.
at(2, 2) );
1252 answer.
at(1, 3) = r * ( C16 + C13 * q * answer.
at(2, 3) ) * 1 / 2;
1253 answer.
at(3, 1) = C61 + C63 * q * ( answer.
at(1, 1) + answer.
at(2, 1) );
1254 answer.
at(3, 2) = C62 + C63 * q * ( answer.
at(1, 2) + answer.
at(2, 2) );
1255 answer.
at(3, 3) = ( C66 + C63 * q * ( answer.
at(1, 3) + answer.
at(2, 3) ) ) * 1. / 2.;
1268 if ( mode == ElasticStiffness ) {
1272 if ( ( strain.
at(1) + strain.
at(2) + strain.
at(3) ) > 0 ) {
1287 double outOfPlaneStrain;
1289 B.
at(1, 1) = 1. - damageTensor.
at(1, 1);
1290 B.
at(1, 2) = 0. - damageTensor.
at(1, 2);
1291 B.
at(2, 1) = 0. - damageTensor.
at(2, 1);
1292 B.
at(2, 2) = 1. - damageTensor.
at(2, 2);
1297 Auxiliar.
at(1, 1) = damageTensor.
at(1, 1);
1298 Auxiliar.
at(2, 2) = damageTensor.
at(2, 2);
1299 Auxiliar.
at(1, 2) = damageTensor.
at(1, 2);
1300 Auxiliar.
at(2, 1) = damageTensor.
at(2, 1);
1302 Auxiliar.
jaco_(eVals, eVecs, 40);
1305 inPlaneStrain.
resize(2, 2);
1306 inPlaneStrain.
at(1, 1) = reducedTotalStrainVector.
at(1);
1307 inPlaneStrain.
at(2, 2) = reducedTotalStrainVector.
at(2);
1308 inPlaneStrain.
at(1, 2) = reducedTotalStrainVector.
at(3) / 2.0;
1309 inPlaneStrain.
at(2, 1) = reducedTotalStrainVector.
at(3) / 2.0;
1311 double term1, term2, term3, B1, B2, Bz, trD, h, epsilon11, epsilon22;
1312 B1 = 1.0 - eVals.
at(1);
1313 B2 = 1.0 - eVals.
at(2);
1314 Bz = 1. - damageTensor.
at(3, 3);
1318 vector1.
at(1) = eVecs.
at(1, 1);
1319 vector1.
at(2) = eVecs.
at(2, 1);
1320 vector2.
at(1) = eVecs.
at(1, 2);
1321 vector2.
at(2) = eVecs.
at(2, 2);
1323 epsilon11 = vector1.
at(1) * auxVector.
at(1) + vector1.
at(2) * auxVector.
at(2);
1325 epsilon22 = vector2.
at(1) * auxVector.
at(1) + vector2.
at(2) * auxVector.
at(2);
1326 trD = damageTensor.
at(1, 1) + damageTensor.
at(2, 2) + damageTensor.
at(3, 3);
1329 term1 = 3. * Bz * B1 * ( 1. - 2. *
nu ) - ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1330 term2 = 3. * Bz * B2 * ( 1. - 2. *
nu ) - ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1331 term3 = 3. * Bz * ( 1. - 2. *
nu ) * ( B1 + B2 ) + ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1332 if ( Bz < 0.00001 ) {
1333 outOfPlaneStrain = -( epsilon11 + epsilon22 );
1335 outOfPlaneStrain = ( term1 * epsilon11 + term2 * epsilon22 ) / term3;
1341 trStrain = inPlaneStrain.
at(1, 1) + inPlaneStrain.
at(2, 2) + outOfPlaneStrain;
1343 if ( trStrain < 0.0 ) {
1345 term1 = 3. * Bz * B1 * ( 1. - 2. *
nu ) - ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1346 term2 = 3. * Bz * B2 * ( 1. - 2. *
nu ) - ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1347 term3 = 3. * Bz * ( 1. - 2. *
nu ) * ( B1 + B2 ) + ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1348 if ( Bz < 0.00001 ) {
1349 outOfPlaneStrain = -( epsilon11 + epsilon22 );
1351 outOfPlaneStrain = ( term1 * epsilon11 + term2 * epsilon22 ) / term3;
1356 answer.
at(1, 1) = inPlaneStrain.
at(1, 1);
1357 answer.
at(1, 2) = inPlaneStrain.
at(1, 2);
1358 answer.
at(2, 1) = inPlaneStrain.
at(2, 1);
1359 answer.
at(2, 2) = inPlaneStrain.
at(2, 2);
1360 answer.
at(3, 3) = outOfPlaneStrain;
1372 Auxiliar.
at(1, 1) = damageTensor.
at(1, 1);
1373 Auxiliar.
at(2, 2) = damageTensor.
at(2, 2);
1374 Auxiliar.
at(1, 2) = damageTensor.
at(1, 2);
1375 Auxiliar.
at(2, 1) = damageTensor.
at(2, 1);
1376 Auxiliar.
jaco_(eVals, eVecs, 40);
1377 inPlaneStrain.
resize(2, 2);
1378 inPlaneStrain.
at(1, 1) = reducedTotalStrainVector.
at(1);
1379 inPlaneStrain.
at(2, 2) = reducedTotalStrainVector.
at(2);
1380 inPlaneStrain.
at(1, 2) = reducedTotalStrainVector.
at(3) / 2.0;
1381 inPlaneStrain.
at(2, 1) = reducedTotalStrainVector.
at(3) / 2.0;
1382 double term1, term2, termZ, B1, B2, Bz, trD, h, epsilon11, epsilon22;
1383 B1 = 1.0 - eVals.
at(1);
1384 B2 = 1.0 - eVals.
at(2);
1385 Bz = 1. - damageTensor.
at(3, 3);
1389 vector1.
at(1) = eVecs.
at(1, 1);
1390 vector1.
at(2) = eVecs.
at(2, 1);
1391 vector2.
at(1) = eVecs.
at(1, 2);
1392 vector2.
at(2) = eVecs.
at(2, 2);
1394 epsilon11 = vector1.
at(1) * auxVector.
at(1) + vector1.
at(2) * auxVector.
at(2);
1396 epsilon22 = vector2.
at(1) * auxVector.
at(1) + vector2.
at(2) * auxVector.
at(2);
1399 Estar =
E / ( ( 1. +
nu ) * ( 1. - 2. *
nu ) );
1400 if ( ( epsilon11 + epsilon22 + epsilonZ ) >= 0. ) {
1405 term1 = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) - 3. * Bz * B1 * ( 1. - 2. *
nu );
1406 term2 = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) - 3. * Bz * B2 * ( 1. - 2. *
nu );
1407 termZ = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) + 3. * Bz * ( 1. - 2. *
nu ) * ( B1 + B2 );
1409 answer = ( Estar / ( 3. * ( B1 + B2 + Bz ) ) ) * ( epsilon11 * term1 + epsilon22 * term2 + epsilonZ * termZ );
1413 double B1, B2, Bz, eps11, eps22, Estar, term1, term2, termZ, trD, h;
1414 Estar=
E / ((1. +
nu)*(1. - 2. *
nu));
1416 double eVal1, eVal2, aux1, aux2;
1417 aux1 = (damageTensor.
at(1,1) + damageTensor.
at(2,2))/2.0;
1418 aux2 = sqrt(pow((damageTensor.
at(1,1) - damageTensor.
at(2,2)) / 2. , 2.) + damageTensor.
at(1,2) * damageTensor.
at(2,1));
1419 eVal1 = aux1 + aux2 ;
1420 eVal2 = aux1 - aux2 ;
1423 Bz = 1. - damageTensor.
at(3, 3);
1424 eps11 = reducedTotalStrainVector.
at(1);
1425 eps22 = reducedTotalStrainVector.
at(2);
1426 if ((eps11 + eps22 + epsZ)>=0.) {
1432 term1 = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) - 3. * Bz * B1 * ( 1. - 2. *
nu ) ;
1433 term2 = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) - 3. * Bz * B2 * ( 1. - 2. *
nu ) ;
1434 termZ = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) + 3. * Bz * ( 1. - 2. *
nu ) * ( B1 + B2 ) ;
1436 answer = (Estar / (3. * (B1 + B2 + Bz))) * (eps11 * term1 + eps22 * term2 + epsZ * termZ);
1437 Estar = Estar + 0.0;
1443 const FloatArray &reducedTotalStrainVector,
double equivStrain,
1461 if ( equivStrain <= Kappa ) {
1466 Kappa = equivStrain;
1469 FloatMatrix eVecs, strainTensor, positiveStrainTensor, positiveStrainTensorSquared, tempDamageTensor0;
1476 strainTensor.
resize(3, 3);
1477 strainTensor.
zero();
1478 if ( mode == _PlaneStress ) {
1482 strainTensor.
at(1, 1) = reducedTotalStrainVector.
at(1);
1483 strainTensor.
at(2, 2) = reducedTotalStrainVector.
at(2);
1484 strainTensor.
at(3, 3) = reducedTotalStrainVector.
at(3);
1485 strainTensor.
at(2, 3) = reducedTotalStrainVector.
at(4) / 2.0;
1486 strainTensor.
at(3, 2) = reducedTotalStrainVector.
at(4) / 2.0;
1487 strainTensor.
at(1, 3) = reducedTotalStrainVector.
at(5) / 2.0;
1488 strainTensor.
at(3, 1) = reducedTotalStrainVector.
at(5) / 2.0;
1489 strainTensor.
at(1, 2) = reducedTotalStrainVector.
at(6) / 2.0;
1490 strainTensor.
at(2, 1) = reducedTotalStrainVector.
at(6) / 2.0;
1494 strainTensor.
jaco_(eVals, eVecs, 40);
1495 for (
int i = 1; i <= 3; i++ ) {
1496 if ( eVals.
at(i) < 0 ) {
1501 positiveStrainTensor.
resize(3, 3);
1502 for (
int i = 1; i <= 3; i++ ) {
1503 for (
int j = 1; j <= 3; j++ ) {
1504 positiveStrainTensor.
at(i, j) = eVals.
at(1) * eVecs.
at(i, 1) * eVecs.
at(j, 1) + eVals.
at(2) * eVecs.
at(i, 2) * eVecs.
at(j, 2) + eVals.
at(3) * eVecs.
at(i, 3) * eVecs.
at(j, 3);
1508 positiveStrainTensorSquared.
beProductOf(positiveStrainTensor, positiveStrainTensor);
1511 double traceD = Dn.
at(1, 1) + Dn.
at(2, 2) + Dn.
at(3, 3);
1515 deltaLambda = ( traceTempD - traceD ) / equivStrain / equivStrain;
1518 deltaD = positiveStrainTensorSquared;
1519 deltaD.
times(deltaLambda);
1522 tempDamageTensor0 = Dn;
1523 tempDamageTensor0.
add(deltaD);
1531 tempDamageTensor0.
jaco_(eVals, eVecs, 20);
1532 if ( ( eVals.
at(1) > ( Dc * 1.001 ) ) || ( eVals.
at(2) > ( Dc * 1.001 ) ) || ( eVals.
at(3) > ( Dc * 1.001 ) ) ) {
1533 double alpha = 0, deltaLambda1 = 0, Aux1 = 0, Aux2 = 0, Aux3 = 0;
1534 FloatMatrix deltaD1(3, 3), positiveStrainTensorSquared(3, 3), tempDamageTensor1(3, 3), deltaD2(3, 3), N11(3, 3), N12(3, 3), N13(3, 3), N12sym(3, 3), N13sym(3, 3), projPosStrainTensor(3, 3);
1535 FloatArray auxVals(3), auxVec1(3), auxVec2(3), auxVec3(3);
1538 alpha =
obtainAlpha1(Dn, deltaLambda, positiveStrainTensor, Dc);
1541 positiveStrainTensorSquared.
beProductOf(positiveStrainTensor, positiveStrainTensor);
1542 deltaD1 = positiveStrainTensorSquared;
1543 deltaD1.
times(alpha * deltaLambda);
1545 tempDamageTensor1 = Dn;
1546 tempDamageTensor1.
add(deltaD1);
1554 tempDamageTensor1.jaco_(eVals, eVecs, 40);
1558 if ( eVals.
at(1) >= eVals.
at(2) && eVals.
at(1) >= eVals.
at(3) ) {
1559 auxVals.at(1) = eVals.
at(1);
1560 auxVec1.at(1) = eVecs.
at(1, 1);
1561 auxVec1.at(2) = eVecs.
at(2, 1);
1562 auxVec1.at(3) = eVecs.
at(3, 1);
1563 auxVals.at(2) = eVals.
at(2);
1564 auxVec2.at(1) = eVecs.
at(1, 2);
1565 auxVec2.at(2) = eVecs.
at(2, 2);
1566 auxVec2.at(3) = eVecs.
at(3, 2);
1567 auxVals.at(3) = eVals.
at(3);
1568 auxVec3.
at(1) = eVecs.
at(1, 3);
1569 auxVec3.
at(2) = eVecs.
at(2, 3);
1570 auxVec3.
at(3) = eVecs.
at(3, 3);
1571 }
else if ( eVals.
at(2) >= eVals.
at(1) && eVals.
at(2) >= eVals.
at(3) ) {
1572 auxVals.at(1) = eVals.
at(2);
1573 auxVec1.at(1) = eVecs.
at(1, 2);
1574 auxVec1.at(2) = eVecs.
at(2, 2);
1575 auxVec1.at(3) = eVecs.
at(3, 2);
1576 auxVals.at(2) = eVals.
at(1);
1577 auxVec2.at(1) = eVecs.
at(1, 1);
1578 auxVec2.at(2) = eVecs.
at(2, 1);
1579 auxVec2.at(3) = eVecs.
at(3, 1);
1580 auxVals.at(3) = eVals.
at(3);
1581 auxVec3.
at(1) = eVecs.
at(1, 3);
1582 auxVec3.
at(2) = eVecs.
at(2, 3);
1583 auxVec3.
at(3) = eVecs.
at(3, 3);
1585 auxVals.at(1) = eVals.
at(3);
1586 auxVec1.at(1) = eVecs.
at(1, 3);
1587 auxVec1.at(2) = eVecs.
at(2, 3);
1588 auxVec1.at(3) = eVecs.
at(3, 3);
1589 auxVals.at(2) = eVals.
at(2);
1590 auxVec2.at(1) = eVecs.
at(1, 2);
1591 auxVec2.at(2) = eVecs.
at(2, 2);
1592 auxVec2.at(3) = eVecs.
at(3, 2);
1593 auxVals.at(3) = eVals.
at(1);
1594 auxVec3.
at(1) = eVecs.
at(1, 1);
1595 auxVec3.
at(2) = eVecs.
at(2, 1);
1596 auxVec3.
at(3) = eVecs.
at(3, 1);
1600 N11.beDyadicProductOf(auxVec1, auxVec1);
1601 N12.beDyadicProductOf(auxVec1, auxVec2);
1602 for (
int i = 1; i <= 3; i++ ) {
1603 for (
int j = 1; j <= 3; j++ ) {
1604 N12sym.at(i, j) = 0.5 * ( N12.at(i, j) + N12.at(j, i) );
1609 N13.beDyadicProductOf(auxVec1, auxVec3);
1610 for (
int i = 1; i <= 3; i++ ) {
1611 for (
int j = 1; j <= 3; j++ ) {
1612 N13sym.at(i, j) = 0.5 * ( N13.at(i, j) + N13.at(j, i) );
1617 for (
int i = 1; i <= 3; i++ ) {
1618 Aux1 = Aux1 + auxVec1.at(i) * ( positiveStrainTensorSquared.
at(i, 1) * auxVec1.at(1) + positiveStrainTensorSquared.
at(i, 2) * auxVec1.at(2) + positiveStrainTensorSquared.
at(i, 3) * auxVec1.at(3) );
1619 Aux2 = Aux2 + auxVec2.at(i) * ( positiveStrainTensorSquared.
at(i, 1) * auxVec1.at(1) + positiveStrainTensorSquared.
at(i, 2) * auxVec1.at(2) + positiveStrainTensorSquared.
at(i, 3) * auxVec1.at(3) );
1620 Aux3 = Aux3 + auxVec3.
at(i) * ( positiveStrainTensorSquared.
at(i, 1) * auxVec1.at(1) + positiveStrainTensorSquared.
at(i, 2) * auxVec1.at(2) + positiveStrainTensorSquared.
at(i, 3) * auxVec1.at(3) );
1623 N12sym.times(2 * Aux2);
1624 N13sym.times(2 * Aux3);
1627 projPosStrainTensor = positiveStrainTensorSquared;
1629 projPosStrainTensor.
subtract(N12sym);
1630 projPosStrainTensor.
subtract(N13sym);
1633 if ( ( projPosStrainTensor.
at(1, 1) + projPosStrainTensor.
at(2, 2) + projPosStrainTensor.
at(3, 3) ) < traceTempD * 1e-10 ) {
1636 deltaLambda1 = ( traceTempD - ( tempDamageTensor1.at(1, 1) + tempDamageTensor1.at(2, 2) + tempDamageTensor1.at(3, 3) ) ) / ( projPosStrainTensor.
at(1, 1) + projPosStrainTensor.
at(2, 2) + projPosStrainTensor.
at(3, 3) );
1639 deltaD2 = projPosStrainTensor;
1640 deltaD2.
times(deltaLambda1);
1642 tempDamageTensor1.add(deltaD2);
1647 tempDamageTensor1.jaco_(eVals, eVecs, 40);
1648 if ( ( eVals.
at(1) > ( Dc * 1.001 ) ) || ( eVals.
at(2) > ( Dc * 1.001 ) ) || ( eVals.
at(3) > ( Dc * 1.001 ) ) ) {
1649 FloatMatrix deltaD3(3, 3), projPosStrainTensor_new(3, 3), tempDamageTensor2(3, 3), deltaD4(3, 3);
1651 double alpha2 = 0, deltaLambda2 = 0, Aux4 = 0;
1654 tempDamageTensor1 = Dn;
1655 tempDamageTensor1.
add(deltaD1);
1658 alpha2 =
obtainAlpha2(tempDamageTensor1, deltaLambda1, positiveStrainTensor, projPosStrainTensor, Dc);
1660 deltaD3.times(alpha2);
1661 tempDamageTensor2 = tempDamageTensor1;
1662 tempDamageTensor2.add(deltaD3);
1665 tempDamageTensor2.jaco_(eVals, eVecs, 40);
1666 if ( eVals.
at(1) <= eVals.
at(2) && eVals.
at(1) <= eVals.
at(3) ) {
1668 vec3.
at(1) = eVecs.
at(1, 1);
1669 vec3.
at(2) = eVecs.
at(2, 1);
1670 vec3.
at(3) = eVecs.
at(3, 1);
1671 }
else if ( eVals.
at(2) <= eVals.
at(1) && eVals.
at(2) <= eVals.
at(3) ) {
1673 vec3.
at(1) = eVecs.
at(1, 2);
1674 vec3.
at(2) = eVecs.
at(2, 2);
1675 vec3.
at(3) = eVecs.
at(3, 2);
1678 vec3.
at(1) = eVecs.
at(1, 3);
1679 vec3.
at(2) = eVecs.
at(2, 3);
1680 vec3.
at(3) = eVecs.
at(3, 3);
1684 for (
int i = 1; i <= 3; i++ ) {
1685 Aux4 = Aux4 + vec3.
at(i) * ( positiveStrainTensorSquared.
at(i, 1) * vec3.
at(1) + positiveStrainTensorSquared.
at(i, 2) * vec3.
at(2) + positiveStrainTensorSquared.
at(i, 3) * vec3.
at(3) );
1687 projPosStrainTensor_new.beDyadicProductOf(vec3, vec3);
1689 projPosStrainTensor_new.times(Aux4);
1692 if ( ( projPosStrainTensor_new.at(1, 1) + projPosStrainTensor_new.at(2, 2) + projPosStrainTensor_new.at(3, 3) ) < traceTempD * 1e-10 ) {
1695 deltaLambda2 = ( traceTempD - ( tempDamageTensor2.at(1, 1) + tempDamageTensor2.at(2, 2) + tempDamageTensor2.at(3, 3) ) ) / ( projPosStrainTensor_new.at(1, 1) + projPosStrainTensor_new.at(2, 2) + projPosStrainTensor_new.at(3, 3) );
1697 deltaD4 = projPosStrainTensor_new;
1698 deltaD4.
times(deltaLambda2);
1699 tempDamageTensor2.add(deltaD4);
1705 tempDamageTensor2.jaco_(eVals, eVecs, 40);
1706 if ( ( eVals.
at(1) > ( Dc * 1.001 ) ) || ( eVals.
at(2) > ( Dc * 1.001 ) ) || ( eVals.
at(3) > ( Dc * 1.001 ) ) ) {
1709 tempDamageTensor2 = Dn;
1710 tempDamageTensor2.
add(deltaD1);
1711 tempDamageTensor2.add(deltaD3);
1712 alpha3 =
obtainAlpha3(tempDamageTensor2, deltaLambda2, positiveStrainTensor, vec3, Dc);
1714 deltaD5.
times(alpha3);
1715 tempDamageTensor3 = tempDamageTensor2;
1716 tempDamageTensor3.
add(deltaD5);
1717 tempDamageTensor = tempDamageTensor3;
1718 tempDamageTensor3.
jaco_(eVals, eVecs, 40);
1719 if ( ( eVals.
at(1) > ( Dc * 1.001 ) ) || ( eVals.
at(2) > ( Dc * 1.001 ) ) || ( eVals.
at(3) > ( Dc * 1.001 ) ) ) {
1720 tempDamageTensor3.
zero();
1721 for (
int i = 1; i <= 3; i++ ) {
1722 if ( eVals.
at(i) > Dc * 1.001 ) {
1726 for (
int i = 1; i <= 3; i++ ) {
1727 for (
int j = 1; j <= 3; j++ ) {
1728 tempDamageTensor3.
at(i, j) = eVals.
at(1) * eVecs.
at(i, 1) * eVecs.
at(j, 1) + eVals.
at(2) * eVecs.
at(i, 2) * eVecs.
at(j, 2) + eVals.
at(3) * eVecs.
at(i, 3) * eVecs.
at(j, 3);
1738 tempDamageTensor = tempDamageTensor3;
1740 tempDamageTensor = tempDamageTensor2;
1743 tempDamageTensor = tempDamageTensor1;
1746 tempDamageTensor = tempDamageTensor0;
1748 answer = tempDamageTensor;
1763 G =
E / ( 2.0 * ( 1.0 +
nu ) );
1764 K =
E / ( 3.0 * ( 1.0 - 2.0 *
nu ) );
1768 if ( fabs(3. - traceD) < 0.001 ) {
1771 Aux = ( 1. / ( 3. - traceD ) );
1777 ImD.
at(1, 1) = ImD.
at(2, 2) = ImD.
at(3, 3) = 1.0;
1782 ImD.
jaco_(eVals, eVecs, 40);
1784 for (
int i = 1; i <= 3; i++ ) {
1785 for (
int j = 1; j <= 3; j++ ) {
1786 for (
int k = 1; k <= 3; k++ ) {
1787 if ( eVals.
at(k) < 0.0 ) {
1791 sqrtImD.
at(i, j) = sqrt( eVals.
at(1) ) * eVecs.
at(i, 1) * eVecs.
at(j, 1) + sqrt( eVals.
at(2) ) * eVecs.
at(i, 2) * eVecs.
at(j, 2) + sqrt( eVals.
at(3) ) * eVecs.
at(i, 3) * eVecs.
at(j, 3);
1796 struct fourthOrderTensor
1809 fourthOrderTensor Block1, Block2, Block3, secantOperator;
1812 Imatrix.
at(1, 1) = Imatrix.
at(2, 2) = Imatrix.
at(3, 3) = 1.0;
1815 Block1.Matrix_11kl.resize(3, 3);
1816 Block1.Matrix_12kl.resize(3, 3);
1817 Block1.Matrix_13kl.resize(3, 3);
1818 Block1.Matrix_21kl.resize(3, 3);
1819 Block1.Matrix_22kl.resize(3, 3);
1820 Block1.Matrix_23kl.resize(3, 3);
1821 Block1.Matrix_31kl.resize(3, 3);
1822 Block1.Matrix_32kl.resize(3, 3);
1823 Block1.Matrix_33kl.resize(3, 3);
1824 Block2.Matrix_11kl.resize(3, 3);
1825 Block2.Matrix_12kl.resize(3, 3);
1826 Block2.Matrix_13kl.resize(3, 3);
1827 Block2.Matrix_21kl.resize(3, 3);
1828 Block2.Matrix_22kl.resize(3, 3);
1829 Block2.Matrix_23kl.resize(3, 3);
1830 Block2.Matrix_31kl.resize(3, 3);
1831 Block2.Matrix_32kl.resize(3, 3);
1832 Block2.Matrix_33kl.resize(3, 3);
1833 Block3.Matrix_11kl.resize(3, 3);
1834 Block3.Matrix_12kl.resize(3, 3);
1835 Block3.Matrix_13kl.resize(3, 3);
1836 Block3.Matrix_21kl.resize(3, 3);
1837 Block3.Matrix_22kl.resize(3, 3);
1838 Block3.Matrix_23kl.resize(3, 3);
1839 Block3.Matrix_31kl.resize(3, 3);
1840 Block3.Matrix_32kl.resize(3, 3);
1841 Block3.Matrix_33kl.resize(3, 3);
1842 secantOperator.Matrix_11kl.resize(3, 3);
1843 secantOperator.Matrix_12kl.resize(3, 3);
1844 secantOperator.Matrix_13kl.resize(3, 3);
1845 secantOperator.Matrix_21kl.resize(3, 3);
1846 secantOperator.Matrix_22kl.resize(3, 3);
1847 secantOperator.Matrix_23kl.resize(3, 3);
1848 secantOperator.Matrix_31kl.resize(3, 3);
1849 secantOperator.Matrix_32kl.resize(3, 3);
1850 secantOperator.Matrix_33kl.resize(3, 3);
1852 for (
int k = 1; k <= 3; k++ ) {
1853 for (
int l = 1; l <= 3; l++ ) {
1855 Block1.Matrix_11kl.at(k, l) = sqrtImD.
at(1, k) * sqrtImD.
at(1, l);
1856 Block1.Matrix_12kl.at(k, l) = sqrtImD.
at(1, k) * sqrtImD.
at(2, l);
1857 Block1.Matrix_13kl.at(k, l) = sqrtImD.
at(1, k) * sqrtImD.
at(3, l);
1858 Block1.Matrix_21kl.at(k, l) = sqrtImD.
at(2, k) * sqrtImD.
at(1, l);
1859 Block1.Matrix_22kl.at(k, l) = sqrtImD.
at(2, k) * sqrtImD.
at(2, l);
1860 Block1.Matrix_23kl.at(k, l) = sqrtImD.
at(2, k) * sqrtImD.
at(3, l);
1861 Block1.Matrix_31kl.at(k, l) = sqrtImD.
at(3, k) * sqrtImD.
at(1, l);
1862 Block1.Matrix_32kl.at(k, l) = sqrtImD.
at(3, k) * sqrtImD.
at(2, l);
1863 Block1.Matrix_33kl.at(k, l) = sqrtImD.
at(3, k) * sqrtImD.
at(3, l);
1865 Block2.Matrix_11kl.at(k, l) = ImD.
at(1, 1) * ImD.
at(k, l) * Aux;
1866 Block2.Matrix_12kl.at(k, l) = ImD.
at(1, 2) * ImD.
at(k, l) * Aux;
1867 Block2.Matrix_13kl.at(k, l) = ImD.
at(1, 3) * ImD.
at(k, l) * Aux;
1868 Block2.Matrix_21kl.at(k, l) = ImD.
at(2, 1) * ImD.
at(k, l) * Aux;
1869 Block2.Matrix_22kl.at(k, l) = ImD.
at(2, 2) * ImD.
at(k, l) * Aux;
1870 Block2.Matrix_23kl.at(k, l) = ImD.
at(2, 3) * ImD.
at(k, l) * Aux;
1871 Block2.Matrix_31kl.at(k, l) = ImD.
at(3, 1) * ImD.
at(k, l) * Aux;
1872 Block2.Matrix_32kl.at(k, l) = ImD.
at(3, 2) * ImD.
at(k, l) * Aux;
1873 Block2.Matrix_33kl.at(k, l) = ImD.
at(3, 3) * ImD.
at(k, l) * Aux;
1875 Block3.Matrix_11kl.at(k, l) = Imatrix.
at(1, 1) * Imatrix.
at(k, l);
1876 Block3.Matrix_12kl.at(k, l) = Imatrix.
at(1, 2) * Imatrix.
at(k, l);
1877 Block3.Matrix_13kl.at(k, l) = Imatrix.
at(1, 3) * Imatrix.
at(k, l);
1878 Block3.Matrix_21kl.at(k, l) = Imatrix.
at(2, 1) * Imatrix.
at(k, l);
1879 Block3.Matrix_22kl.at(k, l) = Imatrix.
at(2, 2) * Imatrix.
at(k, l);
1880 Block3.Matrix_23kl.at(k, l) = Imatrix.
at(2, 3) * Imatrix.
at(k, l);
1881 Block3.Matrix_31kl.at(k, l) = Imatrix.
at(3, 1) * Imatrix.
at(k, l);
1882 Block3.Matrix_32kl.at(k, l) = Imatrix.
at(3, 2) * Imatrix.
at(k, l);
1883 Block3.Matrix_33kl.at(k, l) = Imatrix.
at(3, 3) * Imatrix.
at(k, l);
1887 if ( ( strainTensor.
at(1, 1) + strainTensor.
at(2, 2) + strainTensor.
at(3, 3) ) > 0.0 ) {
1888 for (
int k = 1; k <= 3; k++ ) {
1889 for (
int l = 1; l <= 3; l++ ) {
1890 secantOperator.Matrix_11kl.at(k, l) = 2 * G * ( Block1.Matrix_11kl.at(k, l) - Block2.Matrix_11kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_11kl.at(k, l);
1891 secantOperator.Matrix_12kl.at(k, l) = 2 * G * ( Block1.Matrix_12kl.at(k, l) - Block2.Matrix_12kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_12kl.at(k, l);
1892 secantOperator.Matrix_13kl.at(k, l) = 2 * G * ( Block1.Matrix_13kl.at(k, l) - Block2.Matrix_13kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_13kl.at(k, l);
1893 secantOperator.Matrix_21kl.at(k, l) = 2 * G * ( Block1.Matrix_21kl.at(k, l) - Block2.Matrix_21kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_21kl.at(k, l);
1894 secantOperator.Matrix_22kl.at(k, l) = 2 * G * ( Block1.Matrix_22kl.at(k, l) - Block2.Matrix_22kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_22kl.at(k, l);
1895 secantOperator.Matrix_23kl.at(k, l) = 2 * G * ( Block1.Matrix_23kl.at(k, l) - Block2.Matrix_23kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_23kl.at(k, l);
1896 secantOperator.Matrix_31kl.at(k, l) = 2 * G * ( Block1.Matrix_31kl.at(k, l) - Block2.Matrix_31kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_31kl.at(k, l);
1897 secantOperator.Matrix_32kl.at(k, l) = 2 * G * ( Block1.Matrix_32kl.at(k, l) - Block2.Matrix_32kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_32kl.at(k, l);
1898 secantOperator.Matrix_33kl.at(k, l) = 2 * G * ( Block1.Matrix_33kl.at(k, l) - Block2.Matrix_33kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_33kl.at(k, l);
1903 for (
int k = 1; k <= 3; k++ ) {
1904 for (
int l = 1; l <= 3; l++ ) {
1905 secantOperator.Matrix_11kl.at(k, l) = 2 * G * ( Block1.Matrix_11kl.at(k, l) - Block2.Matrix_11kl.at(k, l) ) + K *Block3.Matrix_11kl.at(k, l);
1906 secantOperator.Matrix_12kl.at(k, l) = 2 * G * ( Block1.Matrix_12kl.at(k, l) - Block2.Matrix_12kl.at(k, l) ) + K *Block3.Matrix_12kl.at(k, l);
1907 secantOperator.Matrix_13kl.at(k, l) = 2 * G * ( Block1.Matrix_13kl.at(k, l) - Block2.Matrix_13kl.at(k, l) ) + K *Block3.Matrix_13kl.at(k, l);
1908 secantOperator.Matrix_21kl.at(k, l) = 2 * G * ( Block1.Matrix_21kl.at(k, l) - Block2.Matrix_21kl.at(k, l) ) + K *Block3.Matrix_21kl.at(k, l);
1909 secantOperator.Matrix_22kl.at(k, l) = 2 * G * ( Block1.Matrix_22kl.at(k, l) - Block2.Matrix_22kl.at(k, l) ) + K *Block3.Matrix_22kl.at(k, l);
1910 secantOperator.Matrix_23kl.at(k, l) = 2 * G * ( Block1.Matrix_23kl.at(k, l) - Block2.Matrix_23kl.at(k, l) ) + K *Block3.Matrix_23kl.at(k, l);
1911 secantOperator.Matrix_31kl.at(k, l) = 2 * G * ( Block1.Matrix_31kl.at(k, l) - Block2.Matrix_31kl.at(k, l) ) + K *Block3.Matrix_31kl.at(k, l);
1912 secantOperator.Matrix_32kl.at(k, l) = 2 * G * ( Block1.Matrix_32kl.at(k, l) - Block2.Matrix_32kl.at(k, l) ) + K *Block3.Matrix_32kl.at(k, l);
1913 secantOperator.Matrix_33kl.at(k, l) = 2 * G * ( Block1.Matrix_33kl.at(k, l) - Block2.Matrix_33kl.at(k, l) ) + K *Block3.Matrix_33kl.at(k, l);
1919 answer.
at(1, 1) = secantOperator.Matrix_11kl.at(1, 1);
1920 answer.
at(1, 2) = secantOperator.Matrix_11kl.at(2, 2);
1921 answer.
at(1, 3) = secantOperator.Matrix_11kl.at(3, 3);
1922 answer.
at(1, 4) = secantOperator.Matrix_11kl.at(2, 3);
1923 answer.
at(1, 5) = secantOperator.Matrix_11kl.at(3, 1);
1924 answer.
at(1, 6) = secantOperator.Matrix_11kl.at(1, 2);
1925 answer.
at(2, 1) = secantOperator.Matrix_22kl.at(1, 1);
1926 answer.
at(2, 2) = secantOperator.Matrix_22kl.at(2, 2);
1927 answer.
at(2, 3) = secantOperator.Matrix_22kl.at(3, 3);
1928 answer.
at(2, 4) = secantOperator.Matrix_22kl.at(2, 3);
1929 answer.
at(2, 5) = secantOperator.Matrix_22kl.at(3, 1);
1930 answer.
at(2, 6) = secantOperator.Matrix_22kl.at(1, 2);
1931 answer.
at(3, 1) = secantOperator.Matrix_33kl.at(1, 1);
1932 answer.
at(3, 2) = secantOperator.Matrix_33kl.at(2, 2);
1933 answer.
at(3, 3) = secantOperator.Matrix_33kl.at(3, 3);
1934 answer.
at(3, 4) = secantOperator.Matrix_33kl.at(2, 3);
1935 answer.
at(3, 5) = secantOperator.Matrix_33kl.at(3, 1);
1936 answer.
at(3, 6) = secantOperator.Matrix_33kl.at(1, 2);
1937 answer.
at(4, 1) = secantOperator.Matrix_23kl.at(1, 1);
1938 answer.
at(4, 2) = secantOperator.Matrix_23kl.at(2, 2);
1939 answer.
at(4, 3) = secantOperator.Matrix_23kl.at(3, 3);
1940 answer.
at(4, 4) = secantOperator.Matrix_23kl.at(2, 3);
1941 answer.
at(4, 5) = secantOperator.Matrix_23kl.at(3, 1);
1942 answer.
at(4, 6) = secantOperator.Matrix_23kl.at(1, 2);
1943 answer.
at(5, 1) = secantOperator.Matrix_31kl.at(1, 1);
1944 answer.
at(5, 2) = secantOperator.Matrix_31kl.at(2, 2);
1945 answer.
at(5, 3) = secantOperator.Matrix_31kl.at(3, 3);
1946 answer.
at(5, 4) = secantOperator.Matrix_31kl.at(2, 3);
1947 answer.
at(5, 5) = secantOperator.Matrix_31kl.at(3, 1);
1948 answer.
at(5, 6) = secantOperator.Matrix_31kl.at(1, 2);
1949 answer.
at(6, 1) = secantOperator.Matrix_12kl.at(1, 1);
1950 answer.
at(6, 2) = secantOperator.Matrix_12kl.at(2, 2);
1951 answer.
at(6, 3) = secantOperator.Matrix_12kl.at(3, 3);
1952 answer.
at(6, 4) = secantOperator.Matrix_12kl.at(2, 3);
1953 answer.
at(6, 5) = secantOperator.Matrix_12kl.at(3, 1);
1954 answer.
at(6, 6) = secantOperator.Matrix_12kl.at(1, 2);
1961 if ( type == IST_DamageScalar ) {
1965 }
else if ( type == IST_DamageTensor ) {
1975 }
else if ( type == IST_PrincipalDamageTensor ) {
1979 dam.
jaco_(answer, eVecs, 20);
1981 }
else if ( type == IST_DamageTensorTemp ) {
1991 }
else if ( type == IST_PrincipalDamageTempTensor ) {
1995 dam.
jaco_(answer, eVecs, 20);
1997 }
else if ( type == IST_MaxEquivalentStrainLevel ) {
2002 #ifdef keep_track_of_dissipated_energy 2003 }
else if ( type == IST_StressWorkDensity ) {
2007 }
else if ( type == IST_DissWorkDensity ) {
2010 }
else if ( type == IST_FreeEnergyDensity ) {
2038 switch ( eqStrain ) {
2101 #ifdef keep_track_of_dissipated_energy 2114 if ( mode == _PlaneStress ) {
2117 fprintf(file,
" strains ");
2120 for (
auto &v : helpVec ) {
2121 fprintf( file,
" %.4e", v );
2123 fprintf(file,
"\n stresses");
2125 for (
auto &v : helpVec ) {
2126 fprintf( file,
" %.4e", v );
2128 fprintf(file,
"\n");
2133 fprintf(file,
"status { ");
2134 fprintf(file,
"kappa %g", this->
kappa);
2136 if ( damtrace > 0.0 ) {
2137 fprintf(file,
", damage");
2139 for (
int i = 1; i <= n; i++ ) {
2140 for (
int j = 1; j <= n; j++ ) {
2146 #ifdef keep_track_of_dissipated_energy 2150 fprintf(file,
"}\n");
2163 #ifdef keep_track_of_dissipated_energy 2179 #ifdef keep_track_of_dissipated_energy 2234 #ifdef keep_track_of_dissipated_energy 2300 #ifdef keep_track_of_dissipated_energy 2315 #ifdef keep_track_of_dissipated_energy
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
double aA
Damage parameter a*A, needed to obtain Kappa(trD), according to eq. 33 in the paper mentioned above...
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
virtual void computeSecantOperator(FloatMatrix &answer, FloatMatrix strainTensor, FloatMatrix damageTensor, GaussPoint *gp)
double computeDimensionlessOutOfPlaneStress(const FloatArray &inplaneStrain, double epsZ, const FloatMatrix &dam)
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
This class implements associated Material Status to AnisotropicDamageMaterial.
void computeInplaneStress(FloatArray &inplaneStress, const FloatArray &inplaneStrain, double epsZ, const FloatMatrix &dam)
GaussPoint * gp
Associated integration point.
IsotropicLinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
For computing principal strains from engineering strains.
double tempDissWork
Non-equilibrated density of dissipated work.
double tempStressWork
Non-equilibrated density of total work done by stresses on strain increments.
#define _IFT_AnisotropicDamageMaterial_kappaf
AnisotropicDamageMaterialStatus(int n, Domain *d, GaussPoint *g)
Constructor.
void computePrincValDir2D(double &D1, double &D2, double &c, double &s, double Dx, double Dy, double Dxy)
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
double & at(int i)
Coefficient access function.
bool checkPrincVal2D(double Dx, double Dy, double Dxy)
double obtainAlpha2(FloatMatrix tempDamageTensor, double deltaLambda, FloatMatrix positiveStrainTensor, FloatMatrix ProjMatrix, double damageThreshold)
Obtains the proportion of the damage tensor that is needed to get the second eigenvalue equal to the ...
FloatMatrix tempDamage
Non-equilibrated second order damage tensor.
This class implements a structural material status information.
double nu
Poisson's ratio.
virtual ~AnisotropicDamageMaterialStatus()
Destructor.
double giveStressWork()
Returns the density of total work of stress on strain increments.
FloatArray stressVector
Equilibrated stress vector in reduced form.
double macbra(double x)
Returns the positive part of given float.
virtual ~AnisotropicDamageMaterial()
Destructor.
virtual void computeDamageTensor(FloatMatrix &answer, GaussPoint *gp, const FloatArray &totalStrain, double equivStrain, TimeStep *atTime)
double giveStoredFactor()
Returns the last Stored Factor.
void setTempFlag(int newflag)
Sets the value of the temporary value of flag.
DamLawType damageLawType
Parameter specifying the damage law.
double obtainAlpha3(FloatMatrix tempDamageTensor, double deltaLambda, FloatMatrix positiveStrainTensor, FloatArray vec3, double damageThreshold)
Obtains the proportion of the damage tensor that is needed to get the third eigenvalue equal to the d...
double stressWork
Density of total work done by stresses on strain increments.
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode)
Method for subtracting from reduced space strain vector its stress-independent parts (caused by tempe...
MaterialMode
Type representing material mode of integration point.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
virtual int read(int *data, int count)=0
Reads count integer values into array pointed by data.
MatResponseMode
Describes the character of characteristic material matrix.
FloatMatrix damage
Second order damage tensor.
const FloatMatrix & giveDamage()
Returns the last equilibrated second order damage tensor.
This class is a abstract base class for all linear elastic material models in a finite element proble...
contextIOResultType storeYourself(DataStream &stream) const
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *atTime)
Returns the integration point corresponding value in Reduced form.
virtual void givePlaneStrainStiffMtrx(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Method for computing plane strain stiffness matrix of receiver.
double dissWork
Density of dissipated work.
virtual void givePlaneStressStiffMtrx(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Method for computing plane stress stiffness matrix of receiver.
static void giveFullSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the reduced unsymmetric Voigt vector (2nd order tensor) to full form.
double tempKappa
Non-equilibrated scalar measure of the largest strain level.
void beMatrixForm(const FloatArray &aArray)
double givePoissonsRatio()
Returns Poisson's ratio.
virtual int write(const int *data, int count)=0
Writes count integer values from array pointed by data.
bool jaco_(FloatArray &eval, FloatMatrix &v, int nf)
Computes eigenvalues and eigenvectors of receiver (must be symmetric) The receiver is preserved...
void setTempStrainZ(double newStrainZ)
Sets the temp scalar measure of the out-of-plane strain to given value (for 2dPlaneStress mode)...
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void giveStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the stiffness matrix for giveRealStressVector of receiver in given integration point...
void setTempDamage(const FloatMatrix &d)
Assigns temp. damage tensor to given tensor d.
double giveKappa()
Returns the last equilibrated scalar measure of the largest strain level.
static void giveReducedSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full unsymmetric Voigt vector (2nd order tensor) to reduced form.
virtual void giveRealStressVector_PlaneStress(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedE, TimeStep *tStep)
Plane-stress version of the stress evaluation algorithm.
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
This class implements an isotropic linear elastic material in a finite element problem.
virtual void give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes full 3d material stiffness matrix at given integration point, time, respecting load history ...
virtual void computeEquivalentStrain(double &kappa, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)
Computes the equivalent strain measure from given strain vector (full form).
double giveTrace() const
Returns the trace of the receiver.
double giveTempStrainZ()
Returns the temp scalar measure of the out-of-plane strain to given value (for 2dPlaneStress mode)...
virtual void give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode, GaussPoint *gp, TimeStep *tStep)
Computes full 3d material stiffness matrix at given integration point, time, respecting load history ...
void times(double f)
Multiplies receiver by factor f.
double checkSymmetry(FloatMatrix matrix)
virtual int hasMaterialModeCapability(MaterialMode mode)
Tests if material supports material mode.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
double strainZ
Non-equilibrated out-of-plane value for 2dPlaneStress mode.
const FloatArray & giveTempStrainVector() const
Returns the const pointer to receiver's temporary strain vector.
virtual void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Computes the real stress vector for given total strain and integration point.
bool isEmpty() const
Returns true if receiver is empty.
#define _IFT_AnisotropicDamageMaterial_aA
double at(int i, int j) const
Coefficient access function.
double computeOutOfPlaneStrain(const FloatArray &inplaneStrain, const FloatMatrix &dam, bool tens_flag)
void computeWork(GaussPoint *gp)
Computes the increment of total stress work and of dissipated work.
IsotropicLinearElasticMaterial * giveLinearElasticMaterial()
Returns reference to undamaged (bulk) material.
double giveDissWork()
Returns the density of dissipated work.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
int giveFlag()
Returns the value of the flag.
double obtainAlpha1(FloatMatrix tempDamageTensor, double deltaLambda, FloatMatrix positiveStrainTensor, double damageThreshold)
Obtains the proportion of the damage tensor that is needed to get the first eigenvalue equal to the d...
void subtract(const FloatMatrix &a)
Subtracts matrix from the receiver.
contextIOResultType restoreYourself(DataStream &stream)
#define _IFT_AnisotropicDamageMaterial_kappa0
Class representing vector of real numbers.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
FloatArray strainVector
Equilibrated strain vector in reduced form.
void setTempKappa(double newKappa)
Sets the temp scalar measure of the largest strain level to given value.
Implementation of matrix containing floating point numbers.
IRResultType
Type defining the return values of InputRecord reading operations.
double kappaf
Damage parameter kappa_f (in the paper denoted as "a")
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
double kappa0
Damage threshold kappa0, as defined in the paper mentioned above.
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
double computeCorrectionFactor(FloatMatrix tempDamageTensor, FloatMatrix strainTensor, GaussPoint *gp)
void add(const FloatMatrix &a)
Adds matrix to the receiver.
void setTempStoredFactor(double newTempStoredFactor)
Sets the Temp Stored Factor to given value .
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
void correctBigValues(FloatMatrix &matrix)
void zero()
Zeroes all coefficients of receiver.
void beDyadicProductOf(const FloatArray &vec1, const FloatArray &vec2)
Assigns to the receiver the dyadic product .
double kappa
Scalar measure of the largest strain level ever reached in material.
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
void beSymVectorForm(const FloatMatrix &aMatrix)
Reciever will be a vector with 6 components formed from a 3x3 matrix.
Abstract base class for all "structural" constitutive models.
AnisotropicDamageMaterial(int n, Domain *d)
Constructor.
double tempStrainZ
Out-of-plane value for 2dPlaneStress mode.
#define _IFT_AnisotropicDamageMaterial_damageLawType
void zero()
Zeroes all coefficient of receiver.
const FloatMatrix & giveTempDamage()
Returns the temp. second order damage tensor.
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
double E
Young's modulus.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
double computeKappa(FloatMatrix damageTensor)
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
REGISTER_Material(DummyMaterial)
int flag
This flag turns into 1 and remains 1 when the trace of the damage tensor is >1 in compression (tr(str...
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
virtual void computePlaneStressSigmaZ(double &answer, FloatMatrix damageTensor, FloatArray reducedTotalStrainVector, double epsZ, GaussPoint *gp, TimeStep *atTime)
const FloatArray & giveTempStressVector() const
Returns the const pointer to receiver's temporary stress vector.
int giveSize() const
Returns the size of receiver.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
the oofem namespace is to define a context or scope in which all oofem names are defined.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
virtual void initTempStatus(GaussPoint *gp)
Initializes temporary variables stored in integration point status at the beginning of new time step...
virtual void computePlaneStressStrain(FloatMatrix &answer, FloatMatrix damageTensor, FloatArray totalStrain, GaussPoint *gp, TimeStep *atTime)
double giveYoungsModulus()
Returns Young's modulus.
virtual void give1dStressStiffMtrx(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Method for computing 1d stiffness matrix of receiver.
int giveNumberOfRows() const
Returns number of rows of receiver.
Class representing integration point in finite element program.
double computeTraceD(double equivStrain)
Class representing solution step.
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
void computeDamage(FloatMatrix &tempDamage, const FloatMatrix &damage, double kappa, double eps1, double eps2, double ceps, double seps, double epsZ)
EquivStrainType equivStrainType
Parameter specifying the definition of equivalent strain.
void resize(int s)
Resizes receiver towards requested size.