61 double fc = -1.0, c = -1.0, wc = -1.0, ac = -1.0, alpha1 = 1.0, alpha2 = 1.0;
74 KelvinChainMaterial :: initializeFrom(ir);
133 if ( !( ( this->
kSh != -1 ) || ( ( initHum != -1 ) && ( finalHum != -1 ) ) ) ) {
134 throw ValueInputException(ir,
"none",
"either kSh or initHum and finalHum must be given in input record");
137 if ( ( initHum < 0.2 || initHum > 0.98 ) && this->
kSh == -1 ) {
140 if ( ( finalHum < 0.2 || finalHum > 0.98 ) && this->
kSh == -1 ) {
145 if ( this->
kSh == -1 ) {
148 this->
kSh = alpha1 * alpha2 * ( 1 - pow(finalHum, 3.) ) * ( 0.019 * pow(wc * c, 2.1) * pow(fc, -0.28) + 270 ) * 1.e-6 / fabs(initHum - finalHum);
176 E28 = 4733. * sqrt(fc);
184B3SolidMaterial :: predictParametersFrom(
double fc,
double c,
double wc,
double ac,
185 double t0,
double alpha1,
double alpha2)
221 q1 = 126.74271 / sqrt(fc) * 1e-6;
222 q2 = 185.4 * pow(c, 0.5) * pow(fc, -0.9) * 1.e-6;
223 q3 = 0.29 * pow(wc, 4.) *
q2;
224 q4 = 20.3 * pow(ac, -0.7) * 1.e-6;
229 kt = 85000 * pow(
t0, -0.08) * pow(fc, -0.25);
230 EpsSinf = alpha1 * alpha2 * ( 1.9e-2 * pow(
w, 2.1) * pow(fc, -0.28) + 270. );
233 q5 = 7.57e5 * ( 1. / fc ) * pow(
EpsSinf, -0.6);
237 sprintf(buff,
"q1=%lf q2=%lf q3=%lf q4=%lf q5=%lf kt=%lf EpsSinf=%lf",
q1,
q2,
q3,
q4,
q5,
kt,
EpsSinf);
256 double chainStiffness = 0.;
268 sum = 1. / KelvinChainMaterial :: giveEModulus(gp, tStep);
272 chainStiffness = 1. /
sum;
275 chainStiffness = KelvinChainMaterial :: giveEModulus(gp, tStep);
289 if ( this->
EparVal.isEmpty() ) {
290 RheoChainMaterial :: updateEparModuli(tPrime, gp, tStep);
295B3SolidMaterial :: computeCharTimes()
335 for (
int mu = 1; mu <= this->
nUnits; mu++ ) {
336 charTimes.at(mu) = Tau1 * pow(10., mu - 1);
354 double lambda0ToPowN = pow(
lambda0, 0.1);
355 double tau0 = pow(2 * this->
giveCharTime(1) / sqrt(10.0), 0.1);
356 this->
EspringVal = 1. / (
q2 * log(1.0 + tau0 / lambda0ToPowN) -
q2 * tau0 / ( 10.0 * lambda0ToPowN + 10.0 * tau0 ) );
361 for (
int mu = 1; mu <= this->
nUnits; mu++ ) {
363 answer.
at(mu) = 10. * pow(1 + tauMu / lambda0ToPowN, 2) / ( log(10.0) *
q2 * ( tauMu / lambda0ToPowN ) * ( 0.9 + tauMu / lambda0ToPowN ) );
372 return KelvinChainMaterial :: computeCharCoefficients(tPrime, gp, tStep);
378B3SolidMaterial :: computeCreepFunction(
double t,
double t_prime,
GaussPoint *gp,
TimeStep *tStep)
const
386 return q2 * log( 1 + pow( (t-t_prime) /
lambda0,
n) );
391B3SolidMaterial :: giveShrinkageStrainVector(
FloatArray &answer,
394 ValueModeType mode)
const
404 if ( ( mode != VM_Total ) && ( mode != VM_Incremental ) ) {
411 if ( ( mode == VM_Incremental ) && ( !tStep->
isTheFirstStep() ) ) {
427 double TauSh, St, kh, help, E607, Et0Tau, EpsShInf, EpsSh;
433 if ( ( mode == _3dShell ) || ( mode == _3dBeam ) || ( mode == _2dPlate ) || ( mode == _2dBeam ) ) {
443 TauSh =
kt * pow(
ks * 2.0 *
vs, 2.);
445 St = tanh( pow( ( time -
t0 ) / TauSh, 1. / 2. ) );
448 kh = 1. - pow(
hum, 3);
449 }
else if (
hum == 1 ) {
453 help = 1. - pow(0.98, 3);
454 kh = help + ( -0.2 - help ) / ( 1. - 0.98 ) * (
hum - 0.98 );
458 E607 =
E28 * pow(607 / ( 4. + 0.85 * 607 ), 0.5);
459 Et0Tau =
E28 * pow( (
t0 + TauSh ) / ( 4. + 0.85 * (
t0 + TauSh ) ), 0.5 );
461 EpsShInf =
EpsSinf * E607 / Et0Tau;
463 EpsSh = -EpsShInf * kh * St;
465 fullAnswer.
at(1) = fullAnswer.
at(2) = fullAnswer.
at(3) = EpsSh * 1.e-6;
467 StructuralMaterial :: giveReducedSymVectorForm( answer, fullAnswer, gp->
giveMaterialMode() );
477 double humDiff, EpsSh;
482 if ( ( mode == _3dShell ) || ( mode == _3dBeam ) || ( mode == _2dPlate ) || ( mode == _2dBeam ) ) {
489 EpsSh = humDiff *
kSh;
493 fullAnswer.
at(1) = fullAnswer.
at(2) = fullAnswer.
at(3) = EpsSh;
495 StructuralMaterial :: giveReducedSymVectorForm( answer, fullAnswer, gp->
giveMaterialMode() );
500B3SolidMaterial :: computeSolidifiedVolume(
TimeStep *tStep)
const
513 v = 1 / ( alpha + pow(
lambda0 / atAge, m) );
525 return 1. / (
q4 *
c0 *
S );
529 return 1. * tHalfStep /
q4;
546 if ( mode == VM_Incremental ) {
552 auto sigma = status->giveViscoelasticStressVector();
556 reducedAnswer.
zero();
559 reducedAnswer.
times( tStep->giveTimeIncrement() / (
timeFactor * eta ) );
562 KelvinChainMaterial :: giveEigenStrainVector(help, gp, tStep, mode);
565 reducedAnswer.
add(help);
567 answer = reducedAnswer;
576B3SolidMaterial :: inverse_sorption_isotherm(
double w)
const
586 double phi = exp(
a * ( 1.0 - pow( (
w_h /
w ), (
n ) ) ) );
652 double humOld, humNew;
670 }
else if ( option == 0 ) {
678 if ( ( humNew - humOld ) == 0. ) {
679 Stemp = 1 / ( 1 /
S +
c0 * deltaT );
681 dHdt = ( humNew - humOld ) / deltaT;
682 RHS = fabs(
c1 * dHdt / humNew);
684 Stemp = A * ( 1 - 2 * ( A -
S ) / ( ( A -
S ) + ( A +
S ) * exp( 2 * deltaT * sqrt(RHS *
c0) ) ) );
692B3SolidMaterial :: giveInitMicroPrestress()
const
694 return 1 / (
c0 *
tS0 );
705 if ( ( tf = fm->
giveField(FT_HumidityConcentration) ) ) {
709 gp->giveElement()->computeGlobalCoordinates( gcoords, gp->giveNaturalCoordinates() );
710 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) {
711 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
731 if ( ( tf = fm->
giveField(FT_HumidityConcentration) ) ) {
735 gp->giveElement()->computeGlobalCoordinates( gcoords, gp->giveNaturalCoordinates() );
736 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) {
737 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
740 if ( ( err = tf->evaluateAt(ei2, gcoords, VM_Incremental, tStep) ) ) {
741 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
753std::unique_ptr<MaterialStatus>
759 return std::make_unique<B3SolidMaterialStatus>(gp,
nUnits);
766 KelvinChainMaterial :: giveRealStressVector(answer, gp, reducedStrain, tStep);
779B3SolidMaterialStatus :: B3SolidMaterialStatus(
GaussPoint *g,
int nunits) :
783B3SolidMaterialStatus :: updateYourself(
TimeStep *tStep)
788 KelvinChainMaterialStatus :: updateYourself(tStep);
795 KelvinChainMaterialStatus :: saveContext(stream, mode);
805 KelvinChainMaterialStatus :: restoreContext(stream, mode);
#define _IFT_B3Material_vs
#define _IFT_B3Material_EpsSinf
#define _IFT_B3Material_ncoeff
#define _IFT_B3Material_ac
#define _IFT_B3Material_alpha2
#define _IFT_B3Material_wc
#define _IFT_B3Material_q2
#define _IFT_B3Material_kt
#define _IFT_B3Material_q5
#define _IFT_B3Material_cc
#define _IFT_B3Material_q1
#define _IFT_B3Material_fc
#define _IFT_B3Material_q3
#define _IFT_B3Material_mode
#define _IFT_B3Material_q4
#define _IFT_B3Material_a
#define _IFT_B3Material_hum
#define _IFT_B3Material_wh
#define _IFT_B3Material_t0
#define _IFT_B3Material_shmode
#define _IFT_B3Material_alpha1
#define _IFT_B3Material_ks
#define _IFT_B3SolidMaterial_initialhumidity
#define _IFT_B3SolidMaterial_emodulimode
#define _IFT_B3SolidMaterial_finalhumidity
#define _IFT_B3SolidMaterial_c1
#define _IFT_B3SolidMaterial_microprestress
#define _IFT_B3SolidMaterial_c0
#define _IFT_B3SolidMaterial_lambda0
#define _IFT_B3SolidMaterial_ksh
#define REGISTER_Material(class)
double microprestress_old
Microprestresses.
double microprestress_new
double giveHumidity(GaussPoint *gp, TimeStep *tStep) const
Computes relative humidity at given time step and GP.
double computeFlowTermViscosity(GaussPoint *gp, TimeStep *tStep) const
Evaluation of the flow term viscosity.
double n
Constant-exponent (obtained from experiments) n [Pedersen, 1990].
void computePointShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) const
Evaluation of the shrinkageStrainVector. Shrinkage is fully dependent on humidity rate in given GP.
double a
Constant (obtained from experiments) A [Pedersen, 1990].
double inverse_sorption_isotherm(double w) const
double giveInitMicroPrestress() const
Computes initial value of the MicroPrestress.
double computeSolidifiedVolume(TimeStep *tStep) const
Evaluation of the relative volume of the solidified material.
enum oofem::B3SolidMaterial::b3ShModeType shMode
double lambda0
constant equal to one day in time units of analysis (eg. 86400 if the analysis runs in seconds)
double giveHumidityIncrement(GaussPoint *gp, TimeStep *tStep) const
Computes relative humidity increment at given time step and GP.
double EpsSinf
Additional parameters for average cross section shrinkage.
double computeMicroPrestress(GaussPoint *gp, TimeStep *tStep, int option) const
double tS0
MPS tS0 - necessary for the initial value of microprestress (age when the load is applied).
double w_h
Constant water content (obtained from experiments) w_h [Pedersen, 1990].
double EspringVal
elastic modulus of the aging spring (first member of Kelvin chain if retardation spectrum is used)
void predictParametersFrom(double, double, double, double, double, double, double)
void updateEparModuli(double tPrime, GaussPoint *gp, TimeStep *tStep) const override
Update of partial moduli of individual chain units.
double c1
MPS constant c1 (=C1*R*T/M).
void computeTotalAverageShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) const
double c0
MPS constant c0 [MPa^-1 * day^-1].
double kSh
MPS shrinkage parameter. Either this or inithum and finalhum must be given in input record.
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.
Domain * domain
Link to domain object, useful for communicating with other FEM components.
int number
Component number.
FieldPtr giveField(FieldType key)
void zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
void subtract(const FloatArray &src)
int giveNumberOfRows() const
Returns number of rows of receiver.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
KelvinChainMaterialStatus(GaussPoint *g, int nunits)
virtual MaterialStatus * giveStatus(GaussPoint *gp) 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.
double endOfTimeOfInterest
Time (age???) up to which the model should give a good approximation.
FloatArray EparVal
Partial moduli of individual units.
void giveUnitComplianceMatrix(FloatMatrix &answer, GaussPoint *gp, TimeStep *tStep) const
Evaluation of elastic compliance matrix for unit Young's modulus.
double begOfTimeOfInterest
Time from which the model should give a good approximation. Optional field. Default value is 0....
FloatArray charTimes
Characteristic times of individual units (relaxation or retardation times).
double giveTimeIncrement()
Returns solution step associated time increment.
double giveTargetTime()
Returns target time.
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
#define OOFEM_LOG_DEBUG(...)
double sum(const FloatArray &x)
std::shared_ptr< Field > FieldPtr
@ CIO_IOERR
General IO error.