OOFEM 3.0
Loading...
Searching...
No Matches
eurocode2creep.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
35#include "eurocode2creep.h"
36#include "mathfem.h"
37#include "gausspoint.h"
38#include "timestep.h"
39#include "contextioerr.h"
40#include "datastream.h"
41#include "classfactory.h"
42#include "engngm.h"
43
44namespace oofem {
46
47void
48Eurocode2CreepMaterial :: initializeFrom(InputRecord &ir)
49{
51
52 /* scaling factor transforming PREDICTED stiffness Ecm
53 * e.g. if the stiffness should be in MPa, then stiffnessFactor = 1.e6
54 * e.g. if the stiffness should be in Pa, then stiffnessFactor = 1. */
55 this->stiffnessFactor = 1.e6;
57
58 IR_GIVE_FIELD(ir, t0, _IFT_Eurocode2CreepMaterial_t0); // duration of curing (in days)
59 IR_GIVE_FIELD(ir, h0, _IFT_Eurocode2CreepMaterial_h0); // equivalent thickness, in mm !!!
60
64 }
65
66 this->temperatureDependent = false;
68 this->temperatureDependent = true;
69 }
70
71
72 int cemType;
74
75 double henv = 1.;
77
78 // read shrinkage type
79 int sht = 0;
81 if ( sht > 3 ) {
82 OOFEM_ERROR("unsupported shrinkage type");
83 }
84 this->shType = ( ec2ShrinkageType ) sht;
85
87 this->computeShrinkageParams(cemType, henv);
88 this->computeCreepParams(cemType, henv);
89
90 // the initialization of the upper class has to be done here
91 // because RheoChainMat calls at initialization computeCharTimes
92 // but it does not know which method should be chosen (retardation
93 // spectrum switch is initialized here)
94 // initialize Kelvin chain aging material
95 KelvinChainMaterial :: initializeFrom(ir);
96}
97
98
99
100void
101Eurocode2CreepMaterial :: computeElasticityStrengthParams(int cemType)
102{
103 // Ecm28 in GPa (Eurocode formula given in Table 3.1
104 this->Ecm28 = 22. * pow( ( this->fcm28 * ( this->stiffnessFactor / 1.e6 ) / 10. ), 0.3 );
105 this->Ecm28 *= 1.e9 / this->stiffnessFactor; // converted to stiffness units of the analysis
106
107 // "s" is given in 3.2 in section 3.2.1
108 if ( cemType == 1 ) { // class R
109 this->s = 0.2;
110 } else if ( cemType == 2 ) { // class N
111 this->s = 0.25;
112 } else if ( cemType == 3 ) { // class S
113 this->s = 0.38;
114 } else {
115 OOFEM_ERROR("unsupported value of cement type");
116 }
117}
118
119
120void
121Eurocode2CreepMaterial :: computeShrinkageParams(int cemType, double henv)
122{
123 // drying shrinkage (used in B.11)
124 double alpha_ds1, alpha_ds2;
125
126 if ( cemType == 1 ) { // class R
127 alpha_ds1 = 6;
128 alpha_ds2 = 0.11;
129 } else if ( cemType == 2 ) { // class N
130 alpha_ds1 = 4;
131 alpha_ds2 = 0.12;
132 } else if ( cemType == 3 ) { // class S
133 alpha_ds1 = 3;
134 alpha_ds2 = 0.13;
135 } else {
136 OOFEM_ERROR("unsupported value of cement type");
137 }
138
139
140 if ( ( this->shType == EC2_TotalShrinkage ) || ( this->shType == EC2_DryingShrinkage ) ) {
141 // kh from table 3.3
142 if ( this->h0 >= 500 ) {
143 this->kh = 0.7;
144 } else if ( this->h0 >= 300 ) {
145 this->kh = 0.75 - 0.05 * ( h0 - 300. ) / 200.;
146 } else if ( this->h0 >= 200 ) {
147 this->kh = 0.85 - 0.10 * ( h0 - 200. ) / 100.;
148 } else if ( this->h0 >= 100 ) {
149 this->kh = 1.00 - 0.15 * ( h0 - 100. ) / 100.;
150 } else {
151 this->kh = 1.;
152 }
153
154
155 double beta_RH = 1.55 * ( 1. - henv * henv * henv );
156 this->eps_cd_0 = -0.85e-6 * ( ( 220. + 110. * alpha_ds1 ) * exp(-alpha_ds2 * this->fcm28 * ( this->stiffnessFactor / 1.e6 ) / 10.) * beta_RH );
157 }
158
159 if ( ( this->shType == EC2_TotalShrinkage ) || ( this->shType == EC2_AutogenousShrinkage ) ) {
160 // characteristic strength in MPa
161 double fck = this->fcm28 * ( this->stiffnessFactor / 1.e6 ) - 8.;
162 // below 10 MPa no autogenous shrinkage
163 fck = max(fck, 10.);
164
165 this->eps_ca_infty = -2.5e-6 * ( fck - 10. ); // 3.12
166 }
167
168 return;
169}
170
171void
172Eurocode2CreepMaterial :: computeCreepParams(int cemType, double henv)
173{
174 // "alpha_T_cement" influences the equivalent age (B.9)
175
176 if ( cemType == 1 ) { // class R
177 this->alpha_T_cement = 1.;
178 } else if ( cemType == 2 ) { // class N
179 this->alpha_T_cement = 0.;
180 } else if ( cemType == 3 ) { // class S
181 this->alpha_T_cement = -1.;
182 } else {
183 OOFEM_ERROR("unsupported value of cement type");
184 }
185
186 if ( this->fcm28 * ( this->stiffnessFactor / 1.e6 ) > 35. ) {
187 double alpha_1, alpha_2, alpha_3;
188
189 // B.8c
190 alpha_1 = pow( ( 35. / ( this->fcm28 * ( this->stiffnessFactor / 1.e6 ) ) ), 0.7 );
191 alpha_2 = pow( ( 35. / ( this->fcm28 * ( this->stiffnessFactor / 1.e6 ) ) ), 0.2 );
192 alpha_3 = pow( ( 35. / ( this->fcm28 * ( this->stiffnessFactor / 1.e6 ) ) ), 0.5 );
193
194 // influence of relative humidity on drying creep
195 // B.3b
196 this->phi_RH = ( 1. + alpha_1 * ( 1. - henv ) / ( 0.1 * pow(this->h0, 1. / 3.) ) ) * alpha_2;
197
198 // B.8b
199 // in EC there is 0.012 * RH, it is equivalent to 1.2 * henv
200 this->beta_H = 1.5 * this->h0 * ( 1. + pow( ( 1.2 * henv ), 18. ) ) + 250. * alpha_3;
201 this->beta_H = min(this->beta_H, 1500. * alpha_3);
202
203 // convert to proper time units
204 //this->beta_H *= this->timeFactor;
205 // this can't be done here because timeFactor has not been initialized yet! (done in RheoChM)
206 // beta_H remains in days
207 } else {
208 // influence of relative humidity on drying creep
209 // B.3a
210 this->phi_RH = 1. + ( 1. - henv ) / ( 0.1 * pow(this->h0, 1. / 3.) );
211
212 // B.8b
213 // in EC there is 0.012 * RH, it is equivalent to 1.2 * henv
214 this->beta_H = 1.5 * this->h0 * ( 1. + pow( ( 1.2 * henv ), 18. ) ) + 250.;
215 this->beta_H = min(this->beta_H, 1500.);
216
217 // convert to proper time units
218 // this->beta_H *= this->timeFactor;
219 // this can't be done here because timeFactor has not been initialized yet! (done in RheoChM)
220 }
221
222 // B.4
223 this->beta_fcm = 16.8 / sqrt( this->fcm28 * ( this->stiffnessFactor / 1.e6 ) );
224
225 return;
226}
227
228
229double
230Eurocode2CreepMaterial :: computeConcreteStrengthAtAge(double age) const
231{
232 double beta = exp( this->s * ( 1. - sqrt( 28. / ( age / this->timeFactor ) ) ) );
233
234 return beta * this->fcm28;
235}
236
237double
238Eurocode2CreepMaterial :: computeMeanElasticModulusAtAge(double age) const
239{
240 double fcm_at_age;
241 double Ecm_at_age;
242
243 fcm_at_age = this->computeConcreteStrengthAtAge(age);
244 Ecm_at_age = pow( ( fcm_at_age / this->fcm28 ), 0.3 ) * this->Ecm28;
245
246 return Ecm_at_age;
247}
248
249double
250Eurocode2CreepMaterial :: computeCreepFunction(double t, double t_prime, GaussPoint *gp, TimeStep *tStep) const
251// compute the value of the creep function of concrete
252// corresponding to the given load duration (in days)
253// t-t_prime = duration of loading
254
255{
256 // elastic modulus isn not temperature adjusted too
257 double J = 1. / this->computeMeanElasticModulusAtAge(t_prime) +
258 this->computeCreepCoefficient(t, t_prime, gp, tStep) / ( 1.05 * this->Ecm28 );
259 return J;
260}
261
262
263double
264Eurocode2CreepMaterial :: computeCreepCoefficient(double t, double t_prime, GaussPoint *gp, TimeStep *tStep) const
265// compute the value of the creep coefficient
266// corresponding to the given load duration (in days)
267// t-t_prime = duration of loading
268
269{
270 double t_prime_equiv = temperatureDependent ? this->computeEquivalentAge(gp, tStep) : t_prime;
271
272 // B.5
273 double beta_t0 = 1. / ( 0.1 + pow(t_prime_equiv / this->timeFactor, 0.2) );
274
275 // B.7
276 double beta_c = pow( ( ( t - t_prime ) / ( this->beta_H * this->timeFactor + t - t_prime ) ), 0.3 );
277
278 // t-t'_prime should not be temperature-adjusted (so says the EC)
279
280 // B.1 + B.2
281 return this->phi_RH * this->beta_fcm * beta_t0 * beta_c;
282}
283
284
285
286// implements B.10
287double
288Eurocode2CreepMaterial :: computeEquivalentMaturity(GaussPoint *gp, TimeStep *tStep) const
289{
290 Eurocode2CreepMaterialStatus *status = static_cast< Eurocode2CreepMaterialStatus * >( this->giveStatus(gp) );
291
292 FloatArray et;
293
294 double initMaturity, incrMaturity;
295 double averageTemperature;
296
297 // Element *elem = gp->giveElement();
298 StructuralElement *selem = dynamic_cast< StructuralElement * >( gp->giveElement() );
299
300 selem->computeResultingIPTemperatureAt(et, tStep, gp, VM_Total);
301
302 if ( tStep->isTheFirstStep() || ( ! Material :: isActivated( tStep->givePreviousStep() ) ) ) {
303 initMaturity = this->relMatAge;
304 averageTemperature = et.at(1);
305 } else {
306 initMaturity = status->giveConcreteMaturity();
307 averageTemperature = ( et.at(1) + status->giveTemperature() ) / 2.;
308 }
309
310 averageTemperature = min(averageTemperature, 80.);
311 averageTemperature = max(averageTemperature, 0.);
312
313 incrMaturity = exp( -1. * ( 4000. / ( 273. + averageTemperature ) - 13.65 ) ) * tStep->giveTimeIncrement();
314
315 status->setTempConcreteMaturity(initMaturity + incrMaturity); // full increment - for updating
316 status->setTempTemperature( et.at(1) );
317
318 // middle of the step
319 return initMaturity + incrMaturity / 2.;
320}
321
322
323// implements B.9
324double
325Eurocode2CreepMaterial :: computeEquivalentAge(GaussPoint *gp, TimeStep *tStep) const
326{
327 double maturity = this->computeEquivalentMaturity(gp, tStep);
328
329 double age = maturity * pow( ( 9. / ( 2. + pow(maturity, 1.2) ) + 1. ), this->alpha_T_cement );
330 return max(age, 0.5);
331}
332
333
334
335double
336Eurocode2CreepMaterial :: giveEModulus(GaussPoint *gp, TimeStep *tStep) const
337{
338 /*
339 * This function returns the incremental modulus for the given time increment.
340 * The modulus may also depend on the specimen geometry (gp - dependence).
341 *
342 * It is stored as "Einc" for further expected requests from other gaussPoints that correspond to the same material.
343 *
344 * Note: time -1 refers to the previous time.
345 */
346
347 // !!! chartime exponents are assumed to be equal to 1 !!!
348
349 double chainStiffness = 0.;
350
351 if ( !Material :: isActivated(tStep) ) {
352 return 1.; // stresses are cancelled in giveRealStressVector;
353 }
354
355 // updateEparModuli is called in KelvinChainMaterial
356 chainStiffness = KelvinChainMaterial :: giveEModulus(gp, tStep);
357
358 if ( retardationSpectrumApproximation ) { //retardation spectrum used
359 double sum;
360 double t_halfstep;
361
362 sum = 1. / chainStiffness; // convert stiffness into compliance
363
364 sum += 1 / this->EspringVal; // add zeroth unit
365
366 t_halfstep = this->relMatAge - this->castingTime + ( tStep->giveTargetTime() - 0.5 * tStep->giveTimeIncrement() );
367
368 if ( t_halfstep <= 0. ) {
369 OOFEM_ERROR("attempt to evaluate material stiffness at negative age");
370 }
371
372 sum += 1. / this->computeMeanElasticModulusAtAge(t_halfstep); // add initial compliance
373
374 // convert to stiffness
375 chainStiffness = 1. / sum;
376 }
377
378 return chainStiffness;
379}
380
381
382void
383Eurocode2CreepMaterial :: computeCharTimes()
384{
385 /*
386 * This function generates discrete characteristic times
387 * according to rules which guarantee a good approximation
388 * of the relaxation or creep function by the Dirichlet series
389 */
390
391 int j;
392
393 if ( this->begOfTimeOfInterest == -1. ) {
394 this->begOfTimeOfInterest = 0.001 * this->timeFactor;
395 }
396
397 if ( this->endOfTimeOfInterest == -1. ) {
398 this->endOfTimeOfInterest = 10000. * this->timeFactor;
399 }
400
401
402 // perhaps different values should be used for moduli computed by the least-squares method
403 // this gives really big mistakes for times near the interest boundary
404
405 if ( retardationSpectrumApproximation ) { //retardation spectrum used
406 if ( this->begOfTimeOfInterest > 1.0 * this->timeFactor ) {
407 OOFEM_WARNING("begOfTimeOfInterest was chosen bigger than 1 days, reseting its value to 1 days (could have lead to big errors in the numerical integration of the stiffness of the zeroth Kelvin unit (the retardation spectrum is very steep)");
408 this->begOfTimeOfInterest = 1.0 * this->timeFactor;
409 }
410
411 this->tau1 = this->begOfTimeOfInterest;
412 } else {
413 this->tau1 = this->begOfTimeOfInterest / 10.;
414 }
415
416 //first retardation can be treated as equal to begOfTimeOfInterest
417
418
419
420 if ( retardationSpectrumApproximation ) { //retardation spectrum used
421 //the last retardation time has to be bigger than approx sqrt(10) * endOfTimeOfInterest
422 // e.g. if endoftimeofinterest is 10^2, then the last retardation time has to be at least 10^2.5
423 if ( this->endOfTimeOfInterest > pow(10., 5.5) * timeFactor ) {
424 OOFEM_WARNING("endOfTimeOfInterest was chosen bigger than 10.000 days, reseting to 10.000 days (the retardation spectrum is almost zero afterwards)");
425 this->endOfTimeOfInterest = pow(10., 5.5) * timeFactor;
426 }
427 }
428
429 j = 1;
430 while ( this->endOfTimeOfInterest >= this->tau1 * pow(10.0, ( double ) j - 1. - 0.5) ) {
431 j++;
432 }
433
434 this->nUnits = j;
435
436 this->charTimes.resize(this->nUnits);
437 this->charTimes.zero();
438
439 for ( int mu = 1; mu <= this->nUnits; mu++ ) {
440 this->charTimes.at(mu) = this->tau1 * pow(10., mu - 1);
441
442 if ( retardationSpectrumApproximation ) { // apply correction factors
443 this->charTimes.at(mu) *= this->computeRetardationTimeCorrection(mu);
444 }
445 }
446}
447
448
449
450double
451Eurocode2CreepMaterial :: computeRetardationTimeCorrection(int mu) const
452{
453 return 1. + 0.555 * exp( -4. * pow( ( this->tau1 * pow( 10., double( mu - 1 ) ) / ( this->beta_H * this->timeFactor ) ), 2. ) );
454
455
456 //return 1.;
457}
458
459
460double
461Eurocode2CreepMaterial :: evaluateSpectrumAt(double tau) const
462{
463 // second-order approximation of the retardation spectrum
464 double t = 2 * tau;
465 double n = 0.3; // exponent in the model
466
467 // function "t/(beta+t)" and its derivatives
468 double f = t / ( this->beta_H * this->timeFactor + t );
469
470 double df = this->beta_H * this->timeFactor / ( ( this->beta_H * this->timeFactor + t ) * ( this->beta_H * this->timeFactor + t ) );
471
472 double ddf = -2. * this->beta_H * this->timeFactor / ( ( this->beta_H * this->timeFactor + t ) * ( this->beta_H * this->timeFactor + t ) * ( this->beta_H * this->timeFactor + t ) );
473
474 // second derivative of (f(t))^n
475 double ddPhi = n * ( n - 1. ) * pow( f, ( n - 2. ) ) * df * df + n *pow( f, ( n - 1. ) ) * ddf;
476
477 return -4. * tau * tau * ddPhi;
478}
479
480
482Eurocode2CreepMaterial :: computeCharCoefficients(double atTime, GaussPoint *gp, TimeStep *tStep) const
483{
484 /*
485 * If retardationSpectrumApproximation == true then analysis of continuous retardation spectrum is used for
486 * computing characteristic coefficients (moduli) of Kelvin chain
487 * Else least-squares method is used
488 */
490 // all moduli must be multiplied by g(t') / c - see equation (46) in Jirasek's retardation spectrum paper
491
492 const double equivalentAge = temperatureDependent ? this->computeEquivalentAge(gp, tStep) : atTime;
493
494 const double coefficient = 1.05 * this->Ecm28 * ( 0.1 + pow(equivalentAge / this->timeFactor, 0.2) ) / ( this->phi_RH * this->beta_fcm );
495
496
497 // evaluate stiffness of the zero-th unit of the Kelvin chain
498 // (aging elastic spring with retardation time = 0)
499 // this is done employing Simpson's rule. the begOfTimeOfInterest cannot exceed 0.1 day
500 // E0 = EspringVal = int( L, 0, tau1/sqrt(10) )
501
502 const double tau0 = this->tau1 / sqrt(10.0); // upper bound of the integral
503
504 this->EspringVal = 1. / ( ( log(10.) / 3. ) * (
505 this->evaluateSpectrumAt(tau0 * 1.e-8) + 4. * this->evaluateSpectrumAt(tau0 * 1.e-7) +
506 2. * this->evaluateSpectrumAt(tau0 * 1.e-6) + 4. * this->evaluateSpectrumAt(tau0 * 1.e-5) +
507 2. * this->evaluateSpectrumAt(tau0 * 1.e-4) + 4. * this->evaluateSpectrumAt(tau0 * 1.e-3) +
508 2. * this->evaluateSpectrumAt(tau0 * 1.e-2) + 4. * this->evaluateSpectrumAt(tau0 * 1.e-1) +
509 this->evaluateSpectrumAt(tau0) ) );
510
511 this->EspringVal *= coefficient;
512
513 // process remaining units
514 FloatArray answer(nUnits);
515
516 for ( int mu = 1; mu <= this->nUnits; mu++ ) {
517 double tauMu = this->tau1 * pow( 10., double( mu - 1 ) );
518
519 answer.at(mu) = 2. / ( log(10.) * ( this->evaluateSpectrumAt( tauMu * pow(10., -sqrt(3.) / 6.) ) + this->evaluateSpectrumAt( tauMu * pow(10., sqrt(3.) / 6.) ) ) );
520 }
521
522 answer.times(coefficient);
523 return answer;
524 } else { // moduli computed using the least-squares method
525 return KelvinChainMaterial :: computeCharCoefficients(atTime, gp, tStep);
526 }
527}
528
529
530void
531Eurocode2CreepMaterial :: giveShrinkageStrainVector(FloatArray &answer,
532 GaussPoint *gp,
533 TimeStep *tStep,
534 ValueModeType mode) const
535{
536 answer.resize( StructuralMaterial :: giveSizeOfVoigtSymVector( gp->giveMaterialMode() ) );
537 answer.zero();
538
539 if ( ( this->shType == EC2_NoShrinkage ) || ( !this->isActivated(tStep) ) ) {
540 return;
541 }
542
543 if ( ( mode != VM_Total ) && ( mode != VM_Incremental ) ) {
544 OOFEM_ERROR("unsupported mode");
545 }
546
547 FloatArray eps_sh;
548
549 // the relative matereial age can be negative to properly reflect the casting time
550 double dryingTimeNow = ( this->relMatAge - this->castingTime - this->t0 + tStep->giveTargetTime() ) / timeFactor;
551 double autoShrTimeNow = ( this->relMatAge - this->castingTime + tStep->giveTargetTime() ) / this->timeFactor;
552
553 if ( mode == VM_Incremental ) {
554 double dt = tStep->giveTimeIncrement() / this->timeFactor;
555
556 if ( dryingTimeNow > 0. ) {
557 if ( ( this->shType == EC2_TotalShrinkage ) || ( this->shType == EC2_DryingShrinkage ) ) {
558 this->computeIncrementOfDryingShrinkageVector(eps_sh, gp, dryingTimeNow, max(dryingTimeNow - dt, 0.));
559 answer.add(eps_sh);
560 }
561 }
562
563 if ( autoShrTimeNow > 0. ) {
564 if ( ( this->shType == EC2_TotalShrinkage ) || ( this->shType == EC2_AutogenousShrinkage ) ) {
565 this->computeIncrementOfAutogenousShrinkageVector(eps_sh, gp, autoShrTimeNow, max(autoShrTimeNow - dt, 0.));
566 answer.add(eps_sh);
567 }
568 }
569 } else { // total
570 if ( dryingTimeNow > 0. ) {
571 if ( ( this->shType == EC2_TotalShrinkage ) || ( this->shType == EC2_DryingShrinkage ) ) {
572 this->computeIncrementOfDryingShrinkageVector( eps_sh, gp, dryingTimeNow, max(0., ( this->relMatAge - this->t0 ) / this->timeFactor) );
573 answer.add(eps_sh);
574 }
575 }
576
577 if ( autoShrTimeNow > this->relMatAge ) {
578 if ( ( this->shType == EC2_TotalShrinkage ) || ( this->shType == EC2_AutogenousShrinkage ) ) {
579 this->computeIncrementOfAutogenousShrinkageVector(eps_sh, gp, autoShrTimeNow, this->relMatAge / this->timeFactor);
580 answer.add(eps_sh);
581 }
582 }
583 }
584
585 if ( answer.at(1) != answer.at(1) ) {
586 OOFEM_ERROR("shrinkage is NaN: %f", answer.at(1));
587 }
588}
589
590void
591Eurocode2CreepMaterial :: computeIncrementOfDryingShrinkageVector(FloatArray &answer, GaussPoint *gp, double tNow, double tThen) const
592{
593 int size;
594 MaterialMode mode = gp->giveMaterialMode();
595
596 if ( ( mode == _3dShell ) || ( mode == _3dBeam ) || ( mode == _2dPlate ) || ( mode == _2dBeam ) ) {
597 size = 12;
598 } else {
599 size = 6;
600 }
601
602 FloatArray fullAnswer(size);
603
604 if ( tNow > tThen ) {
605 // B.10
606 double beta_ds_now = tNow / ( tNow + 0.04 * pow(this->h0, 3. / 2.) );
607 double beta_ds_then = tThen / ( tThen + 0.04 * pow(this->h0, 3. / 2.) );
608
609 double dEpsSh = ( beta_ds_now - beta_ds_then ) * this->kh * this->eps_cd_0;
610
611 fullAnswer.at(1) = fullAnswer.at(2) = fullAnswer.at(3) = dEpsSh;
612 }
613
614 StructuralMaterial :: giveReducedSymVectorForm( answer, fullAnswer, gp->giveMaterialMode() );
615}
616
617
618void
619Eurocode2CreepMaterial :: computeIncrementOfAutogenousShrinkageVector(FloatArray &answer, GaussPoint *gp, double tNow, double tThen) const
620{
621 int size;
622 MaterialMode mode = gp->giveMaterialMode();
623
624 if ( ( mode == _3dShell ) || ( mode == _3dBeam ) || ( mode == _2dPlate ) || ( mode == _2dBeam ) ) {
625 size = 12;
626 } else {
627 size = 6;
628 }
629
630 FloatArray fullAnswer(size);
631
632 if ( tNow > tThen ) {
633 // B.13
634 double beta_as_now = 1. - exp( -0.2 * sqrt(tNow) );
635 double beta_as_then = 1. - exp( -0.2 * sqrt(tThen) );
636
637 double dEpsAu = ( beta_as_now - beta_as_then ) * this->eps_ca_infty;
638
639 fullAnswer.at(1) = fullAnswer.at(2) = fullAnswer.at(3) = dEpsAu;
640 }
641
642 StructuralMaterial :: giveReducedSymVectorForm( answer, fullAnswer, gp->giveMaterialMode() );
643}
644
645
646std::unique_ptr<MaterialStatus>
647Eurocode2CreepMaterial :: CreateStatus(GaussPoint *gp) const
648{
649 return std::make_unique<Eurocode2CreepMaterialStatus>(gp, nUnits);
650}
651
652
653void
654Eurocode2CreepMaterial :: giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const
655{
656 KelvinChainMaterial :: giveRealStressVector(answer, gp, reducedStrain, tStep);
657
658 if ( !this->isActivated(tStep) ) {
659 return;
660 }
661}
662
663
664/****************************************************************************************/
665/********** Eurocode2CreepMaterialStatus - HUMIDITY ****************************************/
666
667void
668Eurocode2CreepMaterialStatus :: updateYourself(TimeStep *tStep)
669{
671 tempMaturity = 0.;
672
674 tempTemperature = 0.;
675
676 KelvinChainMaterialStatus :: updateYourself(tStep);
677}
678
679
680void
681Eurocode2CreepMaterialStatus :: saveContext(DataStream &stream, ContextMode mode)
682{
683 KelvinChainMaterialStatus :: saveContext(stream, mode);
684
685 if ( !stream.write(maturity) ) {
687 }
688
689 if ( !stream.write(temperature) ) {
691 }
692}
693
694void
695Eurocode2CreepMaterialStatus :: restoreContext(DataStream &stream, ContextMode mode)
696{
697 KelvinChainMaterialStatus :: restoreContext(stream, mode);
698
699 if ( !stream.read(maturity) ) {
701 }
702
703 if ( !stream.read(temperature) ) {
705 }
706}
707} // end namespace oofem
#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.
double maturity
temperature-dependent equivalent age, maturity (equilibrated value)
double temperature
temperature (equilibrated value)
double tempTemperature
temperature (temporary value)
double tempMaturity
temperature-dependent equivalent age, maturity (temporary value)
void computeCreepParams(int, double)
sets parameters for creep according to formulas from EC
void computeShrinkageParams(int, double)
sets parameters for shrinkage according to formulas from EC
double alpha_T_cement
influence of cement type on concrete equivalent age, B.9 in EC2
double eps_ca_infty
asymptotic value of autogenous shrinakge, 3.12 in EC2
double kh
drying shrinkage coefficient
double fcm28
mean compressive strength at 28 days default - to be specified in units of the analysis (e....
double computeRetardationTimeCorrection(int mu) const
computes correction factor which multiplies the retardation times
virtual double computeEquivalentAge(GaussPoint *gp, TimeStep *tStep) const
implements B.9
double h0
effective thickness [mm]
double Ecm28
Young's modulus at 28 days default [MPa].
double s
parameter determined by cement type
void computeIncrementOfDryingShrinkageVector(FloatArray &answer, GaussPoint *gp, double tNow, double tThen) const
computes increment of drying shrinkage - the shrinkage strain is isotropic
double t0
duration of curing [day, sec, ...]
void computeElasticityStrengthParams(int)
sets parameters for elasticity and strength according to formulas from EC
double evaluateSpectrumAt(double tau) const
evaluates retardation spectrum at given time (t-t')
virtual double computeConcreteStrengthAtAge(double age) const
evaluates concrete strength at given age
virtual double computeMeanElasticModulusAtAge(double age) const
evaluates concrete mean elastic modulus at given age
double eps_cd_0
asymptotic value of drying shrinkage at zero relative humidity, B.11 in EC2
double stiffnessFactor
factor unifying stiffnesses (Ecm is predicted from fcm...)
void computeIncrementOfAutogenousShrinkageVector(FloatArray &answer, GaussPoint *gp, double tNow, double tThen) const
computes increment of autogenous shrinkage - the shrinkage strain is isotropic
double tau1
fixed retardation time of the first unit
virtual double computeEquivalentMaturity(GaussPoint *gp, TimeStep *tStep) const
implements B.10
double phi_RH
drying creep coefficient
double beta_fcm
drying creep coefficient
double EspringVal
stiffness of the zeroth Kelvin unit
enum oofem::Eurocode2CreepMaterial::ec2ShrinkageType shType
virtual double computeCreepCoefficient(double t, double t_prime, GaussPoint *gp, TimeStep *tStep) const
Evaluation of the compliance function (according to appendix B from the EC).
bool temperatureDependent
switch for temperature dependence of concrete maturity (default option is off)
double beta_H
drying creep coefficient
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void add(const FloatArray &src)
Definition floatarray.C:218
void times(double s)
Definition floatarray.C:834
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition gausspoint.h:190
Element * giveElement()
Returns corresponding element to receiver.
Definition gausspoint.h:187
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
double castingTime
Definition material.h:115
bool isActivated(TimeStep *tStep) const override
Extended meaning: returns true if the material is cast (target time > casting time) or the precasing ...
Definition rheoChM.h:321
int nUnits
Number of (Maxwell or Kelvin) units in the rheologic chain.
Definition rheoChM.h:145
double relMatAge
Physical age of the material at castingTime.
Definition rheoChM.h:147
double endOfTimeOfInterest
Time (age???) up to which the model should give a good approximation.
Definition rheoChM.h:160
double begOfTimeOfInterest
Time from which the model should give a good approximation. Optional field. Default value is 0....
Definition rheoChM.h:158
FloatArray charTimes
Characteristic times of individual units (relaxation or retardation times).
Definition rheoChM.h:169
virtual void computeResultingIPTemperatureAt(FloatArray &answer, TimeStep *tStep, GaussPoint *gp, ValueModeType mode)
double giveTimeIncrement()
Returns solution step associated time increment.
Definition timestep.h:168
double giveTargetTime()
Returns target time.
Definition timestep.h:164
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
Definition timestep.C:132
bool isTheFirstStep()
Definition timestep.C:148
#define THROW_CIOERR(e)
#define OOFEM_WARNING(...)
Definition error.h:80
#define OOFEM_ERROR(...)
Definition error.h:79
#define _IFT_Eurocode2CreepMaterial_shType
#define _IFT_Eurocode2CreepMaterial_fcm28
#define _IFT_Eurocode2CreepMaterial_t0
#define _IFT_Eurocode2CreepMaterial_spectrum
#define _IFT_Eurocode2CreepMaterial_h0
#define _IFT_Eurocode2CreepMaterial_henv
#define _IFT_Eurocode2CreepMaterial_stiffnessFactor
#define _IFT_Eurocode2CreepMaterial_cemType
#define _IFT_Eurocode2CreepMaterial_temperatureDependent
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define IR_GIVE_FIELD(__ir, __value, __id)
Definition inputrecord.h:67
long ContextMode
Definition contextmode.h:43
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
double sum(const FloatArray &x)
@ CIO_IOERR
General IO error.

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011