OOFEM 3.0
Loading...
Searching...
No Matches
b3mat.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 "b3mat.h"
36#include "mathfem.h"
37#include "gausspoint.h"
38#include "timestep.h"
39#include "classfactory.h"
40#include "engngm.h"
41
42namespace oofem {
44
45void
46B3Material :: initializeFrom(InputRecord &ir)
47{
48 MaxwellChainMaterial :: initializeFrom(ir);
49
50 //
51 // NOTE
52 //
53 // this material model is unit dependent!
54 // units must be in MPa, m, MN.
55 //
56 //
57 double fc = 0.0, c = 0.0, wc = 0.0, ac = 0.0, alpha1 = 0.0, alpha2 = 0.0;
58
59 int mode = 0;
61 IR_GIVE_FIELD(ir, t0, _IFT_B3Material_t0); // age when drying begins (in days)
62 IR_GIVE_FIELD(ir, fc, _IFT_B3Material_fc); // 28-day standard mean cylinder compression strength in MPa //needed for E28
63 if ( mode == 0 ) { // default, determine raw params q1,..,q5 from composition
64 IR_GIVE_FIELD(ir, c, _IFT_B3Material_cc); // cement content of concrete in kg m^-3.
65 IR_GIVE_FIELD(ir, wc, _IFT_B3Material_wc); // ratio (by weight) of water to cementitious material
66 IR_GIVE_FIELD(ir, ac, _IFT_B3Material_ac); // ratio (by weight) of aggregate to cement
67 } else { // read raw Basic creep parameters
72 }
73
74 // read shrinkage mode
75 int shm = 0;
77 this->shMode = ( b3ShModeType ) shm;
78
79 if ( this->shMode == B3_PointShrinkage ) {
80 // read additional shrinkage params required
85 // read sorption isotherm data
89 } else if ( this->shMode == B3_AverageShrinkage ) {
90 if ( mode == 0 ) { // default mode
91 IR_GIVE_FIELD(ir, alpha1, _IFT_B3Material_alpha1); // shrinkage parameter
92 IR_GIVE_FIELD(ir, alpha2, _IFT_B3Material_alpha2); // shrinkage parameter
93 IR_GIVE_FIELD(ir, ks, _IFT_B3Material_ks); //cross section shape factor
94 /*
95 * use ks = 1.0 for an infinite slab
96 * = 1.15 for an infinite cylinder
97 * = 1.25 for an infinite square prism
98 * = 1.30 for a sphere
99 * = 1.55 for a cube
100 */
101 IR_GIVE_FIELD(ir, hum, _IFT_B3Material_hum); // relative humidity of the environment
102 IR_GIVE_FIELD(ir, vs, _IFT_B3Material_vs); // volume to surface ratio (in m)
103 } else { // read raw params
104 IR_GIVE_FIELD(ir, kt, _IFT_B3Material_kt); // shrinkage parameter
105 IR_GIVE_FIELD(ir, EpsSinf, _IFT_B3Material_EpsSinf); // shrinkage parameter
106 IR_GIVE_FIELD(ir, q5, _IFT_B3Material_q5); // shrinkage parameter
107 IR_GIVE_FIELD(ir, vs, _IFT_B3Material_vs); // volume to surface ratio (in m)
108 IR_GIVE_FIELD(ir, ks, _IFT_B3Material_ks); //cross section shape factor
109 IR_GIVE_FIELD(ir, hum, _IFT_B3Material_hum); // relative humidity of the environment
110 }
111 }
112
113 w = wc * c;
114 E28 = 4734. * sqrt(fc); // or 4733. ?
115 if ( mode == 0 ) {
116 this->predictParametersFrom(fc, c, wc, ac, t0, alpha1, alpha2);
117 }
118}
119
120void
121B3Material :: predictParametersFrom(double fc, double c, double wc, double ac,
122 double t0, double alpha1, double alpha2)
123{
124 /*
125 * Prediction of model parameters - estimation from concrete composition
126 * and strength
127 *
128 * fc - 28-day standard cylinder compression strength in MPa
129 * c - cement content of concrete in kg m^-3.
130 * wc - ratio (by weight) of water to cementitious material
131 * ac - ratio (by weight) of agregate to cement
132 * t0 - age when drying begins (in days)
133 * alpha1, alpha2 - shrinkage parameters
134 *
135 * The prediction of the material parameters of the present model
136 * is restricted to Portland cement concretes with the following
137 * parameter ranges:
138 *
139 * 2500 <= fc <= 10000 [psi] (psi = 6895 Pa)
140 * 10 <= c <= 45 [lb ft-3] (lb ft-3 = 16.03 kg m-3)
141 * 0.3 <= wc <= 0.85
142 * 2.5 <= ac <= 13.5
143 *
144 *
145 * alpha1 = 1.0 for type I cement;
146 * = 0.85 for type II cement;
147 * = 1.1 for type III cement;
148 *
149 * alpha2 = 0.75 for steam-cured specimens;
150 * = 1.2 for specimens sealed during curing;
151 * = 1.0 for specimens cured in water or 100% relative humidity.
152 *
153 */
154
155 // Basic creep parameters
156
157 // q1 = 0.6e6 / E28;
158 q1 = 127 * pow(fc, -0.5);
159 q2 = 185.4 * pow(c, 0.5) * pow(fc, -0.9);
160 q3 = 0.29 * pow(wc, 4.) * q2;
161 q4 = 20.3 * pow(ac, -0.7);
162
163 // Shrinkage
164
165 if ( this->shMode == B3_AverageShrinkage ) {
166 // the exact value converted from US units would be 85220
167 // but this is the SI formula presented in Inelastic Analysis
168 kt = 85000 * pow(t0, -0.08) * pow(fc, -0.25);
169 EpsSinf = alpha1 * alpha2 * ( 1.9e-2 * pow(w, 2.1) * pow(fc, -0.28) + 270. );
170
171 // Creep at drying
172
173 q5 = 7.57e5 * ( 1. / fc ) * pow(EpsSinf, -0.6);
174
175 OOFEM_LOG_DEBUG("B3mat[%d]: estimated params: q1 %lf q2 %lf q3 %lf q4 %lf q5 %lf kt %lf EpsSinf %lf\n",
176 this->number, q1, q2, q3, q4, q5, kt, EpsSinf);
177 } else {
178 OOFEM_LOG_DEBUG("B3mat[%d]: estimated params: q1 %lf q2 %lf q3 %lf q4 %lf\n",
179 this->number, q1, q2, q3, q4);
180 }
181}
182
183
184double
185B3Material :: computeCreepFunction(double t, double t_prime, GaussPoint *gp, TimeStep *tStep) const
186{
187 // computes the value of creep function at time t
188 // when load is acting from time t_prime
189 // t-t_prime = duration of loading
190
191 double m = 0.5;
192 double n = 0.1;
193
194 // basic creep
195
196 double Qf = 1. / ( 0.086 * pow(t_prime, 2. / 9.) + 1.21 * pow(t_prime, 4. / 9.) );
197 double Z = pow(t_prime, -m) * log( 1. + pow(t - t_prime, n) );
198 double r = 1.7 * pow(t_prime, 0.12) + 8.0;
199 double Q = Qf * pow( ( 1. + pow( ( Qf / Z ), r ) ), -1. / r );
200
201 double C0 = q2 * Q + q3 *log( 1. + pow ( t - t_prime, n ) ) + q4 *log(t / t_prime);
202
203 double Cd;
204 if ( this->shMode == B3_AverageShrinkage ) {
205 // Aditional creep due to drying
206
207 double TauSh = kt * pow(ks * 2.0 * vs, 2.);
208 double St1;
209 if ( ( t - t0 ) >= 0 ) {
210 St1 = tanh( pow( ( t - t0 ) / TauSh, 1. / 2. ) );
211 } else {
212 St1 = 0.0;
213 }
214
215 double St2;
216 if ( ( t_prime - t0 ) >= 0 ) {
217 St2 = tanh( pow( ( t_prime - t0 ) / TauSh, 1. / 2. ) );
218 } else {
219 St2 = 0.0;
220 }
221
222 double H1 = 1. - ( 1. - hum ) * St1;
223 double H2 = 1. - ( 1. - hum ) * St2;
224 Cd = q5 * pow( ( exp(-8.0 * H1) - exp(-8.0 * H2) ), 0.5 );
225 } else {
226 Cd = 0.0;
227 }
228
229 return 1.e-6 * ( q1 + C0 + Cd );
230}
231
232
233
234void
235B3Material :: giveShrinkageStrainVector(FloatArray &answer,
236 GaussPoint *gp,
237 TimeStep *tStep,
238 ValueModeType mode) const
239{
240 if ( this->shMode == B3_NoShrinkage ) {
241 answer.resize( StructuralMaterial :: giveSizeOfVoigtSymVector( gp->giveMaterialMode() ) );
242 answer.zero();
243 return;
244 }
245
246 if ( ( mode != VM_Total ) && ( mode != VM_Incremental ) ) {
247 OOFEM_ERROR("unsupported mode");
248 }
249
250 if ( this->shMode == B3_AverageShrinkage ) {
251 this->computeTotalAverageShrinkageStrainVector(answer, gp, tStep);
252
253 if ( ( mode == VM_Incremental ) && ( !tStep->isTheFirstStep() ) ) {
254 FloatArray prevAnswer;
255 this->computeTotalAverageShrinkageStrainVector( prevAnswer, gp, tStep->givePreviousStep() );
256 answer.subtract(prevAnswer);
257 }
258 } else {
259 this->computeShrinkageStrainVector(answer, gp, tStep, mode);
260 }
261}
262
263void
264B3Material :: computeTotalAverageShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) const
265{
266 /*
267 * returns average shrinkage strain vector of cross-section at drying
268 */
269 double time = this->relMatAge - this->castingTime + tStep->giveTargetTime() / timeFactor;
270 int size;
271 MaterialMode mode = gp->giveMaterialMode();
272
273 if ( ( mode == _3dShell ) || ( mode == _3dBeam ) || ( mode == _2dPlate ) || ( mode == _2dBeam ) ) {
274 size = 12;
275 } else {
276 size = 6;
277 }
278
279 FloatArray fullAnswer(size);
280
281 // size dependence
282 double TauSh = kt * pow(ks * 2.0 * vs, 2.);
283 // time curve, check if before t0
284 double St;
285 if (time > t0) {
286 St = tanh( pow( ( time - t0 ) / TauSh, 1. / 2. ) );
287 } else {
288 St = 0.;
289 }
290
291 // humidity dependence
292 double kh;
293 if ( hum <= 0.98 ) {
294 kh = 1. - pow(hum, 3);
295 } else if ( hum == 1 ) {
296 kh = -0.2; // swelling in water
297 } else {
298 // linear interpolation for 0.98 <= h <= 1.
299 double help = 1. - pow(hum, 3);
300 kh = help + ( -0.2 - help ) / ( 1. - 0.98 ) * ( hum - 0.98 );
301 }
302
303 // time dependence of ultimate shrinkage
304 double E607 = E28 * pow(607 / ( 4. + 0.85 * 607 ), 0.5);
305 double Et0Tau = E28 * pow( ( t0 + TauSh ) / ( 4. + 0.85 * ( t0 + TauSh ) ), 0.5 );
306 double EpsShInf = EpsSinf * E607 / Et0Tau;
307 // mean shrinkage in the cross section:
308 double EpsSh = -EpsShInf * kh * St;
309
310 fullAnswer.at(1) = fullAnswer.at(2) = fullAnswer.at(3) = EpsSh * 1.e-6;
311
312 StructuralMaterial :: giveReducedSymVectorForm( answer, fullAnswer, gp->giveMaterialMode() );
313}
314
315void
316B3Material :: computeShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
317{
318 // additional material parameters required:
319 // es0 - final shrinkage at material point
320 // r - coefficient
321 // rprime - coefficient
322 // at - coeff relating stress-induced thermal strain and shrinkage
323 double wrate = 0.0, trate = 0.0;
324 double time = this->relMatAge - this->castingTime + tStep->giveTargetTime() / timeFactor;
325 int tflag = 0, wflag = 0;
326 MaxwellChainMaterialStatus *status = static_cast< MaxwellChainMaterialStatus * >( this->giveStatus(gp) );
327 int size;
328 MaterialMode mmode = gp->giveMaterialMode();
329
330 if ( ( mmode == _3dShell ) || ( mmode == _3dBeam ) || ( mmode == _2dPlate ) || ( mmode == _2dBeam ) ) {
331 size = 12;
332 } else {
333 size = 6;
334 }
335
336 FloatArray fullAnswer(size);
337
338 /* ask for humidity and temperature from external sources, if provided */
339 FieldManager *fm = domain->giveEngngModel()->giveContext()->giveFieldManager();
340 FieldPtr tf;
341 FloatArray gcoords, et2, ei2, stressVector, fullStressVector;
342
343 if ( ( tf = fm->giveField(FT_Temperature) ) ) {
344 // temperature field registered
346 int err;
347 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Incremental, tStep) ) ) {
348 OOFEM_ERROR("tf->evaluateAt failed, error value %d", err);
349 }
350
351 trate = et2.at(1);
352 tflag = 1;
353 }
354
355 if ( ( tf = fm->giveField(FT_HumidityConcentration) ) ) {
356 // temperature field registered
358 int err;
359 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) {
360 OOFEM_ERROR("tf->evaluateAt failed, error value %d", err);
361 }
362
363 if ( ( err = tf->evaluateAt(ei2, gcoords, VM_Incremental, tStep) ) ) {
364 OOFEM_ERROR("tf->evaluateAt failed, error value %d", err);
365 }
366
367 // convert water mass to relative humidity
368 wrate = this->inverse_sorption_isotherm( et2.at(1) ) - this->inverse_sorption_isotherm( et2.at(1) - ei2.at(1) );
369 wflag = 1;
370 }
371
372 if ( ( tflag == 0 ) || ( wflag == 0 ) ) {
373 OOFEM_ERROR("external fields not found");
374 }
375
376 // if ( status->giveStressVector().giveSize() ) {
377 // stressVector = status->giveStressVector();
378 if ( status->giveViscoelasticStressVector().giveSize() ) {
379 stressVector = status->giveViscoelasticStressVector();
380 } else {
381 stressVector.resize( StructuralMaterial :: giveSizeOfVoigtSymVector( gp->giveMaterialMode() ) );
382 stressVector.zero();
383 }
384
385 StructuralMaterial :: giveFullSymVectorForm( fullStressVector, stressVector, gp->giveMaterialMode() );
386 // compute volumetric stress
387 double sv = 0.0;
388 for ( int i = 1; i <= 3; i++ ) {
389 sv += stressVector.at(i);
390 }
391
392 double et = 1. / this->computeCreepFunction(time + 0.01, time, gp, tStep);
393 double et0 = 1. / this->computeCreepFunction(t0 + 0.01, t0, gp, tStep);
394
395 double h1 = es0 * ( et0 / et );
396 double sn = sgn(wrate + at * trate);
397 // compute increment of shrinkage strain
398 fullAnswer.at(1) = h1 * ( 1.0 + sn * ( r * fullStressVector.at(1) + rprime * sv ) ) * ( wrate + at * trate );
399 fullAnswer.at(2) = h1 * ( 1.0 + sn * ( r * fullStressVector.at(2) + rprime * sv ) ) * ( wrate + at * trate );
400 fullAnswer.at(3) = h1 * ( 1.0 + sn * ( r * fullStressVector.at(3) + rprime * sv ) ) * ( wrate + at * trate );
401
402 //fullAnswer.at(4) = h1*(sn*(r* fullStressVector.at(4)))*(wrate+at*trate);
403 //fullAnswer.at(5) = h1*(sn*(r* fullStressVector.at(5)))*(wrate+at*trate);
404 //fullAnswer.at(6) = h1*(sn*(r* fullStressVector.at(6)))*(wrate+at*trate);
405
406 if ( mode == VM_Incremental ) {
407 StructuralMaterial :: giveReducedSymVectorForm( answer, fullAnswer, gp->giveMaterialMode() );
408 return;
409 } else { // total values required
410 FloatArray ssv, fssv;
411 if ( status->giveShrinkageStrainVector()->giveSize() == 0 ) {
412 ssv.resize( StructuralMaterial :: giveSizeOfVoigtSymVector( gp->giveMaterialMode() ) );
413 ssv.zero();
414 } else {
415 ssv = * status->giveShrinkageStrainVector();
416 }
417
418 StructuralMaterial :: giveFullSymVectorForm( fssv, ssv, gp->giveMaterialMode() );
419 // add increment to total values
420 fullAnswer.add(fssv);
421
422 StructuralMaterial :: giveReducedSymVectorForm( answer, fullAnswer, gp->giveMaterialMode() );
423 return;
424 }
425}
426
427double
428B3Material :: inverse_sorption_isotherm(double w) const
429{
430 // w_h, n, a ... constants obtained from experiments
431 // relative humidity
432 double phi = exp( a * ( 1.0 - pow( ( w_h / w ), ( n ) ) ) );
433
434 if ( ( phi < 0.2 ) || ( phi > 0.98 ) ) {
435 OOFEM_ERROR("Relative humidity h = %e (w=%e) is out of range", phi, w);
436 }
437
438 return phi;
439}
440} // end namespace oofem
#define _IFT_B3Material_vs
Definition b3mat.h:61
#define _IFT_B3Material_es0
Definition b3mat.h:50
#define _IFT_B3Material_EpsSinf
Definition b3mat.h:68
#define _IFT_B3Material_ncoeff
Definition b3mat.h:55
#define _IFT_B3Material_ac
Definition b3mat.h:48
#define _IFT_B3Material_alpha2
Definition b3mat.h:58
#define _IFT_B3Material_r
Definition b3mat.h:51
#define _IFT_B3Material_wc
Definition b3mat.h:47
#define _IFT_B3Material_q2
Definition b3mat.h:63
#define _IFT_B3Material_kt
Definition b3mat.h:67
#define _IFT_B3Material_q5
Definition b3mat.h:66
#define _IFT_B3Material_rprime
Definition b3mat.h:52
#define _IFT_B3Material_cc
Definition b3mat.h:46
#define _IFT_B3Material_q1
Definition b3mat.h:62
#define _IFT_B3Material_fc
Definition b3mat.h:45
#define _IFT_B3Material_q3
Definition b3mat.h:64
#define _IFT_B3Material_at
Definition b3mat.h:53
#define _IFT_B3Material_mode
Definition b3mat.h:43
#define _IFT_B3Material_q4
Definition b3mat.h:65
#define _IFT_B3Material_a
Definition b3mat.h:56
#define _IFT_B3Material_hum
Definition b3mat.h:60
#define _IFT_B3Material_wh
Definition b3mat.h:54
#define _IFT_B3Material_t0
Definition b3mat.h:49
#define _IFT_B3Material_shmode
Definition b3mat.h:44
#define _IFT_B3Material_alpha1
Definition b3mat.h:57
#define _IFT_B3Material_ks
Definition b3mat.h:59
#define REGISTER_Material(class)
virtual void computeShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
Free shrinkage at material point, requires staggered analysis.
Definition b3mat.C:316
double t0
Age when drying begins (in days).
Definition b3mat.h:78
double a
Constant (obtained from experiments) A [Pedersen, 1990].
Definition b3mat.h:95
void predictParametersFrom(double, double, double, double, double, double, double)
Definition b3mat.C:121
virtual void computeTotalAverageShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) const
Definition b3mat.C:264
double inverse_sorption_isotherm(double w) const
Definition b3mat.C:428
double computeCreepFunction(double t, double t_prime, GaussPoint *gp, TimeStep *tStep) const override
Evaluation of the creep compliance function at time t when loading is acting from time t_prime.
Definition b3mat.C:185
double w_h
Constant water content (obtained from experiments) w_h [Pedersen, 1990].
Definition b3mat.h:93
enum oofem::B3Material::b3ShModeType shMode
double rprime
Definition b3mat.h:89
@ B3_AverageShrinkage
Definition b3mat.h:82
double EpsSinf
Definition b3mat.h:85
double n
Constant-exponent (obtained from experiments) n [Pedersen, 1990].
Definition b3mat.h:94
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
Definition element.C:1225
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition femcmpnn.h:79
int number
Component number.
Definition femcmpnn.h:77
FieldPtr giveField(FieldType key)
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void add(const FloatArray &src)
Definition floatarray.C:218
void subtract(const FloatArray &src)
Definition floatarray.C:320
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
Definition gausspoint.h:138
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition gausspoint.h:190
Element * giveElement()
Returns corresponding element to receiver.
Definition gausspoint.h:187
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
double castingTime
Definition material.h:115
FloatArray * giveShrinkageStrainVector()
Definition rheoChM.h:108
virtual const FloatArray & giveViscoelasticStressVector() const
Definition rheoChM.h:101
double relMatAge
Physical age of the material at castingTime.
Definition rheoChM.h:147
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 OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define IR_GIVE_FIELD(__ir, __value, __id)
Definition inputrecord.h:67
#define OOFEM_LOG_DEBUG(...)
Definition logger.h:144
double sgn(double i)
Returns the signum of given value (if value is < 0 returns -1, otherwise returns 1).
Definition mathfem.h:104
std::shared_ptr< Field > FieldPtr
Definition field.h:78

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