56RCSDMaterial :: ~RCSDMaterial()
75 FloatArray reducedStrainVector, strainVector, principalStrain;
88 StructuralMaterial :: giveFullSymVectorForm( strainVector, reducedStrainVector, gp->giveMaterialMode() );
96 if ( status->
giveTempMode() == RCSDMaterialStatus :: rcMode ) {
104 StructuralMaterial :: giveReducedSymVectorForm( reducedSpaceStressVector, answer, gp->giveMaterialMode() );
109 StructuralMaterial :: giveReducedSymVectorForm( reducedAnswer, answer, gp->giveMaterialMode() );
110 answer = reducedAnswer;
113 double minSofteningPrincStress = this->
Ft, dCoeff, CurrFt,
E, ep, ef, damage;
115 for (
int i = 1; i <= 3; i++ ) {
117 if ( princStress.
at(i) < minSofteningPrincStress ) {
118 minSofteningPrincStress = princStress.
at(i);
132 dCoeff = (
E / ( princStress.
at(ipos) / principalStrain.
at(ipos) ) );
149 double ep, ef,
E, dCoeff;
161 reducedSpaceStressVector.
times(1.0 - damage);
163 answer = reducedSpaceStressVector;
176RCSDMaterial :: giveEffectiveMaterialStiffnessMatrix(
FloatMatrix &answer,
186 if ( status->
giveTempMode() == RCSDMaterialStatus :: rcMode ) {
189 RCM2Material :: giveEffectiveMaterialStiffnessMatrix(answer, rMode, gp, tStep);
194 if ( ( rMode == TangentStiffness ) || ( rMode == SecantStiffness ) ) {
204 reducedAnswer.
times(dCoeff);
206 answer = reducedAnswer;
207 }
else if ( rMode == ElasticStiffness ) {
218RCSDMaterial :: computeDamageCoeff(
double equivStrain,
double dStiffCoeff,
double ep,
double ef)
const
220 double damage = 1. - dStiffCoeff * ( 1. - ef / equivStrain ) / ( 1. - ef / ep );
221 if ( damage > 1.0 ) {
232 FloatArray effStress, princEffStress, fullEffStress;
237 effStress.
beProductOf(De, reducedTotalStrainVector);
238 StructuralMaterial :: giveFullSymVectorForm( fullEffStress, effStress, gp->
giveMaterialMode() );
241 for (
int i = 1; i <= 3; i++ ) {
242 answer =
max( answer,
macbra( princEffStress.
at(i) ) );
252 RCM2Material :: initializeFrom(ir);
266 return RCM2Material :: give(aProperty, gp);
271RCSDMaterial :: checkSizeLimit(
GaussPoint *gp,
double charLength)
const
278 double Ee,
Gf,
Ft, LeCrit;
284 LeCrit = 2.0 *
Gf * Ee / (
Ft *
Ft );
285 return ( charLength < LeCrit );
290RCSDMaterial :: computeStrength(
GaussPoint *gp,
double charLength)
const
305 Ft = sqrt(2. * Ee *
Gf / charLength);
308 Ft, gp->giveElement()->giveNumber(), gp->giveNumber(), charLength);
316RCSDMaterial :: giveMinCrackStrainsForFullyOpenCrack(
GaussPoint *gp,
int i)
const
328 return 2.0 *
Gf / ( Le *
Ft );
356RCSDMaterial :: giveCrackingModulus(MatResponseMode rMode,
GaussPoint *gp,
357 double crackStrain,
int i)
const
368 double Cf,
Ft, Le, minEffStrainForFullyOpenCrack;
384 if ( rMode == TangentStiffness ) {
386 if ( ( crackStrain >= minEffStrainForFullyOpenCrack ) ||
392 Cf = -
Ft / minEffStrainForFullyOpenCrack;
403 if ( ( crackStrain >= minEffStrainForFullyOpenCrack ) ||
423RCSDMaterial :: giveNormalCrackingStress(
GaussPoint *gp,
double crackStrain,
int i)
const
428 double Cf,
Ft, Le, answer, minEffStrainForFullyOpenCrack;
437 if ( ( crackStrain >= minEffStrainForFullyOpenCrack ) ||
443 answer =
Ft + Cf * crackStrain;
444 }
else if ( crackStrain <= 0. ) {
450 answer = crackStrain *
Ft *
470RCSDMaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
474 StructuralMaterialStatus :: printOutputAt(file, tStep);
475 fprintf(file,
"status { ");
477 fprintf(file,
"mode :rc ");
480 for (
int i = 1; i <= 3; i++ ) {
489 strcpy(s,
"SOFTENING");
492 strcpy(s,
"RELOADING");
495 strcpy(s,
"UNLOADING");
498 strcpy(s,
"UNKNOWN");
502 fprintf( file,
"crack %d {status %s, normal to crackplane { %f %f %f }} ",
511 fprintf(file,
"}\n");
516RCSDMaterialStatus :: initTempStatus()
522 RCM2MaterialStatus :: initTempStatus();
531RCSDMaterialStatus :: updateYourself(
TimeStep *tStep)
538 RCM2MaterialStatus :: updateYourself(tStep);
549 RCM2MaterialStatus :: saveContext(stream,
mode);
564 if ( ( iores =
Ds0.storeYourself(stream) ) !=
CIO_OK ) {
573 RCM2MaterialStatus :: restoreContext(stream,
mode);
588 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,...
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
void setTempDamageCoeff(double val)
double giveDamageEpspCoeff() const
rcsdMode giveTempMode() const
void setTempMode(rcsdMode mode)
double giveTempDamageCoeff() const
void setDamageStiffCoeff(double val)
double giveDamageCoeff() const
const FloatMatrix * giveDs0Matrix()
void setDs0Matrix(FloatMatrix &mtrx)
double giveTempMaxEquivStrain() const
double tempMaxEquivStrain
double giveDamageStiffCoeff() const
void setDamageEpsfCoeff(double val)
void setDamageEpspCoeff(double val)
double giveDamageEpsfCoeff() const
void setTempMaxEquivStrain(double val)
double computeStrength(GaussPoint *gp, double) const override
double giveMinCrackStrainsForFullyOpenCrack(GaussPoint *gp, int i) const override
double computeCurrEquivStrain(GaussPoint *, const FloatArray &, double, TimeStep *) const
int checkSizeLimit(GaussPoint *gp, double) const override
double give(int aProperty, GaussPoint *gp) const override
double giveCrackingModulus(MatResponseMode rMode, GaussPoint *gp, double crackStrain, int i) const override
double computeDamageCoeff(double, double, double, double) const
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_RCSDMaterial_sdtransitioncoeff