48KelvinChainMaterial :: computeCharCoefficients(
double tPrime,
GaussPoint *gp,
TimeStep *tStep)
const
66 FloatArray discreteComplianceFunctionVal(rSize);
71 for (
int i = 1; i <= rSize; i++ ) {
78 for (
int i = 1; i <= this->
nUnits; i++ ) {
80 for (
int j = 1; j <= this->
nUnits; j++ ) {
83 for (
int r = 1; r <= rSize; r++ ) {
84 double tti = rTimes.
at(r) / taui;
85 double ttj = rTimes.
at(r) / tauj;
86 sum += ( 1. - exp(-tti) ) * ( 1. - exp(-ttj) );
95 for (
int r = 1; r <= rSize; r++ ) {
96 double tti = rTimes.
at(r) / taui;
97 sumRhs += ( 1. - exp(-tti) ) * discreteComplianceFunctionVal.
at(r);
108 for (
int i = 1; i <= this->
nUnits; i++ ) {
109 answer.
at(i) = 1. / answer.
at(i);
128 if ( ! Material :: isActivated( tStep ) ) {
129 OOFEM_ERROR(
"Attempted to evaluate E modulus at time lower than casting time");
139 for (
int mu = 1; mu <=
nUnits; mu++ ) {
142 if ( deltaT / tauMu < 1.e-5 ) {
143 lambdaMu = 1 - 0.5 * ( deltaT / tauMu ) + 1 / 6 * ( pow(deltaT / tauMu, 2) ) - 1 / 24 * ( pow(deltaT / tauMu, 3) );
144 }
else if ( deltaT / tauMu > 30 ) {
145 lambdaMu = tauMu / deltaT;
147 lambdaMu = ( 1.0 - exp(-deltaT / tauMu) ) * tauMu / deltaT;
151 sum += ( 1 - lambdaMu ) / Dmu;
171 if ( ! Material :: isActivated( tStep ) ) {
172 OOFEM_ERROR(
"Attempted to evaluate creep strain for time lower than casting time");
175 if ( mode == VM_Incremental ) {
178 for (
int mu = 1; mu <=
nUnits; mu++ ) {
180 if ( tStep->giveTimeIncrement() / this->giveCharTime(mu) > 30 ) {
183 beta = exp( - tStep->giveTimeIncrement() / this->giveCharTime(mu) );
186 FloatArray *gamma = & status->giveHiddenVarsVector(mu);
188 reducedAnswer.
add(1.0 - beta, * gamma);
192 answer = reducedAnswer;
203 RheoChainMaterial :: giveRealStressVector(answer, gp, reducedStrain, tStep);
221 if ( ! Material :: isActivated( tStep ) ) {
224 for (
int mu = 1; mu <=
nUnits; mu++ ) {
235 if ( deltaEps0.giveSize() ) {
244 for (
int mu = 1; mu <=
nUnits; mu++ ) {
250 if ( deltaT / tauMu < 1.e-5 ) {
251 betaMu = exp(-( deltaT ) / tauMu);
252 lambdaMu = 1 - 0.5 * ( deltaT / tauMu ) + 1 / 6 * ( pow(deltaT / tauMu, 2) ) - 1 / 24 * ( pow(deltaT / tauMu, 3) );
253 }
else if ( deltaT / tauMu > 30 ) {
255 lambdaMu = tauMu / deltaT;
257 betaMu = exp(-( deltaT ) / tauMu);
258 lambdaMu = ( 1.0 - betaMu ) * tauMu / deltaT;
264 if ( muthHiddenVarsVector.
giveSize() ) {
265 muthHiddenVarsVector.
times(betaMu);
266 muthHiddenVarsVector.
add(help);
275std::unique_ptr<MaterialStatus>
278 return std::make_unique<KelvinChainMaterialStatus>(gp,
nUnits);
284 RheoChainMaterial :: initializeFrom(ir);
290KelvinChainMaterialStatus :: KelvinChainMaterialStatus(
GaussPoint *g,
int nunits) :
294KelvinChainMaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
296 RheoChainMaterialStatus :: printOutputAt(file, tStep);
301KelvinChainMaterialStatus :: updateYourself(
TimeStep *tStep)
303 RheoChainMaterialStatus :: updateYourself(tStep);
307KelvinChainMaterialStatus :: initTempStatus()
309 RheoChainMaterialStatus :: initTempStatus();
315 RheoChainMaterialStatus :: saveContext(stream, mode);
321 RheoChainMaterialStatus :: restoreContext(stream, mode);
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
void add(const FloatArray &src)
void subtract(const FloatArray &src)
double at(std::size_t i, std::size_t j) const
bool solveForRhs(const FloatArray &b, FloatArray &answer, bool transpose=false)
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
void computeHiddenVars(GaussPoint *gp, TimeStep *tStep) const
double giveEModulus(GaussPoint *gp, TimeStep *tStep) const override
Evaluation of the incremental modulus.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
RheoChainMaterialStatus(GaussPoint *g, int nunits)
FloatArray & giveHiddenVarsVector(int i)
void letTempHiddenVarsVectorBe(int i, FloatArray &valueArray)
const FloatArray & giveDiscreteTimes() const
int nUnits
Number of (Maxwell or Kelvin) units in the rheologic chain.
double relMatAge
Physical age of the material at castingTime.
double giveCharTime(int) const
Access to the characteristic time of a given unit.
RheoChainMaterial(int n, Domain *d)
virtual double computeCreepFunction(double t, double t_prime, GaussPoint *gp, TimeStep *tStep) const =0
Evaluation of the creep compliance function at time t when loading is acting from time t_prime.
double giveEparModulus(int iChain) const
Access to partial modulus of a given unit.
virtual void updateEparModuli(double tPrime, GaussPoint *gp, TimeStep *tStep) const
Update of partial moduli of individual chain units.
FloatArray computeStressIndependentStrainVector(GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const override
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
const FloatArray & giveTempStrainVector() const
Returns the const pointer to receiver's temporary strain vector.
double giveTimeIncrement()
Returns solution step associated time increment.
double giveTargetTime()
Returns target time.
double sum(const FloatArray &x)