55RCSDEMaterial :: ~RCSDEMaterial()
74 FloatArray reducedStrainVector, strainVector, principalStrain;
87 StructuralMaterial :: giveFullSymVectorForm( strainVector, reducedStrainVector, gp->giveMaterialMode() );
95 if ( status->
giveTempMode() == RCSDEMaterialStatus :: rcMode ) {
103 StructuralMaterial :: giveReducedSymVectorForm( reducedSpaceStressVector, answer, gp->giveMaterialMode() );
108 StructuralMaterial :: giveReducedSymVectorForm( reducedAnswer, answer, gp->giveMaterialMode() );
109 answer = reducedAnswer;
112 double minSofteningPrincStress = this->
Ft,
E, Le, CurrFt,
Ft,
Gf, Gf0, Gf1, e0, ef, ef2, damage;
114 for (
int i = 1; i <= 3; i++ ) {
116 if ( princStress.
at(i) < minSofteningPrincStress ) {
117 minSofteningPrincStress = princStress.
at(i);
133 e0 = principalStrain.
at(ipos);
134 Gf0 = -CurrFt * ef * ( exp(-status->
giveCrackStrain(ipos) / ef) - 1.0 );
137 ef2 = Gf1 / princStress.
at(ipos);
150 status->
setTempMode(RCSDEMaterialStatus :: sdMode);
166 reducedSpaceStressVector.
times(1.0 - damage);
168 answer = reducedSpaceStressVector;
181RCSDEMaterial :: giveEffectiveMaterialStiffnessMatrix(
FloatMatrix &answer,
191 if ( status->
giveTempMode() == RCSDEMaterialStatus :: rcMode ) {
194 RCM2Material :: giveEffectiveMaterialStiffnessMatrix(answer, rMode, gp, tStep);
199 if ( ( rMode == TangentStiffness ) || ( rMode == SecantStiffness ) ) {
209 reducedAnswer.
times(dCoeff);
211 answer = reducedAnswer;
212 }
else if ( rMode == ElasticStiffness ) {
223RCSDEMaterial :: computeDamageCoeff(
double equivStrain,
double e0,
double ef2)
const
225 double damage = 1. - e0 / equivStrain *exp(-( equivStrain - e0 ) / ef2);
226 if ( damage > 1.0 ) {
237 FloatArray effStress, princEffStress, fullEffStress;
242 effStress.
beProductOf(De, reducedTotalStrainVector);
243 StructuralMaterial :: giveFullSymVectorForm( fullEffStress, effStress, gp->
giveMaterialMode() );
246 for (
int i = 1; i <= 3; i++ ) {
247 answer =
max( answer,
macbra( princEffStress.
at(i) ) );
257 RCM2Material :: initializeFrom(ir);
271 return RCM2Material :: give(aProperty, gp);
276RCSDEMaterial :: checkSizeLimit(
GaussPoint *gp,
double charLength)
const
283 double Ee,
Gf,
Ft, LeCrit;
289 LeCrit = 2.0 *
Gf * Ee / (
Ft *
Ft );
290 return ( charLength < LeCrit );
295RCSDEMaterial :: computeStrength(
GaussPoint *gp,
double charLength)
const
310 Ft = sqrt(2. * Ee *
Gf / charLength);
313 Ft, gp->giveElement()->giveNumber(), gp->giveNumber(), charLength);
321RCSDEMaterial :: giveMinCrackStrainsForFullyOpenCrack(
GaussPoint *gp,
int i)
const
364RCSDEMaterial :: giveCrackingModulus(MatResponseMode rMode,
GaussPoint *gp,
365 double crackStrain,
int i)
const
376 double Gf, Cf,
Ft, Le, ef;
389 ef =
Gf / ( Le *
Ft );
391 if ( rMode == TangentStiffness ) {
395 Cf = -
Ft / ef *exp(-crackStrain / ef);
416RCSDEMaterial :: giveNormalCrackingStress(
GaussPoint *gp,
double crackStrain,
int i)
const
421 double Gf,
Ft, Le, answer, ef;
427 ef =
Gf / ( Le *
Ft );
432 answer =
Ft * exp(-crackStrain / ef);
454RCSDEMaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
458 StructuralMaterialStatus :: printOutputAt(file, tStep);
459 fprintf(file,
"status { ");
461 fprintf(file,
"mode :rc ");
464 for (
int i = 1; i <= 3; i++ ) {
473 strcpy(s,
"SOFTENING");
476 strcpy(s,
"RELOADING");
479 strcpy(s,
"UNLOADING");
482 strcpy(s,
"UNKNOWN");
486 fprintf( file,
"crack %d {status %s, normal to crackplane { %f %f %f }} ",
495 fprintf(file,
"}\n");
500RCSDEMaterialStatus :: initTempStatus()
506 RCM2MaterialStatus :: initTempStatus();
515RCSDEMaterialStatus :: updateYourself(
TimeStep *tStep)
522 RCM2MaterialStatus :: updateYourself(tStep);
533 RCM2MaterialStatus :: saveContext(stream, mode);
544 if ( !stream.
write(_mode) ) {
557 if ( ( iores =
Ds0.storeYourself(stream) ) !=
CIO_OK ) {
566 RCM2MaterialStatus :: restoreContext(stream, mode);
577 if ( !stream.
read(_mode) ) {
591 if ( ( iores =
Ds0.restoreYourself(stream) ) !=
CIO_OK ) {
#define REGISTER_Material(class)
virtual int read(int *data, std::size_t count)=0
Reads count integer values into array pointed by data.
virtual int write(const int *data, std::size_t count)=0
Writes count integer values from array pointed by data.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
const IntArray & giveTempCrackStatus()
IntArray crackStatuses
One value from (pscm_NONE, pscm_OPEN, pscm_SOFTENING, pscm_RELOADING, pscm_UNLOADING,...
double giveCrackStrain(int icrack) const
RCM2MaterialStatus(GaussPoint *g)
int giveTempAlreadyCrack() const
const FloatArray & giveCrackStrainVector() const
double giveTempMaxCrackStrain(int icrack)
FloatMatrix crackDirs
Storing direction of cracks in columwise format.
double giveCharLength(int icrack) const
const FloatMatrix & giveTempCrackDirs()
void giveRealPrincipalStressVector3d(FloatArray &answer, GaussPoint *, FloatArray &, FloatMatrix &, TimeStep *) const
LinearElasticMaterial * linearElasticMaterial
RCM2Material(int n, Domain *d)
LinearElasticMaterial * giveLinearElasticMaterial() const
virtual void updateCrackStatus(GaussPoint *gp, const FloatArray &crackStrain) const
virtual void giveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode, GaussPoint *gp, TimeStep *tStep) const
double giveTransitionEpsCoeff() const
void setTempMaxEquivStrain(double val)
void setDs0Matrix(FloatMatrix &mtrx)
void setTransitionEpsCoeff(double val)
double giveEpsF2Coeff() const
double giveTempMaxEquivStrain() const
void setTempDamageCoeff(double val)
double giveDamageCoeff() const
__rcsdModeType giveTempMode() const
void setTempMode(__rcsdModeType mode)
const FloatMatrix * giveDs0Matrix()
void setEpsF2Coeff(double val)
double giveTempDamageCoeff() const
__rcsdModeType tempRcsdMode
double tempMaxEquivStrain
int checkSizeLimit(GaussPoint *gp, double) const override
double give(int aProperty, GaussPoint *gp) const override
double computeDamageCoeff(double, double, double) const
double computeCurrEquivStrain(GaussPoint *, const FloatArray &, double, TimeStep *tStep) const
double computeStrength(GaussPoint *gp, double) const override
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
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)
#define OOFEM_LOG_RELEVANT(...)
double macbra(double x)
Returns the positive part of given float.
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ principal_strain
For computing principal strains from engineering strains.
@ principal_stress
For computing principal stresses.
@ CIO_IOERR
General IO error.
#define pscm_SDTransitionCoeff
#define _IFT_RCSDEMaterial_sdtransitioncoeff