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

This page is part of the OOFEM documentation. Copyright (c) 2011 Borek Patzak
Project e-mail: info@oofem.org
Generated at Tue Jan 2 2018 20:07:27 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011