96#ifdef keep_track_of_dissipated_energy
143#ifdef keep_track_of_dissipated_energy
155 fprintf(file,
"\tstatus { ");
160 fprintf(file,
"Elastic, ");
163 fprintf(file,
"Unloading, ");
166 fprintf(file,
"Plastic, ");
169 fprintf(file,
"Damage, ");
172 fprintf(file,
"PlasticDamage, ");
179 fprintf(file,
" reduced ");
181 fprintf(file,
" %.10e", val);
184 fprintf(file,
" plastic ");
186 fprintf(file,
" %.10e", val);
189 fprintf(file,
" inelastic ");
190 for (
auto &val : inelasticStrainVector ) {
191 fprintf(file,
" %.10e", val);
200 fprintf(file,
" kappaP %.10e,",
kappaP);
214 fprintf(file,
" alpha %.10e,", this->
alpha);
216#ifdef keep_track_of_dissipated_energy
219 fprintf(file,
"}\n");
313#ifdef keep_track_of_dissipated_energy
414#ifdef keep_track_of_dissipated_energy
426#ifdef keep_track_of_dissipated_energy
434 auto deltaTotalStrain = tempTotalstrain - totalstrain;
470#define IDM_ITERATION_LIMIT 1.e-8
484 return mode == _3dMat;
505 this->
gM = this->
eM / ( 2. * ( 1. + this->
nu ) );
506 this->
kM = this->
eM / ( 3. * ( 1. - 2. * this->
nu ) );
511 this->
e0 = this->
ft / this->
eM;
569 m = 3. * ( pow(this->
fc, 2.) - pow(this->
ft, 2.) ) / ( this->
fc * this->
ft ) * this->
ecc / ( this->
ecc + 1. );
583 OOFEM_ERROR(
"strength rate type not implemented. Must be 0, 1 or 2\n");
749 if ( !stream.
read(
m) ) {
821 auto strainVector = fullStrainVector - thermalStrain;
823 status->letTempReducedStrainBe(strainVector);
846 alpha =
computeAlpha(effectiveStressTension, effectiveStressCompression, effectiveStress);
847 auto damages =
computeDamage(strainVector, D, dt, gp, tStep, alpha, effectiveStress);
850 stress = effectiveStressTension * ( 1. - damages.at(1) ) + effectiveStressCompression * ( 1. - damages.at(2) );
852 stress = effectiveStress * ( 1. - ( 1. - alpha ) * damages.at(1) ) * ( 1. - alpha * damages.at(2) );
854 stress = effectiveStress * ( 1. - damages.at(1) );
856 OOFEM_ERROR(
"Unknown value of damage flag. Must be 0, 1, 2 or 3");
859 stress = effectiveStress;
862 status->letTempStrainVectorBe(fullStrainVector);
863 status->letTempAlphaBe(alpha);
864 status->letTempStressVectorBe(stress);
865 status->letTempEffectiveStressBe(effectiveStress);
866#ifdef keep_track_of_dissipated_energy
867 double gf = pow(
ft, 2) / this->
eM;
868 status->computeWork(gp, gf);
886 double tempEquivStrain;
887 double deltaPlasticStrainNorm;
888 double tempDamageTension = 0.0;
889 double tempDamageCompression = 0.0;
891 double tempKappaDTension = 0.0, tempKappaDCompression = 0.0;
892 double tempKappaDTensionOne = 0.0, tempKappaDTensionTwo = 0.0;
893 double tempKappaDCompressionOne = 0.0, tempKappaDCompressionTwo = 0.0;
895 double minEquivStrain = 0.;
897 double sig, rho, theta;
904 if ( ( status->giveDamageTension() == 0. ) && ( status->giveDamageCompression() == 0. ) ) {
907 rateFactor = status->giveRateFactor();
912 double tempEquivStrainTension = 0.;
913 double tempEquivStrainCompression = 0.;
915 tempEquivStrainTension = status->giveEquivStrainTension() + ( tempEquivStrain - status->giveEquivStrain() ) / rateFactor;
917 if ( unAndReloadingFlag == 0 ) {
918 tempEquivStrainCompression = status->giveEquivStrainCompression() + ( tempAlpha * ( tempEquivStrain - status->giveEquivStrain() ) ) / rateFactor;
920 tempEquivStrainCompression = status->giveEquivStrainCompression() + status->giveAlpha() * ( minEquivStrain - status->giveEquivStrain() ) / rateFactor + ( tempAlpha * ( tempEquivStrain - minEquivStrain ) ) / rateFactor;
925 if ( ( tempEquivStrainTension >
e0 || tempEquivStrainCompression >
e0 ) &&
926 ( ( status->giveDamageTension() == 0. ) && ( status->giveDamageCompression() == 0. ) ) && !tStep->
isTheFirstStep() ) {
928 rateFactor = status->giveRateFactor();
930 tempEquivStrainTension = status->giveEquivStrainTension() + ( tempEquivStrain - status->giveEquivStrain() ) / rateFactor;
931 if ( unAndReloadingFlag == 0 ) {
932 tempEquivStrainCompression = status->giveEquivStrainCompression() + ( tempAlpha * ( tempEquivStrain - status->giveEquivStrain() ) ) / rateFactor;
934 tempEquivStrainCompression = status->giveEquivStrainCompression() + status->giveAlpha() * ( minEquivStrain - status->giveEquivStrain() ) / rateFactor + ( tempAlpha * ( tempEquivStrain - minEquivStrain ) ) / rateFactor;
938 status->letTempRateFactorBe(rateFactor);
940 double fTension = tempEquivStrainTension - status->giveKappaDTension();
941 double fCompression = tempEquivStrainCompression - status->giveKappaDCompression();
944 fTension = fTension /
e0;
945 fCompression = fCompression /
e0;
948 double deltaPlasticStrainNormTension, deltaPlasticStrainNormCompression;
953 tempKappaDTension = status->giveKappaDTension();
954 tempKappaDTensionOne = status->giveKappaDTensionOne();
955 tempKappaDTensionTwo = status->giveKappaDTensionTwo();
957 tempKappaDCompression = status->giveKappaDCompression();
958 tempKappaDCompressionOne = status->giveKappaDCompressionOne();
959 tempKappaDCompressionTwo = status->giveKappaDCompressionTwo();
961 tempDamageTension = status->giveDamageTension();
962 tempDamageCompression = status->giveDamageCompression();
965 tempKappaDTension = tempEquivStrainTension;
967 tempKappaDTensionOne = status->giveKappaDTensionOne() + deltaPlasticStrainNorm / ductilityMeasure / rateFactor;
968 tempKappaDTensionTwo = status->giveKappaDTensionTwo() + ( tempKappaDTension - status->giveKappaDTension() ) / ductilityMeasure;
971 tempKappaDCompression = status->giveKappaDCompression();
972 tempKappaDCompressionOne = status->giveKappaDCompressionOne();
973 tempKappaDCompressionTwo = status->giveKappaDCompressionTwo();
978 tempDamageTension =
computeDamageParamTension(tempKappaDTension, tempKappaDTensionOne, tempKappaDTensionTwo, status->giveLe(), status->giveDamageTension(), rateFactor);
980 tempDamageCompression = status->giveDamageCompression();
981 }
else if ( fTension < -yieldTolDamage && fCompression >= -
yieldTolDamage ) {
985 tempKappaDTension = status->giveKappaDTension();
986 tempKappaDTensionOne = status->giveKappaDTensionOne();
987 tempKappaDTensionTwo = status->giveKappaDTensionTwo();
990 tempKappaDCompression = tempEquivStrainCompression;
992 tempKappaDCompressionOne = status->giveKappaDCompressionOne() + deltaPlasticStrainNormCompression / ( ductilityMeasure * rateFactor );
993 tempKappaDCompressionTwo = status->giveKappaDCompressionTwo() + ( tempKappaDCompression - status->giveKappaDCompression() ) / ductilityMeasure;
996 tempDamageTension = status->giveDamageTension();
997 tempDamageCompression =
computeDamageParamCompression(tempKappaDCompression, tempKappaDCompressionOne, tempKappaDCompressionTwo, status->giveDamageCompression(), rateFactor);
1002 tempKappaDTension = tempEquivStrainTension;
1004 tempKappaDTensionOne = status->giveKappaDTensionOne() + deltaPlasticStrainNormTension / ( ductilityMeasure * rateFactor );
1005 tempKappaDTensionTwo = status->giveKappaDTensionTwo() + ( tempKappaDTension - status->giveKappaDTension() ) / ductilityMeasure;
1008 tempKappaDCompression = tempEquivStrainCompression;
1009 deltaPlasticStrainNormCompression =
1011 tempKappaDCompressionOne = status->giveKappaDCompressionOne() + deltaPlasticStrainNormCompression / ( ductilityMeasure * rateFactor );
1012 tempKappaDCompressionTwo = status->giveKappaDCompressionTwo() +
1013 ( tempKappaDCompression - status->giveKappaDCompression() ) / ductilityMeasure;
1018 tempDamageTension =
computeDamageParamTension(tempKappaDTension, tempKappaDTensionOne, tempKappaDTensionTwo, status->giveLe(), status->giveDamageTension(), rateFactor);
1020 tempDamageCompression =
computeDamageParamCompression(tempKappaDCompression, tempKappaDCompressionOne, tempKappaDCompressionTwo, status->giveDamageCompression(), rateFactor);
1024 status->letTempEquivStrainBe(tempEquivStrain);
1027 status->letTempEquivStrainTensionBe(tempEquivStrainTension);
1028 status->letTempKappaDTensionBe(tempKappaDTension);
1029 status->letTempKappaDTensionOneBe(tempKappaDTensionOne);
1030 status->letTempKappaDTensionTwoBe(tempKappaDTensionTwo);
1031 status->letTempDamageTensionBe(tempDamageTension);
1034 status->letTempEquivStrainCompressionBe(tempEquivStrainCompression);
1035 status->letTempKappaDCompressionBe(tempKappaDCompression);
1036 status->letTempKappaDCompressionOneBe(tempKappaDCompressionOne);
1037 status->letTempKappaDCompressionTwoBe(tempKappaDCompressionTwo);
1038 status->letTempDamageCompressionBe(tempDamageCompression);
1041 tempDamageTension, tempDamageCompression
1047 double &minEquivStrain,
1055 const auto &strain = status->giveTempReducedStrain();
1058 auto tempElasticStrain = strain - status->giveTempPlasticStrain();
1059 auto tempEffectiveStress =
dot(D, tempElasticStrain);
1061 double sigEffective, rhoEffective, thetaEffective;
1065 double equivStrain = status->giveEquivStrain();
1068 auto elasticStrain = oldStrain - status->givePlasticStrain();
1069 auto effectiveStress =
dot(D, elasticStrain);
1071 auto deltaEffectiveStress = tempEffectiveStress - effectiveStress;
1075 auto intermediateEffectiveStressPlus = effectiveStress + 0.01 * deltaEffectiveStress;
1076 computeCoordinates(intermediateEffectiveStressPlus, sigEffective, rhoEffective, thetaEffective);
1080 auto intermediateEffectiveStressMinus = effectiveStress + 0.99 * deltaEffectiveStress;
1081 computeCoordinates(intermediateEffectiveStressMinus, sigEffective, rhoEffective, thetaEffective);
1085 int unloadingFlag = 0;
1086 minEquivStrain = equivStrain;
1088 if ( ( equivStrain > equivStrainPlus && tempEquivStrain > tempEquivStrainMinus ) &&
1089 ( fabs(equivStrainPlus - equivStrain) >
yieldTolDamage / 100. && fabs(tempEquivStrainMinus - tempEquivStrain) >
yieldTolDamage / 100. ) ) {
1092 for (
double k = 1.0; k <= 100.0; k = k + 1.0 ) {
1093 auto intermediateEffectiveStress = effectiveStress + k / 100. * deltaEffectiveStress;
1094 computeCoordinates(intermediateEffectiveStress, sigEffective, rhoEffective, thetaEffective);
1097 if ( midEquivStrain <= minEquivStrain ) {
1098 minEquivStrain = midEquivStrain;
1100 return unloadingFlag;
1104 return unloadingFlag;
1126 double maxStrain = -1.e20, minStrain = 1.e20;
1127 for (
int k = 1; k <= principalStrain.giveSize(); k++ ) {
1129 if ( principalStrain.at(k) > maxStrain ) {
1130 maxStrain = principalStrain.at(k);
1134 if ( principalStrain.at(k) < minStrain ) {
1135 minStrain = principalStrain.at(k);
1141 double oldRateStrain = status->giveRateStrain();
1143 strainRate = ( maxStrain - oldRateStrain ) /
deltaTime;
1144 status->letTempRateStrainBe(maxStrain);
1146 strainRate = ( minStrain - oldRateStrain ) /
deltaTime;
1147 status->letTempRateStrainBe(minStrain);
1152 double rateFactorTension = 1.;
1153 double strainRateRatioTension = strainRate / 1.e-6;
1156 if ( strainRate < 1.e-6 ) {
1157 rateFactorTension = 1.;
1158 }
else if ( 1.e-6 < strainRate ) {
1159 rateFactorTension = pow(strainRateRatioTension, 0.018);
1162 if ( strainRate < 1.e-6 ) {
1163 rateFactorTension = 1.;
1164 }
else if ( 1.e-6 < strainRate && strainRate < 10 ) {
1165 rateFactorTension = pow(strainRateRatioTension, 0.018);
1167 rateFactorTension = 0.0062 * pow(strainRateRatioTension, 1. / 3.);
1172 double rateFactorCompression = 1.;
1173 double strainRateRatioCompression = strainRate / ( -30.e-6 );
1175 if ( strainRate > -30.e-6 ) {
1176 rateFactorCompression = 1.;
1177 }
else if ( -30.e-6 > strainRate ) {
1178 rateFactorCompression = pow(strainRateRatioCompression, 0.014);
1181 if ( strainRate > -30.e-6 ) {
1182 rateFactorCompression = 1.;
1183 }
else if ( -30.e-6 > strainRate && strainRate > -30 ) {
1184 rateFactorCompression = pow(strainRateRatioCompression, 0.014);
1186 rateFactorCompression = 0.012 * pow(strainRateRatioCompression, 0.333);
1190 double rateFactor = ( 1. - alpha ) * rateFactorTension + alpha * rateFactorCompression;
1202 const auto &plasticStrain = status->givePlasticStrain();
1204 auto deltaPlasticStrain = tempPlasticStrain - plasticStrain;
1206 double deltaPlasticStrainNorm = 0;
1212 deltaPlasticStrainNorm = 0.;
1214 factor = ( 1. - (
e0 - kappaD ) / ( tempKappaD - kappaD ) );
1215 deltaPlasticStrain *= factor;
1216 deltaPlasticStrainNorm =
norm(deltaPlasticStrain);
1218 deltaPlasticStrainNorm =
norm(deltaPlasticStrain);
1221 return deltaPlasticStrainNorm;
1231 const auto &plasticStrain = status->givePlasticStrain();
1233 auto deltaPlasticStrain = tempAlpha * ( tempPlasticStrain - plasticStrain );
1235 double deltaPlasticStrainNorm = 0;
1239 deltaPlasticStrainNorm = 0.;
1241 double factor = ( 1. - (
e0 - kappaD ) / ( tempKappaD - kappaD ) );
1242 deltaPlasticStrain *= factor;
1243 deltaPlasticStrainNorm =
norm(deltaPlasticStrain);
1245 deltaPlasticStrainNorm =
norm(deltaPlasticStrain);
1248 double tempKappaP = status->giveTempKappaP();
1251 if ( rho < 1.e-16 ) {
1252 extraFactor = this->
ft * yieldHardTwo * sqrt(2. / 3.) / 1.e-16 / sqrt(1. + 2. * pow(this->
dilationConst, 2.) );
1254 extraFactor = this->
ft * yieldHardTwo * sqrt(2. / 3.) / rho / sqrt(1. + 2. * pow(this->
dilationConst, 2.) );
1257 return deltaPlasticStrainNorm * extraFactor;
1266 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) );
1268 double pHelp = -this->
m * ( rho * rFunction / ( sqrt(6.) *
fc ) + sig /
fc );
1270 double qHelp = -3. / 2. * pow(rho, 2.) / pow(this->
fc, 2.);
1272 double help = -0.5 * pHelp + sqrt(pow(pHelp, 2.) / 4. - qHelp);
1274 double tempEquivStrain = 0.;
1276 tempEquivStrain = help *
e0;
1278 return tempEquivStrain;
1290 double wfMod = this->
wf;
1291 double wfOneMod = this->
wfOne;
1295 wfMod /= pow(rateFactor, 2.);
1296 wfOneMod /= pow(rateFactor, 2.);
1298 wfMod /= rateFactor;
1299 wfOneMod /= rateFactor;
1306 omega = ( this->
eM * equivStrain * wfMod - ftTemp * wfMod + ftTemp * kappaOne * le ) /
1307 ( this->
eM * equivStrain * wfMod - ftTemp * le * kappaTwo );
1309 omega = ( this->
eM * equivStrain * wfOneMod - ftTemp * wfOneMod - ( this->
ftOne - ftTemp ) * kappaOne * le ) /
1310 ( this->
eM * equivStrain * wfOneMod + ( this->
ftOne - ftTemp ) * le * kappaTwo );
1311 help = le * kappaOne + le * omega * kappaTwo;
1313 if ( help >= 0. && help < wfOneMod ) {
1317 omega = ( this->
eM * equivStrain * ( wfMod - wfOneMod ) - this->
ftOne * ( wfMod - wfOneMod ) +
1318 this->
ftOne * kappaOne * le - this->
ftOne * wfOneMod ) /
1319 ( this->
eM * equivStrain * ( wfMod - wfOneMod ) - this->
ftOne * le * kappaTwo );
1320 help = le * kappaOne + le * omega * kappaTwo;
1322 if ( help > wfOneMod && help < wfMod ) {
1327 double residual = 0.;
1328 double dResidualDOmega = 0.;
1334 residual = ( 1 - omega ) * this->
eM * equivStrain - ftTemp * exp(-le * ( omega * kappaTwo + kappaOne ) / wfMod);
1335 dResidualDOmega = -this->
eM * equivStrain + ftTemp * le * kappaTwo / wfMod * exp(-le * ( omega * kappaTwo + kappaOne ) / wfMod);
1337 omega -= residual / dResidualDOmega;
1341 }
while ( fabs(residual / ftTemp) >= 1.e-8 );
1352 if ( omega < 0. || omega < omegaOld ) {
1372 efCompressionMod /= pow(rateFactor, 2.);
1374 efCompressionMod /= rateFactor;
1380 double residual = 0.;
1381 double dResidualDOmega = 0.;
1387 residual = ( 1. - omega ) * this->
eM * equivStrain - ftTemp * exp(-( kappaOne + omega * kappaTwo ) / efCompressionMod);
1388 dResidualDOmega = -this->
eM * equivStrain + ftTemp * kappaTwo / efCompressionMod * exp(-( kappaOne + omega * kappaTwo ) / efCompressionMod);
1390 omega -= residual / dResidualDOmega;
1394 }
while ( fabs(residual /
ft) >= 1.e-8 );
1402 if ( omega < omegaOld || omega < 0. ) {
1423 status->setLe(
helem);
1424 }
else if ( status->giveDamageTension() == 0. && status->giveDamageCompression() == 0. ) {
1427 auto principalStrains = tmp.first;
1428 auto principalDir = tmp.second;
1432 for (
int i = 2; i <= 3; i++ ) {
1433 if ( principalStrains.at(i) > principalStrains.at(indx) ) {
1439 for (
int i = 1; i <= 3; i++ ) {
1440 crackPlaneNormal.
at(i) = principalDir.at(i, indx);
1451 }
else if ( status->giveLe() == 0. ) {
1465 double alphaZero = 0.40824829;
1469 if ( rho > 1.e-16 ) {
1470 Rs = -sig / ( alphaZero * rho );
1472 Rs = -sig * 1.e16 / alphaZero;
1478 return 1. + (
ASoft - 1. ) * Rs;
1491 auto tempPlasticStrain = status->givePlasticStrain();
1492 double tempKappaP = status->giveKappaP();
1496 const auto &oldStrain = status->giveReducedStrain();
1499 int subIncrementFlag = 0;
1501 double apexStress = 0.;
1502 int subincrementcounter = 0;
1505 subIncrementFlag = 0;
1506 auto convergedStrain = oldStrain;
1507 auto tempStrain = strain;
1508 auto deltaStrain = strain - oldStrain;
1515 auto elasticStrain = tempStrain - tempPlasticStrain;
1517 effectiveStress =
dot(D, elasticStrain);
1519 double sig, rho, theta;
1525 if ( yieldValue > 0. ) {
1528 tempKappaP =
performVertexReturn(effectiveStress, returnResult, returnType, apexStress, tempKappaP, gp);
1529 status->letTempKappaPBe(tempKappaP);
1537 tempKappaP =
performRegularReturn(effectiveStress, returnResult, returnType, tempKappaP, gp, theta);
1538 status->letTempKappaPBe(tempKappaP);
1542 tempPlasticStrain = status->givePlasticStrain();
1543 status->letTempPlasticStrainBe(tempPlasticStrain);
1544 status->letTempKappaPBe(tempKappaP);
1549 subincrementcounter++;
1550 if ( subincrementcounter > 10 ) {
1552 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) );
1554 const auto &help = status->giveTempPlasticStrain();
1555 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) );
1556 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) );
1559 double sig1, rho1, theta1;
1560 auto help1 =
dot(D, oldStrain - help);
1563 OOFEM_LOG_INFO(
"OLD Sig %g rho %g theta %g \n", sig1, rho1, theta1);
1564 OOFEM_LOG_INFO(
"NEW Sig %g rho %g theta %g \n", sig, rho, theta);
1570 OOFEM_LOG_INFO(
"KappaP old %g new %g yieldfun %g\n", status->giveTempKappaP(), tempKappaP, yieldValue);
1571 OOFEM_ERROR(
"Could not reach convergence with small deltaStrain, giving up.");
1572 }
else if ( subincrementcounter > 9 && tempKappaP < 1. ) {
1574 status->letTempKappaPBe(tempKappaP);
1577 subIncrementFlag = 1;
1579 tempStrain = convergedStrain + deltaStrain;
1580 }
else if ( returnResult ==
RR_Converged && subIncrementFlag == 0 ) {
1582 elasticStrain =
dot(C, effectiveStress);
1583 tempPlasticStrain = strain - elasticStrain;
1584 status->letTempPlasticStrainBe(tempPlasticStrain);
1585 }
else if ( returnResult ==
RR_Converged && subIncrementFlag == 1 ) {
1586 subincrementcounter = 0;
1588 elasticStrain =
dot(C, effectiveStress);
1589 tempPlasticStrain = tempStrain - elasticStrain;
1590 status->letTempPlasticStrainBe(tempPlasticStrain);
1592 subIncrementFlag = 0;
1594 convergedStrain = tempStrain;
1595 deltaStrain = strain - convergedStrain;
1596 tempStrain = strain;
1600 return effectiveStress;
1615 }
else if ( sig < 0. && tempKappa < 1. ) {
1627 double apexStress,
double tempKappaP,
1632 auto deviatoricStressTrial = tmp.first;
1633 auto sigTrial = tmp.second;
1639 double kappaInitial = tempKappaP;
1641 double sig2 = apexStress;
1651 if ( yieldValue * yieldValueMid >= 0. ) {
1654 return kappaInitial;
1657 double dSig, sigAnswer;
1658 if ( yieldValue < 0.0 ) {
1659 dSig = sig2 - sigTrial;
1662 dSig = sigTrial - sig2;
1666 for (
int j = 0; j < 250; j++ ) {
1669 double sigMid = sigAnswer + dSig;
1676 if ( yieldValueMid <= 0. ) {
1680 if ( fabs(yieldValueMid) <
yieldTol && yieldValueMid <= 0. ) {
1681 double ratioPotential =
1685 double ratioTrial = rhoTrial / ( sigTrial - sigAnswer );
1687 if ( ( ( ( ratioPotential >= ratioTrial ) && returnType ==
RT_Tension ) ) ||
1688 ( ( ratioPotential <= ratioTrial ) && returnType ==
RT_Compression ) ) {
1689 for (
int i = 0; i < 3; i++ ) {
1690 effectiveStress.
at(i + 1) = sigAnswer;
1693 for (
int i = 3; i < 6; i++ ) {
1694 effectiveStress.
at(i + 1) = 0.;
1701 return kappaInitial;
1706 for (
int i = 0; i < 3; i++ ) {
1707 effectiveStress.
at(i + 1) = sigAnswer;
1710 for (
int i = 3; i < 6; i++ ) {
1711 effectiveStress.
at(i + 1) = 0.;
1728 double equivalentDeltaPlasticStrain = sqrt(1. / 9. * pow( ( sigTrial - sig ) / (
kM ), 2. ) +
1729 pow(rhoTrial / ( 2. *
gM ), 2.) );
1731 double thetaVertex =
M_PI / 3.;
1734 return kappaInitial + equivalentDeltaPlasticStrain / ductilityMeasure;
1743 double thetaConst = pow(2. * cos(theta), 2.);
1744 double ductilityMeasure;
1745 double x = -( sig +
fc / 3 ) /
fc;
1751 ductilityMeasure = ( EHard * exp(x / FHard) +
DHard ) / thetaConst;
1756 return ductilityMeasure;
1763 double tempKappa)
const
1770 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
1772 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
1775 double R = ( sig -
ft / 3. * yieldHardTwo ) /
fc / BGParam;
1776 double mQ = AGParam * exp(R);
1778 double Bl = sig /
fc + rho / (
fc * sqrt(6.) );
1780 double Al = ( 1. - yieldHardOne ) * pow(Bl, 2.) + sqrt(3. / 2.) * rho /
fc;
1782 double dgdsig = 4. * ( 1. - yieldHardOne ) /
fc * Al * Bl + pow(yieldHardOne, 2.) *
mQ /
fc;
1784 double dgdrho = Al / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. ) +
1786 m * pow(yieldHardOne, 2.) / ( sqrt(6.) *
fc );
1788 return dgdrho / dgdsig * 3. * ( 1. - 2. *
nu ) / ( 1. +
nu );
1803 double trialSig, trialRho;
1805 auto trialStress = effectiveStress;
1810 auto deviatoricTrialStress = tmp.first;
1811 trialSig = tmp.second;
1814 double sig = trialSig;
1815 double rho = trialRho;
1818 double tempKappaP = kappaP;
1827 residuals.
at(4) = yieldValue;
1829 unknowns.
at(1) = trialSig;
1830 unknowns.
at(2) = trialRho;
1831 unknowns.
at(3) = tempKappaP;
1832 unknowns.
at(4) = 0.;
1834 double deltaLambda = 0.;
1835 double normOfResiduals = 1.;
1839 int iterationCount = 0;
1840 while ( normOfResiduals >
yieldTol ) {
1848 auto residualsNorm = residuals;
1850 residualsNorm.
at(1) /= this->
kM;
1851 residualsNorm.at(2) /= 2. * this->
gM;
1853 normOfResiduals =
norm(residualsNorm);
1855 if ( std::isnan(normOfResiduals) ) {
1860 if ( normOfResiduals >
yieldTol ) {
1862 auto jacobian =
computeJacobian(sig, rho, theta, tempKappaP, deltaLambda, gp);
1866 unknowns -= deltaIncrement;
1872 unknowns.
at(2) =
max(unknowns.
at(2), 0.);
1873 unknowns.
at(3) =
max(unknowns.
at(3), kappaP);
1874 unknowns.
at(4) =
max(unknowns.
at(4), 0.);
1877 sig = unknowns.
at(1);
1878 rho = unknowns.
at(2);
1879 tempKappaP = unknowns.
at(3);
1880 deltaLambda = unknowns.
at(4);
1886 residuals.
at(1) = sig - trialSig + this->
kM * deltaLambda * dGDInv.at(1);
1887 residuals.
at(2) = rho - trialRho + ( 2. * this->
gM ) * deltaLambda * dGDInv.at(2);
1888 residuals.
at(3) = -tempKappaP + kappaP + deltaLambda * dKappaDDeltaLambda;
1897 auto stressPrincipalDir = tmpEig.second;
1900 stressPrincipal [ 0 ] = sig + sqrt(2. / 3.) * rho * cos(theta);
1901 stressPrincipal [ 1 ] = sig + sqrt(2. / 3.) * rho * cos(theta - 2. *
M_PI / 3.);
1902 stressPrincipal [ 2 ] = sig + sqrt(2. / 3.) * rho * cos(theta + 2. *
M_PI / 3.);
1907 status->letDeltaLambdaBe(deltaLambda);
1935 answer.
at(1, 1) = 1. + this->
kM * deltaLambda * dDGDDInv.at(1, 1);
1936 answer.
at(1, 2) = this->
kM * deltaLambda * dDGDDInv.at(1, 2);
1937 answer.
at(1, 3) = this->
kM * deltaLambda * dDGDInvDKappa.at(1);
1938 answer.
at(1, 4) = this->
kM * dGDInv.at(1);
1940 answer.
at(2, 1) = 2. * this->
gM * deltaLambda * dDGDDInv.at(2, 1);
1941 answer.
at(2, 2) = 1. + 2. * this->
gM * deltaLambda * dDGDDInv.at(2, 2);
1942 answer.
at(2, 3) = 2. * this->
gM * deltaLambda * dDGDInvDKappa.at(2);
1943 answer.
at(2, 4) = 2. * this->
gM * dGDInv.at(2);
1945 answer.
at(3, 1) = deltaLambda * dDKappaDDeltaLambdaDInv.at(1);
1946 answer.
at(3, 2) = deltaLambda * dDKappaDDeltaLambdaDInv.at(2);
1947 answer.
at(3, 3) = deltaLambda * dDKappaDDeltaLambdaDKappa - 1.;
1948 answer.
at(3, 4) = dKappaDDeltaLambda;
1950 answer.
at(4, 1) = dFDInv.at(1);
1951 answer.
at(4, 2) = dFDInv.at(2);
1952 answer.
at(4, 3) = dFDKappa;
1953 answer.
at(4, 4) = 0.;
1964 double tempKappa)
const
1972 double rFunction = ( 4. * ( 1. - pow(
ecc, 2.) ) * pow(cos(theta), 2.) +
1973 pow( ( 2. *
ecc - 1. ), 2. ) ) /
1974 ( 2. * ( 1. - pow(
ecc, 2.) ) * cos(theta) +
1975 ( 2. *
ecc - 1. ) * sqrt(4. * ( 1. - pow(
ecc, 2.) ) * pow(cos(theta), 2.)
1976 + 5. * pow(
ecc, 2.) - 4. *
ecc) );
1979 double Al = ( 1. - yieldHardOne ) * pow( ( sig /
fc + rho / ( sqrt(6.) *
fc ) ), 2. ) +
1980 sqrt(3. / 2.) * rho /
fc;
1983 return pow(Al, 2.) +
1984 pow(yieldHardOne, 2.) * yieldHardTwo *
m * ( sig /
fc + rho * rFunction / ( sqrt(6.) *
fc ) ) -
1985 pow(yieldHardOne, 2.) * pow(yieldHardTwo, 2.);
1993 double tempKappa)
const
2004 ( 4. * ( 1. - pow(
ecc, 2) ) * pow(cos(theta), 2) + pow( ( 2. *
ecc - 1. ), 2 ) ) /
2005 ( 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) );
2008 double Al = ( 1. - yieldHardOne ) * pow( ( sig /
fc + rho / ( sqrt(6.) *
fc ) ), 2.) + sqrt(3. / 2.) * rho /
fc;
2011 double Bl = sig /
fc + rho / (
fc * sqrt(6.) );
2012 double dFDYieldHardOne = -2. * Al * pow(Bl, 2.)
2013 + 2. * yieldHardOne * yieldHardTwo *
m * ( sig /
fc + rho * rFunction / ( sqrt(6.) *
fc ) ) - 2. * yieldHardOne * pow(yieldHardTwo, 2.);
2015 double dFDYieldHardTwo = pow(yieldHardOne, 2.) *
m * ( sig /
fc + rho * rFunction / ( sqrt(6.) *
fc ) ) - 2. * yieldHardTwo * pow(yieldHardOne, 2.);
2018 dFDKappa = dFDYieldHardOne * dYieldHardOneDKappa +
2019 dFDYieldHardTwo * dYieldHardTwoDKappa;
2027 if ( dFDKappa > 0. ) {
2038 double tempKappa)
const
2045 double rFunction = ( 4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta) + ( 2. *
ecc - 1. ) * ( 2. *
ecc - 1. ) ) /
2046 ( 2. * ( 1. -
ecc *
ecc ) * cos(theta) + ( 2. *
ecc - 1. ) * sqrt(4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta)
2050 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.) );
2054 double dfdsig = 4. * ( 1. - yieldHardOne ) /
fc *
AL * BL + yieldHardTwo * pow(yieldHardOne, 2.) *
m /
fc;
2057 double dfdrho =
AL / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * BL + 6. ) + rFunction *
m * yieldHardTwo * pow(yieldHardOne, 2.) / ( sqrt(6.) *
fc );
2069 double tempKappa)
const
2072 double equivalentDGDStress = sqrt(1. / 3. * pow(dGDInv [ 0 ], 2.) + pow(dGDInv [ 1 ], 2.) );
2074 return equivalentDGDStress / ductilityMeasure;
2081 double tempKappa)
const
2088 double equivalentDGDStress = sqrt(1. / 3. * pow(dGDInv [ 0 ], 2.) + pow(dGDInv [ 1 ], 2.) );
2095 dEquivalentDGDStressDInv [ 0 ] =
2096 ( 2. / 3. * dGDInv [ 0 ] * dDGDDInv(0, 0) + 2. * dGDInv [ 1 ] * dDGDDInv(1, 0) ) / ( 2. * equivalentDGDStress );
2097 dEquivalentDGDStressDInv [ 1 ] =
2098 ( 2. / 3. * dGDInv [ 0 ] * dDGDDInv(0, 1) + 2. * dGDInv [ 1 ] * dDGDDInv(1, 1) ) / ( 2. * equivalentDGDStress );
2105 answer [ 0 ] = ( dEquivalentDGDStressDInv [ 0 ] * ductilityMeasure - equivalentDGDStress * dDuctilityMeasureDInv [ 0 ] ) / pow(ductilityMeasure, 2.);
2106 answer [ 1 ] = ( dEquivalentDGDStressDInv [ 1 ] * ductilityMeasure - equivalentDGDStress * dDuctilityMeasureDInv [ 1 ] ) / pow(ductilityMeasure, 2.);
2114 auto deviatoricStress = tmp.first;
2115 double sig = tmp.second;
2125 double equivalentDGDStress = sqrt(1. / 3. * pow(dGDInv [ 0 ], 2.) + pow(dGDInv [ 1 ], 2.) );
2131 double dDKappaDDeltaLambdaDCosTheta = equivalentDGDStress / ductilityMeasure / cos(theta);
2138 dSigDStress *= dDKappaDDeltaLambdaDInv.at(1);
2140 dRhoDStress *= dDKappaDDeltaLambdaDInv.at(2);
2142 dCosThetaDStress *= dDKappaDDeltaLambdaDCosTheta;
2144 auto dDKappaDDeltaLambdaDStress = dSigDStress + dRhoDStress + dCosThetaDStress;
2146 return dDKappaDDeltaLambdaDStress;
2155 auto deviatoricStress = tmp.first;
2156 double sig = tmp.second;
2165 answer = dSigDStress;
2166 answer *= dDGDInvDKappa.
at(1);
2169 temp1 = dRhoDStress;
2170 temp1 *= dDGDInvDKappa.
at(2);
2186 double equivalentDGDStress = sqrt( 1. / 3. * pow(dGDInv [ 0 ], 2.) + pow(dGDInv [ 1 ], 2.) );
2190 double dEquivalentDGDStressDKappa =
2191 ( 2. / 3. * dGDInv [ 0 ] * dDGDInvDKappa [ 0 ] + 2. * dGDInv [ 1 ] * dDGDInvDKappa [ 1 ] ) / ( 2. * equivalentDGDStress );
2193 return dEquivalentDGDStressDKappa / ductilityMeasure;
2200 double tempKappa)
const
2202 double thetaConst = pow(2. * cos(theta), 2.);
2203 double x = ( -( sig +
fc / 3. ) ) /
fc;
2206 double dXDSig = -1. /
fc;
2212 double dDuctilityMeasureDX = EHard / FHard * exp(x / FHard) / thetaConst;
2214 dDuctilityMeasureDX *dXDSig, 0.
2217 double dXDSig = -1. /
fc;
2218 double dDuctilityMeasureDX = -(
BHard -
AHard ) / (
CHard ) / thetaConst * exp(-x / (
CHard ) );
2220 dDuctilityMeasureDX *dXDSig, 0.
2228 double tempKappa)
const
2235 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
2237 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
2240 double R = ( sig -
ft / 3. * yieldHardTwo ) /
fc / BGParam;
2241 double mQ = AGParam * exp(R);
2243 double Bl = sig /
fc + rho / (
fc * sqrt(6.) );
2245 double Al = ( 1. - yieldHardOne ) * pow(Bl, 2.) + sqrt(3. / 2.) * rho /
fc;
2247 double dgdsig = 4. * ( 1. - yieldHardOne ) /
fc * Al * Bl + pow(yieldHardOne, 2.) *
mQ /
fc;
2249 double dgdrho = Al / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. ) +
2250 m * pow(yieldHardOne, 2.) / ( sqrt(6.) *
fc );
2259 double tempKappa)
const
2261 double sig, rho, theta;
2271 auto dFDCosTheta = dRDCosTheta * pow(yieldHardOne, 2.) * yieldHardTwo *
m * rho / ( sqrt(6.) *
fc );
2277 dSigDStress *= dFDInv.at(1);
2278 dRhoDStress *= dFDInv.at(2);
2279 dCosThetaDStress *= dFDCosTheta;
2281 auto dFDStress = dSigDStress + dRhoDStress + dCosThetaDStress;
2290 auto deviatoricStress = tmp.first;
2291 double sig = tmp.second;
2299 dSigDStress *= dGDInv.at(1);
2300 dRhoDStress *= dGDInv.at(2);
2301 dSigDStress += dRhoDStress;
2311 const double deltaLambda,
2314 const double tempKappa)
const
2323 double sig, rho, theta;
2333 auto helpA =
dot(d, dDGDDStress);
2336 for (
int i = 0; i < 6; i++ ) {
2337 for (
int j = 0; j < 6; j++ ) {
2339 jacobian.
at(i + 1, j + 1) = 1. + deltaLambda * helpA.at(i + 1, j + 1);
2341 jacobian.
at(i + 1, j + 1) = deltaLambda * helpA.at(i + 1, j + 1);
2347 helpB =
dot(d, dDGDStressDKappa);
2349 for (
int i = 0; i < 6; i++ ) {
2350 jacobian.
at(i + 1, 7) = deltaLambda * helpB.
at(i + 1);
2353 helpB =
dot(d, dGDStress);
2355 for (
int i = 0; i < 6; i++ ) {
2356 jacobian.
at(i + 1, 8) = helpB.
at(i + 1);
2359 for (
int i = 0; i < 6; i++ ) {
2360 jacobian.
at(7, i + 1) = deltaLambda * dDKappaDDeltaLambdaDStress.at(i + 1);
2364 jacobian.
at(7, 7) = deltaLambda * dDKappaDDeltaLambdaDKappa - 1.;
2365 jacobian.
at(7, 8) = dKappaDDeltaLambda;
2367 for (
int i = 0; i < 6; i++ ) {
2368 jacobian.
at(8, i + 1) = dFDStress.at(i + 1);
2371 jacobian.
at(8, 7) = dFDKappa;
2372 jacobian.
at(8, 8) = 0.;
2380 const double tempKappa)
const
2385 auto deviatoricStress = tmp.first;
2386 double sig = tmp.second;
2404 temp1 = dSigDStress;
2405 temp1 *= dDGDDInv.
at(1, 1);
2408 temp2 = dRhoDStress;
2409 temp2 *= dDGDDInv.
at(1, 2);
2414 helpA =
dyad(temp1, dSigDStress);
2417 temp1 = dRhoDStress;
2418 temp1 *= dDGDDInv.
at(2, 2);
2420 temp2 = dSigDStress;
2421 temp2 *= dDGDDInv.
at(2, 1);
2426 helpB =
dyad(temp1, dRhoDStress);
2430 helpC *= dGDInv.
at(2);
2445 double tempKappa)
const
2457 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
2459 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
2462 double R = ( sig -
ft / 3. * yieldHardTwo ) / (
fc * BGParam );
2463 double mQ = AGParam * exp(R);
2468 double dAGParamDKappa = dYieldHardTwoDKappa * 3. * this->
ft / this->
fc;
2471 double BGParamTop = yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc );
2472 double BGParamBottom = ( log(AGParam) + log(this->
dilationConst + 1.) - log(2 * this->
dilationConst - 1.) - log(3. * yieldHardTwo + this->
m / 2) );
2474 double dBGParamTopDKappa = dYieldHardTwoDKappa / 3. * ( 1. + this->
ft / this->
fc );
2475 double dBGParamBottomDKappa = 1. / AGParam * dAGParamDKappa - 3. * dYieldHardTwoDKappa / ( 3 * yieldHardTwo +
m / 2. );
2476 double dBGParamDKappa = ( dBGParamTopDKappa * BGParamBottom - BGParamTop * dBGParamBottomDKappa ) / pow(BGParamBottom, 2.);
2479 double RTop = ( sig -
ft / 3. * yieldHardTwo );
2480 double RBottom =
fc * BGParam;
2481 double dRTopDKappa = -this->
ft / 3. * dYieldHardTwoDKappa;
2482 double dRBottomDKappa = this->
fc * dBGParamDKappa;
2483 double dRDKappa = ( dRTopDKappa * RBottom - RTop * dRBottomDKappa ) / pow(RBottom, 2.);
2485 double dMQDKappa = dAGParamDKappa * exp(R) + AGParam * dRDKappa * exp(R);
2487 double Bl = sig /
fc + rho / (
fc * sqrt(6.) );
2489 double Al = ( 1. - yieldHardOne ) * pow(Bl, 2.) + sqrt(3. / 2.) * rho /
fc;
2491 double dAlDYieldHard = -pow(Bl, 2.);
2493 const double dDGDSigDKappa =
2494 ( -4. * Al * Bl /
fc + 4. * ( 1 - yieldHardOne ) /
fc * dAlDYieldHard * Bl ) * dYieldHardOneDKappa +
2495 dYieldHardOneDKappa * 2 * yieldHardOne *
mQ /
fc + pow(yieldHardOne, 2.) * dMQDKappa /
fc;
2499 const double dDGDRhoDKappa =
2500 ( dAlDYieldHard / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. ) -
2501 4. * Al / ( sqrt(6.) *
fc ) * Bl +
m / ( sqrt(6.) *
fc ) * 2 * yieldHardOne ) * dYieldHardOneDKappa;
2504 dDGDSigDKappa, dDGDRhoDKappa
2511 double tempKappa)
const
2518 double AGParam = this->
ft * yieldHardTwo * 3 / this->
fc +
m / 2;
2520 yieldHardTwo / 3. * ( 1. + this->
ft / this->
fc ) /
2523 double R = ( sig -
ft / 3. * yieldHardTwo ) /
fc / BGParam;
2525 double dMQDSig = AGParam / ( BGParam *
fc ) * exp(R);
2528 double Bl = sig /
fc + rho / (
fc * sqrt(6.) );
2530 double Al = ( 1. - yieldHardOne ) * pow(Bl, 2.) +
2531 sqrt(3. / 2.) * rho /
fc;
2533 double dAlDSig = 2. * ( 1. - yieldHardOne ) * Bl /
fc;
2534 double dBlDSig = 1. /
fc;
2536 double dAlDRho = 2. * ( 1. - yieldHardOne ) * Bl / (
fc * sqrt(6.) ) + sqrt(3. / 2.) /
fc;
2537 double dBlDRho = 1. / (
fc * sqrt(6.) );
2540 double ddgddSig = 4. * ( 1. - yieldHardOne ) /
fc * ( dAlDSig * Bl + Al * dBlDSig ) +
2541 pow(yieldHardOne, 2.) * dMQDSig /
fc;
2544 double ddgddRho = dAlDRho / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. ) +
2545 Al * dBlDRho * 4. * ( 1. - yieldHardOne ) / ( sqrt(6.) *
fc );
2547 double ddgdSigdRho = 4. * ( 1. - yieldHardOne ) /
fc * ( dAlDRho * Bl + Al * dBlDRho );
2550 double ddgdRhodSig = dAlDSig / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * Bl + 6. )
2551 + Al / ( sqrt(6.) *
fc ) * ( 4. * ( 1. - yieldHardOne ) * dBlDSig );
2555 answer.
at(1, 1) = ddgddSig;
2556 answer.
at(1, 2) = ddgdSigdRho;
2557 answer.
at(2, 1) = ddgdRhodSig;
2558 answer.
at(2, 2) = ddgddRho;
2570 auto principalStress = tmp.first;
2571 auto stressPrincipalDir = tmp.second;
2577 for (
int i = 1; i <= principalStress.giveSize(); i++ ) {
2578 if ( principalStress.at(i) >= 0 ) {
2579 principalStressTension.
at(i) = principalStress.at(i);
2580 principalStressCompression.
at(i) = 0.;
2582 principalStressTension.
at(i) = 0.;
2583 principalStressCompression.
at(i) = principalStress.at(i);
2597 double squareNormOfPrincipalStress =
norm_squared(principalStress);
2599 double alphaTension = 0.;
2601 if ( squareNormOfPrincipalStress > 0 ) {
2602 for (
int i = 1; i <= principalStress.giveSize(); i++ ) {
2603 alphaTension += principalStressTension.
at(i) *
2604 ( principalStressTension.
at(i) + principalStressCompression.
at(i) ) / squareNormOfPrincipalStress;
2608 return 1. - alphaTension;
2615 if ( kappa <= 0. ) {
2617 }
else if ( kappa > 0. && kappa < 1. ) {
2632 if ( kappa <= 0. ) {
2634 }
else if ( kappa >= 0. && kappa < 1. ) {
2648 if ( kappa <= 0. ) {
2650 }
else if ( kappa > 0. && kappa < 1. ) {
2661 if ( kappa <= 0. ) {
2663 }
else if ( kappa >= 0. && kappa < 1. ) {
2676 if ( mode == SecantStiffness ) {
2678 }
else if ( mode == TangentStiffness ) {
2679 const int stateFlag = status->giveTempStateFlag();
2697 double omegaTension =
min(status->giveTempDamageTension(), 0.999999);
2698 double omegaCompression =
min(status->giveTempDamageCompression(), 0.999999);
2700 double alpha = status->giveTempAlpha();
2705 d *= ( 1. - omegaTension );
2707 d *= ( 1. - ( 1. - alpha ) * omegaTension ) * ( 1. - alpha * omegaCompression );
2720 effectiveStress = status->giveTempEffectiveStress();
2722 double tempKappa = status->giveTempKappaP();
2723 double deltaLambda = status->giveDeltaLambda();
2734 for (
int i = 1; i <= 6; i++ ) {
2735 for (
int j = 1; j <= 6; j++ ) {
2736 help.
at(i, j) = invFullJacobian.
at(i, j);
2740 answer =
dot(help, d);
2743 double omegaTension =
min(status->giveTempDamageTension(), 0.999999);
2744 double omegaCompression =
min(status->giveTempDamageCompression(), 0.999999);
2745 double alpha = status->giveTempAlpha();
2748 answer *= ( 1. - ( 1. - alpha ) * omegaTension ) * ( 1. - alpha * omegaCompression );
2750 answer *= ( 1. - omegaTension );
2760 auto deviatoricStress = tmp.first;
2761 sigNew = tmp.second;
2773 double damageCompression = status->giveDamageCompression();
2774 double tempDamageTension = status->giveTempDamageTension();
2775 double tempDamageCompression = status->giveTempDamageCompression();
2776 double kappaP = status->giveKappaP();
2777 double tempKappaP = status->giveTempKappaP();
2779 if ( tempKappaP > kappaP ) {
2780 if ( tempDamageTension > damageTension || tempDamageTension == 1. ||
2781 tempDamageCompression > damageCompression || tempDamageCompression == 1. ) {
2793 const int state_flag = status->giveStateFlag();
2794 if ( tempDamageTension > damageTension || tempDamageTension == 1. ||
2795 tempDamageCompression > damageCompression || tempDamageCompression == 1. ) {
2812 double ACostheta = 4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta) +
2813 ( 2. *
ecc - 1. ) * ( 2. *
ecc - 1. );
2814 double BCostheta = 2. * ( 1. -
ecc *
ecc ) * cos(theta) +
2815 ( 2. *
ecc - 1. ) * sqrt(4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta)
2817 double A1Costheta = 8. * ( 1. - pow(
ecc, 2.) ) * cos(theta);
2818 double B1Costheta = 2. * ( 1. - pow(
ecc, 2.) ) +
2819 4. * ( 2. *
ecc - 1. ) * ( 1. - pow(
ecc, 2.) ) * cos(theta) /
2820 sqrt(4. * ( 1. - pow(
ecc, 2.) ) * pow(cos(theta), 2.) +
2821 5. * pow(
ecc, 2.) - 4. *
ecc);
2822 double dRDCostheta = A1Costheta / BCostheta - ACostheta / pow(BCostheta, 2.) * B1Costheta;
2836 double atheta = 4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta) +
2837 ( 2. *
ecc - 1. ) * ( 2. *
ecc - 1. );
2838 double btheta = 2. * ( 1. -
ecc *
ecc ) * cos(theta) +
2839 ( 2. *
ecc - 1. ) * sqrt(4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta)
2841 double a1theta = 8. * ( 1. -
ecc *
ecc ) * cos(theta);
2842 double b1theta = 2. * ( 1. -
ecc *
ecc ) +
2843 4. * ( 2. *
ecc - 1. ) * ( 1. -
ecc *
ecc ) * cos(theta) /
2844 sqrt(4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta) +
2848 double a2theta = 8. * ( 1. - pow(
ecc, 2.) );
2849 double Ntheta = 4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta) +
2851 printf(
"cos(theta) = %e\n", cos(theta) );
2852 double b2theta = 4. * ( 2. *
ecc - 1. ) * ( 1. -
ecc *
ecc ) / sqrt(Ntheta) *
2853 ( 1. - 4. * ( 1. -
ecc *
ecc ) * cos(theta) * cos(theta) / Ntheta );
2854 double ddrddcostheta = a2theta / btheta - 2. * a1theta * b1theta / ( btheta * btheta ) -
2855 atheta * b2theta / ( btheta * btheta ) +
2856 2. * atheta * b1theta * b1theta / ( btheta * btheta * btheta );
2858 return ddrddcostheta;
2874 auto principalDeviatoricStress = tmp.first;
2875 auto principalDir = tmp.second;
2879 ds1DStress.
at(1) = principalDir.at(1, 1) * principalDir.at(1, 1) - 1. / 3.;
2880 ds1DStress.
at(2) = principalDir.at(2, 1) * principalDir.at(2, 1) - 1. / 3.;
2881 ds1DStress.
at(3) = principalDir.at(3, 1) * principalDir.at(3, 1) - 1. / 3.;
2882 ds1DStress.
at(4) = 2. * principalDir.at(2, 1) * principalDir.at(3, 1);
2883 ds1DStress.
at(5) = 2. * principalDir.at(3, 1) * principalDir(1, 1);
2884 ds1DStress.
at(6) = 2. * principalDir.at(1, 1) * principalDir.at(2, 1);
2887 auto dCosThetaDStress = ds1DStress * ( sqrt(3. / 2.) * rho / pow(rho, 2.) ) +
2888 computeDRhoDStress(stress) * ( -sqrt(3. / 2.) * principalDeviatoricStress [ 0 ] / pow(rho, 2.) );
2889 return dCosThetaDStress;
2905 auto principalDeviatoricStress = tmp.first;
2906 auto principalDir = tmp.second;
2911 dS1DStress.
at(1) = principalDir.at(1, 1) * principalDir.at(1, 1) - 1. / 3.;
2912 dS1DStress.
at(2) = principalDir.at(2, 1) * principalDir.at(2, 1) - 1. / 3.;
2913 dS1DStress.
at(3) = principalDir.at(3, 1) * principalDir.at(3, 1) - 1. / 3.;
2914 dS1DStress.
at(4) = 2. * principalDir.at(2, 1) * principalDir.at(3, 1);
2915 dS1DStress.
at(5) = 2. * principalDir.at(3, 1) * principalDir.at(1, 1);
2916 dS1DStress.
at(6) = 2. * principalDir.at(1, 1) * principalDir.at(2, 1);
2923 for (
int v = 0; v < 6; v++ ) {
2924 for (
int w = 0; w < 6; w++ ) {
2925 dS1DRho.
at(v + 1, w + 1) = dS1DStress.
at(v + 1) * dRhoDStress.at(w + 1);
2931 for (
int v = 0; v < 6; v++ ) {
2932 for (
int w = 0; w < 6; w++ ) {
2933 dRhoDRho.
at(v + 1, w + 1) = dRhoDStress.at(v + 1) * dRhoDStress.at(w + 1);
2939 for (
int v = 0; v < 6; v++ ) {
2940 for (
int w = 0; w < 6; w++ ) {
2941 dRhoDS1.
at(v + 1, w + 1) = dRhoDStress.at(v + 1) * dS1DStress.
at(w + 1);
2946 dDCosThetaDDStress = dDRhoDDStress;
2947 dDCosThetaDDStress *= ( -sqrt(3. / 2.) * principalDeviatoricStress.at(1) / pow(rho, 2.) );
2949 auto helpB1 = dS1DRho;
2950 helpB1 *= ( -sqrt(3. / 2.) / pow(rho, 2.) );
2952 auto helpC1 = dRhoDRho;
2953 helpC1 *= ( sqrt(6.) * principalDeviatoricStress.at(1) / pow(rho, 3.) );
2955 auto helpD1 = dRhoDS1;
2956 helpD1 *= ( -sqrt(3. / 2.) / pow(rho, 2.) );
2957 dDCosThetaDDStress += helpB1;
2958 dDCosThetaDDStress += helpC1;
2959 dDCosThetaDDStress += helpD1;
2961 return dDCosThetaDDStress;
2973 auto dJ2DStress = deviatoricStress;
2974 for (
int i = 3; i < 6; i++ ) {
2975 dJ2DStress.at(i + 1) = deviatoricStress.at(i + 1) * 2.0;
2979 return dJ2DStress * ( 1. / rho );
2986 1. / 3., 1. / 3., 1. / 3., 0., 0., 0.
2999 auto dJ2dstress = deviatoricStress;
3000 for (
int i = 3; i < 6; i++ ) {
3001 dJ2dstress.at(i + 1) = deviatoricStress.at(i + 1) * 2.;
3006 for (
int i = 0; i < 6; i++ ) {
3008 ddJ2ddstress.
at(i + 1, i + 1) = 2. / 3.;
3012 ddJ2ddstress.
at(i + 1, i + 1) = 2.;
3016 ddJ2ddstress.
at(1, 2) = -1. / 3.;
3017 ddJ2ddstress.
at(1, 3) = -1. / 3.;
3018 ddJ2ddstress.
at(2, 1) = -1. / 3.;
3019 ddJ2ddstress.
at(2, 3) = -1. / 3.;
3020 ddJ2ddstress.
at(3, 1) = -1. / 3.;
3021 ddJ2ddstress.
at(3, 2) = -1. / 3.;
3023 return ddJ2ddstress * ( 1. / rho ) +
dyad(dJ2dstress, dJ2dstress) * ( -1. / ( rho * rho * rho ) );
3035 case IST_PlasticStrainTensor:
3036 answer = status->givePlasticStrain();
3039 case IST_DamageTensor:
3042 answer.
at(1) = status->giveDamageTension();
3043 answer.
at(2) = status->giveDamageCompression();
3044 answer.
at(3) = status->giveDissWork();
3047#ifdef keep_track_of_dissipated_energy
3048 case IST_StressWorkDensity:
3050 answer.
at(1) = status->giveStressWork();
3053 case IST_DissWorkDensity:
3055 answer.
at(1) = status->giveDissWork();
3058 case IST_FreeEnergyDensity:
3060 answer.
at(1) = status->giveStressWork() - status->giveDissWork();
3069std::unique_ptr<MaterialStatus>
3072 return std::make_unique<ConcreteDPM2Status>(gp);
#define REGISTER_Material(class)
double tempKappaDCompression
double tempDamageCompression
@ ConcreteDPM2_VertexTension
@ ConcreteDPM2_VertexTensionDamage
@ ConcreteDPM2_VertexCompression
@ ConcreteDPM2_VertexCompressionDamage
@ ConcreteDPM2_PlasticDamage
int state_flag
Indicates the state (i.e. elastic, unloading, plastic, damage, vertex) of the Gauss point.
double rateStrain
Strains that are used for calculation of strain rates.
double tempEquivStrainCompression
void initTempStatus() override
double equivStrainCompression
void computeWork(GaussPoint *gp, double ft)
FloatArrayF< 6 > reducedStrain
const FloatArrayF< 6 > & giveTempPlasticStrain() const
double tempStressWork
Non-equilibrated density of total work done by stresses on strain increments.
double kappaDCompressionOne
double giveTempStressWork()
Returns the temp density of total work of stress on strain increments.
void updateYourself(TimeStep *tStep) override
void setTempDissWork(double w)
Sets the density of dissipated work to given value.
double dissWork
Density of dissipated work.
double tempEquivStrainTension
FloatArrayF< 6 > plasticStrain
void saveContext(DataStream &stream, ContextMode mode) override
double stressWork
Density of total work done by stresses on strain increments.
const FloatArrayF< 6 > & giveTempReducedStrain() const
double tempKappaDCompressionTwo
void setTempStressWork(double w)
Sets the density of total work of stress on strain increments to given value.
double kappaDCompressionTwo
double tempKappaDTensionTwo
void printOutputAt(FILE *file, TimeStep *tStep) const override
Print receiver's output to given stream.
void restoreContext(DataStream &stream, ContextMode mode) override
double tempKappaDCompressionOne
double tempKappaDTensionOne
ConcreteDPM2Status(GaussPoint *gp)
Constructor.
FloatArrayF< 6 > tempPlasticStrain
double giveDamageTension() const
double tempDissWork
Non-equilibrated density of dissipated work.
FloatArrayF< 6 > tempReducedStrain
double equivStrainTension
const FloatArrayF< 6 > & giveReducedStrain() const
FloatArrayF< 2 > computeDFDInv(double sig, double rho, double theta, double tempKappa) const
double yieldHardInitial
Parameter of the hardening law of the plasticity model.
FloatArrayF< 6 > computeDGDStress(const FloatArrayF< 6 > &stress, const double tempKappa) const
double deltaTime
Input parameter which simulates a loading rate. Only for debugging purposes.
double AHard
Parameter of the ductilityMeasure of the plasticity model.
FloatArrayF< 2 > computeDDGDInvDKappa(double sig, double rho, double tempKappa) const
void assignStateFlag(GaussPoint *gp) const
Assign state flag.
double computeDFDKappa(double sig, double rho, double theta, double tempKappa) const
FloatArrayF< 6 > performPlasticityReturn(GaussPoint *gp, const FloatMatrixF< 6, 6 > &D, const FloatArrayF< 6 > &strain) const
double yieldTolDamage
yield tolerance for the damage model.
double hardeningModulus
Hardening modulus.
FloatMatrixF< 8, 8 > computeFullJacobian(const FloatArrayF< 6 > &stress, const double deltaLambda, GaussPoint *gp, TimeStep *atTime, const double tempKappa) const
FloatMatrixF< 2, 2 > computeDDGDDInv(double sig, double rho, double tempKappa) const
FloatArrayF< 2 > computeDGDInv(double sig, double rho, double tempKappa) const
ConcreteDPM2(int n, Domain *d)
Constructor.
double ftOne
Control parameter for the bilinear softening law.
FloatArrayF< 6 > computeDRhoDStress(const FloatArrayF< 6 > &stress) const
Computes the derivative of rho with respect to the stress.
void saveContext(DataStream &stream, ContextMode mode) override
double computeHardeningTwo(double tempKappa) const
double mQ
Dilation parameter of the plastic potential.
double computeDKappaDDeltaLambda(double sig, double rho, double theta, double tempKappa) const
double DHard
Parameter of the ductilityMeasure of the plasticity model.
ConcreteDPM2_ReturnResult
double computeAlpha(FloatArrayF< 6 > &effectiveStressTension, FloatArrayF< 6 > &effectiveStressCompression, const FloatArrayF< 6 > &effectiveStress) const
Compute alpha for rate effect.
FloatMatrixF< 6, 6 > computeDDCosThetaDDStress(const FloatArrayF< 6 > &stress) const
double computeDDKappaDDeltaLambdaDKappa(double sig, double rho, double theta, double tempKappa) const
std::unique_ptr< MaterialStatus > CreateStatus(GaussPoint *gp) const override
double computeDRDCosTheta(const double theta, const double ecc) const
Computes the derivative of function r with respect to cos theta.
double computeDuctilityMeasureDamage(GaussPoint *gp, const double sig, const double rho) const
Compute the ductility measure for the damage model.
FloatArrayF< 2 > computeDamage(const FloatArrayF< 6 > &strain, const FloatMatrixF< 6, 6 > &D, double timeFactor, GaussPoint *gp, TimeStep *tStep, double alpha, const FloatArrayF< 6 > &effectiveStress) const
Compute damage parameters.
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
bool hasMaterialModeCapability(MaterialMode mode) const override
int softeningType
Type of softening function used.
double gM
Elastic shear modulus.
virtual double computeDuctilityMeasure(double sig, double rho, double theta) const
double computeYieldValue(double sig, double rho, double theta, double tempKappa) const
FloatArrayF< 2 > computeDDuctilityMeasureDInv(double sig, double rho, double theta, double tempKappa) const
double performRegularReturn(FloatArrayF< 6 > &stress, ConcreteDPM2_ReturnResult &returnResult, ConcreteDPM2_ReturnType &returnType, double kappaP, GaussPoint *gp, double theta) const
double nu
Elastic poisson's ration.
double kM
Elastic bulk modulus.
virtual double computeDamageParamTension(double equivStrain, double kappaOne, double kappaTwo, double le, double omegaOld, double rateFactor) const
Compute damage parameter in tension.
double CHard
Parameter of the ductilityMeasure of the plasticity model.
void initDamaged(double kappa, const FloatArrayF< 6 > &strain, GaussPoint *gp) const
FloatArrayF< 6 > computeDSigDStress() const
Computes the derivative of sig with respect to the stress.
FloatMatrixF< 6, 6 > compute3dTangentStiffness(GaussPoint *gp, TimeStep *tStep) const
Compute the 3d tangent stiffness matrix.
double computeTempKappa(double kappaInitial, double sigTrial, double rhoTrial, double sig) const
Compute tempKappa.
double fc
Parameters of the yield surface of the plasticity model. fc is the uniaxial compressive strength,...
double helem
Element size (to be used in fracture energy approach (crack band).
FloatArrayF< 6 > computeDCosThetaDStress(const FloatArrayF< 6 > &stress) const
double computeRatioPotential(double sig, double rho, double tempKappa) const
FloatArrayF< 6 > computeDFDStress(const FloatArrayF< 6 > &stress, const double tempKappa) const
double BHard
Parameter of the ductilityMeasure of the plasticity model.
FloatArrayF< 6 > computeDDGDStressDKappa(const FloatArrayF< 6 > &stress, double tempKappa) const
double dilationConst
Control parameter for te volumetric plastic flow of the plastic potential.
double performVertexReturn(FloatArrayF< 6 > &stress, ConcreteDPM2_ReturnResult &returnResult, ConcreteDPM2_ReturnType &returnType, double apexStress, double tempKappaP, GaussPoint *gp) const
void initializeFrom(InputRecord &ir) override
FloatMatrixF< 6, 6 > computeDDRhoDDStress(const FloatArrayF< 6 > &stress) const
Computes the second derivative of rho with the respect to the stress.
IsotropicLinearElasticMaterial linearElasticMaterial
Pointer for linear elastic material.
double computeDeltaPlasticStrainNormTension(double tempKappaD, double kappaD, GaussPoint *gp) const
Compute equivalent strain value for tension.
double yieldHardPrimePeak
Parameter of the hardening law of the plasticity model.
double computeRateFactor(double alpha, double timeFactor, GaussPoint *gp, TimeStep *deltaTime) const
int newtonIter
Maximum number of iterations for stress return.
FloatMatrixF< 6, 6 > compute3dSecantStiffness(GaussPoint *gp, TimeStep *tStep) const
Compute the 3d secant stiffness matrix.
double ASoft
Parameter of the ductilityMeasure of the damage model.
FloatArrayF< 2 > computeDDKappaDDeltaLambdaDInv(double sig, double rho, double theta, double tempKappa) const
FloatMatrixF< 6, 6 > computeDDGDDStress(const FloatArrayF< 6 > &stress, const double tempKappa) const
double efCompression
Control parameter for the exponential softening law.
double computeHardeningTwoPrime(double tempKappa) const
double wfOne
Control parameter for the bilinear softening law in tension.
int checkForUnAndReloading(double &tempEquivStrain, double &minEquivStrain, const FloatMatrixF< 6, 6 > &D, GaussPoint *gp) const
Check for un- and reloading in the damage part.
void computeCoordinates(const FloatArrayF< 6 > &stress, double &sig, double &rho, double &theta) const
Compute the Haigh-Westergaard coordinates.
void checkForVertexCase(double &answer, ConcreteDPM2_ReturnType &returnType, double sig, double tempKappa, GaussPoint *gp) const
void restoreContext(DataStream &stream, ContextMode mode) override
double yieldTol
yield tolerance for the plasticity model.
double m
Friction parameter of the yield surface.
virtual double computeEquivalentStrain(double sig, double rho, double theta) const
Compute the base equivalent strain value.
double computeHardeningOne(double tempKappa) const
FloatArrayF< 6 > giveRealStressVector_3d(const FloatArrayF< 6 > &strain, GaussPoint *gp, TimeStep *tStep) const override
Default implementation relies on giveRealStressVector for second Piola-Kirchoff stress.
FloatArrayF< 6 > computeDDKappaDDeltaLambdaDStress(const FloatArrayF< 6 > &stress, double tempKappa) const
double computeDDRDDCosTheta(const double theta, const double ecc) const
Computes the second derivative of function r with respect to cos theta.
double eM
Elastic Young's modulus.
double computeDeltaPlasticStrainNormCompression(double tempAlpha, double tempKappaD, double kappaD, GaussPoint *gp, const double rho) const
Compute equivalent strain value for compression.
virtual double computeDamageParamCompression(double equivStrain, double kappaOne, double kappaTwo, double omegaOld, double rateFactor) const
Compute damage parameter in compression.
double wf
Control parameter for the linear/bilinear softening law in tension.
FloatMatrixF< 6, 6 > give3dMaterialStiffnessMatrix(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const override
FloatMatrixF< 4, 4 > computeJacobian(double sig, double rho, double theta, double tempKappa, double deltaLambda, GaussPoint *gp) const
double computeHardeningOnePrime(double tempKappa) const
virtual int read(int *data, std::size_t count)=0
Reads count integer values into array pointed by data.
virtual int write(const int *data, std::size_t count)=0
Writes count integer values from array pointed by data.
int giveGlobalNumber() const
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
virtual void restoreContext(DataStream &stream, ContextMode mode)
virtual void saveContext(DataStream &stream, ContextMode mode)
double & at(std::size_t i)
void zero()
Zeroes all coefficients of receiver.
double at(std::size_t i, std::size_t j) const
Element * giveElement()
Returns corresponding element to receiver.
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Dictionary propertyDictionary
void initTempStatus() override
void printOutputAt(FILE *file, TimeStep *tStep) const override
Print receiver's output to given stream.
void saveContext(DataStream &stream, ContextMode mode) override
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
void updateYourself(TimeStep *tStep) override
FloatArray tempStrainVector
Temporary strain vector in reduced form (to find balanced state).
FloatArray tempStressVector
Temporary stress vector in reduced form (increments are used mainly in nonlinear analysis).
FloatArray stressVector
Equilibrated stress vector in reduced form.
FloatArray strainVector
Equilibrated strain vector in reduced form.
void restoreContext(DataStream &stream, ContextMode mode) override
static double computeThirdCoordinate(const FloatArrayF< 6 > &s)
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
void initializeFrom(InputRecord &ir) override
StructuralMaterial(int n, Domain *d)
static FloatArrayF< 6 > computeDeviator(const FloatArrayF< 6 > &s)
static void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir, const FloatArray &s, stressStrainPrincMode mode)
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
static double computeSecondCoordinate(const FloatArrayF< 6 > &s)
static FloatArrayF< 6 > transformStressVectorTo(const FloatMatrixF< 3, 3 > &base, const FloatArrayF< 6 > &stress, bool transpose=false)
static std::pair< FloatArrayF< 6 >, double > computeDeviatoricVolumetricSplit(const FloatArrayF< 6 > &s)
FloatArrayF< 6 > computeStressIndependentStrainVector_3d(GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
double giveTimeIncrement()
Returns solution step associated time increment.
#define _IFT_ConcreteDPM2_dilation
#define _IFT_ConcreteDPM2_energyratetype
#define _IFT_ConcreteDPM2_damflag
#define _IFT_ConcreteDPM2_hp
#define _IFT_ConcreteDPM2_newtoniter
#define _IFT_ConcreteDPM2_softeningType
#define _IFT_ConcreteDPM2_wf
#define _IFT_ConcreteDPM2_chard
#define _IFT_ConcreteDPM2_yieldtol
#define _IFT_ConcreteDPM2_asoft
#define _IFT_ConcreteDPM2_ahard
#define _IFT_ConcreteDPM2_dhard
#define _IFT_ConcreteDPM2_helem
#define _IFT_ConcreteDPM2_wfOne
#define _IFT_ConcreteDPM2_ftOne
#define _IFT_ConcreteDPM2_ecc
#define _IFT_ConcreteDPM2_efc
#define _IFT_ConcreteDPM2_fc
#define _IFT_ConcreteDPM2_ft
#define _IFT_ConcreteDPM2_bhard
#define _IFT_ConcreteDPM2_kinit
#define _IFT_ConcreteDPM2_deltatime
#define _IFT_ConcreteDPM2_strengthratetype
#define OOFEM_WARNING(...)
#define _IFT_IsotropicLinearElasticMaterial_n
#define _IFT_IsotropicLinearElasticMaterial_e
#define OOFEM_LOG_INFO(...)
double norm(const FloatArray &x)
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatMatrixF< N, M > dyad(const FloatArrayF< N > &a, const FloatArrayF< M > &b)
Computes the dyadic product .
FloatMatrixF< 3, 3 > from_voigt_strain_6(const FloatArrayF< 6 > &v)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatMatrixF< 3, 3 > from_voigt_stress_6(const FloatArrayF< 6 > &v)
FloatArrayF< N > solve(FloatMatrixF< N, N > mtrx, const FloatArrayF< N > &b, double zeropiv=1e-20)
double dot(const FloatArray &x, const FloatArray &y)
FloatMatrixF< N, N > inv(const FloatMatrixF< N, N > &mat, double zeropiv=1e-24)
Computes the inverse.
@ CIO_IOERR
General IO error.
double norm_squared(const FloatArrayF< N > &x)
Computes the L2 norm of x.