60 double fc = -1.0, c = -1.0, wc = -1.0, ac = -1.0, alpha1 = 1.0, alpha2 = 1.0;
119 OOFEM_WARNING(
"to use B3_PointShrinkageMPS - MicroPrestress must be = 1");
132 if ( !( ( this->
kSh != -1 ) || ( ( initHum != -1 ) && ( finalHum != -1 ) ) ) ) {
133 OOFEM_WARNING(
"either kSh or initHum and finalHum must be given in input record");
137 if ( ( ( initHum < 0.2 ) || ( initHum > 0.98 ) || ( finalHum < 0.2 ) || ( finalHum > 0.98 ) ) && ( this->
kSh == -1 ) ) {
138 OOFEM_ERROR(
"initital humidity or final humidity out of range (0.2 - 0.98)");
142 if ( this->
kSh == -1 ) {
145 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);
173 E28 = 4733. * sqrt(fc);
186 double t0,
double alpha1,
double alpha2)
222 q1 = 126.74271 / sqrt(fc) * 1e-6;
223 q2 = 185.4 * pow(c, 0.5) * pow(fc, -0.9) * 1.e-6;
224 q3 = 0.29 * pow(wc, 4.) *
q2;
225 q4 = 20.3 * pow(ac, -0.7) * 1.e-6;
230 kt = 85000 * pow(t0, -0.08) * pow(fc, -0.25);
231 EpsSinf = alpha1 * alpha2 * ( 1.9e-2 * pow(
w, 2.1) * pow(fc, -0.28) + 270. );
234 q5 = 7.57e5 * ( 1. / fc ) * pow(
EpsSinf, -0.6);
238 sprintf(buff,
"q1=%lf q2=%lf q3=%lf q4=%lf q5=%lf kt=%lf EpsSinf=%lf",
q1,
q2,
q3,
q4,
q5,
kt,
EpsSinf);
259 double chainStiffness = 0.;
275 chainStiffness = 1. / sum;
338 for (
int mu = 1; mu <= this->
nUnits; mu++ ) {
361 double lambda0ToPowN = pow(
lambda0, 0.1);
362 tau0 = pow(2 * this->
giveCharTime(1) / sqrt(10.0), 0.1);
363 EspringVal = 1. / (
q2 * log(1.0 + tau0 / lambda0ToPowN) -
q2 * tau0 / ( 10.0 * lambda0ToPowN + 10.0 * tau0 ) );
369 for ( mu = 1; mu <= this->
nUnits; mu++ ) {
371 answer.
at(mu) = 10. * pow(1 + tauMu / lambda0ToPowN, 2) / ( log(10.0) *
q2 * ( tauMu / lambda0ToPowN ) * ( 0.9 + tauMu / lambda0ToPowN ) );
395 Phi =
q2 * log( 1 + pow( (t-t_prime) /
lambda0, n) );
415 if ( ( mode != VM_Total ) && ( mode != VM_Incremental ) ) {
422 if ( ( mode == VM_Incremental ) && ( !tStep->
isTheFirstStep() ) ) {
438 double TauSh, St, kh, help, E607, Et0Tau, EpsShInf, EpsSh;
444 if ( ( mode == _3dShell ) || ( mode == _3dBeam ) || ( mode == _2dPlate ) || ( mode == _2dBeam ) ) {
454 TauSh =
kt * pow(
ks * 2.0 *
vs, 2.);
456 St = tanh( pow( ( time -
t0 ) / TauSh, 1. / 2. ) );
459 kh = 1. - pow(
hum, 3);
460 }
else if (
hum == 1 ) {
464 help = 1. - pow(0.98, 3);
465 kh = help + ( -0.2 - help ) / ( 1. - 0.98 ) * (
hum - 0.98 );
469 E607 =
E28 * pow(607 / ( 4. + 0.85 * 607 ), 0.5);
470 Et0Tau =
E28 * pow( (
t0 + TauSh ) / ( 4. + 0.85 * (
t0 + TauSh ) ), 0.5 );
472 EpsShInf =
EpsSinf * E607 / Et0Tau;
474 EpsSh = -EpsShInf * kh * St;
476 fullAnswer.
at(1) = fullAnswer.
at(2) = fullAnswer.
at(3) = EpsSh * 1.e-6;
488 double humDiff, EpsSh;
493 if ( ( mode == _3dShell ) || ( mode == _3dBeam ) || ( mode == _2dPlate ) || ( mode == _2dBeam ) ) {
500 EpsSh = humDiff *
kSh;
504 fullAnswer.
at(1) = fullAnswer.
at(2) = fullAnswer.
at(3) = EpsSh;
524 v = 1 / ( alpha + pow(
lambda0 / atAge, m) );
534 double eta,
S, tHalfStep;
538 eta = 1. / (
q4 *
c0 *
S );
542 eta = 1. * tHalfStep /
q4;
565 if ( mode == VM_Incremental ) {
573 reducedAnswer.
zero();
582 reducedAnswer.
add(help);
584 answer = reducedAnswer;
605 phi = exp(
a * ( 1.0 - pow( (
w_h / w ), (
n ) ) ) );
671 double humOld, humNew;
689 }
else if ( option == 0 ) {
698 if ( ( humNew - humOld ) == 0. ) {
699 Stemp = 1 / ( 1 / S +
c0 * deltaT );
701 dHdt = ( humNew - humOld ) / deltaT;
702 RHS = fabs(
c1 * dHdt / humNew);
704 Stemp = A * ( 1 - 2 * ( A -
S ) / ( ( A - S ) + ( A +
S ) * exp( 2 * deltaT * sqrt(RHS *
c0) ) ) );
715 S0 = 1 / (
c0 *
tS0 );
723 double humidity = 0.;
731 if ( ( tf = fm->
giveField(FT_HumidityConcentration) ) ) {
734 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) {
735 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
754 double humIncrement = 0.;
762 if ( ( tf = fm->
giveField(FT_HumidityConcentration) ) ) {
765 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) {
766 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
769 if ( ( err = tf->evaluateAt(ei2, gcoords, VM_Incremental, tStep) ) ) {
770 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
static int giveSizeOfVoigtSymVector(MaterialMode mmode)
Returns the size of symmetric part of a reduced stress/strain vector according to given mode...
virtual double giveEModulus(GaussPoint *gp, TimeStep *tStep)
Evaluation of the incremental modulus.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
double relMatAge
Physical age of the material at simulation time = 0.
void subtract(const FloatArray &src)
Subtracts array src to receiver.
int number
Component number.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
double giveCharTime(int) const
Access to the characteristic time of a given unit.
#define _IFT_B3Material_hum
std::shared_ptr< Field > FieldPtr
#define _IFT_B3Material_q2
Domain * domain
Link to domain object, useful for communicating with other FEM components.
#define _IFT_B3Material_EpsSinf
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
double giveInitMicroPrestress(void)
Computes initial value of the MicroPrestress.
double & at(int i)
Coefficient access function.
ValueModeType
Type representing the mode of UnknownType or CharType, or similar types.
#define _IFT_B3Material_a
double begOfTimeOfInterest
Time from which the model should give a good approximation. Optional field. Default value is 0...
double microprestress_old
Microprestresses.
#define _IFT_B3SolidMaterial_microprestress
FloatArray EparVal
Partial moduli of individual units.
EngngModel * giveEngngModel()
Returns engineering model to which receiver is associated.
#define _IFT_B3Material_alpha2
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
int MicroPrestress
If 1, computation exploiting Microprestress solidification theory is done.
double giveTargetTime()
Returns target time.
#define _IFT_B3SolidMaterial_lambda0
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
#define _IFT_B3Material_ks
Element * giveElement()
Returns corresponding element to receiver.
void computePointShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Evaluation of the shrinkageStrainVector. Shrinkage is fully dependent on humidity rate in given GP...
double c1
MPS constant c1 (=C1*R*T/M)
#define _IFT_B3SolidMaterial_c0
MaterialMode
Type representing material mode of integration point.
virtual double giveEModulus(GaussPoint *gp, TimeStep *tStep)
Evaluation of the incremental modulus.
FieldManager * giveFieldManager()
#define OOFEM_LOG_DEBUG(...)
virtual int read(int *data, int count)=0
Reads count integer values into array pointed by data.
virtual void giveEigenStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode)
Computes, for the given integration point, the strain vector induced by the stress history (typically...
double giveEndOfTimeOfInterest()
Access to the time up to which the response should be accurate.
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
int EmoduliMode
If 0, analysis of retardation spectrum is used for evaluation of Kelvin units moduli (default)...
FloatArray charTimes
Characteristic times of individual units (relaxation or retardation times).
double microprestress_new
double giveTimeIncrement()
Returns solution step associated time increment.
bool isTheFirstStep()
Check if receiver is first step.
virtual void computeCharCoefficients(FloatArray &answer, double tPrime, GaussPoint *gp, TimeStep *tStep)
Evaluation of the moduli of individual units.
virtual int write(const int *data, int count)=0
Writes count integer values from array pointed by data.
#define _IFT_B3Material_q1
double timeFactor
Scaling factor transforming the simulation time units into days (gives the number of simulation time ...
#define _IFT_B3Material_mode
virtual void giveEigenStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode)
Computes, for the given integration point, the strain vector induced by the stress history (typically...
double endOfTimeOfInterest
Time (age???) up to which the model should give a good approximation.
double kSh
MPS shrinkage parameter. Either this or inithum and finalhum must be given in input record...
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
static void giveReducedSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full unsymmetric Voigt vector (2nd order tensor) to reduced form.
#define _IFT_B3Material_q5
double EpsSinf
Additional parameters for average cross section shrinkage.
void computeTotalAverageShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
void giveUnitComplianceMatrix(FloatMatrix &answer, GaussPoint *gp, TimeStep *tStep)
Evaluation of elastic compliance matrix for unit Young's modulus.
#define _IFT_B3Material_q4
EngngModelContext * giveContext()
Context requesting service.
#define _IFT_B3Material_t0
#define _IFT_B3SolidMaterial_ksh
#define _IFT_B3Material_cc
#define _IFT_B3SolidMaterial_emodulimode
#define _IFT_B3Material_fc
virtual double computeCreepFunction(double t, double t_prime, GaussPoint *gp, TimeStep *tStep)
Evaluation of the compliance function of the non-aging solidifying constituent.
double a
Constant (obtained from experiments) A [Pedersen, 1990].
double giveHumidity(GaussPoint *gp, TimeStep *tStep)
Computes relative humidity at given time step and GP.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
This class implements associated Material Status to KelvinChainMaterial.
#define _IFT_B3Material_wc
This class implements associated Material Status to B3SolidMaterial.
double computeSolidifiedVolume(TimeStep *tStep)
Evaluation of the relative volume of the solidified material.
void predictParametersFrom(double, double, double, double, double, double, double)
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
bool isEmpty() const
Returns true if receiver is empty.
double n
Constant-exponent (obtained from experiments) n [Pedersen, 1990].
FieldPtr giveField(FieldType key)
Returns the previously registered field under given key; NULL otherwise.
#define _IFT_B3SolidMaterial_finalhumidity
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
Abstract base class representing a material status information.
#define _IFT_B3Material_q3
virtual void updateEparModuli(double tPrime, GaussPoint *gp, TimeStep *tStep)
Update of partial moduli of individual chain units.
Class representing vector of real numbers.
double EspringVal
elastic modulus of the aging spring (first member of Kelvin chain if retardation spectrum is used) ...
Implementation of matrix containing floating point numbers.
#define _IFT_B3Material_kt
double lambda0
constant equal to one day in time units of analysis (eg. 86400 if the analysis runs in seconds) ...
virtual void computeCharCoefficients(FloatArray &answer, double tPrime, GaussPoint *gp, TimeStep *tStep)
Evaluation of characteristic moduli of the non-aging Kelvin chain.
double giveHumidityIncrement(GaussPoint *gp, TimeStep *tStep)
Computes relative humidity increment at given time step and GP.
IRResultType
Type defining the return values of InputRecord reading operations.
double c0
MPS constant c0 [MPa^-1 * day^-1].
#define _IFT_B3Material_ac
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
#define _IFT_B3Material_shmode
virtual void giveShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode)
Computes, for the given integration point, the strain vector induced by stress-independent shrinkage...
virtual void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Computes the real stress vector for given total strain and integration point.
void zero()
Zeroes all coefficients of receiver.
double inverse_sorption_isotherm(double w)
void times(double s)
Multiplies receiver with scalar.
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
#define _IFT_B3Material_vs
#define _IFT_B3Material_ncoeff
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Domain * giveDomain() const
#define _IFT_B3Material_alpha1
REGISTER_Material(DummyMaterial)
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
virtual void computeCharTimes()
Evaluation of characteristic times.
virtual void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Computes the real stress vector for given total strain and integration point.
virtual const FloatArray & giveViscoelasticStressVector() const
double computeFlowTermViscosity(GaussPoint *gp, TimeStep *tStep)
Evaluation of the flow term viscosity.
the oofem namespace is to define a context or scope in which all oofem names are defined.
double computeMicroPrestress(GaussPoint *gp, TimeStep *tStep, int option)
Computes microprestress at given time step and GP.
#define _IFT_B3Material_wh
int giveNumberOfRows() const
Returns number of rows of receiver.
int nUnits
Number of (Maxwell or Kelvin) units in the rheologic chain.
double w_h
Constant water content (obtained from experiments) w_h [Pedersen, 1990].
virtual void updateEparModuli(double tPrime, GaussPoint *gp, TimeStep *tStep)
Update of partial moduli of individual chain units.
Class representing integration point in finite element program.
#define OOFEM_WARNING(...)
Class representing solution step.
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
Computes the global coordinates from given element's local coordinates.
#define _IFT_B3SolidMaterial_c1
void add(const FloatArray &src)
Adds array src to receiver.
B3SolidMaterialStatus(int n, Domain *d, GaussPoint *g, int nunits)
double tS0
MPS tS0 - necessary for the initial value of microprestress (age when the load is applied) ...
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
#define _IFT_B3SolidMaterial_initialhumidity
void resize(int s)
Resizes receiver towards requested size.
enum oofem::B3SolidMaterial::b3ShModeType shMode