Line data Source code
1 : /****************************************************************/
2 : /* DO NOT MODIFY THIS HEADER */
3 : /* BlackBear */
4 : /* */
5 : /* (c) 2017 Battelle Energy Alliance, LLC */
6 : /* ALL RIGHTS RESERVED */
7 : /* */
8 : /* Prepared by Battelle Energy Alliance, LLC */
9 : /* Under Contract No. DE-AC07-05ID14517 */
10 : /* With the U. S. Department of Energy */
11 : /* */
12 : /* See COPYRIGHT for full restrictions */
13 : /****************************************************************/
14 :
15 : #include "ConcreteThermalMoisture.h"
16 : #include "MooseObjectName.h"
17 :
18 : // libMesh includes
19 : #include "libmesh/quadrature.h"
20 :
21 : registerMooseObject("BlackBearApp", ConcreteThermalMoisture);
22 :
23 : InputParameters
24 2095 : ConcreteThermalMoisture::validParams()
25 : {
26 2095 : InputParameters params = Material::validParams();
27 4190 : params.addRequiredParam<std::string>(
28 : "type", "A string representing the Moose Object that is used to call this class");
29 :
30 : // // parameters which will be deprecated soon
31 4190 : MooseEnum thermal_capacity_model("CONSTANT ASCE-1992 KODUR-2004 EUROCODE-2004");
32 4190 : MooseEnum thermal_conductivity_model("CONSTANT ASCE-1992 KODUR-2004 EUROCODE-2004 KIM-2003");
33 4190 : params.addDeprecatedParam<MooseEnum>("thermal_capacity_model",
34 : thermal_capacity_model,
35 : "thermal capacity models",
36 : "Use thermal_model instead");
37 4190 : params.addDeprecatedParam<MooseEnum>("thermal_conductivity_model",
38 : thermal_conductivity_model,
39 : "thermal conductivity models",
40 : "Use thermal_model instead");
41 4190 : MooseEnum moisture_diffusivity_model("Bazant Xi Mensi");
42 4190 : params.addDeprecatedParam<MooseEnum>("moisture_diffusivity_model",
43 : moisture_diffusivity_model,
44 : "moisture diffusivity models",
45 : "Use moisture_model instead");
46 4190 : params.addDeprecatedParam<Real>("ref_density_of_concrete",
47 : "refernece density of porous media Kg/m^3",
48 : "Use ref_density instead");
49 4190 : params.addDeprecatedParam<Real>("ref_specific_heat_of_concrete",
50 : "reference specific heat of concrete J/Kg/0C",
51 : "Use ref_specific_heat instead");
52 4190 : params.addDeprecatedParam<Real>("ref_thermal_conductivity_of_concrete",
53 : "reference thermal conductivity of concrete W/m/0C",
54 : "Use ref_thermal_conductivity instead");
55 :
56 : // available model for thermal and moisture transport
57 4190 : MooseEnum thermal_model("CONSTANT ASCE-1992 KODUR-2004 EUROCODE-2004");
58 4190 : params.addParam<MooseEnum>(
59 : "thermal_model", thermal_model, "Model for properties used in thermal");
60 4190 : MooseEnum moisture_model("Bazant Mensi Xi");
61 4190 : params.addParam<MooseEnum>(
62 : "moisture_model", moisture_model, "Model for properties used in moisture transport");
63 :
64 : // concrete properties
65 4190 : MooseEnum cement_type("1 2 3 4");
66 4190 : MooseEnum aggregate_type("Siliceous Carbonate");
67 4190 : MooseEnum aggregate_pore_type("dense porous");
68 4190 : params.addParam<MooseEnum>(
69 : "cement_type", cement_type, "cement type input for moisture capacity calculations");
70 4190 : params.addParam<MooseEnum>("aggregate_type", aggregate_type, "Type of aggregate");
71 4190 : params.addParam<MooseEnum>(
72 : "aggregate_pore_type", aggregate_pore_type, "aggregate pore structure");
73 :
74 4190 : params.addParam<Real>("cement_mass", "cement mass (kg) per m^3");
75 4190 : params.addParam<Real>("aggregate_mass", "aggregate mass (kg) per m^3");
76 4190 : params.addParam<Real>("water_to_cement_ratio", "water to cement ratio");
77 4190 : params.addParam<Real>("aggregate_vol_fraction", "volumetric fraction of aggregates");
78 4190 : params.addParam<Real>("concrete_cure_time", "concrete curing time in days");
79 4190 : params.addParam<Real>("ref_density", "refernece density of porous media Kg/m^3");
80 4190 : params.addParam<Real>("ref_specific_heat", "reference specific heat of concrete J/Kg/0C");
81 4190 : params.addParam<Real>("ref_thermal_conductivity",
82 : "concrete reference thermal conductivity (W/m/C)");
83 :
84 : // parameters for Bazant mositure transport model
85 4190 : params.addParam<Real>("D1", "empirical constants (m2/s)");
86 4190 : params.addParam<Real>("n", "empirical constants");
87 4190 : params.addParam<Real>("critical_relative_humidity", "empirical constants");
88 4190 : params.addParam<Real>("coupled_moisture_diffusivity_factor",
89 : "coupling coefficient mositure transfer due to heat");
90 :
91 : // parameters for Mensi's moisture model
92 4190 : params.addParam<Real>("A", "empirical constants (m2/s)");
93 4190 : params.addParam<Real>("B", "empirical constants");
94 :
95 4190 : params.addCoupledVar("relative_humidity", "nonlinear variable name for rel. humidity");
96 4190 : params.addCoupledVar("temperature",
97 : "nonlinear variable name for temperature in unit of Celscius");
98 2095 : params.addClassDescription("Material parameters for thermal and moisture transport in concrete.");
99 :
100 2095 : return params;
101 2095 : }
102 :
103 1623 : ConcreteThermalMoisture::ConcreteThermalMoisture(const InputParameters & parameters)
104 : : Material(parameters),
105 1623 : _thermal_model(getParam<MooseEnum>("thermal_model")),
106 3246 : _moisture_model(getParam<MooseEnum>("moisture_model")),
107 :
108 : // concrete mix proportion paramters
109 5790 : _cement_mass(isParamValid("cement_mass") ? getParam<Real>("cement_mass") : 0),
110 5280 : _aggregate_mass(isParamValid("aggregate_mass") ? getParam<Real>("aggregate_mass") : 0),
111 5790 : _water_to_cement(isParamValid("water_to_cement_ratio") ? getParam<Real>("water_to_cement_ratio")
112 : : 0),
113 :
114 : // CONSTANT thermal trasport model parameters
115 4788 : _input_density(isParamValid("ref_density") ? getParam<Real>("ref_density") : 0),
116 4788 : _input_specific_heat(isParamValid("ref_specific_heat") ? getParam<Real>("ref_specific_heat")
117 : : 0),
118 1623 : _input_thermal_conductivity(
119 3690 : isParamValid("ref_thermal_conductivity") ? getParam<Real>("ref_thermal_conductivity") : 0),
120 :
121 : // asce_1992 and kodur_2004 thermal model parameters
122 3246 : _aggregate_type(getParam<MooseEnum>("aggregate_type")),
123 :
124 : // Bazant moisture model parameters
125 5082 : _D1(isParamValid("D1") ? getParam<Real>("D1") : 0),
126 3930 : _n_power(isParamValid("n") ? getParam<Real>("n") : 0),
127 3930 : _Hc(isParamValid("critical_relative_humidity") ? getParam<Real>("critical_relative_humidity")
128 : : 0),
129 1623 : _alfa_Dht(isParamValid("coupled_moisture_diffusivity_factor")
130 3291 : ? getParam<Real>("coupled_moisture_diffusivity_factor")
131 : : 0),
132 :
133 : // Mensi moisture model parameters
134 4092 : _A(isParamValid("A") ? getParam<Real>("A") : 0),
135 4092 : _B(isParamValid("B") ? getParam<Real>("B") : 0),
136 :
137 : // Xi moisture model parameters
138 3246 : _cement_type(getParam<MooseEnum>("cement_type")),
139 3246 : _aggregate_pore_type(getParam<MooseEnum>("aggregate_pore_type")),
140 1623 : _agg_vol_fraction(
141 5112 : isParamValid("aggregate_vol_fraction") ? getParam<Real>("aggregate_vol_fraction") : 0),
142 5112 : _cure_time(isParamValid("concrete_cure_time") ? getParam<Real>("concrete_cure_time") : 0),
143 :
144 : // material properties asscociated with coupled mositure/thermal transfer through concrete
145 1623 : _thermal_capacity(declareProperty<Real>("thermal_capacity")),
146 1623 : _thermal_conductivity(declareProperty<Real>("thermal_conductivity")),
147 1623 : _ca(declareProperty<Real>("heat_absorption_of_water")),
148 1623 : _cw(declareProperty<Real>("thermal_capacity_of_water")),
149 1623 : _moisture_capacity((_moisture_model == "Xi") ? &declareProperty<Real>("moisture_capacity")
150 : : nullptr),
151 :
152 1623 : _Dh(declareProperty<Real>("humidity_diffusivity")),
153 1623 : _Dht(declareProperty<Real>("humidity_diffusivity_thermal")),
154 1623 : _eqv_age(declareProperty<Real>("eqv_age")),
155 3246 : _eqv_age_old(getMaterialPropertyOld<Real>("eqv_age")),
156 :
157 1623 : _has_rh(isCoupled("relative_humidity")),
158 1623 : _rh(_has_rh ? coupledValue("relative_humidity") : _zero),
159 :
160 1623 : _has_temperature(isCoupled("temperature")),
161 3246 : _temp(_has_temperature ? coupledValue("temperature") : _zero)
162 : {
163 : Real parameter_error_check = true;
164 3246 : if (parameters.isParamSetByUser("thermal_capacity_model"))
165 : {
166 0 : _thermal_model = getParam<MooseEnum>("thermal_capacity_model");
167 0 : _input_density = isParamValid("ref_density_of_concrete")
168 0 : ? getParam<Real>("ref_density_of_concrete")
169 : : 2231.0;
170 0 : _input_specific_heat = isParamValid("ref_specific_heat_of_concrete")
171 0 : ? getParam<Real>("ref_specific_heat_of_concrete")
172 : : 1100.0;
173 0 : _input_thermal_conductivity = isParamValid("ref_thermal_conductivity_of_concrete")
174 0 : ? getParam<Real>("ref_thermal_conductivity_of_concrete")
175 : : 3.0;
176 0 : _aggregate_type = isParamValid("aggregate_type") ? getParam<MooseEnum>("aggregate_type") : 0;
177 : parameter_error_check = false;
178 : }
179 1623 : if (parameter_error_check)
180 : {
181 1623 : if (_thermal_model == "CONSTANT")
182 : {
183 450 : if (!parameters.isParamSetByUser("ref_density"))
184 3 : mooseError("For CONSTANT thermal_model, ref_density must be defined.");
185 444 : if (!parameters.isParamSetByUser("ref_specific_heat"))
186 3 : mooseError("For constant thermal transport model, ref_specific_heat must be defined.");
187 438 : if (!parameters.isParamSetByUser("ref_thermal_conductivity"))
188 3 : mooseError(
189 : "For constant thermal transport model, ref_thermal_conductivity must be defined.");
190 : }
191 1398 : else if (_thermal_model == "ASCE-1992")
192 : {
193 174 : if (!parameters.isParamSetByUser("aggregate_type"))
194 3 : mooseError("For ASCE-1992 thermal model, aggregate_type must be defined.");
195 : }
196 1311 : else if (_thermal_model == "KODUR-2004")
197 : {
198 1518 : if (!parameters.isParamSetByUser("aggregate_type"))
199 3 : mooseError("For KODUR-2004 thermal model, aggregate_type must be defined.");
200 : }
201 552 : else if (_thermal_model == "EUROCODE-2004")
202 : {
203 1104 : if (!parameters.isParamSetByUser("ref_density"))
204 3 : mooseError("For EUROCODE-2004 thermal model, ref_density must be defined.");
205 1098 : if (!parameters.isParamSetByUser("ref_specific_heat"))
206 3 : mooseError("For EUROCODE-2004 thermal model, ref_specific_heat must be defined.");
207 : }
208 : }
209 :
210 : parameter_error_check = true;
211 :
212 3204 : if (parameters.isParamSetByUser("moisture_diffusivity_model"))
213 : {
214 0 : _moisture_model = getParam<MooseEnum>("moisture_diffusivity_model");
215 0 : _cement_mass = isParamValid("cement_mass") ? getParam<Real>("cement_mass") : 354.0;
216 0 : _water_to_cement =
217 0 : isParamValid("water_to_cement_ratio") ? getParam<Real>("water_to_cement_ratio") : 0.43;
218 0 : _cement_type = isParamValid("cement_type") ? getParam<MooseEnum>("cement_type") : 0;
219 : _aggregate_pore_type =
220 0 : isParamValid("aggregate_pore_type") ? getParam<MooseEnum>("aggregate_pore_type") : 0;
221 0 : _cure_time = isParamValid("concrete_cure_time") ? getParam<Real>("concrete_cure_time") : 23.0;
222 0 : _aggregate_mass = isParamValid("aggregate_mass") ? getParam<Real>("aggregate_mass") : 1877;
223 0 : _agg_vol_fraction =
224 0 : isParamValid("aggregate_vol_fraction") ? getParam<Real>("aggregate_vol_fraction") : 0.7;
225 0 : _D1 = isParamValid("D1") ? getParam<Real>("D1") : 3.0e-10;
226 0 : _Hc = isParamValid("critical_relative_humidity") ? getParam<Real>("critical_relative_humidity")
227 : : 0.75;
228 0 : _n_power = isParamValid("n") ? getParam<Real>("n") : 6.0;
229 0 : _alfa_Dht = isParamValid("coupled_moisture_diffusivity_factor")
230 0 : ? getParam<Real>("coupled_moisture_diffusivity_factor")
231 : : 1.0e-5;
232 0 : _A = isParamValid("A") ? getParam<Real>("A") : 3.8e-13;
233 0 : _B = isParamValid("B") ? getParam<Real>("B") : 0.05;
234 : parameter_error_check = false;
235 : }
236 :
237 1602 : if (parameter_error_check)
238 : {
239 1602 : if (_moisture_model == "Bazant")
240 : {
241 648 : if (!parameters.isParamSetByUser("D1"))
242 3 : mooseError("For Bazant moisture model, empirical constant D1 must be defined.");
243 642 : if (!parameters.isParamSetByUser("n"))
244 3 : mooseError("For Bazant moisture model, empirical constant n must be defined.");
245 636 : if (!parameters.isParamSetByUser("critical_relative_humidity"))
246 3 : mooseError("For Bazant moisture model, critical_relative_humidity must be defined.");
247 630 : if (!parameters.isParamSetByUser("coupled_moisture_diffusivity_factor"))
248 3 : mooseError(
249 : "For Bazant moisture model, coupled_moisture_diffusivity_factor must be defined.");
250 : }
251 1278 : else if (_moisture_model == "Mensi")
252 : {
253 684 : if (!parameters.isParamSetByUser("A"))
254 3 : mooseError("For Mensi moisture model, empirical constant A must be defined.");
255 678 : if (!parameters.isParamSetByUser("B"))
256 3 : mooseError("For Mensi moisture model, empirical constant B must be defined.");
257 672 : if (!parameters.isParamValid("cement_mass"))
258 3 : mooseError("For Mensi moisture model, cement_mass must be defined.");
259 666 : if (!parameters.isParamSetByUser("water_to_cement_ratio"))
260 3 : mooseError("For Mensi moisture model, water_to_cement_ratio must be defined.");
261 : }
262 936 : else if (_moisture_model == "Xi")
263 : {
264 1872 : if (!parameters.isParamSetByUser("cement_type"))
265 3 : mooseError("For Xi moisture model, cement_type must be defined.");
266 1866 : if (!parameters.isParamSetByUser("aggregate_pore_type"))
267 3 : mooseError("For Xi moisture model, aggregate_pore_type must be defined.");
268 1860 : if (!parameters.isParamSetByUser("aggregate_vol_fraction"))
269 3 : mooseError("For Xi moisture model, aggregate_vol_fraction must be defined.");
270 1854 : if (!parameters.isParamSetByUser("concrete_cure_time"))
271 3 : mooseError("For Xi moisture model, concrete_cure_time must be defined.");
272 1848 : if (!parameters.isParamValid("cement_mass"))
273 3 : mooseError("For Xi moisture model, cement_mass must be defined.");
274 1842 : if (!parameters.isParamSetByUser("aggregate_mass"))
275 3 : mooseError("For Xi moisture model, aggregate_mass must be defined.");
276 1836 : if (!parameters.isParamSetByUser("water_to_cement_ratio"))
277 3 : mooseError("For Xi moisture model, water_to_cement_ratio must be defined.");
278 915 : if (_water_to_cement < 0.5)
279 3 : mooseError("For Xi's moisture model water_to_cement_ratio must be >= 0.5 to use Xi's model "
280 : "for moisture diffusivity");
281 : }
282 : }
283 1554 : }
284 :
285 : void
286 11717 : ConcreteThermalMoisture::initQpStatefulProperties()
287 : {
288 11717 : _eqv_age[_qp] = _cure_time;
289 11717 : }
290 :
291 : void
292 1206229 : ConcreteThermalMoisture::computeProperties()
293 : {
294 3554244 : for (unsigned int qp = 0; qp < _qrule->n_points(); ++qp)
295 : {
296 2348027 : Real T = _temp[qp];
297 2348027 : Real H = _rh[qp];
298 2348027 : if (H < 0.0)
299 : H = 0.0;
300 :
301 2348027 : Real ro = _input_density;
302 2348027 : Real Cv = _input_specific_heat;
303 :
304 : // compute concrete thermal capacity
305 2348027 : switch (_thermal_model)
306 : {
307 501050 : case 0: // CONSTANT
308 501050 : _thermal_capacity[qp] = ro * Cv;
309 501050 : _thermal_conductivity[qp] = _input_thermal_conductivity;
310 501050 : break;
311 25564 : case 1: // ASCE-1992 for normal strength concrete
312 : switch (_aggregate_type)
313 : {
314 12782 : case 0: // siliceous aggreagte
315 12782 : if (T < 20.0)
316 161 : _thermal_capacity[qp] = 1.8 * 1e6;
317 12621 : else if (T >= 20.0 && T < 200.0)
318 2905 : _thermal_capacity[qp] = (0.005 * T + 1.7) * 1.0e6;
319 9716 : else if (T >= 200.0 && T < 400.0)
320 3234 : _thermal_capacity[qp] = 2.7 * 1.0e6;
321 6482 : else if (T >= 400.0 && T < 500.0)
322 1617 : _thermal_capacity[qp] = (0.013 * T - 2.5) * 1.0e6;
323 4865 : else if (T >= 500.0 && T < 600.0)
324 1617 : _thermal_capacity[qp] = (10.5 - 0.013 * T) * 1.0e6;
325 3248 : else if (T >= 600.0)
326 3248 : _thermal_capacity[qp] = 2.7 * 1.0e6;
327 :
328 12782 : if (T < 20.0)
329 161 : _thermal_conductivity[qp] = 1.4875;
330 12621 : else if (T >= 20.0 && T < 800.0)
331 12586 : _thermal_conductivity[qp] = -0.000625 * T + 1.5;
332 35 : else if (T >= 800.0)
333 35 : _thermal_conductivity[qp] = 1.0;
334 : break;
335 :
336 12782 : case 1: // carbonate aggregate
337 12782 : if (T < 400.0)
338 6153 : _thermal_capacity[qp] = 2.566 * 1.0e6;
339 6629 : else if (T >= 400.0 && T < 410.0)
340 168 : _thermal_capacity[qp] = (0.1765 * T - 68.034) * 1.0e6;
341 6461 : else if (T >= 410.0 && T < 445.0)
342 567 : _thermal_capacity[qp] = (25.00671 - 0.05043 * T) * 1.0e6;
343 5894 : else if (T >= 445.0 && T < 500.0)
344 924 : _thermal_capacity[qp] = 2.566 * 1.0e6;
345 4970 : else if (T >= 500.0 && T < 635.0)
346 2226 : _thermal_capacity[qp] = (0.01603 * T - 5.44881) * 1.0e6;
347 2744 : else if (T >= 635.0 && T < 715.0)
348 1323 : _thermal_capacity[qp] = (0.16635 * T - 100.90225) * 1.0e6;
349 1421 : else if (T >= 715.0 && T < 785.0)
350 1155 : _thermal_capacity[qp] = (176.07343 - 0.22103 * T) * 1.0e6;
351 266 : else if (T >= 785.0)
352 266 : _thermal_capacity[qp] = 2.566 * 1.0e6;
353 :
354 12782 : if (T < 293.0)
355 4389 : _thermal_conductivity[qp] = 1.355;
356 : else
357 8393 : _thermal_conductivity[qp] = -0.001241 * T + 1.7162;
358 : break;
359 :
360 0 : default:
361 0 : mooseError("Unknown aggregate types");
362 : break;
363 : }
364 : break;
365 :
366 1807620 : case 2: // KODUR-2004 for high strength concrere
367 : switch (_aggregate_type)
368 : {
369 1793836 : case 0: // siliceous aggreagte
370 1793836 : if (T < 20.0)
371 3636 : _thermal_capacity[qp] = 1.8 * 1.0e6;
372 1790200 : else if (T >= 20.0 && T < 200.0)
373 1688835 : _thermal_capacity[qp] = (0.005 * T + 1.7) * 1.0e6;
374 101365 : else if (T >= 200.0 && T < 400.0)
375 46425 : _thermal_capacity[qp] = 2.7 * 1.0e6;
376 54940 : else if (T >= 400.0 && T < 500.0)
377 23217 : _thermal_capacity[qp] = (0.013 * T - 2.5) * 1.0e6;
378 31723 : else if (T >= 500.0 && T < 600.0)
379 23229 : _thermal_capacity[qp] = (10.5 - 0.013 * T) * 1.0e6;
380 8494 : else if (T >= 600.0 && T < 635.0)
381 8106 : _thermal_capacity[qp] = 2.7 * 1.0e6;
382 388 : else if (T > 635.0)
383 3 : mooseError("Temperature outside of the range for the KODUR-2004 thermal model");
384 :
385 1793833 : if (T < 20.0)
386 3636 : _thermal_conductivity[qp] = 1.4875;
387 1790197 : else if (T >= 20.0)
388 1790197 : _thermal_conductivity[qp] = -0.000625 * T + 1.5;
389 : break;
390 :
391 13784 : case 1: // carbonate aggregate
392 13784 : if (T < 400.0)
393 5280 : _thermal_capacity[qp] = 2.45 * 1.0e6;
394 8504 : else if (T >= 400.0 && T < 475.0)
395 1059 : _thermal_capacity[qp] = (0.026 * T - 12.85) * 1.0e6;
396 7445 : else if (T >= 475.0 && T < 650.0)
397 2469 : _thermal_capacity[qp] = (0.0143 * T - 6.295) * 1.0e6;
398 4976 : else if (T >= 650.0 && T < 735.0)
399 1203 : _thermal_capacity[qp] = (0.1894 * T - 120.11) * 1.0e6;
400 3773 : else if (T >= 735.0 && T < 800.0)
401 924 : _thermal_capacity[qp] = (-0.263 * T + 212.4) * 1.0e6;
402 2849 : else if (T >= 800.0 && T <= 1000.0)
403 2846 : _thermal_capacity[qp] = 2.00 * 1.0e6;
404 3 : else if (T > 1000.0)
405 3 : mooseError("Temperature outside of the range for the KODUR-2004 thermal model");
406 :
407 13781 : if (T < 293.0)
408 3765 : _thermal_conductivity[qp] = 1.355;
409 : else
410 10016 : _thermal_conductivity[qp] = -0.001241 * T + 1.7162;
411 : break;
412 :
413 0 : default:
414 0 : mooseError("Unknown aggregate types");
415 : break;
416 : }
417 : break;
418 :
419 13793 : case 3: // EUROCODE-2004 for both normal ans high strength concrete
420 : // compute density of concrete
421 13793 : if (T < 115.0)
422 : ro = _input_density;
423 12737 : else if (T >= 115.0 && T < 200.0)
424 996 : ro = _input_density * (1.0 - 0.02 * (T - 115.0) / 85.0);
425 11741 : else if (T >= 200.0 && T < 400.0)
426 2334 : ro = _input_density * (0.98 - 0.03 * (T - 200.0) / 200.0);
427 9407 : else if (T >= 400.0 && T < 1200.0)
428 9404 : ro = _input_density * (0.95 - 0.07 * (T - 400.0) / 800.0);
429 3 : else if (T >= 1200.0)
430 3 : mooseError("Temperature outside of the range for the EUROCODE-2004 thermal model");
431 :
432 13790 : if (T < 100.0)
433 : Cv = 900.0;
434 12911 : else if (T >= 100.0 && T < 200.0)
435 1173 : Cv = 900.0 + (T - 100.0);
436 11738 : else if (T >= 200.0 && T < 400.0)
437 2334 : Cv = 1000.0 + (T - 200.0) / 2.0;
438 9404 : else if (T >= 400.0 && T < 1200.0)
439 : Cv = 1100.0;
440 :
441 13790 : _thermal_capacity[qp] = ro * Cv;
442 :
443 13790 : if (T < 20.0)
444 6 : _thermal_conductivity[qp] = 1.642218;
445 13784 : else if (T >= 20.0 && T <= 1200.0)
446 : {
447 13784 : const Real k_up = 2.0 - 0.2451 * (T / 100.0) + 0.0107 * std::pow(T / 100.0, 2.0);
448 13784 : const Real k_low = 1.36 - 0.136 * (T / 100.0) + 0.0057 * std::pow(T / 100.0, 2.0);
449 13784 : _thermal_conductivity[qp] = (k_up + k_low) / 2.0; // average bewteen upper and lower
450 : // bounds
451 : }
452 : break;
453 :
454 0 : default:
455 0 : mooseError("Unknown thermal model");
456 : break;
457 : }
458 :
459 : // compute moisture diffusivity
460 2348018 : switch (_moisture_model)
461 : {
462 526620 : case 0: // Bazant
463 : {
464 1053240 : if (_pars.isParamSetByUser("moisture_model") && T < 25.0)
465 3 : mooseError("Temperature outside of the range for the Bazant moisture model");
466 : // adsorption heat of water vapor
467 : Real adsorption_heat_water =
468 : 60 * 1000 / 0.018; // an average value (60 kJ/mol) estimated for different cement paste
469 : // by Poyet and Charles (2009)
470 : Real density_water = 1000; // kg/m3
471 : Real heat_capacity_water = 4180; // J/(kg-C)
472 526617 : _ca[qp] = adsorption_heat_water;
473 526617 : _cw[qp] = density_water * heat_capacity_water;
474 :
475 526617 : if (T <= 95.0)
476 : {
477 365014 : Real alfa_T = 0.05 + 0.95 / 70 * (T - 25); // Bazant and Thonguthai 1979
478 : Real f1_h =
479 365014 : alfa_T + (1 - alfa_T) / (1.0 + std::pow(((1.0 - H) / (1 - _Hc)),
480 365014 : _n_power)); // Bazant and Thonguthai 1979
481 365014 : Real f2_T = std::exp(
482 365014 : 2700.0 * (1.0 / (25.0 + 273.15) - 1.0 / (T + 273.15))); // Bazant and Thonguthai 1979
483 365014 : _Dh[qp] = _D1 * f1_h * f2_T;
484 : }
485 : else
486 : {
487 : Real f2_95 = std::exp(
488 : 2700.0 * (1.0 / (25.0 + 273.15) - 1.0 / (95 + 273.15))); // Bazant and Thonguthai 1979
489 : Real f3_T =
490 161603 : std::exp((T - 95.0) / (0.881 + 0.214 * (T - 95.0))); // Bazant and Thonguthai 1979
491 161603 : _Dh[qp] = _D1 * f2_95 * f3_T; // Bazant and Thonguthai 1979
492 : }
493 : // compute the coupled mositure diffusivity due to thermal gradient
494 526617 : _Dht[qp] = _alfa_Dht * _Dh[qp];
495 526617 : break;
496 : }
497 :
498 867130 : case 1: // Mensi
499 : {
500 867130 : Real initial_water_content = _water_to_cement * _cement_mass; // kg/m3
501 867130 : _Dh[qp] = _A * std::exp(_B * initial_water_content);
502 867130 : _ca[qp] = 0.;
503 867130 : _cw[qp] = 0.;
504 867130 : _Dht[qp] = 0.;
505 867130 : break;
506 : }
507 :
508 954268 : case 2: // Xi
509 : {
510 : // compute equivalent concrete age
511 954268 : _eqv_age[qp] =
512 954268 : _eqv_age_old[qp] + _dt / 86400.0 * 1.0 / (1.0 + std::pow((7.5 - 7.5 * H), 4.0));
513 :
514 954268 : Real C = std::exp(855.0 / (T + 273.15));
515 : Real N_ct = 1.1;
516 : switch (_cement_type)
517 : {
518 : case 0: // cement_type = 1
519 : N_ct = 1.1;
520 : break;
521 : case 1: // cement_type = 2
522 : N_ct = 1.0;
523 : break;
524 : case 2: // cement_type = 3
525 : N_ct = 1.15;
526 : break;
527 : case 3: // cement_type = 4
528 : N_ct = 1.5;
529 : break;
530 0 : default: // cement_type = Unknown
531 0 : mooseError("Unknown cement type in mositure capacity calculations");
532 : break;
533 : }
534 :
535 : Real N_wc = 0.9;
536 954268 : if (_water_to_cement < 0.3)
537 : N_wc = 0.99;
538 954268 : else if (_water_to_cement >= 0.3 && _water_to_cement <= 0.7)
539 954268 : N_wc = 0.33 + 2.2 * _water_to_cement;
540 : else
541 : N_wc = 1.87;
542 :
543 : Real N_te = 5.5;
544 954268 : if (_eqv_age[qp] >= 5)
545 954268 : N_te = 2.5 + 15.0 / _eqv_age[qp];
546 :
547 954268 : Real n = N_te * N_wc * N_ct * 1.0;
548 :
549 954268 : Real k = ((1.0 - 1.0 / n) * C - 1.0) / (C - 1.0);
550 954268 : if (k < 0.0)
551 : k = 0.0;
552 954268 : else if (k > 1.0)
553 : k = 1.0;
554 :
555 : Real V_ct = 0.9;
556 : switch (_cement_type)
557 : {
558 : case 0: // cement_type = 1
559 : V_ct = 0.9;
560 : break;
561 : case 1: // cement_type = 2
562 : V_ct = 1.0;
563 : break;
564 : case 2: // cement_type = 3
565 : V_ct = 0.85;
566 : break;
567 : case 3: // cement_type = 4
568 : V_ct = 0.6;
569 : break;
570 0 : default: // cement_type = Unknown
571 0 : mooseError("Unknown cement type in mositure capacity calculations");
572 : break;
573 : }
574 :
575 : Real V_wc = 0.985;
576 954268 : if (_water_to_cement < 0.3)
577 : V_wc = 0.985;
578 954268 : else if (_water_to_cement >= 0.3 && _water_to_cement <= 0.7)
579 954268 : V_wc = 0.85 + 0.45 * _water_to_cement;
580 : else
581 : V_wc = 1.165;
582 :
583 : Real V_te = 0.024;
584 954268 : if (_eqv_age[qp] >= 5)
585 954268 : V_te = 0.068 - 0.22 / _eqv_age[qp];
586 :
587 : Real monolayer_factor = 1.0;
588 954268 : Real Vm = V_te * V_wc * V_ct *
589 : monolayer_factor; // here 1.0 is a factor is to account for the influence of
590 : // temperature in the calculation of monolayer capacity.
591 :
592 954268 : Real W_cement = C * k * Vm * H / (1.0 - k * H) / (1.0 + (C - 1.0) * k * H);
593 :
594 954268 : Real dWdH_cement = (C * k * Vm + W_cement * k * (1.0 + (C - 1.0) * k * H) -
595 954268 : W_cement * k * (1.0 - k * H) * (C - 1.0)) /
596 : (1.0 - k * H) / (1.0 + (C - 1.0) * k * H);
597 :
598 : // compute mositure capacity dw/dH for aggregates
599 : Real n_agg = 1.5;
600 : switch (_aggregate_pore_type)
601 : {
602 : case 0: // aggregate_pore_type = dense
603 : n_agg = 1.5;
604 : break;
605 51128 : case 1: // aggregate_pore_type = porous
606 : n_agg = 2.0;
607 51128 : break;
608 0 : default:
609 0 : mooseError("Unknown aggregate pore structure");
610 : break;
611 : }
612 :
613 954268 : n = 4.063 * n_agg;
614 954268 : k = ((1.0 - 1.0 / n) * C - 1.0) / (C - 1.0);
615 954268 : if (k < 0.0)
616 : k = 0.0;
617 954268 : else if (k > 1.0)
618 : k = 1.0;
619 :
620 : Real V_agg = 0.05;
621 : switch (_aggregate_pore_type)
622 : {
623 : case 0: // aggregate_pore_type = dense
624 : V_agg = 0.05;
625 : break;
626 51128 : case 1: // aggregate_pore_type = porous
627 : V_agg = 0.10;
628 51128 : break;
629 0 : default:
630 0 : mooseError("Unknown aggregate pore structure");
631 : break;
632 : }
633 :
634 954268 : Vm = 0.0647 * V_agg;
635 :
636 954268 : Real W_agg = C * k * Vm * H / (1.0 - k * H) / (1.0 + (C - 1.0) * k * H);
637 954268 : Real dWdH_agg = (C * k * Vm + W_agg * k * (1.0 + (C - 1.0) * k * H) -
638 954268 : W_agg * k * (1.0 - k * H) * (C - 1.0)) /
639 : (1.0 - k * H) / (1.0 + (C - 1.0) * k * H);
640 :
641 : // compute weight percentages of agrregates and cement paste
642 954268 : Real _f_agg = _aggregate_mass / (_aggregate_mass + _cement_mass);
643 954268 : Real _f_cp = _cement_mass / (_aggregate_mass + _cement_mass);
644 :
645 : // compute combined dW/dH of concrete
646 954268 : (*_moisture_capacity)[qp] = (_f_agg * dWdH_agg + _f_cp * dWdH_cement);
647 :
648 : // moisture diffusivity calculations
649 954268 : Real gi = _agg_vol_fraction;
650 954268 : Real wc = _water_to_cement;
651 954268 : Real alfa_h = 1.05 - 3.8 * wc + 3.56 * std::pow(wc, 2.0); // cm2/day
652 954268 : Real betta_h = -14.4 + 50.4 * wc - 41.8 * std::pow(wc, 2.0); // cm2/day
653 954268 : Real gamma_h = 31.3 - 136.0 * wc + 162.0 * std::pow(wc, 2.0);
654 954268 : Real power1 = std::pow(10.0, gamma_h * (H - 1));
655 954268 : Real power2 = std::pow(2.0, -1.0 * power1);
656 :
657 954268 : Real Dhcp = alfa_h + betta_h * (1.0 - power2); // cm2/day
658 954268 : _Dh[qp] = Dhcp * (1 + gi / ((1 - gi) / 3 - 1)); // cm2/day
659 954268 : _Dh[qp] = _Dh[qp] * 1e-4 / 86400; // m2/s
660 :
661 954268 : _ca[qp] = 0.;
662 954268 : _cw[qp] = 0.;
663 954268 : _Dht[qp] = 0.;
664 954268 : break;
665 : }
666 :
667 0 : default:
668 : {
669 0 : mooseError("Unknown moisture diffusivity model");
670 : break;
671 : }
672 : }
673 : }
674 1206217 : }
|