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