51#ifndef MDM_MAPPING_DEBUG
53 #ifdef MDM_USE_MMAClosestIPTransfer
57 #ifdef MDM_USE_MMAShapeFunctProjection
61 #ifdef MDM_USE_MMALeastSquareProjection
73std::unique_ptr<MaterialStatus>
81MDM :: hasMaterialModeCapability(MaterialMode mode)
const
83 return mode == _3dMat || mode == _PlaneStress || mode == _PlaneStrain;
90 FloatArray reducedStrain, strainPDC, stressPDC, stress;
92 FloatMatrix tempDamageTensor, tempDamageTensorEigenVec;
101 this->
computePDC(tempDamageTensor, tempDamageTensorEigenVals, tempDamageTensorEigenVec);
104 for (
int ii = 1; ii <=
nsd; ii++ ) {
105 if ( tempDamageTensorEigenVals.
at(ii) < 0.0 ) {
106 OOFEM_ERROR(
"negative eigenvalue of damage tensor detected, element %d, ip %d",
170 nonlocalDamageTensor.
at(1, 1) += nonlocalContribution.
at(1, 1) * lir.weight;
171 nonlocalDamageTensor.
at(2, 2) += nonlocalContribution.
at(2, 2) * lir.weight;
172 nonlocalDamageTensor.
at(1, 2) += nonlocalContribution.
at(1, 2) * lir.weight;
174 nonlocalDamageTensor.
at(1, 1) += nonlocalContribution.
at(1, 1) * lir.weight;
175 nonlocalDamageTensor.
at(2, 2) += nonlocalContribution.
at(2, 2) * lir.weight;
176 nonlocalDamageTensor.
at(3, 3) += nonlocalContribution.
at(3, 3) * lir.weight;
177 nonlocalDamageTensor.
at(1, 2) += nonlocalContribution.
at(1, 2) * lir.weight;
178 nonlocalDamageTensor.
at(1, 3) += nonlocalContribution.
at(1, 3) * lir.weight;
179 nonlocalDamageTensor.
at(2, 3) += nonlocalContribution.
at(2, 3) * lir.weight;
187 damageTensor = nonlocalDamageTensor;
210 if ( PsiOld > Psi ) {
219 for (
int i = 1; i <= 6; i++ ) {
224 for (
int i = 1; i <= 6; i++ ) {
236 damageTensor.
resize(2, 2);
239 damageTensor.
at(1, 1) = damageVector.
at(1);
240 damageTensor.
at(2, 2) = damageVector.
at(2);
241 damageTensor.
at(1, 2) = damageTensor.
at(2, 1) = damageVector.
at(6);
242 }
else if (
ndc == 6 ) {
244 damageTensor.
resize(3, 3);
245 damageVector.
times(6.0);
247 damageTensor.
at(1, 1) = damageVector.
at(1);
248 damageTensor.
at(2, 2) = damageVector.
at(2);
249 damageTensor.
at(3, 3) = damageVector.
at(3);
250 damageTensor.
at(2, 3) = damageTensor.
at(3, 2) = damageVector.
at(4);
251 damageTensor.
at(3, 1) = damageTensor.
at(1, 3) = damageVector.
at(5);
252 damageTensor.
at(1, 2) = damageTensor.
at(2, 1) = damageVector.
at(6);
260#define LARGE_EXPONENT 50.0
261#define HUGE_RELATIVE_COMPLIANCE 1.e20
266 double en, em, el, Ep, Efp, ParEpp;
267 double Enorm = 0.0, sv = 0.0, answer = 0.0;
271 StructuralMaterial :: giveInvertedVoigtVectorMask( mask, gp->
giveMaterialMode() );
273 StructuralMaterial :: giveFullSymVectorForm( fullStrain, strain, gp->
giveMaterialMode() );
284 for (
int i = 1; i <=
nsd; i++ ) {
286 sv += prevStress.
at( mask.
at(i) );
291 ParEpp = Ep / ( 1. -
ParMd );
294 en /= ( 1. -
ParMd * sv / ( fmicroplane ) );
307 Enorm = sqrt(en * en + em * em + el * el);
316 if ( Enorm <= ParEpp ) {
319 double aux = ( Enorm - ParEpp ) / Efp;
321 answer = sqrt( ( Enorm / ParEpp ) * exp(aux) );
347 help.Jacobi(& tempDamageTensorEigenVals, & tempDamageTensorEigenVec, & nrot);
349 help.
jaco_(tempDamageTensorEigenVals, tempDamageTensorEigenVec, 10);
354#define N(p, q) t.at(q, p)
355#define E(p) fullStrain.at(p)
364 StructuralMaterial :: giveFullSymVectorForm( fullStrain, strain, gp->
giveMaterialMode() );
367 answer.
at(1) =
N(1, 1) * (
N(1, 1) *
E(1) +
N(1, 2) *
E(6) +
N(1, 3) *
E(5) )
368 +
N(1, 2) * (
N(1, 2) *
E(2) +
N(1, 3) *
E(4) )
369 +
N(1, 3) *
N(1, 3) *
E(3);
370 answer.
at(2) =
N(2, 1) * (
N(2, 1) *
E(1) +
N(2, 2) *
E(6) +
N(2, 3) *
E(5) )
371 +
N(2, 2) * (
N(2, 2) *
E(2) +
N(2, 3) *
E(4) )
372 +
N(2, 3) *
N(2, 3) *
E(3);
373 answer.
at(3) =
N(3, 1) * (
N(3, 1) *
E(1) +
N(3, 2) *
E(6) +
N(3, 3) *
E(5) )
374 +
N(3, 2) * (
N(3, 2) *
E(2) +
N(3, 3) *
E(4) )
375 +
N(3, 3) *
N(3, 3) *
E(3);
376 answer.
at(4) =
N(2, 1) * (
N(3, 1) *
E(1) +
N(3, 2) *
E(6) / 2 +
N(3, 3) *
E(5) / 2 )
377 +
N(2, 2) * (
N(3, 1) *
E(6) / 2 +
N(3, 2) *
E(2) +
N(3, 3) *
E(4) / 2 )
378 +
N(2, 3) * (
N(3, 1) *
E(5) / 2 +
N(3, 2) *
E(4) / 2 +
N(3, 3) *
E(3) );
380 answer.
at(5) =
N(1, 1) * (
N(3, 1) *
E(1) +
N(3, 2) *
E(6) / 2 +
N(3, 3) *
E(5) / 2 )
381 +
N(1, 2) * (
N(3, 1) *
E(6) / 2 +
N(3, 2) *
E(2) +
N(3, 3) *
E(4) / 2 )
382 +
N(1, 3) * (
N(3, 1) *
E(5) / 2 +
N(3, 2) *
E(4) / 2 +
N(3, 3) *
E(3) );
384 answer.
at(6) =
N(1, 1) * (
N(2, 1) *
E(1) +
N(2, 2) *
E(6) / 2 +
N(2, 3) *
E(5) / 2 )
385 +
N(1, 2) * (
N(2, 1) *
E(6) / 2 +
N(2, 2) *
E(2) +
N(2, 3) *
E(4) / 2 )
386 +
N(1, 3) * (
N(2, 1) *
E(5) / 2 +
N(2, 2) *
E(4) / 2 +
N(2, 3) *
E(3) );
392 answer.
at(1) =
N(1, 1) * (
N(1, 1) *
E(1) +
N(1, 2) *
E(3) )
393 +
N(1, 2) *
N(1, 2) *
E(2);
394 answer.
at(2) =
N(2, 1) * (
N(2, 1) *
E(1) +
N(2, 2) *
E(3) )
395 +
N(2, 2) *
N(2, 2) *
E(2);
396 answer.
at(3) =
N(1, 1) * (
N(2, 1) *
E(1) +
N(2, 2) *
E(3) / 2 )
397 +
N(1, 2) * (
N(2, 1) *
E(3) / 2 +
N(2, 2) *
E(2) );
406 double psi1 = tempDamageTensorEigenVals.
at(1);
407 double psi2 = tempDamageTensorEigenVals.
at(2);
408 double psi3 = tempDamageTensorEigenVals.
at(3);
411 strainPDC.
at(1) /= psi1;
412 strainPDC.
at(2) /= psi2;
413 strainPDC.
at(3) /= psi3;
414 strainPDC.
at(4) /= sqrt(psi2 * psi3);
415 strainPDC.
at(5) /= sqrt(psi1 * psi3);
416 strainPDC.
at(6) /= sqrt(psi1 * psi2);
418 strainPDC.
at(1) *= psi1;
419 strainPDC.
at(2) *= psi2;
420 strainPDC.
at(3) *= psi3;
421 strainPDC.
at(4) *= sqrt(psi2 * psi3);
422 strainPDC.
at(5) *= sqrt(psi1 * psi3);
423 strainPDC.
at(6) *= sqrt(psi1 * psi2);
429 double psi1 = tempDamageTensorEigenVals.
at(1);
430 double psi2 = tempDamageTensorEigenVals.
at(2);
432 strainPDC.
at(1) /= psi1;
433 strainPDC.
at(2) /= psi2;
434 strainPDC.
at(3) /= sqrt(psi1 * psi2);
436 strainPDC.
at(1) *= psi1;
437 strainPDC.
at(2) *= psi2;
438 strainPDC.
at(3) *= sqrt(psi1 * psi2);
468#define Nt(p, q) t.at(p, q)
469#define S(p) stressPDC.at(p)
478 fullAnswer.
at(1) =
Nt(1, 1) * (
Nt(1, 1) *
S(1) + 2 *
Nt(1, 2) *
S(6) + 2 *
Nt(1, 3) *
S(5) )
479 +
Nt(1, 2) * (
Nt(1, 2) *
S(2) + 2 *
Nt(1, 3) *
S(4) )
480 +
Nt(1, 3) *
Nt(1, 3) *
S(3);
481 fullAnswer.
at(2) =
Nt(2, 1) * (
Nt(2, 1) *
S(1) + 2 *
Nt(2, 2) *
S(6) + 2 *
Nt(2, 3) *
S(5) )
482 +
Nt(2, 2) * (
Nt(2, 2) *
S(2) + 2 *
Nt(2, 3) *
S(4) )
483 +
Nt(2, 3) *
Nt(2, 3) *
S(3);
484 fullAnswer.
at(3) =
Nt(3, 1) * (
Nt(3, 1) *
S(1) + 2 *
Nt(3, 2) *
S(6) + 2 *
Nt(3, 3) *
S(5) )
485 +
Nt(3, 2) * (
Nt(3, 2) *
S(2) + 2 *
Nt(3, 3) *
S(4) )
486 +
Nt(3, 3) *
Nt(3, 3) *
S(3);
487 fullAnswer.
at(4) =
Nt(2, 1) * (
Nt(3, 1) *
S(1) +
Nt(3, 2) *
S(6) +
Nt(3, 3) *
S(5) )
488 +
Nt(2, 2) * (
Nt(3, 1) *
S(6) +
Nt(3, 2) *
S(2) +
Nt(3, 3) *
S(4) )
489 +
Nt(2, 3) * (
Nt(3, 1) *
S(5) +
Nt(3, 2) *
S(4) +
Nt(3, 3) *
S(3) );
490 fullAnswer.
at(5) =
Nt(1, 1) * (
Nt(3, 1) *
S(1) +
Nt(3, 2) *
S(6) +
Nt(3, 3) *
S(5) )
491 +
Nt(1, 2) * (
Nt(3, 1) *
S(6) +
Nt(3, 2) *
S(2) +
Nt(3, 3) *
S(4) )
492 +
Nt(1, 3) * (
Nt(3, 1) *
S(5) +
Nt(3, 2) *
S(4) +
Nt(3, 3) *
S(3) );
493 fullAnswer.
at(6) =
Nt(1, 1) * (
Nt(2, 1) *
S(1) +
Nt(2, 2) *
S(6) +
Nt(2, 3) *
S(5) )
494 +
Nt(1, 2) * (
Nt(2, 1) *
S(6) +
Nt(2, 2) *
S(2) +
Nt(2, 3) *
S(4) )
495 +
Nt(1, 3) * (
Nt(2, 1) *
S(5) +
Nt(2, 2) *
S(4) +
Nt(2, 3) *
S(3) );
497 StructuralMaterial :: giveReducedSymVectorForm( answer, fullAnswer, gp->
giveMaterialMode() );
501 answer.
at(1) =
Nt(1, 1) * (
Nt(1, 1) *
S(1) +
Nt(1, 2) * 2. *
S(3) )
502 +
Nt(1, 2) *
Nt(1, 2) *
S(2);
503 answer.
at(2) =
Nt(2, 1) * (
Nt(2, 1) *
S(1) +
Nt(2, 2) * 2. *
S(3) )
504 +
Nt(2, 2) *
Nt(2, 2) *
S(2);
505 answer.
at(3) =
Nt(1, 1) * (
Nt(2, 1) *
S(1) +
Nt(2, 2) *
S(3) )
506 +
Nt(1, 2) * (
Nt(2, 1) *
S(3) +
Nt(2, 2) *
S(2) );
514 MatResponseMode mode,
525 if ( ( mode == TangentStiffness ) || ( mode == SecantStiffness ) ) {
535#define MAX_REL_COMPL_TRESHOLD 1.e6
543 double psi1 = 0.0, psi2 = 0.0, psi3 = 0.0;
564 d.
at(1, 1) /= ( psi1 * psi1 );
565 d.
at(1, 2) /= ( psi1 * psi2 );
566 d.
at(1, 3) /= ( psi1 * psi3 );
567 d.
at(2, 1) /= ( psi2 * psi1 );
568 d.
at(2, 2) /= ( psi2 * psi2 );
569 d.
at(2, 3) /= ( psi2 * psi3 );
570 d.
at(3, 1) /= ( psi3 * psi1 );
571 d.
at(3, 2) /= ( psi3 * psi2 );
572 d.
at(3, 3) /= ( psi3 * psi3 );
573 d.
at(4, 4) /= ( psi2 * psi3 );
574 d.
at(5, 5) /= ( psi1 * psi3 );
575 d.
at(6, 6) /= ( psi1 * psi2 );
577 d.
at(1, 1) /= ( psi1 * psi1 );
578 d.
at(1, 2) /= ( psi1 * psi2 );
579 d.
at(1, 3) /= ( psi1 * psi3 );
580 d.
at(2, 1) /= ( psi2 * psi1 );
581 d.
at(2, 2) /= ( psi2 * psi2 );
582 d.
at(2, 3) /= ( psi2 * psi3 );
583 d.
at(3, 1) /= ( psi3 * psi1 );
584 d.
at(3, 2) /= ( psi3 * psi2 );
585 d.
at(3, 3) /= ( psi3 * psi3 );
586 d.
at(4, 4) /= ( psi1 * psi2 );
594 double psi1 = 0.0, psi2 = 0.0;
611 d.
at(1, 1) /= psi1 * psi1;
612 d.
at(1, 2) /= psi1 * psi2;
613 d.
at(2, 1) /= psi2 * psi1;
614 d.
at(2, 2) /= psi2 * psi2;
615 d.
at(3, 3) /= psi1 * psi2;
630MDM :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
663 if ( type == IST_DamageTensor ) {
677 answer.
at(1) = 1. - d.
at(1, 1);
678 answer.
at(2) = 1. - d.
at(2, 2);
679 answer.
at(3) = d.
at(1, 2);
685 answer.
at(1) = 1. - d.
at(1, 1);
686 answer.
at(2) = 1. - d.
at(2, 2);
687 answer.
at(3) = 1. - d.
at(3, 3);
688 answer.
at(4) = d.
at(2, 3);
689 answer.
at(5) = d.
at(1, 3);
690 answer.
at(6) = d.
at(1, 2);
694 }
else if ( type == IST_DamageTensorTemp ) {
705 answer.
at(1) = 1. - d.
at(1, 1);
706 answer.
at(2) = 1. - d.
at(2, 2);
707 answer.
at(3) = d.
at(1, 2);
713 answer.
at(1) = 1. - d.
at(1, 1);
714 answer.
at(2) = 1. - d.
at(2, 2);
715 answer.
at(3) = 1. - d.
at(3, 3);
716 answer.
at(4) = d.
at(2, 3);
717 answer.
at(5) = d.
at(1, 3);
718 answer.
at(6) = d.
at(1, 2);
722 }
else if ( type == IST_PrincipalDamageTensor ) {
728 for (
int i = 1; i <=
nsd; i++ ) {
729 answer.
at(i) = 1. - 1. / d.
at(i) / d.
at(i);
732 for (
int i = 1; i <=
nsd; i++ ) {
733 answer.
at(i) = 1. - d.
at(i) * d.
at(i);
738 }
else if ( type == IST_PrincipalDamageTempTensor ) {
744 for (
int i = 1; i <=
nsd; i++ ) {
745 answer.
at(i) = 1. - 1. / d.
at(i) / d.
at(i);
748 for (
int i = 1; i <=
nsd; i++ ) {
749 answer.
at(i) = 1. - d.
at(i) * d.
at(i);
754 }
else if ( type == IST_MicroplaneDamageValues ) {
758 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
768 this->tempDillatCoeff,
830#ifdef MDM_MAPPING_DEBUG
837 MicroplaneMaterial :: initializeFrom(ir);
840 StructuralNonlocalMaterialExtensionInterface :: initializeFrom(ir);
845#ifdef MDM_MAPPING_DEBUG
849 mapper.initializeFrom(ir);
858 MicroplaneMaterial :: giveInputRecord(input);
859 StructuralNonlocalMaterialExtensionInterface :: giveInputRecord(input);
860#ifdef MDM_MAPPING_DEBUG
865 mapper.giveInputRecord(input);
867 mapper2.giveInputRecord(input);
910 Dlocal.beProductTOf(td, tt);
913#define FORMT33(i, j, ij) answer.at(ij, 1) = t.at(i, 1) * t.at(j, 1); answer.at(ij, 2) = t.at(i, 2) * t.at(j, 2); answer.at(ij, 3) = t.at(i, 1) * t.at(j, 2) + t.at(i, 2) * t.at(j, 1)
915#define FORMT44(i, j, ij) answer.at(ij, 1) = t.at(i, 1) * t.at(j, 1); answer.at(ij, 2) = t.at(i, 2) * t.at(j, 2); answer.at(ij, 3) = t.at(i, 3) * t.at(j, 3); answer.at(ij, 4) = t.at(i, 1) * t.at(j, 2) + t.at(i, 2) * t.at(j, 1)
917#define FORMT66(i, j, ij) answer.at(ij, 1) = t.at(i, 1) * t.at(j, 1); answer.at(ij, 2) = t.at(i, 2) * t.at(j, 2); answer.at(ij, 3) = t.at(i, 3) * t.at(j, 3); answer.at(ij, 4) = t.at(i, 2) * t.at(j, 3) + t.at(i, 3) * t.at(j, 2); answer.at(ij, 5) = t.at(i, 1) * t.at(j, 3) + t.at(i, 3) * t.at(j, 1); answer.at(ij, 6) = t.at(i, 1) * t.at(j, 2) + t.at(i, 2) * t.at(j, 1)
931 answer.at(1, 1) = 1.0;
967 OOFEM_ERROR(
"Stress transformation matrix format not implemented");
985 double gammaf = ( EModulus * this->
Gf ) / ( this->
R * this->
Ft * this->
Ft );
986 double gamma = gammaf / ( 1.47 - 0.0014 * gammaf );
987 double f = this->Ft / ( 1.56 + 0.006 * gamma );
988 Efp = this->
mdm_Efp = ( gamma * f ) / EModulus;
990 Ep = this->
mdm_Ep = f / EModulus;
997 StructuralMaterial :: giveFullSymVectorForm( strainVector, reducedStrain, gp->
giveMaterialMode() );
1004 double max = principalStrain.
at(1);
1005 if ( principalStrain.
at(2) >
max ) {
1009 if ( principalStrain.
at(3) >
max ) {
1014 dir.
at(1) = dirs.
at(1, indx);
1015 dir.
at(2) = dirs.
at(2, indx);
1016 dir.
at(3) = dirs.
at(3, indx);
1022 Efp = (
Gf / ( h *
E * Ep ) + 1.2 * Ep ) / 1.75 - Ep;
1024 Efp = (
Gf / ( h *
E * Ep ) + ( 2.13 +
ParMd ) * Ep ) / ( 2.73 -
ParMd ) - Ep;
1090 OOFEM_ERROR(
"required number of microplanes too big");
1096 int ij [ 6 ] [ 2 ] = { { 1, 1 }, { 2, 2 }, { 3, 3 }, { 2, 3 }, { 3, 1 }, { 1, 2 } };
1120 for (
int i = 0; i < 6; i++ ) {
1121 int ii = ij [ i ] [ 0 ];
1122 int jj = ij [ i ] [ 1 ];
1124 N [ iplane ] [ i ] = n.at(ii) * n.at(jj);
1125 M [ iplane ] [ i ] = 0.5 * ( m.at(ii) * n.at(jj) + m.at(jj) * n.at(ii) );
1126 L [ iplane ] [ i ] = 0.5 * ( l.
at(ii) * n.at(jj) + l.
at(jj) * n.at(ii) );
1149 status->setLocalDamageTensorForAverage(tempDamageTensor);
1158 double dist =
distance(src, coord);
1160 if ( ( dist >= 0. ) && ( dist <= this->
R ) ) {
1161 double help = ( 1. - dist * dist / (
R *
R ) );
1177 toMap.
at(1) = ( int ) IST_MicroplaneDamageValues;
1193#ifndef MDM_MAPPING_DEBUG
1195 result = mapper.mapVariable(intVal, gp, IST_MicroplaneDamageValues, tStep);
1199 result =
mapper2.mapVariable(intVal, gp, IST_MicroplaneDamageValues, tStep);
1202 result =
mapperSFT.mapVariable(intVal, gp, IST_MicroplaneDamageValues, tStep);
1205 result =
mapperLST.mapVariable(intVal, gp, IST_MicroplaneDamageValues, tStep);
1213 for (
int i = 1; i <= intVal.
giveSize(); i++ ) {
1214 if ( intVal.
at(i) < 1.0 ) {
1219 for (
int i = 1; i <= intVal.
giveSize(); i++ ) {
1220 if ( intVal.
at(i) < 0.0 ) {
1224 if ( intVal.
at(i) > 1.0 ) {
1238 toMap.
at(1) = ( int ) IST_StrainTensor;
1239 toMap.
at(2) = ( int ) IST_StressTensor;
1242 result =
mapper2.mapVariable(intVal, gp, IST_StressTensor, tStep);
1247 result =
mapper2.mapVariable(intVal, gp, IST_StrainTensor, tStep);
1276#ifndef MDM_MAPPING_DEBUG
1277 this->mapper.finish(tStep);
1348 }
else if (
nsd == 3 ) {
1357 cost *= ( 1.0 + size / 15.0 );
1367MDMStatus :: MDMStatus(
GaussPoint *g,
int nsd,
int nmplanes) :
StructuralMaterialStatus(g),
StructuralNonlocalMaterialStatusExtensionInterface(),
Psi(nmplanes),
PsiTemp(nmplanes),
DamageTensor(nsd, nsd),
DamageTensorTemp(nsd, nsd),
tempDamageTensorEigenValues(nsd),
damageTensorEigenValues(nsd),
tempDamageTensorEigenVectors(nsd, nsd),
damageTensorEigenVectors(nsd, nsd)
1369 for (
int i = 1; i <= nsd; i++ ) {
1379 StructuralMaterialStatus :: saveContext(stream, mode);
1382 if ( ( iores =
Psi.storeYourself(stream) ) !=
CIO_OK ) {
1403 StructuralMaterialStatus :: restoreContext(stream, mode);
1406 if ( ( iores =
Psi.restoreYourself(stream) ) !=
CIO_OK ) {
1426 StructuralMaterialStatus :: updateYourself(tStep);
1435MDMStatus :: initTempStatus()
1437 StructuralMaterialStatus :: initTempStatus();
1446MDMStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
1448 StructuralMaterialStatus :: printOutputAt(file, tStep);
1449 fprintf(file,
"status { ");
1451 fprintf(file,
" compliance on microplanes: ");
1452 for (
auto &val :
Psi ) {
1453 fprintf( file,
" %.4e", val );
1456 fprintf(file,
", complianceTensorEigenVectors ");
1468 fprintf(file,
", complianceTensorEigenValues ");
1470 fprintf( file,
" %.4e", val );
1473 fprintf(file,
"}\n");
#define REGISTER_Material(class)
int giveNumberOfElements() const
Returns number of elements in domain.
Element * giveElement(int n)
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
virtual Material * giveMaterial()
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
bool isNotEmpty() const
Returns true if receiver is not empty.
contextIOResultType storeYourself(DataStream &stream) const
void resize(Index rows, Index cols)
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
bool jaco_(FloatArray &eval, FloatMatrix &v, int nf)
contextIOResultType restoreYourself(DataStream &stream)
int givePackSize(DataStream &buff) const
bool beInverseOf(const FloatMatrix &src)
int giveNumberOfRows() const
Returns number of rows of receiver.
double at(std::size_t i, std::size_t j) const
int giveNumber()
Returns number of receiver.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
void updateYourself(TimeStep *tStep)
Element * giveElement()
Returns corresponding element to receiver.
void followedBy(const IntArray &b, int allocChunk=0)
FloatArray tempDamageTensorEigenValues
Principal damage directions.
const FloatMatrix * giveLocalDamageTensorForAveragePtr()
void setMicroplaneTempDamage(int m, double val)
FloatMatrix DamageTensorTemp
const FloatMatrix & giveLocalDamageTensorForAverage()
FloatArray Psi
Damage values on individual microplanes.
FloatMatrix damageTensorEigenVectors
void setLocalDamageTensorForAverage(FloatMatrix src)
void setMicroplaneTempDamageValues(FloatArray src)
void setTempDamageTensorEigenVals(FloatArray src)
FloatArray damageTensorEigenValues
const FloatArray & giveTempDamageTensorEigenVals()
void setTempDamageTensor(FloatMatrix src)
void updateYourself(TimeStep *tStep) override
FloatMatrix tempDamageTensorEigenVectors
const FloatMatrix & giveTempDamageTensor()
double giveMicroplaneDamage(int m)
const FloatArray & giveDamageTensorEigenVals()
const FloatMatrix & giveDamageTensor()
const FloatArray & giveMicroplaneDamageValues()
void setTempDamageTensorEigenVec(FloatMatrix src)
FloatMatrix DamageTensor
Macroscopic damage tensor.
void applyDamageToStiffness(FloatMatrix &d, GaussPoint *gp) const
double ParMd
THREAD UNSAFE. These are modified when evaluating the material. Why? This must be avoided at all cost...
MDMFormulatrionType formulation
void giveRawMDMParameters(double &Efp, double &Ep, const FloatArray &reducedStrain, GaussPoint *gp) const
void rotateTensor4(FloatMatrix &Dlocal, const FloatMatrix &t) const
void giveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
double Ft
Macroscopic tensile strength (necessary to determine Ep and Efp if not given).
void transformStrainToPDC(FloatArray &answer, FloatArray &strain, FloatMatrix &t, GaussPoint *gp) const
double tempDillatCoeff
Temperature dilatation coeff.
static MMAShapeFunctProjection mapperSFT
Mapper used to map internal variables in adaptivity.
int nonlocal
Flag indicating local or nonlocal mode.
void transformStiffnessfromPDC(FloatMatrix &de, const FloatMatrix &t) const
void applyDamageTranformation(FloatArray &strainPDC, const FloatArray &tempDamageTensorEigenVals) const
double mdm_Ep
Parameter controlling the elastic limit.
double mdm_Efp
Prescribed value of ef-ep.
IsotropicLinearElasticMaterial linearElasticMaterial
Reference to bulk (undamaged) material.
static MMALeastSquareProjection mapperLST
void computePDC(FloatMatrix &tempDamageTensor, FloatArray &tempDamageTensorEigenVals, FloatMatrix &tempDamageTensorEigenVec) const
double R
Interaction radius, related to the nonlocal characteristic length of material.
std::unique_ptr< Set > sourceElemSet
cached source element set used to map internal variables (adaptivity), created on demand
void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const override
void computeDamageTensor(FloatMatrix &tempDamageTensor, const FloatArray &totalStrain, GaussPoint *gp, TimeStep *tStep) const
double computeDamageOnPlane(GaussPoint *gp, int mnumber, const FloatArray &strain) const
static MMAClosestIPTransfer mapper2
Mapper used to map stresses in adaptivity.
int nsd
Number of spatial dimensions.
void formTransformationMatrix(FloatMatrix &answer, const FloatMatrix &t, int n) const
double Gf
Fracture energy (necessary to determine Ep and Efp if not given).
int ndc
Number of damage components.
void transformStressFromPDC(FloatArray &answer, const FloatArray &stressPDC, const FloatMatrix &t, GaussPoint *gp) const
void computeEffectiveStress(FloatArray &stressPDC, const FloatArray &strainPDC, GaussPoint *gp, TimeStep *tStep) const
void computeLocalDamageTensor(FloatMatrix &tempDamageTensor, const FloatArray &totalStrain, GaussPoint *gp, TimeStep *tStep) const
MaterialModelMapperInterface()
Constructor.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
std::vector< FloatArrayF< 6 > > N
FloatArray microplaneWeights
Integration weights of microplanes.
double computeShearMStrainComponent(int mnumber, const FloatArray ¯oStrain) const
std::vector< FloatArrayF< 3 > > microplaneNormals
Normals of microplanes.
double computeShearLStrainComponent(int mnumber, const FloatArray ¯oStrain) const
int numberOfMicroplanes
Number of microplanes.
std::vector< FloatArrayF< 6 > > M
std::vector< FloatArrayF< 6 > > L
double computeNormalStrainComponent(int mnumber, const FloatArray ¯oStrain) const
void buildNonlocalPointTable(GaussPoint *gp) const
void endIPNonlocalAverage(GaussPoint *gp) const
void updateDomainBeforeNonlocAverage(TimeStep *tStep) const
std ::vector< localIntegrationRecord > * giveIPIntegrationList(GaussPoint *gp) const
std ::vector< localIntegrationRecord > * giveIntegrationDomainList()
double giveIntegrationScale()
Returns associated integration scale.
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
static void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir, const FloatArray &s, stressStrainPrincMode mode)
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode) const
StructuralNonlocalMaterialExtensionInterface(Domain *d)
StructuralNonlocalMaterialStatusExtensionInterface()
#define OOFEM_LOG_INFO(...)
#define HUGE_RELATIVE_COMPLIANCE
#define FORMT33(i, j, ij)
#define FORMT66(i, j, ij)
#define MAX_REL_COMPL_TRESHOLD
#define FORMT44(i, j, ij)
#define _IFT_MDM_formulation
#define MAX_NUMBER_OF_MICROPLANES
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ principal_strain
For computing principal strains from engineering strains.
@ MaterialModelMapperInterfaceType
@ NonlocalMaterialStatusExtensionInterfaceType
@ NonlocalMaterialExtensionInterfaceType
double distance(const FloatArray &x, const FloatArray &y)