LCOV - code coverage report
Current view: top level - src/materials - ADWallFrictionChengMaterial.C (source / functions) Hit Total Coverage
Test: idaholab/moose thermal_hydraulics: #30301 (3b550b) with base 2ad78d Lines: 218 220 99.1 %
Date: 2025-07-30 13:02:48 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        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 : }

Generated by: LCOV version 1.14