LCOV - code coverage report
Current view: top level - src/physics - PNSFVSolidHeatTransferPhysics.C (source / functions) Hit Total Coverage
Test: idaholab/moose navier_stokes: 9fc4b0 Lines: 209 241 86.7 %
Date: 2025-08-14 10:14:56 Functions: 12 12 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 "PNSFVSolidHeatTransferPhysics.h"
      11             : #include "WCNSFVCoupledAdvectionPhysicsHelper.h"
      12             : #include "WCNSFVFlowPhysics.h"
      13             : #include "WCNSFVFluidHeatTransferPhysics.h"
      14             : #include "NSFVBase.h"
      15             : 
      16             : registerPhysicsBaseTasks("NavierStokesApp", PNSFVSolidHeatTransferPhysics);
      17             : registerMooseAction("NavierStokesApp", PNSFVSolidHeatTransferPhysics, "add_variable");
      18             : registerMooseAction("NavierStokesApp", PNSFVSolidHeatTransferPhysics, "add_ic");
      19             : registerMooseAction("NavierStokesApp", PNSFVSolidHeatTransferPhysics, "add_fv_kernel");
      20             : registerMooseAction("NavierStokesApp", PNSFVSolidHeatTransferPhysics, "add_fv_bc");
      21             : registerMooseAction("NavierStokesApp", PNSFVSolidHeatTransferPhysics, "add_material");
      22             : registerMooseAction("NavierStokesApp", PNSFVSolidHeatTransferPhysics, "add_preconditioning");
      23             : 
      24             : InputParameters
      25          66 : PNSFVSolidHeatTransferPhysics::validParams()
      26             : {
      27          66 :   InputParameters params = HeatConductionFV::validParams();
      28          66 :   params.addClassDescription("Define the Navier Stokes porous media solid energy equation");
      29             : 
      30             :   // These boundary conditions parameters are not implemented yet
      31          66 :   params.suppressParameter<std::vector<BoundaryName>>("fixed_convection_boundaries");
      32          66 :   params.suppressParameter<std::vector<MooseFunctorName>>("fixed_convection_T_fluid");
      33          66 :   params.suppressParameter<std::vector<MooseFunctorName>>("fixed_convection_htc");
      34             : 
      35             :   // Swap out some parameters, base class is not specific to porous media
      36             :   // Variables
      37         132 :   params.renameParam("temperature_name",
      38             :                      "solid_temperature_variable",
      39             :                      "Name of the solid phase temperature variable");
      40         132 :   params.set<VariableName>("solid_temperature_variable") = NS::T_solid;
      41         132 :   params.addParam<NonlinearVariableName>(
      42             :       "fluid_temperature_variable", NS::T_fluid, "Name of the fluid temperature variable");
      43         132 :   MooseEnum face_interpol_types("average skewness-corrected", "average");
      44         132 :   params.addParam<MooseEnum>(
      45             :       "solid_temperature_face_interpolation",
      46             :       face_interpol_types,
      47             :       "The numerical scheme to interpolate the temperature/energy to the "
      48             :       "face for conduction (separate from the advected quantity interpolation).");
      49         132 :   params.addParam<bool>(
      50             :       "solid_temperature_two_term_bc_expansion",
      51         132 :       true,
      52             :       "If a two-term Taylor expansion is needed for the determination of the boundary values"
      53             :       "of the temperature/energy.");
      54             : 
      55             :   // Porous media parameters
      56             :   // TODO: ensure consistency with fluid energy physics
      57          66 :   params.transferParam<MooseFunctorName>(NSFVBase::validParams(), "porosity");
      58             : 
      59             :   // Material properties
      60          66 :   params.suppressParameter<MaterialPropertyName>("specific_heat");
      61         132 :   params.addParam<MooseFunctorName>("cp_solid", NS::cp + "_solid", "Specific heat functor");
      62          66 :   params.suppressParameter<MaterialPropertyName>("density");
      63         132 :   params.addParam<MooseFunctorName>("rho_solid", NS::density + "_solid", "Density functor");
      64         132 :   params.addParam<std::vector<std::vector<SubdomainName>>>(
      65             :       "thermal_conductivity_blocks", "Blocks which each thermal conductivity is defined");
      66          66 :   params.suppressParameter<MooseFunctorName>("thermal_conductivity_functor");
      67         132 :   params.addRequiredParam<std::vector<MooseFunctorName>>(
      68             :       "thermal_conductivity_solid",
      69             :       "Thermal conductivity, which may have different names depending on the subdomain");
      70             : 
      71             :   // Ambient convection with the liquid phase parameters
      72         132 :   params.addParam<std::vector<std::vector<SubdomainName>>>(
      73             :       "ambient_convection_blocks", {}, "The blocks where the ambient convection is present.");
      74         132 :   params.addParam<std::vector<MooseFunctorName>>(
      75             :       "ambient_convection_alpha",
      76             :       {},
      77             :       "The heat exchange coefficients for each block in 'ambient_convection_blocks'.");
      78         264 :   params.addParam<std::vector<MooseFunctorName>>(
      79             :       "ambient_convection_temperature",
      80             :       {NS::T_fluid},
      81             :       "The fluid temperature for each block in 'ambient_convection_blocks'.");
      82             : 
      83             :   // Heat source in solid porous medium parameters
      84          66 :   params.addParam<std::vector<SubdomainName>>("external_heat_source_blocks",
      85          66 :                                               std::vector<SubdomainName>(),
      86             :                                               "The blocks where the heat source is present.");
      87         132 :   params.addParam<MooseFunctorName>(
      88             :       "external_heat_source",
      89             :       "The name of a functor which contains the external heat source for the energy equation.");
      90         132 :   params.addParam<Real>(
      91         132 :       "external_heat_source_coeff", 1.0, "Multiplier for the coupled heat source term.");
      92         132 :   params.addParam<bool>("use_external_enthalpy_material",
      93         132 :                         false,
      94             :                         "To indicate if the enthalpy material is set up outside of the action.");
      95             : 
      96          66 :   params.suppressParameter<VariableName>("heat_source_var");
      97          66 :   params.suppressParameter<std::vector<SubdomainName>>("heat_source_blocks");
      98             : 
      99             :   // Numerical scheme
     100         132 :   params.addParam<unsigned short>(
     101         132 :       "ghost_layers", 2, "Number of layers of elements to ghost near process domain boundaries");
     102             :   // Preconditioning has not been derived for NSFV + porous heat transfer at this point
     103         132 :   MooseEnum pc_options("default none", "none");
     104          66 :   params.set<MooseEnum>("preconditioning") = pc_options;
     105          66 :   params.suppressParameter<MooseEnum>("preconditioning");
     106             : 
     107             :   // Parameter groups
     108         132 :   params.addParamNamesToGroup("rho_solid cp_solid thermal_conductivity_solid "
     109             :                               "thermal_conductivity_blocks use_external_enthalpy_material",
     110             :                               "Material properties");
     111         132 :   params.addParamNamesToGroup("ambient_convection_alpha ambient_convection_blocks "
     112             :                               "ambient_convection_temperature",
     113             :                               "Ambient convection");
     114         132 :   params.addParamNamesToGroup(
     115             :       "external_heat_source_blocks external_heat_source external_heat_source_coeff",
     116             :       "Solid porous medium heat source");
     117         132 :   params.addParamNamesToGroup(
     118             :       "solid_temperature_face_interpolation solid_temperature_two_term_bc_expansion",
     119             :       "Numerical scheme");
     120         132 :   params.addParamNamesToGroup("ghost_layers", "Advanced");
     121             : 
     122          66 :   return params;
     123          66 : }
     124             : 
     125          66 : PNSFVSolidHeatTransferPhysics::PNSFVSolidHeatTransferPhysics(const InputParameters & parameters)
     126             :   : HeatConductionFV(parameters),
     127          66 :     _solid_temperature_name(getParam<VariableName>("solid_temperature_variable")),
     128         132 :     _fluid_temperature_name(getParam<NonlinearVariableName>("fluid_temperature_variable")),
     129             :     _porosity_name(getParam<MooseFunctorName>(NS::porosity)),
     130          66 :     _density_name(getParam<MooseFunctorName>("rho_solid")),
     131          66 :     _specific_heat_name(getParam<MooseFunctorName>("cp_solid")),
     132         104 :     _thermal_conductivity_blocks(
     133          66 :         parameters.isParamValid("thermal_conductivity_blocks")
     134          66 :             ? getParam<std::vector<std::vector<SubdomainName>>>("thermal_conductivity_blocks")
     135             :             : std::vector<std::vector<SubdomainName>>()),
     136         132 :     _thermal_conductivity_name(
     137             :         getParam<std::vector<MooseFunctorName>>("thermal_conductivity_solid")),
     138         132 :     _ambient_convection_blocks(
     139             :         getParam<std::vector<std::vector<SubdomainName>>>("ambient_convection_blocks")),
     140         132 :     _ambient_convection_alpha(getParam<std::vector<MooseFunctorName>>("ambient_convection_alpha")),
     141         264 :     _ambient_temperature(getParam<std::vector<MooseFunctorName>>("ambient_convection_temperature"))
     142             : {
     143          66 :   saveSolverVariableName(_solid_temperature_name);
     144             : 
     145             :   // Parameter checks
     146         132 :   if (getParam<std::vector<MooseFunctorName>>("ambient_convection_temperature").size() != 1)
     147           0 :     checkVectorParamsSameLengthIfSet<MooseFunctorName, MooseFunctorName>(
     148             :         "ambient_convection_alpha", "ambient_convection_temperature");
     149         132 :   checkSecondParamSetOnlyIfFirstOneSet("external_heat_source", "external_heat_source_coeff");
     150          66 :   if (_solid_temperature_name == _fluid_temperature_name)
     151           0 :     paramError("solid_temperature_variable",
     152             :                "Solid and fluid cannot share the same temperature variable");
     153             :   // More parameter checks in ambient convection creation
     154          66 : }
     155             : 
     156             : void
     157          66 : PNSFVSolidHeatTransferPhysics::addSolverVariables()
     158             : {
     159             :   // Dont add if the user already defined the variable
     160         132 :   if (variableExists(_solid_temperature_name,
     161             :                      /*error_if_aux=*/true))
     162           0 :     checkBlockRestrictionIdentical(_solid_temperature_name,
     163           0 :                                    getProblem().getVariable(0, _solid_temperature_name).blocks());
     164             :   else
     165             :   {
     166          66 :     auto params = getFactory().getValidParams("INSFVEnergyVariable");
     167          66 :     assignBlocks(params, _blocks);
     168         132 :     params.set<SolverSystemName>("solver_sys") = getSolverSystem(_solid_temperature_name);
     169         198 :     params.set<std::vector<Real>>("scaling") = {getParam<Real>("temperature_scaling")};
     170         132 :     params.set<MooseEnum>("face_interp_method") =
     171         132 :         getParam<MooseEnum>("solid_temperature_face_interpolation");
     172          66 :     params.set<bool>("two_term_boundary_expansion") =
     173         198 :         getParam<bool>("solid_temperature_two_term_bc_expansion");
     174          66 :     getProblem().addVariable("INSFVEnergyVariable", _solid_temperature_name, params);
     175          66 :   }
     176          66 : }
     177             : 
     178             : void
     179          66 : PNSFVSolidHeatTransferPhysics::addFVKernels()
     180             : {
     181             :   // Check this physics against others
     182          66 :   checkFluidAndSolidHeatTransferPhysicsParameters();
     183             : 
     184          66 :   if (isTransient())
     185           9 :     addPINSSolidEnergyTimeKernels();
     186             : 
     187          66 :   addPINSSolidEnergyHeatConductionKernels();
     188         132 :   if (getParam<std::vector<MooseFunctorName>>("ambient_convection_alpha").size())
     189          47 :     addPINSSolidEnergyAmbientConvection();
     190         132 :   if (isParamValid("external_heat_source"))
     191          57 :     addPINSSolidEnergyExternalHeatSource();
     192          66 : }
     193             : 
     194             : void
     195           9 : PNSFVSolidHeatTransferPhysics::addPINSSolidEnergyTimeKernels()
     196             : {
     197             :   const auto kernel_type = "PINSFVEnergyTimeDerivative";
     198          18 :   const auto kernel_name = prefix() + "pins_solid_energy_time";
     199             : 
     200           9 :   InputParameters params = getFactory().getValidParams(kernel_type);
     201           9 :   assignBlocks(params, _blocks);
     202           9 :   params.set<NonlinearVariableName>("variable") = _solid_temperature_name;
     203           9 :   params.set<MooseFunctorName>(NS::density) = _density_name;
     204             : 
     205             :   // The '_solid' suffix has been declared when creating the INSFVEnthalpyMaterial
     206             :   // only for thermal functor material properties
     207             :   // Using this derivative we can model non-constant specific heat
     208          27 :   if (getProblem().hasFunctor(NS::time_deriv(NS::specific_enthalpy) + "_solid",
     209             :                               /*thread_id=*/0))
     210          18 :     params.set<MooseFunctorName>(NS::time_deriv(NS::specific_enthalpy)) =
     211           9 :         NS::time_deriv(NS::specific_enthalpy) + "_solid";
     212             :   else
     213           0 :     params.set<MooseFunctorName>(NS::cp) = _specific_heat_name;
     214             : 
     215           9 :   params.set<MooseFunctorName>(NS::porosity) = _porosity_name;
     216             :   // If modeling a variable density
     217          18 :   if (getProblem().hasFunctor(NS::time_deriv(_density_name),
     218             :                               /*thread_id=*/0))
     219             :   {
     220           0 :     params.set<MooseFunctorName>(NS::time_deriv(NS::density)) = NS::time_deriv(_density_name);
     221           0 :     params.set<MooseFunctorName>(NS::specific_enthalpy) = NS::specific_enthalpy + "_solid";
     222             :   }
     223           9 :   params.set<bool>("is_solid") = true;
     224             : 
     225           9 :   getProblem().addFVKernel(kernel_type, kernel_name, params);
     226          18 : }
     227             : 
     228             : void
     229          66 : PNSFVSolidHeatTransferPhysics::addPINSSolidEnergyHeatConductionKernels()
     230             : {
     231          66 :   const auto vector_conductivity = processThermalConductivity();
     232             : 
     233             :   const auto kernel_type =
     234          66 :       vector_conductivity ? "PINSFVEnergyAnisotropicDiffusion" : "PINSFVEnergyDiffusion";
     235             : 
     236          66 :   InputParameters params = getFactory().getValidParams(kernel_type);
     237          66 :   params.set<NonlinearVariableName>("variable") = _solid_temperature_name;
     238          66 :   params.set<MooseFunctorName>(NS::porosity) = _porosity_name;
     239             : 
     240             :   // Set block restrictions
     241             :   const bool combined = _thermal_conductivity_blocks.size() > 1;
     242             :   std::vector<SubdomainName> thermal_conductivity_blocks;
     243         123 :   for (const auto & block_group : _thermal_conductivity_blocks)
     244          57 :     thermal_conductivity_blocks.insert(thermal_conductivity_blocks.end(),
     245             :                                        std::make_move_iterator(block_group.begin()),
     246             :                                        std::make_move_iterator(block_group.end()));
     247             :   const auto block_names =
     248          66 :       _thermal_conductivity_blocks.size() ? thermal_conductivity_blocks : _blocks;
     249          66 :   assignBlocks(params, block_names);
     250             : 
     251             :   // Set thermal conductivity
     252         132 :   const auto conductivity_name = vector_conductivity ? NS::kappa : NS::k;
     253          66 :   if (combined)
     254          57 :     params.set<MooseFunctorName>(conductivity_name) = prefix() + "combined_thermal_conductivity";
     255             :   else
     256          47 :     params.set<MooseFunctorName>(conductivity_name) = _thermal_conductivity_name[0];
     257             : 
     258         264 :   getProblem().addFVKernel(kernel_type, prefix() + "pins_energy_diffusion", params);
     259          66 : }
     260             : 
     261             : void
     262          47 : PNSFVSolidHeatTransferPhysics::addPINSSolidEnergyAmbientConvection()
     263             : {
     264             :   const auto num_convection_blocks = _ambient_convection_blocks.size();
     265             :   const auto num_used_blocks = num_convection_blocks ? num_convection_blocks : 1;
     266             : 
     267             :   // Check parameter. Late check in case the block was added by a Component
     268          47 :   if (num_used_blocks != _ambient_convection_alpha.size())
     269           0 :     paramError("ambient_convection_alpha",
     270           0 :                "Number of ambient convection heat transfer coefficients (" +
     271           0 :                    std::to_string(_ambient_convection_alpha.size()) +
     272             :                    ") should match the number of "
     273           0 :                    "blocks (" +
     274           0 :                    std::to_string(num_convection_blocks) + ") each HTC is defined on.");
     275             : 
     276             :   const auto kernel_type = "PINSFVEnergyAmbientConvection";
     277          47 :   InputParameters params = getFactory().getValidParams(kernel_type);
     278          94 :   params.set<NonlinearVariableName>("variable") = _solid_temperature_name;
     279          47 :   params.set<MooseFunctorName>(NS::T_solid) = _solid_temperature_name;
     280          47 :   params.set<bool>("is_solid") = true;
     281             : 
     282          94 :   for (const auto block_i : make_range(num_used_blocks))
     283             :   {
     284          47 :     std::string block_name = "";
     285          47 :     if (num_convection_blocks)
     286             :     {
     287          19 :       params.set<std::vector<SubdomainName>>("block") = _ambient_convection_blocks[block_i];
     288          38 :       block_name = Moose::stringify(_ambient_convection_blocks[block_i]);
     289             :     }
     290             :     else
     291             :     {
     292          28 :       assignBlocks(params, _blocks);
     293          56 :       block_name = std::to_string(block_i);
     294             :     }
     295             : 
     296          94 :     params.set<MooseFunctorName>("h_solid_fluid") = _ambient_convection_alpha[block_i];
     297          47 :     if (_ambient_temperature.size() > 1)
     298           0 :       params.set<MooseFunctorName>(NS::T_fluid) = _ambient_temperature[block_i];
     299             :     else
     300          47 :       params.set<MooseFunctorName>(NS::T_fluid) = _ambient_temperature[0];
     301             : 
     302         188 :     getProblem().addFVKernel(kernel_type, prefix() + "ambient_convection_" + block_name, params);
     303             :   }
     304          47 : }
     305             : 
     306             : void
     307          57 : PNSFVSolidHeatTransferPhysics::addPINSSolidEnergyExternalHeatSource()
     308             : {
     309          57 :   const std::string kernel_type = "FVCoupledForce";
     310          57 :   InputParameters params = getFactory().getValidParams(kernel_type);
     311          57 :   params.set<NonlinearVariableName>("variable") = _solid_temperature_name;
     312         114 :   const auto & source_blocks = getParam<std::vector<SubdomainName>>("external_heat_source_blocks");
     313          57 :   if (source_blocks.size())
     314          19 :     assignBlocks(params, source_blocks);
     315             :   else
     316          38 :     assignBlocks(params, _blocks);
     317         171 :   params.set<MooseFunctorName>("v") = getParam<MooseFunctorName>("external_heat_source");
     318         114 :   params.set<Real>("coef") = getParam<Real>("external_heat_source_coeff");
     319             : 
     320         114 :   getProblem().addFVKernel(kernel_type, prefix() + "external_heat_source", params);
     321         114 : }
     322             : 
     323             : bool
     324          85 : PNSFVSolidHeatTransferPhysics::processThermalConductivity()
     325             : {
     326         170 :   if (isParamValid("thermal_conductivity_blocks"))
     327          76 :     checkBlockwiseConsistency<MooseFunctorName>("thermal_conductivity_blocks",
     328             :                                                 {"thermal_conductivity_solid"});
     329             :   bool have_scalar = false;
     330             :   bool have_vector = false;
     331             : 
     332         246 :   for (const auto i : index_range(_thermal_conductivity_name))
     333             :   {
     334             :     // First, check if the name is just a number (only in case of isotropic conduction)
     335         161 :     if (MooseUtils::parsesToReal(_thermal_conductivity_name[i]))
     336             :       have_scalar = true;
     337             :     // Now we determine what kind of functor we are dealing with
     338             :     else
     339             :     {
     340          38 :       if (getProblem().hasFunctorWithType<ADReal>(_thermal_conductivity_name[i],
     341             :                                                   /*thread_id=*/0))
     342             :         have_scalar = true;
     343             :       else
     344             :       {
     345           0 :         if (getProblem().hasFunctorWithType<ADRealVectorValue>(_thermal_conductivity_name[i],
     346             :                                                                /*thread_id=*/0))
     347             :           have_vector = true;
     348             :         else
     349           0 :           paramError("thermal_conductivity_solid",
     350             :                      "We only allow functor of type (AD)Real or (AD)RealVectorValue for thermal "
     351           0 :                      "conductivity! Functor '" +
     352             :                          _thermal_conductivity_name[i] + "' is not of the requested type.");
     353             :       }
     354             :     }
     355             :   }
     356             : 
     357          85 :   if (have_vector == have_scalar)
     358           0 :     paramError("thermal_conductivity_solid",
     359             :                "The entries on thermal conductivity shall either be scalars or vectors, mixing "
     360             :                "them is not supported!");
     361          85 :   return have_vector;
     362             : }
     363             : 
     364             : void
     365          66 : PNSFVSolidHeatTransferPhysics::addMaterials()
     366             : {
     367         132 :   if (!getParam<bool>("use_external_enthalpy_material"))
     368             :   {
     369          47 :     InputParameters params = getFactory().getValidParams("INSFVEnthalpyFunctorMaterial");
     370          47 :     assignBlocks(params, _blocks);
     371             : 
     372          47 :     params.set<MooseFunctorName>(NS::density) = _density_name;
     373          47 :     params.set<MooseFunctorName>(NS::cp) = _specific_heat_name;
     374          94 :     params.set<MooseFunctorName>("temperature") = _solid_temperature_name;
     375          94 :     params.set<MaterialPropertyName>("declare_suffix") = "solid";
     376             : 
     377          94 :     getProblem().addMaterial(
     378          47 :         "INSFVEnthalpyFunctorMaterial", prefix() + "ins_enthalpy_material", params);
     379          47 :   }
     380             : 
     381             :   // Combine the functors (combining scalars and vectors is not currently supported)
     382          66 :   if (_thermal_conductivity_name.size() > 1)
     383             :   {
     384          19 :     const auto vector_conductivity = processThermalConductivity();
     385          19 :     const auto combiner_functor = vector_conductivity ? "PiecewiseByBlockVectorFunctorMaterial"
     386             :                                                       : "PiecewiseByBlockFunctorMaterial";
     387          19 :     InputParameters params = getFactory().getValidParams(combiner_functor);
     388          76 :     params.set<MooseFunctorName>("prop_name") = prefix() + "combined_thermal_conductivity";
     389             :     std::vector<SubdomainName> blocks_list;
     390             :     std::map<std::string, std::string> blocks_to_functors;
     391          76 :     for (const auto i : index_range(_thermal_conductivity_name))
     392             :     {
     393         114 :       for (const auto & block : _thermal_conductivity_blocks[i])
     394             :       {
     395          57 :         blocks_list.push_back(block);
     396          57 :         blocks_to_functors.insert(
     397         114 :             std::pair<std::string, std::string>(block, _thermal_conductivity_name[i]));
     398             :       }
     399             :     }
     400          19 :     params.set<std::vector<SubdomainName>>("block") = blocks_list;
     401          38 :     params.set<std::map<std::string, std::string>>("subdomain_to_prop_value") = blocks_to_functors;
     402          76 :     getProblem().addMaterial(combiner_functor, prefix() + "thermal_conductivity_combiner", params);
     403          19 :   }
     404          66 : }
     405             : 
     406             : InputParameters
     407         198 : PNSFVSolidHeatTransferPhysics::getAdditionalRMParams() const
     408             : {
     409         396 :   unsigned short necessary_layers = getParam<unsigned short>("ghost_layers");
     410         594 :   if (getParam<MooseEnum>("solid_temperature_face_interpolation") == "skewness-corrected")
     411           0 :     necessary_layers = std::max(necessary_layers, (unsigned short)3);
     412             : 
     413             :   // Just an object that has a ghost_layers parameter and performs geometric, algebraic, and
     414             :   // coupling ghosting
     415         198 :   const std::string kernel_type = "INSFVMixingLengthReynoldsStress";
     416         198 :   InputParameters params = getFactory().getValidParams(kernel_type);
     417         198 :   params.template set<unsigned short>("ghost_layers") = necessary_layers;
     418             : 
     419         198 :   return params;
     420           0 : }
     421             : 
     422             : void
     423          66 : PNSFVSolidHeatTransferPhysics::checkFluidAndSolidHeatTransferPhysicsParameters() const
     424             : {
     425             :   // Get a pointer to a flow physics and a heat transfer physics on the same blocks, if it exists
     426             :   const WCNSFVFlowPhysics * flow_physics = nullptr;
     427             :   const WCNSFVFluidHeatTransferPhysics * fluid_energy_physics = nullptr;
     428          66 :   const auto all_flow_physics = getCoupledPhysics<const WCNSFVFlowPhysics>(/*allow_fail=*/true);
     429          94 :   for (const auto physics : all_flow_physics)
     430          28 :     if (checkBlockRestrictionIdentical(
     431             :             physics->name(), physics->blocks(), /*error_if_not_identical=*/false))
     432             :     {
     433          28 :       if (flow_physics)
     434           0 :         mooseError("Two Fluid flow physics detected on the same blocks as the solid heat transfer "
     435             :                    "physics");
     436             :       flow_physics = physics;
     437             :     }
     438             :   const auto all_fluid_energy_physics =
     439          66 :       getCoupledPhysics<const WCNSFVFluidHeatTransferPhysics>(/*allow_fail=*/true);
     440          94 :   for (const auto physics : all_fluid_energy_physics)
     441          28 :     if (checkBlockRestrictionIdentical(
     442             :             physics->name(), physics->blocks(), /*error_if_not_identical=*/false))
     443             :     {
     444          28 :       if (fluid_energy_physics)
     445           0 :         mooseError("Two fluid heat transfer physics detected on the same blocks as the solid heat "
     446             :                    "transfer physics");
     447             :       fluid_energy_physics = physics;
     448             :     }
     449             : 
     450          66 :   if (!fluid_energy_physics && !flow_physics)
     451             :     return;
     452             : 
     453             :   // Check that the parameters seem reasonable
     454             :   // Different material properties
     455             :   // TODO: Does this error on numbers?
     456          28 :   if (flow_physics && flow_physics->densityName() == _density_name)
     457           0 :     paramError("rho_solid", "Fluid and solid density should be different");
     458          28 :   if (fluid_energy_physics && fluid_energy_physics->getSpecificHeatName() == _specific_heat_name)
     459           0 :     paramError("cp_solid", "Fluid and solid specific heat should be different");
     460             : 
     461             :   // Check ambient convection parameters
     462          28 :   if (fluid_energy_physics)
     463             :   {
     464             :     // The blocks should match
     465             :     // We only use a warning in case the blocks are matching, just specified differently
     466             :     // in the vector of vectors
     467          28 :     auto fluid_convection_blocks = fluid_energy_physics->getAmbientConvectionBlocks();
     468          28 :     std::sort(fluid_convection_blocks.begin(), fluid_convection_blocks.end());
     469          28 :     std::vector<std::vector<SubdomainName>> copy_solid_blocks = _ambient_convection_blocks;
     470          28 :     std::sort(copy_solid_blocks.begin(), copy_solid_blocks.end());
     471          28 :     if (fluid_convection_blocks != _ambient_convection_blocks)
     472           0 :       paramWarning("Ambient convection blocks in the solid phase :" +
     473           0 :                    Moose::stringify(_ambient_convection_blocks) + " and in the fluid phase " +
     474           0 :                    Moose::stringify(fluid_convection_blocks) + " do not seem to match.");
     475             : 
     476             :     // The coefficients should also match
     477          28 :     auto fluid_convection_coeffs = fluid_energy_physics->getAmbientConvectionHTCs();
     478          28 :     fluid_convection_blocks = fluid_energy_physics->getAmbientConvectionBlocks();
     479          28 :     for (const auto i : index_range(fluid_energy_physics->getAmbientConvectionBlocks()))
     480           0 :       for (const auto j : index_range(_ambient_convection_blocks))
     481           0 :         if (fluid_convection_blocks[i] == _ambient_convection_blocks[j] &&
     482           0 :             fluid_convection_coeffs[i] != _ambient_convection_alpha[j])
     483           0 :           paramWarning("Ambient convection HTCs in the solid phase :" +
     484           0 :                        Moose::stringify(_ambient_convection_alpha) + " and in the fluid phase " +
     485           0 :                        Moose::stringify(fluid_convection_coeffs) + " do not seem to match.");
     486          28 :   }
     487          66 : }

Generated by: LCOV version 1.14