OOFEM 3.0
Loading...
Searching...
No Matches
mps.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 "mps.h"
36#include "mathfem.h"
37#include "gausspoint.h"
38#include "timestep.h"
39#include "engngm.h"
40#include "contextioerr.h"
41#include "datastream.h"
42#include "classfactory.h"
43#include "function.h"
44
45namespace oofem {
47
48/***************************************************************/
49/************** MPSMaterialStatus **********************/
50/***************************************************************/
51
52
53
56{
57#ifdef keep_track_of_strains
58 int rsize = StructuralMaterial::giveSizeOfVoigtSymVector( gp->giveMaterialMode() );
59 creepStrain.resize(rsize);
60 creepStrainIncrement.resize(rsize);
61#endif
62}
63
64void
98
99
100void
102{
104
106
108
109 storedEmodulusFlag = false;
110 storedEmodulus = -1.;
111
112 hum = -1.;
113 hum_increment = -1.;
114
115 T = -1.;
116 T_increment = -1.;
117
118 humNanoTemp = -1.;
119
120#ifdef keep_track_of_strains
124#endif
125}
126
127void
129{
131
132 if ( !stream.write(T_max) ) {
134 }
135
136 if ( !stream.write(h_min) ) {
138 }
139
140 if ( !stream.write(equivalentTime) ) {
142 }
143
144 if ( !stream.write(flowTermViscosity) ) {
146 }
147
148 if ( !stream.write(humNano) ) {
150 }
151}
152
153void
155{
157
158
159 if ( !stream.read(T_max) ) {
161 }
162
163 if ( !stream.read(h_min) ) {
165 }
166
167 if ( !stream.read(equivalentTime) ) {
169 }
170
171 if ( !stream.read(flowTermViscosity) ) {
173 }
174
175 if ( !stream.read(humNano) ) {
177 }
178}
179
180// **********************************************************************************************
181// *** CLASS MPS Material ***
182// *** (concrete creep and shrinkage described by the microprestress solidification theory) ***
183// **********************************************************************************************
184
185
186void
188{
189 double fc, c, wc, ac;
190
191 /* scaling factor transforming PREDICTED stiffnesses q1, q2, q3 and q4 to desired
192 * default value is 1.0 = no change
193 * e.g. if the stiffness should be in MPa, then stiffnessFactor = 1.e6 */
194 this->stiffnessFactor = 1.e6;
196
198
199 // checking timefactor - for MPS material must be equal to 1. (in seconds)
200 double tf;
202 if ( tf != 1. ) {
203 throw ValueInputException(ir, _IFT_RheoChainMaterial_timefactor, "for MPS material timefactor must be equal to 1.");
204 }
205
206 // initialize exponent p or p_tilde of the governing equation
208 throw ValueInputException(ir, _IFT_MPSMaterial_p_tilde, "for MPS p and p_tilde cannot be defined at the same time");
209 }
210
211 double p_tilde = 2.;
213
214 if (p_tilde == 1.) {
215 p = 100.;
216 } else {
217 p = p_tilde / ( p_tilde - 1. );
218 }
219
221
222 if ( p > 100. ) {
223 p = 100.;
224 }
225
227
228 int mode = 0;
230
231 if ( mode == 0 ) { // default - estimate model parameters q1,..,q4 from composition
232 IR_GIVE_FIELD(ir, fc, _IFT_MPSMaterial_fc); // 28-day standard cylinder compression strength [MPa]
233 IR_GIVE_FIELD(ir, c, _IFT_MPSMaterial_cc); // cement content of concrete [kg/m^3]
234 if ( ir.hasField(_IFT_MPSMaterial_wc) ) { // ratio (by weight) of water to cementitious material
236 } else if (ir.hasField(_IFT_MPSMaterial_wcr)) {
238 } else {
239 throw ValueInputException(ir, "none", "w/c not defined");
240 }
241
242 if ( ir.hasField(_IFT_MPSMaterial_ac)){ // ratio (by weight) of aggregate to cement
244 } else if ( ir.hasField(_IFT_MPSMaterial_acr)){
246 } else {
247 throw ValueInputException(ir, "none", "a/c not defined");
248 }
249 this->predictParametersFrom(fc, c, wc, ac);
250 } else { // read model parameters for creep
255 }
256
257 int type = 1;
259 if ( type >= 4 ) {
260 throw ValueInputException(ir, _IFT_MPSMaterial_coupledanalysistype, "must be 0, 1, 2 or 3");
261 }
262
263 this->CoupledAnalysis = ( coupledAnalysisType ) type;
264
265
266 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
267 // age when drying or thermal changes begin [days] - necessary to determine initial viscosity
268 // time t0 is equal to relMatAge
269 // IR_GIVE_FIELD(ir, t0, _IFT_MPSMaterial_t0);
270 this->t0 = this->relMatAge;
271
272 if ( this->p < 100. ) {
273 // muS- the only parameter necessary for evaluation of the flow-term viscosity
274 // muS = c0 * c1^{p-1} * q4 * (p-1)^p [1/(Pa*s)]
276 } else { // p = 100
277 // dimensionless constant for p = infty
279 }
280 }
281
282 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) ) {
283 this->kSh = 0.;
285
286 this->sh_a = 1.;
287 this->sh_hC = 1.;
288 this->sh_n = 1.;
289
293
294
298
299 if ( ksh_h.giveSize() != ksh_fh.giveSize() ) {
300 throw ValueInputException(ir, _IFT_MPSMaterial_factor_ksh_h, "the size of 'ksh_h' and 'ksh_f(h)' must be the same");
301 }
302 }
303
305 this->timeDependent_ksh = true;
306 }
307
308 this->alphaE = 10.; // according to Bazant 1995
310 this->alphaR = 0.1; // according to Bazant 1995
312 this->alphaS = 0.1; // according to Bazant 1995
314
316
317 this->khc = 1.0;
319 if ( ( this->khc > 1. ) || ( this->khc < 0. ) ) {
320 throw ValueInputException(ir, _IFT_MPSMaterial_khc, "Allowed value for khc is in the range <0., 1.>");
321 }
322
323
325 // Parameters for desorption isotherm
326 //this->w_h = this->n = this->a = 0.;
327 //IR_GIVE_OPTIONAL_FIELD(ir, w_h, _IFT_MPSMaterial_wh);
328 //IR_GIVE_OPTIONAL_FIELD(ir, n, _IFT_MPSMaterial_ncoeff);
329 //IR_GIVE_OPTIONAL_FIELD(ir, a, _IFT_MPSMaterial_a);
330 }
331
332 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
333 if ( this->CoupledAnalysis == MPS_temperature ) {
334 IR_GIVE_FIELD(ir, kTm, _IFT_MPSMaterial_ktm); //[-] replaces ln(h) in diff equation for MPS
335 } else {
336 this->kTm = -1.;
337 IR_GIVE_OPTIONAL_FIELD(ir, kTm, _IFT_MPSMaterial_ktm); //[-] replaces ln(h) in diff equation for MPS
338 }
339
340 this->kTc = this->kTm;
342
343
344 this->roomTemperature = 298.15; // reference room temperature for MPS algorithm [K] = 25 C
345
347 this->temperScaleDifference = 0.;
349 this->temperScaleDifference = 273.15;
350 }
351
352 // ACTIVATION ENERGIES
353 this->QEtoR = 2700.; // [K] value according to Bazant 1995
355 this->QRtoR = 5000.; // [K] value according to Bazant 1995
357 this->QStoR = 3000.; // [K] value according to Bazant 1995
359 }
360
361 // autogenous shrinkage - final amplitude
362 // according to NEVILLE: Properties of concrete, typical value is from -40e-6 to -100e-6 for ordinary concretes
363 // however for low w/c ratios it can reach up to -700e-6
364
365 // autogenous shrinkage according to fib
366 this->eps_cas0 = 0.;
368
370 double alpha_as;
371 // table 5.1-13 from fib2010
372 // alpha_as = 800 for cem 32.5N
373 // alpha_as = 700 for cem 32.5R and 42.5 N
374 // alpha_as = 600 for cem 42.5R, 52.5 N and 52.5 R
376 // mean compressive strenght at the age of 28 days
378
379 // fib2010 equations 5.1-78
380 eps_cas0 = -alpha_as *pow( ( fc / 10. ) / ( 6. + fc / 10. ), 2.5) * 1e-6;
381 }
382
383 // autogenous shrinkage according to B4
384 b4_eps_au_infty = 0.;
385 b4_tau_au = 0.;
386 b4_alpha = 0.;
387 b4_r_t = 0.;
388
391 double b4_r_alpha = 0., b4_eps_au_cem = 0., b4_tau_au_cem = 0., b4_r_ea, b4_r_ew, b4_r_tw;
392 int b4_cem_type;
393
395 // from Table 2
396 if ( b4_cem_type == 0 ) { //R = regular cement
397 b4_tau_au_cem = 1.;
398 b4_r_tw = 3.;
399 b4_r_t = -4.5;
400 b4_r_alpha = 1.;
401 b4_eps_au_cem = 210.e-6;
402 b4_r_ea = -0.75;
403 b4_r_ew = -3.5;
404 } else if ( b4_cem_type == 1 ) { //RS = rapid hardening
405 b4_tau_au_cem = 41.;
406 b4_r_tw = 3.;
407 b4_r_t = -4.5;
408 b4_r_alpha = 1.4;
409 b4_eps_au_cem = -84.e-6;
410 b4_r_ea = -0.75;
411 b4_r_ew = -3.5;
412 } else if ( b4_cem_type == 2 ) { //SL = slow hardening
413 b4_tau_au_cem = 1.;
414 b4_r_tw = 3.;
415 b4_r_t = -4.5;
416 b4_r_alpha = 1.;
417 b4_eps_au_cem = 0.e-6;
418 b4_r_ea = -0.75;
419 b4_r_ew = -3.5;
420 } else {
421 throw ValueInputException(ir, _IFT_MPSMaterial_B4_cem_type, "Unknown cement type");
422 }
423
424
427 } else {
430 b4_eps_au_infty = -b4_eps_au_cem *pow(ac / 6., b4_r_ea) * pow(wc / 0.38, b4_r_ew);
431 }
432
434 IR_GIVE_FIELD(ir, b4_tau_au, _IFT_MPSMaterial_B4_tau_au); // must be in units of the analysis
435 } else {
437 b4_tau_au = b4_tau_au_cem * pow(wc / 0.38, b4_r_tw);
438 b4_tau_au *= lambda0; // converted to desired time unit
439 }
440
443 } else {
445 b4_alpha = b4_r_alpha * wc / 0.38;
446 }
447
448 // possibility to overwrite default value of exponent r_t
450 }
451
452 if ( ( eps_cas0 != 0. ) && ( b4_eps_au_infty != 0. ) ) {
454 "autogenous shrinkage cannot be described according to fib and B4 simultaneously");
455 }
456
457
460
461 autoShrinkageTF = 0;
463}
464
465
466void
467MPSMaterial::giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const
468{
469 KelvinChainSolidMaterial::giveRealStressVector(answer, gp, reducedStrain, tStep);
470
471 if ( !Material::isActivated(tStep) ) {
472 return;
473 }
474
475 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
476
477 status->setEquivalentTimeTemp( this->computeEquivalentTime(gp, tStep, 1) );
478}
479
480
481void
483 GaussPoint *gp,
484 TimeStep *tStep,
485 ValueModeType mode) const
486{
487 if ( ( mode != VM_Total ) && ( mode != VM_Incremental ) ) {
488 OOFEM_ERROR("unsupported mode");
489 }
490
491#ifndef keep_track_of_strains
492 if ( mode == VM_Total ) {
493 OOFEM_ERROR("for total formulation of shrinkage strains need to define keep_track_of_strains");
494 }
495#endif
496
497
498
499 MaterialMode mMode = gp->giveMaterialMode();
500
501 FloatArray dry_shr, eps_as;
502 double dryShrIncr = 0.;
503 double autoShrIncr = 0.;
504
506 answer.zero();
507
508 if ( ( this->CoupledAnalysis == Basic ) || ( this->CoupledAnalysis == MPS_temperature ) || ( !Material::isActivated(tStep) ) ) {
509 ;
510 } else { // compute drying shrinkage
511 this->computePointShrinkageStrainVector(dry_shr, gp, tStep);
512 }
513
514#ifdef keep_track_of_strains
515 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
516 if ( dry_shr.giveSize() >= 1 ) {
517 dryShrIncr = dry_shr.at(1);
518 status->setTempDryingShrinkageStrain(status->giveDryingShrinkageStrain() + dryShrIncr);
519 }
520#endif
521
522 if ( ( this->eps_cas0 != 0. ) || ( this->b4_eps_au_infty != 0. ) || ( this->autoShrinkageTF ) ) {
523 if ( this->eps_cas0 != 0. ) {
524 this->computeFibAutogenousShrinkageStrainVector(eps_as, gp, tStep);
525 } else if ( this->b4_eps_au_infty != 0. ) {
526 this->computeB4AutogenousShrinkageStrainVector(eps_as, gp, tStep);
527 } else if ( this->autoShrinkageTF ) {
528 this->computeAutogenousShrinkageDefinedByTF(eps_as, gp, tStep);
529 }
530
531#ifdef keep_track_of_strains
532 if ( eps_as.giveSize() >= 1 ) {
533 autoShrIncr = eps_as.at(1);
535 }
536#endif
537 }
538
539 if ( mode == VM_Incremental ) {
540 if ( dry_shr.giveSize() >= 1 ) {
541 answer.add(dry_shr);
542 }
543
544 if ( eps_as.giveSize() >= 1 ) {
545 answer.add(eps_as);
546 }
547 } else { //( mode == VM_Total )
548 FloatArray fullAnswer;
549 int size;
550
551 if ( ( mMode == _3dShell ) || ( mMode == _3dBeam ) || ( mMode == _2dPlate ) || ( mMode == _2dBeam ) ) {
552 size = 12;
553 } else {
554 size = 6;
555 }
556
557 fullAnswer.resize(size);
558 fullAnswer.zero();
559
560 if ( ( mMode == _2dLattice ) || ( mMode == _3dLattice ) ) {
561 fullAnswer.at(1) = status->giveAutogenousShrinkageStrain() + autoShrIncr + status->giveDryingShrinkageStrain() + dryShrIncr;
562 } else {
563 fullAnswer.at(1) = fullAnswer.at(2) = fullAnswer.at(3) = status->giveAutogenousShrinkageStrain() + autoShrIncr + status->giveDryingShrinkageStrain() + dryShrIncr;
564 }
565
567 }
568
569 return;
570}
571
572std::unique_ptr<MaterialStatus>
574/*
575 * creates a new material status corresponding to this class
576 */
577{
578 return std::make_unique<MPSMaterialStatus>(gp, nUnits);
579}
580
581
582void
583MPSMaterial::predictParametersFrom(double fc, double c, double wc, double ac)
584{
585 /*
586 * Prediction of model parameters - estimation from concrete composition
587 * and strength
588 *
589 * fc - 28-day standard cylinder compression strength in MPa
590 * c - cement content of concrete in kg/m^3
591 * wc - ratio (by weight) of water to cementitious material
592 * ac - ratio (by weight) of aggregate to cement
593 *
594 * The prediction of the material parameters of the present model
595 * is restricted to Portland cement concretes with the following
596 * parameter ranges:
597 *
598 * 2500 <= fc <= 10000 [psi] (psi = 6895 Pa)
599 * 10 <= c <= 45 [lb ft-3] (lb ft-3 = 16.03 kg m-3)
600 * 0.3 <= wc <= 0.85
601 * 2.5 <= ac <= 13.5
602 *
603 */
604
605 // Basic creep parameters
606 q1 = 1.e-12 * this->stiffnessFactor * 126.74271 / ( sqrt(fc) );
607 q2 = 1.e-12 * this->stiffnessFactor * 185.4 * pow(c, 0.5) * pow(fc, -0.9);
608 q3 = 0.29 * pow(wc, 4.) * q2;
609 q4 = 1.e-12 * this->stiffnessFactor * 20.3 * pow(ac, -0.7);
610
611 char buff[ 1024 ];
612 sprintf(buff, "q1=%lf q2=%lf q3=%lf q4=%lf", q1, q2, q3, q4);
613 OOFEM_LOG_DEBUG("MPS[%d]: estimated params: %s\n", this->number, buff);
614 OOFEM_LOG_DEBUG( "E28: %f\n", 1. / computeCreepFunction(this->lambda0 * ( 28. + 0.01 ), this->lambda0 * 28., NULL, NULL) );
615}
616
617
618double
619MPSMaterial::computeCreepFunction(double t, double t_prime, GaussPoint *gp, TimeStep *tStep) const
620{
621 // computes the value of creep function at time t
622 // when load is acting from time t_prime
623 // t-t_prime = duration of loading
624
625 // standard expressions which work with days - need to incorporate lambda0 to work in general
626
627 double m = 0.5;
628 double n = 0.1;
629
630 // basic creep
631 double Qf = 1. / ( 0.086 * pow(t_prime / this->lambda0, 2. / 9.) + 1.21 * pow(t_prime / this->lambda0, 4. / 9.) );
632 double Z = pow(t_prime / this->lambda0, -m) * log( 1. + pow(t / this->lambda0 - t_prime / this->lambda0, n) );
633 double r = 1.7 * pow(t_prime / this->lambda0, 0.12) + 8.0;
634 double Q = Qf * pow( ( 1. + pow( ( Qf / Z ), r) ), -1. / r);
635
636 double C0 = q2 * Q + q3 * log( 1. + pow(t / this->lambda0 - t_prime / this->lambda0, n) ) + q4 * log(t / t_prime);
637
638 return q1 + C0;
639}
640
641
642double
644{
645 return this->computeEquivalentTime(gp, tStep, 0);
646}
647
648
649void
651{
652 /*
653 * This function generates discrete characteristic times
654 * according to rules which guarantee a good approximation
655 * of the relaxation or creep function by the Dirichlet series
656 */
657
658 if ( this->begOfTimeOfInterest == -1. ) {
659 this->begOfTimeOfInterest = 0.01 * lambda0;
660 }
661
662 if ( this->endOfTimeOfInterest == -1. ) {
663 this->endOfTimeOfInterest = 10000. * lambda0;
664 }
665
666 //first retardation time found in given by formula 0.3 * begOfTimeOfInterest
667 double Tau1 = 0.3 * this->begOfTimeOfInterest;
668
669 //last retardation time has to be bigger than 0.5 * endOfTimeOfInterest
671
672 int j = 1;
673 while ( 0.5 * this->endOfTimeOfInterest >= Tau1 * pow( 10.0, ( double ) ( j - 1 ) ) ) {
674 j++;
675 }
676
677 this->nUnits = j;
678
679 this->charTimes.resize(this->nUnits);
680 this->charTimes.zero();
681
682 for ( int mu = 1; mu <= this->nUnits; mu++ ) {
683 charTimes.at(mu) = Tau1 * pow(10., mu - 1);
684 }
685}
686
687
690{
691 // constant "n" is assumed to be equal to 0.1 (typical value)
692
693 // modulus of elasticity of the first unit of Kelvin chain.
694 // (aging elastic spring with retardation time = 0)
695 double lambda0ToPowN = pow(lambda0, 0.1);
696 double tau0 = pow(2 * this->giveCharTime(1) / sqrt(10.0), 0.1);
697 EspringVal = 1. / ( q2 * log(1.0 + tau0 / lambda0ToPowN) - q2 * tau0 / ( 10.0 * lambda0ToPowN + 10.0 * tau0 ) );
698
699 // evaluation of moduli of elasticity for the remaining units
700 // (Solidifying kelvin units with retardation times tauMu)
701 FloatArray answer(nUnits);
702 for ( int mu = 1; mu <= this->nUnits; mu++ ) {
703 double tauMu = pow(2 * this->giveCharTime(mu), 0.1);
704 answer.at(mu) = 10. * pow(1 + tauMu / lambda0ToPowN, 2) / ( log(10.0) * q2 * ( tauMu / lambda0ToPowN ) * ( 0.9 + tauMu / lambda0ToPowN ) );
705 this->charTimes.at(mu) *= 1.35;
706 }
707
708 answer.at(nUnits) /= 1.2; // modulus of the last unit is reduced
709 return answer;
710}
711
712
713double
715{
716 /*
717 * This function returns the incremental modulus for the given time increment.
718 * The modulus may also depend on the specimen geometry (gp - dependence).
719 *
720 * It is stored as "Einc" for further expected requests from other gaussPoints that correspond to the same material.
721 *
722 * Note: time -1 refers to the previous time.
723 */
724
725 double sum = 0.0;
726 double v;
727
728 double Cf = 0.0; // incremental viscous flow compliance
729 double eta, dt;
730 double dEtaR, etaR, L;
731
732 double Emodulus;
733 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
734
735 if ( !Material::isActivated(tStep) ) {
736 return 1.; // stresses are cancelled in giveRealStressVector;
737 }
738
739 // check if the material AGE is positive in the middle of the time step
740 if ( tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
741 double atAge = this->relMatAge - this->castingTime + ( tStep->giveTargetTime() - 0.5 * tStep->giveTimeIncrement() );
742 if ( atAge <= 0. ) {
743 OOFEM_ERROR("Attempting to evaluate stiffness at negative age: %f. Refine time steps or change material definition!\n", atAge);
744 }
745 }
746
747
748 if ( status->giveStoredEmodulusFlag() ) {
749 Emodulus = status->giveStoredEmodulus();
750 } else {
751 #ifdef _OPENMP
752 #pragma omp critical (MPS_Emodulus)
753 #endif
754 { // critical section as EparVal is a class variable; if the receiver is slave model (e.g. ConcreteFCMViscoElastic)
755 // it can be shared by several master models with different parameters
756 if ( EparVal.giveSize() == 0 ) {
757 this->updateEparModuli(0., gp, tStep); // stiffnesses are time independent (evaluated at time t = 0.)
758 }
759
760 // contribution of the solidifying Kelving chain
762 }
763 v = computeSolidifiedVolume(gp, tStep);
764
765 dt = tStep->giveTimeIncrement();
766 eta = this->computeFlowTermViscosity(gp, tStep);
767
768 //incremental viscous flow compliance
769
770 if ( this->CoupledAnalysis == Basic ) {
771 Cf = 0.5 * ( dt ) / eta;
772 } else if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
773 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
774
775 // TRAPEZOIDAL INTEGRATION RULE
776 // is the first time step or the material has been just activated (i.e. the previous time was less than casting time)
777 if ( tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
778 // if ( tStep->isTheFirstStep() ) {
779 etaR = this->giveInitViscosity(tStep) / this->computePsiR(gp, tStep, 0);
780 } else {
781 etaR = status->giveFlowTermViscosity() / this->computePsiR(gp, tStep, 0);
782 }
783
784 dEtaR = eta / this->computePsiR(gp, tStep, 1) - etaR;
785 if ( fabs(dEtaR) > 1.e-4 * etaR ) {
786 L = log(1 + dEtaR / etaR);
787 Cf = dt * ( 1. - etaR * L / dEtaR ) / dEtaR;
788 } else {
789 Cf = dt * ( 0.5 - dEtaR / ( 3 * etaR ) ) / etaR;
790 }
791
792 // TRAPEZOIDAL INTEGRATION RULE
793
794 // MIDPOINT INTEGRATION RULE
795 // if ( tStep->isTheFirstStep() ) {
796 // Cf = dt * this->computePsiR(gp, tStep, 2.) / (eta + this->giveInitViscosity(tStep) );
797 // } else {
798 // Cf = dt * this->computePsiR(gp, tStep, 2.) / (eta + status->giveFlowTermViscosity() );
799 // }
800 // TRAPEZOIDAL INTEGRATION RULE
801 } else {
802 OOFEM_ERROR("mode is not supported");
803 }
804
805 Emodulus = 1. / ( q1 + 1. / ( EspringVal * v ) + sum + Cf );
806 status->storeEmodulus(Emodulus);
807 status->setEmodulusFlag(true);
808 }
809
810 if ( Emodulus < 0. ) {
811 OOFEM_ERROR("Incremental modulus is negative %f", Emodulus);
812 }
813
814 return Emodulus;
815}
816
817
818double
820// compute the relative volume of the solidified material at given age (in days)
821{
822 // standard values of exponents - empirical constants
823 double m = 0.5;
824
825 double alpha = q3 / q2;
826
827 double atAge; // (equivalent age)
828 if ( this->CoupledAnalysis == Basic ) {
829 atAge = this->relMatAge - this->castingTime + ( tStep->giveTargetTime() - 0.5 * tStep->giveTimeIncrement() );
830 } else {
831 atAge = computeEquivalentTime(gp, tStep, 0);
832 }
833
834 return 1. / ( alpha + pow(lambda0 / atAge, m) );
835}
836
837
838double
840{
841 double deltaT = tStep->giveTimeIncrement();
842
843 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
844 deltaT *= 0.5 * ( this->computePsiR(gp, tStep, 0) + this->computePsiR(gp, tStep, 1) );
845 }
846
847 double tauMu = this->giveCharTime(Mu);
848
849 if ( deltaT / tauMu > 30 ) {
850 return 0;
851 } else {
852 return exp(-( deltaT ) / tauMu);
853 }
854}
855
856double
858{
859 double deltaT = tStep->giveTimeIncrement();
860
861 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
862 deltaT *= 0.5 * ( this->computePsiR(gp, tStep, 0) + this->computePsiR(gp, tStep, 1) );
863 }
864
865 double tauMu = this->giveCharTime(Mu);
866
867 if ( deltaT / tauMu < 1.e-5 ) {
868 return 1 - 0.5 * ( deltaT / tauMu ) + 1 / 6 * ( pow(deltaT / tauMu, 2) ) - 1 / 24 * ( pow(deltaT / tauMu, 3) );
869 } else if ( deltaT / tauMu > 30 ) {
870 return tauMu / deltaT;
871 } else {
872 return ( 1.0 - exp(-( deltaT ) / tauMu) ) * tauMu / deltaT;
873 }
874}
875
876double
878{
879 double eta = 0., tHalfStep;
880
881 double prevEta, PsiS, e, dt;
882 double A = 0., B = 0.;
883 double T_new = 0., T_old = 0., H_new = 0., H_old = 0.;
884 double kT = 0.;
885 double kh = 0.;
886
887
888 /* double eta, tHalfStep;
889 *
890 * double prevEta, PsiS, e, dt;
891 * double A, B;
892 * double T_new, T_old, H_new, H_old;
893 * double kT;
894 */
895
896 if ( this->CoupledAnalysis == Basic ) {
897 tHalfStep = this->relMatAge - this->castingTime + ( tStep->giveTargetTime() - 0.5 * tStep->giveTimeIncrement() );
898 eta = tHalfStep / q4;
899 } else if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
900 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
901
902 // check whether this viscosity has been already computed
903 if ( status->giveFlowTermViscosityTemp() != -1. ) {
904 return status->giveFlowTermViscosityTemp();
905
906 // no, the viscosity needs to be evaluated now
907 } else {
908 // the first time step or the material has been just activated (i.e. the previous time was less than casting time)
909 // ask for an initial value of viscosity
910 if ( tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
911 prevEta = this->giveInitViscosity(tStep);
912 } else {
913 // asks for the value of viscosity from the end of the last time-step
914 prevEta = status->giveFlowTermViscosity();
915 }
916
917 dt = tStep->giveTimeIncrement();
918 PsiS = this->computePsiS(gp, tStep); // evaluated in the middle of the time step
919
920 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) ) {
921 if ( this->tau_nano > 0. ) {
922 H_new = this->giveHumidityNano(gp, tStep, 1);
923 H_old = this->giveHumidityNano(gp, tStep, 0);
924 } else {
925 H_new = this->giveHumidity(gp, tStep, 1);
926 H_old = this->giveHumidity(gp, tStep, 0);
927 }
928
929 if ( ( status->giveHumMin() - H_new >= 0. ) || tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
930 status->setHumMin(H_new);
931 kh = 1.0;
932 } else {
933 kh = this->khc;
934 }
935 }
936
937 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
938 T_new = this->giveTemperature(gp, tStep, 1);
939 T_old = this->giveTemperature(gp, tStep, 0);
940
941 if ( ( status->giveTmax() - T_new <= 0. ) || tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
942 status->setTmax(T_new);
943 kT = kTm;
944 } else {
945 kT = kTc;
946 }
947 }
948
949
950 if ( p == 2 ) { // ANALYTICAL SOLUTION FOR "p" = 2
951 // evaluate auxiliary factors A and B
952
953 if ( this->CoupledAnalysis == MPS_full ) {
954 if ( kTm == -1. ) {
955 A = sqrt( muS * fabs( ( T_new + T_old ) * kh * ( H_new - H_old ) / ( H_new + H_old ) + log( ( H_new + H_old ) / 2.) * ( T_new - T_old ) ) / ( dt * this->roomTemperature ) );
956 } else {
957 A = sqrt( muS * fabs( ( T_new + T_old ) * kh * ( H_new - H_old ) / ( H_new + H_old ) - kT * ( T_new - T_old ) ) / ( dt * this->roomTemperature ) );
958 }
959 B = sqrt(PsiS / this->q4);
960 } else if ( this->CoupledAnalysis == MPS_humidity ) {
961 // original version of the RHS for constant && room temperature
962 A = sqrt(muS * ( kh * fabs( log(H_new) - log(H_old) ) ) / dt);
963 B = sqrt(PsiS / this->q4);
964 } else if ( this->CoupledAnalysis == MPS_temperature ) {
965 A = sqrt( muS * fabs( kT * ( T_new - T_old ) ) / ( dt * this->roomTemperature ) );
966 B = sqrt(PsiS / this->q4);
967 } else {
968 OOFEM_ERROR("mode is not supported");
969 }
970
971 if ( ( A * B * dt ) > 1.e-6 ) {
972 e = exp(-2 * A * B * dt);
973 eta = ( B / A ) * ( B * ( 1. - e ) + A * prevEta * ( 1. + e ) ) / ( B * ( 1. + e ) + A * prevEta * ( 1. - e ) );
974 } else {
975 eta = ( prevEta + B * B * dt ) / ( 1. + A * A * prevEta * dt );
976 }
977 } else if ( ( p < 100 ) && ( p > 2 ) ) { // SOLUTION FOR VARIOUS "p" EXPLOITING NEXTON'S METHOD
978 double iterTol = 1.e-12;
979 double deltaEta;
980 double deltaDeltaEta;
981 double f, df;
982 int k;
983
984 if ( this->CoupledAnalysis == MPS_full ) {
985 if ( kTm == -1. ) {
986 A = pow( muS, 1. / ( p - 1. ) ) * fabs( ( T_new + T_old ) * kh * ( H_new - H_old ) / ( H_new + H_old ) + log( ( H_new + H_old ) / 2.) * ( T_new - T_old ) ) / ( dt * this->roomTemperature );
987 } else {
988 A = pow( muS, 1. / ( p - 1. ) ) * fabs( ( T_new + T_old ) * kh * ( H_new - H_old ) / ( H_new + H_old ) - kT * ( T_new - T_old ) ) / ( dt * this->roomTemperature );
989 }
990 B = PsiS / this->q4;
991 } else if ( this->CoupledAnalysis == MPS_humidity ) {
992 A = pow( muS, 1. / ( p - 1. ) ) * ( kh * fabs( log(H_new) - log(H_old) ) ) / dt;
993 B = PsiS / this->q4;
994 } else if ( this->CoupledAnalysis == MPS_temperature ) {
995 A = pow( muS, 1. / ( p - 1. ) ) * fabs( kT * ( T_new - T_old ) ) / ( dt * this->roomTemperature );
996 B = PsiS / this->q4;
997 } else {
998 OOFEM_ERROR("mode is not supported");
999 }
1000
1001 deltaEta = 0.;
1002 deltaDeltaEta = 0.;
1003 k = 1;
1004 double relError = 1.;
1005
1006 while ( relError > iterTol ) {
1007 f = deltaEta / dt + A * pow( prevEta + 0.5 * deltaEta, p / ( p - 1. ) ) - B;
1008 df = 1 / dt + A * p * pow( prevEta + 0.5 * deltaEta, 1. / ( p - 1. ) ) / ( 2. * ( p - 1. ) );
1009
1010 deltaDeltaEta = -f / df;
1011 deltaEta += deltaDeltaEta;
1012
1013 if ( k++ > 50 ) {
1014 OOFEM_ERROR("iterative Newton method not converging");
1015 }
1016
1017 relError = fabs(deltaDeltaEta / deltaEta);
1018 }
1019
1020 eta = prevEta + deltaEta;
1021 } else if ( p < 0. ) { // SOLUTION FOR NEGATIVE "p"
1022 // } else if (p < 0.) { // SOLUTION FOR NEGATIVE "p"
1023 double iterTol = 1.e-6;
1024 double deltaEta;
1025 double deltaDeltaEta;
1026 double f, df;
1027 int k;
1028
1029 if ( this->CoupledAnalysis == MPS_full ) {
1030 if ( kTm == -1. ) {
1031 if ( kh < 1. ) {
1032 A = ( fabs(log( ( H_new + H_old ) / 2.) ) * fabs(T_new - T_old) + 0.5 * ( T_new + T_old ) * kh * fabs( log(H_new) - log(H_old) ) ) * pow( muS, 1. / ( p - 1. ) ) / ( dt * this->roomTemperature );
1033 } else { // kh == 1
1034 A = pow( muS, 1. / ( p - 1. ) ) * fabs( T_new * log(H_new) - T_old * log(H_old) ) / ( dt * this->roomTemperature );
1035 }
1036 } else {
1037 A = ( kT * fabs(T_new - T_old) + 0.5 * ( T_new + T_old ) * kh * fabs( log(H_new) - log(H_old) ) ) * pow( muS, 1. / ( p - 1. ) ) / ( dt * this->roomTemperature );
1038 }
1039
1040 B = PsiS / this->q4;
1041 } else if ( this->CoupledAnalysis == MPS_humidity ) {
1042 A = ( kh * fabs( log(H_new) - log(H_old) ) ) * pow( muS, 1. / ( p - 1. ) ) / dt;
1043 B = PsiS / this->q4;
1044 } else if ( this->CoupledAnalysis == MPS_temperature ) {
1045 A = kT * fabs(T_new - T_old) * pow( muS, 1. / ( p - 1. ) ) / ( dt * this->roomTemperature );
1046 B = PsiS / this->q4;
1047 } else {
1048 OOFEM_ERROR("mode is not supported");
1049 }
1050
1051 deltaEta = 0.;
1052 deltaDeltaEta = 0.;
1053 k = 1;
1054 double relError = 1.;
1055 double minEta = 1.e-6;
1056
1057 while ( relError > iterTol ) {
1058 f = deltaEta / dt + A * pow( prevEta + deltaEta, p / ( p - 1. ) ) - B;
1059 df = 1 / dt + A * pow( prevEta + deltaEta, 1. / ( p - 1. ) ) * p / ( p - 1. );
1060
1061 deltaDeltaEta = -f / df;
1062 deltaEta += deltaDeltaEta;
1063
1064 if ( ( prevEta + deltaEta ) < 0 ) {
1065 deltaEta = minEta - prevEta;
1066 }
1067
1068 if ( k++ > 50 ) {
1069 OOFEM_ERROR("iterative Newton method not converging");
1070 }
1071
1072
1073 relError = fabs(deltaDeltaEta / deltaEta);
1074 }
1075
1076 eta = prevEta + deltaEta;
1077 } else { // ANALYTICAL SOLUTION FOR "p" = INFINITY
1078 // version for infinite value of parameter p
1079 // evaluate auxiliary factors A and B
1080 if ( this->CoupledAnalysis == MPS_full ) {
1081 // original version of the RHS for variable/elevated temperature
1082 if ( kTm == -1. ) {
1083 if ( kh < 1. ) {
1084 A = k3 * ( fabs(log( ( H_new + H_old ) / 2.) ) * fabs(T_new - T_old) + 0.5 * ( T_new + T_old ) * kh * fabs( log(H_new) - log(H_old) ) ) / ( dt * this->roomTemperature );
1085 } else { // kh == 1
1086 A = k3 * fabs( T_new * log(H_new) - T_old * log(H_old) ) / ( dt * this->roomTemperature );
1087 }
1088 } else {
1089 A = k3 * ( kT * fabs(T_new - T_old) + 0.5 * ( T_new + T_old ) * kh * fabs( log(H_new) - log(H_old) ) ) / ( dt * this->roomTemperature );
1090 }
1091
1092 B = PsiS / this->q4;
1093 } else if ( this->CoupledAnalysis == MPS_humidity ) {
1094 // original version of the RHS for constant && room temperature
1095 // compiler warning:
1096 A = k3 * ( kh * fabs( log(H_new) - log(H_old) ) ) / dt;
1097 B = PsiS / this->q4;
1098 } else if ( this->CoupledAnalysis == MPS_temperature ) {
1099 A = k3 * kT * fabs(T_new - T_old) / ( dt * this->roomTemperature );
1100 B = PsiS / this->q4;
1101 } else {
1102 OOFEM_ERROR("mode is not supported");
1103 }
1104
1105 //if ( A < 1.e-14 ) {
1106 if ( A < 1.e-10 ) {
1107 eta = prevEta + B * dt;
1108 } else {
1109 if ( ( A * dt ) > 30. ) {
1110 eta = prevEta;
1111 } else {
1112 eta = ( prevEta - B / A ) * exp(-A * dt) + B / A;
1113 }
1114 }
1115 }
1116
1117 // and now we store into the material status new value of viscosity
1118 status->setFlowTermViscosityTemp(eta);
1119 }
1120 } else {
1121 OOFEM_ERROR("mode is not supported");
1122 }
1123
1124 if ( eta <= 0. ) {
1125 OOFEM_ERROR("trying to return negative viscosity %f", eta);
1126 }
1127
1128 if ( eta != eta ) {
1129 OOFEM_ERROR("eta is NaN: %f", eta);
1130 }
1131
1132
1133 return eta;
1134}
1135
1136// returns initial value of the flow term viscosity
1137double
1139{
1140 if ( ( t0 - tStep->giveTimeIncrement() ) <= 0. ) {
1141 OOFEM_ERROR("length of the first time step increment %e must be smaller than t0 %e", tStep->giveTimeIncrement(), t0);
1142 }
1143
1144 return ( t0 - tStep->giveTimeIncrement() ) / q4;
1145}
1146
1147
1148void
1149MPSMaterial::giveEigenStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
1150//
1151// computes the strain due to creep at constant stress during the increment
1152// (in fact, the INCREMENT of creep strain is computed for mode == VM_Incremental)
1153//
1154{
1155 FloatArray KelvinEigenStrain, reducedAnswer, sigma;
1156 FloatMatrix C;
1157
1158 double eta, dt;
1159 double dEtaR, etaR, L;
1160
1161 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
1162
1163 if ( mode == VM_Incremental ) {
1164 // sigma = status->giveStressVector(); //stress vector at the beginning of time-step
1165 sigma = status->giveViscoelasticStressVector();
1166 this->giveUnitComplianceMatrix(C, gp, tStep);
1167
1168 reducedAnswer.beProductOf(C, sigma);
1169
1170 // flow strain increment at constant stress
1171 dt = tStep->giveTimeIncrement();
1172 eta = this->computeFlowTermViscosity(gp, tStep);
1173
1174 if ( this->CoupledAnalysis == Basic ) {
1175 reducedAnswer.times(dt / eta);
1176 } else if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
1177 // TRAPEZOIDAL INTEGRATION RULE
1178 // if ( tStep->isTheFirstStep() ) {
1179 // is the first time step or the material has been just activated (i.e. the previous time was less than casting time)
1180 if ( tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
1181 etaR = this->giveInitViscosity(tStep) / this->computePsiR(gp, tStep, 0);
1182 } else {
1183 etaR = status->giveFlowTermViscosity() / this->computePsiR(gp, tStep, 0);
1184 }
1185
1186 dEtaR = eta / this->computePsiR(gp, tStep, 1) - etaR;
1187
1188 if ( fabs(dEtaR) > 1.e-4 * etaR ) {
1189 L = log(1 + dEtaR / etaR);
1190 reducedAnswer.times(dt * L / dEtaR);
1191 } else {
1192 reducedAnswer.times(dt * ( 1 - 0.5 * dEtaR / etaR + dEtaR * dEtaR / ( 3 * etaR * etaR ) ) / etaR);
1193 }
1194
1195 // TRAPEZOIDAL INTEGRATION RULE
1196
1197 // MIDPOINT INTEGRATION RULE
1198 // if ( tStep->isTheFirstStep() ) {
1199 // reducedAnswer.times( dt * 2. * this->computePsiR(gp, tStep, 2) / ( eta + this->giveInitViscosity(tStep) ) );
1200 // } else {
1201 // reducedAnswer.times( dt * 2. * this->computePsiR(gp, tStep, 2) / ( eta + status->giveFlowTermViscosity() ) );
1202 // }
1203 // MIDPOINT INTEGRATION RULE
1204 } else {
1205 OOFEM_ERROR("mode is not supported")
1206 }
1207
1208 //computes creep component of the Kelvin Chain
1209 KelvinChainSolidMaterial::giveEigenStrainVector(KelvinEigenStrain, gp, tStep, mode);
1210 reducedAnswer.add(KelvinEigenStrain);
1211
1212 answer = reducedAnswer;
1213
1214#ifdef keep_track_of_strains
1215 status->setCreepStrainIncrement(answer);
1216#endif
1217 } else {
1218#ifndef keep_track_of_strains
1219 OOFEM_ERROR("for total formulation of shrinkage strains need to define keep_track_of_strains");
1220#else
1221 answer = status->giveCreepStrain();
1222 this->giveEigenStrainVector(reducedAnswer, gp, tStep, VM_Incremental);
1223 answer.add(reducedAnswer);
1224 return;
1225
1226#endif
1227 }
1228}
1229
1230
1231void
1233{
1234 /* dEpsSh/dt = kSh * dh/dt (h = humidity)
1235 * ->> EpsSh = kSh * h_difference
1236 */
1237 int size;
1238 MaterialMode mMode = gp->giveMaterialMode();
1239
1240 if ( ( mMode == _3dShell ) || ( mMode == _3dBeam ) || ( mMode == _2dPlate ) || ( mMode == _2dBeam ) ) {
1241 size = 12;
1242 } else {
1243 size = 6;
1244 }
1245
1246 double kShFactor = 1.;
1247 if ( this->sh_a != 1. ) {
1248 double h = this->giveHumidity(gp, tStep, 2);
1249 kShFactor = sh_a + ( 1. - sh_a ) / ( 1. + pow( ( 1. - h ) / ( 1. - sh_hC ), sh_n) );
1250 }
1251
1252
1253 if ( ksh_h.giveSize() >= 2 ) {
1254 double h = this->giveHumidity(gp, tStep, 2);
1255 double tol = 1.e-10;
1256 for ( int i = 2; i <= ksh_h.giveSize(); i++ ) {
1257 if ( ( h - ksh_h.at(i) ) < tol ) {
1258 kShFactor *= ksh_fh.at(i - 1) + ( h - ksh_h.at(i - 1) ) * ( ksh_fh.at(i) - ksh_fh.at(i - 1) ) / ( ksh_h.at(i) - ksh_h.at(i - 1) );
1259 break;
1260 }
1261 }
1262 }
1263
1264 if ( this->timeDependent_ksh ) {
1265 double te = this->computeEquivalentTime(gp, tStep, 0);
1266 kShFactor *= MPSMaterial::computeCreepFunction(te + 0.01 * this->lambda0, te, gp, tStep) / MPSMaterial::computeCreepFunction(28.01 * this->lambda0, 28. * this->lambda0, gp, tStep);
1267 }
1268
1269 double humDiff = this->giveHumidity(gp, tStep, 3);
1270
1271 double EpsSh = humDiff * kSh * kShFactor;
1272
1273 FloatArray fullAnswer(size);
1274
1275 if ( ( mMode == _2dLattice ) || ( mMode == _3dLattice ) ) {
1276 fullAnswer.at(1) = EpsSh;
1277 } else {
1278 fullAnswer.at(1) = fullAnswer.at(2) = fullAnswer.at(3) = EpsSh;
1279 }
1280
1282}
1283
1284void
1286{
1287 /* from fib MC 2010: equations 5.1-76, 5.1-79
1288 * eps_cas(t) = eps_cas0 * beta_as(t)
1289 * beta_as(t) = 1 - exp( -0.2 * sqrt(t) )
1290 *
1291 * ->> d_eps_cas(t) = eps_cas0 * [ -exp(-0.2 * sqrt(t_e_n+1) ) + exp(-0.2 * sqrt(t_e_n) ) ]
1292 */
1293
1294 int size;
1295 MaterialMode mMode = gp->giveMaterialMode();
1296
1297 if ( ( mMode == _3dShell ) || ( mMode == _3dBeam ) || ( mMode == _2dPlate ) || ( mMode == _2dBeam ) ) {
1298 size = 12;
1299 } else {
1300 size = 6;
1301 }
1302
1303 double t_equiv_beg, t_equiv_end;
1304 // if ( tStep->isTheFirstStep() ) {
1305 // is the first time step or the material has been just activated (i.e. the previous time was less than casting time)
1306 if ( tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
1307 t_equiv_beg = this->relMatAge - tStep->giveTimeIncrement();
1308 } else {
1309 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
1310 t_equiv_beg = status->giveEquivalentTime();
1311 }
1312 // time must be converted into days
1313 t_equiv_beg /= this->lambda0;
1314
1315 t_equiv_end = this->computeEquivalentTime(gp, tStep, 1);
1316 // time must be converted into days
1317 t_equiv_end /= this->lambda0;
1318
1319 double eps_cas = eps_cas0 * ( -exp( -0.2 * sqrt(t_equiv_end) ) + exp( -0.2 * sqrt(t_equiv_beg) ) );
1320
1321 FloatArray fullAnswer(size);
1322
1323 if ( ( mMode == _2dLattice ) || ( mMode == _3dLattice ) ) {
1324 fullAnswer.at(1) = eps_cas;
1325 } else {
1326 fullAnswer.at(1) = fullAnswer.at(2) = fullAnswer.at(3) = eps_cas;
1327 }
1328
1330}
1331
1332
1333void
1335{
1336 /* from Bazant's B4 model (ver. Dec 2014): equations 23-25 and Table 2
1337 * eps_au(t) = eps_au_infty * [ 1 + (tau_au / t_eq)^alpha ]^r_t
1338 * alpha = r_alpha * (wc/0.38)
1339 * eps_au_infty = -eps_au_cem * (ac/6)^r_ea * (wc/0.38)^r_ew
1340 * tau_au = tau_au_cem * (wc/0.38)^r_tw
1341 */
1342 int size;
1343 MaterialMode mMode = gp->giveMaterialMode();
1344
1345 if ( ( mMode == _3dShell ) || ( mMode == _3dBeam ) || ( mMode == _2dPlate ) || ( mMode == _2dBeam ) ) {
1346 size = 12;
1347 } else {
1348 size = 6;
1349 }
1350
1351 // is the first time step or the material has been just activated (i.e. the previous time was less than casting time)
1352 double t_equiv_beg, t_equiv_end;
1353 if ( tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
1354 t_equiv_beg = this->relMatAge - tStep->giveTimeIncrement();
1355 } else {
1356 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
1357 t_equiv_beg = status->giveEquivalentTime();
1358 }
1359
1360 t_equiv_end = this->computeEquivalentTime(gp, tStep, 1);
1361 // t_equiv_beg, t_equiv_end and b4_tau_au are in time-units of the analysis
1362 double eps_au = b4_eps_au_infty * ( pow(1. + pow(b4_tau_au / t_equiv_end, b4_alpha), b4_r_t) - pow(1. + pow(b4_tau_au / t_equiv_beg, b4_alpha), b4_r_t) );
1363
1364 FloatArray fullAnswer(size);
1365
1366 if ( ( mMode == _2dLattice ) || ( mMode == _3dLattice ) ) {
1367 fullAnswer.at(1) = eps_au;
1368 } else {
1369 fullAnswer.at(1) = fullAnswer.at(2) = fullAnswer.at(3) = eps_au;
1370 }
1371
1373}
1374
1375void
1377{
1378 int size;
1379 MaterialMode mMode = gp->giveMaterialMode();
1380
1381 if ( ( mMode == _3dShell ) || ( mMode == _3dBeam ) || ( mMode == _2dPlate ) || ( mMode == _2dBeam ) ) {
1382 size = 12;
1383 } else {
1384 size = 6;
1385 }
1386
1387 // is the first time step or the material has been just activated (i.e. the previous time was less than casting time)
1388 double t_equiv_beg, t_equiv_end;
1389 if ( tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
1390 t_equiv_beg = this->relMatAge - tStep->giveTimeIncrement();
1391 } else {
1392 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
1393 t_equiv_beg = status->giveEquivalentTime();
1394 }
1395
1396 t_equiv_end = this->computeEquivalentTime(gp, tStep, 1);
1397
1398 double eps_au = domain->giveFunction(this->autoShrinkageTF)->evaluateAtTime(t_equiv_end);
1399 eps_au -= domain->giveFunction(this->autoShrinkageTF)->evaluateAtTime(t_equiv_beg);
1400
1401 FloatArray fullAnswer(size);
1402
1403 if ( ( mMode == _2dLattice ) || ( mMode == _3dLattice ) ) {
1404 fullAnswer.at(1) = eps_au;
1405 } else {
1406 fullAnswer.at(1) = fullAnswer.at(2) = fullAnswer.at(3) = eps_au;
1407 }
1408
1410}
1411
1412
1413#if 0
1414double
1415MPSMaterial::inverse_sorption_isotherm const
1416// Function calculates relative humidity from water content (inverse relation form sorption isotherm).
1417// Relative humidity (phi) is from range 0.2 - 0.98 !!!
1418// sorption isotherm by C. R. Pedersen (1990), Combined heat and moisture transfer in building constructions,
1419// PhD-thesis, Technical University of Denmark, Lyngby.
1420// w (kg/kg) ... water content
1421// phi ... relative humidity
1422// w_h, n, a ... constants obtained from experiments
1423{
1424 //relative humidity
1425 double phi = exp( a * ( 1.0 - pow( ( w_h / w ), ( n ) ) ) );
1426
1427 /*if ( ( phi < 0.2 ) || ( phi > 0.98 ) ) {
1428 * OOFEM_ERROR("Relative humidity h = %e (w=%e) is out of range", phi, w);
1429 * }*/
1430 //if ( phi < 0.20 ){ phi = 0.2;}
1431 //if ( phi > 0.98 ){ phi = 0.98;}
1432
1433 return phi;
1434}
1435#endif
1436
1437double
1438MPSMaterial::giveHumidity(GaussPoint *gp, TimeStep *tStep, int option) const
1439{
1440 double H_tot = 0.0, H_inc = 0.0;
1441
1442 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
1443
1444 // compute humidity and its increment if the step is first or humidity has not been yet computed
1445 if ( ( status->giveHum() == -1. ) && ( status->giveHumIncrement() == -1. ) ) {
1446 FieldManager *fm = domain->giveEngngModel()->giveContext()->giveFieldManager();
1447
1448 FieldPtr tf;
1449 int err, wflag = 0;
1450 FloatArray gcoords;
1451 FloatArray et2, ei2; // total and incremental values of water mass
1452
1453 if ( ( tf = fm->giveField(FT_HumidityConcentration) ) ) {
1455 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) {
1456 OOFEM_ERROR("tf->evaluateAt failed, error value %d", err);
1457 }
1458
1459 if ( ( err = tf->evaluateAt(ei2, gcoords, VM_Incremental, tStep) ) ) {
1460 OOFEM_ERROR("tf->evaluateAt failed, error value %d", err);
1461 }
1462
1463 H_tot = et2.at(1);
1464 H_inc = ei2.at(1);
1465
1466 // convert water mass to relative humidity
1467 // H_tot = this->inverse_sorption_isotherm( et2.at(1) );
1468 // H_inc = this->inverse_sorption_isotherm( et2.at(1) ) - this->inverse_sorption_isotherm( et2.at(1) - ei2.at(1) );
1469 wflag = 1;
1470 }
1471
1472 if ( wflag == 0 ) {
1473 OOFEM_ERROR("external fields not found");
1474 }
1475
1476 // write field values to status
1477 status->setHum(H_tot);
1478 status->setHumIncrement(H_inc);
1479 } else {
1480 H_tot = status->giveHum();
1481 H_inc = status->giveHumIncrement();
1482 }
1483
1484 switch ( option ) {
1485 case 0: return H_tot - H_inc; // returns relative humidity on the BEGINNING of the time step
1486
1487 case 1: return H_tot; // returns relative humidity in the END of the time step
1488
1489 case 2: return H_tot - 0.5 * H_inc; // returns relative humidity in the middle of the time step = AVERAGE
1490
1491 case 3: return H_inc; // returns relative humidity INCREMENT
1492
1493 default: OOFEM_ERROR("option %d not supported", option);
1494 }
1495 // return 0.; // happy compiler
1496}
1497
1498
1499double
1501{
1502 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
1503
1504 double h_nano_beg, h_nano_end;
1505
1506 double h_beg = this->giveHumidity(gp, tStep, 0);
1507 double h_end = this->giveHumidity(gp, tStep, 1);
1508
1509 // is the first time step or the material has been just activated (i.e. the previous time was less than casting time)
1510 if ( tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
1511 h_nano_beg = h_beg;
1512 } else {
1513 h_nano_beg = status->giveHumNano();
1514 }
1515
1516 double deltaT = tStep->giveTimeIncrement();
1517 double beta, lambda;
1518
1519 if ( deltaT / this->tau_nano > 30 ) {
1520 beta = 0.;
1521 } else {
1522 beta = exp(-( deltaT ) / this->tau_nano);
1523 }
1524
1525 if ( deltaT / this->tau_nano < 1.e-5 ) {
1526 lambda = 1. - 0.5 * ( deltaT / this->tau_nano ) + 1. / 6. * ( pow(deltaT / this->tau_nano, 2) ) - 1. / 24. * ( pow(deltaT / this->tau_nano, 3) );
1527 } else if ( deltaT / this->tau_nano > 30. ) {
1528 lambda = this->tau_nano / deltaT;
1529 } else {
1530 lambda = ( 1.0 - beta ) * this->tau_nano / deltaT;
1531 }
1532
1533 h_nano_end = h_nano_beg + ( 1. - lambda ) * ( h_end - h_beg ) + ( 1. - beta ) * ( h_beg - h_nano_beg );
1534
1535 status->setHumNanoTemp(h_nano_end);
1536
1537 switch ( option ) {
1538 case 0: return h_nano_beg; // returns relative humidity IN THE NANOPORES on the BEGINNING of the time step
1539
1540 case 1: return h_nano_end; // returns relative humidity IN THE NANOPORES in the END of the time step
1541
1542 case 2: return 0.5 * ( h_nano_beg + h_nano_end ); // returns relative humidity IN THE NANOPORES in the middle of the time step = AVERAGE
1543
1544 case 3: return ( h_nano_end - h_nano_beg ); // returns relative humidity IN THE NANOPORES INCREMENT
1545
1546 default: OOFEM_ERROR("option %d not supported", option);
1547 }
1548
1549 // return 0.; // happy compiler
1550}
1551
1552double
1554{
1555 double T_tot = 0.0, T_inc = 0.0;
1556 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
1557
1558 // compute temperature and its increment if the step is first or temperature has not been yet computed
1559 if ( ( status->giveT() == -1. ) && ( status->giveTIncrement() == -1. ) ) {
1560 FieldManager *fm = domain->giveEngngModel()->giveContext()->giveFieldManager();
1561
1562 FieldPtr tf;
1563 int err, tflag = 0;
1564 FloatArray gcoords;
1565 FloatArray et1, ei1; // total and incremental values of temperature
1566
1567 if ( ( tf = fm->giveField(FT_Temperature) ) ) {
1569 if ( ( err = tf->evaluateAt(et1, gcoords, VM_Total, tStep) ) ) {
1570 OOFEM_ERROR("tf->evaluateAt failed, error value %d", err);
1571 }
1572
1573 if ( ( err = tf->evaluateAt(ei1, gcoords, VM_Incremental, tStep) ) ) {
1574 OOFEM_ERROR("tf->evaluateAt failed, error value %d", err);
1575 }
1576
1577 T_tot = et1.at(1) + temperScaleDifference;
1578 T_inc = ei1.at(1);
1579
1580 tflag = 1;
1581 }
1582
1583 if ( tflag == 0 ) {
1584 OOFEM_ERROR("external fields not found");
1585 }
1586
1587 // write field values to status
1588 status->setT(T_tot);
1589 status->setTIncrement(T_inc);
1590 } else {
1591 T_tot = status->giveT();
1592 T_inc = status->giveTIncrement();
1593 }
1594
1595
1596 switch ( option ) {
1597 case 0: return T_tot - T_inc; // returns temperature on the BEGINNING of the time step
1598
1599 case 1: return T_tot; // returns temperature in the END of the time step
1600
1601 case 2: return T_tot - 0.5 * T_inc; // returns temperature in the middle of the time step = AVERAGE
1602
1603 case 3: return T_inc; // returns temperature INCREMENT
1604
1605 default: OOFEM_ERROR("option %d not supported", option);
1606 }
1607 // return 0.; // happy compiler
1608}
1609
1610double
1611MPSMaterial::computePsiR(GaussPoint *gp, TimeStep *tStep, int option) const
1612{
1613 if ( this->CoupledAnalysis == MPS_humidity ) {
1614 double H = 0.;
1615 if ( this->tau_nano > 0. ) {
1616 H = this->giveHumidityNano(gp, tStep, option);
1617 } else {
1618 H = this->giveHumidity(gp, tStep, option);
1619 }
1620 double betaRH = alphaR + ( 1. - alphaR ) * H * H;
1621 return betaRH;
1622 } else if ( this->CoupledAnalysis == MPS_temperature ) {
1623 double T = this->giveTemperature(gp, tStep, option);
1624 double betaRT = exp( QRtoR * ( 1. / this->roomTemperature - 1. / T ) );
1625 return betaRT;
1626 } else if ( this->CoupledAnalysis == MPS_full ) {
1627 double H = 0.;
1628 if ( this->tau_nano > 0. ) {
1629 H = this->giveHumidityNano(gp, tStep, option);
1630 } else {
1631 H = this->giveHumidity(gp, tStep, option);
1632 }
1633 double T = this->giveTemperature(gp, tStep, option);
1634 double betaRH = alphaR + ( 1. - alphaR ) * H * H;
1635 double betaRT = exp( QRtoR * ( 1. / this->roomTemperature - 1. / T ) );
1636 return betaRH * betaRT;
1637 } else {
1638 OOFEM_ERROR("mode is not supported");
1639 }
1640}
1641
1642double
1644{
1645 if ( this->CoupledAnalysis == MPS_humidity ) {
1646 double AverageHum = 0.;
1647 if ( this->tau_nano > 0. ) {
1648 AverageHum = this->giveHumidityNano(gp, tStep, 2);
1649 } else {
1650 AverageHum = this->giveHumidity(gp, tStep, 2);
1651 }
1652 double betaSH = alphaS + ( 1. - alphaS ) * AverageHum * AverageHum;
1653 return betaSH;
1654 } else if ( this->CoupledAnalysis == MPS_temperature ) {
1655 double AverageTemp = this->giveTemperature(gp, tStep, 2);
1656 double betaST = exp( QStoR * ( 1. / this->roomTemperature - 1. / AverageTemp ) );
1657 return betaST;
1658 } else if ( this->CoupledAnalysis == MPS_full ) {
1659 double AverageHum = 0.;
1660 if ( this->tau_nano > 0. ) {
1661 AverageHum = this->giveHumidityNano(gp, tStep, 2);
1662 } else {
1663 AverageHum = this->giveHumidity(gp, tStep, 2);
1664 }
1665
1666 double AverageTemp = this->giveTemperature(gp, tStep, 2);
1667 double betaSH = alphaS + ( 1. - alphaS ) * AverageHum * AverageHum;
1668 double betaST = exp( QStoR * ( 1. / this->roomTemperature - 1. / AverageTemp ) );
1669 return betaSH * betaST;
1670 } else {
1671 OOFEM_ERROR("mode is not supported");
1672 }
1673}
1674
1675//for equivalent time
1676double
1678{
1679 double hydrationTimescale = 1.;
1680 if ( hydrationTimescaleTF ) {
1681 hydrationTimescale = domain->giveFunction(hydrationTimescaleTF)->evaluateAtTime(tStep->giveIntrinsicTime() );
1682 }
1683
1684 if ( this->CoupledAnalysis == MPS_humidity ) {
1685 double AverageHum = this->giveHumidity(gp, tStep, 2);
1686 double betaEH = 1. / ( 1. + pow( ( alphaE * ( 1. - AverageHum ) ), 4.) );
1687 return hydrationTimescale * betaEH;
1688 } else if ( this->CoupledAnalysis == MPS_temperature ) {
1689 double AverageTemp = this->giveTemperature(gp, tStep, 2);
1690 double betaET = exp( QEtoR * ( 1. / this->roomTemperature - 1. / AverageTemp ) );
1691 return hydrationTimescale * betaET;
1692 } else if ( this->CoupledAnalysis == MPS_full ) {
1693 double AverageHum = this->giveHumidity(gp, tStep, 2);
1694 double AverageTemp = this->giveTemperature(gp, tStep, 2);
1695 double betaEH = 1. / ( 1. + pow( ( alphaE * ( 1. - AverageHum ) ), 4.) );
1696 double betaET = exp( QEtoR * ( 1. / this->roomTemperature - 1. / AverageTemp ) );
1697 return hydrationTimescale * betaEH * betaET;
1698 } else {
1699 OOFEM_ERROR(" mode is not supported");
1700 }
1701}
1702
1703
1704double
1706{
1707 double PsiE = 1.;
1708
1709 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) ||
1710 ( this->CoupledAnalysis == MPS_temperature ) ) {
1711 PsiE = computePsiE(gp, tStep);
1712 }
1713
1714 // is the first time step or the material has been just activated (i.e. the previous time was less than casting time)
1715 if ( tStep->isTheFirstStep() || ( !Material::isActivated( tStep->givePreviousStep() ) ) ) {
1716 if ( option == 0 ) { // gives time in the middle of the timestep
1717 return this->relMatAge - tStep->giveTimeIncrement() + PsiE * ( 0.5 * tStep->giveTimeIncrement() );
1718 } else if ( option == 1 ) { // gives time in the end of the timestep - for UPDATING
1719 return this->relMatAge - tStep->giveTimeIncrement() + PsiE * tStep->giveTimeIncrement();
1720 } else {
1721 OOFEM_ERROR("mode is not supported");
1722 }
1723 } else {
1724 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
1725 double tEquiv = status->giveEquivalentTime();
1726
1727 if ( option == 0 ) { // gives time in the middle of the timestep
1728 tEquiv += PsiE * 0.5 * tStep->giveTimeIncrement();
1729 } else if ( option == 1 ) { // gives time on the end of the timestep - for UPDATING
1730 tEquiv += PsiE * tStep->giveTimeIncrement();
1731 } else {
1732 OOFEM_ERROR("mode is not supported")
1733 }
1734
1735 return tEquiv;
1736 }
1737}
1738
1739
1740int
1742{
1743 MPSMaterialStatus *status = static_cast< MPSMaterialStatus * >( this->giveStatus(gp) );
1744 if ( type == IST_DryingShrinkageTensor ) {
1745 answer.resize(6);
1746 answer.zero();
1747 answer.at(1) = answer.at(2) = answer.at(3) = status->giveDryingShrinkageStrain();
1748 return 1;
1749 } else if ( type == IST_AutogenousShrinkageTensor ) {
1750 answer.resize(6);
1751 answer.zero();
1752 answer.at(1) = answer.at(2) = answer.at(3) = status->giveAutogenousShrinkageStrain();
1753 return 1;
1754 } else if ( type == IST_TotalShrinkageTensor ) {
1755 answer.resize(6);
1756 answer.zero();
1757 answer.at(1) = answer.at(2) = answer.at(3) = status->giveAutogenousShrinkageStrain() + status->giveDryingShrinkageStrain();
1758 return 1;
1759 } else if ( type == IST_CreepStrainTensor ) {
1761 return 1;
1762 } else if ( type == IST_IncrementCreepModulus ) {
1763 answer.resize(1);
1764 answer.zero();
1765 answer.at(1) = giveEModulus(gp, tStep);
1766 status->giveStoredEmodulus();
1767 return 1;
1768 } else if ( type == IST_EquivalentTime ) {
1769 answer.resize(1);
1770 answer.zero();
1771 answer.at(1) = status->giveEquivalentTime();
1772 return 1;
1773 } else {
1774 return RheoChainMaterial::giveIPValue(answer, gp, type, tStep);
1775 }
1776 // return 0; // to make the compiler happy
1777}
1778} // end namespace oofem
#define REGISTER_Material(class)
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.
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
Definition element.C:1225
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition femcmpnn.h:79
int number
Component number.
Definition femcmpnn.h:77
FieldPtr giveField(FieldType key)
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
void add(const FloatArray &src)
Definition floatarray.C:218
void times(double s)
Definition floatarray.C:834
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
Definition gausspoint.h:138
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition gausspoint.h:190
Element * giveElement()
Returns corresponding element to receiver.
Definition gausspoint.h:187
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
GaussPoint * gp
Associated integration point.
void restoreContext(DataStream &stream, ContextMode mode) override
void saveContext(DataStream &stream, ContextMode mode) override
KelvinChainSolidMaterialStatus(GaussPoint *g, int nunits)
void updateYourself(TimeStep *tStep) override
void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const override
void giveEigenStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const override
void initializeFrom(InputRecord &ir) override
double giveEModulus(GaussPoint *gp, TimeStep *tStep) const override
Evaluation of the incremental modulus.
void setHum(double src)
Stores relative humidity.
Definition mps.h:149
void setFlowTermViscosityTemp(double src)
Definition mps.h:190
double tempDryingShrinkageStrain
Definition mps.h:129
void storeEmodulus(double src)
Returns Emodulus if computed previously in the same tStep.
Definition mps.h:193
MPSMaterialStatus(GaussPoint *g, int nunits)
Definition mps.C:54
double giveTIncrement()
Returns temperature increment.
Definition mps.h:173
void setEmodulusFlag(bool src)
Definition mps.h:194
FloatArray creepStrain
Definition mps.h:132
void updateYourself(TimeStep *tStep) override
Definition mps.C:65
double giveHumIncrement()
Returns relative humidity increment.
Definition mps.h:151
void setTmax(double src)
Stores maximum reached temperature.
Definition mps.h:180
FloatArray creepStrainIncrement
Definition mps.h:133
void saveContext(DataStream &stream, ContextMode mode) override
Definition mps.C:128
double dryingShrinkageStrain
Definition mps.h:128
const FloatArray & giveCreepStrain() const
Definition mps.h:209
bool giveStoredEmodulusFlag(void)
Definition mps.h:197
double humNano
value of relative humidity in the nanopores
Definition mps.h:124
double giveStoredEmodulus(void)
Returns Emodulus if computed previously in the same tStep.
Definition mps.h:196
void setTempDryingShrinkageStrain(double src)
Definition mps.h:200
double giveDryingShrinkageStrain(void)
Definition mps.h:202
double flowTermViscosity
Definition mps.h:117
double giveHumNano()
Returns relative humidity (nanopores).
Definition mps.h:157
double giveHumMin()
Returns previously minimum previously reached humidity - treatment of cyclic ambient coditions.
Definition mps.h:162
void setEquivalentTimeTemp(double src)
Stores equivalent time.
Definition mps.h:185
void restoreContext(DataStream &stream, ContextMode mode) override
Definition mps.C:154
double giveEquivalentTime()
Returns equivalent time.
Definition mps.h:183
double giveFlowTermViscosityTemp()
Definition mps.h:189
void initTempStatus() override
Definition mps.C:101
bool storedEmodulusFlag
flag for Emodulus - true if modulus has been already computed in the current time step
Definition mps.h:120
double giveTmax()
Returns previously maximum reached temperature.
Definition mps.h:178
double giveFlowTermViscosity()
Returns viscosity of the flow term (associated with q4 and microprestress evolution).
Definition mps.h:188
double autogenousShrinkageStrain
Definition mps.h:130
double giveAutogenousShrinkageStrain(void)
Definition mps.h:206
double giveT()
Returns temperature.
Definition mps.h:168
void setTempAutogenousShrinkageStrain(double src)
Definition mps.h:204
void setHumNanoTemp(double src)
Stores relative humidity (nanopores).
Definition mps.h:159
double equivalentTimeTemp
Definition mps.h:116
double flowTermViscosityTemp
Definition mps.h:118
void setHumIncrement(double src)
Stores relative humidity increment.
Definition mps.h:153
double hum
Values of humidity and temperature in a particular GP, their increment, and maximum/minimum to treat ...
Definition mps.h:108
double equivalentTime
Hidden variable - equivalent time: necessary to compute solidified volume.
Definition mps.h:115
double tempAutogenousShrinkageStrain
Definition mps.h:131
void setHumMin(double src)
Stores minimum reached humidity.
Definition mps.h:164
void setTIncrement(double src)
Stores temperature increment.
Definition mps.h:175
void setT(double src)
Stores temperature.
Definition mps.h:170
double giveHum()
Returns relative humidity.
Definition mps.h:147
void setCreepStrainIncrement(FloatArray src)
Definition mps.h:208
double roomTemperature
parameter reducing creep effects of thermal cycling
Definition mps.h:260
double computeCreepFunction(double t, double t_prime, GaussPoint *gp, TimeStep *tStep) const override
Evaluation of the basic creep compliance function - can be used to compute elastic modulus in derived...
Definition mps.C:619
void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const override
Definition mps.C:467
double temperScaleDifference
0 for Kelvin, 273.15 for Celsius
Definition mps.h:282
double kTm
kTm replaces ln(h) on RHS of the differential equation describing evolution of MPS
Definition mps.h:251
double QRtoR
Definition mps.h:262
int hydrationTimescaleTF
Definition mps.h:291
void computeAutogenousShrinkageDefinedByTF(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) const
Evaluation of the autogenousShrinkageStrainVector given by an auxiliary time function (autoShrinkageT...
Definition mps.C:1376
double computeEquivalentTime(GaussPoint *gp, TimeStep *tStep, int option) const
Definition mps.C:1705
double khc
parameter reducing creep effects of hygral cycling (0 = complete reduction, 1 = no reduction,...
Definition mps.h:255
void giveEigenStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const override
Definition mps.C:1149
double computeBetaMu(GaussPoint *gp, TimeStep *tStep, int Mu) const override
factors for exponential algorithm
Definition mps.C:839
double giveHumidityNano(GaussPoint *gp, TimeStep *tStep, int option) const
Definition mps.C:1500
double computeFlowTermViscosity(GaussPoint *gp, TimeStep *tStep) const
Evaluation of the flow term viscosity.
Definition mps.C:877
double giveHumidity(GaussPoint *gp, TimeStep *tStep, int option) const
Definition mps.C:1438
double computeLambdaMu(GaussPoint *gp, TimeStep *tStep, int Mu) const override
Definition mps.C:857
double alphaS
Definition mps.h:264
FloatArray computeCharCoefficients(double tPrime, GaussPoint *gp, TimeStep *tStep) const override
Evaluation of characteristic moduli of the non-aging Kelvin chain.
Definition mps.C:689
double eps_cas0
parameter for autogenous shrinkage according to fib MC 2010
Definition mps.h:274
void predictParametersFrom(double, double, double, double)
Definition mps.C:583
int autoShrinkageTF
Definition mps.h:296
double alphaR
Definition mps.h:264
double computePsiS(GaussPoint *gp, TimeStep *tStep) const
Evaluation of the factor transforming real time to reduced time (effect on the evolution of micropres...
Definition mps.C:1643
void initializeFrom(InputRecord &ir) override
Definition mps.C:187
double computeSolidifiedVolume(GaussPoint *gp, TimeStep *tStep) const override
Evaluation of the relative volume of the solidified material.
Definition mps.C:819
double kTc
parameter reducing creep effects of thermal cycling (replaces kTm in such case)
Definition mps.h:253
double giveEModulus(GaussPoint *gp, TimeStep *tStep) const override
Evaluation of the incremental modulus.
Definition mps.C:714
void computeB4AutogenousShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) const
Evaluation of the autogenousShrinkageStrainVector according to Bazant's B4 model. In the model the ev...
Definition mps.C:1334
double sh_n
Definition mps.h:268
void computeCharTimes() override
Evaluation of characteristic times.
Definition mps.C:650
double kSh
additional parameters for sorption isotherm (used to compute relative humidity from water content)
Definition mps.h:247
double stiffnessFactor
scaling factor 1. for Pa, 1.e6 for MPa - only for empirical formulas - q1-q4 and ft and gf
Definition mps.h:279
double tau_nano
Definition mps.h:303
double alphaE
parameters that control the effect of humidity on rates of hydration, creep and microprestress relaxa...
Definition mps.h:264
double giveInitViscosity(TimeStep *tStep) const
Returns initial value of the flow term viscosity.
Definition mps.C:1138
std::unique_ptr< MaterialStatus > CreateStatus(GaussPoint *gp) const override
Definition mps.C:573
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
Definition mps.C:1741
double giveEquivalentTime(GaussPoint *gp, TimeStep *tStep) const override
By default returns equivalent time in the middle of the time step.
Definition mps.C:643
double b4_alpha
Definition mps.h:276
double computePsiE(GaussPoint *gp, TimeStep *tStep) const
Evaluation of the factor transforming real time to equivalent time (effect on the solidified volume).
Definition mps.C:1677
void computeFibAutogenousShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) const
Evaluation of the autogenousShrinkageStrainVector according to fib MC 2010 - autogenous shrinkage is ...
Definition mps.C:1285
FloatArray ksh_fh
Definition mps.h:272
double EspringVal
Definition mps.h:240
double lambda0
constant equal to one day in time units of analysis (eg. 86400 if the analysis runs in seconds)
Definition mps.h:235
double t0
age when temperature or humidity starts to change
Definition mps.h:231
double computePsiR(GaussPoint *gp, TimeStep *tStep, int option) const
Definition mps.C:1611
double giveTemperature(GaussPoint *gp, TimeStep *tStep, int option) const
Definition mps.C:1553
void giveShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const override
Definition mps.C:482
double b4_tau_au
Definition mps.h:276
FloatArray ksh_h
nonlinear shrinkage function - user-defined piecewise-linear function
Definition mps.h:272
double QStoR
Definition mps.h:262
double sh_a
parameters for nonlinear shrinkage function
Definition mps.h:268
void computePointShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) const
Evaluation of the shrinkageStrainVector - shrinkage is fully dependent on humidity rate in given GP.
Definition mps.C:1232
double sh_hC
Definition mps.h:268
enum oofem::MPSMaterial::coupledAnalysisType CoupledAnalysis
double q1
compliances of the B3 model
Definition mps.h:233
double b4_r_t
Definition mps.h:276
double muS
fluidity parameter used in viscosity evolution equation
Definition mps.h:249
bool timeDependent_ksh
flag activating equivalent-time-dependence of shrinkage coefficient
Definition mps.h:270
double p
exponent in the microprestress/viscosity governing equation
Definition mps.h:266
double QEtoR
activation energies
Definition mps.h:262
double b4_eps_au_infty
parameters for autogenous shrinkage according to B4 model
Definition mps.h:276
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
double castingTime
Definition material.h:115
virtual bool isActivated(TimeStep *tStep) const
Definition material.h:182
virtual const FloatArray & giveViscoelasticStressVector() const
Definition rheoChM.h:101
double giveEndOfTimeOfInterest()
Access to the time up to which the response should be accurate.
Definition rheoChM.C:629
int nUnits
Number of (Maxwell or Kelvin) units in the rheologic chain.
Definition rheoChM.h:145
double relMatAge
Physical age of the material at castingTime.
Definition rheoChM.h:147
double giveCharTime(int) const
Access to the characteristic time of a given unit.
Definition rheoChM.C:396
double endOfTimeOfInterest
Time (age???) up to which the model should give a good approximation.
Definition rheoChM.h:160
FloatArray EparVal
Partial moduli of individual units.
Definition rheoChM.h:166
void giveUnitComplianceMatrix(FloatMatrix &answer, GaussPoint *gp, TimeStep *tStep) const
Evaluation of elastic compliance matrix for unit Young's modulus.
Definition rheoChM.C:286
double begOfTimeOfInterest
Time from which the model should give a good approximation. Optional field. Default value is 0....
Definition rheoChM.h:158
virtual void updateEparModuli(double tPrime, GaussPoint *gp, TimeStep *tStep) const
Update of partial moduli of individual chain units.
Definition rheoChM.C:313
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
Definition rheoChM.C:657
FloatArray charTimes
Characteristic times of individual units (relaxation or retardation times).
Definition rheoChM.h:169
static void giveReducedSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full unsymmetric Voigt vector (2nd order tensor) to reduced form.
static int giveSizeOfVoigtSymVector(MaterialMode mmode)
static void giveFullSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the reduced unsymmetric Voigt vector (2nd order tensor) to full form.
double giveTimeIncrement()
Returns solution step associated time increment.
Definition timestep.h:168
double giveTargetTime()
Returns target time.
Definition timestep.h:164
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
Definition timestep.C:132
bool isTheFirstStep()
Definition timestep.C:148
double giveIntrinsicTime()
Returns intrinsic time, e.g. time in which constitutive model is evaluated.
Definition timestep.h:166
#define THROW_CIOERR(e)
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define IR_GIVE_FIELD(__ir, __value, __id)
Definition inputrecord.h:67
#define OOFEM_LOG_DEBUG(...)
Definition logger.h:144
#define _IFT_MPSMaterial_temperInCelsius
Definition mps.h:90
#define _IFT_MPSMaterial_autoShrinkageTF
Definition mps.h:92
#define _IFT_MPSMaterial_q2
Definition mps.h:56
#define _IFT_MPSMaterial_cc
Definition mps.h:50
#define _IFT_MPSMaterial_q1
Definition mps.h:55
#define _IFT_MPSMaterial_sh_n
Definition mps.h:79
#define _IFT_MPSMaterial_wcr
Definition mps.h:52
#define _IFT_MPSMaterial_sh_hC
Definition mps.h:78
#define _IFT_MPSMaterial_q4
Definition mps.h:58
#define _IFT_MPSMaterial_ktm
Definition mps.h:70
#define _IFT_MPSMaterial_p
Definition mps.h:74
#define _IFT_MPSMaterial_stiffnessfactor
Definition mps.h:73
#define _IFT_MPSMaterial_B4_tau_au
Definition mps.h:86
#define _IFT_MPSMaterial_mode
Definition mps.h:47
#define _IFT_MPSMaterial_p_tilde
Definition mps.h:75
#define _IFT_MPSMaterial_acr
Definition mps.h:54
#define _IFT_MPSMaterial_khc
Definition mps.h:72
#define _IFT_MPSMaterial_alphae
Definition mps.h:66
#define _IFT_MPSMaterial_alphas
Definition mps.h:68
#define _IFT_MPSMaterial_timedependent_ksh
Definition mps.h:82
#define _IFT_MPSMaterial_factor_ksh_fh
Definition mps.h:81
#define _IFT_MPSMaterial_alphar
Definition mps.h:67
#define _IFT_MPSMaterial_qetor
Definition mps.h:63
#define _IFT_MPSMaterial_wc
Definition mps.h:51
#define _IFT_MPSMaterial_sh_a
Definition mps.h:77
#define _IFT_MPSMaterial_mus
Definition mps.h:69
#define _IFT_MPSMaterial_B4_r_t
Definition mps.h:88
#define _IFT_MPSMaterial_fc
Definition mps.h:49
#define _IFT_MPSMaterial_coupledanalysistype
Definition mps.h:48
#define _IFT_MPSMaterial_eps_cas0
Definition mps.h:84
#define _IFT_MPSMaterial_B4_alpha
Definition mps.h:87
#define _IFT_MPSMaterial_ksh
Definition mps.h:62
#define _IFT_MPSMaterial_alpha_as
Definition mps.h:83
#define _IFT_MPSMaterial_k3
Definition mps.h:76
#define _IFT_MPSMaterial_B4_cem_type
Definition mps.h:89
#define _IFT_MPSMaterial_ktc
Definition mps.h:71
#define _IFT_MPSMaterial_lambda0
Definition mps.h:59
#define _IFT_MPSMaterial_factor_ksh_h
Definition mps.h:80
#define _IFT_MPSMaterial_q3
Definition mps.h:57
#define _IFT_MPSMaterial_B4_eps_au_infty
Definition mps.h:85
#define _IFT_MPSMaterial_tau_nano
Definition mps.h:93
#define _IFT_MPSMaterial_qrtor
Definition mps.h:64
#define _IFT_MPSMaterial_ac
Definition mps.h:53
#define _IFT_MPSMaterial_hydrationTimescaleTF
Definition mps.h:91
#define _IFT_MPSMaterial_qstor
Definition mps.h:65
long ContextMode
Definition contextmode.h:43
double sum(const FloatArray &x)
std::shared_ptr< Field > FieldPtr
Definition field.h:78
@ CIO_IOERR
General IO error.
#define _IFT_RheoChainMaterial_timefactor
Definition rheoChM.h:59

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