OOFEM 3.0
Loading...
Searching...
No Matches
concretefcmviscoelastic.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
36#include "gausspoint.h"
37#include "mathfem.h"
38#include "classfactory.h"
39#include "contextioerr.h"
41
42namespace oofem {
44
47
48
49void
81
82
83double
85{
86 return ConcreteFCM::give(aProperty, gp);
87}
88
89
90void
92 const FloatArray &totalStrain,
93 TimeStep *tStep) const
94{
96
97 RheoChainMaterial *rheoMat = static_cast< RheoChainMaterial * >( domain->giveMaterial(this->viscoMat) );
98
99 FloatArray partialStrain;
100 FloatArray viscoStress;
101
102 FCMMaterial::giveRealStressVector(answer, gp, totalStrain, tStep);
103
104 partialStrain = totalStrain;
105
106 if ( status->giveNumberOfTempCracks() > 0 ) {
107 FloatArray crackStrain;
109 // from local to global
110 // crackStrain.rotatedWith(epsL2G, 'n');
111 crackStrain.beProductOf( epsL2G, status->giveTempCrackStrainVector() );
112 partialStrain.subtract(crackStrain);
113 }
114
115 // viscoStress should be equal to answer - this method is called only for updating
116 rheoMat->giveRealStressVector(viscoStress, status->giveSlaveGaussPointVisco(), partialStrain, tStep);
117
118 return;
119}
120
123{
124 // temperature strain is treated ONLY by the rheoMat
125
126 if ( !this->isActivated(tStep) ) {
127 return FloatArray();
128 }
129
131
132 RheoChainMaterial *rheoMat = static_cast< RheoChainMaterial * >( domain->giveMaterial(this->viscoMat) );
133
134 return rheoMat->computeStressIndependentStrainVector(status->giveSlaveGaussPointVisco(), tStep, mode);
135}
136
137
138int
140{
142
143 if ( type == IST_TensileStrength ) {
144 answer.resize(1);
145 answer.at(1) = status->giveTensileStrength();
146 return 1;
147 } else if ( type == IST_ResidualTensileStrength ) {
148 double sigma;
149 int nCracks;
150 double emax;
151
152 nCracks = status->giveNumberOfTempCracks();
153 sigma = status->giveTensileStrength();
154
155 for ( int i = 1; i <= nCracks; i++ ) {
156 emax = status->giveMaxCrackStrain(i);
157
158 if ( emax > 0. ) {
159 // normalisation wrt crack number is done inside the function
160 // emax /= this->giveNumberOfCracksInDirection(gp, i);
161
162 sigma = this->giveNormalCrackingStress(gp, tStep, emax, i);
163 sigma = min(sigma, this->giveTensileStrength(gp, tStep) );
164 }
165 }
166
167 answer.resize(1);
168 answer.zero();
169 answer.at(1) = sigma;
170
171 return 1;
172 } else if ( type == IST_CrackIndex ) {
173 answer.resize(1);
174 answer.zero();
175
176 // cracking is initiated
177 if ( status->giveNumberOfCracks() ) {
178 answer.at(1) = 1.;
179 } else {
180 FloatArray sigma;
181 FloatArray princStress;
183 this->computePrincipalValues(princStress, sigma, principal_stress);
184 answer.at(1) = max( 0., princStress.at(1) / status->giveTensileStrength() );
185 }
186 return 1;
187 }
188
189 // if ( ( type == IST_DryingShrinkageTensor ) ||
190 // ( type == IST_AutogenousShrinkageTensor ) ||
191 // ( type == IST_TotalShrinkageTensor ) ||
192 // ( type == IST_CreepStrainTensor ) ||
193 // ( type == IST_DryingShrinkageTensor ) ||
194 // ( type == IST_ThermalStrainTensor ) ) {
195
196 RheoChainMaterial *rheoMat = static_cast< RheoChainMaterial * >( domain->giveMaterial(this->viscoMat) );
197 if ( rheoMat->giveIPValue(answer, status->giveSlaveGaussPointVisco(), type, tStep) ) {
198 return 1;
199 }
200
201 return ConcreteFCM::giveIPValue(answer, gp, type, tStep);
202}
203
204
205
208{
209 if (gp->hasMaterialStatus()) {
210 return static_cast< MaterialStatus * >( gp->giveMaterialStatus() );
211 } else {
212 MaterialStatus *status = static_cast<MaterialStatus*> (gp->setMaterialStatus (this->CreateStatus(gp)));
213 this->_generateStatusVariables(gp);
214 return status;
215 }
216}
217
218
219double
221{
222 // return value
223 double ftm = 0.;
224
226
227 // check if the fracture properties are constant or time-dependent
228 if ( fib ) {
229 // compressive strength
230 double fcm, fcm28mod;
231 double equivalentTime;
232
233 // virgin material-> compute!
234 if ( status->giveNumberOfTempCracks() == 0 ) {
235 equivalentTime = this->giveEquivalentTime(gp, tStep);
236
237 if ( ConcreteFCM::Ft > 0. ) { // user-specified 28-day strength
238 fcm28mod = pow(ConcreteFCM::Ft * this->stiffnessFactor / 0.3e6, 3. / 2.) + 8.;
239 fcm = exp(fib_s * ( 1. - sqrt(28. * this->timeFactor / equivalentTime) ) ) * fcm28mod;
240 } else { // returns fcm in MPa - formula 5.5-51
241 fcm = exp(this->fib_s * ( 1. - sqrt(28. * this->timeFactor / equivalentTime) ) ) * this->fib_fcm28;
242 }
243
244 // ftm adjusted according to the stiffnessFactor (MPa by default)
245 if ( fcm >= 58. ) {
246 ftm = 2.12 * log(1. + 0.1 * fcm) * 1.e6 / this->stiffnessFactor;
247 } else if ( fcm <= 20. ) {
248 ftm = 0.07862 * fcm * 1.e6 / this->stiffnessFactor; // 12^(2/3) * 0.3 / 20 = 0.07862
249 } else {
250 ftm = 0.3 * pow(fcm - 8., 2. / 3.) * 1.e6 / this->stiffnessFactor; //5.1-3a
251 }
252
253 // ftm adjusted according to the stiffnessFactor (MPa by default)
254 /* if ( fcm >= 20. ) {
255 * ftm = 0.3 * pow(fcm - 8., 2. / 3.) * 1.e6 / this->stiffnessFactor; //5.1-3a
256 * } else if ( fcm < 8. ) {
257 * // upper formula does not hold for concretes with fcm < 8 MPa
258 * ftm = 0.3 * pow(fcm, 2. / 3.) * 1.e6 / this->stiffnessFactor;
259 * } else {
260 * // smooth transition
261 * ftm = 0.3 * pow(fcm - ( 8. * ( fcm - 8. ) / ( 20. - 8. ) ), 2. / 3.) * 1.e6 / this->stiffnessFactor;
262 * }*/
263
264 status->setTensileStrength(ftm);
265 } else {
266 ftm = status->giveTensileStrength();
267 }
268 } else {
269 ftm = ConcreteFCM::giveTensileStrength(gp, tStep);
270 status->setTensileStrength(ftm);
271 }
272
273 return ftm;
274}
275
276double
278{
279 // return value
280 double Gf = 0.;
281 double Gf28;
282 double ftm, ftm28;
283
284 // check if the fracture properties are constant or time-dependent
285 if ( fib ) {
287
288 // virgin material-> compute!
289 if ( status->giveNumberOfTempCracks() == 0 ) {
290 // 1)
291 if ( ConcreteFCM::Gf > 0. ) {
292 Gf28 = ConcreteFCM::Gf;
293 } else {
294 Gf28 = 73. * pow(fib_fcm28, 0.18) / this->stiffnessFactor;
295 }
296
297 // 2)
298 ftm = this->giveTensileStrength(gp, tStep);
299
300 if ( ConcreteFCM::Ft > 0. ) { // user-specified 28-day strength
301 ftm28 = ConcreteFCM::Ft;
302 } else {
303 if ( fib_fcm28 >= 58. ) {
304 ftm28 = 2.12 * log(1. + 0.1 * fib_fcm28) * 1.e6 / this->stiffnessFactor;
305 } else if ( fib_fcm28 <= 20. ) {
306 ftm28 = 0.07862 * fib_fcm28 * 1.e6 / this->stiffnessFactor; // 12^(2/3) * 0.3 / 20 = 0.07862
307 } else {
308 ftm28 = 0.3 * pow(fib_fcm28 - 8., 2. / 3.) * 1.e6 / this->stiffnessFactor; //5.1-3a
309 }
310 }
311
312 // 3)
313 Gf = Gf28 * ftm / ftm28;
314
315 status->setFractureEnergy(Gf);
316 } else {
317 Gf = status->giveFractureEnergy();
318 }
319 } else {
321 }
322
323 return Gf;
324}
325
326
327double
329 double stiffness;
330
332
333 RheoChainMaterial *rheoMat = static_cast< RheoChainMaterial * >( domain->giveMaterial(this->viscoMat) );
334
335 stiffness = rheoMat->giveEModulus(status->giveSlaveGaussPointVisco(), tStep);
336
337 return stiffness;
338}
339
340double
342 double Evisco;
343 double Gvisco;
344
346
347 RheoChainMaterial *rheoMat = static_cast< RheoChainMaterial * >( domain->giveMaterial(this->viscoMat) );
348
349 Evisco = rheoMat->giveEModulus(status->giveSlaveGaussPointVisco(), tStep);
350
351 Gvisco = FCMMaterial::linearElasticMaterial.giveShearModulus() * Evisco / this->give('E', gp);
352
353 return Gvisco;
354}
355
356
357
359{
360 RheoChainMaterial *rheoMat = static_cast< RheoChainMaterial * >( domain->giveMaterial(this->viscoMat) );
361
362 MaterialMode helpMM;
363 helpMM = MaterialMode(_Unknown);
364 GaussPoint helpGP(NULL, 0, 0., helpMM);
365
366
367 if ( rheoMat->givePoissonsRatio() != this->linearElasticMaterial.givePoissonsRatio() ) {
368 OOFEM_ERROR("The Poisson ratio of the fracturing and viscoelastic material are not equal.");
369 }
370
371 if ( fabs(this->linearElasticMaterial.give(tAlpha, & helpGP) ) != 0. ) {
372 OOFEM_ERROR("tAlpha must be set to zero in ConcreteFCMViscoElastic material");
373 }
374
376}
377
378double
380{
381 RheoChainMaterial *rheoMat = static_cast< RheoChainMaterial * >( domain->giveMaterial(this->viscoMat) );
383
384 return rheoMat->giveEquivalentTime(status->giveSlaveGaussPointVisco(), tStep);
385}
386
387
388
389
391// CONCRETE FCM STATUS ///
393
396 slaveGpVisco( std::make_unique< GaussPoint >(gp->giveIntegrationRule(), 0, gp->giveNaturalCoordinates(), 0., gp->giveMaterialMode() ) )
397{}
398
399
400void
402{
404
405 fprintf(file, "remark {Output for slave viscoelastic material}\n");
406 this->slaveGpVisco->giveMaterialStatus()->printOutputAt(file, tStep);
407 fprintf(file, "\n");
408}
409
410
411void
413//
414// initializes temp variables according to variables form previous equlibrium state.
415//
416{
418
420
421 rheoStatus->initTempStatus();
422}
423
424
425
426void
428//
429// updates variables (nonTemp variables describing situation at previous equilibrium state)
430// after a new equilibrium state has been reached
431// temporary variables correspond to newly reched equilibrium.
432//
433{
435
437}
438
439
440void
442//
443// saves full information stored in this Status
444// no temp variables stored
445//
446{
447 // save cracking status
448 ConcreteFCMStatus::saveContext(stream, mode);
449 // save viscoelastic status
451}
452
453void
455//
456// restores full information stored in stream to this Status
457//
458{
459 // read parent cracking class status
461
462 // restore viscoelastic amterial
464}
465} // end namespace oofem
#define REGISTER_Material(class)
void initTempStatus() override
void printOutputAt(FILE *file, TimeStep *tStep) const override
Print receiver's output to given stream.
void saveContext(DataStream &stream, ContextMode mode) override
void restoreContext(DataStream &stream, ContextMode mode) override
ConcreteFCMStatus(GaussPoint *g)
void updateYourself(TimeStep *tStep) override
void updateYourself(TimeStep *tStep) override
std ::unique_ptr< GaussPoint > slaveGpVisco
void printOutputAt(FILE *file, TimeStep *tStep) const override
Print receiver's output to given stream.
void saveContext(DataStream &stream, ContextMode mode) override
void restoreContext(DataStream &stream, ContextMode mode) override
MaterialStatus * giveStatus(GaussPoint *gp) const override
void initializeFrom(InputRecord &ir) override
double giveFractureEnergy(GaussPoint *gp, TimeStep *tStep) const override
virtual double giveEquivalentTime(GaussPoint *gp, TimeStep *tStep) const
returns equivalent time (used to compute time-dependent ft and gf)
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const override
double giveTensileStrength(GaussPoint *gp, TimeStep *tStep) const override
comutes tensile strength
FloatArray computeStressIndependentStrainVector(GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const override
int viscoMat
number of the viscoelastic material
double computeOverallElasticShearModulus(GaussPoint *gp, TimeStep *tStep) const override
returns overall shear modulus
double computeOverallElasticStiffness(GaussPoint *gp, TimeStep *tStep) const override
returns overall Young's modulus
std::unique_ptr< MaterialStatus > CreateStatus(GaussPoint *gp) const override
double give(int aProperty, GaussPoint *gp) const override
double giveTensileStrength(GaussPoint *gp, TimeStep *tStep) const override
comutes tensile strength
virtual double giveFractureEnergy(GaussPoint *gp, TimeStep *tStep) const
void initializeFrom(InputRecord &ir) override
Definition concretefcm.C:48
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
double Ft
Tensile strength.
ConcreteFCM(int n, Domain *d)
Definition concretefcm.C:44
double give(int aProperty, GaussPoint *gp) const override
double Gf
Fracture energy.
double giveNormalCrackingStress(GaussPoint *gp, TimeStep *tStep, double eps_cr, int i) const override
computes normal stress associated with i-th crack direction
const FloatMatrix & giveL2GStrainVectorTransformationMtrx()
sets transformation matrix for stress transformation from global to local coordinate system
Definition fcm.h:159
virtual int giveNumberOfCracks() const
returns number of cracks from the previous time step (equilibrated value)
Definition fcm.C:2403
virtual int giveNumberOfTempCracks() const
returns temporary number of cracks
Definition fcm.C:2421
double giveMaxCrackStrain(int icrack)
returns maximum crack strain for the i-th crack (equilibrated value)
Definition fcm.h:109
const FloatArray & giveTempCrackStrainVector()
return temporary crack strain vector (max 6 components)
Definition fcm.h:130
IsotropicLinearElasticMaterial linearElasticMaterial
Definition fcm.h:199
void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const override
Definition fcm.C:60
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition femcmpnn.h:79
virtual int checkConsistency()
Definition femcmpnn.C:89
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 beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
void subtract(const FloatArray &src)
Definition floatarray.C:320
bool hasMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default) const
Definition gausspoint.h:206
IntegrationPointStatus * setMaterialStatus(std::unique_ptr< IntegrationPointStatus > ptr, IntegrationPointStatusIDType key=IPSID_Default)
Definition gausspoint.h:213
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition gausspoint.h:190
IntegrationPointStatus * giveMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default)
Definition gausspoint.h:204
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
virtual void restoreContext(DataStream &stream, ContextMode mode)
GaussPoint * gp
Associated integration point.
virtual void saveContext(DataStream &stream, ContextMode mode)
virtual void updateYourself(TimeStep *)
Dictionary propertyDictionary
Definition material.h:107
virtual bool isActivated(TimeStep *tStep) const
Definition material.h:182
void _generateStatusVariables(GaussPoint *) const
void initTempStatus() override
Definition rheoChM.C:742
virtual double giveEModulus(GaussPoint *gp, TimeStep *tStep) const =0
Evaluation of the incremental modulus.
virtual double giveEquivalentTime(GaussPoint *gp, TimeStep *tStep) const
By default returns equivalent time in the middle of the time step.
Definition rheoChM.h:330
void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const override
Definition rheoChM.C:72
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
Definition rheoChM.C:657
FloatArray computeStressIndependentStrainVector(GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const override
Definition rheoChM.C:370
double givePoissonsRatio() const
Returns Poisson's ratio.
Definition rheoChM.h:315
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
static void computePrincipalValues(FloatArray &answer, const FloatArray &s, stressStrainPrincMode mode)
Common functions for convenience.
static void giveFullSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the reduced unsymmetric Voigt vector (2nd order tensor) to full form.
#define _IFT_ConcreteFCMViscoElastic_stiffnessFactor
#define _IFT_ConcreteFCMViscoElastic_gf28
#define _IFT_ConcreteFCMViscoElastic_fcm28
#define _IFT_ConcreteFCMViscoElastic_fib_s
#define _IFT_ConcreteFCMViscoElastic_timeFactor
#define _IFT_ConcreteFCMViscoElastic_ft28
#define _IFT_ConcreteFCMViscoElastic_viscoMat
#define _IFT_ConcreteFCMViscoElastic_timedepfracturing
#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 tAlpha
Definition matconst.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)
@ principal_stress
For computing principal stresses.

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