OOFEM 3.0
Loading...
Searching...
No Matches
concrete2.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 "concrete2.h"
36#include "domain.h"
37#include "floatmatrix.h"
38#include "gausspoint.h"
39#include "mathfem.h"
40#include "timestep.h"
41#include "datastream.h"
42#include "contextioerr.h"
43#include "classfactory.h"
44
45namespace oofem {
47
48Concrete2 :: Concrete2(int n, Domain *d) : DeformationTheoryMaterial(n, d),
50{ }
51
52
53void
80
81
82double
83Concrete2 :: give(int aProperty, GaussPoint *gp) const
84// Returns the value of the property aProperty (e.g. the Young's modulus
85// 'E') of the receiver.
86{
87 switch ( aProperty ) {
88 case c2_SCCC:
89 return this->SCCC;
90
91 case c2_SCCT:
92 return this->SCCT;
93
94 case c2_EPP:
95 return this->EPP;
96
97 case c2_EPU:
98 return this->EPU;
99
100 case c2_EOPP:
101 return this->EOPP;
102
103 case c2_EOPU:
104 return this->EOPU;
105
106 case c2_SHEARTOL:
107 return this->SHEARTOL;
108
109 case c2_E:
110 return this->E;
111
112 case c2_n:
113 return this->n;
114
115 case stirr_E:
116 return this->stirrE;
117
118 case stirr_Ft:
119 return this->stirrFt;
120
121 case stirr_A:
122 return this->stirrA;
123
124 case stirr_TOL:
125 return this->stirrTOL;
126
127 case stirr_EREF:
128 return this->stirrEREF;
129
130 case stirr_LAMBDA:
131 return this->stirrLAMBDA;
132
134 return this->IS_PLASTIC_FLOW;
135
136 case c2_IFAD:
137 return this->IFAD;
138
139 default:
140 if ( propertyDictionary.includes(aProperty) ) {
141 return propertyDictionary.at(aProperty);
142 } else {
143 return this->linearElasticMaterial.give(aProperty, gp);
144 // error ("give: property not defined");
145 }
146 }
147}
148
149
151Concrete2 :: giveRealStressVector_PlateLayer(const FloatArrayF<5> &totalStrain,
152 GaussPoint *gp, TimeStep *tStep) const
153//
154// returns total stress vector of receiver according to
155// previous level of stress and current
156// strain increment, the only way, how to correctly update gp records
157//
158// Plane stress or uniaxial stress + transverse shear in
159// concrete layers with transverse stirrups.
160//
161//
162// gp strains - EXX,EYY,2*EXY,2*EYZ,2*EXZ
163//
164// material constant of concrete
165// stored in this c2_property:
166//
167// E - Young modulus
168// ny - Poisson ratio
169// Ro - specific mass
170// SCCC<=0 - pressure strength
171// SCCT>=0 - tension strength
172// EPP>=0 - treshold eff. plastic strain for softening in compress.
173// EPU>=epp- ultimate eff. pl. strain
174// EOPP>=0 - threshold vlumetric plastic strain for soft. in tension
175// EOPU>=EOPP ultimate vol. pl. strain
176// SHEARTOL threshold value of the relative shear deformation
177// (psi**2/eef) at which shear is considered in layers. for
178// lower r.s.d. the transverse shear remains elastic decoupled
179// from bending. default value SHEARTOL = 0.01
180// IS_PLASTIC_FLOW indicates that plastic flow (not deformation theory)
181// is used in pressure.
182// IFAD IFAD<=0 STATE VARIABLES WILL NOT BE UPDATED
183// >0 UPDATE S.V.
184//
185//
186// state varibles of the layer are stored in corresponding Material Status
187//
188// SCCM current pressure strenght
189// EPM max. eff. plastic strain
190// SCTM current tension strenght
191// E0PM max. vol. plastic strain
192// SRF current stress in stirrups
193// SEZ current strain in transverse (z) direction.
194// if flow teory of compresion then also available are:
195// EXX_PLAST, EYY_PLAST, EZZ_PLAST, EXY_PLAST=2.EXY_PLAST, EYZ_PLAST (2*),EXZ_PLAST
196// - components of plastic strain associated with epp
197//
198// Note: formulated in Full stress strain space
199{
200 double us, SCC, SCT, psi2, comp, tol = 0.0, crit = 0.0, nez = 0.0, effstold = 0.0, dezold = 0.0, effst = 0.0, dez = 0.0;
201 double epsult = 0.0, ep1 = -1.0, ep2 = -1.0, ep3 = -1.0, relus, G, ez;
202 int ifsh, i, ifplas, ifupd;
203 FloatArray plasticStrainVector, plasticStrainIncrementVector;
204
205 Concrete2MaterialStatus *status = static_cast< Concrete2MaterialStatus * >( this->giveStatus(gp) );
206 FloatArray currentStress, currentStrain, currentEffStrain(6), pVal, ep, pStress, strainIncr, plasticStrain, help, reducedStrain, helpR;
207 FloatMatrix pDir;
208
209 pDir.resize(3, 3); // principal directions
210 pStress.resize(3); // principal stresses
211 strainIncr.resize(1);
212
213 this->initTempStatus(gp);
214
215 // subtract stress independent part
216 // note: eigenStrains (temperature) is not contained in mechanical strain stored in gp
217 // therefore it is necessary to subtract always the total eigen strain value
218 this->giveStressDependentPartOfStrainVector(reducedStrain, gp,
219 totalStrain, tStep, VM_Total);
220
221 StructuralMaterial :: giveFullSymVectorForm( currentStrain, reducedStrain, gp->giveMaterialMode() );
222 StructuralMaterial :: giveFullSymVectorForm( currentStress, status->giveStressVector(), gp->giveMaterialMode() );
223
224 if ( status->giveTempCurrentTensionStrength() < 0. ) {
225 //
226 // called for the firs time - init flags
227 //
228 status->giveTempCurrentPressureStrength() = this->give(c2_SCCC, gp);
229 status->giveTempCurrentTensionStrength() = this->give(c2_SCCT, gp);
230
231 status->giveCurrentPressureStrength() = this->give(c2_SCCC, gp);
232 status->giveCurrentTensionStrength() = this->give(c2_SCCT, gp);
233 }
234
235 plasticStrainVector = status->givePlasticStrainVector();
236 StructuralMaterial :: giveFullSymVectorForm( plasticStrain, plasticStrainVector, gp->giveMaterialMode() );
237
238 ep.resize(3);
239
240 //for (i =1; i <= 6; i++) currentStrain.at(i) += strainIncrement.at(i);
241
242 ez = status->giveTempCurrentStrainInZDir();
243 us = 0.;
244 // eep = 0.;
245 //
246 // Concrete strenghts, SCC and SCT are actual strenghts
247 // which may change in the iteration if there is any
248 //
249 SCC = this->give(c2_SCCC, gp);
250 if ( this->give(c2_EPP, gp) != 0. ) {
251 SCC = status->giveTempCurrentPressureStrength();
252 }
253
254 SCT = this->give(c2_SCCT, gp);
255 if ( this->give(c2_EOPP, gp) != 0. ) {
256 SCT = status->giveTempCurrentTensionStrength();
257 }
258
259 //
260 // create full 3d strain tensor
261 //
262
263 if ( this->give(c2_IS_PLASTIC_FLOW, gp) > 0. ) {
264 currentEffStrain.at(1) = currentStrain.at(1) - plasticStrain.at(1);
265 currentEffStrain.at(2) = currentStrain.at(2) - plasticStrain.at(2);
266 currentEffStrain.at(3) = ez - plasticStrain.at(3);
267 currentEffStrain.at(4) = currentStrain.at(4) - plasticStrain.at(4);
268 currentEffStrain.at(5) = currentStrain.at(5) - plasticStrain.at(5);
269 currentEffStrain.at(6) = currentStrain.at(6) - plasticStrain.at(6);
270 } else {
271 currentEffStrain.at(1) = currentStrain.at(1);
272 currentEffStrain.at(2) = currentStrain.at(2);
273 currentEffStrain.at(3) = ez;
274 currentEffStrain.at(4) = currentStrain.at(4);
275 currentEffStrain.at(5) = currentStrain.at(5);
276 currentEffStrain.at(6) = currentStrain.at(6);
277 }
278
279 //
280 // check for shear to be considered
281 //
282 ifsh = 0;
283 psi2 = currentEffStrain.at(4) * currentEffStrain.at(4) +
284 currentEffStrain.at(5) * currentEffStrain.at(5);
285 comp = sqrt(currentEffStrain.at(1) * currentEffStrain.at(1) +
286 currentEffStrain.at(2) * currentEffStrain.at(2) +
287 currentEffStrain.at(3) * currentEffStrain.at(3) +
288 currentEffStrain.at(6) * currentEffStrain.at(6) +
289 psi2);
290
291 if ( comp == 0. ) { // strange
292 for ( i = 1; i <= 6; i++ ) { // directly modify gp-record
293 currentStress.at(i) = 0.;
294 }
295
296 // note in status are reduced space variables
297 status->letTempStrainVectorBe(totalStrain);
298
299 StructuralMaterial :: giveReducedSymVectorForm( helpR, currentStress, gp->giveMaterialMode() );
300
301 status->letTempStressVectorBe(helpR);
302
303 StructuralMaterial :: giveReducedSymVectorForm( help, plasticStrain, gp->giveMaterialMode() );
304
305 plasticStrainIncrementVector = status->givePlasticStrainIncrementVector();
306 plasticStrainIncrementVector.subtract(plasticStrainVector);
307 plasticStrainIncrementVector.add(help);
308 status->letPlasticStrainIncrementVectorBe(plasticStrainIncrementVector);
309 // plasticStrain->negated()->add (status->givePlasticStrainVector());
310 // status->givePlasticStrainIncrementVector()-> add(plasticStrain);
311
312 FloatArray answer;
313 StructuralMaterial :: giveReducedSymVectorForm( answer, currentStress, gp->giveMaterialMode() );
314 return answer;
315 }
316
317 //
318 // Treshold relative shear strain to trigger shear computation
319 // is stored in SHEARTOL material constant. Once triggered (EZ.ne 0)
320 // then shear computation cannot be abandoned even if the
321 // shear strain drops bellow the limit.
322 //
323 if ( ( ez != 0. ) && ( ( sqrt(psi2) / comp ) < this->give(c2_SHEARTOL, gp) ) ) {
324 //
325 // no transverse shear - 2d case
326 //
327
328 this->computePrincipalValDir(pVal, pDir, currentEffStrain, principal_strain);
329 //
330 // dtp2 procedure expects first two princ values to be in xy plane
331 // so sort results acordingly
332 //
333 int j = 1;
334 if ( pDir.at(3, 2) > pDir.at(3, j) ) {
335 j = 2; // find the eigen direction
336 }
337
338 if ( pDir.at(3, 3) > pDir.at(3, j) ) {
339 j = 3; // normal to xy plane
340 }
341
342 if ( j != 3 ) {
343 // swap values
344 int k;
345 double swap;
346 for ( k = 1; k <= 3; k++ ) { // swap eigenvectors
347 swap = pDir.at(k, 3);
348 pDir.at(k, 3) = pDir.at(k, j);
349 pDir.at(k, j) = swap;
350 }
351
352 swap = pVal.at(3);
353 pVal.at(3) = pVal.at(j);
354 pVal.at(j) = swap;
355 }
356
357 this->dtp2(gp, pVal, pStress, ep, SCC, SCT, & ifplas);
358 } else {
359 ifsh = 1;
360 //
361 // optional iteration to achieve equilibrium in the z - direction.
362 // // iteration toleration limit tol (=0. -- no iteration)
363 // iteration only possible when stirrups present
364 // Number of loops nez
365 tol = 0.;
366 if ( this->give(stirr_E, gp) > 0 ) {
367 tol = this->give(stirr_TOL, gp);
368 }
369
370 crit = fabs( this->give(c2_SCCC, gp) ) + this->give(c2_SCCT, gp);
371 nez = 0;
372 effstold = 0.;
373 dezold = 0.;
374label18:
375 //
376 // find principal strains and corresponding principal direction
377 //
378 this->computePrincipalValDir(pVal, pDir, currentEffStrain, principal_strain);
379 //
380 // plasticity condition
381 //
382 this->dtp3(gp, pVal, pStress, ep, SCC, SCT, & ifplas);
383 //
384 // transverse equilibrium
385 // transv strain ez (flags -> at(SEZ)) its incr. dez ,
386 // stirrup stress flags->at(SRF)
387 //
388 // unbalanced transverse stress us
389 // concrete component
390 //
391 us = ( pDir.at(3, 1) * pStress.at(1) * pDir.at(3, 1) +
392 pDir.at(3, 2) * pStress.at(2) * pDir.at(3, 2) +
393 pDir.at(3, 3) * pStress.at(3) * pDir.at(3, 3) );
394 //
395 // Stirrups component
396 //
397 if ( this->give(stirr_E, gp) > 0. ) {
398 us += status->giveTempCurrentStressInStirrups() * this->give(stirr_A, gp);
399 }
400
401 //
402 // increment of transverse strain ez
403 // effective modulus of concrete in z direction
404 // f(1)*red**4 where red is sinus of the angle
405 // between z axis and max. principal strain dir.
406 // when us becomes positive (may happen if the
407 // effective modulus was too small and, hence, the
408 // last change dez of the transverse strain ez
409 // too large in the previous increment), it loses sense.
410 // the Jacobi iteration delivers just approximate princ.
411 // vectors which causes spurious pulses in us and fluctuations
412 // in sxz,syz,qx,qz. they decrease
413 // when toli->0. they are successfully managed by z equil.
414 // iteration and do not harm the solution.
415 //
416 if ( ( ifplas ) && ( us < 0. ) ) {
417 // transverse strain increment if concrete is plastic in tension
418 // and further Z-extension is necessary (US<0).
419 // effst is an iteration factor to get transverse equilibrium
420 if ( pVal.at(1) > pVal.at(2) ) {
421 if ( pVal.at(1) > pVal.at(3) ) {
422 effst = pDir.at(3, 1);
423 } else {
424 effst = pDir.at(3, 3);
425 }
426 } else {
427 if ( pVal.at(2) > pVal.at(3) ) {
428 effst = pDir.at(3, 2);
429 } else {
430 effst = pDir.at(3, 3);
431 }
432 }
433
434 effst = ( 1. - effst * effst );
435 effst *= effst;
436 if ( effst < 1.e-6 ) {
437 effst = 1.e-6;
438 }
439
440 effst *= this->give(c2_E, gp);
441 if ( this->give(stirr_E, gp) > 0. ) {
442 effst += this->give(stirr_E, gp) * this->give(stirr_A, gp);
443 }
444
445 effst *= 2.0;
446 } else {
447 // concrete is elastic
448 effst = this->give(c2_E, gp) * 1.1;
449 }
450
451 dez = -us / effst;
452 // if the increment of ez has changed sign in this z-equil.
453 // iteration loop, raise the iteration factor by adding up
454 // the two last values
455 if ( nez > 1 ) {
456 if ( dez * dezold < 0. ) {
457 effst += effstold;
458 dez = -us / effst;
459 }
460
461 dezold = dez;
462 effstold = effst;
463 }
464
465 //
466 ez += dez;
467 if ( this->give(stirr_E, gp) > 0. ) {
468 strainIncr.at(1) = dez;
469 this->updateStirrups(gp, strainIncr, tStep);
470 // updates flags->at(SEZ)
471 // stirr(dez,sv(l3),fst);
472 }
473 }
474
475 //
476 // strain softening
477 //
478 ifupd = 0;
479 if ( this->give(c2_IFAD, gp) ) {
480 if ( this->give(c2_EOPP, gp) >= 0. ) {
481 if ( this->give(c2_EOPU, gp) > 0. ) {
482 epsult = this->give(c2_EOPU, gp);
483 } else {
484 // position dependent strain softening
485 // NOT IMPLEMENTED
486 epsult = this->give(c2_EOPU, gp);
487 }
488 }
489
490 this->strsoft(gp, epsult, ep, ep1, ep2, ep3, SCC, SCT, ifupd);
491 }
492
493 //
494 // End of the Ez iteration loop
495 //
496 if ( ifsh ) {
497 relus = fabs(us) / crit;
498 if ( ( tol > 0. ) && ( relus > tol ) ) {
499 //
500 // add the increment of EZ to the actual strain tenzor
501 //
502 currentEffStrain.at(1) += pDir.at(3, 1) * dez * pDir.at(3, 1);
503 currentEffStrain.at(2) += pDir.at(3, 2) * dez * pDir.at(3, 2);
504 currentEffStrain.at(3) += pDir.at(3, 3) * dez * pDir.at(3, 3);
505 currentEffStrain.at(4) += pDir.at(3, 2) * dez * pDir.at(3, 3);
506 currentEffStrain.at(5) += pDir.at(3, 1) * dez * pDir.at(3, 3);
507 currentEffStrain.at(6) += pDir.at(3, 1) * dez * pDir.at(3, 2);
508 // back to EZ iteration start
509 //
510 if ( this->give(c2_IS_PLASTIC_FLOW, gp) && this->give(c2_IFAD, gp) ) {
511 plasticStrain.at(1) += ( pDir.at(1, 1) * ep1 * pDir.at(1, 1) +
512 pDir.at(1, 2) * ep2 * pDir.at(1, 2) +
513 pDir.at(1, 3) * ep3 * pDir.at(1, 3) );
514 plasticStrain.at(2) += ( pDir.at(2, 1) * ep1 * pDir.at(2, 1) +
515 pDir.at(2, 2) * ep2 * pDir.at(2, 2) +
516 pDir.at(2, 3) * ep3 * pDir.at(2, 3) );
517 plasticStrain.at(3) += ( pDir.at(3, 1) * ep1 * pDir.at(3, 1) +
518 pDir.at(3, 2) * ep2 * pDir.at(3, 2) +
519 pDir.at(3, 3) * ep3 * pDir.at(3, 3) );
520 plasticStrain.at(4) += 2. * ( pDir.at(2, 1) * ep1 * pDir.at(3, 1) +
521 pDir.at(2, 2) * ep2 * pDir.at(3, 2) +
522 pDir.at(2, 3) * ep3 * pDir.at(3, 3) );
523 plasticStrain.at(5) += 2. * ( pDir.at(1, 1) * ep1 * pDir.at(3, 1) +
524 pDir.at(1, 2) * ep2 * pDir.at(3, 2) +
525 pDir.at(1, 3) * ep3 * pDir.at(3, 3) );
526 plasticStrain.at(6) += 2. * ( pDir.at(1, 1) * ep1 * pDir.at(2, 1) +
527 pDir.at(1, 2) * ep2 * pDir.at(2, 2) +
528 pDir.at(1, 3) * ep3 * pDir.at(2, 3) );
529 }
530
531 pVal.zero();
532 goto label18;
533 }
534 }
535
536 //
537 // update compressive plastic strains.
538 //
539 if ( ifupd ) {
540 if ( this->give(c2_IFAD, gp) ) {
541 if ( this->give(c2_IS_PLASTIC_FLOW, gp) ) {
542 // -
543 if ( ifsh == 0 ) {
544 //
545 // no transverse shear, 1-2 to x-y
546 //
547 plasticStrain.at(1) += ( pDir.at(1, 1) * ep1 * pDir.at(1, 1) +
548 pDir.at(1, 2) * ep2 * pDir.at(1, 2) );
549 plasticStrain.at(2) += ( pDir.at(2, 1) * ep1 * pDir.at(2, 1) +
550 pDir.at(2, 2) * ep2 * pDir.at(2, 2) );
551 plasticStrain.at(6) += 2. * ( pDir.at(1, 1) * ep1 * pDir.at(2, 1) +
552 pDir.at(1, 2) * ep2 * pDir.at(2, 2) );
553 } else {
554 //
555 // transverse shear present , transform back to x,y,z
556 //
557 plasticStrain.at(1) += ( pDir.at(1, 1) * ep1 * pDir.at(1, 1) +
558 pDir.at(1, 2) * ep2 * pDir.at(1, 2) +
559 pDir.at(1, 3) * ep3 * pDir.at(1, 3) );
560 plasticStrain.at(2) += ( pDir.at(2, 1) * ep1 * pDir.at(2, 1) +
561 pDir.at(2, 2) * ep2 * pDir.at(2, 2) +
562 pDir.at(2, 3) * ep3 * pDir.at(2, 3) );
563 plasticStrain.at(3) += ( pDir.at(3, 1) * ep1 * pDir.at(3, 1) +
564 pDir.at(3, 2) * ep2 * pDir.at(3, 2) +
565 pDir.at(3, 3) * ep3 * pDir.at(3, 3) );
566 plasticStrain.at(4) += 2. * ( pDir.at(2, 1) * ep1 * pDir.at(3, 1) +
567 pDir.at(2, 2) * ep2 * pDir.at(3, 2) +
568 pDir.at(2, 3) * ep3 * pDir.at(3, 3) );
569 plasticStrain.at(5) += 2. * ( pDir.at(1, 1) * ep1 * pDir.at(3, 1) +
570 pDir.at(1, 2) * ep2 * pDir.at(3, 2) +
571 pDir.at(1, 3) * ep3 * pDir.at(3, 3) );
572 plasticStrain.at(6) += 2. * ( pDir.at(1, 1) * ep1 * pDir.at(2, 1) +
573 pDir.at(1, 2) * ep2 * pDir.at(2, 2) +
574 pDir.at(1, 3) * ep3 * pDir.at(2, 3) );
575 }
576 }
577 }
578 }
579
580 //
581 // stresses back , 1-2 to x-z , sxz= tau=-sigxz
582 //
583 // 36
584 if ( ifsh == 0 ) {
585 G = 0.5 * this->give(c2_E, gp) / ( 1.0 + this->give(c2_n, gp) );
586
587 currentStress.at(1) = ( pDir.at(1, 1) * pStress.at(1) * pDir.at(1, 1) +
588 pDir.at(1, 2) * pStress.at(2) * pDir.at(1, 2) );
589 currentStress.at(2) = ( pDir.at(2, 1) * pStress.at(1) * pDir.at(2, 1) +
590 pDir.at(2, 2) * pStress.at(2) * pDir.at(2, 2) );
591 currentStress.at(3) = 0.;
592 currentStress.at(4) = currentStrain.at(4) * G;
593 currentStress.at(5) = currentStrain.at(5) * G;
594 currentStress.at(6) = ( pDir.at(1, 1) * pStress.at(1) * pDir.at(2, 1) +
595 pDir.at(1, 2) * pStress.at(2) * pDir.at(2, 2) );
596 } else {
597 currentStress.at(1) = ( pDir.at(1, 1) * pStress.at(1) * pDir.at(1, 1) +
598 pDir.at(1, 2) * pStress.at(2) * pDir.at(1, 2) +
599 pDir.at(1, 3) * pStress.at(3) * pDir.at(1, 3) );
600 currentStress.at(2) = ( pDir.at(2, 1) * pStress.at(1) * pDir.at(2, 1) +
601 pDir.at(2, 2) * pStress.at(2) * pDir.at(2, 2) +
602 pDir.at(2, 3) * pStress.at(3) * pDir.at(2, 3) );
603 currentStress.at(3) = us;
604 currentStress.at(4) = ( pDir.at(2, 1) * pStress.at(1) * pDir.at(3, 1) +
605 pDir.at(2, 2) * pStress.at(2) * pDir.at(3, 2) +
606 pDir.at(2, 3) * pStress.at(3) * pDir.at(3, 3) );
607 currentStress.at(5) = ( pDir.at(1, 1) * pStress.at(1) * pDir.at(3, 1) +
608 pDir.at(1, 2) * pStress.at(2) * pDir.at(3, 2) +
609 pDir.at(1, 3) * pStress.at(3) * pDir.at(3, 3) );
610 currentStress.at(6) = ( pDir.at(1, 1) * pStress.at(1) * pDir.at(2, 1) +
611 pDir.at(1, 2) * pStress.at(2) * pDir.at(2, 2) +
612 pDir.at(1, 3) * pStress.at(3) * pDir.at(2, 3) );
613 }
614
615 if ( this->give(c2_IFAD, gp) ) {
616 status->giveTempCurrentStrainInZDir() = ez;
617 }
618
619 //totalStrainVector = status->giveStrainVector();
620 //totalStrainVector.add (totalStrainIncrement);
621 status->letTempStrainVectorBe(totalStrain);
622
623 StructuralMaterial :: giveReducedSymVectorForm( helpR, currentStress, gp->giveMaterialMode() );
624 status->letTempStressVectorBe(helpR);
625
626 StructuralMaterial :: giveFullSymVectorForm( help, plasticStrain, gp->giveMaterialMode() );
627 plasticStrainIncrementVector = status->givePlasticStrainIncrementVector();
628 plasticStrainIncrementVector.subtract(plasticStrainVector);
629 plasticStrainIncrementVector.add(help);
630 status->letPlasticStrainIncrementVectorBe(plasticStrainIncrementVector);
631
632 //plasticStrain->negated()->add (status->givePlasticStrainVector());
633 //status->givePlasticStrainIncrementVector()-> add(plasticStrain);
634
635 FloatArray answer;
636 StructuralMaterial :: giveFullSymVectorForm( answer, currentStress, gp->giveMaterialMode() );
637 return answer;
638}
639
640
641void
642Concrete2 :: dtp3(GaussPoint *gp, FloatArray &e, FloatArray &s, FloatArray &ep,
643 double SCC, double SCT, int *ifplas) const
644//
645// DEFORMATION THEORY OF PLASTICITY, PRNCIPAL STRESSES
646// CONDITION OF PLASTICITY.
647//
648// e - principal strains
649// s - principal stresses (output)
650// SCT,SCC - tensile and compressive strengths
651// ifplas - =0 if material is elastic
652// =1 if plastic in tension
653//
654//
655// state varibles of the layer are stored
656// in corresponding gp mat Status
657//
658// SCCM current pressure strenght
659// EPM max. eff. plastic strain
660// SCTM current tension strenght
661// E0PM max. vol. plastic strain
662// SRF current stress in stirrups
663// SEZ current strain in transverse (z) direction.
664// if flow teory of compresion then also available are:
665// EXX_PLAST, EYY_PLAST, EZZ_PLAST, EXY_PLAST=2.EXY_PLAST, EYZ_PLAST (2*),EXZ_PLAST
666// - components of plastic strain associated with epp in gp->plasticStrainVector
667//
668{
669 int i, ii = 0, j, k, jj = 0, kk = 0;
670 double yy, ey, e0, yy1, yy2, s0, sci = 0.0, scj = 0.0, sck = 0.0;
671
672 if ( e.giveSize() != 3 ) {
673 OOFEM_ERROR("principal strains size mismatch");
674 }
675
676 if ( s.giveSize() != 3 ) {
677 OOFEM_ERROR("principal stress size mismatch");
678 }
679
680 if ( ep.giveSize() != 3 ) {
681 OOFEM_ERROR("plastic strains size mismatch");
682 }
683
684 * ifplas = 0;
685
686 yy = this->give(c2_n, gp);
687 ey = this->give(c2_E, gp);
688 e0 = this->give(c2_E, gp) / ( 1. + yy ) / ( 1. - yy - yy );
689 yy1 = 1. - yy;
690 yy2 = 1. + yy;
691
692 if ( this->give(c2_E, gp) < 1.e-6 ) {
693 for ( i = 1; i <= 3; i++ ) {
694 s.at(i) = 0.;
695 ep.at(i) = 0.;
696 }
697
698 return;
699 }
700
701 if ( this->give(c2_n, gp) >= 0.01 ) {
702 s.at(1) = e0 * ( yy1 * e.at(1) + yy * ( e.at(2) + e.at(3) ) );
703 s.at(2) = e0 * ( yy1 * e.at(2) + yy * ( e.at(1) + e.at(3) ) );
704 s.at(3) = e0 * ( yy1 * e.at(3) + yy * ( e.at(2) + e.at(1) ) );
705 //
706 // find intersection with side i , sig(i)=sci
707 //
708 s0 = 0.;
709 for ( i = 1; i <= 3; i++ ) {
710 if ( ( s.at(i) - SCT - s0 ) > 0. ) {
711 ii = i;
712 sci = SCT;
713 s0 = s.at(i) - SCT;
714 * ifplas = 1;
715 } else {
716 if ( ( SCC - s.at(i) - s0 ) > 0. ) {
717 ii = i;
718 sci = SCC;
719 s0 = SCC - s.at(i);
720 }
721 }
722 }
723
724 if ( s0 <= 0. ) {
725 //
726 // linear elastic
727 //
728 ep.at(1) = 0.;
729 ep.at(2) = 0.;
730 ep.at(3) = 0.;
731 return;
732 }
733
734 //
735 // Strain vector outside elastic cube
736 // Plastic state
737 //
738 j = iperm(ii, 3);
739 k = iperm(j, 3);
740 i = ii;
741 s.at(i) = sci;
742 s.at(j) = ( yy * sci + ey / yy2 * ( e.at(j) + yy * e.at(k) ) ) / yy1;
743 s.at(k) = ( yy * sci + ey / yy2 * ( e.at(k) + yy * e.at(j) ) ) / yy1;
744 s0 = 0.;
745 //
746 // find intersection with edges j and k
747 //
748 if ( ( s.at(j) - SCT - s0 ) > 0. ) {
749 jj = j;
750 kk = k;
751 scj = SCT;
752 s0 = s.at(j) - SCT;
753 }
754
755 if ( ( SCC - s.at(j) - s0 ) > 0. ) {
756 jj = j;
757 kk = k;
758 scj = SCC;
759 s0 = SCC - s.at(j);
760 }
761
762 if ( ( s.at(k) - SCT - s0 ) > 0. ) {
763 jj = k;
764 kk = j;
765 scj = SCT;
766 s0 = s.at(k) - SCT;
767 }
768
769 if ( ( SCC - s.at(k) - s0 ) > 0. ) {
770 jj = k;
771 kk = j;
772 scj = SCC;
773 s0 = SCC - s.at(k);
774 } else {
775 //
776 // staying on the side i
777 //
778 if ( s0 <= 0. ) {
779 ep.at(i) = e.at(i) - sci / yy1 / e0 + yy / yy1 * ( e.at(j) + e.at(k) );
780 ep.at(j) = 0.;
781 ep.at(k) = 0.;
782 return;
783 }
784 }
785
786 //
787 // edge j on the side i
788 //
789 j = jj;
790 k = kk;
791 s.at(j) = scj;
792 s.at(k) = yy * ( sci + scj ) + ey *e.at(k);
793 //
794 // corner ?
795 //
796 if ( ( s.at(k) - SCT ) > 0. ) {
797 sck = SCT;
798 } else {
799 if ( ( SCC - s.at(k) ) > 0. ) {
800 sck = SCC;
801 } else {
802 //
803 // staying on the edge j - i
804 //
805 ep.at(i) = e.at(i) + yy *e.at(k) + yy2 / ey * ( yy * scj - yy1 * sci );
806 ep.at(j) = e.at(j) + yy *e.at(k) + yy2 / ey * ( yy * sci - yy1 * scj );
807 ep.at(k) = 0.;
808 return;
809 }
810 }
811
812 //
813 // corner sck on the edge j of the side i
814 //
815 s.at(k) = sck;
816 ep.at(i) = e.at(i) - ( sci - yy * ( scj + sck ) ) / ey;
817 ep.at(j) = e.at(j) - ( scj - yy * ( sck + sci ) ) / ey;
818 ep.at(k) = e.at(k) - ( sck - yy * ( sci + scj ) ) / ey;
819 return;
820 } else {
821 //
822 // Poisson ratio = 0.
823 //
824 for ( i = 1; i <= 3; i++ ) {
825 sci = 0.;
826 ep.at(i) = 0.;
827 s.at(i) = e.at(i) * ey;
828 if ( s.at(i) > SCT ) {
829 sci = SCT;
830 * ifplas = 1;
831 s.at(i) = sci;
832 ep.at(i) -= sci / ey;
833 } else {
834 if ( s.at(i) < SCC ) {
835 sci = SCC;
836 s.at(i) = sci;
837 ep.at(i) -= sci / ey;
838 }
839 }
840 }
841 }
842}
843
844void
845Concrete2 :: dtp2(GaussPoint *gp, FloatArray &e, FloatArray &s, FloatArray &ep,
846 double SCC, double SCT, int *ifplas) const
847//
848// DEFORMATION THEORY OF PLASTICITY, PRNCIPAL STRESSES
849// CONDITION OF PLASTICITY. - PLANE STRESS
850//
851// e - principal strains
852// s - principal stresses (output)
853// SCT,SCC - tensile and compressive strengths
854// ifplas - =0 if material is elastic
855// =1 if plastic in tension
856//
857//
858// state varibles of the layer are stored
859// in gp->matInfo->flagDictionary = flags
860//
861// SCCM current pressure strenght
862// EPM max. eff. plastic strain
863// SCTM current tension strenght
864// E0PM max. vol. plastic strain
865// SRF current stress in stirrups
866// SEZ current strain in transverse (z) direction.
867// if flow teory of compresion then also available are:
868// EXX_PLAST, EYY_PLAST, EZZ_PLAST, EXY_PLAST=2.EXY_PLAST, EYZ_PLAST (2*),EXZ_PLAST
869// - components of plastic strain associated with epp
870//
871{
872 int i, j, k, jj = 0;
873 double yy, ey, e0, so, scj = 0.0, sck = 0.0, sci = 0.0;
874 // Dictionary *flags = gp->matInfo->flagDictionary;
875
876 if ( e.giveSize() != 3 ) {
877 OOFEM_ERROR("principal strains size mismatch");
878 }
879
880 if ( s.giveSize() != 3 ) {
881 OOFEM_ERROR("principal stress size mismatch");
882 }
883
884 if ( ep.giveSize() != 3 ) {
885 OOFEM_ERROR("plastic strains size mismatch");
886 }
887
888 * ifplas = 0;
889
890 yy = this->give(c2_n, gp);
891 ey = this->give(c2_E, gp);
892
893 * ifplas = 0;
894 if ( ey == 0. ) {
895 s.at(1) = s.at(2) = 0.;
896 ep.at(1) = ep.at(2) = 0.;
897 return;
898 }
899
900 if ( yy > 0.01 ) {
901 e0 = ey / ( 1. - yy * yy );
902
903 s.at(1) = e0 * ( e.at(1) + yy * e.at(2) );
904 s.at(2) = e0 * ( e.at(2) + yy * e.at(1) );
905 so = 0.;
906 //
907 // find intersection with the edges of the square plast. co
908 // dition - edge j
909 //
910 for ( j = 1; j <= 2; j++ ) {
911 if ( ( s.at(j) - SCT - so ) > 0. ) {
912 jj = j;
913 scj = SCT;
914 so = s.at(j) - SCT;
915 * ifplas = 1;
916 } else {
917 if ( ( SCC - s.at(j) - so ) > 0. ) {
918 jj = j;
919 scj = SCC;
920 so = SCC - s.at(j);
921 }
922 }
923 }
924
925 if ( so <= 0. ) {
926 //
927 // LINEAR ELASTIC - NO INTERSECTION
928 //
929 ep.at(1) = 0.;
930 ep.at(2) = 0.;
931 return;
932 }
933
934 //
935 // edge jj,j
936 //
937 k = iperm(jj, 2);
938 j = jj;
939 s.at(j) = scj;
940 s.at(k) = ey * e.at(k) + scj * yy;
941 //
942 // any corner?
943 //
944 if ( ( s.at(k) - SCT ) > 0. ) {
945 sck = SCT;
946 } else {
947 if ( ( SCC - s.at(k) ) > 0. ) {
948 sck = SCC;
949 } else {
950 //
951 // staying on the edge j
952 //
953 ep.at(j) = e.at(j) + yy *e.at(k) - scj / e0;
954 ep.at(k) = 0.;
955 return;
956 }
957 }
958
959 //
960 // corner sck on the edge j
961 //
962 s.at(k) = sck;
963 ep.at(j) = e.at(j) - ( s.at(j) - yy * s.at(k) ) / ey;
964 ep.at(k) = e.at(k) - ( s.at(k) - yy * s.at(j) ) / ey;
965 return;
966 } else {
967 //
968 // poisson ratio =0.
969 //
970 for ( i = 1; i <= 2; i++ ) {
971 sci = 0.;
972 ep.at(i) = 0.;
973 s.at(i) = e.at(i) * ey;
974 if ( s.at(i) > SCT ) {
975 sci = SCT;
976 * ifplas = 1;
977 } else {
978 sci = SCC;
979 }
980
981 s.at(i) = sci;
982 ep.at(i) = e.at(i) - sci / ey;
983 }
984
985 return;
986 }
987}
988
989
990
991
992void
993Concrete2 :: strsoft(GaussPoint *gp, double epsult, FloatArray &ep, double &ep1, double &ep2, double &ep3,
994 double SCC, double SCT, int &ifupd) const
995// material constant of concrete
996// stored in this.propertyDictionary
997//
998// E - Young modulus
999// ny - Poisson ratio
1000// Ro - specific mass
1001// SCCC<=0 - pressure strength
1002// SCCT>=0 - tension strength
1003// EPP>=0 - treshold eff. plastic strain for softening in compress.
1004// EPU>=epp- ultimate eff. pl. strain
1005// EOPP>=0 - threshold vlumetric plastic strain for soft. in tension
1006// EOPU>=EOPP ultimate vol. pl. strain
1007// SHEARTOL threshold value of the relative shear deformation
1008// (psi**2/eef) at which shear is considered in layers. for
1009// lower r.s.d. the transverse shear remains elastic decoupled
1010// from bending. default value SHEARTOL = 0.01
1011// IS_PLASTIC_FLOW indicates that plastic flow (not deformation theory)
1012// is used in pressure.
1013// IFAD IFAD<=0 STATE VARIABLES WILL NOT BE UPDATED
1014// >0 UPDATE S.V.
1015//
1016//
1017// state varibles of the layer are stored
1018// in gp->matInfo->flagDictionary = flags
1019//
1020// SCCM current pressure strenght
1021// EPM max. eff. plastic strain
1022// SCTM current tension strenght
1023// E0PM max. vol. plastic strain
1024// SRF current stress in stirrups
1025// SEZ current strain in transverse (z) direction.
1026// if flow teory of compresion then also available are:
1027// EXX_PLAST, EYY_PLAST, EZZ_PLAST, EXY_PLAST=2.EXY_PLAST, EYZ_PLAST (2*),EXZ_PLAST
1028// - components of plastic strain associated with epp in gp->plasticStrainVector.
1029//
1030{
1031 Concrete2MaterialStatus *status = static_cast< Concrete2MaterialStatus * >( this->giveStatus(gp) );
1032 double eop, eopr, dep, d, eep, eepr;
1033 //
1034 // strain softening
1035 // tension
1036 //
1037 if ( this->give(c2_EOPP, gp) != 0. ) {
1038 eop = max(ep.at(1), 0.) + max(ep.at(2), 0.) +
1039 max(ep.at(3), 0.);
1040 if ( eop > status->giveTempMaxVolPlasticStrain() ) {
1041 //
1042 // Current plastic volum. strain is greater than max.
1043 // reached up to now.
1044 //
1045 // reduced plastic strain withe respect to the elastic
1046 // limit strain of the virgin concrete E0PR
1047 //
1048 eopr = eop - ( this->give(c2_SCCT, gp) - SCT ) / this->give(c2_E, gp);
1049 if ( eopr <= this->give(c2_EOPP, gp) ) {
1050 status->giveTempMaxVolPlasticStrain() = eop;
1051 goto label14;
1052 }
1053
1054 //
1055 // softening
1056 //
1057 if ( eop > epsult ) {
1058 SCT = 0.;
1059 } else {
1060 SCT = this->give(c2_SCCT, gp) * ( 1. - ( eopr - this->give(c2_EOPP, gp) ) / ( epsult - this->give(c2_EOPP, gp) ) );
1061 }
1062
1063 // When actual strength is lowered the eff. plastic strain
1064 // increases though no additional strain occurred
1065 status->giveTempMaxVolPlasticStrain() = eop + ( status->giveTempCurrentTensionStrength() - SCT ) /
1066 this->give(c2_E, gp);
1067 status->giveTempCurrentTensionStrength() = SCT;
1068 }
1069 }
1070
1071 //
1072 // COMPRESSION - EFF. PLASTIC COMPR. STRAIN EEP
1073 // IFUPD=1 INDICATES THAT COMPRESSIVE PLASTIC STRAINS ARE UPDATED
1074 //
1075 //
1076
1077label14:
1078
1079 ifupd = 0;
1080 if ( !( ( this->give(c2_EPP, gp) == 0. ) && ( !this->give(c2_IS_PLASTIC_FLOW, gp) ) ) ) {
1081 ep1 = min(ep.at(1), 0.);
1082 ep2 = min(ep.at(2), 0.);
1083 ep3 = min(ep.at(3), 0.);
1084 dep = ep1 + ep2 + ep3;
1085 //
1086 if ( dep < 0. ) {
1087 // There is a compressive plastic deformation.
1088 // If the plastic
1089 // flow theory is used then DEP is the
1090 // increment of the plastic
1091 // strain.
1092 if ( this->give(c2_EPP, gp) == 0. ) {
1093 // No compression softening.
1094 // For flow theory the plastic strain component
1095 // must be updated
1096 if ( this->give(c2_IS_PLASTIC_FLOW, gp) ) {
1097 ifupd = 1;
1098 return;
1099 }
1100 }
1101
1102 d = 1.5 * ( ep1 * ep1 + ep2 * ep2 + ep3 * ep3 ) - 0.5 * dep * dep;
1103 dep = sqrt(d);
1104 if ( this->give(c2_IS_PLASTIC_FLOW, gp) ) {
1105 // flow theory
1106 eep = status->giveTempMaxEffPlasticStrain() + dep;
1107 } else {
1108 // deformation theory
1109 eep = dep;
1110 }
1111
1112 if ( eep > status->giveTempMaxEffPlasticStrain() ) {
1113 //
1114 // current plast.def. EEP is greater than the max. reached
1115 // upto now EPM - strength must be lowered and
1116 // plastic strain components updated if flow rule.
1117 if ( this->give(c2_IS_PLASTIC_FLOW, gp) ) {
1118 ifupd = 1;
1119 }
1120
1121 //
1122 // SOFTENING?
1123 //
1124 if ( this->give(c2_EPP, gp) != 0. ) {
1125 //
1126 // reduced plastic strain with respect to the elastic
1127 // limit of the virgin concrete EEPR
1128 //
1129 eepr = eep + ( this->give(c2_SCCC, gp) - SCC ) / this->give(c2_E, gp);
1130 if ( eepr <= this->give(c2_EPP, gp) ) {
1131 status->giveTempMaxEffPlasticStrain() = eep;
1132 } else {
1133 // softening
1134 if ( eepr >= this->give(c2_EPU, gp) ) {
1135 SCC = 0.;
1136 } else {
1137 SCC = this->give(c2_SCCC, gp) * ( 1. - ( eepr - this->give(c2_EPP, gp) ) /
1138 ( this->give(c2_EPU, gp) - this->give(c2_EPP, gp) ) );
1139 }
1140
1141 //
1142 // When actual strength is lowered the eff. plastic strain
1143 // increases though no additional strain occurred
1144 status->giveTempMaxEffPlasticStrain() = eep - ( status->giveTempCurrentPressureStrength() - SCC ) /
1145 this->give(c2_E, gp);
1146 status->giveTempCurrentPressureStrength() = SCC;
1147 }
1148 }
1149 }
1150 }
1151 }
1152}
1153
1154
1155
1156
1157
1158void
1159Concrete2 :: updateStirrups(GaussPoint *gp, FloatArray &strainIncrement, TimeStep *tStep) const
1160// stirr (double dez, double srf)
1161//
1162//
1163// EVALUATES THE PLASTIC OR VISCOPLSTIC STRESS- STRAIN
1164// RELATIONS FOR STIRRUPS AND UPDATES DATA IN MAT STATUS AND GP DATA
1165// ACORDINGLY.
1166//
1167// INPUT
1168// strainincrement->at(1) = DEZ - INCREMENT OF STRAIN
1169// gp->status->giveCurrentStressInStirrups() - CURENT STRESS, ALSO OUTPUT (INCREMENTED)
1170//
1171// this has - MATERIAL CONSTANTS ARRAY:
1172// STIRR_E - YOUNG MOD.
1173// STIRR_R - UNIAX. STRENGTH=ELAST. LIMIT
1174// STIRR_A - STIRRUPS AREA/UNIT LENGHT (BEAM) OR /UNIT AREA (SHELL)
1175// STIRR_TOL- TOLERANCE OF THE EQUIL. IN THE Z-DIRECTION (=0 NO ITER.)
1176// STIRR_EREF - EREF - REFRENCE STRAIN RATE FOR PERZYNA'S MATER.
1177// STIRR_LAMBDA- COEFF. FOR THAT MATER:
1178// SHTIRR_H- ISOTROPIC HARDENING FACTOR
1179//
1180// OUTPUT
1181// SRF - REAL STIRRUP STRESS IF IFAD=>1, OTHERWISE STRESS
1182// BEFORE INCR.
1183// AT PRESENT NO HARDENING AVAILABLE
1184//
1185// PLASTIC STRAIN INCREMENT
1186//
1187{
1188 Concrete2MaterialStatus *status = static_cast< Concrete2MaterialStatus * >( this->giveStatus(gp) );
1189
1190 double dep, srf, dez, ovs, s, dt;
1191
1192 dez = strainIncrement.at(1);
1193 srf = status->giveTempCurrentStressInStirrups();
1194
1195 dep = 0.;
1196 ovs = fabs(srf) / this->give(stirr_Ft, gp) - 1.;
1197 if ( ( ovs ) > 0. ) {
1198 if ( this->give(stirr_EREF, gp) <= 0. ) {
1199 if ( ( dez * srf ) > 0. ) {
1200 dep = dez;
1201 }
1202 } else {
1203 dt = tStep->giveTimeIncrement();
1204 dep = this->give(stirr_EREF, gp) * exp( ovs / this->give(stirr_LAMBDA, gp) ) * dt;
1205 }
1206 }
1207
1208 s = srf + this->give(stirr_E, gp) * ( dez - dep );
1209 if ( this->give(c2_IFAD, gp) ) {
1210 srf = s;
1211 }
1212
1213 status->giveTempCurrentStressInStirrups() = srf;
1214}
1215
1216
1217
1219Concrete2 :: givePlateLayerStiffMtrx(MatResponseMode rMode,
1220 GaussPoint *gp,
1221 TimeStep *tStep) const
1222//
1223// This material is currently unable compute material stiffness
1224// so it uses slave material (linearElasticMaterial ) to perform this work
1225// but this material is currently assumed to be linear elastic ->
1226// plasticity is not taken into account !.
1227//
1228{
1229 // error ("givePlateLayerStiffMtrx: unable to compute");
1230 return linearElasticMaterial.givePlateLayerStiffMtrx( rMode, gp, tStep);
1231}
1232
1233
1234std::unique_ptr<MaterialStatus>
1235Concrete2 :: CreateStatus(GaussPoint *gp) const
1236{
1237 return std::make_unique<Concrete2MaterialStatus>(gp);
1238}
1239
1240
1241
1242Concrete2MaterialStatus :: Concrete2MaterialStatus(GaussPoint *g) :
1244{
1245}
1246
1247
1248void
1249Concrete2MaterialStatus :: saveContext(DataStream &stream, ContextMode mode)
1250{
1251 StructuralMaterialStatus :: saveContext(stream, mode);
1252
1253 // write a raw data
1254 if ( !stream.write(SCCM) ) {
1256 }
1257
1258 if ( !stream.write(EPM) ) {
1260 }
1261
1262 if ( !stream.write(SCTM) ) {
1264 }
1265
1266 if ( !stream.write(E0PM) ) {
1268 }
1269
1270 if ( !stream.write(SRF) ) {
1272 }
1273
1274 if ( !stream.write(SEZ) ) {
1276 }
1277
1278 contextIOResultType iores;
1279 if ( ( iores = plasticStrainVector.storeYourself(stream) ) != CIO_OK ) {
1280 THROW_CIOERR(iores);
1281 }
1282}
1283
1284
1285void
1286Concrete2MaterialStatus :: restoreContext(DataStream &stream, ContextMode mode)
1287{
1288 contextIOResultType iores;
1289
1290 StructuralMaterialStatus :: restoreContext(stream, mode);
1291
1292 // read raw data
1293 if ( !stream.read(SCCM) ) {
1295 }
1296
1297 if ( !stream.read(EPM) ) {
1299 }
1300
1301 if ( !stream.read(SCTM) ) {
1303 }
1304
1305 if ( !stream.read(E0PM) ) {
1307 }
1308
1309 if ( !stream.read(SRF) ) {
1311 }
1312
1313 if ( !stream.read(SEZ) ) {
1315 }
1316
1317 if ( ( iores = plasticStrainVector.restoreYourself(stream) ) != CIO_OK ) {
1318 THROW_CIOERR(iores);
1319 }
1320}
1321
1322
1323void
1324Concrete2MaterialStatus :: initTempStatus()
1325//
1326// initializes temp variables according to variables form previous equlibrium state.
1327//
1328{
1329 StructuralMaterialStatus :: initTempStatus();
1330
1331 tempSCCM = SCCM;
1332 tempEPM = EPM;
1333 tempSCTM = SCTM;
1334 tempE0PM = E0PM;
1335 tempSRF = SRF;
1336 tempSEZ = SEZ;
1337
1338 if ( plasticStrainVector.giveSize() == 0 ) {
1339 plasticStrainVector.resize( StructuralMaterial :: giveSizeOfVoigtSymVector( gp->giveMaterialMode() ) );
1340 plasticStrainVector.zero();
1341 }
1342
1343 if ( plasticStrainIncrementVector.giveSize() == 0 ) {
1344 plasticStrainIncrementVector.resize( StructuralMaterial :: giveSizeOfVoigtSymVector( gp->giveMaterialMode() ) );
1346 } else {
1348 }
1349}
1350
1351
1352
1353void
1354Concrete2MaterialStatus :: updateYourself(TimeStep *tStep)
1355//
1356// updates variables (nonTemp variables describing situation at previous equilibrium state)
1357// after a new equilibrium state has been reached
1358// temporary variables are having values corresponding to newly reched equilibrium.
1359//
1360{
1361 StructuralMaterialStatus :: updateYourself(tStep);
1362
1363 SCCM = tempSCCM;
1364 EPM = tempEPM;
1365 SCTM = tempSCTM;
1366 E0PM = tempE0PM;
1367 SRF = tempSRF;
1368 SEZ = tempSEZ;
1369
1371}
1372} // end namespace oofem
#define REGISTER_Material(class)
double SEZ
Current strain in transverse (z) direction.
Definition concrete2.h:103
double & giveTempCurrentPressureStrength()
Definition concrete2.h:119
double & giveTempCurrentStressInStirrups()
Definition concrete2.h:122
FloatArray plasticStrainIncrementVector
Definition concrete2.h:94
double & giveTempCurrentTensionStrength()
Definition concrete2.h:121
double SCCM
Current pressure strength.
Definition concrete2.h:98
void letPlasticStrainIncrementVectorBe(FloatArray v)
Definition concrete2.h:116
double EPM
Max. eff. plastic strain.
Definition concrete2.h:99
const FloatArray & givePlasticStrainIncrementVector() const
Definition concrete2.h:112
double SCTM
Current tension strength.
Definition concrete2.h:100
const FloatArray & givePlasticStrainVector() const
Definition concrete2.h:111
double E0PM
Max. vol. plastic strain.
Definition concrete2.h:101
double SRF
current stress in stirrups.
Definition concrete2.h:102
double EOPU
Ultimate vol. pl. strain.
Definition concrete2.h:158
double EPP
Threshold eff. plastic strain for softening in compress.
Definition concrete2.h:155
double SCCC
Pressure strength.
Definition concrete2.h:153
void updateStirrups(GaussPoint *gp, FloatArray &strainIncrement, TimeStep *tStep) const
Definition concrete2.C:1159
double EPU
Ultimate eff. pl. strain.
Definition concrete2.h:156
int IFAD
Determines if state variables should be updated or not (>0 updates).
Definition concrete2.h:173
double EOPP
Threshold volumetric plastic strain for soft. in tension.
Definition concrete2.h:157
void strsoft(GaussPoint *gp, double epsult, FloatArray &ep, double &ep1, double &ep2, double &ep3, double SCC, double SCT, int &ifupd) const
Definition concrete2.C:993
double give(int, GaussPoint *gp) const override
Definition concrete2.C:83
int IS_PLASTIC_FLOW
Indicates that plastic flow (not deformation theory) is used in pressure.
Definition concrete2.h:171
void dtp3(GaussPoint *gp, FloatArray &e, FloatArray &s, FloatArray &ep, double SCC, double SCT, int *ifplas) const
Definition concrete2.C:642
double SCCT
Tension strength.
Definition concrete2.h:154
IsotropicLinearElasticMaterial linearElasticMaterial
Definition concrete2.h:175
void dtp2(GaussPoint *gp, FloatArray &e, FloatArray &s, FloatArray &ep, double SCC, double SCT, int *ifplas) const
Definition concrete2.C:845
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.
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 subtract(const FloatArray &src)
Definition floatarray.C:320
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
double at(std::size_t i, std::size_t j) const
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
Dictionary propertyDictionary
Definition material.h:107
virtual void initTempStatus(GaussPoint *gp) const
Definition material.C:221
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
static void computePrincipalValDir(FloatArray &answer, FloatMatrix &dir, const FloatArray &s, stressStrainPrincMode mode)
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode) const
#define stirr_E
Definition concrete2.h:78
#define _IFT_Concrete2_e
Definition concrete2.h:49
#define c2_SHEARTOL
Definition concrete2.h:75
#define c2_EPP
Definition concrete2.h:71
#define c2_n
Definition concrete2.h:77
#define _IFT_Concrete2_stirr_ft
Definition concrete2.h:61
#define _IFT_Concrete2_epp
Definition concrete2.h:53
#define c2_EOPU
Definition concrete2.h:74
#define _IFT_Concrete2_n
Definition concrete2.h:50
#define _IFT_Concrete2_ifad
Definition concrete2.h:59
#define stirr_TOL
Definition concrete2.h:81
#define c2_EPU
Definition concrete2.h:72
#define _IFT_Concrete2_sheartol
Definition concrete2.h:57
#define _IFT_Concrete2_scct
Definition concrete2.h:52
#define _IFT_Concrete2_sccc
Definition concrete2.h:51
#define _IFT_Concrete2_eopp
Definition concrete2.h:55
#define _IFT_Concrete2_stirr_a
Definition concrete2.h:62
#define _IFT_Concrete2_stirr_eref
Definition concrete2.h:64
#define stirr_LAMBDA
Definition concrete2.h:83
#define stirr_Ft
Definition concrete2.h:79
#define _IFT_Concrete2_stirr_lambda
Definition concrete2.h:65
#define _IFT_Concrete2_is_plastic_flow
Definition concrete2.h:58
#define c2_SCCT
Definition concrete2.h:70
#define stirr_A
Definition concrete2.h:80
#define stirr_EREF
Definition concrete2.h:82
#define c2_E
Definition concrete2.h:76
#define c2_SCCC
Definition concrete2.h:69
#define _IFT_Concrete2_epu
Definition concrete2.h:54
#define c2_EOPP
Definition concrete2.h:73
#define _IFT_Concrete2_eopu
Definition concrete2.h:56
#define _IFT_Concrete2_stirr_tol
Definition concrete2.h:63
#define c2_IS_PLASTIC_FLOW
Definition concrete2.h:84
#define c2_IFAD
Definition concrete2.h:85
#define _IFT_Concrete2_stirr_e
Definition concrete2.h:60
#define THROW_CIOERR(e)
#define OOFEM_ERROR(...)
Definition error.h:79
#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)
@ principal_strain
For computing principal strains from engineering strains.
int iperm(int val, int rank)
Definition mathfem.C:261
@ 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