LCOV - code coverage report
Current view: top level - src/materials - ADWallFrictionChengMaterial.C (source / functions) Hit Total Coverage
Test: idaholab/moose thermal_hydraulics: #32971 (54bef8) with base c6cf66 Lines: 218 220 99.1 %
Date: 2026-05-29 20:41:18 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          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 : }

Generated by: LCOV version 1.14