51 if ( result !=
IRRT_OK )
return result;
60 double fc = 0.0, c = 0.0, wc = 0.0, ac = 0.0, alpha1 = 0.0, alpha2 = 0.0;
117 E28 = 4734. * sqrt(fc);
127 double t0,
double alpha1,
double alpha2)
163 q1 = 127 * pow(fc, -0.5);
164 q2 = 185.4 * pow(c, 0.5) * pow(fc, -0.9);
165 q3 = 0.29 * pow(wc, 4.) *
q2;
166 q4 = 20.3 * pow(ac, -0.7);
173 kt = 85000 * pow(t0, -0.08) * pow(fc, -0.25);
174 EpsSinf = alpha1 * alpha2 * ( 1.9e-2 * pow(
w, 2.1) * pow(fc, -0.28) + 270. );
178 q5 = 7.57e5 * ( 1. / fc ) * pow(
EpsSinf, -0.6);
180 OOFEM_LOG_DEBUG(
"B3mat[%d]: estimated params: q1=%lf q2=%lf q3=%lf q4=%lf q5=%lf kt=%lf EpsSinf=%lf\n",
183 OOFEM_LOG_DEBUG(
"B3mat[%d]: estimated params: q1=%lf q2=%lf q3=%lf q4=%lf\n",
196 double Qf, Z,
r, Q, C0, TauSh, St1, St2, H1, H2, Cd;
204 Qf = 1. / ( 0.086 * pow(t_prime, 2. / 9.) + 1.21 * pow(t_prime, 4. / 9.) );
205 Z = pow(t_prime, -m) * log( 1. + pow(t - t_prime, n) );
206 r = 1.7 * pow(t_prime, 0.12) + 8.0;
207 Q = Qf * pow( ( 1. + pow( ( Qf / Z ), r ) ), -1. / r );
209 C0 =
q2 * Q +
q3 *log( 1. + pow ( t - t_prime, n ) ) +
q4 *log(t / t_prime);
215 TauSh =
kt * pow(
ks * 2.0 *
vs, 2.);
216 if ( ( t -
t0 ) >= 0 ) {
217 St1 = tanh( pow( ( t -
t0 ) / TauSh, 1. / 2. ) );
222 if ( ( t_prime -
t0 ) >= 0 ) {
223 St2 = tanh( pow( ( t_prime -
t0 ) / TauSh, 1. / 2. ) );
228 H1 = 1. - ( 1. -
hum ) * St1;
229 H2 = 1. - ( 1. -
hum ) * St2;
230 Cd =
q5 * pow( ( exp(-8.0 * H1) - exp(-8.0 * H2) ), 0.5 );
235 return 1.e-6 * (
q1 + C0 + Cd );
254 if ( ( mode != VM_Total ) && ( mode != VM_Incremental ) ) {
261 if ( ( mode == VM_Incremental ) && ( !tStep->
isTheFirstStep() ) ) {
276 double TauSh, St, kh, help, E607, Et0Tau, EpsShInf, EpsSh;
282 if ( ( mode == _3dShell ) || ( mode == _3dBeam ) || ( mode == _2dPlate ) || ( mode == _2dBeam ) ) {
292 TauSh =
kt * pow(
ks * 2.0 *
vs, 2.);
294 St = tanh( pow( ( time -
t0 ) / TauSh, 1. / 2. ) );
297 kh = 1. - pow(
hum, 3);
298 }
else if (
hum == 1 ) {
302 help = 1. - pow(
hum, 3);
303 kh = help + ( -0.2 - help ) / ( 1. - 0.98 ) * (
hum - 0.98 );
307 E607 =
E28 * pow(607 / ( 4. + 0.85 * 607 ), 0.5);
308 Et0Tau =
E28 * pow( (
t0 + TauSh ) / ( 4. + 0.85 * (
t0 + TauSh ) ), 0.5 );
309 EpsShInf =
EpsSinf * E607 / Et0Tau;
311 EpsSh = -EpsShInf * kh * St;
313 fullAnswer.
at(1) = fullAnswer.
at(2) = fullAnswer.
at(3) = EpsSh * 1.e-6;
326 double sv, sn, et0, et, wrate = 0.0, trate = 0.0, h1;
328 int err, tflag = 0, wflag = 0;
334 if ( ( mmode == _3dShell ) || ( mmode == _3dBeam ) || ( mmode == _2dPlate ) || ( mmode == _2dBeam ) ) {
347 FloatArray gcoords, et2, ei2, stressVector, fullStressVector;
349 if ( ( tf = fm->
giveField(FT_Temperature) ) ) {
352 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Incremental, tStep) ) ) {
353 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
360 if ( ( tf = fm->
giveField(FT_HumidityConcentration) ) ) {
363 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) {
364 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
367 if ( ( err = tf->evaluateAt(ei2, gcoords, VM_Incremental, tStep) ) ) {
368 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
376 if ( ( tflag == 0 ) || ( wflag == 0 ) ) {
392 for (
int i = 1; i <= 3; i++ ) {
393 sv += stressVector.
at(i);
399 h1 =
es0 * ( et0 / et );
400 sn =
sgn(wrate +
at * trate);
402 fullAnswer.
at(1) = h1 * ( 1.0 + sn * (
r * fullStressVector.
at(1) +
rprime * sv ) ) * ( wrate +
at * trate );
403 fullAnswer.
at(2) = h1 * ( 1.0 + sn * (
r * fullStressVector.
at(2) +
rprime * sv ) ) * ( wrate +
at * trate );
404 fullAnswer.
at(3) = h1 * ( 1.0 + sn * (
r * fullStressVector.
at(3) +
rprime * sv ) ) * ( wrate +
at * trate );
410 if ( mode == VM_Incremental ) {
424 fullAnswer.
add(fssv);
439 phi = exp(
a * ( 1.0 - pow( (
w_h / w ), (
n ) ) ) );
441 if ( ( phi < 0.2 ) || ( phi > 0.98 ) ) {
442 OOFEM_ERROR(
"Relative humidity h = %e (w=%e) is out of range", phi, w);
static int giveSizeOfVoigtSymVector(MaterialMode mmode)
Returns the size of symmetric part of a reduced stress/strain vector according to given mode...
double inverse_sorption_isotherm(double w)
Function calculates relative humidity from water content (inverse relation form sorption isotherm)...
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.
#define _IFT_B3Material_hum
std::shared_ptr< Field > FieldPtr
double t0
Age when drying begins (in days)
#define _IFT_B3Material_q2
Domain * domain
Link to domain object, useful for communicating with other FEM components.
#define _IFT_B3Material_EpsSinf
#define _IFT_B3Material_r
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
double & at(int i)
Coefficient access function.
ValueModeType
Type representing the mode of UnknownType or CharType, or similar types.
#define _IFT_B3Material_a
double sgn(double i)
Returns the signum of given value (if value is < 0 returns -1, otherwise returns 1) ...
EngngModel * giveEngngModel()
Returns engineering model to which receiver is associated.
#define _IFT_B3Material_alpha2
double giveTargetTime()
Returns target time.
enum oofem::B3Material::b3ShModeType shMode
#define _IFT_B3Material_ks
Element * giveElement()
Returns corresponding element to receiver.
MaterialMode
Type representing material mode of integration point.
FieldManager * giveFieldManager()
#define OOFEM_LOG_DEBUG(...)
static void giveFullSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the reduced unsymmetric Voigt vector (2nd order tensor) to full form.
bool isTheFirstStep()
Check if receiver is first step.
#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
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
#define _IFT_B3Material_at
virtual void computeTotalAverageShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
#define _IFT_B3Material_q4
EngngModelContext * giveContext()
Context requesting service.
#define _IFT_B3Material_t0
#define _IFT_B3Material_cc
double n
Constant-exponent (obtained from experiments) n [Pedersen, 1990].
#define _IFT_B3Material_fc
virtual double computeCreepFunction(double t, double t_prime, GaussPoint *gp, TimeStep *tStep)
Evaluation of the creep compliance function at time t when loading is acting from time t_prime...
#define _IFT_B3Material_wc
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
FieldPtr giveField(FieldType key)
Returns the previously registered field under given key; NULL otherwise.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
double a
Constant (obtained from experiments) A [Pedersen, 1990].
virtual void computeShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode)
Free shrinkage at material point, requires staggered analysis.
double w_h
Constant water content (obtained from experiments) w_h [Pedersen, 1990].
void predictParametersFrom(double, double, double, double, double, double, double)
#define _IFT_B3Material_q3
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...
Class representing vector of real numbers.
#define _IFT_B3Material_kt
IRResultType
Type defining the return values of InputRecord reading operations.
#define _IFT_B3Material_ac
#define _IFT_B3Material_rprime
#define _IFT_B3Material_shmode
FloatArray * giveShrinkageStrainVector()
void zero()
Zeroes all coefficients of receiver.
#define _IFT_B3Material_vs
#define _IFT_B3Material_ncoeff
#define _IFT_B3Material_alpha1
REGISTER_Material(DummyMaterial)
int giveSize() const
Returns the size of receiver.
virtual const FloatArray & giveViscoelasticStressVector() const
the oofem namespace is to define a context or scope in which all oofem names are defined.
#define _IFT_B3Material_wh
This class implements associated Material Status to MaxwellChainMaterial.
#define _IFT_B3Material_es0
Class representing integration point in finite element program.
Class representing solution step.
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
Computes the global coordinates from given element's local coordinates.
void add(const FloatArray &src)
Adds array src to receiver.
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
void resize(int s)
Resizes receiver towards requested size.