OOFEM 3.0
Loading...
Searching...
No Matches
hydram.C
Go to the documentation of this file.
1/* TODO
2 *
3 * could only one HydrationModel instance be used during staggered analysis for both tm and sm analysis?
4 * if initialized in one of the slave problems, it can hardly be accessed from the other domain,
5 * if initialized in master staggered problem, it could be assigned to both of the slave problems (setHydrationModel(*)), but it's not very clean
6 * in the future, when more types of hydration models are implemented, a separate input file for the hydration model could be used.
7 *
8 * the staggered problem should be extended to enable
9 * 1) different time step lengths - done by dtf
10 * 2) alternate stepping - several time steps performed in one analysis, while only one in the other
11 * e.g. plastic evolution - short time x tm analysis without load changes
12 *
13 * should provide a function to compute we (water consumption) based on chemical cement composition and/or concrete mixture
14 * w/c and a/c or [c/V .. result of wc,ac,rho] ratio.
15 *
16 * UpdateInternalState:
17 * maybe hydration model should ensure that the hydration degree is NOT recalculated in isothermal analysis for each gp,
18 * when each gp refers to the material level status. Maybe it will be necessary to save time stamp in status?
19 * but even then, there is no way to check if the state vector isn't changed.
20 * ==> keep it at caller (only HellMat is now the case)
21 * in case of the planned several hydration model statuses + interpolation, internal state update must be done for each gp,
22 * and HydrationModel must keep track of the status variables extents, to select the appropriate range for interpolation.
23 * ??? / choose 'typical' integration points at beginning of analysis, compute hydration there
24 \ use extreme computed values, which may be at different places in time
25 *
26 */
27
28#include "tm/Materials/hydram.h"
29#include "gausspoint.h"
30#include "datastream.h"
31#include "mathfem.h"
32#include "contextioerr.h"
33
34#include <cstdio>
35
36namespace oofem {
37// ======= class HydrationModelStatus implementation =======
38HydrationModelStatus :: HydrationModelStatus(GaussPoint *g) : MaterialStatus(g) { }
39
40void
41HydrationModelStatus :: printOutputAt(FILE *file, TimeStep *tStep) const
42{
43 fprintf(file, " ksi %.5f", hydrationDegree);
44}
45
46void
47HydrationModelStatus :: initTempStatus()
48// initializes temp status - resets temp variables to saved equilibrium state
49// Normally, this is used to clear temp status variables during equilibrium iteration
50// (e.g. plastic multiplier, active yield surface, ...)
51// In HellmichMaterial, there is number of auxiliary status values that only need to be evaluated once for particular
52// time, and have to recalculated only if the iteration is restarted.
53
54// In the hydration model, this means resetting to hydration degree at start of step.
55// This should only be done at step restart or restoring context (InitStepIncrements->initGpForNewStep)
56
57// Because hydration model initTempStatus is never called directly, it should be determined in master status
58// initTempStatus(), whether hydration model init is necessary.
59{
61}
62
63void
64HydrationModelStatus :: updateYourself(TimeStep *tStep)
65// update after new equilibrium state reached - prepare status for saving context and for next time increment
66{
68}
69
70//modified_zh 25.6.2004 obj = NULL is set in .h
71void
72HydrationModelStatus :: saveContext(DataStream &stream, ContextMode mode)
73{
74 if ( !stream.write(hydrationDegree) ) {
76 }
77}
78
79//modified_zh 25.6.2004 obj = NULL is set in .h
80void
81HydrationModelStatus :: restoreContext(DataStream &stream, ContextMode mode)
82{
83 if ( !stream.read(hydrationDegree) ) {
85 }
86
88}
89
90
91// ======= class HydrationModel implementation =======
92// default constructor - Lafarge mixture
93HydrationModel :: HydrationModel() : Material(0, nullptr)
94{
97}
98
99HydrationModel :: HydrationModel(MixtureType mix, FindRootMethod usefr) : Material(0, nullptr)
100{
101 setMixture(mix);
102 if ( ( usefr ) && ( usefr <= frMixed ) ) {
103 useFindRoot = usefr;
104 } else {
105 OOFEM_ERROR("unknown FindRootMethod");
106 }
107}
108
109void
110HydrationModel :: initializeFrom(InputRecord &ir)
111{
112 double value;
113
114 //hydration>0 -> initial hydration degree
117 if ( initialHydrationDegree >= 0. ) {
118 OOFEM_LOG_INFO("HydrationModel: Hydration from %.2f.", initialHydrationDegree);
119 } else {
120 throw ValueInputException(ir, _IFT_HydrationModel_hydration, "must be between 0 and 1");
121 }
122
124 OOFEM_LOG_INFO("HydrationModel: Model parameters for Skanska C60/75 mixture.");
126 }
127
128 timeScale = 1.;
129 value = -1.;
131 if ( value >= 0. ) {
132 timeScale = value;
133 OOFEM_LOG_INFO("HydrationModel: Time scale set to %.0f", timeScale);
134 }
135
136 // Optional direct input of material parameters
137 le = 0;
138 value = -1.;
140 if ( value >= 0 ) {
141 le = value;
142 OOFEM_LOG_INFO("HydrationModel: Latent heat of hydration set to %.0f", le);
143 }
144
145 value = -1;
147 if ( value >= 0 ) {
148 cv = value;
149 OOFEM_LOG_INFO("HydrationModel: Cement content set to %.0f kg/m3", cv);
150 we = 0.23 * cv;
151 }
152
153 value = -1.;
155 if ( value >= 0 ) {
156 we = value;
157 }
158
159 if ( cv || ( value >= 0 ) ) {
160 OOFEM_LOG_INFO("HydrationModel: Water consumption for hydration set to %.0f kg/m3", we);
161 }
162}
163
164void
165HydrationModel :: setMixture(MixtureType mix)
166{
167 // === Initializes material parameters for given mixture ===
168 mixture = mix;
169 // Normalized chemical affinity regression function coefficients
170 // (Lafarge mixture)
171 if ( mix == mtLafarge ) {
172 aa = 7.313;
173 ba = 10.46;
174 ca = 169.3;
175 da = 4.370;
176
177 e0 = 0.05; // ksi_0
178 }
179 // Huber mixture
180 else if ( mix == mtHuber ) {
181 aa = 15.93;
182 ba = 7.33;
183 ca = 0.855e8;
184 da = 26.7;
185
186 e0 = 0.10; // ksi_0
187 }
188 // Skanska C60/75 mixture
189 else if ( mix == mtC60 || mix == mtC100 ) { // used for C100 too
190 aa = 8.5;
191 ba = 5.0;
192 ca = 300;
193 da = 10;
194
195 e0 = 0.05; // ksi_0
196 } else {
197 OOFEM_ERROR("Unknown mixture type!");
198 }
199
200 ear = 4000; // activation term [K]
201 if ( !le ) {
202 le = 190000; // latent heat [kJ/m3]
203 }
204
205 // rc = 2428; // heat capacity [kJ/m3K] - set in master material input
206}
207
208
209// === Material functions ===
210double
211HydrationModel :: affinity(double ksi) const
212// Returns the normalized chemical affinity A~(ksi) [1/s]
213{
214 if ( ksi < e0 ) {
215 ksi = e0;
216 }
217
218 return aa * ( 1 - exp(-ba * ksi) ) / ( 1 + ca * pow(ksi, da) );
219}
220
221double
222HydrationModel :: dAdksi(double ksi) const
223// Returns the derivation of chemical affinity dA~/dksi(ksi)
224{
225 if ( ksi < e0 ) {
226 return 0;
227 }
228
229 double ksinad = pow(ksi, da);
230 double enaksi = exp(-ba * ksi);
231
232 return aa * ( ca * da * ksinad * ( enaksi - 1 ) / ksi + ba * enaksi * ( ca * ksinad + 1 ) ) / pow(1 + ca * ksinad, 2);
233}
234
235double
236HydrationModel :: localResidual(double dks) const // G(dksi) 4.12
237// !!! uses auxiliary ksi, dt, T in hydration model instance
238{
239 return dks - auxdt * affinity(auxksi + dks) * exp(-ear / auxT) * ( 1. + auxh * auxh ) / 2.;
240}
241
242double
243HydrationModel :: dksidT(double ksi, double T, double h, double dt) const
244/*
245 * !!! should use state vector to enable adding state variables, but is OK on the level of dIntSource/dState
246 * G = dksi - dt * aff(ksi) * exp(-ear/T) * (1+h^2)/2 = 0
247 * dksi/dT = - dG/dT / dG/dksi, dksi->0 dksi/dksi=1
248 * = - -dt*aff(ksi)*(--ear/T^2)*exp(-ear/T)*(1+h^2)/2 / (1 - dt*daff/dksi * exp(-ear/T) * (1+h^2)/2)
249 *
250 * dh/dT, dh/dksi uz nejde, od toho je iterace ksi(h,T)
251 */
252{
253 double aux = dt * exp(-ear / T) * ( 1 + h * h ) / 2;
254 return ( aux * affinity(ksi) * ear / ( T * T ) ) / ( 1 - aux * dAdksi(ksi) );
255}
256
257double
258HydrationModel :: dksidh(double ksi, double T, double h, double dt) const
259/*
260 * G = dks - dt * aff(ksi) * exp(-ear/T) * (1+h^2)/2 = 0
261 * dksi/dh = - dG/dh / dG/dksi
262 * = - -dt*aff(ksi) *exp(-ear/T) * h / (1 - dt*daff/dksi * exp(-ear/T) * (1+h^2)/2)
263 */
264{
265 double aux = dt * exp(-ear / T);
266 return ( aux * affinity(ksi) * h ) / ( 1 - aux * dAdksi(ksi) * ( 1 + h * h ) / 2 );
267}
268
270HydrationModel :: giveStatus(GaussPoint *gp) const
271/*
272 * Returns the hydration model status obtained from gp associated material status or from model associated status in case of isothermal analysis
273 * Creates the hydration model status if necessary.
274 */
275{
276
278 HydrationModelStatus *status = nullptr;
279 if ( hmi ) {
280 status = hmi->giveHydrationModelStatus();
281 if ( !status ) {
282 status = hmi->setHydrationModelStatus(this->CreateStatus(gp));
283 //status = static_cast< HydrationModelStatus * >( this->CreateStatus(gp) );
284 //hmi->setHydrationModelStatus(status);
285 }
286 } else {
287 OOFEM_ERROR("Master status undefined.");
288 }
289
290 return status;
291}
292
293void
294HydrationModel :: computeInternalSourceVector(FloatArray &val, GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
295/*
296 * Returns the hydration heat generated in gp during time step tStep.
297 * Can be overriden to return also water consumption as second component of the internal source vector.
298 */
299// !!! Works only for current TimeStep, no check done
300// !!! Should suffice to return val(1) without moisture analysis.
301{
302 val.resize(2);
303 val(0) = le * giveHydrationDegree(gp, tStep, mode); // heat SOURCE
304 val(1) = -we *giveHydrationDegree(gp, tStep, mode); // water CONSUMPTION
305}
306
307double
308HydrationModel :: _giveCharacteristicValue(double T, double h, MatResponseMode rmode, GaussPoint *gp, TimeStep *tStep) const
309// Transport status needs to be obtained from master status, it's better to pass as a parameter
310// to enable usage from structural material
311{
312 if ( rmode == IntSource || rmode == IntSource_hh || rmode == IntSource_ww || rmode == IntSource_wh || rmode == IntSource_hw ) {
313 return computeIntSource(T, h, gp, tStep, rmode);
314 } else {
315 OOFEM_ERROR("wrong MatResponseMode.");
316 }
317
318 // return 0.;
319}
320
321double
322HydrationModel :: computeHydrationDegreeIncrement(double ksi, double T, double h, double dt)
323// Computes the hydration degree increment according to given hydration degree, temperature and time increment.
324// !!! sets aux values in material
325{
326 double result = 0.0;
327
328 if ( ksi < 1.0 ) {
329 auxksi = ksi;
330 auxT = T;
331 auxh = h;
332 auxdt = dt;
333 switch ( useFindRoot ) {
334 case frRegula: result = regulafindroot();
335 break;
336 case frBinTree: result = bintreefindroot();
337 break;
338 case frMixed: result = mixedfindroot();
339 break;
340#ifdef DEBUG
341 default: {
342 OOFEM_ERROR("unknown FindRootMethod %d", useFindRoot);
343 }
344#endif
345 }
346
347 if ( ksi + result > 1.0 ) {
348#ifdef VERBOSE
349 OOFEM_LOG_INFO("temp=%.12f, dksi %.15f -> %f\n", T, result, 1.0 - ksi);
350#endif
351 result = 1.0 - ksi;
352 }
353 } else {
354 result = 0.;
355 }
356
357 return result;
358}
359
360double
361HydrationModel :: computeIntSource(double T, double h, GaussPoint *gp, TimeStep *tStep, MatResponseMode rmode) const
362/*
363 * Computes and returns the derivatives of the material-generated Internal Source with respect to the tm state vector.
364 * Used in IntSourceLHS matrix for quadratic convergency of global iteration.
365 * State vector must contain relative humidity, not water content
366 *
367 * Called from giveCharacteristicValue - IntSource_hh, IntSource_ww, IntSource_wh, IntSource_hw.
368 * IntSource_hh = -lksi * dksidT (dHeat / dT)
369 * IntSource_ww = wksi * dksidh (dWater / dh)
370 * IntSource_hw = -lksi * dksidh (dHeat / dh)
371 * IntSource_wh = -wksi * dksidT (dWater / dT)
372 */
373{
374 // prepare ksi, T, h, dt
375 double ksi = giveHydrationDegree(gp, tStep, VM_Total);
376 // !!! timeScale
377 double dt = tStep->giveTimeIncrement() * timeScale;
378
379 if ( ksi < 1.0 ) {
380 switch ( rmode ) {
381 case IntSource:
382 case IntSource_hh: return -le *dksidT(ksi, T, h, dt);
383
384 case IntSource_ww: return we *dksidh(ksi, T, h, dt);
385
386 case IntSource_hw: return -le *dksidh(ksi, T, h, dt);
387
388 case IntSource_wh: return -we *dksidT(ksi, T, h, dt);
389
390 default: OOFEM_ERROR("Wrong MatResponseMode.");
391 }
392 }
393
394 return 0;
395}
396
397// === public services ===
398
399double
400HydrationModel :: giveHydrationDegree(GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
401// returns the hydration degree in integration point gp
402{
403 HydrationModelStatus *status = static_cast< HydrationModelStatus * >( giveStatus(gp) );
404 double ksi = status->giveTempHydrationDegree();
405 if ( mode == VM_Incremental ) {
406 ksi -= status->giveHydrationDegree();
407 }
408
409 return ksi;
410}
411
412void
413HydrationModel :: updateInternalState(const FloatArray &vec, GaussPoint *gp, TimeStep *tStep)
414/*
415 * Recalculates the hydration degree according to the given new state vector and time increment, using equilib status
416 * State vector is supposed to contain [1]->temperature, [2]->relative humidity!
417 * caller should ensure that this is called only when state vector is changed
418 */
419{
420 double dksi, T = 0., h = 1.;
421 // get hydration model status associated with integration point
422 HydrationModelStatus *status = static_cast< HydrationModelStatus * >( giveStatus(gp) );
423
424 if ( vec.giveSize() ) {
425 T = vec(0);
426 if ( vec.giveSize() > 1 ) {
427 h = vec(1);
428 } else {
429 h = 1; // assume saturated if undefined
430 }
431 } else {
432 OOFEM_ERROR("undefined state vector.");
433 }
434
435 double ksi = status->giveHydrationDegree();
436 if ( !ksi && initialHydrationDegree ) {
438 status->setHydrationDegree(ksi);
439 }
440
441 // !!! timeScale
442 if ( tStep->giveTimeIncrement() > 0. ) {
443 dksi = computeHydrationDegreeIncrement(ksi, T, h, tStep->giveTimeIncrement() * timeScale);
444 } else {
445 dksi = 0.;
446 }
447
448 status->setTempHydrationDegree(ksi + dksi);
449}
450
451
452// === Auxiliary functions === (root finding)
453double
454HydrationModel :: regulafindroot() const
455{
456 double x0, y0, yl, xl = 0., xr = 1.;
457
458 do {
459 yl = localResidual(xl);
460 x0 = yl * ( xl - xr ) / ( localResidual(xr) - yl ) + xl;
461 y0 = localResidual(x0);
462 if ( y0 < 0 ) {
463 xl = x0;
464 } else {
465 xr = x0;
466 }
467
468#ifdef VERBOSEFINDROOT
469 OOFEM_LOG_INFO("regulafindroot: x=%.15f, chyba %.15f \n", x0, y0);
470#endif
471 } while ( fabs(y0) > ROOT_PRECISION_DKSI );
472
473 return x0;
474}
475
476double
477HydrationModel :: bintreefindroot() const
478{
479 double xl = 0., xr = 1., x0, y0;
480
481 do {
482 x0 = ( xl + xr ) / 2;
483 y0 = localResidual(x0);
484 if ( y0 < 0 ) {
485 xl = x0;
486 } else {
487 xr = x0;
488 }
489
490#ifdef VERBOSEFINDROOT
491 OOFEM_LOG_INFO("bintreefindroot: x=%.15f, chyba %.15f \n", x0, y0);
492#endif
493 } while ( fabs(y0) > ROOT_PRECISION_DKSI );
494
495 return x0;
496}
497
498
499
500double
501HydrationModel :: mixedfindroot() const
502{
503 double x0 = 0., y0, xl = 0., xr = 1.;
504 bool done = false;
505
506 do {
507 for ( int jcount = 0; ( jcount < BINARY_TREE_STEPS ); jcount++ ) {
508 x0 = ( xl + xr ) / 2;
509 y0 = localResidual(x0);
510 if ( fabs(y0) < ROOT_PRECISION_DKSI ) {
511 done = true;
512 break;
513 }
514
515 if ( y0 < 0 ) {
516 xl = x0;
517 } else {
518 xr = x0;
519 }
520 }
521
522 if ( !done ) {
523 double yl = localResidual(xl);
524 x0 = yl * ( xl - xr ) / ( localResidual(xr) - yl ) + xl;
525 y0 = localResidual(x0);
526
527 if ( fabs(y0) < ROOT_PRECISION_DKSI ) {
528 break;
529 } else if ( y0 < 0 ) {
530 xl = x0;
531 } else {
532 xr = x0;
533 }
534
535#ifdef VERBOSEFINDROOT
536 OOFEM_LOG_INFO("mixedfindroot: x=%.15f, chyba %.15f \n", x0, y0);
537#endif
538 }
539 } while ( !done );
540
541 return x0;
542}
543
544std::unique_ptr<MaterialStatus>
545HydrationModel :: CreateStatus(GaussPoint *gp) const
546{
547 return std::make_unique<HydrationModelStatus>(gp);
548}
549
550// ======= HydrationModelStatusInterface implementation =======
551void
552HydrationModelStatusInterface :: updateYourself(TimeStep *tStep)
553{
554 if ( hydrationModelStatus ) {
555 hydrationModelStatus->updateYourself(tStep);
556 }
557}
558
559void
560HydrationModelStatusInterface :: printOutputAt(FILE *file, TimeStep *tStep) const
561{
562 if ( hydrationModelStatus ) {
563 hydrationModelStatus->printOutputAt(file, tStep);
564 }
565}
566
567// ======= HydrationModelInterface implementation =======
568
569void
570HydrationModelInterface :: initializeFrom(InputRecord &ir)
571{
572 double value;
573
574 // !!! should use separate field, e.g. hydramname #hydramnumber
575 // Hydration>0 -> Model starting at value, hydration<0 -> Constant at given value
576 value = -2.;
579 if ( value >= 0. ) {
580 OOFEM_LOG_INFO("HydratingMaterial: creating HydrationModel.");
581 hydrationModel = std::make_unique<HydrationModel>();
582 if ( !hydrationModel ) {
583 throw ValueInputException(ir, _IFT_HydrationModelInterface_hydration, "Could not create HydrationModel instance.");
584 }
585
586 hydrationModel->initializeFrom(ir);
587 }
588 // constant hydration degree
589 else if ( value >= -1. ) {
591 OOFEM_LOG_INFO("HydratingMaterial: Hydration degree set to %.2f.", -value);
592 } else {
593 throw ValueInputException(ir, _IFT_HydrationModelInterface_hydration, "must be between 0 and 1");
594 }
595
596 // Material cast time - start of hydration
597 // 11/3/2004 OK *unfinished in Hellmat, needs to be checked in hm_Interface->updateInternalState
598 castAt = 0.;
600 if ( castAt >= 0. ) {
601 OOFEM_LOG_INFO("HydratingMaterial: Hydration starts at time %.2g.", castAt);
602 }
603}
604
605void
606HydrationModelInterface :: updateInternalState(const FloatArray &vec, GaussPoint *gp, TimeStep *tStep)
607{
608 if ( hydrationModel ) {
609 TimeStep hydraTime( ( const TimeStep ) *tStep );
610 int notime = 0;
611 if ( tStep->giveTargetTime() - tStep->giveTimeIncrement() < castAt ) {
612 if ( tStep->giveTargetTime() >= castAt ) {
613 hydraTime.setTimeIncrement(tStep->giveTargetTime() - castAt);
614 } else {
615 notime = 1;
616 }
617 }
618
619 if ( !notime ) {
620 hydrationModel->updateInternalState(vec, gp, &hydraTime);
621 }
622 }
623}
624
625double
626HydrationModelInterface :: giveHydrationDegree(GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
627{
628 if ( hydrationModel ) {
629 return hydrationModel->giveHydrationDegree(gp, tStep, mode);
630 } else {
632 }
633}
634} // end namespace oofem
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 Interface * giveInterface(InterfaceType t)
Definition femcmpnn.h:181
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
std ::unique_ptr< HydrationModel > hydrationModel
Reference to the associated hydrationModel instance.
Definition hydram.h:299
double castAt
Material cast time - start of hydration.
Definition hydram.h:301
double constantHydrationDegree
Constant hydration degree for analysis without hydration model.
Definition hydram.h:303
HydrationModelStatus * giveHydrationModelStatus()
Returns the associated hydration model status.
Definition hydram.h:284
std ::unique_ptr< MaterialStatus > hydrationModelStatus
Reference to associated hydration model status.
Definition hydram.h:277
HydrationModelStatus * setHydrationModelStatus(std::unique_ptr< MaterialStatus > s)
Sets the associated hydration model status. Analogue to gp->setMaterialStatus.
Definition hydram.h:286
void setTempHydrationDegree(double v)
Definition hydram.h:132
double giveHydrationDegree() const
Returns the non-temp hydration degree. Used for step restart and postprocessing.
Definition hydram.h:130
void setHydrationDegree(double v)
Definition hydram.h:131
double giveTempHydrationDegree() const
Returns the temp hydration degree.
Definition hydram.h:128
double dAdksi(double ksi) const
Returns the derivation of chemical affinity dA~/dksi(ksi).
Definition hydram.C:222
void setMixture(MixtureType mix)
Sets the mixture type and appropriate material parameters.
Definition hydram.C:165
FindRootMethod useFindRoot
Definition hydram.h:205
double computeHydrationDegreeIncrement(double ksi, double T, double h, double dt)
Definition hydram.C:322
double we
Total water consumption for hydration [kg/m3].
Definition hydram.h:173
double initialHydrationDegree
!! initial hydration degree - set in initialize From, but not used
Definition hydram.h:159
double mixedfindroot() const
Definition hydram.C:501
double ear
Activation term [K].
Definition hydram.h:170
std::unique_ptr< MaterialStatus > CreateStatus(GaussPoint *gp) const override
Creates and returns new HydrationModelStatus instance.
Definition hydram.C:545
double regulafindroot() const
Definition hydram.C:454
double e0
ksi_0.
Definition hydram.h:169
double bintreefindroot() const
Definition hydram.C:477
double le
Latent heat [kJ/m3].
Definition hydram.h:171
double giveHydrationDegree(GaussPoint *gp, TimeStep *tStep, ValueModeType mode) const
Definition hydram.C:400
double auxksi
!! possible problem for parallel computation, performance???
Definition hydram.h:178
MixtureType mixture
Used concrete mixture.
Definition hydram.h:155
double timeScale
time scale - used for time input in other units than seconds
Definition hydram.h:161
double affinity(double ksi) const
Returns the normalized chemical affinity A~(ksi) [1/s].
Definition hydram.C:211
double computeIntSource(double T, double h, GaussPoint *gp, TimeStep *tStep, MatResponseMode rmode) const
Computes and returns the derivatives of the material-generated Internal Source with respect to the tm...
Definition hydram.C:361
double aa
Normalized chemical affinity regression function coefficients.
Definition hydram.h:164
MaterialStatus * giveStatus(GaussPoint *gp) const override
Definition hydram.C:270
double cv
Input cement content kg/m3 for evaluation of total water consumption.
Definition hydram.h:172
double dksidT(double ksi, double T, double h, double dt) const
Definition hydram.C:243
double localResidual(double dks) const
Definition hydram.C:236
double dksidh(double ksi, double T, double h, double dt) const
Definition hydram.C:258
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
MaterialStatus(GaussPoint *g)
Definition matstatus.h:91
Material(int n, Domain *d)
Definition material.C:46
double giveTimeIncrement()
Returns solution step associated time increment.
Definition timestep.h:168
double giveTargetTime()
Returns target time.
Definition timestep.h:164
void setTimeIncrement(double newDt)
Sets solution step time increment.
Definition timestep.h:170
#define THROW_CIOERR(e)
#define OOFEM_ERROR(...)
Definition error.h:79
#define _IFT_HydrationModelInterface_castAt
Definition hydram.h:98
#define _IFT_HydrationModel_timeScale
Definition hydram.h:89
#define _IFT_HydrationModel_water
Definition hydram.h:92
#define _IFT_HydrationModel_hheat
Definition hydram.h:90
#define _IFT_HydrationModel_c60mix
Definition hydram.h:88
#define _IFT_HydrationModel_hydration
Definition hydram.h:87
#define ROOT_PRECISION_DKSI
Definition hydram.h:102
#define _IFT_HydrationModel_cv
Definition hydram.h:91
#define BINARY_TREE_STEPS
Definition hydram.h:103
#define _IFT_HydrationModelInterface_hydration
Definition hydram.h:97
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define OOFEM_LOG_INFO(...)
Definition logger.h:143
long ContextMode
Definition contextmode.h:43
FindRootMethod
Definition hydram.h:147
@ frRegula
Definition hydram.h:147
@ frMixed
Definition hydram.h:147
@ frBinTree
Definition hydram.h:147
MixtureType
Definition hydram.h:148
@ mtC100
Definition hydram.h:148
@ mtLafarge
Definition hydram.h:148
@ mtC60
Definition hydram.h:148
@ mtHuber
Definition hydram.h:148
@ HydrationModelStatusInterfaceType
@ CIO_IOERR
General IO error.

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011