LCOV - code coverage report
Current view: top level - src/physics - WCNSFVTwoPhaseMixturePhysics.C (source / functions) Hit Total Coverage
Test: idaholab/moose navier_stokes: 9fc4b0 Lines: 217 292 74.3 %
Date: 2025-08-14 10:14:56 Functions: 9 11 81.8 %
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 "WCNSFVTwoPhaseMixturePhysics.h"
      11             : #include "WCNSFVFluidHeatTransferPhysics.h"
      12             : #include "WCNSFVFlowPhysics.h"
      13             : 
      14             : registerNavierStokesPhysicsBaseTasks("NavierStokesApp", WCNSFVTwoPhaseMixturePhysics);
      15             : registerWCNSFVScalarTransportBaseTasks("NavierStokesApp", WCNSFVTwoPhaseMixturePhysics);
      16             : registerMooseAction("NavierStokesApp", WCNSFVTwoPhaseMixturePhysics, "add_material");
      17             : 
      18             : InputParameters
      19          28 : WCNSFVTwoPhaseMixturePhysics::validParams()
      20             : {
      21          28 :   InputParameters params = WCNSFVScalarTransportPhysics::validParams();
      22             : 
      23             :   // First rename the parameters from passive scalar to mixture
      24          28 :   renamePassiveScalarToMixtureParams(params);
      25          56 :   params.renameParam("passive_scalar_face_interpolation",
      26             :                      "phase_face_interpolation",
      27             :                      "The numerical scheme to interpolate the phase fraction variable to the "
      28             :                      "face (separate from the advected quantity interpolation)");
      29             : 
      30             :   // Then add parameters specific to mixtures
      31             :   // The flow physics is obtained from the scalar transport base class
      32             :   // The fluid heat transfer physics is retrieved even if unspecified
      33          56 :   params.addParam<PhysicsName>(
      34             :       "fluid_heat_transfer_physics",
      35             :       "NavierStokesFV",
      36             :       "WCNSFVFluidHeatTransferPhysics generating the fluid energy equation");
      37          28 :   params += commonMixtureParams();
      38          56 :   params.addParamNamesToGroup("fluid_heat_transfer_physics", "Phase change");
      39          28 :   params.addClassDescription("Define the additional terms for a mixture model for the two phase "
      40             :                              "weakly-compressible Navier Stokes equations");
      41          28 :   return params;
      42           0 : }
      43             : 
      44             : InputParameters
      45          68 : WCNSFVTwoPhaseMixturePhysics::commonMixtureParams()
      46             : {
      47          68 :   InputParameters params = emptyInputParameters();
      48             : 
      49         136 :   params.addParam<bool>(
      50             :       "use_external_mixture_properties",
      51         136 :       false,
      52             :       "Whether to use the simple NSFVMixtureFunctorMaterial or use a more complex model "
      53             :       "defined outside of the Physics");
      54         136 :   params.addParam<bool>("output_all_properties",
      55         136 :                         false,
      56             :                         "Whether to output every functor material property defined to Exodus");
      57             : 
      58             :   // Phase change parameters
      59          68 :   params.addParam<MooseFunctorName>(
      60          68 :       NS::alpha_exchange, 0, "Name of the volumetric phase exchange coefficient");
      61         136 :   params.addParam<bool>("add_phase_change_energy_term",
      62         136 :                         false,
      63             :                         "Whether to add a phase change term based on the latent heat of fusion in "
      64             :                         "the energy equation");
      65             : 
      66             :   // Drift flux model parameters
      67         136 :   params.addParam<bool>("add_drift_flux_momentum_terms",
      68         136 :                         false,
      69             :                         "Whether to add the drift flux terms to the momentum equation");
      70         136 :   MooseEnum coeff_interp_method("average harmonic", "harmonic");
      71         136 :   params.addParam<MooseEnum>("density_interp_method",
      72             :                              coeff_interp_method,
      73             :                              "Face interpolation method for the density in the drift flux term.");
      74         136 :   params.addParam<bool>(
      75         136 :       "add_advection_slip_term", false, "Whether to use the advection-slip model");
      76         136 :   params.addParam<MooseFunctorName>(
      77             :       "slip_linear_friction_name",
      78             :       "Name of the functor providing the scalar linear friction coefficient");
      79             : 
      80             :   // Properties of the first phase (can be a liquid or a gas)
      81         136 :   params.addRequiredParam<MooseFunctorName>(
      82             :       "phase_1_fraction_name",
      83             :       "Name of the first phase fraction variable, it will be created as a functor material "
      84             :       "property if it does not exist already.");
      85         136 :   params.addRequiredParam<MooseFunctorName>("phase_1_density_name",
      86             :                                             "Name of the density functor for phase 1");
      87         136 :   params.addRequiredParam<MooseFunctorName>("phase_1_viscosity_name",
      88             :                                             "Name of the viscosity functor for phase 1");
      89         136 :   params.addRequiredParam<MooseFunctorName>("phase_1_specific_heat_name",
      90             :                                             "Name of the specific heat functor for phase 1");
      91         136 :   params.addRequiredParam<MooseFunctorName>("phase_1_thermal_conductivity_name",
      92             :                                             "Name of the thermal conductivity functor for phase 1");
      93             : 
      94             :   // Properties of phase 2 (can be solid, another liquid, or gaseous)
      95         136 :   params.addRequiredParam<MooseFunctorName>("phase_2_density_name",
      96             :                                             "Name of the density functor for phase 2");
      97         136 :   params.addRequiredParam<MooseFunctorName>("phase_2_viscosity_name",
      98             :                                             "Name of the viscosity functor for phase 2");
      99         136 :   params.addRequiredParam<MooseFunctorName>("phase_2_specific_heat_name",
     100             :                                             "Name of the specific heat functor for phase 2");
     101         136 :   params.addRequiredParam<MooseFunctorName>("phase_2_thermal_conductivity_name",
     102             :                                             "Name of the thermal conductivity functor for phase 2");
     103             : 
     104             :   // Dispersed phase properties
     105         136 :   params.addParam<MooseFunctorName>(
     106         136 :       "particle_diameter", 1, "Particle size if using a dispersed phase");
     107         136 :   params.addParam<bool>("use_dispersed_phase_drag_model",
     108         136 :                         false,
     109             :                         "Adds a linear friction term with the dispersed phase drag model");
     110             : 
     111             :   // Parameter groups
     112         136 :   params.addParamNamesToGroup("phase_1_density_name phase_1_viscosity_name "
     113             :                               "phase_1_specific_heat_name phase_1_thermal_conductivity_name "
     114             :                               "phase_2_density_name phase_2_viscosity_name "
     115             :                               "phase_2_specific_heat_name phase_2_thermal_conductivity_name "
     116             :                               "use_external_mixture_properties",
     117             :                               "Mixture material properties");
     118             : 
     119         136 :   params.addParamNamesToGroup("slip_linear_friction_name use_dispersed_phase_drag_model",
     120             :                               "Friction model");
     121         136 :   params.addParamNamesToGroup(NS::alpha_exchange + " add_phase_change_energy_term", "Phase change");
     122         136 :   params.addParamNamesToGroup("add_drift_flux_momentum_terms density_interp_method",
     123             :                               "Drift flux model");
     124         136 :   params.addParamNamesToGroup("add_advection_slip_term", "Advection slip model");
     125          68 :   return params;
     126          68 : }
     127             : 
     128             : void
     129          68 : WCNSFVTwoPhaseMixturePhysics::renamePassiveScalarToMixtureParams(InputParameters & params)
     130             : {
     131             :   // It can be useful to define the mixture materials with a fixed phase fraction instead
     132             :   // of solving the equations
     133         136 :   params.addParam<bool>("add_scalar_equation", true, "");
     134         136 :   params.renameParam("add_scalar_equation",
     135             :                      "add_phase_transport_equation",
     136             :                      "Whether to add the phase transport equation.");
     137             : 
     138         136 :   params.renameParam("initial_scalar_variables",
     139             :                      "initial_phase_fraction",
     140             :                      "Initial value of the main phase fraction variable");
     141         136 :   params.renameParam("passive_scalar_diffusivity",
     142             :                      "phase_fraction_diffusivity",
     143             :                      "Functor names for the diffusivities used for the main phase fraction.");
     144             : 
     145         136 :   params.renameParam("passive_scalar_names",
     146             :                      "phase_2_fraction_name",
     147             :                      "Name of the second phase fraction variable (can be a dispersed phase)");
     148             : 
     149             :   // Not applicable currently
     150          68 :   params.suppressParameter<std::vector<MooseFunctorName>>("passive_scalar_source");
     151          68 :   params.suppressParameter<std::vector<std::vector<MooseFunctorName>>>(
     152             :       "passive_scalar_coupled_source");
     153          68 :   params.suppressParameter<std::vector<std::vector<Real>>>("passive_scalar_coupled_source_coeff");
     154             : 
     155             :   // Boundary conditions
     156         136 :   params.renameParam("passive_scalar_inlet_types",
     157             :                      "phase_fraction_inlet_type",
     158             :                      "Types for the inlet boundary for the phase fraction.");
     159         136 :   params.renameParam("passive_scalar_inlet_functors",
     160             :                      "phase_fraction_inlet_functors",
     161             :                      "Functors describing the inlet phase fraction boundary condition.");
     162             : 
     163             :   // Spatial finite volume discretization scheme
     164         136 :   params.renameParam("passive_scalar_advection_interpolation",
     165             :                      "phase_advection_interpolation",
     166             :                      "The numerical scheme to use for interpolating the phase fraction variable, "
     167             :                      "as an advected quantity, to the face.");
     168         136 :   params.renameParam(
     169             :       "passive_scalar_two_term_bc_expansion",
     170             :       "phase_two_term_bc_expansion",
     171             :       "If a two-term Taylor expansion is needed for the determination of the boundary values"
     172             :       "of the phase fraction.");
     173             : 
     174             :   // Numerical system parameters
     175         136 :   params.renameParam("passive_scalar_scaling",
     176             :                      "phase_scaling",
     177             :                      "The scaling factor for the phase transport equation");
     178             : 
     179         136 :   params.renameParameterGroup("Passive scalar control", "Mixture transport control");
     180          68 : }
     181             : 
     182          28 : WCNSFVTwoPhaseMixturePhysics::WCNSFVTwoPhaseMixturePhysics(const InputParameters & parameters)
     183             :   : WCNSFVScalarTransportPhysics(parameters),
     184          28 :     _add_phase_equation(_has_scalar_equation),
     185          28 :     _phase_1_fraction_name(getParam<MooseFunctorName>("phase_1_fraction_name")),
     186          28 :     _phase_2_fraction_name(_passive_scalar_names[0]),
     187          28 :     _phase_1_density(getParam<MooseFunctorName>("phase_1_density_name")),
     188          28 :     _phase_1_viscosity(getParam<MooseFunctorName>("phase_1_viscosity_name")),
     189          28 :     _phase_1_specific_heat(getParam<MooseFunctorName>("phase_1_specific_heat_name")),
     190          28 :     _phase_1_thermal_conductivity(getParam<MooseFunctorName>("phase_1_thermal_conductivity_name")),
     191          28 :     _phase_2_density(getParam<MooseFunctorName>("phase_2_density_name")),
     192          28 :     _phase_2_viscosity(getParam<MooseFunctorName>("phase_2_viscosity_name")),
     193          28 :     _phase_2_specific_heat(getParam<MooseFunctorName>("phase_2_specific_heat_name")),
     194          28 :     _phase_2_thermal_conductivity(getParam<MooseFunctorName>("phase_2_thermal_conductivity_name")),
     195          56 :     _use_external_mixture_properties(getParam<bool>("use_external_mixture_properties")),
     196          56 :     _use_drift_flux(getParam<bool>("add_drift_flux_momentum_terms")),
     197          84 :     _use_advection_slip(getParam<bool>("add_advection_slip_term"))
     198             : {
     199             :   // Check that only one scalar was passed, as we are using vector parameters
     200          28 :   if (_passive_scalar_names.size() > 1)
     201           0 :     paramError("phase_fraction_name", "Only one phase fraction currently supported.");
     202          28 :   if (_passive_scalar_inlet_functors.size() > 1)
     203           0 :     paramError("phase_fraction_inlet_functors", "Only one phase fraction currently supported");
     204             : 
     205             :   // Retrieve the fluid energy equation if it exists
     206          56 :   if (isParamValid("fluid_heat_transfer_physics"))
     207             :   {
     208          56 :     _fluid_energy_physics = getCoupledPhysics<WCNSFVFluidHeatTransferPhysics>(
     209             :         getParam<PhysicsName>("fluid_heat_transfer_physics"), true);
     210             :     // Check for a missing parameter / do not support isolated physics for now
     211          56 :     if (!_fluid_energy_physics &&
     212          56 :         !getCoupledPhysics<const WCNSFVFluidHeatTransferPhysics>(true).empty())
     213           0 :       paramError(
     214             :           "fluid_heat_transfer_physics",
     215             :           "We currently do not support creating both a phase transport equation and fluid heat "
     216             :           "transfer physics that are not coupled together");
     217          28 :     if (_fluid_energy_physics && _fluid_energy_physics->hasEnergyEquation())
     218           0 :       _has_energy_equation = true;
     219             :     else
     220          28 :       _has_energy_equation = false;
     221             :   }
     222             :   else
     223             :   {
     224           0 :     _has_energy_equation = false;
     225           0 :     _fluid_energy_physics = nullptr;
     226             :   }
     227             : 
     228             :   // Check that the mixture parameters are correctly in use in the other physics
     229          28 :   if (_has_energy_equation)
     230             :   {
     231           0 :     if (_fluid_energy_physics->densityName() != "rho_mixture")
     232           0 :       mooseError("Density name should for Physics '",
     233             :                  _fluid_energy_physics->name(),
     234             :                  "' should be 'rho_mixture'");
     235           0 :     if (_fluid_energy_physics->getSpecificHeatName() != "cp_mixture")
     236           0 :       mooseError("Specific heat name should for Physics '",
     237             :                  _fluid_energy_physics->name(),
     238             :                  "' should be 'cp_mixture'");
     239             :   }
     240          28 :   if (_flow_equations_physics)
     241             :   {
     242          28 :     if (_flow_equations_physics->densityName() != "rho_mixture")
     243           0 :       mooseError("Density name should for Physics ,",
     244           0 :                  _flow_equations_physics->name(),
     245             :                  "' should be 'rho_mixture'");
     246             :   }
     247             : 
     248          28 :   if (_verbose)
     249             :   {
     250           0 :     if (_flow_equations_physics)
     251           0 :       mooseInfoRepeated("Coupled to fluid flow physics " + _flow_equations_physics->name());
     252           0 :     if (_has_energy_equation)
     253           0 :       mooseInfoRepeated("Coupled to fluid heat transfer physics " + _fluid_energy_physics->name());
     254             :   }
     255             : 
     256             :   // Parameter checking
     257             :   // The two models are not consistent
     258          94 :   if (isParamSetByUser("alpha_exchange") && getParam<bool>("add_phase_change_energy_term"))
     259           0 :     paramError("alpha_exchange",
     260             :                "A phase exchange coefficient cannot be specified if the phase change is handled "
     261             :                "with a phase change heat loss model");
     262          28 :   if (_phase_1_fraction_name == _phase_2_fraction_name)
     263           0 :     paramError("phase_1_fraction_name",
     264             :                "First phase fraction name should be different from second phase fraction name");
     265          28 :   if (_use_drift_flux && _use_advection_slip)
     266           0 :     paramError("add_drift_flux_momentum_terms",
     267             :                "Drift flux model cannot be used at the same time as the advection slip model");
     268          56 :   if (!getParam<bool>("add_drift_flux_momentum_terms"))
     269          56 :     errorDependentParameter("add_drift_flux_momentum_terms", "true", {"density_interp_method"});
     270          56 :   if (!getParam<bool>("use_dispersed_phase_drag_model"))
     271           0 :     errorDependentParameter("use_dispersed_phase_drag_model", "true", {"particle_diameter"});
     272          28 : }
     273             : 
     274             : void
     275          28 : WCNSFVTwoPhaseMixturePhysics::addFVKernels()
     276             : {
     277          28 :   WCNSFVScalarTransportPhysics::addFVKernels();
     278             : 
     279          84 :   if (_add_phase_equation && isParamSetByUser("alpha_exchange"))
     280          19 :     addPhaseInterfaceTerm();
     281             : 
     282          28 :   if (_fluid_energy_physics && _fluid_energy_physics->hasEnergyEquation() &&
     283          28 :       getParam<bool>("add_phase_change_energy_term"))
     284           0 :     addPhaseChangeEnergySource();
     285             : 
     286          28 :   if (_flow_equations_physics && _flow_equations_physics->hasFlowEquations() && _use_drift_flux)
     287           0 :     addPhaseDriftFluxTerm();
     288          28 :   if (_flow_equations_physics && _flow_equations_physics->hasFlowEquations() && _use_advection_slip)
     289          19 :     addAdvectionSlipTerm();
     290          28 : }
     291             : 
     292             : void
     293          28 : WCNSFVTwoPhaseMixturePhysics::setSlipVelocityParams(InputParameters & params) const
     294             : {
     295          56 :   params.set<MooseFunctorName>("u_slip") = "vel_slip_x";
     296          28 :   if (dimension() >= 2)
     297          56 :     params.set<MooseFunctorName>("v_slip") = "vel_slip_y";
     298          28 :   if (dimension() >= 3)
     299           0 :     params.set<MooseFunctorName>("w_slip") = "vel_slip_z";
     300          28 : }
     301             : 
     302             : void
     303          19 : WCNSFVTwoPhaseMixturePhysics::addPhaseInterfaceTerm()
     304             : {
     305          19 :   auto params = getFactory().getValidParams("NSFVMixturePhaseInterface");
     306          19 :   assignBlocks(params, _blocks);
     307          38 :   params.set<NonlinearVariableName>("variable") = _phase_2_fraction_name;
     308          38 :   params.set<MooseFunctorName>("phase_coupled") = _phase_1_fraction_name;
     309          38 :   params.set<MooseFunctorName>("alpha") = getParam<MooseFunctorName>(NS::alpha_exchange);
     310          57 :   getProblem().addFVKernel("NSFVMixturePhaseInterface", prefix() + "phase_interface", params);
     311          19 : }
     312             : 
     313             : void
     314           0 : WCNSFVTwoPhaseMixturePhysics::addPhaseChangeEnergySource()
     315             : {
     316           0 :   auto params = getFactory().getValidParams("NSFVPhaseChangeSource");
     317           0 :   assignBlocks(params, _blocks);
     318           0 :   params.set<NonlinearVariableName>("variable") = _fluid_energy_physics->getFluidTemperatureName();
     319           0 :   params.set<MooseFunctorName>("liquid_fraction") = _phase_1_fraction_name;
     320           0 :   params.set<MooseFunctorName>("L") = NS::latent_heat;
     321           0 :   params.set<MooseFunctorName>(NS::density) = "rho_mixture";
     322           0 :   params.set<MooseFunctorName>("T_solidus") = NS::T_solidus;
     323           0 :   params.set<MooseFunctorName>("T_liquidus") = NS::T_liquidus;
     324           0 :   getProblem().addFVKernel("NSFVPhaseChangeSource", prefix() + "phase_change_energy", params);
     325             : 
     326             :   // TODO add phase equation source term corresponding to this term
     327           0 : }
     328             : 
     329             : void
     330           0 : WCNSFVTwoPhaseMixturePhysics::addPhaseDriftFluxTerm()
     331             : {
     332           0 :   const std::vector<std::string> components = {"x", "y", "z"};
     333           0 :   for (const auto dim : make_range(dimension()))
     334             :   {
     335           0 :     auto params = getFactory().getValidParams("WCNSFV2PMomentumDriftFlux");
     336           0 :     assignBlocks(params, _blocks);
     337           0 :     params.set<NonlinearVariableName>("variable") =
     338           0 :         _flow_equations_physics->getVelocityNames()[dim];
     339           0 :     params.set<MooseFunctorName>("u_slip") = "vel_slip_x";
     340           0 :     if (dimension() >= 2)
     341           0 :       params.set<MooseFunctorName>("v_slip") = "vel_slip_y";
     342           0 :     if (dimension() >= 3)
     343           0 :       params.set<MooseFunctorName>("w_slip") = "vel_slip_z";
     344           0 :     params.set<MooseFunctorName>("rho_d") = _phase_2_density;
     345           0 :     params.set<MooseFunctorName>("fraction_dispersed") = _phase_2_fraction_name;
     346           0 :     params.set<MooseEnum>("momentum_component") = components[dim];
     347           0 :     params.set<MooseEnum>("density_interp_method") = getParam<MooseEnum>("density_interp_method");
     348           0 :     params.set<UserObjectName>("rhie_chow_user_object") = _flow_equations_physics->rhieChowUOName();
     349           0 :     getProblem().addFVKernel(
     350           0 :         "WCNSFV2PMomentumDriftFlux", prefix() + "drift_flux_" + components[dim], params);
     351           0 :   }
     352           0 : }
     353             : 
     354             : void
     355          19 : WCNSFVTwoPhaseMixturePhysics::addAdvectionSlipTerm()
     356             : {
     357          19 :   const std::vector<std::string> components = {"x", "y", "z"};
     358          76 :   for (const auto dim : make_range(dimension()))
     359             :   {
     360          38 :     auto params = getFactory().getValidParams("WCNSFV2PMomentumAdvectionSlip");
     361          38 :     assignBlocks(params, _blocks);
     362          76 :     params.set<NonlinearVariableName>("variable") =
     363          76 :         _flow_equations_physics->getVelocityNames()[dim];
     364          76 :     params.set<MooseFunctorName>("u_slip") = "vel_slip_x";
     365          38 :     if (dimension() >= 2)
     366          76 :       params.set<MooseFunctorName>("v_slip") = "vel_slip_y";
     367          38 :     if (dimension() >= 3)
     368           0 :       params.set<MooseFunctorName>("w_slip") = "vel_slip_z";
     369          38 :     params.set<MooseFunctorName>(NS::density) = _phase_1_density;
     370          38 :     params.set<MooseFunctorName>("rho_d") = _phase_2_density;
     371          76 :     params.set<MooseFunctorName>("fraction_dispersed") = _phase_2_fraction_name;
     372          38 :     params.set<MooseEnum>("momentum_component") = components[dim];
     373          38 :     params.set<MooseEnum>("advected_interp_method") =
     374          76 :         _flow_equations_physics->getMomentumFaceInterpolationMethod();
     375          38 :     params.set<MooseEnum>("velocity_interp_method") =
     376          76 :         _flow_equations_physics->getVelocityFaceInterpolationMethod();
     377          76 :     params.set<UserObjectName>("rhie_chow_user_object") = _flow_equations_physics->rhieChowUOName();
     378         114 :     getProblem().addFVKernel(
     379          76 :         "WCNSFV2PMomentumAdvectionSlip", prefix() + "advection_slip_" + components[dim], params);
     380          38 :   }
     381          19 : }
     382             : 
     383             : void
     384          28 : WCNSFVTwoPhaseMixturePhysics::addMaterials()
     385             : {
     386             :   // Add the phase fraction variable, for output purposes mostly
     387          28 :   if (!getProblem().hasFunctor(_phase_1_fraction_name, /*thread_id=*/0))
     388             :   {
     389          28 :     auto params = getFactory().getValidParams("ADParsedFunctorMaterial");
     390          28 :     assignBlocks(params, _blocks);
     391          56 :     params.set<std::string>("expression") = "1 - " + _phase_2_fraction_name;
     392          84 :     params.set<std::vector<std::string>>("functor_names") = {_phase_2_fraction_name};
     393          28 :     params.set<std::string>("property_name") = _phase_1_fraction_name;
     394          84 :     params.set<std::vector<std::string>>("output_properties") = {_phase_1_fraction_name};
     395          84 :     params.set<std::vector<OutputName>>("outputs") = {"all"};
     396         112 :     getProblem().addMaterial("ADParsedFunctorMaterial", prefix() + "phase_1_fraction", params);
     397             : 
     398             :     // One of the phase fraction should exist though (either as a variable or set by a
     399             :     // NSLiquidFractionAux)
     400          28 :     if (!getProblem().hasFunctor(_phase_2_fraction_name, /*thread_id=*/0))
     401           0 :       paramError("Phase 2 fraction should be defined as a variable or auxiliary variable");
     402          28 :   }
     403          28 :   if (!getProblem().hasFunctor(_phase_2_fraction_name, /*thread_id=*/0))
     404             :   {
     405           0 :     auto params = getFactory().getValidParams("ADParsedFunctorMaterial");
     406           0 :     assignBlocks(params, _blocks);
     407           0 :     params.set<std::string>("expression") = "1 - " + _phase_1_fraction_name;
     408           0 :     params.set<std::vector<std::string>>("functor_names") = {_phase_1_fraction_name};
     409           0 :     params.set<std::string>("property_name") = _phase_2_fraction_name;
     410           0 :     params.set<std::vector<std::string>>("output_properties") = {_phase_2_fraction_name};
     411           0 :     params.set<std::vector<OutputName>>("outputs") = {"all"};
     412           0 :     getProblem().addMaterial("ADParsedFunctorMaterial", prefix() + "phase_2_fraction", params);
     413           0 :   }
     414             : 
     415             :   // Compute mixture properties
     416          28 :   if (!_use_external_mixture_properties)
     417             :   {
     418          28 :     auto params = getFactory().getValidParams("NSFVMixtureFunctorMaterial");
     419          28 :     assignBlocks(params, _blocks);
     420          56 :     params.set<std::vector<MooseFunctorName>>("prop_names") = {
     421         196 :         "rho_mixture", "mu_mixture", "cp_mixture", "k_mixture"};
     422             :     // The phase_1 and phase_2 assignments are only local to this object.
     423             :     // We use the phase 2 variable to save a functor evaluation as we expect
     424             :     // the phase 2 variable to be a nonlinear variable in the phase transport equation
     425          56 :     params.set<std::vector<MooseFunctorName>>("phase_2_names") = {_phase_1_density,
     426             :                                                                   _phase_1_viscosity,
     427             :                                                                   _phase_1_specific_heat,
     428         196 :                                                                   _phase_1_thermal_conductivity};
     429          56 :     params.set<std::vector<MooseFunctorName>>("phase_1_names") = {_phase_2_density,
     430             :                                                                   _phase_2_viscosity,
     431             :                                                                   _phase_2_specific_heat,
     432         196 :                                                                   _phase_2_thermal_conductivity};
     433          28 :     params.set<MooseFunctorName>("phase_1_fraction") = _phase_2_fraction_name;
     434          56 :     if (getParam<bool>("output_all_properties"))
     435          84 :       params.set<std::vector<OutputName>>("outputs") = {"all"};
     436          84 :     getProblem().addMaterial("NSFVMixtureFunctorMaterial", prefix() + "mixture_material", params);
     437          28 :   }
     438             : 
     439             :   // Compute slip terms as functors, used by the drift flux kernels
     440          28 :   if (_use_advection_slip || _use_drift_flux || _add_phase_equation)
     441             :   {
     442          28 :     const std::vector<std::string> vel_components = {"u", "v", "w"};
     443          28 :     const std::vector<std::string> components = {"x", "y", "z"};
     444         112 :     for (const auto dim : make_range(dimension()))
     445             :     {
     446          56 :       auto params = getFactory().getValidParams("WCNSFV2PSlipVelocityFunctorMaterial");
     447          56 :       assignBlocks(params, _blocks);
     448         224 :       params.set<MooseFunctorName>("slip_velocity_name") = "vel_slip_" + components[dim];
     449          56 :       params.set<MooseEnum>("momentum_component") = components[dim];
     450         224 :       for (const auto j : make_range(dimension()))
     451         112 :         params.set<std::vector<VariableName>>(vel_components[j]) = {
     452         336 :             _flow_equations_physics->getVelocityNames()[j]};
     453          56 :       params.set<MooseFunctorName>(NS::density) = _phase_1_density;
     454          56 :       params.set<MooseFunctorName>(NS::mu) = "mu_mixture";
     455          56 :       params.set<MooseFunctorName>("rho_d") = _phase_2_density;
     456          56 :       params.set<RealVectorValue>("gravity") = _flow_equations_physics->gravityVector();
     457         112 :       if (isParamValid("slip_linear_friction_name"))
     458           0 :         params.set<MooseFunctorName>("linear_coef_name") =
     459           0 :             getParam<MooseFunctorName>("slip_linear_friction_name");
     460         112 :       else if (getParam<bool>("use_dispersed_phase_drag_model"))
     461         112 :         params.set<MooseFunctorName>("linear_coef_name") = "Darcy_coefficient";
     462           0 :       else if (_flow_equations_physics)
     463             :       {
     464           0 :         if (!_flow_equations_physics->getLinearFrictionCoefName().empty())
     465           0 :           params.set<MooseFunctorName>("linear_coef_name") =
     466           0 :               _flow_equations_physics->getLinearFrictionCoefName();
     467             :         else
     468           0 :           params.set<MooseFunctorName>("linear_coef_name") = "0";
     469             :       }
     470             :       else
     471           0 :         paramError("slip_linear_friction_name",
     472             :                    "WCNSFV2PSlipVelocityFunctorMaterial created by this Physics required a scalar "
     473             :                    "field linear friction factor.");
     474         112 :       params.set<MooseFunctorName>("particle_diameter") =
     475          56 :           getParam<MooseFunctorName>("particle_diameter");
     476         112 :       if (getParam<bool>("output_all_properties"))
     477             :       {
     478          56 :         if (!isTransient())
     479         114 :           params.set<std::vector<OutputName>>("outputs") = {"all"};
     480             :         else
     481          36 :           paramInfo("output_all_properties",
     482             :                     "Slip velocity functor material output currently unsupported in Physics "
     483             :                     "in transient conditions.");
     484             :       }
     485         168 :       getProblem().addMaterial(
     486         112 :           "WCNSFV2PSlipVelocityFunctorMaterial", prefix() + "slip_" + components[dim], params);
     487          56 :     }
     488          28 :   }
     489             : 
     490             :   // Add a default drag model for a dispersed phase
     491          56 :   if (getParam<bool>("use_dispersed_phase_drag_model"))
     492             :   {
     493          28 :     const std::vector<std::string> vel_components = {"u", "v", "w"};
     494             : 
     495          28 :     auto params = getFactory().getValidParams("NSFVDispersePhaseDragFunctorMaterial");
     496          28 :     assignBlocks(params, _blocks);
     497          56 :     params.set<MooseFunctorName>("drag_coef_name") = "Darcy_coefficient";
     498         112 :     for (const auto j : make_range(dimension()))
     499          56 :       params.set<MooseFunctorName>(vel_components[j]) = {
     500         112 :           _flow_equations_physics->getVelocityNames()[j]};
     501          56 :     params.set<MooseFunctorName>(NS::density) = "rho_mixture";
     502          28 :     params.set<MooseFunctorName>(NS::mu) = "mu_mixture";
     503          56 :     params.set<MooseFunctorName>("particle_diameter") =
     504          28 :         getParam<MooseFunctorName>("particle_diameter");
     505          56 :     if (getParam<bool>("output_all_properties"))
     506          84 :       params.set<std::vector<OutputName>>("outputs") = {"all"};
     507          56 :     getProblem().addMaterial(
     508          28 :         "NSFVDispersePhaseDragFunctorMaterial", prefix() + "dispersed_drag", params);
     509          28 :   }
     510          84 : }

Generated by: LCOV version 1.14