498 MaterialMode mode = gp->giveMaterialMode();
507 double equivStrain, kappa = 0.0, tempKappa = 0.0, traceTempD;
508 FloatArray eVals, effectiveStressVector, fullEffectiveStressVector, stressVector;
509 FloatMatrix eVecs, effectiveStressTensor, stressTensor, strainTensor;
514 if ( equivStrain <= kappa ) {
522 if ( ( equivStrain <= kappa ) && ( kappa <= this->
kappa0 ) ) {
524 effectiveStressVector.
beProductOf(de, reducedTotalStrainVector);
525 answer = effectiveStressVector;
529 strainTensor.
resize(3, 3);
531 if ( mode == _PlaneStress ) {
545 strainTensor.
at(1, 1) = reducedTotalStrainVector.
at(1);
546 strainTensor.
at(2, 2) = reducedTotalStrainVector.
at(2);
547 strainTensor.
at(3, 3) = reducedTotalStrainVector.
at(3);
548 strainTensor.
at(2, 3) = strainTensor.
at(3, 2) = reducedTotalStrainVector.
at(4) / 2.0;
549 strainTensor.
at(1, 3) = strainTensor.
at(3, 1) = reducedTotalStrainVector.
at(5) / 2.0;
550 strainTensor.
at(1, 2) = strainTensor.
at(2, 1) = reducedTotalStrainVector.
at(6) / 2.0;
552 effectiveStressVector.
beProductOf(de, reducedTotalStrainVector);
553 StructuralMaterial :: giveFullSymVectorForm(fullEffectiveStressVector, effectiveStressVector, mode);
554 effectiveStressTensor.
beMatrixForm(fullEffectiveStressVector);
561 double effectiveStressTrace = effectiveStressTensor.
at(1, 1) + effectiveStressTensor.
at(2, 2) + effectiveStressTensor.
at(3, 3);
569 ImD.
at(1, 1) = ImD.
at(2, 2) = ImD.
at(3, 3) = 1;
573 ImD.
jaco_(eVals, eVecs, 40);
576 for (
int i = 1; i <= 3; i++ ) {
577 for (
int j = 1; j <= 3; j++ ) {
578 for (
int k = 1; k <= 3; k++ ) {
579 if ( eVals.
at(k) < 0.0 ) {
583 sqrtImD.
at(i, j) = sqrt( eVals.
at(1) ) * eVecs.
at(i, 1) * eVecs.
at(j, 1) + sqrt( eVals.
at(2) ) * eVecs.
at(i, 2) * eVecs.
at(j, 2) + sqrt( eVals.
at(3) ) * eVecs.
at(i, 3) * eVecs.
at(j, 3);
587 AuxMatrix.
beProductOf(effectiveStressTensor, sqrtImD);
597 for (
int i = 1; i <= 3; i++ ) {
598 for (
int j = 1; j <= 3; j++ ) {
599 scalar += ImD.
at(i, j) * effectiveStressTensor.
at(i, j);
602 if ( ( 3. - traceTempD ) < 0.0001 ) {
605 scalar = scalar / ( 3. - traceTempD );
609 AuxMatrix.
times(scalar);
617 AuxMatrix.
at(1, 1) = AuxMatrix.
at(2, 2) = AuxMatrix.
at(3, 3) = 1. / 3.;
618 if ( effectiveStressTrace > 0 ) {
619 AuxMatrix.
times( ( 1 - traceTempD ) * effectiveStressTrace );
621 AuxMatrix.
times(effectiveStressTrace);
625 stressTensor = Part1;
627 stressTensor.
add(Part3);
630 stressTensor.
times(factor);
632 StructuralMaterial :: giveReducedSymVectorForm(answer, stressVector, mode);
644#ifdef keep_track_of_dissipated_energy
1264 double outOfPlaneStrain;
1266 B.
at(1, 1) = 1. - damageTensor.at(1, 1);
1267 B.
at(1, 2) = 0. - damageTensor.at(1, 2);
1268 B.
at(2, 1) = 0. - damageTensor.at(2, 1);
1269 B.
at(2, 2) = 1. - damageTensor.at(2, 2);
1274 Auxiliar.
at(1, 1) = damageTensor.at(1, 1);
1275 Auxiliar.
at(2, 2) = damageTensor.at(2, 2);
1276 Auxiliar.
at(1, 2) = damageTensor.at(1, 2);
1277 Auxiliar.
at(2, 1) = damageTensor.at(2, 1);
1279 Auxiliar.
jaco_(eVals, eVecs, 40);
1282 inPlaneStrain.
resize(2, 2);
1283 inPlaneStrain.
at(1, 1) = reducedTotalStrainVector.at(1);
1284 inPlaneStrain.
at(2, 2) = reducedTotalStrainVector.at(2);
1285 inPlaneStrain.
at(1, 2) = reducedTotalStrainVector.at(3) / 2.0;
1286 inPlaneStrain.
at(2, 1) = reducedTotalStrainVector.at(3) / 2.0;
1288 double term1, term2, term3, B1, B2, Bz, trD, h, epsilon11, epsilon22;
1289 B1 = 1.0 - eVals.
at(1);
1290 B2 = 1.0 - eVals.
at(2);
1291 Bz = 1. - damageTensor.at(3, 3);
1295 vector1.
at(1) = eVecs.
at(1, 1);
1296 vector1.
at(2) = eVecs.
at(2, 1);
1297 vector2.
at(1) = eVecs.
at(1, 2);
1298 vector2.
at(2) = eVecs.
at(2, 2);
1300 epsilon11 = vector1.
at(1) * auxVector.
at(1) + vector1.
at(2) * auxVector.
at(2);
1302 epsilon22 = vector2.
at(1) * auxVector.
at(1) + vector2.
at(2) * auxVector.
at(2);
1303 trD = damageTensor.at(1, 1) + damageTensor.at(2, 2) + damageTensor.at(3, 3);
1306 term1 = 3. * Bz * B1 * ( 1. - 2. *
nu ) - ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1307 term2 = 3. * Bz * B2 * ( 1. - 2. *
nu ) - ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1308 term3 = 3. * Bz * ( 1. - 2. *
nu ) * ( B1 + B2 ) + ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1309 if ( Bz < 0.00001 ) {
1310 outOfPlaneStrain = -( epsilon11 + epsilon22 );
1312 outOfPlaneStrain = ( term1 * epsilon11 + term2 * epsilon22 ) / term3;
1318 trStrain = inPlaneStrain.
at(1, 1) + inPlaneStrain.
at(2, 2) + outOfPlaneStrain;
1320 if ( trStrain < 0.0 ) {
1322 term1 = 3. * Bz * B1 * ( 1. - 2. *
nu ) - ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1323 term2 = 3. * Bz * B2 * ( 1. - 2. *
nu ) - ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1324 term3 = 3. * Bz * ( 1. - 2. *
nu ) * ( B1 + B2 ) + ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu );
1325 if ( Bz < 0.00001 ) {
1326 outOfPlaneStrain = -( epsilon11 + epsilon22 );
1328 outOfPlaneStrain = ( term1 * epsilon11 + term2 * epsilon22 ) / term3;
1331 answer.resize(3, 3);
1333 answer.at(1, 1) = inPlaneStrain.
at(1, 1);
1334 answer.at(1, 2) = inPlaneStrain.
at(1, 2);
1335 answer.at(2, 1) = inPlaneStrain.
at(2, 1);
1336 answer.at(2, 2) = inPlaneStrain.
at(2, 2);
1337 answer.at(3, 3) = outOfPlaneStrain;
1341AnisotropicDamageMaterial :: computePlaneStressSigmaZ(
double &answer,
FloatMatrix damageTensor,
FloatArray reducedTotalStrainVector,
1349 Auxiliar.
at(1, 1) = damageTensor.at(1, 1);
1350 Auxiliar.
at(2, 2) = damageTensor.at(2, 2);
1351 Auxiliar.
at(1, 2) = damageTensor.at(1, 2);
1352 Auxiliar.
at(2, 1) = damageTensor.at(2, 1);
1353 Auxiliar.
jaco_(eVals, eVecs, 40);
1354 inPlaneStrain.
resize(2, 2);
1355 inPlaneStrain.
at(1, 1) = reducedTotalStrainVector.at(1);
1356 inPlaneStrain.
at(2, 2) = reducedTotalStrainVector.at(2);
1357 inPlaneStrain.
at(1, 2) = reducedTotalStrainVector.at(3) / 2.0;
1358 inPlaneStrain.
at(2, 1) = reducedTotalStrainVector.at(3) / 2.0;
1359 double term1, term2, termZ, B1, B2, Bz, trD, h, epsilon11, epsilon22;
1360 B1 = 1.0 - eVals.
at(1);
1361 B2 = 1.0 - eVals.
at(2);
1362 Bz = 1. - damageTensor.at(3, 3);
1366 vector1.
at(1) = eVecs.
at(1, 1);
1367 vector1.
at(2) = eVecs.
at(2, 1);
1368 vector2.
at(1) = eVecs.
at(1, 2);
1369 vector2.
at(2) = eVecs.
at(2, 2);
1371 epsilon11 = vector1.
at(1) * auxVector.
at(1) + vector1.
at(2) * auxVector.
at(2);
1373 epsilon22 = vector2.
at(1) * auxVector.
at(1) + vector2.
at(2) * auxVector.
at(2);
1374 trD = damageTensor.giveTrace();
1376 Estar =
E / ( ( 1. +
nu ) * ( 1. - 2. *
nu ) );
1377 if ( ( epsilon11 + epsilon22 + epsilonZ ) >= 0. ) {
1382 term1 = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) - 3. * Bz * B1 * ( 1. - 2. *
nu );
1383 term2 = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) - 3. * Bz * B2 * ( 1. - 2. *
nu );
1384 termZ = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) + 3. * Bz * ( 1. - 2. *
nu ) * ( B1 + B2 );
1386 answer = ( Estar / ( 3. * ( B1 + B2 + Bz ) ) ) * ( epsilon11 * term1 + epsilon22 * term2 + epsilonZ * termZ );
1390 double B1, B2, Bz, eps11, eps22, Estar, term1, term2, termZ, trD, h;
1391 Estar=
E / ((1. +
nu)*(1. - 2. *
nu));
1393 double eVal1, eVal2, aux1, aux2;
1394 aux1 = (damageTensor.at(1,1) + damageTensor.at(2,2))/2.0;
1395 aux2 = sqrt(pow((damageTensor.at(1,1) - damageTensor.at(2,2)) / 2. , 2.) + damageTensor.at(1,2) * damageTensor.at(2,1));
1396 eVal1 = aux1 + aux2 ;
1397 eVal2 = aux1 - aux2 ;
1400 Bz = 1. - damageTensor.at(3, 3);
1401 eps11 = reducedTotalStrainVector.at(1);
1402 eps22 = reducedTotalStrainVector.at(2);
1403 if ((eps11 + eps22 + epsZ)>=0.) {
1408 trD = damageTensor.giveTrace();
1409 term1 = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) - 3. * Bz * B1 * ( 1. - 2. *
nu ) ;
1410 term2 = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) - 3. * Bz * B2 * ( 1. - 2. *
nu ) ;
1411 termZ = ( 3. - trD ) * ( 1. - h * trD ) * ( 1. +
nu ) + 3. * Bz * ( 1. - 2. *
nu ) * ( B1 + B2 ) ;
1413 answer = (Estar / (3. * (B1 + B2 + Bz))) * (eps11 * term1 + eps22 * term2 + epsZ * termZ);
1414 Estar = Estar + 0.0;
1420 const FloatArray &reducedTotalStrainVector,
double equivStrain,
1438 if ( equivStrain <= Kappa ) {
1439 answer.resize(3, 3);
1443 Kappa = equivStrain;
1446 FloatMatrix eVecs, strainTensor, positiveStrainTensor, positiveStrainTensorSquared, tempDamageTensor0;
1447 MaterialMode mode = gp->giveMaterialMode();
1450 StructuralMaterial :: giveFullSymVectorForm(fullStrainVector, reducedTotalStrainVector, mode);
1453 strainTensor.
resize(3, 3);
1454 strainTensor.
zero();
1455 if ( mode == _PlaneStress ) {
1459 strainTensor.
at(1, 1) = reducedTotalStrainVector.at(1);
1460 strainTensor.
at(2, 2) = reducedTotalStrainVector.at(2);
1461 strainTensor.
at(3, 3) = reducedTotalStrainVector.at(3);
1462 strainTensor.
at(2, 3) = reducedTotalStrainVector.at(4) / 2.0;
1463 strainTensor.
at(3, 2) = reducedTotalStrainVector.at(4) / 2.0;
1464 strainTensor.
at(1, 3) = reducedTotalStrainVector.at(5) / 2.0;
1465 strainTensor.
at(3, 1) = reducedTotalStrainVector.at(5) / 2.0;
1466 strainTensor.
at(1, 2) = reducedTotalStrainVector.at(6) / 2.0;
1467 strainTensor.
at(2, 1) = reducedTotalStrainVector.at(6) / 2.0;
1471 strainTensor.
jaco_(eVals, eVecs, 40);
1472 for (
int i = 1; i <= 3; i++ ) {
1473 if ( eVals.
at(i) < 0 ) {
1478 positiveStrainTensor.
resize(3, 3);
1479 for (
int i = 1; i <= 3; i++ ) {
1480 for (
int j = 1; j <= 3; j++ ) {
1481 positiveStrainTensor.
at(i, j) = eVals.
at(1) * eVecs.
at(i, 1) * eVecs.
at(j, 1) + eVals.
at(2) * eVecs.
at(i, 2) * eVecs.
at(j, 2) + eVals.
at(3) * eVecs.
at(i, 3) * eVecs.
at(j, 3);
1485 positiveStrainTensorSquared.
beProductOf(positiveStrainTensor, positiveStrainTensor);
1488 double traceD = Dn.
at(1, 1) + Dn.
at(2, 2) + Dn.
at(3, 3);
1492 deltaLambda = ( traceTempD - traceD ) / equivStrain / equivStrain;
1495 deltaD = positiveStrainTensorSquared;
1496 deltaD.
times(deltaLambda);
1499 tempDamageTensor0 = Dn;
1500 tempDamageTensor0.
add(deltaD);
1508 tempDamageTensor0.
jaco_(eVals, eVecs, 20);
1509 if ( ( eVals.
at(1) > ( Dc * 1.001 ) ) || ( eVals.
at(2) > ( Dc * 1.001 ) ) || ( eVals.
at(3) > ( Dc * 1.001 ) ) ) {
1510 double alpha = 0, deltaLambda1 = 0, Aux1 = 0, Aux2 = 0, Aux3 = 0;
1511 FloatMatrix deltaD1(3, 3), positiveStrainTensorSquared(3, 3), tempDamageTensor1(3, 3), deltaD2(3, 3), N11(3, 3), N12(3, 3), N13(3, 3), N12sym(3, 3), N13sym(3, 3), projPosStrainTensor(3, 3);
1512 FloatArray auxVals(3), auxVec1(3), auxVec2(3), auxVec3(3);
1515 alpha =
obtainAlpha1(Dn, deltaLambda, positiveStrainTensor, Dc);
1518 positiveStrainTensorSquared.
beProductOf(positiveStrainTensor, positiveStrainTensor);
1519 deltaD1 = positiveStrainTensorSquared;
1520 deltaD1.
times(alpha * deltaLambda);
1522 tempDamageTensor1 = Dn;
1523 tempDamageTensor1.
add(deltaD1);
1531 tempDamageTensor1.jaco_(eVals, eVecs, 40);
1535 if ( eVals.
at(1) >= eVals.
at(2) && eVals.
at(1) >= eVals.
at(3) ) {
1536 auxVals.at(1) = eVals.
at(1);
1537 auxVec1.at(1) = eVecs.
at(1, 1);
1538 auxVec1.at(2) = eVecs.
at(2, 1);
1539 auxVec1.at(3) = eVecs.
at(3, 1);
1540 auxVals.at(2) = eVals.
at(2);
1541 auxVec2.at(1) = eVecs.
at(1, 2);
1542 auxVec2.at(2) = eVecs.
at(2, 2);
1543 auxVec2.at(3) = eVecs.
at(3, 2);
1544 auxVals.at(3) = eVals.
at(3);
1545 auxVec3.
at(1) = eVecs.
at(1, 3);
1546 auxVec3.
at(2) = eVecs.
at(2, 3);
1547 auxVec3.
at(3) = eVecs.
at(3, 3);
1548 }
else if ( eVals.
at(2) >= eVals.
at(1) && eVals.
at(2) >= eVals.
at(3) ) {
1549 auxVals.at(1) = eVals.
at(2);
1550 auxVec1.at(1) = eVecs.
at(1, 2);
1551 auxVec1.at(2) = eVecs.
at(2, 2);
1552 auxVec1.at(3) = eVecs.
at(3, 2);
1553 auxVals.at(2) = eVals.
at(1);
1554 auxVec2.at(1) = eVecs.
at(1, 1);
1555 auxVec2.at(2) = eVecs.
at(2, 1);
1556 auxVec2.at(3) = eVecs.
at(3, 1);
1557 auxVals.at(3) = eVals.
at(3);
1558 auxVec3.
at(1) = eVecs.
at(1, 3);
1559 auxVec3.
at(2) = eVecs.
at(2, 3);
1560 auxVec3.
at(3) = eVecs.
at(3, 3);
1562 auxVals.at(1) = eVals.
at(3);
1563 auxVec1.at(1) = eVecs.
at(1, 3);
1564 auxVec1.at(2) = eVecs.
at(2, 3);
1565 auxVec1.at(3) = eVecs.
at(3, 3);
1566 auxVals.at(2) = eVals.
at(2);
1567 auxVec2.at(1) = eVecs.
at(1, 2);
1568 auxVec2.at(2) = eVecs.
at(2, 2);
1569 auxVec2.at(3) = eVecs.
at(3, 2);
1570 auxVals.at(3) = eVals.
at(1);
1571 auxVec3.
at(1) = eVecs.
at(1, 1);
1572 auxVec3.
at(2) = eVecs.
at(2, 1);
1573 auxVec3.
at(3) = eVecs.
at(3, 1);
1577 N11.beDyadicProductOf(auxVec1, auxVec1);
1578 N12.beDyadicProductOf(auxVec1, auxVec2);
1579 for (
int i = 1; i <= 3; i++ ) {
1580 for (
int j = 1; j <= 3; j++ ) {
1581 N12sym.at(i, j) = 0.5 * ( N12.at(i, j) + N12.at(j, i) );
1586 N13.beDyadicProductOf(auxVec1, auxVec3);
1587 for (
int i = 1; i <= 3; i++ ) {
1588 for (
int j = 1; j <= 3; j++ ) {
1589 N13sym.at(i, j) = 0.5 * ( N13.at(i, j) + N13.at(j, i) );
1594 for (
int i = 1; i <= 3; i++ ) {
1595 Aux1 = Aux1 + auxVec1.at(i) * ( positiveStrainTensorSquared.
at(i, 1) * auxVec1.at(1) + positiveStrainTensorSquared.
at(i, 2) * auxVec1.at(2) + positiveStrainTensorSquared.
at(i, 3) * auxVec1.at(3) );
1596 Aux2 = Aux2 + auxVec2.at(i) * ( positiveStrainTensorSquared.
at(i, 1) * auxVec1.at(1) + positiveStrainTensorSquared.
at(i, 2) * auxVec1.at(2) + positiveStrainTensorSquared.
at(i, 3) * auxVec1.at(3) );
1597 Aux3 = Aux3 + auxVec3.
at(i) * ( positiveStrainTensorSquared.
at(i, 1) * auxVec1.at(1) + positiveStrainTensorSquared.
at(i, 2) * auxVec1.at(2) + positiveStrainTensorSquared.
at(i, 3) * auxVec1.at(3) );
1600 N12sym.times(2 * Aux2);
1601 N13sym.times(2 * Aux3);
1604 projPosStrainTensor = positiveStrainTensorSquared;
1606 projPosStrainTensor.
subtract(N12sym);
1607 projPosStrainTensor.
subtract(N13sym);
1610 if ( ( projPosStrainTensor.
at(1, 1) + projPosStrainTensor.
at(2, 2) + projPosStrainTensor.
at(3, 3) ) < traceTempD * 1e-10 ) {
1613 deltaLambda1 = ( traceTempD - ( tempDamageTensor1.at(1, 1) + tempDamageTensor1.at(2, 2) + tempDamageTensor1.at(3, 3) ) ) / ( projPosStrainTensor.
at(1, 1) + projPosStrainTensor.
at(2, 2) + projPosStrainTensor.
at(3, 3) );
1616 deltaD2 = projPosStrainTensor;
1617 deltaD2.
times(deltaLambda1);
1619 tempDamageTensor1.add(deltaD2);
1624 tempDamageTensor1.jaco_(eVals, eVecs, 40);
1625 if ( ( eVals.
at(1) > ( Dc * 1.001 ) ) || ( eVals.
at(2) > ( Dc * 1.001 ) ) || ( eVals.
at(3) > ( Dc * 1.001 ) ) ) {
1626 FloatMatrix deltaD3(3, 3), projPosStrainTensor_new(3, 3), tempDamageTensor2(3, 3), deltaD4(3, 3);
1628 double alpha2 = 0, deltaLambda2 = 0, Aux4 = 0;
1631 tempDamageTensor1 = Dn;
1632 tempDamageTensor1.
add(deltaD1);
1635 alpha2 =
obtainAlpha2(tempDamageTensor1, deltaLambda1, positiveStrainTensor, projPosStrainTensor, Dc);
1637 deltaD3.times(alpha2);
1638 tempDamageTensor2 = tempDamageTensor1;
1639 tempDamageTensor2.add(deltaD3);
1642 tempDamageTensor2.jaco_(eVals, eVecs, 40);
1643 if ( eVals.
at(1) <= eVals.
at(2) && eVals.
at(1) <= eVals.
at(3) ) {
1645 vec3.
at(1) = eVecs.
at(1, 1);
1646 vec3.
at(2) = eVecs.
at(2, 1);
1647 vec3.
at(3) = eVecs.
at(3, 1);
1648 }
else if ( eVals.
at(2) <= eVals.
at(1) && eVals.
at(2) <= eVals.
at(3) ) {
1650 vec3.
at(1) = eVecs.
at(1, 2);
1651 vec3.
at(2) = eVecs.
at(2, 2);
1652 vec3.
at(3) = eVecs.
at(3, 2);
1655 vec3.
at(1) = eVecs.
at(1, 3);
1656 vec3.
at(2) = eVecs.
at(2, 3);
1657 vec3.
at(3) = eVecs.
at(3, 3);
1661 for (
int i = 1; i <= 3; i++ ) {
1662 Aux4 = Aux4 + vec3.
at(i) * ( positiveStrainTensorSquared.
at(i, 1) * vec3.
at(1) + positiveStrainTensorSquared.
at(i, 2) * vec3.
at(2) + positiveStrainTensorSquared.
at(i, 3) * vec3.
at(3) );
1664 projPosStrainTensor_new.beDyadicProductOf(vec3, vec3);
1666 projPosStrainTensor_new.times(Aux4);
1669 if ( ( projPosStrainTensor_new.at(1, 1) + projPosStrainTensor_new.at(2, 2) + projPosStrainTensor_new.at(3, 3) ) < traceTempD * 1e-10 ) {
1672 deltaLambda2 = ( traceTempD - ( tempDamageTensor2.at(1, 1) + tempDamageTensor2.at(2, 2) + tempDamageTensor2.at(3, 3) ) ) / ( projPosStrainTensor_new.at(1, 1) + projPosStrainTensor_new.at(2, 2) + projPosStrainTensor_new.at(3, 3) );
1674 deltaD4 = projPosStrainTensor_new;
1675 deltaD4.
times(deltaLambda2);
1676 tempDamageTensor2.add(deltaD4);
1682 tempDamageTensor2.jaco_(eVals, eVecs, 40);
1683 if ( ( eVals.
at(1) > ( Dc * 1.001 ) ) || ( eVals.
at(2) > ( Dc * 1.001 ) ) || ( eVals.
at(3) > ( Dc * 1.001 ) ) ) {
1686 tempDamageTensor2 = Dn;
1687 tempDamageTensor2.
add(deltaD1);
1688 tempDamageTensor2.add(deltaD3);
1689 alpha3 =
obtainAlpha3(tempDamageTensor2, deltaLambda2, positiveStrainTensor, vec3, Dc);
1691 deltaD5.
times(alpha3);
1692 tempDamageTensor3 = tempDamageTensor2;
1693 tempDamageTensor3.
add(deltaD5);
1694 tempDamageTensor = tempDamageTensor3;
1695 tempDamageTensor3.
jaco_(eVals, eVecs, 40);
1696 if ( ( eVals.
at(1) > ( Dc * 1.001 ) ) || ( eVals.
at(2) > ( Dc * 1.001 ) ) || ( eVals.
at(3) > ( Dc * 1.001 ) ) ) {
1697 tempDamageTensor3.
zero();
1698 for (
int i = 1; i <= 3; i++ ) {
1699 if ( eVals.
at(i) > Dc * 1.001 ) {
1703 for (
int i = 1; i <= 3; i++ ) {
1704 for (
int j = 1; j <= 3; j++ ) {
1705 tempDamageTensor3.
at(i, j) = eVals.
at(1) * eVecs.
at(i, 1) * eVecs.
at(j, 1) + eVals.
at(2) * eVecs.
at(i, 2) * eVecs.
at(j, 2) + eVals.
at(3) * eVecs.
at(i, 3) * eVecs.
at(j, 3);
1715 tempDamageTensor = tempDamageTensor3;
1717 tempDamageTensor = tempDamageTensor2;
1720 tempDamageTensor = tempDamageTensor1;
1723 tempDamageTensor = tempDamageTensor0;
1725 answer = tempDamageTensor;
1740 G =
E / ( 2.0 * ( 1.0 +
nu ) );
1741 K =
E / ( 3.0 * ( 1.0 - 2.0 *
nu ) );
1745 if ( fabs(3. - traceD) < 0.001 ) {
1748 Aux = ( 1. / ( 3. - traceD ) );
1754 ImD.
at(1, 1) = ImD.
at(2, 2) = ImD.
at(3, 3) = 1.0;
1759 ImD.
jaco_(eVals, eVecs, 40);
1761 for (
int i = 1; i <= 3; i++ ) {
1762 for (
int j = 1; j <= 3; j++ ) {
1763 for (
int k = 1; k <= 3; k++ ) {
1764 if ( eVals.
at(k) < 0.0 ) {
1768 sqrtImD.
at(i, j) = sqrt( eVals.
at(1) ) * eVecs.
at(i, 1) * eVecs.
at(j, 1) + sqrt( eVals.
at(2) ) * eVecs.
at(i, 2) * eVecs.
at(j, 2) + sqrt( eVals.
at(3) ) * eVecs.
at(i, 3) * eVecs.
at(j, 3);
1773 struct fourthOrderTensor
1786 fourthOrderTensor Block1, Block2, Block3, secantOperator;
1789 Imatrix.
at(1, 1) = Imatrix.
at(2, 2) = Imatrix.
at(3, 3) = 1.0;
1792 Block1.Matrix_11kl.resize(3, 3);
1793 Block1.Matrix_12kl.resize(3, 3);
1794 Block1.Matrix_13kl.resize(3, 3);
1795 Block1.Matrix_21kl.resize(3, 3);
1796 Block1.Matrix_22kl.resize(3, 3);
1797 Block1.Matrix_23kl.resize(3, 3);
1798 Block1.Matrix_31kl.resize(3, 3);
1799 Block1.Matrix_32kl.resize(3, 3);
1800 Block1.Matrix_33kl.resize(3, 3);
1801 Block2.Matrix_11kl.resize(3, 3);
1802 Block2.Matrix_12kl.resize(3, 3);
1803 Block2.Matrix_13kl.resize(3, 3);
1804 Block2.Matrix_21kl.resize(3, 3);
1805 Block2.Matrix_22kl.resize(3, 3);
1806 Block2.Matrix_23kl.resize(3, 3);
1807 Block2.Matrix_31kl.resize(3, 3);
1808 Block2.Matrix_32kl.resize(3, 3);
1809 Block2.Matrix_33kl.resize(3, 3);
1810 Block3.Matrix_11kl.resize(3, 3);
1811 Block3.Matrix_12kl.resize(3, 3);
1812 Block3.Matrix_13kl.resize(3, 3);
1813 Block3.Matrix_21kl.resize(3, 3);
1814 Block3.Matrix_22kl.resize(3, 3);
1815 Block3.Matrix_23kl.resize(3, 3);
1816 Block3.Matrix_31kl.resize(3, 3);
1817 Block3.Matrix_32kl.resize(3, 3);
1818 Block3.Matrix_33kl.resize(3, 3);
1819 secantOperator.Matrix_11kl.resize(3, 3);
1820 secantOperator.Matrix_12kl.resize(3, 3);
1821 secantOperator.Matrix_13kl.resize(3, 3);
1822 secantOperator.Matrix_21kl.resize(3, 3);
1823 secantOperator.Matrix_22kl.resize(3, 3);
1824 secantOperator.Matrix_23kl.resize(3, 3);
1825 secantOperator.Matrix_31kl.resize(3, 3);
1826 secantOperator.Matrix_32kl.resize(3, 3);
1827 secantOperator.Matrix_33kl.resize(3, 3);
1829 for (
int k = 1; k <= 3; k++ ) {
1830 for (
int l = 1; l <= 3; l++ ) {
1832 Block1.Matrix_11kl.at(k, l) = sqrtImD.
at(1, k) * sqrtImD.
at(1, l);
1833 Block1.Matrix_12kl.at(k, l) = sqrtImD.
at(1, k) * sqrtImD.
at(2, l);
1834 Block1.Matrix_13kl.at(k, l) = sqrtImD.
at(1, k) * sqrtImD.
at(3, l);
1835 Block1.Matrix_21kl.at(k, l) = sqrtImD.
at(2, k) * sqrtImD.
at(1, l);
1836 Block1.Matrix_22kl.at(k, l) = sqrtImD.
at(2, k) * sqrtImD.
at(2, l);
1837 Block1.Matrix_23kl.at(k, l) = sqrtImD.
at(2, k) * sqrtImD.
at(3, l);
1838 Block1.Matrix_31kl.at(k, l) = sqrtImD.
at(3, k) * sqrtImD.
at(1, l);
1839 Block1.Matrix_32kl.at(k, l) = sqrtImD.
at(3, k) * sqrtImD.
at(2, l);
1840 Block1.Matrix_33kl.at(k, l) = sqrtImD.
at(3, k) * sqrtImD.
at(3, l);
1842 Block2.Matrix_11kl.at(k, l) = ImD.
at(1, 1) * ImD.
at(k, l) * Aux;
1843 Block2.Matrix_12kl.at(k, l) = ImD.
at(1, 2) * ImD.
at(k, l) * Aux;
1844 Block2.Matrix_13kl.at(k, l) = ImD.
at(1, 3) * ImD.
at(k, l) * Aux;
1845 Block2.Matrix_21kl.at(k, l) = ImD.
at(2, 1) * ImD.
at(k, l) * Aux;
1846 Block2.Matrix_22kl.at(k, l) = ImD.
at(2, 2) * ImD.
at(k, l) * Aux;
1847 Block2.Matrix_23kl.at(k, l) = ImD.
at(2, 3) * ImD.
at(k, l) * Aux;
1848 Block2.Matrix_31kl.at(k, l) = ImD.
at(3, 1) * ImD.
at(k, l) * Aux;
1849 Block2.Matrix_32kl.at(k, l) = ImD.
at(3, 2) * ImD.
at(k, l) * Aux;
1850 Block2.Matrix_33kl.at(k, l) = ImD.
at(3, 3) * ImD.
at(k, l) * Aux;
1852 Block3.Matrix_11kl.at(k, l) = Imatrix.
at(1, 1) * Imatrix.
at(k, l);
1853 Block3.Matrix_12kl.at(k, l) = Imatrix.
at(1, 2) * Imatrix.
at(k, l);
1854 Block3.Matrix_13kl.at(k, l) = Imatrix.
at(1, 3) * Imatrix.
at(k, l);
1855 Block3.Matrix_21kl.at(k, l) = Imatrix.
at(2, 1) * Imatrix.
at(k, l);
1856 Block3.Matrix_22kl.at(k, l) = Imatrix.
at(2, 2) * Imatrix.
at(k, l);
1857 Block3.Matrix_23kl.at(k, l) = Imatrix.
at(2, 3) * Imatrix.
at(k, l);
1858 Block3.Matrix_31kl.at(k, l) = Imatrix.
at(3, 1) * Imatrix.
at(k, l);
1859 Block3.Matrix_32kl.at(k, l) = Imatrix.
at(3, 2) * Imatrix.
at(k, l);
1860 Block3.Matrix_33kl.at(k, l) = Imatrix.
at(3, 3) * Imatrix.
at(k, l);
1864 if ( ( strainTensor.at(1, 1) + strainTensor.at(2, 2) + strainTensor.at(3, 3) ) > 0.0 ) {
1865 for (
int k = 1; k <= 3; k++ ) {
1866 for (
int l = 1; l <= 3; l++ ) {
1867 secantOperator.Matrix_11kl.at(k, l) = 2 * G * ( Block1.Matrix_11kl.at(k, l) - Block2.Matrix_11kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_11kl.at(k, l);
1868 secantOperator.Matrix_12kl.at(k, l) = 2 * G * ( Block1.Matrix_12kl.at(k, l) - Block2.Matrix_12kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_12kl.at(k, l);
1869 secantOperator.Matrix_13kl.at(k, l) = 2 * G * ( Block1.Matrix_13kl.at(k, l) - Block2.Matrix_13kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_13kl.at(k, l);
1870 secantOperator.Matrix_21kl.at(k, l) = 2 * G * ( Block1.Matrix_21kl.at(k, l) - Block2.Matrix_21kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_21kl.at(k, l);
1871 secantOperator.Matrix_22kl.at(k, l) = 2 * G * ( Block1.Matrix_22kl.at(k, l) - Block2.Matrix_22kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_22kl.at(k, l);
1872 secantOperator.Matrix_23kl.at(k, l) = 2 * G * ( Block1.Matrix_23kl.at(k, l) - Block2.Matrix_23kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_23kl.at(k, l);
1873 secantOperator.Matrix_31kl.at(k, l) = 2 * G * ( Block1.Matrix_31kl.at(k, l) - Block2.Matrix_31kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_31kl.at(k, l);
1874 secantOperator.Matrix_32kl.at(k, l) = 2 * G * ( Block1.Matrix_32kl.at(k, l) - Block2.Matrix_32kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_32kl.at(k, l);
1875 secantOperator.Matrix_33kl.at(k, l) = 2 * G * ( Block1.Matrix_33kl.at(k, l) - Block2.Matrix_33kl.at(k, l) ) + K * ( 1 - traceD ) * Block3.Matrix_33kl.at(k, l);
1880 for (
int k = 1; k <= 3; k++ ) {
1881 for (
int l = 1; l <= 3; l++ ) {
1882 secantOperator.Matrix_11kl.at(k, l) = 2 * G * ( Block1.Matrix_11kl.at(k, l) - Block2.Matrix_11kl.at(k, l) ) + K *Block3.Matrix_11kl.at(k, l);
1883 secantOperator.Matrix_12kl.at(k, l) = 2 * G * ( Block1.Matrix_12kl.at(k, l) - Block2.Matrix_12kl.at(k, l) ) + K *Block3.Matrix_12kl.at(k, l);
1884 secantOperator.Matrix_13kl.at(k, l) = 2 * G * ( Block1.Matrix_13kl.at(k, l) - Block2.Matrix_13kl.at(k, l) ) + K *Block3.Matrix_13kl.at(k, l);
1885 secantOperator.Matrix_21kl.at(k, l) = 2 * G * ( Block1.Matrix_21kl.at(k, l) - Block2.Matrix_21kl.at(k, l) ) + K *Block3.Matrix_21kl.at(k, l);
1886 secantOperator.Matrix_22kl.at(k, l) = 2 * G * ( Block1.Matrix_22kl.at(k, l) - Block2.Matrix_22kl.at(k, l) ) + K *Block3.Matrix_22kl.at(k, l);
1887 secantOperator.Matrix_23kl.at(k, l) = 2 * G * ( Block1.Matrix_23kl.at(k, l) - Block2.Matrix_23kl.at(k, l) ) + K *Block3.Matrix_23kl.at(k, l);
1888 secantOperator.Matrix_31kl.at(k, l) = 2 * G * ( Block1.Matrix_31kl.at(k, l) - Block2.Matrix_31kl.at(k, l) ) + K *Block3.Matrix_31kl.at(k, l);
1889 secantOperator.Matrix_32kl.at(k, l) = 2 * G * ( Block1.Matrix_32kl.at(k, l) - Block2.Matrix_32kl.at(k, l) ) + K *Block3.Matrix_32kl.at(k, l);
1890 secantOperator.Matrix_33kl.at(k, l) = 2 * G * ( Block1.Matrix_33kl.at(k, l) - Block2.Matrix_33kl.at(k, l) ) + K *Block3.Matrix_33kl.at(k, l);
1895 answer.resize(6, 6);
1896 answer.at(1, 1) = secantOperator.Matrix_11kl.at(1, 1);
1897 answer.at(1, 2) = secantOperator.Matrix_11kl.at(2, 2);
1898 answer.at(1, 3) = secantOperator.Matrix_11kl.at(3, 3);
1899 answer.at(1, 4) = secantOperator.Matrix_11kl.at(2, 3);
1900 answer.at(1, 5) = secantOperator.Matrix_11kl.at(3, 1);
1901 answer.at(1, 6) = secantOperator.Matrix_11kl.at(1, 2);
1902 answer.at(2, 1) = secantOperator.Matrix_22kl.at(1, 1);
1903 answer.at(2, 2) = secantOperator.Matrix_22kl.at(2, 2);
1904 answer.at(2, 3) = secantOperator.Matrix_22kl.at(3, 3);
1905 answer.at(2, 4) = secantOperator.Matrix_22kl.at(2, 3);
1906 answer.at(2, 5) = secantOperator.Matrix_22kl.at(3, 1);
1907 answer.at(2, 6) = secantOperator.Matrix_22kl.at(1, 2);
1908 answer.at(3, 1) = secantOperator.Matrix_33kl.at(1, 1);
1909 answer.at(3, 2) = secantOperator.Matrix_33kl.at(2, 2);
1910 answer.at(3, 3) = secantOperator.Matrix_33kl.at(3, 3);
1911 answer.at(3, 4) = secantOperator.Matrix_33kl.at(2, 3);
1912 answer.at(3, 5) = secantOperator.Matrix_33kl.at(3, 1);
1913 answer.at(3, 6) = secantOperator.Matrix_33kl.at(1, 2);
1914 answer.at(4, 1) = secantOperator.Matrix_23kl.at(1, 1);
1915 answer.at(4, 2) = secantOperator.Matrix_23kl.at(2, 2);
1916 answer.at(4, 3) = secantOperator.Matrix_23kl.at(3, 3);
1917 answer.at(4, 4) = secantOperator.Matrix_23kl.at(2, 3);
1918 answer.at(4, 5) = secantOperator.Matrix_23kl.at(3, 1);
1919 answer.at(4, 6) = secantOperator.Matrix_23kl.at(1, 2);
1920 answer.at(5, 1) = secantOperator.Matrix_31kl.at(1, 1);
1921 answer.at(5, 2) = secantOperator.Matrix_31kl.at(2, 2);
1922 answer.at(5, 3) = secantOperator.Matrix_31kl.at(3, 3);
1923 answer.at(5, 4) = secantOperator.Matrix_31kl.at(2, 3);
1924 answer.at(5, 5) = secantOperator.Matrix_31kl.at(3, 1);
1925 answer.at(5, 6) = secantOperator.Matrix_31kl.at(1, 2);
1926 answer.at(6, 1) = secantOperator.Matrix_12kl.at(1, 1);
1927 answer.at(6, 2) = secantOperator.Matrix_12kl.at(2, 2);
1928 answer.at(6, 3) = secantOperator.Matrix_12kl.at(3, 3);
1929 answer.at(6, 4) = secantOperator.Matrix_12kl.at(2, 3);
1930 answer.at(6, 5) = secantOperator.Matrix_12kl.at(3, 1);
1931 answer.at(6, 6) = secantOperator.Matrix_12kl.at(1, 2);