38 #include "../sm/Materials/structuralms.h" 44 #include "../sm/Materials/structuralmaterial.h" 46 #include "../sm/CrossSections/structuralcrosssection.h" 88 #ifdef keep_track_of_dissipated_energy 128 #ifdef keep_track_of_dissipated_energy 171 #ifdef keep_track_of_dissipated_energy 183 fprintf(file,
"\tstatus { ");
188 fprintf(file,
"Elastic, ");
191 fprintf(file,
"Unloading, ");
194 fprintf(file,
"Plastic, ");
197 fprintf(file,
"Damage, ");
200 fprintf(file,
"PlasticDamage, ");
207 inelasticStrainVector.
subtract(plasticStrainVector);
209 inelasticStrainVector.
add(plasticStrainVector);
210 inelasticStrainVector.
times(
le);
212 fprintf(file,
" plastic ");
213 for (
auto &val : plasticStrainVector ) {
214 fprintf( file,
" %.10e", val );
217 fprintf(file,
" inelastic ");
218 for (
auto &val : inelasticStrainVector ) {
219 fprintf( file,
" %.10e", val );
228 fprintf(file,
" kappaP %.10e,",
kappaP);
242 fprintf(file,
" alpha %.10e,", this->
alpha);
244 #ifdef keep_track_of_dissipated_energy 247 fprintf(file,
"}\n");
338 #ifdef keep_track_of_dissipated_energy 442 #ifdef keep_track_of_dissipated_energy 455 #ifdef keep_track_of_dissipated_energy 463 FloatArray deltaTotalStrain = tempTotalstrain;
464 deltaTotalStrain.
subtract(totalstrain);
475 FloatArray tempElasticStrain = tempTotalstrain;
501 #define IDM_ITERATION_LIMIT 1.e-8 549 gM =
eM / ( 2. * ( 1. +
nu ) );
550 kM =
eM / ( 3. * ( 1. - 2. *
nu ) );
555 this->
e0 = this->
ft / this->
eM;
613 m = 3. * ( pow(
fc, 2.) - pow(
ft, 2.) ) / (
fc *
ft ) *
ecc / (
ecc + 1. );
651 double deltaTime = 1.;
682 if ( effectiveStress.
at(1) >= 0 ) {
684 effectiveStressTension = effectiveStress;
685 effectiveStressCompression.
zero();
686 }
else if ( effectiveStress.
at(1) < 0 ) {
688 effectiveStressTension.
zero();
689 effectiveStressCompression = effectiveStress;
693 computeDamage(damages, strainVector, D, deltaTime, gp, tStep, alpha);
698 effectiveStressTension.
times( 1. - damages.
at(1) );
699 effectiveStressCompression.
times( 1. - damages.
at(2) );
700 answer = effectiveStressTension;
701 answer.
add(effectiveStressCompression);
703 answer = effectiveStress;
704 answer.
times( 1. - damages.
at(1) );
710 #ifdef keep_track_of_dissipated_energy 711 double gf = pow(
ft, 2) / this->
eM;
733 double deltaTime = 1.;
765 alpha =
computeAlpha(effectiveStressTension, effectiveStressCompression, effectiveStress);
768 computeDamage(damages, strainVector, D, deltaTime, gp, tStep, alpha);
773 effectiveStressTension.
times( 1. - damages.
at(1) );
774 effectiveStressCompression.
times( 1. - damages.
at(2) );
775 answer = effectiveStressTension;
776 answer.
add(effectiveStressCompression);
778 answer = effectiveStress;
779 answer.
times( 1. - damages.
at(1) );
785 #ifdef keep_track_of_dissipated_energy 786 double gf = pow(
ft, 2) / this->
eM;
804 double tempEquivStrain;
805 double deltaPlasticStrainNorm;
806 double tempDamageTension = 0.0;
807 double tempDamageCompression = 0.0;
809 double tempKappaDTension = 0.0, tempKappaDCompression = 0.0;
810 double tempKappaDTensionOne = 0.0, tempKappaDTensionTwo = 0.0;
811 double tempKappaDCompressionOne = 0.0, tempKappaDCompressionTwo = 0.0;
815 int unAndReloadingFlag = 0;
816 double minEquivStrain = 0.;
827 double tempEquivStrainTension = 0.;
828 double tempEquivStrainCompression = 0.;
832 if ( unAndReloadingFlag == 0 ) {
840 if ( ( tempEquivStrainTension >
e0 || tempEquivStrainCompression >
e0 ) &&
846 if ( unAndReloadingFlag == 0 ) {
859 fTension = fTension /
e0;
860 fCompression = fCompression /
e0;
863 double deltaPlasticStrainNormTension, deltaPlasticStrainNormCompression;
880 tempKappaDTension = tempEquivStrainTension;
882 tempKappaDTensionOne = status->
giveKappaDTensionOne() + deltaPlasticStrainNorm / ductilityMeasure / rateFactor;
896 }
else if ( fTension < -yieldTolDamage && fCompression >= -
yieldTolDamage ) {
905 tempKappaDCompression = tempEquivStrainCompression;
907 tempKappaDCompressionOne = status->
giveKappaDCompressionOne() + deltaPlasticStrainNormCompression / ( ductilityMeasure * rateFactor );
917 tempKappaDTension = tempEquivStrainTension;
919 tempKappaDTensionOne = status->
giveKappaDTensionOne() + deltaPlasticStrainNormTension / ( ductilityMeasure * rateFactor );
923 tempKappaDCompression = tempEquivStrainCompression;
924 deltaPlasticStrainNormCompression =
926 tempKappaDCompressionOne = status->
giveKappaDCompressionOne() + deltaPlasticStrainNormCompression / ( ductilityMeasure * rateFactor );
956 answer.
at(1) = tempDamageTension;
957 answer.
at(2) = tempDamageCompression;
962 double &minEquivStrain,
968 double sigEffective, rhoEffective, thetaEffective;
978 tempEffectiveStress.
beProductOf(D, tempElasticStrain);
991 deltaEffectiveStress = tempEffectiveStress;
992 deltaEffectiveStress.
subtract(effectiveStress);
996 intermediateEffectiveStress = effectiveStress;
998 intermediateEffectiveStress.
add(0.01 * deltaEffectiveStress);
1002 intermediateEffectiveStress = effectiveStress;
1003 intermediateEffectiveStress.
add(0.99 * deltaEffectiveStress);
1008 int unloadingFlag = 0;
1009 minEquivStrain = equivStrain;
1010 double midEquivStrain = 0.;
1013 if ( ( equivStrain > equivStrainPlus && tempEquivStrain > tempEquivStrainMinus ) && ( fabs(equivStrainPlus - equivStrain) >
yieldTolDamage / 100. && fabs(tempEquivStrainMinus - tempEquivStrain) >
yieldTolDamage / 100. ) ) {
1016 for (
double k = 1.0; k <= 100.0; k = k + 1.0 ) {
1017 intermediateEffectiveStress = effectiveStress;
1018 intermediateEffectiveStress.
add(k / 100. * deltaEffectiveStress);
1022 if ( midEquivStrain <= minEquivStrain ) {
1023 minEquivStrain = midEquivStrain;
1025 return unloadingFlag;
1029 return unloadingFlag;
1052 double maxStrain = -1.e20, minStrain = 1.e20;
1053 for (
int k = 1; k <= principalStrain.
giveSize(); k++ ) {
1055 if ( principalStrain.
at(k) > maxStrain ) {
1056 maxStrain = principalStrain.
at(k);
1060 if ( principalStrain.
at(k) < minStrain ) {
1061 minStrain = principalStrain.
at(k);
1069 strainRate = ( maxStrain - oldRateStrain ) / deltaTime;
1072 strainRate = ( minStrain - oldRateStrain ) / deltaTime;
1077 double deltaS = 1. / ( 1. + 8. * this->
fc / this->
fcZero );
1078 double betaS = exp( ( 6 * deltaS - 2. ) * log(10.) );
1081 double strainRateZeroTension = 1.e-6;
1082 double strainRateZeroCompression = -30.e-6;
1086 double alphaS = 1. / ( 5. + 9 * this->
fc / this->
fcZero );
1087 double gammaS = exp( ( 6.156 * alphaS - 2. ) * log(10.0) );
1089 double strainRateRatioTension, strainRateRatioCompression;
1091 double rateFactorTension = 1.;
1092 double rateFactorCompression = 1.;
1094 strainRateRatioTension = strainRate / strainRateZeroTension;
1097 if ( strainRate < 30.e-6 ) {
1098 rateFactorTension = 1.;
1099 }
else if ( 30.e-6 < strainRate && strainRate < 1 ) {
1100 rateFactorTension = pow(strainRateRatioTension, deltaS);
1102 rateFactorTension = betaS * pow(strainRateRatioTension, 0.333);
1106 strainRateRatioCompression = strainRate / strainRateZeroCompression;
1107 if ( strainRate > -30.e-6 ) {
1108 rateFactorCompression = 1.;
1109 }
else if ( -30.e-6 > strainRate && strainRate > -30 ) {
1110 rateFactorCompression = pow(strainRateRatioCompression, 1.026 * alphaS);
1112 rateFactorCompression = gammaS * pow(strainRateRatioCompression, 0.333);
1115 double rateFactor = ( 1. - alpha ) * rateFactorTension + alpha * rateFactorCompression;
1130 FloatArray deltaPlasticStrain = tempPlasticStrain;
1131 for (
int i = 1; i <= deltaPlasticStrain.
giveSize(); ++i ) deltaPlasticStrain.
at(i) -= plasticStrain.
at(i);
1134 double deltaPlasticStrainNorm = 0;
1140 deltaPlasticStrainNorm = 0.;
1142 factor = ( 1. - (
e0 - kappaD ) / ( tempKappaD - kappaD ) );
1143 deltaPlasticStrain.
times(factor);
1144 deltaPlasticStrainNorm = deltaPlasticStrain.
computeNorm();
1146 deltaPlasticStrainNorm = deltaPlasticStrain.
computeNorm();
1149 return deltaPlasticStrainNorm;
1163 deltaPlasticStrain.
add(tempAlpha, tempPlasticStrain);
1164 for (
int i = 1; i <= deltaPlasticStrain.
giveSize(); ++i ) deltaPlasticStrain.
at(i) -= tempAlpha * plasticStrain.
at(i);
1167 double deltaPlasticStrainNorm = 0;
1171 deltaPlasticStrainNorm = 0.;
1173 double factor = ( 1. - (
e0 - kappaD ) / ( tempKappaD - kappaD ) );
1174 deltaPlasticStrain.
times(factor);
1175 deltaPlasticStrainNorm = deltaPlasticStrain.
computeNorm();
1177 deltaPlasticStrainNorm = deltaPlasticStrain.
computeNorm();
1183 if (
rho < 1.e-16 ) {
1184 extraFactor = this->
ft * yieldHardTwo * sqrt(2. / 3.) / 1.e-16 / sqrt( 1. + 2. * pow(this->
dilationConst, 2.) );
1186 extraFactor = this->
ft * yieldHardTwo * sqrt(2. / 3.) / this->
rho / sqrt( 1. + 2. * pow(this->
dilationConst, 2.) );
1189 return deltaPlasticStrainNorm * extraFactor;
1198 double rFunction = ( 4. * ( 1. - pow(this->
ecc, 2.) ) * pow(cos(theta), 2.) + pow(2. * this->
ecc - 1., 2.) ) / ( 2. * ( 1. - pow(this->
ecc, 2.) ) * cos(theta) + ( 2. * this->
ecc - 1. ) * sqrt(4. * ( 1. - pow(this->
ecc, 2.) ) * pow(cos(theta), 2.) + 5. * pow(this->
ecc, 2.) - 4. * this->
ecc) );
1200 double pHelp = -this->
m * ( rho * rFunction / ( sqrt(6.) *
fc ) + sig /
fc );
1202 double qHelp = -3. / 2. * pow(rho, 2.) / pow(this->
fc, 2.);
1204 double help = -0.5 * pHelp + sqrt(pow(pHelp, 2.) / 4. - qHelp);
1206 double tempEquivStrain = 0.;
1208 tempEquivStrain = help *
e0;
1210 return tempEquivStrain;
1222 omega = ( this->
eM * equivStrain * this->
wf - this->
ft * this->
wf + this->
ft * kappaOne * le ) /
1223 ( this->
eM * equivStrain * this->
wf - this->
ft * le * kappaTwo );
1225 omega = ( this->
eM * equivStrain * this->
wfOne - this->
ft * this->
wfOne - ( this->
ftOne - this->
ft ) * kappaOne * le ) /
1226 ( this->
eM * equivStrain * this->
wfOne + ( this->
ftOne - this->
ft ) * le * kappaTwo );
1227 help = le * kappaOne + le * omega * kappaTwo;
1229 if ( help >= 0. && help < this->
wfOne ) {
1233 omega = ( this->
eM * equivStrain * ( this->
wf - this->
wfOne ) - this->
ftOne * ( this->
wf - this->wfOne ) +
1235 ( this->
eM * equivStrain * ( this->
wf - this->wfOne ) - this->
ftOne * le * kappaTwo );
1236 help = le * kappaOne + le * omega * kappaTwo;
1238 if ( help > this->wfOne && help < this->
wf ) {
1243 double residual = 0.;
1244 double dResidualDOmega = 0.;
1251 residual = ( 1 - omega ) *
eM * equivStrain -
ft *exp(-le * ( omega * kappaTwo + kappaOne ) /
wf);
1252 dResidualDOmega = -
eM * equivStrain +
ft * le * kappaTwo /
wf *exp(-le * ( omega * kappaTwo + kappaOne ) /
wf);
1254 omega -= residual / dResidualDOmega;
1258 }
while ( fabs(residual /
ft) >= 1.e-8 );
1269 if ( omega < 0. || omega < omegaOld ) {
1287 double residual = 0.;
1288 double dResidualDOmega = 0.;
1293 residual = ( 1. - omega ) * this->
eM * equivStrain - this->
ft *exp(-( kappaOne + omega * kappaTwo ) / this->
efCompression);
1294 dResidualDOmega = -this->
eM * equivStrain + this->
ft * kappaTwo / this->
efCompression *exp(-( kappaOne + omega * kappaTwo ) / this->
efCompression);
1296 omega -= residual / dResidualDOmega;
1300 }
while ( fabs(residual /
ft) >= 1.e-8 );
1308 if ( omega < omegaOld || omega < 0. ) {
1322 if ( kappaD <= 0. ) {
1328 FloatArray principalStrains, crackPlaneNormal(3);
1334 }
else if ( strain.
giveSize() == 1 ) {
1340 for (
int i = 2; i <= 3; i++ ) {
1341 if ( principalStrains.
at(i) > principalStrains.
at(indx) ) {
1346 for (
int i = 1; i <= 3; i++ ) {
1347 crackPlaneNormal.
at(i) = principalDir.
at(i, indx);
1358 }
else if ( status->
giveLe() == 0. ) {
1372 double alphaZero = 0.40824829;
1375 if ( this->
sig < 0. ) {
1376 if ( this->
rho > 1.e-16 ) {
1377 Rs = -this->
sig / ( alphaZero * this->
rho );
1379 Rs = -this->
sig * 1.e16 / alphaZero;
1385 return 1. + (
ASoft - 1. ) * Rs;
1406 for (
int i = 1; i <= elasticStrain.
giveSize(); ++i ) elasticStrain.
at(i) -= tempPlasticStrain.
at(i);
1422 int subIncrementFlag = 0;
1424 double apexStress = 0.;
1425 int subincrementcounter = 0;
1428 subIncrementFlag = 0;
1429 convergedStrain = oldStrain;
1430 tempStrain = strain;
1435 elasticStrain = tempStrain;
1436 for (
int i = 1; i <= elasticStrain.
giveSize(); ++i ) elasticStrain.
at(i) -= tempPlasticStrain.
at(i);
1445 if ( yieldValue > 0. ) {
1464 subincrementcounter++;
1465 if ( subincrementcounter > 10 ) {
1467 OOFEM_LOG_INFO(
"Old strain vector %g %g %g %g %g %g \n", oldStrain.
at(1), oldStrain.
at(2), oldStrain.
at(3), oldStrain.
at(4), oldStrain.
at(5), oldStrain.
at(6) );
1470 double sig1, rho1, theta1;
1473 OOFEM_LOG_INFO(
"Old plastic strain vector %g %g %g %g %g %g \n", help.at(1), help.at(2), help.at(3), help.at(4), help.at(5), help.at(6) );
1474 OOFEM_LOG_INFO(
"New strain vector %g %g %g %g %g %g \n", strain.
at(1), strain.
at(2), strain.
at(3), strain.
at(4), strain.
at(5), strain.
at(6) );
1478 OOFEM_LOG_INFO(
"OLD Sig %g rho %g theta %g \n", sig1, rho1, theta1);
1486 OOFEM_ERROR(
"Could not reach convergence with small deltaStrain, giving up.");
1487 }
else if ( subincrementcounter > 9 && tempKappaP < 1. ) {
1492 subIncrementFlag = 1;
1493 deltaStrain.
times(0.5);
1494 tempStrain = convergedStrain;
1495 tempStrain.
add(deltaStrain);
1498 tempPlasticStrain = strain;
1499 tempPlasticStrain.
subtract(elasticStrain);
1502 OOFEM_LOG_INFO(
"Subincrementation %d required\n", subincrementcounter);
1503 subincrementcounter = 0;
1505 tempPlasticStrain = tempStrain;
1506 tempPlasticStrain.
subtract(elasticStrain);
1509 subIncrementFlag = 0;
1511 convergedStrain = tempStrain;
1513 tempStrain = strain;
1533 }
else if ( sig < 0. && tempKappa < 1. ) {
1545 double apexStress,
double tempKappaP,
1550 double yieldValue = 0.;
1551 double yieldValueMid = 0.;
1556 double ratioPotential;
1561 double kappaInitial = tempKappaP;
1577 if ( yieldValue * yieldValueMid >= 0. ) {
1580 return kappaInitial;
1583 if ( yieldValue < 0.0 ) {
1584 dSig = sig2 - sigTrial;
1587 dSig = sigTrial - sig2;
1591 for (
int j = 0; j < 250; j++ ) {
1594 sigMid = sigAnswer + dSig;
1602 if ( yieldValueMid <= 0. ) {
1606 if ( fabs(yieldValueMid) <
yieldTol && yieldValueMid <= 0. ) {
1614 double ratioTrial = rhoTrial / ( sigTrial - sigAnswer );
1618 for (
int i = 0; i < 3; i++ ) {
1619 effectiveStress(i) = sigAnswer;
1622 for (
int i = 3; i < effectiveStress.
giveSize(); i++ ) {
1623 effectiveStress(i) = 0.;
1630 return kappaInitial;
1635 for (
int i = 0; i < 3; i++ ) {
1636 effectiveStress(i) = sigAnswer;
1639 for (
int i = 3; i < effectiveStress.
giveSize(); i++ ) {
1640 effectiveStress(i) = 0.;
1655 double equivalentDeltaPlasticStrain;
1657 equivalentDeltaPlasticStrain = sqrt( 1. / 9. * pow( ( sigTrial - sig ) / (
kM ), 2. ) +
1658 pow(rhoTrial / ( 2. *
gM ), 2.) );
1660 double thetaVertex =
M_PI / 3.;
1663 return kappaInitial + equivalentDeltaPlasticStrain / ductilityMeasure;
1672 double thetaConst = pow(2. * cos(theta), 2.);
1673 double ductilityMeasure;
1674 double x = -( sig +
fc / 3 ) /
fc;
1680 ductilityMeasure = ( EHard * exp(x / FHard) +
DHard ) / thetaConst;
1685 return ductilityMeasure;
1698 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
1700 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
1703 double R = ( sig -
ft / 3. * yieldHardTwo ) /
fc / BGParam;
1704 double mQ = AGParam * exp(R);
1706 double Bl = sig /
fc +
rho / (
fc * sqrt(6.) );
1708 double Al = ( 1. - yieldHardOne ) * pow(Bl, 2.) + sqrt(3. / 2.) *
rho /
fc;
1710 double dgdsig = 4. * ( 1. - yieldHardOne ) /
fc * Al * Bl + pow(yieldHardOne, 2.) * mQ /
fc;
1712 double dgdrho = Al / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. ) +
1714 m *pow(yieldHardOne, 2.) / ( sqrt(6.) *
fc );
1716 return dgdrho / dgdsig * 3. * ( 1. - 2. *
nu ) / ( 1. +
nu );
1725 FloatArray trialStress, deviatoricTrialStress;
1726 FloatArray residuals, residualsNorm, deltaIncrement, dGDInv;
1731 double dKappaDDeltaLambda;
1732 double deltaLambda = 0.;
1733 double normOfResiduals = 0.;
1734 int iterationCount = 0;
1735 bool mode3d = effectiveStress.
giveSize() > 1;
1738 double trialSig, trialRho;
1740 trialStress = effectiveStress;
1761 double tempKappaP = kappaP;
1767 unknowns.
at(1) = trialSig;
1768 unknowns.
at(2) = trialRho;
1769 unknowns.
at(3) = tempKappaP;
1770 unknowns.
at(4) = 0.;
1774 unknowns.
at(1) = trialSig * 3.;
1775 unknowns.
at(2) = tempKappaP;
1776 unknowns.
at(3) = 0.;
1784 residuals.
at( residuals.
giveSize() ) = yieldValue;
1786 normOfResiduals = 1.;
1790 while ( normOfResiduals >
yieldTol ) {
1797 residualsNorm = residuals;
1798 if ( effectiveStress.
giveSize() > 1 ) {
1800 residualsNorm.
at(1) /= this->
kM;
1801 residualsNorm.
at(2) /= 2. * this->
gM;
1803 residualsNorm.
at(1) /= this->
eM;
1813 if ( normOfResiduals >
yieldTol ) {
1818 if ( !jacobian.
solveForRhs(residuals, deltaIncrement) ) {
1826 if ( unknowns.
at(4) <= 0. ) {
1827 unknowns.
at(4) = 0.;
1830 if ( unknowns.
at(2) <= 0. ) {
1831 unknowns.
at(2) = 0.;
1834 if ( unknowns.
at(3) - kappaP <= 0. ) {
1835 unknowns.
at(3) = kappaP;
1839 sig = unknowns.
at(1);
1840 rho = unknowns.
at(2);
1842 tempKappaP = unknowns.
at(3);
1843 deltaLambda = unknowns.
at(4);
1849 residuals.
at(1) =
sig - trialSig + this->
kM *deltaLambda *dGDInv.
at(1);
1850 residuals.
at(2) =
rho - trialRho + ( 2. * this->
gM ) * deltaLambda * dGDInv.
at(2);
1851 residuals.
at(3) = -tempKappaP + kappaP + deltaLambda * dKappaDDeltaLambda;
1856 if ( !jacobian.
solveForRhs(residuals, deltaIncrement) ) {
1864 if ( unknowns.
at(3) <= 0. ) {
1865 unknowns.
at(3) = 0.;
1868 if ( unknowns.
at(2) - kappaP <= 0. ) {
1869 unknowns.
at(2) = kappaP;
1873 sig = unknowns.
at(1) / 3.;
1874 rho = unknowns.
at(1) * sqrt(2. / 3.);
1876 tempKappaP = unknowns.
at(2);
1877 deltaLambda = unknowns.
at(3);
1883 residuals.
at(1) = 3. * (
sig - trialSig ) + this->
eM *deltaLambda * dginv;
1884 residuals.
at(2) = -tempKappaP + kappaP + deltaLambda * dKappaDDeltaLambda;
1893 stressPrincipal.
zero();
1900 effectiveStress.
at(1) =
sig * 3;
1925 answer.
at(1, 1) = 1. + this->
eM * deltaLambda * dDGDDInv;
1926 answer.
at(1, 2) = this->
eM * deltaLambda * dDGDInvDKappa;
1927 answer.
at(1, 3) = this->
eM * dGDInv;
1929 answer.
at(2, 1) = deltaLambda * dDKappaDDeltaLambdaDInv;
1930 answer.
at(2, 2) = deltaLambda * dDKappaDDeltaLambdaDKappa - 1.;
1931 answer.
at(2, 3) = dKappaDDeltaLambda;
1933 answer.
at(3, 1) = dFDInv;
1934 answer.
at(3, 2) = dFDKappa;
1935 answer.
at(3, 3) = 0.;
1964 double dDKappaDDeltaLambdaDKappa;
1974 answer.
at(1, 1) = 1. + this->
kM *deltaLambda *dDGDDInv.
at(1, 1);
1975 answer.
at(1, 2) = this->
kM * deltaLambda * dDGDDInv.
at(1, 2);
1976 answer.
at(1, 3) = this->
kM * deltaLambda * dDGDInvDKappa.
at(1);
1977 answer.
at(1, 4) = this->
kM * dGDInv.
at(1);
1979 answer.
at(2, 1) = 2. *this->
gM *deltaLambda *dDGDDInv.
at(2, 1);
1980 answer.
at(2, 2) = 1. + 2. *this->
gM *deltaLambda *dDGDDInv.
at(2, 2);
1981 answer.
at(2, 3) = 2. *this->
gM *deltaLambda *dDGDInvDKappa.
at(2);
1982 answer.
at(2, 4) = 2. *this->
gM *dGDInv.
at(2);
1984 answer.
at(3, 1) = deltaLambda * dDKappaDDeltaLambdaDInv.
at(1);
1985 answer.
at(3, 2) = deltaLambda * dDKappaDDeltaLambdaDInv.
at(2);
1986 answer.
at(3, 3) = deltaLambda * dDKappaDDeltaLambdaDKappa - 1.;
1987 answer.
at(3, 4) = dKappaDDeltaLambda;
1989 answer.
at(4, 1) = dFDInv.
at(1);
1990 answer.
at(4, 2) = dFDInv.
at(2);
1991 answer.
at(4, 3) = dFDKappa;
1992 answer.
at(4, 4) = 0.;
2002 double tempKappa)
const 2010 double rFunction = ( 4. * ( 1. - pow(
ecc, 2.) ) * pow(cos(theta), 2.) +
2011 pow( ( 2. *
ecc - 1. ), 2. ) ) /
2012 ( 2. * ( 1. - pow(
ecc, 2.) ) * cos(theta) +
2013 ( 2. *
ecc - 1. ) * sqrt(4. * ( 1. - pow(
ecc, 2.) ) * pow(cos(theta), 2.)
2014 + 5. * pow(
ecc, 2.) - 4. *
ecc) );
2017 double Al = ( 1. - yieldHardOne ) * pow( ( sig /
fc + rho / ( sqrt(6.) *
fc ) ), 2. ) +
2018 sqrt(3. / 2.) * rho /
fc;
2021 return pow(Al, 2.) +
2022 pow(yieldHardOne, 2.) * yieldHardTwo *
m * ( sig /
fc + rho * rFunction / ( sqrt(6.) *
fc ) ) -
2023 pow(yieldHardOne, 2.) * pow(yieldHardTwo, 2.);
2043 ( 4. * ( 1. - pow(
ecc, 2) ) * pow(cos(theta), 2) + pow( ( 2. *
ecc - 1. ), 2 ) ) /
2044 ( 2 * ( 1. - pow(
ecc, 2) ) * cos(theta) + ( 2. *
ecc - 1. ) * sqrt(4. * ( 1. - pow(
ecc, 2) ) * pow(cos(theta), 2) + 5. * pow(
ecc, 2) - 4. *
ecc) );
2049 double Al = ( 1. - yieldHardOne ) * pow( ( sig /
fc + rho / ( sqrt(6.) *
fc ) ), 2. ) + sqrt(3. / 2.) * rho /
fc;
2051 double Bl = sig /
fc + rho / (
fc * sqrt(6.) );
2053 double dFDYieldHardOne = -2. *Al *pow(Bl, 2.)
2054 + 2. * yieldHardOne * yieldHardTwo *
m * ( sig /
fc + rho * rFunction / ( sqrt(6.) *
fc ) ) - 2. *yieldHardOne *pow(yieldHardTwo, 2.);
2056 double dFDYieldHardTwo = pow(yieldHardOne, 2.) *
m * ( sig /
fc + rho * rFunction / ( sqrt(6.) *
fc ) ) - 2. *yieldHardTwo *pow(yieldHardOne, 2.);
2059 dFDKappa = dFDYieldHardOne * dYieldHardOneDKappa +
2060 dFDYieldHardTwo * dYieldHardTwoDKappa;
2062 dFDKappa = -2 * pow(2 * sig / 3 /
fc, 2) * ( sig /
fc + pow(2 / 3 * sig /
fc, 2) * ( 1 - yieldHardOne ) ) * dYieldHardOneDKappa +
2063 ( 1 + rFunction ) *
m * sig / 3 /
fc * ( dYieldHardOneDKappa * 2. * yieldHardOne * yieldHardTwo + dYieldHardTwoDKappa * yieldHardOne ) -
2064 2 * ( yieldHardOne * pow(yieldHardTwo, 2) * dYieldHardOneDKappa + yieldHardTwo * pow(yieldHardOne, 2) * dYieldHardTwoDKappa );
2074 if ( dFDKappa > 0. ) {
2083 double tempKappa)
const 2090 double rFunction = ( 4. * ( 1. - pow(
ecc, 2) ) * pow(cos(theta), 2) + pow( ( 2. *
ecc - 1. ), 2 ) ) /
2091 ( 2. * ( 1. - pow(
ecc, 2) ) * cos(theta) + ( 2. *
ecc - 1. ) * sqrt(4. * ( 1. - pow(
ecc, 2) ) * pow(cos(theta), 2) + 5. * pow(
ecc, 2) - 4. *
ecc) );
2092 return 2 * ( 1 /
fc + 8 * sigma / pow(3 *
fc, 2) * ( 1 - yieldHardOne ) ) * ( sigma /
fc + pow(2 * sigma / 3 /
fc, 2) * ( 1 - yieldHardOne ) ) + ( 1 + rFunction ) *
m / ( 3 *
fc ) * pow(yieldHardOne, 2) * yieldHardTwo;
2100 double tempKappa)
const 2109 double rFunction = ( 4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta) + ( 2. *
ecc - 1. ) * ( 2. *
ecc - 1. ) ) /
2110 ( 2. * ( 1. -
ecc *
ecc ) * cos(theta) + ( 2. * ecc - 1. ) * sqrt(4. * ( 1. - ecc * ecc ) * cos(theta) * cos(theta)
2111 + 5. * ecc * ecc - 4. *
ecc) );
2114 double AL = ( 1. - yieldHardOne ) * pow( ( sig /
fc + rho / ( sqrt(6.) *
fc ) ), 2. ) + sqrt(3. / 2.) * rho /
fc;
2115 double BL = sig /
fc + rho / (
fc * sqrt(6.) );
2118 double dfdsig = 4. * ( 1. - yieldHardOne ) /
fc * AL * BL + yieldHardTwo *pow(yieldHardOne, 2.) *
m /
fc;
2121 double dfdrho = AL / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * BL + 6. ) + rFunction *
m *yieldHardTwo *pow(yieldHardOne, 2.) / ( sqrt(6.) *
fc );
2134 return equivalentDGDStress / ductilityMeasure;
2143 double equivalentDGDStress;
2144 double ductilityMeasure;
2149 equivalentDGDStress = sqrt( 1. / 3. * pow(dGDInv(0), 2.) + pow(dGDInv(1), 2.) );
2153 return equivalentDGDStress / ductilityMeasure;
2173 dDGDDInv = -dDGDDInv;
2177 return dDGDDInv / ductilityMeasure - dGDInv * dDuctilityMeasureDInv / pow(ductilityMeasure, 2);
2188 double equivalentDGDStress;
2198 equivalentDGDStress = sqrt( 1. / 3. * pow(dGDInv(0), 2.) + pow(dGDInv(1), 2.) );
2204 dEquivalentDGDStressDInv(0) =
2205 ( 2. / 3. * dGDInv(0) * dDGDDInv(0, 0) + 2. * dGDInv(1) * dDGDDInv(1, 0) ) / ( 2. * equivalentDGDStress );
2206 dEquivalentDGDStressDInv(1) =
2207 ( 2. / 3. * dGDInv(0) * dDGDDInv(0, 1) + 2. * dGDInv(1) * dDGDDInv(1, 1) ) / ( 2. * equivalentDGDStress );
2215 answer(0) = ( dEquivalentDGDStressDInv(0) * ductilityMeasure - equivalentDGDStress * dDuctilityMeasureDInv(0) ) / pow(ductilityMeasure, 2.);
2217 answer(1) = ( dEquivalentDGDStressDInv(1) * ductilityMeasure - equivalentDGDStress * dDuctilityMeasureDInv(1) ) / pow(ductilityMeasure, 2.);
2224 double equivalentDGDStress, dEquivalentDGDStressDKappa, ductilityMeasure;
2232 equivalentDGDStress = sqrt( 1. / 3. * pow(dGDInv(0), 2.) +
2233 pow(dGDInv(1), 2.) );
2237 dEquivalentDGDStressDKappa =
2238 ( 2. / 3. * dGDInv(0) * dDGDInvDKappa(0) + 2. * dGDInv(1) * dDGDInvDKappa(1) ) / ( 2. * equivalentDGDStress );
2242 double dDuctilityMeasureDKappa = 0.;
2245 double dDKappaDDeltaLambdaDKappa =
2246 ( dEquivalentDGDStressDKappa * ductilityMeasure -
2247 equivalentDGDStress * dDuctilityMeasureDKappa ) / pow(ductilityMeasure, 2.);
2249 return dEquivalentDGDStressDKappa / ductilityMeasure;
2257 double equivalentDGDStress, dEquivalentDGDStressDKappa, ductilityMeasure;
2261 if ( equivalentDGDStress < 0 ) {
2262 dEquivalentDGDStressDKappa = ( -1 ) * dEquivalentDGDStressDKappa;
2267 return dEquivalentDGDStressDKappa / ductilityMeasure;
2275 double thetaConst = pow(2. * cos(
thetaTrial), 2.);
2276 double x = -( sigma +
fc ) / ( 3 *
fc );
2277 double dXDSigma = -1. / ( 3. *
fc );
2284 double dDuctilityMeasureDX = EHard / FHard *exp(x / FHard) / thetaConst;
2285 return dDuctilityMeasureDX * dXDSigma;
2288 return dDuctilityMeasureDX * dXDSigma;
2298 double thetaConst = pow(2. * cos(
thetaTrial), 2.);
2299 double x = ( -( sig +
fc / 3. ) ) /
fc;
2302 double dXDSig = -1. /
fc;
2308 double dDuctilityMeasureDX = EHard / FHard *exp(x / FHard) / thetaConst;
2309 answer = {dDuctilityMeasureDX * dXDSig, 0.};
2311 double dXDSig = -1. /
fc;
2312 double dDuctilityMeasureDX = -(
BHard -
AHard ) / (
CHard ) / thetaConst *exp( -x / (
CHard ) );
2313 answer = {dDuctilityMeasureDX * dXDSig, 0.};
2325 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
2326 double BGParam = yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) / ( log(AGParam) + log(this->
dilationConst + 1.) - log(2 * this->
dilationConst - 1.) - log(3. * yieldHardTwo + this->
m / 2) );
2327 double R = ( sigma - yieldHardTwo *
ft ) / ( 3 *
fc * BGParam );
2328 double mQ = AGParam * exp(R) / 3;
2329 return 2 * ( 1 /
fc + 8 * sigma / pow(3 *
fc, 2) * ( 1 - yieldHardOne ) ) * ( sigma /
fc + pow(2 * sigma / ( 3 *
fc ), 2) * ( 1 - yieldHardOne ) ) + pow(yieldHardOne, 2) /
fc * (
m / 3 +
mQ );
2344 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
2346 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
2349 double R = ( sig -
ft / 3. * yieldHardTwo ) /
fc / BGParam;
2350 double mQ = AGParam * exp(R);
2352 double Bl = sig /
fc + rho / (
fc * sqrt(6.) );
2354 double Al = ( 1. - yieldHardOne ) * pow(Bl, 2.) + sqrt(3. / 2.) * rho /
fc;
2356 double dgdsig = 4. * ( 1. - yieldHardOne ) /
fc * Al * Bl + pow(yieldHardOne, 2.) * mQ /
fc;
2358 double dgdrho = Al / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. ) +
2359 m *pow(yieldHardOne, 2.) / ( sqrt(6.) *
fc );
2361 answer = {dgdsig, dgdrho};
2376 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
2378 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
2381 double R = ( sigma -
ft * yieldHardTwo ) / ( 3 *
fc * BGParam );
2382 double mQ = AGParam * exp(R) / 3;
2386 double dAGParamDKappa = dYieldHardTwoDKappa * 3. * this->
ft / this->
fc;
2389 double BGParamTop = yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc );
2390 double BGParamBottom = ( log(AGParam) + log(this->
dilationConst + 1.) - log(2 * this->
dilationConst - 1.) - log(3. * yieldHardTwo + this->
m / 2) );
2391 double dBGParamTopDKappa1 = dYieldHardTwoDKappa * ( 1 +
ft /
fc ) / 3;
2392 double dBGParamBottomDKappa1 = BGParamBottom;
2393 double dBGParamTopDKappa2 = BGParamTop * ( dAGParamDKappa / AGParam - 3 * dYieldHardTwoDKappa / (
m / 2 + 3 * yieldHardTwo ) );
2394 double dBGParamBottomDKappa2 = pow(BGParamBottom, 2);
2396 double dBGParamDKappa = dBGParamTopDKappa1 / dBGParamBottomDKappa1 - dBGParamTopDKappa2 / dBGParamBottomDKappa2;
2397 double dMQDKappa = 1 / 3 * exp(R) * ( dAGParamDKappa - AGParam * ( ( sigma -
ft * yieldHardTwo ) * dBGParamDKappa / ( 3 *
fc * pow(BGParam, 2) ) +
ft * dYieldHardTwoDKappa / 3 /
fc / BGParam ) );
2399 return -8 / 9 * pow(sigma /
fc, 2) * ( 1 /
fc + 8 * sigma / pow(3 *
fc, 2) * ( 1 - yieldHardOne ) ) * dYieldHardOneDKappa - sigma *pow(4 / 3 /
fc, 2) * ( sigma /
fc + pow(2 / 3 * sigma /
fc, 2) * ( 1 - yieldHardOne ) ) * dYieldHardOneDKappa + 2 * dYieldHardOneDKappa * yieldHardOne /
fc * ( this->
m / 3 +
mQ ) + yieldHardOne /
fc * dMQDKappa;
2419 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
2421 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
2424 double R = ( sig -
ft / 3. * yieldHardTwo ) / (
fc * BGParam );
2425 double mQ = AGParam * exp(R);
2430 double dAGParamDKappa = dYieldHardTwoDKappa * 3. * this->
ft / this->
fc;
2433 double BGParamTop = yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc );
2434 double BGParamBottom = ( log(AGParam) + log(this->
dilationConst + 1.) - log(2 * this->
dilationConst - 1.) - log(3. * yieldHardTwo + this->
m / 2) );
2436 double dBGParamTopDKappa = dYieldHardTwoDKappa / 3. * ( 1. + this->
ft / this->
fc );
2437 double dBGParamBottomDKappa = 1./AGParam*dAGParamDKappa - 3. * dYieldHardTwoDKappa / ( 3 * yieldHardTwo +
m / 2. );
2438 double dBGParamDKappa = ( dBGParamTopDKappa * BGParamBottom - BGParamTop * dBGParamBottomDKappa ) / pow(BGParamBottom, 2.);
2441 double RTop = ( sig -
ft / 3. * yieldHardTwo );
2442 double RBottom =
fc * BGParam;
2443 double dRTopDKappa = -this->
ft / 3. * dYieldHardTwoDKappa;
2444 double dRBottomDKappa = this->
fc * dBGParamDKappa;
2445 double dRDKappa = ( dRTopDKappa * RBottom - RTop * dRBottomDKappa ) / pow(RBottom, 2.);
2447 double dMQDKappa = dAGParamDKappa * exp(R) + AGParam *dRDKappa *exp(R);
2449 double Bl = sig /
fc + rho / (
fc * sqrt(6.) );
2451 double Al = ( 1. - yieldHardOne ) * pow(Bl, 2.) + sqrt(3. / 2.) * rho /
fc;
2453 double dAlDYieldHard = -pow(Bl, 2.);
2455 const double dDGDSigDKappa =
2456 ( -4. * Al * Bl /
fc + 4. * ( 1 - yieldHardOne ) /
fc * dAlDYieldHard * Bl ) * dYieldHardOneDKappa +
2457 dYieldHardOneDKappa * 2 * yieldHardOne * mQ /
fc + pow(yieldHardOne,2.) * dMQDKappa /
fc;
2459 const double dDGDRhoDKappa =
2460 ( dAlDYieldHard / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. ) -
2461 4. * Al / ( sqrt(6.) *
fc ) * Bl +
m / ( sqrt(6.) *
fc ) * 2 * yieldHardOne) * dYieldHardOneDKappa;
2463 answer = {dDGDSigDKappa, dDGDRhoDKappa};
2473 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
2475 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
2477 double R = ( sigma -
ft * yieldHardTwo ) / ( 3 *
fc * BGParam );
2478 double dMQDSigma = AGParam / ( 9 * BGParam *
fc ) * exp(R);
2479 return 2 * pow(1 /
fc + 8 * sigma / pow(3 *
fc, 2) * ( 1 - yieldHardOne ), 2) + pow(4 / 3 /
fc, 2) * ( sigma /
fc + pow(2 / 3 * sigma /
fc, 2) * ( 1 - yieldHardOne ) ) * ( 1 - yieldHardOne ) + pow(yieldHardOne, 2) /
fc * dMQDSigma;
2493 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
2495 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
2498 double R = ( sig -
ft / 3. * yieldHardTwo ) /
fc / BGParam;
2500 double dMQDSig = AGParam / ( BGParam *
fc ) * exp(R);
2503 double Bl = sig /
fc + rho / (
fc * sqrt(6.) );
2505 double Al = ( 1. - yieldHardOne ) * pow(Bl, 2.) +
2506 sqrt(3. / 2.) * rho /
fc;
2508 double dAlDSig = 2. * ( 1. - yieldHardOne ) * Bl /
fc;
2509 double dBlDSig = 1. /
fc;
2511 double dAlDRho = 2. * ( 1. - yieldHardOne ) * Bl / (
fc * sqrt(6.) ) + sqrt(3. / 2.) /
fc;
2512 double dBlDRho = 1. / (
fc * sqrt(6.) );
2515 double ddgddSig = 4. * ( 1. - yieldHardOne ) /
fc * ( dAlDSig * Bl + Al * dBlDSig ) +
2516 pow(yieldHardOne, 2.) * dMQDSig /
fc;
2518 double ddgddRho = dAlDRho / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. ) +
2519 Al * dBlDRho * 4. * ( 1. - yieldHardOne ) / ( sqrt(6.) *
fc );
2521 double ddgdSigdRho = 4. * ( 1. - yieldHardOne ) /
fc * ( dAlDRho * Bl + Al * dBlDRho );
2523 double ddgdRhodSig = dAlDSig / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. )
2524 + Al / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * dBlDSig );
2527 answer(0, 0) = ddgddSig;
2528 answer(0, 1) = ddgdSigdRho;
2529 answer(1, 0) = ddgdRhodSig;
2530 answer(1, 1) = ddgddRho;
2548 for (
int i = 1; i <= principalStress.
giveSize(); i++ ) {
2549 if ( principalStress.
at(i) >= 0 ) {
2550 principalStressTension.
at(i) = principalStress.
at(i);
2551 principalStressCompression.
at(i) = 0.;
2553 principalStressTension.
at(i) = 0.;
2554 principalStressCompression.
at(i) = principalStress.
at(i);
2568 double squareNormOfPrincipalStress = 0.;
2569 for (
int i = 1; i <= principalStress.
giveSize(); i++ ) {
2570 squareNormOfPrincipalStress += pow(principalStress.
at(i), 2.);
2573 double alphaTension = 0.;
2575 if ( squareNormOfPrincipalStress > 0 ) {
2576 for (
int i = 1; i <= principalStress.
giveSize(); i++ ) {
2577 alphaTension += principalStressTension.
at(i) *
2578 ( principalStressTension.
at(i) + principalStressCompression.
at(i) ) / squareNormOfPrincipalStress;
2582 return 1. - alphaTension;
2589 if ( kappa <= 0. ) {
2591 }
else if ( kappa > 0. && kappa < 1. ) {
2606 if ( kappa <= 0. ) {
2608 }
else if ( kappa >= 0. && kappa < 1. ) {
2622 if ( kappa <= 0. ) {
2624 }
else if ( kappa > 0. && kappa < 1. ) {
2635 if ( kappa <= 0. ) {
2637 }
else if ( kappa >= 0. && kappa < 1. ) {
2648 if ( mode == ElasticStiffness ) {
2650 answer.
at(1, 1) =
eM;
2651 }
else if ( mode == SecantStiffness ) {
2660 if ( om > 0.999999 ) {
2665 answer.
at(1, 1) =
eM;
2666 answer.
times(1.0 - om);
2668 OOFEM_WARNING(
"unknown type of stiffness (tangent stiffness not implemented for 1d). Elastic stiffness used!\n");
2670 answer.
at(1, 1) =
eM;
2680 if ( mode == ElasticStiffness ) {
2682 }
else if ( mode == SecantStiffness ) {
2684 }
else if ( mode == TangentStiffness ) {
2685 OOFEM_WARNING(
"unknown type of stiffness (tangent stiffness not implemented). Elastic stiffness used!");
2703 answer.
times(1. - omegaTension);
2711 effectiveStress.
beProductOf(answer, elasticStrain);
2722 for (
int i = 1; i <= 3; i++ ) {
2728 answer.
times(1. - omegaTension);
2737 sigNew = stress[0] / 3.;
2738 rhoNew = stress[0] * sqrt(2. / 3.);
2739 if ( sigNew >= 0 ) {
2742 thetaNew =
M_PI / 6;
2766 if ( tempKappaP > kappaP ) {
2767 if ( tempDamageTension > damageTension || tempDamageTension == 1. ||
2768 tempDamageCompression > damageCompression || tempDamageCompression == 1. ) {
2775 if ( tempDamageTension > damageTension || tempDamageTension == 1. ||
2776 tempDamageCompression > damageCompression || tempDamageCompression == 1. ) {
2800 dJ2DStress = deviatoricStress;
2801 for (
int i = 3; i < size; i++ ) {
2802 dJ2DStress(i) = deviatoricStress(i) * 2.0;
2806 answer = dJ2DStress;
2807 answer.
times(1. / rho);
2814 for (
int i = 0; i < 3; i++ ) {
2815 answer(i) = 1. / 3.;
2818 for (
int i = 3; i < size; i++ ) {
2839 dJ2dstress = deviatoricStress;
2840 for (
int i = 3; i < deviatoricStress.
giveSize(); i++ ) {
2841 dJ2dstress(i) = deviatoricStress(i) * 2.;
2846 ddJ2ddstress.
zero();
2847 for (
int i = 0; i < size; i++ ) {
2849 ddJ2ddstress(i, i) = 2. / 3.;
2853 ddJ2ddstress(i, i) = 2.;
2857 ddJ2ddstress(0, 1) = -1. / 3.;
2858 ddJ2ddstress(0, 2) = -1. / 3.;
2859 ddJ2ddstress(1, 0) = -1. / 3.;
2860 ddJ2ddstress(1, 2) = -1. / 3.;
2861 ddJ2ddstress(2, 0) = -1. / 3.;
2862 ddJ2ddstress(2, 1) = -1. / 3.;
2865 answer = ddJ2ddstress;
2866 answer.
times(1. / rho);
2868 answer.
plusDyadUnsym(dJ2dstress, dJ2dstress, -1. / ( rho * rho * rho ));
2880 case IST_PlasticStrainTensor:
2884 case IST_DamageTensor:
2892 #ifdef keep_track_of_dissipated_energy 2893 case IST_StressWorkDensity:
2898 case IST_DissWorkDensity:
2903 case IST_FreeEnergyDensity:
void computeDDRhoDDStress(FloatMatrix &answer, const FloatArray &stress) const
Computes the seconfd derivative of rho with the respect to the stress.
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
#define _IFT_ConcreteDPM2_softeningType
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
#define _IFT_ConcreteDPM2_isoflag
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
void subtract(const FloatArray &src)
Subtracts array src to receiver.
double mQ
Dilation parameter of the plastic potential.
double kM
Elastic bulk modulus.
#define _IFT_ConcreteDPM2_kinit
double timeFactor
Input parameter which simulates a loading rate. Only for debugging purposes.
double giveKappaDCompressionTwo() const
Get the compression hardening variable two of the damage model from the material status.
void letTempPlasticStrainBe(const FloatArray &v)
Assign the temp value of deviatoric plastic strain.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
void computeDSigDStress(FloatArray &answer) const
Computes the derivative of sig with respect to the stress.
virtual void give1dStressStiffMtrx(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Method for computing 1d stiffness matrix of receiver.
void letTempKappaDCompressionOneBe(double v)
Assign the temp value of the hardening variable of the damage model.
double computeDGDInv1d(double sig, double tempKappa)
Compute derivative the palstic potential function with respect to the stress state.
void letTempKappaDTensionBe(double v)
Assign the temp value of the rate factor of the damage model.
double giveKappaDCompression() const
Get the temp value of the hardening variable of the damage model from the material status...
double giveKappaDTension() const
Get the temp value of the hardening variable of the damage model from the material status...
void computeDGDInv(FloatArray &answer, double sig, double rho, double tempKappa)
Compute derivative the palstic potential function with respect to the stress state.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
virtual double computeDamageParamTension(double equivStrain, double kappaOne, double kappaTwo, double le, double omegaOld)
Compute damage parameter.
MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
double tempKappaDCompressionOne
#define _IFT_ConcreteDPM2_dhard
GaussPoint * gp
Associated integration point.
#define _IFT_ConcreteDPM2_helem
double fcZero
This parameter is needed for the rate dependence. It should be read in if rate dependence is consider...
virtual double computeLength()
Computes the length (zero for all but 1D geometries)
double computeRatioPotential(double sig, double tempKappa)
This function computes the ratio of the volumetric and deviatoric component of the flow direction...
double computeRateFactor(double alpha, double timeFactor, GaussPoint *gp, TimeStep *deltaTime)
This function computes the rate factor which is used to take into account the strain rate dependence ...
For computing principal stresses.
For computing principal strains from engineering strains.
double giveKappaDCompressionOne() const
Get the compression hardening variable one of the damage model from the material status.
virtual ~ConcreteDPM2Status()
Destructor.
double computeMeanSize()
Computes the size of the element defined as its length.
double performRegularReturn(FloatArray &stress, double kappaP, GaussPoint *gp)
Perform regular stress return for the plasticity model, i.e.
bool solveForRhs(const FloatArray &b, FloatArray &answer, bool transpose=false)
Solves the system of linear equations .
#define _IFT_ConcreteDPM2_chard
void computeJacobian(FloatMatrix &answer, double sig, double rho, double tempKappa, double deltaLambda, GaussPoint *gp)
Compute jacobian for 2D(plane strain) and 3d cases.
const FloatArray & givePlasticStrain() const
Get the plastic strain deviator from the material status.
double m
Friction parameter of the yield surface.
static double computeSecondCoordinate(const FloatArray &s)
FloatArray tempStrainVector
Temporary strain vector in reduced form (to find balanced state)
#define _IFT_ConcreteDPM2_asoft
#define _IFT_ConcreteDPM2_dilation
double eM
Elastic Young's modulus.
void letTempKappaDCompressionBe(double v)
Assign the temp value of the rate factor of the damage model.
int newtonIter
Maximum number of iterations for stress return.
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
double giveEquivStrainCompression() const
Get the compression equivalent strain from the material status.
double ASoft
Parameter of the ductilityMeasure of the damage model.
contextIOResultType storeYourself(DataStream &stream) const
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.
int giveGlobalNumber() const
int checkForUnAndReloading(double &tempEquivStrain, double &minEquivStrain, const FloatMatrix &D, GaussPoint *gp)
Check for un- and reloading in the damage part.
void letTempAlphaBe(double v)
This class implements a structural material status information.
void computeWork(GaussPoint *gp, double ft)
Computes the increment of total stress work and of dissipated work (gf is the dissipation density per...
LinearElasticMaterial * giveLinearElasticMaterial()
double performVertexReturn(FloatArray &stress, double apexStress, double tempKappaP, GaussPoint *gp)
Perform stress return for vertex case of the plasticity model, i.e.
FloatArray stressVector
Equilibrated stress vector in reduced form.
Dictionary propertyDictionary
Property dictionary.
void setTempStressWork(double w)
Sets the density of total work of stress on strain increments to given value.
void compute3dSecantStiffness(FloatMatrix &answer, GaussPoint *gp, TimeStep *tStep)
LinearElasticMaterial * linearElasticMaterial
Pointer for linear elastic material.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
double yieldHardInitial
Parameter of the hardening law of the plasticity model.
#define _IFT_ConcreteDPM2_ecc
Element * giveElement()
Returns corresponding element to receiver.
void computeDDKappaDDeltaLambdaDInv(FloatArray &answer, double sig, double rho, double tempKappa)
Computes the mixed derivative of the hardening parameter kappa with respect to the plastic multiplier...
void letTempDamageCompressionBe(double v)
Assign the temp value of the compressive damage variable of the damage model.
void letTempKappaDTensionTwoBe(double v)
Assign the temp value of the second tension hardening variable of the damage model.
void plusDyadUnsym(const FloatArray &a, const FloatArray &b, double dV)
Adds to the receiver the product .
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
void computeDDGDDInv(FloatMatrix &answer, double sig, double rho, double tempKappa)
Here, the second derivative of the plastic potential with respect to the invariants sig and rho are c...
double giveTempDamageCompression() const
Get the temp value of the hardening variable of the damage model from the material status...
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
static void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir, const FloatArray &s, stressStrainPrincMode mode)
Computes principal values and directions of stress or strain vector.
MatResponseMode
Describes the character of characteristic material matrix.
virtual int read(int *data, int count)=0
Reads count integer values into array pointed by data.
double helem
Element size (to be used in fracture energy approach (crack band).
double tempKappaDTensionTwo
double giveTempKappaP() const
Get the temp value of the hardening variable of the plasticity model from the material status...
virtual contextIOResultType saveContext(DataStream &, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
double computeDDuctilityMeasureDInv1d(double sigma, double tempKappa)
Compute derivative the ductility measure with respect to the stress state.
virtual double computeDuctilityMeasure(double sig, double rho, double theta)
Compute the ductility measure based on the stress state.
void computeTrialCoordinates(const FloatArray &stress, double &sig, double &rho, double &theta)
Compute the trial coordinates.
void letTempStateFlagBe(const int v)
Assign the temp value of the state flag.
double AHard
Parameter of the ductilityMeasure of the plasticity model.
double giveDissWork()
Returns the density of dissipated work.
double equivStrainCompression
void letTempRateStrainBe(double v)
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Sets receiver to be a - b.
void computeDFDInv(FloatArray &answer, double sig, double rho, double tempKappa) const
Computes the derivative of the yield surface with respect to the invariants sig and rho...
double giveTimeIncrement()
Returns solution step associated time increment.
double giveRateFactor() const
Get the rate factor of the damage model from the material status.
bool isTheFirstStep()
Check if receiver is first step.
double tempStressWork
Non-equilibrated density of total work done by stresses on strain increments.
#define _IFT_ConcreteDPM2_newtoniter
double computeDuctilityMeasureDamage(const FloatArray &strain, GaussPoint *gp)
Compute the ductility measure for the damage model.
virtual void giveRealStressVector_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &strainVector, TimeStep *tStep)
Default implementation relies on giveRealStressVector for second Piola-Kirchoff stress.
const FloatArray & giveTempPlasticStrain() const
Get the temp value of the full plastic strain vector from the material status.
virtual int write(const int *data, int count)=0
Writes count integer values from array pointed by data.
double tempEquivStrainTension
double computeDDKappaDDeltaLambdaDInv1d(double sigma, double tempKappa)
void letTempDamageTensionBe(double v)
Assign the temp value of the tensile damage variable of the damage model.
double giveEquivStrain() const
Get the equivalent strain from the material status.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
double computeDKappaDDeltaLambda(double sig, double rho, double tempKappa)
Compute the derivative of kappa with respect of delta lambda based on the stress state and the harden...
#define _IFT_IsotropicLinearElasticMaterial_talpha
#define _IFT_IsotropicLinearElasticMaterial_n
FloatArray tempPlasticStrain
double yieldHardPrimePeak
Parameter of the hardening law of the plasticity model.
#define OOFEM_LOG_INFO(...)
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
double dotProduct(const FloatArray &x) const
Computes the dot product (or inner product) of receiver and argument.
void assignStateFlag(GaussPoint *gp)
Assign state flag.
double wfOne
Control parameter for the bilinear softening law in tension.
This class implements an isotropic linear elastic material in a finite element problem.
#define _IFT_ConcreteDPM2_timeFactor
double thetaTrial
Lode angle of the trial stress..
void initDamaged(double kappa, const FloatArray &strain, GaussPoint *gp)
Initialize the characteristic length, if damage is not yet activated Set the increase factor for the ...
double tempDissWork
Non-equilibrated density of dissipated work.
double nu
Elastic poisson's ration.
double BHard
Parameter of the ductilityMeasure of the plasticity model.
#define _IFT_ConcreteDPM2_rateFlag
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
void computeDDuctilityMeasureDInv(FloatArray &answer, double sig, double rho, double tempKappa)
Compute derivative the ductility measure with respect to the stress state.
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 giveRealStressVector_1d(FloatArray &answer, GaussPoint *gp, const FloatArray &totalStrain, TimeStep *tStep)
Default implementation relies on giveRealStressVector_StressControl.
double dilationConst
Control parameter for te volumetric plastic flow of the plastic potential.
double computeDFDInv1d(double sigma, double tempKappa) const
void times(double f)
Multiplies receiver by factor f.
void setLe(double ls)
Sets the characteristic length.
void computeDDGDInvDKappa(FloatArray &answer, double sig, double rho, double tempKappa)
Here, the mixed derivative of the plastic potential with respect to the invariants and the hardening ...
double computeDeltaPlasticStrainNormCompression(double tempAlpha, double tempKappaD, double kappaD, GaussPoint *gp)
double efCompression
Control parameter for the exponential softening law.
contextIOResultType restoreYourself(DataStream &stream)
#define _IFT_ConcreteDPM2_wf
double giveRateStrain() const
#define _IFT_ConcreteDPM2_hp
double computeDFDKappa(double sig, double rho, double tempKappa, bool mode1d)
Compute the derivative of the yield surface with respect to the hardening variable based on the stres...
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
#define _IFT_IsotropicLinearElasticMaterial_e
void letTempRateFactorBe(double v)
Assign the temp value of the rate factor of the damage model.
void computeDamage(FloatArray &answer, const FloatArray &strain, const FloatMatrix &D, double timeFactor, GaussPoint *gp, TimeStep *tStep, double alpha)
Compute damage parameters.
bool checkForVertexCase(double &answer, double sig, double tempKappa, bool mode1d)
Check if the trial stress state falls within the vertex region of the plasticity model at the apex of...
const FloatArray & giveTempStrainVector() const
Returns the const pointer to receiver's temporary strain vector.
double giveTempStressWork()
Returns the temp density of total work of stress on strain increments.
double computeTempKappa(double kappaInitial, double sigTrial, double rhoTrial, double sig)
Compute tempKappa.
ConcreteDPM2_ReturnType returnType
double kappaDCompressionOne
virtual void give1dStressStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Method for computing 1d stiffness matrix of receiver.
double at(int i, int j) const
Coefficient access function.
double stressWork
Density of total work done by stresses on strain increments.
ConcreteDPM2Status(int n, Domain *d, GaussPoint *gp)
Constructor.
virtual double computeDamageParamCompression(double equivStrain, double kappaOne, double kappaTwo, double omegaOld)
double wf
Control parameter for the linear/bilinear softening law in tension.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
double tempKappaDTensionOne
double computeDDGDDInv1d(double sigma, double tempKappa)
Here, the second derivative of the plastic potential with respect to the invariants sig and rho are c...
double yieldTol
yield tolerance for the plasticity model.
double giveKappaP() const
Get the hardening variable of the plasticity model.
double giveDamageTension() const
Get the tension damage variable of the damage model from the material status.
void setTempDissWork(double w)
Sets the density of dissipated work to given value.
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 ...
Abstract base class representing a material status information.
Pair * add(int aKey, double value)
Adds a new Pair with given keyword and value into receiver.
static double computeThirdCoordinate(const FloatArray &s)
double tempEquivStrainCompression
Class representing vector of real numbers.
This class implements the material status associated to ConcreteDPM2.
double tempKappaDCompressionTwo
double computeHardeningTwo(double tempKappa) const
Compute the value of the hardening function based on the hardening variable.
virtual ~ConcreteDPM2()
Destructor.
double computeDDKappaDDeltaLambdaDKappa1d(double sig, double tempKappa)
FloatArray strainVector
Equilibrated strain vector in reduced form.
Implementation of matrix containing floating point numbers.
IRResultType
Type defining the return values of InputRecord reading operations.
double ftOne
Control parameter for the bilinear softening law.
virtual contextIOResultType restoreContext(DataStream &, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
#define _IFT_ConcreteDPM2_yieldtol
double kappaDCompressionTwo
double computeYieldValue(double sig, double rho, double theta, double tempKappa) const
Compute the yield value based on stress and hardening variable.
double DHard
Parameter of the ductilityMeasure of the plasticity model.
double giveDamageCompression() const
Get the compressive damage variable of the damage model from the material status. ...
double computeNorm() const
Computes the norm (or length) of the vector.
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
double tempKappaDCompression
double equivStrainTension
double computeDDKappaDDeltaLambdaDKappa(double sig, double rho, double tempKappa)
Computes the derivative of the evolution law of the hardening parameter kappa with respect to the har...
void performPlasticityReturn(GaussPoint *gp, const FloatMatrix &D, const FloatArray &strain)
Perform stress return of the plasticity model and compute history variables.
double computeAlpha(FloatArray &effectiveStressTension, FloatArray &effectiveStressCompression, FloatArray &effectiveStress)
double rho
Length of the deviatoric stress.
int softeningType
Type of softening function used.
double computeHardeningOnePrime(double tempKappa) const
Compute the derivative of the hardening function based on the hardening parameter.
double giveTempDamageTension() const
Get the temp value of the hardening variable of the damage model from the material status...
void zero()
Zeroes all coefficients of receiver.
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
Returns the size of element in the given direction, in some cases adjusted (e.g.
double yieldTolDamage
yield tolerance for the damage model.
double giveLe()
Gives the characteristic length.
int state_flag
Indicates the state (i.e. elastic, unloading, plastic, damage, vertex) of the Gauss point...
double fc
Parameters of the yield surface of the plasticity model. fc is the uniaxial compressive strength...
void times(double s)
Multiplies receiver with scalar.
int strainRateFlag
Flag which signals if strainRate effects should be considered.
#define _IFT_ConcreteDPM2_ft
static double computeDeviatoricVolumetricSplit(FloatArray &dev, const FloatArray &s)
Computes split of receiver into deviatoric and volumetric part.
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
#define _IFT_ConcreteDPM2_wfOne
double rateStrain
Strains that are used for calculation of strain rates.
Abstract base class for all "structural" constitutive models.
#define _IFT_ConcreteDPM2_fcZero
void zero()
Zeroes all coefficient of receiver.
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
Domain * giveDomain() const
void letTempKappaPBe(double v)
Assign the temp value of the hardening variable of the plasticity model.
void compute1dJacobian(FloatMatrix &answer, double totalsigma, double tempKappa, double deltaLambda, GaussPoint *gp)
Compute jacobian for 1D case.
double giveStressWork()
Returns the density of total work of stress on strain increments.
double computeDKappaDDeltaLambda1d(double sig, double tempKappa)
int min(int i, int j)
Returns smaller value from two given decimals.
double gM
Elastic shear modulus.
double computeHardeningOne(double tempKappa) const
Compute the value of the hardening function based on the hardening variable.
#define _IFT_ConcreteDPM2_ftOne
int giveStateFlag() const
Get the state flag from the material status.
void letTempEquivStrainCompressionBe(double v)
Assign the temp value of the rate factor of the damage model.
REGISTER_Material(DummyMaterial)
double computeDeltaPlasticStrainNormTension(double tempKappaD, double kappaD, GaussPoint *gp)
Compute equivalent strain value.
double sig
Volumetric stress.
#define _IFT_ConcreteDPM2_bhard
ConcreteDPM2_ReturnResult returnResult
void letTempKappaDCompressionTwoBe(double v)
Assign the temp value of the second compression hardening variable of the damage model.
int giveSize() const
Returns the size of receiver.
double computeHardeningTwoPrime(double tempKappa) const
Compute the derivative of the hardening function based on the hardening parameter.
bool containsOnlyZeroes() const
Returns nonzero if all coefficients of the receiver are 0, else returns zero.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
#define _IFT_ConcreteDPM2_ahard
#define _IFT_ConcreteDPM2_efc
the oofem namespace is to define a context or scope in which all oofem names are defined.
virtual void initTempStatus(GaussPoint *gp)
Initializes temporary variables stored in integration point status at the beginning of new time step...
void beInverseOf(const FloatMatrix &src)
Modifies receiver to become inverse of given parameter.
void computeDRhoDStress(FloatArray &answer, const FloatArray &stress) const
Computes the derivative of rho with respect to the stress.
virtual double computeEquivalentStrain(double sig, double rho, double theta)
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
#define _IFT_ConcreteDPM2_fc
FloatArray tempStressVector
Temporary stress vector in reduced form (increments are used mainly in nonlinear analysis) ...
static void transformStressVectorTo(FloatArray &answer, const FloatMatrix &base, const FloatArray &stressVector, bool transpose=false)
Transforms 3d stress vector into another coordinate system.
void letTempEquivStrainBe(double v)
Assign the temp value of the rate factor of the damage model.
Class representing integration point in finite element program.
#define OOFEM_WARNING(...)
double computeDDGDInvDKappa1d(double sigma, double tempKappa)
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
ConcreteDPM2(int n, Domain *d)
Constructor.
Class representing solution step.
double CHard
Parameter of the ductilityMeasure of the plasticity model.
void add(const FloatArray &src)
Adds array src to receiver.
double giveKappaDTensionTwo() const
Get the tension hardening variable two of the damage model from the material status.
double dissWork
Density of dissipated work.
double tempDamageCompression
double giveKappaDTensionOne() const
Get the hardening variable of the damage model from the material status.
void resize(int s)
Resizes receiver towards requested size.
void letTempKappaDTensionOneBe(double v)
Assign the temp value of the hardening variable of the damage model.
double giveEquivStrainTension() const
Get the tension equivalent strain from the material status.
void letTempEquivStrainTensionBe(double v)
Assign the temp value of the rate factor of the damage model.