52 #ifndef MDM_MAPPING_DEBUG 54 #ifdef MDM_USE_MMAClosestIPTransfer 55 MMAClosestIPTransfer MDM :: mapper;
58 #ifdef MDM_USE_MMAShapeFunctProjection 59 MMAShapeFunctProjection MDM :: mapper;
62 #ifdef MDM_USE_MMALeastSquareProjection 63 MMALeastSquareProjection MDM :: mapper;
77 if ( dynamic_cast< Microplane * >(gp) ) {
91 return mode == _3dMat || mode == _PlaneStress || mode == _PlaneStrain;
98 FloatArray reducedStrain, strainPDC, stressPDC, stress;
100 FloatMatrix tempDamageTensor, tempDamageTensorEigenVec;
109 this->
computePDC(tempDamageTensor, tempDamageTensorEigenVals, tempDamageTensorEigenVec);
112 for (
int ii = 1; ii <=
nsd; ii++ ) {
113 if ( tempDamageTensorEigenVals.
at(ii) < 0.0 ) {
114 OOFEM_ERROR(
"negative eigenvalue of damage tensor detected, element %d, ip %d",
178 nonlocalDamageTensor.
at(1, 1) += nonlocalContribution.
at(1, 1) * lir.weight;
179 nonlocalDamageTensor.
at(2, 2) += nonlocalContribution.
at(2, 2) * lir.weight;
180 nonlocalDamageTensor.
at(1, 2) += nonlocalContribution.
at(1, 2) * lir.weight;
182 nonlocalDamageTensor.
at(1, 1) += nonlocalContribution.
at(1, 1) * lir.weight;
183 nonlocalDamageTensor.
at(2, 2) += nonlocalContribution.
at(2, 2) * lir.weight;
184 nonlocalDamageTensor.
at(3, 3) += nonlocalContribution.
at(3, 3) * lir.weight;
185 nonlocalDamageTensor.
at(1, 2) += nonlocalContribution.
at(1, 2) * lir.weight;
186 nonlocalDamageTensor.
at(1, 3) += nonlocalContribution.
at(1, 3) * lir.weight;
187 nonlocalDamageTensor.
at(2, 3) += nonlocalContribution.
at(2, 3) * lir.weight;
195 damageTensor = nonlocalDamageTensor;
223 if ( PsiOld > Psi ) {
232 for (
int i = 1; i <= 6; i++ ) {
237 for (
int i = 1; i <= 6; i++ ) {
249 damageTensor.
resize(2, 2);
252 damageTensor.
at(1, 1) = damageVector.
at(1);
253 damageTensor.
at(2, 2) = damageVector.
at(2);
254 damageTensor.
at(1, 2) = damageTensor.
at(2, 1) = damageVector.
at(6);
255 }
else if (
ndc == 6 ) {
257 damageTensor.
resize(3, 3);
258 damageVector.
times(6.0);
260 damageTensor.
at(1, 1) = damageVector.
at(1);
261 damageTensor.
at(2, 2) = damageVector.
at(2);
262 damageTensor.
at(3, 3) = damageVector.
at(3);
263 damageTensor.
at(2, 3) = damageTensor.
at(3, 2) = damageVector.
at(4);
264 damageTensor.
at(3, 1) = damageTensor.
at(1, 3) = damageVector.
at(5);
265 damageTensor.
at(1, 2) = damageTensor.
at(2, 1) = damageVector.
at(6);
273 #define LARGE_EXPONENT 50.0 274 #define HUGE_RELATIVE_COMPLIANCE 1.e20 279 double en, em, el, Ep, Efp, ParEpp;
280 double Enorm = 0.0, sv = 0.0, answer = 0.0;
297 for (
int i = 1; i <=
nsd; i++ ) {
299 sv += prevStress.
at( mask.
at(i) );
304 ParEpp = Ep / ( 1. -
ParMd );
307 en /= ( 1. -
ParMd * sv / ( fmicroplane ) );
320 Enorm = sqrt(en * en + em * em + el * el);
329 if ( Enorm <= ParEpp ) {
332 double aux = ( Enorm - ParEpp ) / Efp;
334 answer = sqrt( ( Enorm / ParEpp ) * exp(aux) );
360 help.Jacobi(& tempDamageTensorEigenVals, & tempDamageTensorEigenVec, & nrot);
362 help.
jaco_(tempDamageTensorEigenVals, tempDamageTensorEigenVec, 10);
367 #define N(p, q) t.at(q, p) 368 #define E(p) fullStrain.at(p) 380 answer.
at(1) =
N(1, 1) * (
N(1, 1) *
E(1) +
N(1, 2) *
E(6) +
N(1, 3) *
E(5) )
381 +
N(1, 2) * (
N(1, 2) *
E(2) +
N(1, 3) *
E(4) )
382 +
N(1, 3) *
N(1, 3) *
E(3);
383 answer.
at(2) =
N(2, 1) * (
N(2, 1) *
E(1) +
N(2, 2) *
E(6) +
N(2, 3) *
E(5) )
384 +
N(2, 2) * (
N(2, 2) *
E(2) +
N(2, 3) *
E(4) )
385 +
N(2, 3) *
N(2, 3) *
E(3);
386 answer.
at(3) =
N(3, 1) * (
N(3, 1) *
E(1) +
N(3, 2) *
E(6) +
N(3, 3) *
E(5) )
387 +
N(3, 2) * (
N(3, 2) *
E(2) +
N(3, 3) *
E(4) )
388 +
N(3, 3) *
N(3, 3) *
E(3);
389 answer.
at(4) =
N(2, 1) * (
N(3, 1) *
E(1) +
N(3, 2) *
E(6) / 2 +
N(3, 3) *
E(5) / 2 )
390 +
N(2, 2) * (
N(3, 1) *
E(6) / 2 +
N(3, 2) *
E(2) +
N(3, 3) *
E(4) / 2 )
391 +
N(2, 3) * (
N(3, 1) *
E(5) / 2 +
N(3, 2) *
E(4) / 2 +
N(3, 3) *
E(3) );
393 answer.
at(5) =
N(1, 1) * (
N(3, 1) *
E(1) +
N(3, 2) *
E(6) / 2 +
N(3, 3) *
E(5) / 2 )
394 +
N(1, 2) * (
N(3, 1) *
E(6) / 2 +
N(3, 2) *
E(2) +
N(3, 3) *
E(4) / 2 )
395 +
N(1, 3) * (
N(3, 1) *
E(5) / 2 +
N(3, 2) *
E(4) / 2 +
N(3, 3) *
E(3) );
397 answer.
at(6) =
N(1, 1) * (
N(2, 1) *
E(1) +
N(2, 2) *
E(6) / 2 +
N(2, 3) *
E(5) / 2 )
398 +
N(1, 2) * (
N(2, 1) *
E(6) / 2 +
N(2, 2) *
E(2) +
N(2, 3) *
E(4) / 2 )
399 +
N(1, 3) * (
N(2, 1) *
E(5) / 2 +
N(2, 2) *
E(4) / 2 +
N(2, 3) *
E(3) );
405 answer.
at(1) =
N(1, 1) * (
N(1, 1) *
E(1) +
N(1, 2) *
E(3) )
406 +
N(1, 2) *
N(1, 2) *
E(2);
407 answer.
at(2) =
N(2, 1) * (
N(2, 1) *
E(1) +
N(2, 2) *
E(3) )
408 +
N(2, 2) *
N(2, 2) *
E(2);
409 answer.
at(3) =
N(1, 1) * (
N(2, 1) *
E(1) +
N(2, 2) *
E(3) / 2 )
410 +
N(1, 2) * (
N(2, 1) *
E(3) / 2 +
N(2, 2) *
E(2) );
419 double psi1 = tempDamageTensorEigenVals.
at(1);
420 double psi2 = tempDamageTensorEigenVals.
at(2);
421 double psi3 = tempDamageTensorEigenVals.
at(3);
424 strainPDC.
at(1) /= psi1;
425 strainPDC.
at(2) /= psi2;
426 strainPDC.
at(3) /= psi3;
427 strainPDC.
at(4) /= sqrt(psi2 * psi3);
428 strainPDC.
at(5) /= sqrt(psi1 * psi3);
429 strainPDC.
at(6) /= sqrt(psi1 * psi2);
431 strainPDC.
at(1) *= psi1;
432 strainPDC.
at(2) *= psi2;
433 strainPDC.
at(3) *= psi3;
434 strainPDC.
at(4) *= sqrt(psi2 * psi3);
435 strainPDC.
at(5) *= sqrt(psi1 * psi3);
436 strainPDC.
at(6) *= sqrt(psi1 * psi2);
442 double psi1 = tempDamageTensorEigenVals.
at(1);
443 double psi2 = tempDamageTensorEigenVals.
at(2);
445 strainPDC.
at(1) /= psi1;
446 strainPDC.
at(2) /= psi2;
447 strainPDC.
at(3) /= sqrt(psi1 * psi2);
449 strainPDC.
at(1) *= psi1;
450 strainPDC.
at(2) *= psi2;
451 strainPDC.
at(3) *= sqrt(psi1 * psi2);
480 #define Nt(p, q) t.at(p, q) 481 #define S(p) stressPDC.at(p) 490 fullAnswer.
at(1) =
Nt(1, 1) * (
Nt(1, 1) *
S(1) + 2 *
Nt(1, 2) *
S(6) + 2 *
Nt(1, 3) *
S(5) )
491 +
Nt(1, 2) * (
Nt(1, 2) *
S(2) + 2 *
Nt(1, 3) *
S(4) )
492 +
Nt(1, 3) *
Nt(1, 3) *
S(3);
493 fullAnswer.
at(2) =
Nt(2, 1) * (
Nt(2, 1) *
S(1) + 2 *
Nt(2, 2) *
S(6) + 2 *
Nt(2, 3) *
S(5) )
494 +
Nt(2, 2) * (
Nt(2, 2) *
S(2) + 2 *
Nt(2, 3) *
S(4) )
495 +
Nt(2, 3) *
Nt(2, 3) *
S(3);
496 fullAnswer.
at(3) =
Nt(3, 1) * (
Nt(3, 1) *
S(1) + 2 *
Nt(3, 2) *
S(6) + 2 *
Nt(3, 3) *
S(5) )
497 +
Nt(3, 2) * (
Nt(3, 2) *
S(2) + 2 *
Nt(3, 3) *
S(4) )
498 +
Nt(3, 3) *
Nt(3, 3) *
S(3);
499 fullAnswer.
at(4) =
Nt(2, 1) * (
Nt(3, 1) *
S(1) +
Nt(3, 2) *
S(6) +
Nt(3, 3) *
S(5) )
500 +
Nt(2, 2) * (
Nt(3, 1) *
S(6) +
Nt(3, 2) *
S(2) +
Nt(3, 3) *
S(4) )
501 +
Nt(2, 3) * (
Nt(3, 1) *
S(5) +
Nt(3, 2) *
S(4) +
Nt(3, 3) *
S(3) );
502 fullAnswer.
at(5) =
Nt(1, 1) * (
Nt(3, 1) *
S(1) +
Nt(3, 2) *
S(6) +
Nt(3, 3) *
S(5) )
503 +
Nt(1, 2) * (
Nt(3, 1) *
S(6) +
Nt(3, 2) *
S(2) +
Nt(3, 3) *
S(4) )
504 +
Nt(1, 3) * (
Nt(3, 1) *
S(5) +
Nt(3, 2) *
S(4) +
Nt(3, 3) *
S(3) );
505 fullAnswer.
at(6) =
Nt(1, 1) * (
Nt(2, 1) *
S(1) +
Nt(2, 2) *
S(6) +
Nt(2, 3) *
S(5) )
506 +
Nt(1, 2) * (
Nt(2, 1) *
S(6) +
Nt(2, 2) *
S(2) +
Nt(2, 3) *
S(4) )
507 +
Nt(1, 3) * (
Nt(2, 1) *
S(5) +
Nt(2, 2) *
S(4) +
Nt(2, 3) *
S(3) );
513 answer.
at(1) =
Nt(1, 1) * (
Nt(1, 1) *
S(1) +
Nt(1, 2) * 2. *
S(3) )
514 +
Nt(1, 2) *
Nt(1, 2) *
S(2);
515 answer.
at(2) =
Nt(2, 1) * (
Nt(2, 1) *
S(1) +
Nt(2, 2) * 2. *
S(3) )
516 +
Nt(2, 2) *
Nt(2, 2) *
S(2);
517 answer.
at(3) =
Nt(1, 1) * (
Nt(2, 1) *
S(1) +
Nt(2, 2) *
S(3) )
518 +
Nt(1, 2) * (
Nt(2, 1) *
S(3) +
Nt(2, 2) *
S(2) );
536 if ( ( mode == TangentStiffness ) || ( mode == SecantStiffness ) ) {
546 #define MAX_REL_COMPL_TRESHOLD 1.e6 554 double psi1 = 0.0, psi2 = 0.0, psi3 = 0.0;
575 d.
at(1, 1) /= ( psi1 * psi1 );
576 d.
at(1, 2) /= ( psi1 * psi2 );
577 d.
at(1, 3) /= ( psi1 * psi3 );
578 d.
at(2, 1) /= ( psi2 * psi1 );
579 d.
at(2, 2) /= ( psi2 * psi2 );
580 d.
at(2, 3) /= ( psi2 * psi3 );
581 d.
at(3, 1) /= ( psi3 * psi1 );
582 d.
at(3, 2) /= ( psi3 * psi2 );
583 d.
at(3, 3) /= ( psi3 * psi3 );
584 d.
at(4, 4) /= ( psi2 * psi3 );
585 d.
at(5, 5) /= ( psi1 * psi3 );
586 d.
at(6, 6) /= ( psi1 * psi2 );
588 d.
at(1, 1) /= ( psi1 * psi1 );
589 d.
at(1, 2) /= ( psi1 * psi2 );
590 d.
at(1, 3) /= ( psi1 * psi3 );
591 d.
at(2, 1) /= ( psi2 * psi1 );
592 d.
at(2, 2) /= ( psi2 * psi2 );
593 d.
at(2, 3) /= ( psi2 * psi3 );
594 d.
at(3, 1) /= ( psi3 * psi1 );
595 d.
at(3, 2) /= ( psi3 * psi2 );
596 d.
at(3, 3) /= ( psi3 * psi3 );
597 d.
at(4, 4) /= ( psi1 * psi2 );
605 double psi1 = 0.0, psi2 = 0.0;
622 d.
at(1, 1) /= psi1 * psi1;
623 d.
at(1, 2) /= psi1 * psi2;
624 d.
at(2, 1) /= psi2 * psi1;
625 d.
at(2, 2) /= psi2 * psi2;
626 d.
at(3, 3) /= psi1 * psi2;
671 if ( type == IST_DamageTensor ) {
685 answer.
at(1) = 1. - d.
at(1, 1);
686 answer.
at(2) = 1. - d.
at(2, 2);
687 answer.
at(3) = d.
at(1, 2);
693 answer.
at(1) = 1. - d.
at(1, 1);
694 answer.
at(2) = 1. - d.
at(2, 2);
695 answer.
at(3) = 1. - d.
at(3, 3);
696 answer.
at(4) = d.
at(2, 3);
697 answer.
at(5) = d.
at(1, 3);
698 answer.
at(6) = d.
at(1, 2);
702 }
else if ( type == IST_DamageTensorTemp ) {
713 answer.
at(1) = 1. - d.
at(1, 1);
714 answer.
at(2) = 1. - d.
at(2, 2);
715 answer.
at(3) = d.
at(1, 2);
721 answer.
at(1) = 1. - d.
at(1, 1);
722 answer.
at(2) = 1. - d.
at(2, 2);
723 answer.
at(3) = 1. - d.
at(3, 3);
724 answer.
at(4) = d.
at(2, 3);
725 answer.
at(5) = d.
at(1, 3);
726 answer.
at(6) = d.
at(1, 2);
730 }
else if ( type == IST_PrincipalDamageTensor ) {
736 for (
int i = 1; i <=
nsd; i++ ) {
737 answer.
at(i) = 1. - 1. / d.
at(i) / d.
at(i);
740 for (
int i = 1; i <=
nsd; i++ ) {
741 answer.
at(i) = 1. - d.
at(i) * d.
at(i);
746 }
else if ( type == IST_PrincipalDamageTempTensor ) {
752 for (
int i = 1; i <=
nsd; i++ ) {
753 answer.
at(i) = 1. - 1. / d.
at(i) / d.
at(i);
756 for (
int i = 1; i <=
nsd; i++ ) {
757 answer.
at(i) = 1. - d.
at(i) * d.
at(i);
762 }
else if ( type == IST_MicroplaneDamageValues ) {
842 #ifdef MDM_MAPPING_DEBUG 850 if ( result !=
IRRT_OK )
return result;
854 if ( result !=
IRRT_OK )
return result;
859 if ( result !=
IRRT_OK )
return result;
861 #ifdef MDM_MAPPING_DEBUG 863 if ( result !=
IRRT_OK )
return result;
865 if ( result !=
IRRT_OK )
return result;
867 result = mapper.initializeFrom(ir);
868 if ( result !=
IRRT_OK )
return result;
871 if ( result !=
IRRT_OK )
return result;
882 #ifdef MDM_MAPPING_DEBUG 887 mapper.giveInputRecord(input);
935 #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) 937 #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) 939 #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) 953 answer.
at(1, 1) = 1.0;
989 OOFEM_ERROR(
"Stress transformation matrix format not implemented");
1007 double gammaf = ( EModulus * this->
Gf ) / ( this->
R * this->
Ft * this->
Ft );
1008 double gamma = gammaf / ( 1.47 - 0.0014 * gammaf );
1009 double f = this->Ft / ( 1.56 + 0.006 * gamma );
1010 Efp = this->
mdm_Efp = ( gamma * f ) / EModulus;
1012 Ep = this->
mdm_Ep = f / EModulus;
1026 double max = principalStrain.
at(1);
1027 if ( principalStrain.
at(2) >
max ) {
1031 if ( principalStrain.
at(3) >
max ) {
1036 dir.
at(1) = dirs.
at(1, indx);
1037 dir.
at(2) = dirs.
at(2, indx);
1038 dir.
at(3) = dirs.
at(3, indx);
1044 Efp = (
Gf / ( h * E * Ep ) + 1.2 * Ep ) / 1.75 - Ep;
1046 Efp = (
Gf / ( h * E * Ep ) + ( 2.13 +
ParMd ) * Ep ) / ( 2.73 -
ParMd ) - Ep;
1112 OOFEM_ERROR(
"required number of microplanes too big");
1120 int ij [ 6 ] [ 2 ] = { { 1, 1 }, { 2, 2 }, { 3, 3 }, { 2, 3 }, { 3, 1 }, { 1, 2 } };
1138 for ( i = 0; i < 6; i++ ) {
1139 ii = ij [ i ] [ 0 ];
1140 jj = ij [ i ] [ 1 ];
1142 N [ iplane ] [ i ] = n.at(ii) * n.at(jj);
1143 M [ iplane ] [ i ] = 0.5 * ( m.at(ii) * n.at(jj) + m.at(jj) * n.at(ii) );
1144 L [ iplane ] [ i ] = 0.5 * ( l.
at(ii) * n.at(jj) + l.
at(jj) * n.at(ii) );
1179 if ( ( dist >= 0. ) && ( dist <= this->
R ) ) {
1180 double help = ( 1. - dist * dist / ( R *
R ) );
1196 toMap.
at(1) = ( int ) IST_MicroplaneDamageValues;
1212 #ifndef MDM_MAPPING_DEBUG 1214 result = mapper.mapVariable(intVal, gp, IST_MicroplaneDamageValues, tStep);
1232 for (
int i = 1; i <= intVal.
giveSize(); i++ ) {
1233 if ( intVal.
at(i) < 1.0 ) {
1238 for (
int i = 1; i <= intVal.
giveSize(); i++ ) {
1239 if ( intVal.
at(i) < 0.0 ) {
1243 if ( intVal.
at(i) > 1.0 ) {
1257 toMap.
at(1) = ( int ) IST_StrainTensor;
1258 toMap.
at(2) = ( int ) IST_StressTensor;
1295 #ifndef MDM_MAPPING_DEBUG 1296 this->mapper.finish(tStep);
1367 }
else if (
nsd == 3 ) {
1376 cost *= ( 1.0 + size / 15.0 );
1386 MDMStatus :: MDMStatus(
int n,
int nsd,
int nmplanes,
Domain *d,
GaussPoint *g) :
StructuralMaterialStatus(n, d, g),
StructuralNonlocalMaterialStatusExtensionInterface(), Psi(nmplanes), PsiTemp(nmplanes), DamageTensor(nsd, nsd), DamageTensorTemp(nsd, nsd), tempDamageTensorEigenValues(nsd), damageTensorEigenValues(nsd), tempDamageTensorEigenVectors(nsd, nsd), damageTensorEigenVectors(nsd, nsd)
1388 for (
int i = 1; i <= nsd; i++ ) {
1482 fprintf(file,
"status { ");
1484 fprintf(file,
" compliance on microplanes: ");
1485 for (
auto &val :
Psi ) {
1486 fprintf( file,
" %.4e", val );
1489 fprintf(file,
", complianceTensorEigenVectors ");
1501 fprintf(file,
", complianceTensorEigenValues ");
1503 fprintf( file,
" %.4e", val );
1506 fprintf(file,
"}\n");
virtual void finish(TimeStep *tStep)
Finishes the mapping for given time step.
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
Abstract base class for all nonlocal structural materials.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
int giveNumberOfColumns() const
Returns number of columns of receiver.
int numberOfMicroplanes
Number of microplanes.
int ndc
Number of damage components.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
double mdm_Ep
Parameter controlling the elastic limit.
double computeShearMStrainComponent(Microplane *mplane, const FloatArray ¯oStrain)
Computes the shear component (in m direction) of macro strain on given microplane.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
double L[MAX_NUMBER_OF_MICROPLANES][6]
Shear projection tensors (l direction) for all microplanes.
void updateDomainBeforeNonlocAverage(TimeStep *tStep)
Updates data in all integration points before nonlocal average takes place.
virtual int hasMaterialModeCapability(MaterialMode mode)
Tests if material supports material mode.
#define MAX_NUMBER_OF_MICROPLANES
void endIPNonlocalAverage(GaussPoint *gp)
Notifies the receiver, that the nonlocal averaging has been finished for given ip.
void init(Domain *dold, IntArray &varTypes, GaussPoint *gp, Set &sourceElemSet, TimeStep *tStep, bool iCohesiveZoneGP=false)
Initializes the receiver state before mapping.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
virtual void givePlaneStressStiffMtrx(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Method for computing plane stress stiffness matrix of receiver.
For computing principal strains from engineering strains.
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
virtual int mapVariable(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Maps and update the unknown of given type from old mesh oldd to new mesh to which gp belongs to...
double E
Young's modulus.
#define FORMT33(i, j, ij)
void computeLocalDamageTensor(FloatMatrix &tempDamageTensor, const FloatArray &totalStrain, GaussPoint *gp, TimeStep *tStep)
double M[MAX_NUMBER_OF_MICROPLANES][6]
Shear projection tensors (m direction) for all microplanes.
virtual void updateBeforeNonlocAverage(const FloatArray &strainVector, GaussPoint *gp, TimeStep *tStep)
Declares the service updating local variables in given integration points, which take part in nonloca...
virtual double predictRelativeComputationalCost(GaussPoint *gp)
Returns the weight representing relative computational cost of receiver The reference material model ...
void computeEffectiveStress(FloatArray &stressPDC, const FloatArray &strainPDC, GaussPoint *gp, TimeStep *tStep)
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
contextIOResultType storeYourself(DataStream &stream) const
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
double Gf
Fracture energy (necessary to determine Ep and Efp if not given).
FloatMatrix damageTensorEigenVectors
void computeDamageTensor(FloatMatrix &tempDamageTensor, const FloatArray &totalStrain, GaussPoint *gp, TimeStep *tStep)
double & at(int i)
Coefficient access function.
int max(int i, int j)
Returns bigger value form two given decimals.
void transformStrainToPDC(FloatArray &answer, FloatArray &strain, FloatMatrix &t, GaussPoint *gp)
The class representing the general material model adaptive mapping interface.
This class implements a structural material status information.
double microplaneNormals[MAX_NUMBER_OF_MICROPLANES][3]
Normals of microplanes.
Microplane * giveMicroplane(int i, GaussPoint *masterGp)
Returns i-th microplane belonging to master-macro-integration point. )-based indexing.
double computeDamageOnPlane(GaussPoint *gp, Microplane *mplane, const FloatArray &strain)
const FloatMatrix & giveTempDamageTensorEigenVec()
void transformStiffnessfromPDC(FloatMatrix &de, const FloatMatrix &t)
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
#define FORMT44(i, j, ij)
void buildNonlocalPointTable(GaussPoint *gp)
Builds list of integration points which take part in nonlocal average in given integration point...
virtual int estimatePackSize(DataStream &buff, GaussPoint *ip)
Estimates the necessary pack size to hold all packed data of receiver.
Element * giveElement()
Returns corresponding element to receiver.
void setTempDamageTensor(FloatMatrix src)
void setMicroplaneTempDamageValues(FloatArray src)
std::vector< localIntegrationRecord > * giveIntegrationDomainList()
Returns integration list of receiver.
int giveNumberOfElements() const
Returns number of elements in domain.
virtual double computeWeightFunction(const FloatArray &src, const FloatArray &coord)
Evaluates the basic nonlocal weight function for two points with given coordinates.
int givePackSize(DataStream &buff) const
virtual void giveThermalDilatationVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Returns a vector of coefficients of thermal dilatation in direction of each material principal (local...
Material status class MDMStatus associated to MDM matarial.
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode)
Method for subtracting from reduced space strain vector its stress-independent parts (caused by tempe...
MaterialMode
Type representing material mode of integration point.
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
static void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir, const FloatArray &s, stressStrainPrincMode mode)
Computes principal values and directions of stress or strain vector.
Class implementing an array of integers.
int & at(int i)
Coefficient access function.
MatResponseMode
Describes the character of characteristic material matrix.
void rotateTensor4(FloatMatrix &Dlocal, const FloatMatrix &t)
virtual int MMI_update(GaussPoint *gp, TimeStep *tStep, FloatArray *estrain=NULL)
Updates the required internal state variables from previously mapped values.
void setElementList(IntArray newElements)
Sets list of elements within set.
void giveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
virtual void initializeData(int numberOfMicroplanes)
Initializes internal data (integration weights, microplane normals and computes projection tensors)...
void setLocalDamageTensorForAverage(FloatMatrix src)
contextIOResultType storeYourself(DataStream &stream) const
FloatMatrix tempDamageTensorEigenVectors
FloatArray tempDamageTensorEigenValues
Principal damage directions.
static void giveFullSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the reduced unsymmetric Voigt vector (2nd order tensor) to full form.
virtual int mapVariable(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Maps and update the unknown of given type from old mesh oldd to new mesh to which gp belongs to...
const FloatArray & giveDamageTensorEigenVals()
IRResultType initializeFrom(InputRecord *ir)
virtual int MMI_map(GaussPoint *gp, Domain *oldd, TimeStep *tStep)
Maps the required internal state variables from old mesh oldd to given ip.
StructuralMaterial * giveLinearElasticMaterial()
Returns reference to undamaged (bulk) material.
StructuralMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
double distance(const FloatArray &x) const
Computes the distance between position represented by receiver and position given as parameter...
double giveMicroplaneDamage(int m)
bool jaco_(FloatArray &eval, FloatMatrix &v, int nf)
Computes eigenvalues and eigenvectors of receiver (must be symmetric) The receiver is preserved...
virtual double give(int aProperty, GaussPoint *gp)
Returns the value of material property 'aProperty'.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void giveStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the stiffness matrix for giveRealStressVector of receiver in given integration point...
virtual void updateYourself(TimeStep *tStep)
Updates internal state of receiver after finishing time step.
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
#define FORMT66(i, j, ij)
void applyDamageToStiffness(FloatMatrix &d, GaussPoint *gp)
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
static void giveReducedSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full unsymmetric Voigt vector (2nd order tensor) to reduced form.
#define OOFEM_LOG_INFO(...)
Element * giveElement(int n)
Service for accessing particular domain fe element.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record of receiver.
FloatMatrix DamageTensor
Macroscopic damage tensor.
This class implements an isotropic linear elastic material in a finite element problem.
const FloatMatrix & giveDamageTensor()
virtual void initializeData(int numberOfMicroplanes)
Initializes internal data (integration weights, microplane normals and computes projection tensors)...
int giveNumber()
Returns number of receiver.
double mdm_Efp
Prescribed value of ef-ep.
virtual void give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes full 3d material stiffness matrix at given integration point, time, respecting load history ...
Class representing microplane integration point in finite element program.
double R
Interaction radius, related to the nonlocal characteristic length of material.
void times(double f)
Multiplies receiver by factor f.
std::vector< localIntegrationRecord > * giveIPIntegrationList(GaussPoint *gp)
Returns integration list corresponding to given integration point.
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
Set of elements, boundaries, edges and/or nodes.
int nsd
Number of spatial dimensions.
contextIOResultType restoreYourself(DataStream &stream)
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
virtual int packUnknowns(DataStream &buff, TimeStep *tStep, GaussPoint *ip)
Pack all necessary data of integration point (according to element parallel_mode) into given communic...
double at(int i, int j) const
Coefficient access function.
void resize(int n)
Checks size of receiver towards requested bounds.
double computeNormalStrainComponent(Microplane *mplane, const FloatArray ¯oStrain)
Computes the length of normal strain vector on given microplane.
FloatArray Psi
Damage values on individual microplanes.
virtual void finish(TimeStep *tStep)
Finishes the mapping for given time step.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
double Ft
Macroscopic tensile strength (necessary to determine Ep and Efp if not given).
void giveRawMDMParameters(double &Efp, double &Ep, const FloatArray &reducedStrain, GaussPoint *gp)
#define HUGE_RELATIVE_COMPLIANCE
contextIOResultType restoreYourself(DataStream &stream)
const FloatMatrix & giveTempDamageTensor()
Class representing vector of real numbers.
double N[MAX_NUMBER_OF_MICROPLANES][6]
Normal projection tensors for all microplanes.
virtual int MMI_finish(TimeStep *tStep)
Finishes the mapping for given time step.
Implementation of matrix containing floating point numbers.
IRResultType
Type defining the return values of InputRecord reading operations.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
void transformStressFromPDC(FloatArray &answer, const FloatArray &stressPDC, const FloatMatrix &t, GaussPoint *gp)
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
virtual IRResultType initializeFrom(InputRecord *ir)
double microplaneWeights[MAX_NUMBER_OF_MICROPLANES]
Integration weights of microplanes.
#define _IFT_MDM_formulation
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
double tempDillatCoeff
Temperature dilatation coeff.
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
MDMStatus(int n, int nsd, int nmplanes, Domain *d, GaussPoint *g)
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record of receiver.
FloatMatrix DamageTensorTemp
Base class for all nonlocal structural material statuses.
void followedBy(const IntArray &b, int allocChunk=0)
Appends array b at the end of receiver.
virtual void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Computes the real stress vector for given total strain and integration point.
void zero()
Zeroes all coefficients of receiver.
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
Returns the size of element in the given direction, in some cases adjusted (e.g.
MDMFormulatrionType formulation
const FloatArray & giveTempDamageTensorEigenVals()
virtual void givePlaneStrainStiffMtrx(FloatMatrix &answer, MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep)
Method for computing plane strain stiffness matrix of receiver.
void times(double s)
Multiplies receiver with scalar.
void setTempDamageTensorEigenVals(FloatArray src)
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
static void giveInvertedVoigtVectorMask(IntArray &answer, MaterialMode mmode)
Gives the inverted version of giveVoigtVectorMask.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver's output to given stream.
#define MAX_REL_COMPL_TRESHOLD
virtual IRResultType initializeFrom(InputRecord *ir)
void beProductTOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
void zero()
Zeroes all coefficient of receiver.
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
Domain * giveDomain() const
InterfaceType
Enumerative type, used to identify interface type.
virtual int unpackAndUpdateUnknowns(DataStream &buff, TimeStep *tStep, GaussPoint *ip)
Unpack and updates all necessary data of given integration point (according to element parallel_mode)...
double giveIntegrationScale()
Returns associated integration scale.
static MMAShapeFunctProjection mapperSFT
Mapper used to map internal variables in adaptivity.
int min(int i, int j)
Returns smaller value from two given decimals.
void computePDC(FloatMatrix &tempDamageTensor, FloatArray &tempDamageTensorEigenVals, FloatMatrix &tempDamageTensorEigenVec)
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
void setTempDamageTensorEigenVec(FloatMatrix src)
Set * sourceElemSet
cached source element set used to map internal variables (adaptivity), created on demand ...
REGISTER_Material(DummyMaterial)
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
FloatArray damageTensorEigenValues
const FloatArray & giveMicroplaneDamageValues()
const FloatMatrix * giveLocalDamageTensorForAveragePtr()
virtual void give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes full 3d material stiffness matrix at given integration point, time, respecting load history ...
int giveSize() const
Returns the size of receiver.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
void applyDamageTranformation(FloatArray &strainPDC, const FloatArray &tempDamageTensorEigenVals)
the oofem namespace is to define a context or scope in which all oofem names are defined.
bool isNotEmpty() const
Returns true if receiver is not empty.
virtual void finish(TimeStep *tStep)
Finishes the mapping for given time step.
void setMicroplaneTempDamage(int m, double val)
void beInverseOf(const FloatMatrix &src)
Modifies receiver to become inverse of given parameter.
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
int nonlocal
Flag indicating local or nonlocal mode.
int giveNumberOfRows() const
Returns number of rows of receiver.
void symmetrized()
Initializes the lower half of the receiver according to the upper half.
const FloatMatrix & giveLocalDamageTensorForAverage()
double computeShearLStrainComponent(Microplane *mplane, const FloatArray ¯oStrain)
Computes the shear component (in l direction) of macro strain on given microplane.
Class representing integration point in finite element program.
#define OOFEM_WARNING(...)
static MMAClosestIPTransfer mapper2
Mapper used to map stresses in adaptivity.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
Class representing solution step.
void formTransformationMatrix(FloatMatrix &answer, const FloatMatrix &t, int n)
static MMALeastSquareProjection mapperLST
virtual Material * giveMaterial()
void giveInputRecord(DynamicInputRecord &input)
Stores receiver in an input record.
void resize(int s)
Resizes receiver towards requested size.