OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
hydratingconcretemat.C
Go to the documentation of this file.
1 /*
2  *
3  * ##### ##### ###### ###### ### ###
4  * ## ## ## ## ## ## ## ### ##
5  * ## ## ## ## #### #### ## # ##
6  * ## ## ## ## ## ## ## ##
7  * ## ## ## ## ## ## ## ##
8  * ##### ##### ## ###### ## ##
9  *
10  *
11  * OOFEM : Object Oriented Finite Element Code
12  *
13  * Copyright (C) 1993 - 2013 Borek Patzak
14  *
15  *
16  *
17  * Czech Technical University, Faculty of Civil Engineering,
18  * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19  *
20  * This library is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU Lesser General Public
22  * License as published by the Free Software Foundation; either
23  * version 2.1 of the License, or (at your option) any later version.
24  *
25  * This program is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28  * Lesser General Public License for more details.
29  *
30  * You should have received a copy of the GNU Lesser General Public
31  * License along with this library; if not, write to the Free Software
32  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33  */
34 
35 #include "hydratingconcretemat.h"
36 #include "gausspoint.h"
37 #include "timestep.h"
38 #include "mathfem.h"
39 #include "classfactory.h"
40 
41 namespace oofem {
42 REGISTER_Material(HydratingConcreteMat);
43 
45 {
46  // constructor
49  P1 = 0.;
50 }
51 
52 
54 {
55  // destructor
56 }
57 
58 
61 {
62  IRResultType result; // Required by IR_GIVE_FIELD macro
63 
64  // set conductivity k and capacity c
66  if ( result != IRRT_OK ) return result;
67 
70 
72 
73  /*hydrationModelType==1:exponential hydration model, summarized in A.K. Schindler and K.J. Folliard: Heat of Hydration Models for Cementitious
74  * Materials, ACI Materials Journal, 2005
75  * hydrationModelType==2: affinity hydration model inspired by Miguel Cervera and Javier Oliver and Tomas Prato:Thermo-chemo-mechanical model
76  * for concrete. I: Hydration and aging, Journal of Engineering Mechanics ASCE, 125(9), 1018-1027, 1999
77  */
78  if ( hydrationModelType == 1 ) {
82  } else if ( hydrationModelType == 2 ) {
89  } else {
90  OOFEM_WARNING("Unknown hdyration model type %d", hydrationModelType);
91  return IRRT_BAD_FORMAT;
92  }
93 
95 
97 
100 
103 
104 
105  conductivityType = 0;
107  capacityType = 0;
109  densityType = 0;
111 
112  activationEnergy = 38400; //J/mol/K
114 
115  reinforcementDegree = 0.;
117 
118  return IRRT_OK;
119 }
120 
121 // returns hydration power [W/m3 of concrete]
122 void
124 {
125  val.resize(1);
126  if (( mode == VM_Total) || (mode == VM_TotalIntrinsic)) {
127  val.at(1) = this->GivePower(tStep, gp, mode);
128  } else {
129  OOFEM_ERROR("Undefined mode %s\n", __ValueModeTypeToString(mode) );
130  }
131 }
132 
133 
134 double
136 {
137  if ( mode == Capacity ) {
138  return ( giveConcreteCapacity(gp, tStep) * giveConcreteDensity(gp, tStep) );
139  } else if ( mode == IntSource ) { //for nonlinear solver, return dHeat/dTemperature
140  HydratingConcreteMatStatus *ms = static_cast< HydratingConcreteMatStatus * >( this->giveStatus(gp) );
141  //it suffices to compute derivative of scaling Arrhenius equation with respect to temporary temperature
142  double stateVec = ms->giveField().at(1) + 273.15;
143  double tempStateVec = ms->giveTempField().at(1) + 273.15;
144  return this->activationEnergy / ( 8.314 * tempStateVec * tempStateVec ) * exp(1. / stateVec - 1. / tempStateVec);
145  } else {
146  OOFEM_ERROR("unknown mode (%s)\n", __MatResponseModeToString(mode) );
147  }
148 
149  return 0.;
150 }
151 
152 
154 {
155  HydratingConcreteMatStatus *ms = static_cast< HydratingConcreteMatStatus * >( this->giveStatus(gp) );
156  double conduct;
157 
158  if ( conductivityType == 0 ) { //given from input file
159  conduct = IsotropicHeatTransferMaterial :: give('k', gp, tStep);
160  } else if ( conductivityType == 1 ) { //compute according to Ruiz, Schindler, Rasmussen. Kim, Chang: Concrete temperature modeling and strength prediction using maturity concepts in the FHWA HIPERPAV software, 7th international conference on concrete pavements, Orlando (FL), USA, 2001
161  conduct = IsotropicHeatTransferMaterial :: give('k', gp, tStep) * ( 1.0 - 0.33 / 1.33 * ms->giveDoHActual() );
162  } else {
163  OOFEM_ERROR("Unknown conductivityType %d\n", conductivityType);
164  conduct = 0.;
165  }
166 
167  //Parallel Voigt model, 20 W/m/K for steel
168  conduct = conduct * ( 1. - this->reinforcementDegree ) + 20. * this->reinforcementDegree;
169 
170  if ( conduct < 0.3 || conduct > 5 ) {
171  OOFEM_WARNING("Weird concrete thermal conductivity %f W/m/K\n", conduct);
172  }
173 
174  return conduct;
175 }
176 
177 //normally it returns J/kg/K of concrete
179 {
180  double capacityConcrete;
181 
182  if ( capacityType == 0 ) { //given from OOFEM input file
183  capacityConcrete = IsotropicHeatTransferMaterial :: give('c', gp, tStep);
184  } else if ( capacityType == 1 ) {
185  OOFEM_ERROR("Calculate from 5-component model, not implemented in capacityType %d\n", capacityType);
186  capacityConcrete = 0.;
187  } else {
188  OOFEM_ERROR("Unknown capacityType %d\n", capacityType);
189  capacityConcrete = 0.;
190  }
191 
192  //Parallel Voigt model, 500 J/kg/K for steel
193  capacityConcrete = capacityConcrete * ( 1. - this->reinforcementDegree ) + 500. * this->reinforcementDegree;
194 
195  if ( capacityConcrete < 500 || capacityConcrete > 2000 ) {
196  OOFEM_WARNING("Weird concrete heat capacity %f J/kg/K\n", capacityConcrete);
197  }
198 
199  return capacityConcrete;
200 }
201 
202 
204 {
205  double concreteBulkDensity;
206 
207  if ( densityType == 0 ) { //get from input file
208  concreteBulkDensity = IsotropicHeatTransferMaterial :: give('d', gp, tStep);
209  } else if ( densityType == 1 ) { //calculate from 5-component model - not implemented
210  OOFEM_ERROR("Calculate from 5-component model, not implemented in densityType %d\n", densityType);
211  concreteBulkDensity = 0.;
212  } else {
213  OOFEM_ERROR("Unknown densityType %d\n", densityType);
214  concreteBulkDensity = 0.;
215  }
216 
217  //Parallel Voigt model, 7850 kg/m3 for steel
218  concreteBulkDensity = concreteBulkDensity * ( 1. - this->reinforcementDegree ) + 7850. * this->reinforcementDegree;
219 
220  if ( concreteBulkDensity < 1000 || concreteBulkDensity > 4000 ) {
221  OOFEM_WARNING("Weird concrete density %f kg/m3\n", concreteBulkDensity);
222  }
223 
224  return concreteBulkDensity;
225 }
226 
227 
228 int
230 {
231  // printf ("IP %d::giveIPValue, IST %d", giveNumber(), type);
232  if ( type == IST_HydrationDegree ) {
233  HydratingConcreteMatStatus *status = static_cast< HydratingConcreteMatStatus * >( this->giveStatus(gp) );
234  answer.resize(1);
235  answer.at(1) = status->giveDoHActual();
236  //else answer.at(1) = 0;
237  return 1;
238  } else {
239  return TransportMaterial :: giveIPValue(answer, gp, type, tStep);
240  }
241 }
242 
243 
246 {
247  return new HydratingConcreteMatStatus(1, domain, gp);
248 }
249 
250 
252 {
253  //constructor
254  power = 0.;
255  lastEvalTime = -1.e20; //start from begining (set to -1.e6 s)
256  degreeOfHydration = 0.;
258  lastEquivalentTime = 0.;
259  equivalentTime = 0.;
260 }
261 
262 
264 {
265  //destructor
266 }
267 
268 //linear solver (NonStationaryTransportProblem) IntrinsicTime = TargetTime
269 //nonlinear solver (NLTransientTransportProblem) IntrinsicTime depends on alpha
271 {
272  HydratingConcreteMatStatus *ms = static_cast< HydratingConcreteMatStatus * >( this->giveStatus(gp) );
273  double castingTime = this->giveCastingTime();
274  double evalTime = tStep->giveIntrinsicTime();
275  double targTime = tStep->giveTargetTime();
276 
277  if ( tStep->giveNumber() == 0 ) {
278  return 0;
279  }
280 
281  //do not calculate anything before casting time
282  if ( targTime - castingTime <= 0 ) {
283  ms->power = 0.;
284  return 0.;
285  }
286 
287  //return computed power (homexportmodule)
288  if ( evalTime == ms->lastEvalTime ) {
289  return ms->power;
290  }
291 
292  if ( this->hydrationModelType == 1 ) { //exponential affinity hydration model, need to keep equivalent time
293  ms->equivalentTime = ms->lastEquivalentTime + ( evalTime - ms->lastEvalTime ) * scaleTemperature(gp);
294  if ( ms->equivalentTime != 0. ) {
295  ms->degreeOfHydration = this->DoHInf * exp( -pow(this->tau / ms->equivalentTime, this->beta) );
296  //printf("%f %f %f %f\n", equivalentTime, this->lastEquivalentTime, evalTime, lastEvalTime);
297  }
298  } else if ( this->hydrationModelType == 2 ) { //affinity hydration model inspired by Miguel Cervera et al.
299  //determine timeStep for integration
300  double alphaTrialOld, alphaTrialNew = 0.0;
301  double time = ms->lastEvalTime;
302  double timeStep = ( evalTime - time ) / this->minModelTimeStepIntegrations;
303  if ( timeStep > this->maxModelIntegrationTime ) {
304  timeStep = this->maxModelIntegrationTime;
305  }
307  //integration loop through hydration model at a given TimeStep
308  while ( time < evalTime ) {
309  if ( time + timeStep > evalTime ) {
310  timeStep = evalTime - time;
311  } else {
312  time += timeStep;
313  }
314  //printf("%f %f %f %f\n", time, affinity, scaleTemperature(), degreeOfHydration);
315  alphaTrialOld = ms->degreeOfHydration + scaleTemperature(gp) * affinity25(ms->degreeOfHydration) * timeStep; //predictor
316  //http://en.wikipedia.org/wiki/Predictor%E2%80%93corrector_method
317  //corrector - integration through trapezoidal rule
318  //3 loops normally suffices
319  for ( int i = 0; i < 4; i++ ) {
320  alphaTrialNew = ms->degreeOfHydration + scaleTemperature(gp) * timeStep / 2. * ( affinity25(ms->degreeOfHydration) + affinity25(alphaTrialOld) );
321  alphaTrialOld = alphaTrialNew;
322  }
323  ms->degreeOfHydration = alphaTrialNew;
324  }
325  } else {
326  OOFEM_ERROR("Unknown hydration model type %d", this->hydrationModelType);
327  }
328 
329  ms->power = this->Qpot * ( ms->degreeOfHydration - ms->lastDegreeOfHydration ) / ( evalTime - ms->lastEvalTime );
330  ms->power *= 1000 * this->massCement; // W/m3 of concrete
331 
332  //internal variables are updated in HydratingConcreteMatStatus :: updateYourself()
333  return ms->power;
334 }
335 
336 
338 {
339  HydratingConcreteMatStatus *ms = static_cast< HydratingConcreteMatStatus * >( this->giveStatus(gp) );
340  return exp( this->activationEnergy / 8.314 * ( 1. / ( 273.15 + this->referenceTemperature ) - 1. / ( 273.15 + ms->giveTempField().at(1) ) ) );
341 }
342 
344 {
345  double result = this->B1 * ( this->B2 / this->DoHInf + DoH ) * ( this->DoHInf - DoH ) * exp(-this->eta * DoH / this->DoHInf);
346  if ( result < 0. ) { //numerical instabilities
347  return 0.;
348  }
349 
350  //add slag reaction
351  if ( this->P1 != 0. && DoH >= this->DoH1 ) {
352  result *= 1. + this->P1 * ( DoH - this->DoH1 );
353  }
354  return result;
355 }
356 
358 {
359  return degreeOfHydration;
360 }
361 
362 
363 void
365 {
366  HydratingConcreteMat *mat = static_cast< HydratingConcreteMat * >( this->gp->giveMaterial() );
367  this->lastEvalTime = tStep->giveIntrinsicTime(); //where heat power was evaluated in the last equilibrium
368  this->lastEquivalentTime = this->equivalentTime;
370  //average from last and current temperatures, in C*hour
371  if ( !tStep->isIcApply() && mat->giveCastingTime() < tStep->giveIntrinsicTime() ) {
372  this->maturity += ( ( this->giveField().at(1) + this->giveTempField().at(1) ) / 2. - mat->giveMaturityT0() ) * tStep->giveTimeIncrement() / 3600.;
373  }
375 }
376 
377 
378 void
380 {
381  HydratingConcreteMat *mat = static_cast< HydratingConcreteMat * >( this->gp->giveMaterial() );
383  fprintf(file, " status {");
384  fprintf( file, "EvaluatingTime %e DoH %f HeatPower %f [W/m3 of concrete] Temperature %f conductivity %f capacity %f density %f", tStep->giveIntrinsicTime(), this->giveDoHActual(), this->power, this->giveTempField().at(1), mat->giveIsotropicConductivity(this->gp, tStep), mat->giveConcreteCapacity(this->gp, tStep), mat->giveConcreteDensity(this->gp, tStep) );
385  fprintf(file, "}\n");
386 }
387 } // end namespace oofem
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
const FloatArray & giveTempField()
Return last field.
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
double affinity25(double alpha)
Return affinity scaled to 25C.
#define _IFT_HydratingConcreteMat_P1
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
Definition: material.C:244
double activationEnergy
Activation energy of concrete (default 38400 J/mol/K).
GaussPoint * gp
Associated integration point.
double reinforcementDegree
Degree of reinforcement, if defined, reinforcement effect for conductivity and capacity is accounted ...
Class and object Domain.
Definition: domain.h:115
This class implements various phenomenological and affinity hydration models.
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition: femcmpnn.h:82
#define _IFT_HydratingConcreteMat_B2
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
double giveCastingTime()
Definition: material.h:156
int conductivityType
Use different methods to evaluate material conductivity, capacity, or density.
const char * __MatResponseModeToString(MatResponseMode _value)
Definition: cltypes.C:326
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver&#39;s output to given stream.
double giveTargetTime()
Returns target time.
Definition: timestep.h:146
#define _IFT_HydratingConcreteMat_conductivitytype
This class implements a transport material status information.
virtual double giveConcreteDensity(GaussPoint *gp, TimeStep *tStep)
#define _IFT_HydratingConcreteMat_eta
HydratingConcreteMat(int n, Domain *d)
MatResponseMode
Describes the character of characteristic material matrix.
int hydrationModelType
Type of hydration model, e.g. exponential curve, Cervera&#39;s model.
#define _IFT_HydratingConcreteMat_beta
HydratingConcreteMatStatus(int n, Domain *d, GaussPoint *g)
double giveDoHActual()
Returns actual degree of hydration at last known equilibrium.
double giveTimeIncrement()
Returns solution step associated time increment.
Definition: timestep.h:150
double tau
Parameters for exponential affinity hydration model summarized in A.K.
int giveNumber()
Returns receiver&#39;s number.
Definition: timestep.h:129
const FloatArray & giveField()
Return last field.
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver&#39;s output to given stream.
virtual double giveConcreteCapacity(GaussPoint *gp, TimeStep *tStep)
#define OOFEM_ERROR(...)
Definition: error.h:61
double massCement
Mass of cement in kg per 1m3 of concrete.
double Qpot
Potential heat of hydration, for ordinary Portland cement approximately 500 J/g.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
This class implements an isotropic linear heat material.
Definition: isoheatmat.h:58
Material * giveMaterial()
Returns reference to material associated to related element of receiver.
Definition: gausspoint.h:197
#define _IFT_HydratingConcreteMat_massCement
#define _IFT_HydratingConcreteMat_hydrationModelType
double giveIntrinsicTime()
Returns intrinsic time, e.g. time in which constitutive model is evaluated.
Definition: timestep.h:148
#define _IFT_HydratingConcreteMat_DoH1
#define _IFT_HydratingConcreteMat_referenceTemperature
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
#define _IFT_HydratingConcreteMat_reinforcementDegree
virtual double giveIsotropicConductivity(GaussPoint *gp, TimeStep *tStep)
Abstract base class representing a material status information.
Definition: matstatus.h:84
double maturity
A scalar containing maturity (integration of temperature over time)
Class representing vector of real numbers.
Definition: floatarray.h:82
#define _IFT_HydratingConcreteMat_B1
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Definition: isoheatmat.C:56
virtual void computeInternalSourceVector(FloatArray &val, GaussPoint *gp, TimeStep *tStep, ValueModeType mode)
Computes the internal source vector of receiver.
double GivePower(TimeStep *tStep, GaussPoint *gp, ValueModeType mode)
IRResultType
Type defining the return values of InputRecord reading operations.
Definition: irresulttype.h:47
#define _IFT_HydratingConcreteMat_activationEnergy
#define _IFT_HydratingConcreteMat_densitytype
double DoH1
Optional extension to slag-rich, high-blended cements.
#define _IFT_HydratingConcreteMat_DoHInf
HydratingConcreteMatStatus stores degree of hydration in each integration point.
#define _IFT_HydratingConcreteMat_maxModelIntegrationTime
Class representing the general Input Record.
Definition: inputrecord.h:101
double minModelTimeStepIntegrations
Minimum number of integration steps for hydration model within a given timeStep.
#define _IFT_HydratingConcreteMat_qpot
double scaleTemperature(GaussPoint *gp)
virtual double giveCharacteristicValue(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the characteristic value of receiver in given integration point, respecting its history...
virtual double give(int aProperty, GaussPoint *gp, TimeStep *tStep)
Definition: isoheatmat.C:69
double B1
Parameters for affinity hydration model inspired by Cervera et al.
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
double referenceTemperature
Reference temperature for hydration model.
REGISTER_Material(DummyMaterial)
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:78
bool isIcApply()
Check if receiver is solution step when initial conditions should apply.
Definition: timestep.C:144
the oofem namespace is to define a context or scope in which all oofem names are defined.
#define IR_GIVE_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:69
Class representing integration point in finite element program.
Definition: gausspoint.h:93
#define _IFT_HydratingConcreteMat_capacitytype
#define OOFEM_WARNING(...)
Definition: error.h:62
Class representing solution step.
Definition: timestep.h:80
#define _IFT_HydratingConcreteMat_tau
#define _IFT_HydratingConcreteMat_minModelTimeStepIntegrations
const char * __ValueModeTypeToString(ValueModeType _value)
Definition: cltypes.C:322
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:29 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011