45#define rcm_STRESSRELERROR 1.e-5
46#define rcm_RESIDUALSTIFFFACTOR 1.e-3
54RCM2Material :: hasMaterialModeCapability(MaterialMode mode)
const
59 return mode == _3dMat || mode == _PlaneStress ||
60 mode == _PlaneStrain || mode == _1dMat ||
61 mode == _PlateLayer || mode == _2dBeamLayer;
83RCM2Material :: giveMaterialStiffnessMatrix(
FloatMatrix &answer,
113 FloatArray princStress, reducedStressVector, reducedAnswer;
114 FloatArray reducedTotalStrainVector, principalStrain, strainVector;
126 StructuralMaterial :: giveFullSymVectorForm( strainVector, reducedTotalStrainVector, gp->giveMaterialMode() );
140 StructuralMaterial :: giveReducedSymVectorForm( reducedStressVector, answer, gp->giveMaterialMode() );
144 StructuralMaterial :: giveReducedSymVectorForm( reducedAnswer, answer, gp->giveMaterialMode() );
145 answer = reducedAnswer;
164 FloatArray strainIncrement, crackStrainIterativeIncrement;
169 IntArray activatedCracks, crackMapping;
192 if ( principalStrain.containsOnlyZeroes() ) {
197 tempCrackDirs, crackDirs);
206 strainIncrement.
beDifferenceOf(principalStrain, prevPrincipalStrain);
210 gp, tStep, tempCrackDirs);
222 for (
int iter = 1; iter <= 20; iter++ ) {
233 decr.
assemble(fullDecr, crackMapping, crackMapping);
239 dSigma.
assemble(fullDSigma, crackMapping);
243 decr.
solveForRhs(dSigma, crackStrainIterativeIncrement);
244 for (
int i = 1; i <= 3; i++ ) {
245 if ( ( ind = crackMapping.
at(i) ) ) {
246 crackStrainVector.
at(i) += crackStrainIterativeIncrement.
at(ind);
258 for (
int i = 1; i <= 3; i++ ) {
259 if ( crackMapping.
at(i) ) {
280 sigmaEl, sigmaCr, principalStrain);
291 fullDSigma = sigmaEl;
298 dSigma.
assemble(fullDSigma, crackMapping);
313 for (
int i = 1; i <= dSigma.
giveSize(); i++ ) {
314 if ( fabs( dSigma.
at(i) ) > maxErr ) {
315 maxErr = fabs( dSigma.
at(i) );
319 if ( maxErr < rcm_STRESSRELERROR * this->
give(
pscm_Ft, gp) ) {
345 double initStress, Le = 0.0;
346 int upd, activationFlag = 0;
354 localStress = princStressVector;
358 for (
int i = 1; i <= 3; i++ ) {
362 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
363 if ( crackMap.
at(i) == 0 && indx.
contains(i) ) {
377 for (
int j = 1; j <= 3; j++ ) {
378 crackPlaneNormal.
at(j) = tempCrackDirs.
at(j, i);
386 if ( localStress.
at(i) > initStress ) {
387 crackStressVector.at(i) = initStress;
397 if ( activationFlag ) {
406RCM2Material :: updateStatusForNewCrack(
GaussPoint *gp,
int i,
double Le)
const
415 OOFEM_ERROR(
"Element %d returned zero char length", gp->giveElement()->giveNumber() );
445 double minCrackStrainsForFullyOpenCrack;
462 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
463 for (
int i = 1; i <= 3; i++ ) {
464 if ( crackMap.
at(i) != 0 && indx.
contains(i) ) {
471 if ( ( crackStrain.at(i) >= minCrackStrainsForFullyOpenCrack ) &&
483 }
else if ( crackStrain.at(i) <= 0. ) {
510 for (
int i = 1; i <= 3; i++ ) {
511 if ( crackMap.at(i) ) {
512 if ( crackStrainVector.at(i) < 0. ) {
514 crackStrainVector.at(i) = 0.;
532RCM2Material :: giveNormalElasticStiffnessMatrix(
FloatMatrix &answer,
533 bool reduce, MatResponseMode rMode,
552 for (
int i = 1; i <= 3; i++ ) {
553 for (
int j = 1; j <= 3; j++ ) {
554 fullAnswer.
at(i, j) = de.
at(i, j);
568 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
569 for (
int i = 1; i <= 3; i++ ) {
575 answer.resize(sd, sd);
579 StructuralMaterial :: giveInvertedVoigtVectorMask( mask, gp->giveMaterialMode() );
580 for (
int i = 1; i <= sd; i++ ) {
582 for (
int j = 1; j <= sd; j++ ) {
584 if ( iidx && jidx ) {
585 answer.at(i, j) = fullAnswer.
at(iidx, jidx);
594RCM2Material :: giveEffectiveMaterialStiffnessMatrix(
FloatMatrix &answer,
605 int indi, indj, ii, jj;
606 double G, princStressDis, princStrainDis;
607 FloatMatrix de, invDe, compliance, dcr, d, df, t, tempCrackDirs;
608 FloatArray principalStressVector, principalStrainVector;
611 if ( ( rMode == ElasticStiffness ) || ( numberOfActiveCracks == 0 ) ) {
623 StructuralMaterial :: giveVoigtSymVectorMask( mask, gp->giveMaterialMode() );
629 for (
int i = 1; i <= 3; i++ ) {
631 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
633 for (
int j = 1; j <= 3; j++ ) {
635 compliance.
at(indi, indj) += invDe.
at(i, j);
640 if ( dcr.
at(i, i) <= 1.e-8 ) {
643 compliance.
at(indi, indi) += 1. / dcr.
at(i, i);
656 StructuralMaterial :: giveVoigtSymVectorMask( indx, gp->giveMaterialMode() );
657 for (
int i = 4; i <= 6; i++ ) {
662 }
else if ( i == 5 ) {
670 princStressDis = principalStressVector.
at(ii) -
671 principalStressVector.
at(jj);
672 princStrainDis = principalStrainVector.
at(ii) -
673 principalStrainVector.
at(jj);
675 compliance.
at(indi, indi) = 1. / G;
676 }
else if ( fabs(princStressDis) < 1.e-8 ) {
679 compliance.
at(indi, indi) = 2 * princStrainDis / princStressDis;
690 StructuralMaterial :: giveVoigtSymVectorMask( mask, gp->giveMaterialMode() );
701 StructuralMaterial :: giveReducedSymMatrixForm( answer, df, gp->giveMaterialMode() );
707 MatResponseMode rMode,
732 if ( numberOfActiveCracks == 0 ) {
741 for (
int i = 1; i <= 3; i++ ) {
742 if ( crackMap.
at(i) ) {
765 for (
int i = 1; i <= 3; i++ ) {
767 crackMap.
at(i) = indx++;
768 }
else if ( activatedCracks ) {
769 if ( ( activatedCracks->at(i) != 0 ) ) {
770 crackMap.
at(i) = indx++;
811 if ( aProperty ==
pscm_G ) {
833 if ( type == IST_CrackedFlag ) {
837 }
else if ( type == IST_CrackDirs ) {
840 for (
int i = 1; i <= 3; i++ ) {
841 answer.
at(i) = help.
at(1, i);
842 answer.
at(i + 3) = help.
at(2, i);
843 answer.
at(i + 6) = help.
at(3, i);
847 }
else if ( type == IST_CrackStatuses ) {
850 for (
int i = 1; i <= 3; i++ ) {
851 answer.
at(i) = crackStatus.
at(i);
856 }
else if ( type == IST_CrackWidth ) {
866 answer.
at(1) = width;
870 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
875RCM2Material :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
886RCM2Material :: givePlaneStressStiffMtrx(MatResponseMode mode,
904RCM2Material :: givePlaneStrainStiffMtrx(MatResponseMode mode,
922RCM2Material :: give1dStressStiffMtrx(MatResponseMode mode,
938RCM2Material :: give2dBeamLayerStiffMtrx(MatResponseMode mode,
957RCM2Material :: givePlateLayerStiffMtrx(MatResponseMode mode,
985 for (
int i = 1; i <= 3; i++ ) {
992RCM2MaterialStatus :: isCrackActive(
int i)
const
1010RCM2MaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
1014 StructuralMaterialStatus :: printOutputAt(file, tStep);
1015 fprintf(file,
"status { ");
1017 for (
int i = 1; i <= 3; i++ ) {
1026 strcpy(s,
"SOFTENING");
1029 strcpy(s,
"RELOADING");
1032 strcpy(s,
"UNLOADING");
1035 strcpy(s,
"UNKNOWN");
1039 fprintf( file,
"crack %d {status %s, normal to crackplane { %f %f %f }} ",
1044 fprintf(file,
"}\n");
1048RCM2MaterialStatus :: giveNumberOfActiveCracks() const
1055 for (
int i = 1; i <= 3; i++ ) {
1066RCM2MaterialStatus :: giveNumberOfTempActiveCracks() const
1073 for (
int i = 1; i <= 3; i++ ) {
1085RCM2MaterialStatus :: initTempStatus()
1091 StructuralMaterialStatus :: initTempStatus();
1101 for (
int i = 1; i <= 3; i++ ) {
1116 StructuralMaterialStatus :: updateYourself(tStep);
1132 StructuralMaterialStatus :: saveContext(stream, mode);
1184 StructuralMaterialStatus :: restoreContext(stream, mode);
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
void assemble(const FloatArray &fe, const IntArray &loc)
Index giveSize() const
Returns the size of receiver.
void resizeWithValues(Index s, std::size_t allocChunk=0)
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
void zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void subtract(const FloatArray &src)
void rotatedWith(const FloatMatrix &r, char mode='n')
void add(const FloatMatrix &a)
void resize(Index rows, Index cols)
void zero()
Zeroes all coefficient of receiver.
bool beInverseOf(const FloatMatrix &src)
void assemble(const FloatMatrix &src, const IntArray &loc)
double at(std::size_t i, std::size_t j) const
bool solveForRhs(const FloatArray &b, FloatArray &answer, bool transpose=false)
Element * giveElement()
Returns corresponding element to receiver.
bool contains(int value) const
int findFirstIndexOf(int value) const
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Dictionary propertyDictionary
virtual void initTempStatus(GaussPoint *gp) const
virtual int giveNumberOfTempActiveCracks() const
const IntArray & giveCrackMap() const
const IntArray & giveTempCrackStatus()
IntArray crackStatuses
One value from (pscm_NONE, pscm_OPEN, pscm_SOFTENING, pscm_RELOADING, pscm_UNLOADING,...
double giveCrackStrain(int icrack) const
virtual int giveNumberOfActiveCracks() const
FloatArray crackStrainVector
Components of crack strain vector.
const FloatArray & getPrincipalStressVector() const
FloatArray principalStress
int giveTempAlreadyCrack() const
const FloatArray & getPrincipalStrainVector() const
const FloatArray & giveCrackStrainVector() const
void setTempCrackStatus(int icrack, int val)
FloatArray oldPrincipalStrain
double giveTempMaxCrackStrain(int icrack)
const FloatMatrix & giveCrackDirs()
FloatMatrix crackDirs
Storing direction of cracks in columwise format.
double giveCharLength(int icrack) const
FloatMatrix tempCrackDirs
void setCharLength(int icrack, double val)
const FloatMatrix & giveTempCrackDirs()
FloatArray maxCrackStrains
Max crack strain reached.
void letCrackStrainVectorBe(FloatArray a)
FloatArray oldCrackStrainVector
void letTempCrackDirsBe(FloatMatrix a)
IntArray tempCrackStatuses
FloatArray oldPrincipalStress
const FloatArray & givePrevPrincStrainVector() const
void letPrincipalStressVectorBe(FloatArray pv)
void letCrackMapBe(IntArray map)
virtual int isCrackActive(int i) const
int giveAlreadyCrack() const
void setTempMaxCrackStrain(int icrack, double val)
FloatArray principalStrain
const IntArray & giveCrackStatus()
FloatArray tempMaxCrackStrains
void letPrincipalStrainVectorBe(FloatArray pv)
virtual void giveEffectiveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) const
virtual double giveNormalCrackingStress(GaussPoint *gp, double eps_cr, int i) const =0
virtual double giveCharacteristicElementLength(GaussPoint *gp, const FloatArray &crackPlaneNormal) const
void giveRealPrincipalStressVector3d(FloatArray &answer, GaussPoint *, FloatArray &, FloatMatrix &, TimeStep *) const
void giveCrackedStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) const
LinearElasticMaterial * linearElasticMaterial
virtual double computeStrength(GaussPoint *gp, double) const =0
RCM2Material(int n, Domain *d)
double give(int aProperty, GaussPoint *gp) const override
virtual void checkIfClosedCracks(GaussPoint *gp, FloatArray &crackStrainVector, IntArray &) const
void updateActiveCrackMap(GaussPoint *gp, const IntArray *activatedCracks=NULL) const
virtual double giveMinCrackStrainsForFullyOpenCrack(GaussPoint *gp, int i) const =0
virtual double giveCrackingModulus(MatResponseMode rMode, GaussPoint *gp, double effStrain, int i) const
LinearElasticMaterial * giveLinearElasticMaterial() const
void giveNormalElasticStiffnessMatrix(FloatMatrix &answer, bool reduce, MatResponseMode, GaussPoint *, TimeStep *tStep, const FloatMatrix &) const
virtual void checkForNewActiveCracks(IntArray &answer, GaussPoint *gp, const FloatArray &, const FloatArray &, FloatArray &, const FloatArray &) const
virtual void updateCrackStatus(GaussPoint *gp, const FloatArray &crackStrain) const
virtual void giveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode, GaussPoint *gp, TimeStep *tStep) const
virtual void updateStatusForNewCrack(GaussPoint *, int, double) const
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 giveFullSymMatrixForm(FloatMatrix &answer, const FloatMatrix &red, MaterialMode matMode)
Converts the full unsymmetric Voigt matrix (4th order tensor) to reduced form.
static FloatMatrixF< 6, 6 > giveStressVectorTranformationMtrx(const FloatMatrixF< 3, 3 > &base, bool transpose=false)
StructuralMaterial(int n, Domain *d)
virtual void giveStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
static void sortPrincDirAndValCloseTo(FloatArray &pVal, FloatMatrix &pDir, const FloatMatrix &toPDir)
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
static FloatArrayF< 6 > transformStressVectorTo(const FloatMatrixF< 3, 3 > &base, const FloatArrayF< 6 > &stress, bool transpose=false)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ principal_strain
For computing principal strains from engineering strains.
#define _IFT_RCM2Material_gf
#define _IFT_RCM2Material_ft