Line data Source code
1 : //* This file is part of the MOOSE framework
2 : //* https://mooseframework.inl.gov
3 : //*
4 : //* All rights reserved, see COPYRIGHT for full restrictions
5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 : //*
7 : //* Licensed under LGPL 2.1, please see LICENSE for details
8 : //* https://www.gnu.org/licenses/lgpl-2.1.html
9 :
10 : #include "ADWallFrictionChengMaterial.h"
11 : #include "WallFrictionModels.h"
12 : #include "SinglePhaseFluidProperties.h"
13 : #include "FlowModelSinglePhase.h"
14 : #include "Numerics.h"
15 :
16 : registerMooseObject("ThermalHydraulicsApp", ADWallFrictionChengMaterial);
17 :
18 : InputParameters
19 1289 : ADWallFrictionChengMaterial::validParams()
20 : {
21 1289 : InputParameters params = Material::validParams();
22 2578 : params.addRequiredParam<MaterialPropertyName>("f_D", "Darcy friction factor material property");
23 2578 : params.addParam<MaterialPropertyName>(
24 : "rho", FlowModelSinglePhase::DENSITY, "Density of the fluid");
25 2578 : params.addParam<MaterialPropertyName>("vel", FlowModelSinglePhase::VELOCITY, "Fluid velocity");
26 2578 : params.addParam<MaterialPropertyName>(
27 : "D_h", FlowModelSinglePhase::HYDRAULIC_DIAMETER, "Hydraulic diameter");
28 2578 : params.addParam<MaterialPropertyName>(
29 : "mu", FlowModelSinglePhase::DYNAMIC_VISCOSITY, "Dynamic viscosity of the fluid");
30 2578 : params.addRequiredRangeCheckedParam<Real>(
31 : "PoD", "PoD>=1.0", "The Pitch-to-diameter ratio value being assigned into the property");
32 2578 : MooseEnum bundle_array("SQUARE HEXAGONAL");
33 2578 : params.addRequiredParam<MooseEnum>(
34 : "bundle_array", bundle_array, "The type of the rod bundle array");
35 2578 : MooseEnum subchannel_type("INTERIOR EDGE CORNER");
36 2578 : params.addRequiredParam<MooseEnum>(
37 : "subchannel_type", subchannel_type, "The type of subchannel to be considered");
38 1289 : params.addClassDescription("Computes wall friction factor using the Cheng-Todreas correlation "
39 : "for interior, edge and corner channels.");
40 1289 : return params;
41 1289 : }
42 :
43 1005 : ADWallFrictionChengMaterial::ADWallFrictionChengMaterial(const InputParameters & parameters)
44 : : Material(parameters),
45 2010 : _f_D_name(getParam<MaterialPropertyName>("f_D")),
46 1005 : _f_D(declareADProperty<Real>(_f_D_name)),
47 2010 : _rho(getADMaterialProperty<Real>("rho")),
48 2010 : _vel(getADMaterialProperty<Real>("vel")),
49 2010 : _D_h(getADMaterialProperty<Real>("D_h")),
50 2010 : _mu(getADMaterialProperty<Real>("mu")),
51 2010 : _PoD(getParam<Real>("PoD")),
52 2010 : _bundle_array(getParam<MooseEnum>("bundle_array").getEnum<Bundle_array>()),
53 3015 : _subchannel_type(getParam<MooseEnum>("subchannel_type").getEnum<Subchannel_type>())
54 :
55 : {
56 1005 : }
57 :
58 : void
59 3232 : ADWallFrictionChengMaterial::computeQpProperties()
60 : {
61 3232 : ADReal Re = THM::Reynolds(1, _rho[_qp], _vel[_qp], _D_h[_qp], _mu[_qp]);
62 3232 : if (_PoD > 1.5)
63 : {
64 2 : mooseDoOnce(mooseWarning(
65 : "The Cheng-Todreas correlation for the friction factor is valid when P/D is between 1.0 "
66 : "and 1.5. Be aware that using values out of this range may lead to "
67 : "significant errors in your results!"));
68 : }
69 : // The Pitch-to-Diameter ratio (PoD) cannot be smaller than 1.0.
70 3230 : switch (_subchannel_type)
71 : {
72 3134 : case Subchannel_type::INTERIOR:
73 : {
74 3134 : switch (_bundle_array)
75 : {
76 30 : case Bundle_array::SQUARE:
77 : {
78 30 : if (_PoD < 1.1)
79 : {
80 12 : if (Re <= 2100)
81 : {
82 6 : ADReal a = 26.37;
83 6 : ADReal b = 374.2;
84 6 : ADReal c = -493.9;
85 6 : ADReal n = 1;
86 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
87 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
88 : break;
89 : }
90 6 : else if (Re > 2100)
91 : {
92 6 : ADReal a = 0.09423;
93 6 : ADReal b = 0.5806;
94 6 : ADReal c = -1.239;
95 6 : ADReal n = 0.18;
96 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
97 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
98 : break;
99 : }
100 : }
101 : else
102 : {
103 18 : if (Re <= 2100)
104 : {
105 12 : ADReal a = 35.55;
106 12 : ADReal b = 263.7;
107 12 : ADReal c = -190.2;
108 12 : ADReal n = 1;
109 12 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
110 12 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
111 : break;
112 : }
113 6 : else if (Re > 2100)
114 : {
115 6 : ADReal a = 0.1339;
116 6 : ADReal b = 0.09059;
117 6 : ADReal c = -0.09926;
118 6 : ADReal n = 0.18;
119 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
120 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
121 : break;
122 : }
123 : }
124 : break;
125 : }
126 3104 : case Bundle_array::HEXAGONAL:
127 : {
128 3104 : if (_PoD < 1.1)
129 : {
130 12 : if (Re <= 2100)
131 : {
132 6 : ADReal a = 26;
133 6 : ADReal b = 888.2;
134 6 : ADReal c = -3334;
135 6 : ADReal n = 1;
136 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
137 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
138 : break;
139 : }
140 6 : else if (Re > 2100)
141 : {
142 6 : ADReal a = 0.09378;
143 6 : ADReal b = 1.398;
144 6 : ADReal c = -8.664;
145 6 : ADReal n = 0.18;
146 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
147 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
148 : break;
149 : }
150 : }
151 : else
152 : {
153 3092 : if (Re <= 2100)
154 : {
155 6 : ADReal a = 62.97;
156 6 : ADReal b = 216.9;
157 6 : ADReal c = -190.2;
158 6 : ADReal n = 1;
159 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
160 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
161 : break;
162 : }
163 3086 : else if (Re > 2100)
164 : {
165 3086 : ADReal a = 0.1458;
166 3086 : ADReal b = 0.03632;
167 3086 : ADReal c = -0.03333;
168 3086 : ADReal n = 0.18;
169 3086 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
170 3086 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
171 : break;
172 : }
173 : }
174 : break;
175 : }
176 : }
177 : break;
178 : }
179 :
180 48 : case Subchannel_type::EDGE:
181 : {
182 48 : switch (_bundle_array)
183 : {
184 24 : case Bundle_array::SQUARE:
185 : {
186 24 : if (_PoD < 1.1)
187 : {
188 12 : if (Re <= 2100)
189 : {
190 6 : ADReal a = 26.18;
191 6 : ADReal b = 554.5;
192 6 : ADReal c = -1480;
193 6 : ADReal n = 1;
194 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
195 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
196 : break;
197 : }
198 6 : else if (Re > 2100)
199 : {
200 6 : ADReal a = 0.09377;
201 6 : ADReal b = 0.8732;
202 6 : ADReal c = -3.341;
203 6 : ADReal n = 0.18;
204 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
205 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
206 : break;
207 : }
208 : }
209 : else
210 : {
211 12 : if (Re <= 2100)
212 : {
213 6 : ADReal a = 44.40;
214 6 : ADReal b = 256.7;
215 6 : ADReal c = -267.6;
216 6 : ADReal n = 1;
217 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
218 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
219 : break;
220 : }
221 6 : else if (Re > 2100)
222 : {
223 6 : ADReal a = 0.1430;
224 6 : ADReal b = 0.04199;
225 6 : ADReal c = -0.04428;
226 6 : ADReal n = 0.18;
227 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
228 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
229 : break;
230 : }
231 : }
232 : break;
233 : }
234 24 : case Bundle_array::HEXAGONAL:
235 : {
236 24 : if (_PoD < 1.1)
237 : {
238 12 : if (Re <= 2100)
239 : {
240 6 : ADReal a = 26.18;
241 6 : ADReal b = 554.5;
242 6 : ADReal c = -1480;
243 6 : ADReal n = 1;
244 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
245 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
246 : break;
247 : }
248 6 : else if (Re > 2100)
249 : {
250 6 : ADReal a = 0.09377;
251 6 : ADReal b = 0.8732;
252 6 : ADReal c = -3.341;
253 6 : ADReal n = 0.18;
254 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
255 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
256 : break;
257 : }
258 : }
259 : else
260 : {
261 12 : if (Re <= 2100)
262 : {
263 6 : ADReal a = 44.4;
264 6 : ADReal b = 256.7;
265 6 : ADReal c = -267.6;
266 6 : ADReal n = 1;
267 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
268 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
269 : break;
270 : }
271 6 : else if (Re > 2100)
272 : {
273 6 : ADReal a = 0.1430;
274 6 : ADReal b = 0.04199;
275 6 : ADReal c = -0.04428;
276 6 : ADReal n = 0.18;
277 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
278 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
279 : break;
280 : }
281 : }
282 : break;
283 : }
284 : }
285 : break;
286 : }
287 :
288 48 : case Subchannel_type::CORNER:
289 : {
290 48 : switch (_bundle_array)
291 : {
292 24 : case Bundle_array::SQUARE:
293 : {
294 24 : if (_PoD < 1.1)
295 : {
296 12 : if (Re <= 2100)
297 : {
298 6 : ADReal a = 28.62;
299 6 : ADReal b = 715.9;
300 6 : ADReal c = -2807;
301 6 : ADReal n = 1;
302 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
303 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
304 : break;
305 : }
306 6 : else if (Re > 2100)
307 : {
308 6 : ADReal a = 0.09755;
309 6 : ADReal b = 1.127;
310 6 : ADReal c = -6.304;
311 6 : ADReal n = 0.18;
312 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
313 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
314 : break;
315 : }
316 : }
317 : else
318 : {
319 12 : if (Re <= 2100)
320 : {
321 6 : ADReal a = 58.83;
322 6 : ADReal b = 160.7;
323 6 : ADReal c = -203.5;
324 6 : ADReal n = 1;
325 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
326 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
327 : break;
328 : }
329 6 : else if (Re > 2100)
330 : {
331 6 : ADReal a = 0.1452;
332 6 : ADReal b = 0.02681;
333 6 : ADReal c = -0.03411;
334 6 : ADReal n = 0.18;
335 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
336 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
337 : break;
338 : }
339 : }
340 : break;
341 : }
342 24 : case Bundle_array::HEXAGONAL:
343 : {
344 24 : if (_PoD < 1.1)
345 : {
346 12 : if (Re <= 2100)
347 : {
348 6 : ADReal a = 26.98;
349 6 : ADReal b = 1636;
350 6 : ADReal c = -10050;
351 6 : ADReal n = 1;
352 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
353 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
354 : break;
355 : }
356 6 : else if (Re > 2100)
357 : {
358 6 : ADReal a = 0.1004;
359 6 : ADReal b = 1.625;
360 6 : ADReal c = -11.85;
361 6 : ADReal n = 0.18;
362 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
363 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
364 : break;
365 : }
366 : }
367 : else
368 : {
369 12 : if (Re <= 2100)
370 : {
371 6 : ADReal a = 87.26;
372 6 : ADReal b = 38.59;
373 6 : ADReal c = -55.15;
374 6 : ADReal n = 1;
375 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
376 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
377 : break;
378 : }
379 6 : else if (Re > 2100)
380 : {
381 6 : ADReal a = 0.1499;
382 6 : ADReal b = 0.006706;
383 6 : ADReal c = -0.009567;
384 6 : ADReal n = 0.18;
385 6 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
386 6 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
387 : break;
388 : }
389 : }
390 : break;
391 : }
392 0 : default:
393 0 : mooseError("Invalid 'bundle_array' parameter.");
394 : }
395 : break;
396 : }
397 : default:
398 : {
399 : break;
400 : }
401 : }
402 3230 : }
|