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

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