OOFEM 3.0
Loading...
Searching...
No Matches
concrete3.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 "concrete3.h"
36#include "gausspoint.h"
37#include "mathfem.h"
38#include "classfactory.h"
39
40namespace oofem {
42
43Concrete3 :: Concrete3(int n, Domain *d) : RCM2Material(n, d)
44{
46}
47
48
49std::unique_ptr<MaterialStatus>
50Concrete3 :: CreateStatus(GaussPoint *gp) const
51/*
52 * creates new material status corresponding to this class
53 */
54{
55 // double Ee, Gf, Et, Etp, Ft, Le, minEffStrainForFullyOpenCrack;
56 return RCM2Material :: CreateStatus(gp);
57}
58
59
60int
61Concrete3 :: checkSizeLimit(GaussPoint *gp, double charLength) const
62//
63// checks if element size (charLength) is too big
64// so that tension strength must be reduced followed
65// by sudden stress drop
66//
67{
68 double Ee, Gf, Ft, LeCrit;
69
70 Ee = this->give(pscm_Ee, gp);
71 Gf = this->give(pscm_Gf, gp);
72 Ft = this->give(pscm_Ft, gp);
73
74 LeCrit = 2.0 * Gf * Ee / ( Ft * Ft );
75 return ( charLength < LeCrit );
76}
77
78double
79Concrete3 :: computeStrength(GaussPoint *gp, double charLength) const
80//
81// computes strength for given gp,
82// which may be reduced according to length of "fracture process zone"
83// to be energetically correct
84//
85{
86 double Ee, Gf, Ft;
87
88 Ee = this->give(pscm_Ee, gp);
89 Gf = this->give(pscm_Gf, gp);
90 Ft = this->give(pscm_Ft, gp);
91
92 if ( this->checkSizeLimit(gp, charLength) ) {
93 ;
94 } else {
95 // we reduce Ft and there is no softening but sudden drop
96 Ft = sqrt(2. * Ee * Gf / charLength);
97 //
98 OOFEM_LOG_INFO("Reducing Ft to %f in element %d, gp %d, Le %f",
99 Ft, gp->giveElement()->giveNumber(), gp->giveNumber(), charLength);
100 //
101 }
102
103 return Ft;
104}
105
106/*
107 * double
108 * Concrete3 ::giveMinCrackStrainsForFullyOpenCrack (GaussPoint* gp, int i)
109 * //
110 * // computes MinCrackStrainsForFullyOpenCrack for given gp and i-th crack
111 * //
112 * {
113 * RCM2MaterialStatus *status = (RCM2MaterialStatus*) this -> giveStatus (gp);
114 * double Le, Gf, Ft;
115 *
116 * Le = status -> giveCharLength (i);
117 * Gf = this->give(pscm_Gf);
118 * Ft = this->computeStrength (gp, Le);
119 *
120 * return 2.0*Gf/(Le*Ft);
121 * }
122 */
123
124
125double
126Concrete3 :: giveMinCrackStrainsForFullyOpenCrack(GaussPoint *gp, int i) const
127//
128// computes MinCrackStrainsForFullyOpenCrack for given gp and i-th crack
129//
130{
132 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
133 double Le, Gf, Ft;
134
135 Le = status->giveCharLength(i);
136 Gf = this->give(pscm_Gf, gp);
137 Ft = this->computeStrength(gp, Le);
138
139 return 2.0 * Gf / ( Le * Ft );
140 } else if ( softeningMode == exponentialSoftening ) {
141 //return Gf/(Le*Ft); // Exponential softening
142 return 1.e6; // Exponential softening
143 } else {
144 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
145 double Le, Gf, Ft;
146
147 Le = status->giveCharLength(i);
148 Gf = this->give(pscm_Gf, gp);
149 Ft = this->computeStrength(gp, Le);
150 return 5.136* Gf/(Le*Ft); // Hordijk softening
151 }
152}
153
154
155/*
156 * void
157 * Concrete3 :: updateStatusForNewCrack (GaussPoint* gp, int i, double Le)
158 * //
159 * // updates gp status when new crack-plane i is formed with charLength Le
160 * // updates Le and computes and sets minEffStrainForFullyOpenCrack
161 * //
162 * {
163 * RCM2MaterialStatus *status = (RCM2MaterialStatus*) this -> giveStatus (gp);
164 *
165 * if (Le <= 0) {
166 * char errMsg [80];
167 * sprintf (errMsg,"Element %d returned zero char length",
168 * gp->giveElement()->giveNumber());
169 * OOFEM_ERROR(errMsg);
170 * }
171 *
172 * status -> setCharLength(i, Le);
173 * status ->
174 * setMinCrackStrainsForFullyOpenCrack (i, this->giveMinCrackStrainsForFullyOpenCrack(gp,i));
175 * }
176 */
177
178/*
179 * double
180 * Concrete3 :: giveCrackingModulus (MatResponseMode rMode, GaussPoint* gp,
181 * double crackStrain,int i)
182 * //
183 * // returns current cracking modulus according to crackStrain for i-th
184 * // crackplane
185 * // now linear softening is implemented
186 * // see also CreateStatus () function.
187 * // softening modulus represents a relation between the normal crack strain
188 * // rate and the normal stress rate.
189 * //
190 * {
191 * double Ee, Gf, Et, Etp, Cf, Ft, Le, minEffStrainForFullyOpenCrack;
192 * RCM2MaterialStatus *status = (RCM2MaterialStatus*) this -> giveStatus (gp);
193 *
194 * //
195 * // now we have to set proper reduced strength and softening modulus Et
196 * // in order to obtain energetically correct solution using the concept
197 * // of fracture energy Gf, which is a material constant.
198 * //
199 * Ee = this->give(pscm_Ee);
200 * Gf = this->give(pscm_Gf);
201 * Ft = this->give(pscm_Ft);
202 * Le = status->giveCharLength(i);
203 *
204 * Ft = this->computeStrength (gp, Le);
205 * minEffStrainForFullyOpenCrack = this->giveMinCrackStrainsForFullyOpenCrack(gp,i);
206 *
207 * if (rMode == TangentStiffness) {
208 * if (this->checkSizeLimit(gp, Le)) {
209 * if ((crackStrain >= minEffStrainForFullyOpenCrack) ||
210 * (status->giveTempMaxCrackStrain(i) >= minEffStrainForFullyOpenCrack)) {
211 * // fully open crack - no stiffness
212 * Cf = 0.;
213 * } else if (crackStrain >= status->giveTempMaxCrackStrain(i)) {
214 * // further softening
215 * Cf = -Ft/minEffStrainForFullyOpenCrack;
216 * } else {
217 * // unloading or reloading regime
218 * Cf = Ft*(minEffStrainForFullyOpenCrack - status->giveTempMaxCrackStrain(i)) /
219 * (status->giveTempMaxCrackStrain(i) * minEffStrainForFullyOpenCrack);
220 * }
221 * } else {
222 * Cf = 0.;
223 * }
224 * } else {
225 * if (this->checkSizeLimit(gp, Le)) {
226 * if ((crackStrain >= minEffStrainForFullyOpenCrack) ||
227 * (status->giveTempMaxCrackStrain(i) >= minEffStrainForFullyOpenCrack)) {
228 * // fully open crack - no stiffness
229 * Cf = 0.;
230 * } else {
231 * // unloading or reloading regime
232 * Cf = Ft*(minEffStrainForFullyOpenCrack - status->giveTempMaxCrackStrain(i)) /
233 * (status->giveTempMaxCrackStrain(i) * minEffStrainForFullyOpenCrack);
234 * }
235 * } else {
236 * Cf = 0.;
237 * }
238 *
239 * }
240 * return Cf;
241 * }
242 */
243
244double
245Concrete3 :: giveCrackingModulus(MatResponseMode rMode, GaussPoint *gp,
246 double crackStrain, int i) const
247//
248// returns current cracking modulus according to crackStrain for i-th
249// crackplane
250// now linear softening is implemented
251// see also CreateStatus () function.
252// softening modulus represents a relation between the normal crack strain
253// rate and the normal stress rate.
254//
255{
256 //double Ee, Gf;
257 double Cf, Gf, Ft, Le, ef, minEffStrainForFullyOpenCrack;
258 double emax, c1 {3.}, c2 {6.93};
259 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
260
261 //
262 // now we have to set proper reduced strength and softening modulus Et
263 // in order to obtain energetically correct solution using the concept
264 // of fracture energy Gf, which is a material constant.
265 //
266 //Ee = this->give(pscm_Ee);
267 Gf = this->give(pscm_Gf, gp);
268 Ft = this->give(pscm_Ft, gp);
269 Le = status->giveCharLength(i);
270 emax = status->giveTempMaxCrackStrain(i);
271
272 Ft = this->computeStrength(gp, Le);
273 minEffStrainForFullyOpenCrack = this->giveMinCrackStrainsForFullyOpenCrack(gp, i);
274
275 if ( rMode == TangentStiffness ) {
276 if ( this->checkSizeLimit(gp, Le) ) {
278 if ( ( crackStrain >= minEffStrainForFullyOpenCrack ) ||
279 ( emax >= minEffStrainForFullyOpenCrack ) ) {
280 // fully open crack - no stiffness
281 Cf = 0.;
282 } else if ( crackStrain >= emax ) {
283 // further softening
284 Cf = -Ft / minEffStrainForFullyOpenCrack;
285 } else {
286 // unloading or reloading regime
287 Cf = Ft * ( minEffStrainForFullyOpenCrack - emax ) /
288 ( emax * minEffStrainForFullyOpenCrack );
289 }
290 } else if ( softeningMode == exponentialSoftening ) { // exponential softening
291 ef = Gf / ( Le * Ft );
292 if ( crackStrain >= emax ) {
293 // further softening
294 Cf = -Ft / ef *exp(-crackStrain / ef);
295 } else {
296 // unloading or reloading regime
297 Cf = Ft / emax * exp(-emax / ef);
298 }
299 } else { //Hodrijk softening
300 ef = 5.136 * Gf / ( Le * Ft );
301 if ( (crackStrain >= ef) || (emax >= ef) ) {
302 Cf = 0;
303 } else if ( crackStrain >= emax ) {
304 //further softening - negative stiffness
305 //this is derivative of the stress wrt to strain in the softening region
306 Cf = Ft * ( ( 3. * c1 * c1 * c1 * crackStrain * crackStrain * exp(-( c2 * crackStrain ) / ef) ) / ( ef * ef * ef ) - ( c2 * exp(-( c2 * crackStrain ) / ef) * ( c1 * c1 * c1 * crackStrain * crackStrain * crackStrain + ef * ef * ef ) ) / ( ef * ef * ef * ef ) - ( exp(-c2) * ( c1 * c1 * c1 + 1. ) ) / ef );
307 } else {
308 // unloading or reloading regime
309 Cf = Ft / emax * ( ( 1. + pow( ( c1 * emax / ef ), 3. ) ) * exp(-c2 * emax / ef) - emax / ef * ( 1. + c1 * c1 * c1 ) * exp(-c2) );
310 }
311 }
312 } else {
313 Cf = 0.;
314 }
315 } else { // secant stiffness
316 if ( this->checkSizeLimit(gp, Le) ) {
318 if ( ( crackStrain >= minEffStrainForFullyOpenCrack ) ||
319 ( emax >= minEffStrainForFullyOpenCrack ) ) {
320 // fully open crack - no stiffness
321 Cf = 0.;
322 } else {
323 // unloading or reloading regime
324 Cf = Ft * ( minEffStrainForFullyOpenCrack - emax ) /
325 ( emax * minEffStrainForFullyOpenCrack );
326 }
327 } else if ( softeningMode == exponentialSoftening ) { // exponential softening
328 ef = Gf / ( Le * Ft );
329 Cf = Ft / emax * exp(-emax / ef);
330 } else { // Hordijk softening
331 ef = 5.136 * Gf / ( Le * Ft );
332 Cf = Ft / emax * ( ( 1. + pow( ( c1 * emax / ef ), 3. ) ) * exp(-c2 * emax / ef) - emax / ef * ( 1. + c1 * c1 * c1 ) * exp(-c2) );
333 }
334 } else {
335 Cf = 0.;
336 }
337 }
338
339 return Cf;
340}
341
342/*
343 *
344 * double
345 * Concrete3 :: giveNormalCrackingStress (GaussPoint*gp, double crackStrain, int i)
346 * //
347 * // returns receivers Normal Stress in crack i for given cracking strain
348 * //
349 * {
350 * double Cf, Ft, Le, answer, minEffStrainForFullyOpenCrack;
351 * RCM2MaterialStatus *status = (RCM2MaterialStatus*) this->giveStatus (gp);
352 * minEffStrainForFullyOpenCrack = this->giveMinCrackStrainsForFullyOpenCrack(gp,i);
353 *
354 * Cf = this -> giveCrackingModulus (TangentStiffness,gp,crackStrain,i); // < 0
355 * Le = status->giveCharLength(i);
356 * Ft = this->computeStrength (gp, Le);
357 *
358 * if (this->checkSizeLimit(gp,Le)) {
359 *
360 * if ((crackStrain >= minEffStrainForFullyOpenCrack) ||
361 * (status->giveTempMaxCrackStrain(i) >= minEffStrainForFullyOpenCrack)) {
362 * // fully open crack - no stiffness
363 * answer = 0.;
364 * } else if (crackStrain >= status->giveTempMaxCrackStrain(i)) {
365 * // further softening
366 * answer = Ft + Cf*crackStrain;
367 * } else if (crackStrain <= 0.) {
368 * // crack closing
369 * // no stress due to cracking
370 * answer = 0.;
371 * } else {
372 * // unloading or reloading regime
373 * answer = crackStrain * Ft *
374 * (minEffStrainForFullyOpenCrack - status->giveTempMaxCrackStrain(i))/
375 * (status->giveTempMaxCrackStrain(i) * minEffStrainForFullyOpenCrack);
376 * }
377 * } else {
378 * answer = 0.;
379 * }
380 *
381 * return answer;
382 * }
383 */
384
385double
386Concrete3 :: giveNormalCrackingStress(GaussPoint *gp, double crackStrain, int i) const
387//
388// returns receivers Normal Stress in crack i for given cracking strain
389//
390{
391 double Cf, Ft, Gf, Le, answer, ef, minEffStrainForFullyOpenCrack, c1 {3.}, c2 {6.93}, emax;
392 RCM2MaterialStatus *status = static_cast< RCM2MaterialStatus * >( this->giveStatus(gp) );
393 minEffStrainForFullyOpenCrack = this->giveMinCrackStrainsForFullyOpenCrack(gp, i);
394
395 Cf = this->giveCrackingModulus(TangentStiffness, gp, crackStrain, i); // < 0
396 Le = status->giveCharLength(i);
397 Ft = this->computeStrength(gp, Le);
398 Gf = this->give(pscm_Gf, gp);
399 emax = status->giveTempMaxCrackStrain(i);
400
401 if ( this->checkSizeLimit(gp, Le) ) {
403 if ( ( crackStrain >= minEffStrainForFullyOpenCrack ) ||
404 ( emax >= minEffStrainForFullyOpenCrack ) ) {
405 // fully open crack - no stiffness
406 answer = 0.;
407 } else if ( crackStrain >= emax ) {
408 // further softening
409 answer = Ft + Cf * crackStrain;
410 } else if ( crackStrain <= 0. ) {
411 // crack closing
412 // no stress due to cracking
413 answer = 0.;
414 } else {
415 // unloading or reloading regime
416 answer = crackStrain * Ft *
417 ( minEffStrainForFullyOpenCrack - emax ) /
418 ( emax * minEffStrainForFullyOpenCrack );
419 }
420 } else if ( softeningMode == linearSoftening ) { // Exponential softening
421 ef = Gf / ( Le * Ft );
422 if ( crackStrain >= emax ) {
423 // further softening
424 answer = Ft * exp(-crackStrain / ef);
425 } else {
426 // crack closing
427 // or unloading or reloading regime
428 answer = Ft * crackStrain / emax *
429 exp(-emax / ef);
430 }
431 } else { // Hordijk softening
432 ef = 5.136 * Gf / ( Le * Ft );
433 if ( (crackStrain >= ef) || (emax >= ef) ) {
434 //fully open crack - no stiffness
435 answer = 0;
436 } else if ( crackStrain >= emax ) {
437 // further softening
438 answer = Ft * ( ( 1. + pow( ( c1 * crackStrain / ef ), 3. ) ) * exp(-c2 * crackStrain / ef) - crackStrain / ef * ( 1. + c1 * c1 * c1 ) * exp(-c2) );
439 } else if ( crackStrain <= 0) {
440 answer = 0;
441 }
442 else {
443 // crack closing
444 // or unloading or reloading regime
445 answer = Ft * crackStrain / emax * ( ( 1. + pow( ( c1 * emax / ef ), 3. ) ) * exp(-c2 * emax / ef) - emax / ef * ( 1. + c1 * c1 * c1 ) * exp(-c2) );
446 }
447 }
448 } else {
449 answer = 0.;
450 }
451
452 return answer;
453}
454
455/*
456 * double
457 * Concrete3 :: giveShearRetentionFactor (GaussPoint* gp, double eps_cr, int i)
458 * //
459 * // Returns shear retention factor, according to given crack strain
460 * // for i-th crack in gp.
461 * //
462 * {
463 * double answer;
464 * RCM2MaterialStatus *status = (RCM2MaterialStatus*) this->giveStatus (gp);
465 * double maxEps_cr = status->giveMinCrackStrainsForFullyOpenCrack()->at(i);
466 *
467 * // lack of experimental evidence - just poor constant
468 * answer = this-> shearRetFactor;
469 *
470 * //
471 * // answer = 1. * (maxEps_cr - eps_cr) / (maxEps_cr);
472 * // // optional - check the result
473 * // if ((answer > 1) || (answer < 0)) error ("giveShearRetentionFactor: consistency error");
474 * //
475 * return answer;
476 * }
477 */
478
479
480void
481Concrete3 :: initializeFrom(InputRecord &ir)
482{
483 RCM2Material :: initializeFrom(ir);
484
485 int exmode = 0;
487 if ( exmode == 1 ) {
489 } else if ( exmode == 2){
491 } else {
493 }
494}
495} // end namespace oofem
#define REGISTER_Material(class)
double giveCrackingModulus(MatResponseMode rMode, GaussPoint *gp, double crackStrain, int i) const override
Definition concrete3.C:245
double computeStrength(GaussPoint *, double) const override
Definition concrete3.C:79
int checkSizeLimit(GaussPoint *gp, double) const override
Definition concrete3.C:61
Concrete3_softeningMode softeningMode
Definition concrete3.h:62
double giveMinCrackStrainsForFullyOpenCrack(GaussPoint *gp, int i) const override
Definition concrete3.C:126
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
double giveTempMaxCrackStrain(int icrack)
Definition rcm2.h:128
double giveCharLength(int icrack) const
Definition rcm2.h:140
LinearElasticMaterial * linearElasticMaterial
Definition rcm2.h:178
RCM2Material(int n, Domain *d)
Definition rcm2.C:48
double give(int aProperty, GaussPoint *gp) const override
Definition rcm2.C:792
#define _IFT_Concrete3_exp_soft
Definition concrete3.h:44
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define OOFEM_LOG_INFO(...)
Definition logger.h:143
#define pscm_Gf
Definition rcm2.h:54
#define pscm_Ee
Definition rcm2.h:52
#define pscm_Ft
Definition rcm2.h:57

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