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 2485 : ADWallFrictionChengMaterial::validParams()
20 : {
21 2485 : InputParameters params = Material::validParams();
22 4970 : params.addRequiredParam<MaterialPropertyName>("f_D", "Darcy friction factor material property");
23 4970 : params.addParam<MaterialPropertyName>(
24 : "rho", FlowModelSinglePhase::DENSITY, "Density of the fluid");
25 4970 : params.addParam<MaterialPropertyName>("vel", FlowModelSinglePhase::VELOCITY, "Fluid velocity");
26 4970 : params.addParam<MaterialPropertyName>(
27 : "D_h", FlowModelSinglePhase::HYDRAULIC_DIAMETER, "Hydraulic diameter");
28 4970 : params.addParam<MaterialPropertyName>(
29 : "mu", FlowModelSinglePhase::DYNAMIC_VISCOSITY, "Dynamic viscosity of the fluid");
30 4970 : params.addRequiredRangeCheckedParam<Real>(
31 : "PoD", "PoD>=1.0", "The Pitch-to-diameter ratio value being assigned into the property");
32 4970 : MooseEnum bundle_array("SQUARE HEXAGONAL");
33 4970 : params.addRequiredParam<MooseEnum>(
34 : "bundle_array", bundle_array, "The type of the rod bundle array");
35 4970 : MooseEnum subchannel_type("INTERIOR EDGE CORNER");
36 4970 : params.addRequiredParam<MooseEnum>(
37 : "subchannel_type", subchannel_type, "The type of subchannel to be considered");
38 2485 : params.addClassDescription("Computes wall friction factor using the Cheng-Todreas correlation "
39 : "for interior, edge and corner channels.");
40 2485 : return params;
41 2485 : }
42 :
43 1941 : ADWallFrictionChengMaterial::ADWallFrictionChengMaterial(const InputParameters & parameters)
44 : : Material(parameters),
45 3882 : _f_D_name(getParam<MaterialPropertyName>("f_D")),
46 1941 : _f_D(declareADProperty<Real>(_f_D_name)),
47 3882 : _rho(getADMaterialProperty<Real>("rho")),
48 3882 : _vel(getADMaterialProperty<Real>("vel")),
49 3882 : _D_h(getADMaterialProperty<Real>("D_h")),
50 3882 : _mu(getADMaterialProperty<Real>("mu")),
51 3882 : _PoD(getParam<Real>("PoD")),
52 3882 : _bundle_array(getParam<MooseEnum>("bundle_array").getEnum<Bundle_array>()),
53 5823 : _subchannel_type(getParam<MooseEnum>("subchannel_type").getEnum<Subchannel_type>())
54 :
55 : {
56 1941 : }
57 :
58 : void
59 4507 : ADWallFrictionChengMaterial::computeQpProperties()
60 : {
61 4507 : ADReal Re = THM::Reynolds(1, _rho[_qp], _vel[_qp], _D_h[_qp], _mu[_qp]);
62 4507 : 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 4505 : switch (_subchannel_type)
71 : {
72 4361 : case Subchannel_type::INTERIOR:
73 : {
74 4361 : switch (_bundle_array)
75 : {
76 45 : case Bundle_array::SQUARE:
77 : {
78 45 : if (_PoD < 1.1)
79 : {
80 18 : if (Re <= 2100)
81 : {
82 9 : ADReal a = 26.37;
83 9 : ADReal b = 374.2;
84 9 : ADReal c = -493.9;
85 9 : ADReal n = 1;
86 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
87 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
88 : break;
89 : }
90 9 : else if (Re > 2100)
91 : {
92 9 : ADReal a = 0.09423;
93 9 : ADReal b = 0.5806;
94 9 : ADReal c = -1.239;
95 9 : ADReal n = 0.18;
96 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
97 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
98 : break;
99 : }
100 : }
101 : else
102 : {
103 27 : if (Re <= 2100)
104 : {
105 18 : ADReal a = 35.55;
106 18 : ADReal b = 263.7;
107 18 : ADReal c = -190.2;
108 18 : ADReal n = 1;
109 18 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
110 18 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
111 : break;
112 : }
113 9 : else if (Re > 2100)
114 : {
115 9 : ADReal a = 0.1339;
116 9 : ADReal b = 0.09059;
117 9 : ADReal c = -0.09926;
118 9 : ADReal n = 0.18;
119 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
120 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
121 : break;
122 : }
123 : }
124 : break;
125 : }
126 4316 : case Bundle_array::HEXAGONAL:
127 : {
128 4316 : if (_PoD < 1.1)
129 : {
130 18 : if (Re <= 2100)
131 : {
132 9 : ADReal a = 26;
133 9 : ADReal b = 888.2;
134 9 : ADReal c = -3334;
135 9 : ADReal n = 1;
136 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
137 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
138 : break;
139 : }
140 9 : else if (Re > 2100)
141 : {
142 9 : ADReal a = 0.09378;
143 9 : ADReal b = 1.398;
144 9 : ADReal c = -8.664;
145 9 : ADReal n = 0.18;
146 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
147 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
148 : break;
149 : }
150 : }
151 : else
152 : {
153 4298 : if (Re <= 2100)
154 : {
155 9 : ADReal a = 62.97;
156 9 : ADReal b = 216.9;
157 9 : ADReal c = -190.2;
158 9 : ADReal n = 1;
159 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
160 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
161 : break;
162 : }
163 4289 : else if (Re > 2100)
164 : {
165 4289 : ADReal a = 0.1458;
166 4289 : ADReal b = 0.03632;
167 4289 : ADReal c = -0.03333;
168 4289 : ADReal n = 0.18;
169 4289 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
170 4289 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
171 : break;
172 : }
173 : }
174 : break;
175 : }
176 : }
177 : break;
178 : }
179 :
180 72 : case Subchannel_type::EDGE:
181 : {
182 72 : switch (_bundle_array)
183 : {
184 36 : case Bundle_array::SQUARE:
185 : {
186 36 : if (_PoD < 1.1)
187 : {
188 18 : if (Re <= 2100)
189 : {
190 9 : ADReal a = 26.18;
191 9 : ADReal b = 554.5;
192 9 : ADReal c = -1480;
193 9 : ADReal n = 1;
194 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
195 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
196 : break;
197 : }
198 9 : else if (Re > 2100)
199 : {
200 9 : ADReal a = 0.09377;
201 9 : ADReal b = 0.8732;
202 9 : ADReal c = -3.341;
203 9 : ADReal n = 0.18;
204 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
205 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
206 : break;
207 : }
208 : }
209 : else
210 : {
211 18 : if (Re <= 2100)
212 : {
213 9 : ADReal a = 44.40;
214 9 : ADReal b = 256.7;
215 9 : ADReal c = -267.6;
216 9 : ADReal n = 1;
217 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
218 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
219 : break;
220 : }
221 9 : else if (Re > 2100)
222 : {
223 9 : ADReal a = 0.1430;
224 9 : ADReal b = 0.04199;
225 9 : ADReal c = -0.04428;
226 9 : ADReal n = 0.18;
227 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
228 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
229 : break;
230 : }
231 : }
232 : break;
233 : }
234 36 : case Bundle_array::HEXAGONAL:
235 : {
236 36 : if (_PoD < 1.1)
237 : {
238 18 : if (Re <= 2100)
239 : {
240 9 : ADReal a = 26.18;
241 9 : ADReal b = 554.5;
242 9 : ADReal c = -1480;
243 9 : ADReal n = 1;
244 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
245 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
246 : break;
247 : }
248 9 : else if (Re > 2100)
249 : {
250 9 : ADReal a = 0.09377;
251 9 : ADReal b = 0.8732;
252 9 : ADReal c = -3.341;
253 9 : ADReal n = 0.18;
254 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
255 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
256 : break;
257 : }
258 : }
259 : else
260 : {
261 18 : if (Re <= 2100)
262 : {
263 9 : ADReal a = 44.4;
264 9 : ADReal b = 256.7;
265 9 : ADReal c = -267.6;
266 9 : ADReal n = 1;
267 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
268 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
269 : break;
270 : }
271 9 : else if (Re > 2100)
272 : {
273 9 : ADReal a = 0.1430;
274 9 : ADReal b = 0.04199;
275 9 : ADReal c = -0.04428;
276 9 : ADReal n = 0.18;
277 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
278 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
279 : break;
280 : }
281 : }
282 : break;
283 : }
284 : }
285 : break;
286 : }
287 :
288 72 : case Subchannel_type::CORNER:
289 : {
290 72 : switch (_bundle_array)
291 : {
292 36 : case Bundle_array::SQUARE:
293 : {
294 36 : if (_PoD < 1.1)
295 : {
296 18 : if (Re <= 2100)
297 : {
298 9 : ADReal a = 28.62;
299 9 : ADReal b = 715.9;
300 9 : ADReal c = -2807;
301 9 : ADReal n = 1;
302 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
303 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
304 : break;
305 : }
306 9 : else if (Re > 2100)
307 : {
308 9 : ADReal a = 0.09755;
309 9 : ADReal b = 1.127;
310 9 : ADReal c = -6.304;
311 9 : ADReal n = 0.18;
312 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
313 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
314 : break;
315 : }
316 : }
317 : else
318 : {
319 18 : if (Re <= 2100)
320 : {
321 9 : ADReal a = 58.83;
322 9 : ADReal b = 160.7;
323 9 : ADReal c = -203.5;
324 9 : ADReal n = 1;
325 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
326 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
327 : break;
328 : }
329 9 : else if (Re > 2100)
330 : {
331 9 : ADReal a = 0.1452;
332 9 : ADReal b = 0.02681;
333 9 : ADReal c = -0.03411;
334 9 : ADReal n = 0.18;
335 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
336 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
337 : break;
338 : }
339 : }
340 : break;
341 : }
342 36 : case Bundle_array::HEXAGONAL:
343 : {
344 36 : if (_PoD < 1.1)
345 : {
346 18 : if (Re <= 2100)
347 : {
348 9 : ADReal a = 26.98;
349 9 : ADReal b = 1636;
350 9 : ADReal c = -10050;
351 9 : ADReal n = 1;
352 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
353 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
354 : break;
355 : }
356 9 : else if (Re > 2100)
357 : {
358 9 : ADReal a = 0.1004;
359 9 : ADReal b = 1.625;
360 9 : ADReal c = -11.85;
361 9 : ADReal n = 0.18;
362 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
363 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
364 : break;
365 : }
366 : }
367 : else
368 : {
369 18 : if (Re <= 2100)
370 : {
371 9 : ADReal a = 87.26;
372 9 : ADReal b = 38.59;
373 9 : ADReal c = -55.15;
374 9 : ADReal n = 1;
375 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
376 9 : _f_D[_qp] = WallFriction::DarcyFrictionFactor(f_F);
377 : break;
378 : }
379 9 : else if (Re > 2100)
380 : {
381 9 : ADReal a = 0.1499;
382 9 : ADReal b = 0.006706;
383 9 : ADReal c = -0.009567;
384 9 : ADReal n = 0.18;
385 9 : const ADReal f_F = WallFriction::FanningFrictionFactorCheng(Re, a, b, c, n, _PoD);
386 9 : _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 4505 : }
|