LCOV - code coverage report
Current view: top level - src/base - FlowModelGasMix.C (source / functions) Hit Total Coverage
Test: idaholab/moose thermal_hydraulics: #30301 (3b550b) with base 2ad78d Lines: 203 205 99.0 %
Date: 2025-07-30 13:02:48 Functions: 23 23 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 "FlowModelGasMix.h"
      11             : #include "FlowChannelBase.h"
      12             : #include "THMNames.h"
      13             : 
      14             : registerMooseObject("ThermalHydraulicsApp", FlowModelGasMix);
      15             : 
      16             : InputParameters
      17          38 : FlowModelGasMix::validParams()
      18             : {
      19          38 :   InputParameters params = FlowModel1PhaseBase::validParams();
      20             : 
      21          76 :   params.addRequiredParam<Real>("scaling_factor_xirhoA",
      22             :                                 "Scaling factor for the secondary component mass equation");
      23          76 :   params.addRequiredParam<Real>("scaling_factor_rhoA",
      24             :                                 "Scaling factor for the mixture mass equation");
      25          76 :   params.addRequiredParam<Real>("scaling_factor_rhouA", "Scaling factor for the momentum equation");
      26          76 :   params.addRequiredParam<Real>("scaling_factor_rhoEA", "Scaling factor for the energy equation");
      27             : 
      28          38 :   return params;
      29           0 : }
      30             : 
      31          19 : FlowModelGasMix::FlowModelGasMix(const InputParameters & params) : FlowModel1PhaseBase(params) {}
      32             : 
      33             : void
      34          19 : FlowModelGasMix::addVariables()
      35             : {
      36          19 :   FlowModel1PhaseBase::addVariables();
      37             : 
      38          19 :   const std::vector<SubdomainName> & subdomains = _flow_channel.getSubdomainNames();
      39             : 
      40          38 :   _sim.addSimVariable(
      41          38 :       true, THM::XIRHOA, _fe_type, subdomains, getParam<Real>("scaling_factor_xirhoA"));
      42          19 :   _sim.addSimVariable(false, THM::MASS_FRACTION, _fe_type, subdomains);
      43          19 : }
      44             : 
      45             : Real
      46          19 : FlowModelGasMix::getScalingFactorRhoA() const
      47             : {
      48          38 :   return getParam<Real>("scaling_factor_rhoA");
      49             : }
      50             : 
      51             : Real
      52          19 : FlowModelGasMix::getScalingFactorRhoUA() const
      53             : {
      54          38 :   return getParam<Real>("scaling_factor_rhouA");
      55             : }
      56             : 
      57             : Real
      58          19 : FlowModelGasMix::getScalingFactorRhoEA() const
      59             : {
      60          38 :   return getParam<Real>("scaling_factor_rhoEA");
      61             : }
      62             : 
      63             : std::vector<VariableName>
      64          38 : FlowModelGasMix::solutionVariableNames() const
      65             : {
      66         190 :   return {THM::XIRHOA, THM::RHOA, THM::RHOUA, THM::RHOEA};
      67           0 : }
      68             : 
      69             : void
      70          19 : FlowModelGasMix::addInitialConditions()
      71             : {
      72          19 :   FlowModel1PhaseBase::addInitialConditions();
      73             : 
      74          19 :   if (ICParametersAreValid())
      75             :   {
      76          19 :     addXiRhoAIC();
      77          38 :     addFunctionIC(THM::MASS_FRACTION,
      78          19 :                   _flow_channel.getParam<FunctionName>("initial_mass_fraction"));
      79             :   }
      80          19 : }
      81             : 
      82             : void
      83          19 : FlowModelGasMix::addXiRhoAIC()
      84             : {
      85          19 :   const std::string class_name = "VariableProductIC";
      86          19 :   InputParameters params = _factory.getValidParams(class_name);
      87          38 :   params.set<VariableName>("variable") = THM::XIRHOA;
      88          38 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
      89          76 :   params.set<std::vector<VariableName>>("values") = {THM::MASS_FRACTION, THM::RHOA};
      90          38 :   _sim.addSimInitialCondition(class_name, genName(_comp_name, "xirhoA_ic"), params);
      91          38 : }
      92             : 
      93             : void
      94          19 : FlowModelGasMix::addRhoEAIC()
      95             : {
      96          19 :   const std::string class_name = "FlowModelGasMixIC";
      97          19 :   InputParameters params = _factory.getValidParams(class_name);
      98          38 :   params.set<VariableName>("variable") = THM::RHOEA;
      99          19 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     100          38 :   params.set<MooseEnum>("quantity") = "rhoEA";
     101          38 :   params.set<FunctionName>("mass_fraction") =
     102          19 :       _flow_channel.getParam<FunctionName>("initial_mass_fraction");
     103          57 :   params.set<FunctionName>("pressure") = _flow_channel.getParam<FunctionName>("initial_p");
     104          57 :   params.set<FunctionName>("temperature") = _flow_channel.getParam<FunctionName>("initial_T");
     105          57 :   params.set<FunctionName>("velocity") = _flow_channel.getParam<FunctionName>("initial_vel");
     106          57 :   params.set<std::vector<VariableName>>("area") = {THM::AREA};
     107          19 :   params.set<UserObjectName>("fluid_properties") = _fp_name;
     108          38 :   _sim.addSimInitialCondition(class_name, genName(_comp_name, "rhoEA_ic"), params);
     109          38 : }
     110             : 
     111             : void
     112          19 : FlowModelGasMix::addDensityIC()
     113             : {
     114          19 :   const std::string class_name = "FlowModelGasMixIC";
     115          19 :   InputParameters params = _factory.getValidParams(class_name);
     116          38 :   params.set<VariableName>("variable") = THM::DENSITY;
     117          19 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     118          38 :   params.set<MooseEnum>("quantity") = "rho";
     119          38 :   params.set<FunctionName>("mass_fraction") =
     120          19 :       _flow_channel.getParam<FunctionName>("initial_mass_fraction");
     121          57 :   params.set<FunctionName>("pressure") = _flow_channel.getParam<FunctionName>("initial_p");
     122          57 :   params.set<FunctionName>("temperature") = _flow_channel.getParam<FunctionName>("initial_T");
     123          57 :   params.set<FunctionName>("velocity") = _flow_channel.getParam<FunctionName>("initial_vel");
     124          57 :   params.set<std::vector<VariableName>>("area") = {THM::AREA};
     125          19 :   params.set<UserObjectName>("fluid_properties") = _fp_name;
     126          38 :   _sim.addSimInitialCondition(class_name, genName(_comp_name, "rho_ic"), params);
     127          38 : }
     128             : 
     129             : void
     130          19 : FlowModelGasMix::addKernels()
     131             : {
     132          19 :   FlowModel1PhaseBase::addKernels();
     133             : 
     134          19 :   addTimeDerivativeKernelIfTransient(THM::XIRHOA);
     135          19 : }
     136             : 
     137             : void
     138          19 : FlowModelGasMix::addDGKernels()
     139             : {
     140          19 :   FlowModel1PhaseBase::addDGKernels();
     141             : 
     142          19 :   addMassDiffusionSpeciesDGKernel();
     143          19 :   addMassDiffusionEnergyDGKernel();
     144          19 : }
     145             : 
     146             : void
     147          19 : FlowModelGasMix::addMassDiffusionSpeciesDGKernel()
     148             : {
     149          19 :   const std::string class_name = "MassDiffusionSpeciesGasMixDGKernel";
     150          19 :   InputParameters params = _factory.getValidParams(class_name);
     151          38 :   params.set<NonlinearVariableName>("variable") = THM::XIRHOA;
     152          38 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     153          57 :   params.set<std::vector<VariableName>>("A_linear") = {THM::AREA_LINEAR};
     154          38 :   params.set<MaterialPropertyName>("density") = THM::DENSITY;
     155          38 :   params.set<MaterialPropertyName>("diffusion_coefficient") = THM::MASS_DIFFUSION_COEFFICIENT;
     156          38 :   params.set<MaterialPropertyName>("mass_fraction") = THM::MASS_FRACTION;
     157          38 :   params.set<MaterialPropertyName>("direction") = THM::DIRECTION;
     158          19 :   params.set<bool>("implicit") = _sim.getImplicitTimeIntegrationFlag();
     159          38 :   _sim.addDGKernel(class_name, genName(_comp_name, "mass_diffusion_species"), params);
     160          38 : }
     161             : 
     162             : void
     163          19 : FlowModelGasMix::addMassDiffusionEnergyDGKernel()
     164             : {
     165          19 :   const std::string class_name = "MassDiffusionEnergyGasMixDGKernel";
     166          19 :   InputParameters params = _factory.getValidParams(class_name);
     167          38 :   params.set<NonlinearVariableName>("variable") = THM::RHOEA;
     168          38 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     169          57 :   params.set<std::vector<VariableName>>("A_linear") = {THM::AREA_LINEAR};
     170          38 :   params.set<MaterialPropertyName>("density") = THM::DENSITY;
     171          38 :   params.set<MaterialPropertyName>("pressure") = THM::PRESSURE;
     172          38 :   params.set<MaterialPropertyName>("temperature") = THM::TEMPERATURE;
     173          38 :   params.set<MaterialPropertyName>("velocity") = THM::VELOCITY;
     174          38 :   params.set<MaterialPropertyName>("diffusion_coefficient") = THM::MASS_DIFFUSION_COEFFICIENT;
     175          38 :   params.set<MaterialPropertyName>("mass_fraction") = THM::MASS_FRACTION;
     176          38 :   params.set<MaterialPropertyName>("direction") = THM::DIRECTION;
     177          19 :   params.set<UserObjectName>("fluid_properties") = _fp_name;
     178          19 :   params.set<bool>("implicit") = _sim.getImplicitTimeIntegrationFlag();
     179          38 :   _sim.addDGKernel(class_name, genName(_comp_name, "mass_diffusion_energy"), params);
     180          38 : }
     181             : 
     182             : void
     183          19 : FlowModelGasMix::addAuxKernels()
     184             : {
     185          19 :   FlowModel1PhaseBase::addAuxKernels();
     186          19 :   addMassFractionAux();
     187          19 : }
     188             : 
     189             : void
     190          19 : FlowModelGasMix::addPressureAux()
     191             : {
     192          19 :   const std::string class_name = "FlowModelGasMixAux";
     193          19 :   InputParameters params = _factory.getValidParams(class_name);
     194          38 :   params.set<AuxVariableName>("variable") = THM::PRESSURE;
     195          19 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     196          38 :   params.set<MooseEnum>("quantity") = "p";
     197          57 :   params.set<std::vector<VariableName>>("xirhoA") = {THM::XIRHOA};
     198          57 :   params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
     199          57 :   params.set<std::vector<VariableName>>("rhouA") = {THM::RHOUA};
     200          57 :   params.set<std::vector<VariableName>>("rhoEA") = {THM::RHOEA};
     201          57 :   params.set<std::vector<VariableName>>("area") = {THM::AREA};
     202          19 :   params.set<UserObjectName>("fluid_properties") = _fp_name;
     203          76 :   params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
     204          38 :   _sim.addAuxKernel(class_name, genName(_comp_name, "p_aux"), params);
     205          57 : }
     206             : 
     207             : void
     208          19 : FlowModelGasMix::addTemperatureAux()
     209             : {
     210          19 :   const std::string class_name = "FlowModelGasMixAux";
     211          19 :   InputParameters params = _factory.getValidParams(class_name);
     212          38 :   params.set<AuxVariableName>("variable") = THM::TEMPERATURE;
     213          19 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     214          38 :   params.set<MooseEnum>("quantity") = "T";
     215          57 :   params.set<std::vector<VariableName>>("xirhoA") = {THM::XIRHOA};
     216          57 :   params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
     217          57 :   params.set<std::vector<VariableName>>("rhouA") = {THM::RHOUA};
     218          57 :   params.set<std::vector<VariableName>>("rhoEA") = {THM::RHOEA};
     219          57 :   params.set<std::vector<VariableName>>("area") = {THM::AREA};
     220          19 :   params.set<UserObjectName>("fluid_properties") = _fp_name;
     221          76 :   params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
     222          38 :   _sim.addAuxKernel(class_name, genName(_comp_name, "T_aux"), params);
     223          57 : }
     224             : 
     225             : void
     226          19 : FlowModelGasMix::addMassFractionAux()
     227             : {
     228          19 :   const std::string class_name = "QuotientAux";
     229          19 :   InputParameters params = _factory.getValidParams(class_name);
     230          38 :   params.set<AuxVariableName>("variable") = THM::MASS_FRACTION;
     231          38 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     232          57 :   params.set<std::vector<VariableName>>("numerator") = {THM::XIRHOA};
     233          57 :   params.set<std::vector<VariableName>>("denominator") = {THM::RHOA};
     234          76 :   params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
     235          38 :   _sim.addAuxKernel(class_name, genName(_comp_name, "xi_aux"), params);
     236          57 : }
     237             : 
     238             : void
     239          19 : FlowModelGasMix::addFluidPropertiesMaterials()
     240             : {
     241          19 :   const std::string class_name = "FluidPropertiesGasMixMaterial";
     242          19 :   InputParameters params = _factory.getValidParams(class_name);
     243          38 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     244          57 :   params.set<std::vector<VariableName>>("xirhoA") = {THM::XIRHOA};
     245          57 :   params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
     246          57 :   params.set<std::vector<VariableName>>("rhouA") = {THM::RHOUA};
     247          57 :   params.set<std::vector<VariableName>>("rhoEA") = {THM::RHOEA};
     248          57 :   params.set<std::vector<VariableName>>("area") = {THM::AREA};
     249          19 :   params.set<UserObjectName>("fluid_properties") = _fp_name;
     250          38 :   _sim.addMaterial(class_name, genName(_comp_name, "fp_mat"), params);
     251          38 : }
     252             : 
     253             : void
     254          19 : FlowModelGasMix::addNumericalFluxUserObject()
     255             : {
     256          19 :   const std::string class_name = "NumericalFluxGasMixHLLC";
     257          19 :   InputParameters params = _factory.getValidParams(class_name);
     258          19 :   params.set<UserObjectName>("fluid_properties") = _fp_name;
     259          38 :   params.set<MooseEnum>("emit_on_nan") = "none";
     260          95 :   params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_LINEAR, EXEC_NONLINEAR};
     261          19 :   _sim.addUserObject(class_name, _numerical_flux_name, params);
     262          57 : }
     263             : 
     264             : void
     265          19 : FlowModelGasMix::addSlopeReconstructionMaterial()
     266             : {
     267          19 :   const std::string class_name = "SlopeReconstructionGasMixMaterial";
     268          19 :   InputParameters params = _factory.getValidParams(class_name);
     269          19 :   params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     270          38 :   params.set<MooseEnum>("scheme") = _rdg_slope_reconstruction;
     271          57 :   params.set<std::vector<VariableName>>("A_elem") = {THM::AREA};
     272          57 :   params.set<std::vector<VariableName>>("A_linear") = {THM::AREA_LINEAR};
     273          57 :   params.set<std::vector<VariableName>>("xirhoA") = {THM::XIRHOA};
     274          57 :   params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
     275          57 :   params.set<std::vector<VariableName>>("rhouA") = {THM::RHOUA};
     276          57 :   params.set<std::vector<VariableName>>("rhoEA") = {THM::RHOEA};
     277          19 :   params.set<UserObjectName>("fluid_properties") = _fp_name;
     278          19 :   params.set<bool>("implicit") = _sim.getImplicitTimeIntegrationFlag();
     279          38 :   _sim.addMaterial(class_name, genName(_comp_name, "slope_mat"), params);
     280          38 : }
     281             : 
     282             : void
     283          19 : FlowModelGasMix::addRDGAdvectionDGKernels()
     284             : {
     285          95 :   const std::vector<NonlinearVariableName> vars{THM::XIRHOA, THM::RHOA, THM::RHOUA, THM::RHOEA};
     286             : 
     287          95 :   for (const auto & var : vars)
     288             :   {
     289          76 :     const std::string class_name = "NumericalFluxGasMixDGKernel";
     290          76 :     InputParameters params = _factory.getValidParams(class_name);
     291          76 :     params.set<NonlinearVariableName>("variable") = var;
     292         152 :     params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
     293         228 :     params.set<std::vector<VariableName>>("A_linear") = {THM::AREA_LINEAR};
     294         228 :     params.set<std::vector<VariableName>>("xirhoA") = {THM::XIRHOA};
     295         228 :     params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
     296         228 :     params.set<std::vector<VariableName>>("rhouA") = {THM::RHOUA};
     297         228 :     params.set<std::vector<VariableName>>("rhoEA") = {THM::RHOEA};
     298          76 :     params.set<UserObjectName>("numerical_flux") = _numerical_flux_name;
     299          76 :     params.set<bool>("implicit") = _sim.getImplicitTimeIntegrationFlag();
     300         152 :     _sim.addDGKernel(class_name, genName(_comp_name, "advection:" + var), params);
     301          76 :   }
     302          19 : }

Generated by: LCOV version 1.14