LCOV - code coverage report
Current view: top level - src/materials - PorousMixedVarMaterial.C (source / functions) Hit Total Coverage
Test: idaholab/moose navier_stokes: #32971 (54bef8) with base c6cf66 Lines: 122 125 97.6 %
Date: 2026-05-29 20:37:52 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //* This file is part of the MOOSE framework
       2             : //* https://mooseframework.inl.gov
       3             : //*
       4             : //* All rights reserved, see COPYRIGHT for full restrictions
       5             : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
       6             : //*
       7             : //* Licensed under LGPL 2.1, please see LICENSE for details
       8             : //* https://www.gnu.org/licenses/lgpl-2.1.html
       9             : 
      10             : // Navier-Stokes includes
      11             : #include "PorousMixedVarMaterial.h"
      12             : #include "NS.h"
      13             : #include "NavierStokesMethods.h"
      14             : 
      15             : // FluidProperties includes
      16             : #include "SinglePhaseFluidProperties.h"
      17             : 
      18             : registerMooseObject("NavierStokesApp", PorousMixedVarMaterial);
      19             : 
      20             : InputParameters
      21         254 : PorousMixedVarMaterial::validParams()
      22             : {
      23         254 :   auto params = Material::validParams();
      24         254 :   params.addRequiredParam<UserObjectName>(NS::fluid, "fluid userobject");
      25         254 :   params.addRequiredCoupledVar(NS::pressure, "The pressure");
      26         254 :   params.addRequiredCoupledVar(NS::T_fluid, "The fluid temperature");
      27         254 :   params.addRequiredCoupledVar(NS::superficial_momentum_x, "The x-momentum times the porosity");
      28         254 :   params.addCoupledVar(NS::superficial_momentum_y, "The y-momentum times the porosity");
      29         254 :   params.addCoupledVar(NS::superficial_momentum_z, "The z-momentum times the porosity");
      30         254 :   params.addClassDescription("Provides access to variables for a primitive variable set "
      31             :                              "of pressure, temperature, and superficial velocity");
      32         254 :   params.addRequiredParam<MaterialPropertyName>(NS::porosity, "the porosity");
      33         254 :   return params;
      34           0 : }
      35             : 
      36         192 : PorousMixedVarMaterial::PorousMixedVarMaterial(const InputParameters & params)
      37             :   : Material(params),
      38         384 :     _fluid(UserObjectInterface::getUserObject<SinglePhaseFluidProperties>(NS::fluid)),
      39             :     // mixed variables
      40         192 :     _var_pressure(adCoupledValue(NS::pressure)),
      41         192 :     _grad_var_pressure(adCoupledGradient(NS::pressure)),
      42         192 :     _pressure_dot(_is_transient ? adCoupledDot(NS::pressure) : _ad_zero),
      43         192 :     _var_T_fluid(adCoupledValue(NS::T_fluid)),
      44         192 :     _grad_var_T_fluid(adCoupledGradient(NS::T_fluid)),
      45         192 :     _T_fluid_dot(_is_transient ? adCoupledDot(NS::T_fluid) : _ad_zero),
      46         192 :     _var_sup_mom_x(adCoupledValue(NS::superficial_momentum_x)),
      47         192 :     _grad_var_sup_mom_x(adCoupledGradient(NS::superficial_momentum_x)),
      48         192 :     _var_sup_mom_y(isCoupled(NS::superficial_momentum_y)
      49         192 :                        ? adCoupledValue(NS::superficial_momentum_y)
      50             :                        : _ad_zero),
      51         192 :     _grad_var_sup_mom_y(isCoupled(NS::superficial_momentum_y)
      52         192 :                             ? adCoupledGradient(NS::superficial_momentum_y)
      53             :                             : _ad_grad_zero),
      54         192 :     _var_sup_mom_z(isCoupled(NS::superficial_momentum_z)
      55         192 :                        ? adCoupledValue(NS::superficial_momentum_z)
      56             :                        : _ad_zero),
      57         192 :     _grad_var_sup_mom_z(isCoupled(NS::superficial_momentum_z)
      58         192 :                             ? adCoupledGradient(NS::superficial_momentum_z)
      59             :                             : _ad_grad_zero),
      60         192 :     _var_sup_mom_x_dot(_is_transient ? adCoupledDot(NS::superficial_momentum_x) : _ad_zero),
      61         246 :     _var_sup_mom_y_dot((isCoupled(NS::superficial_momentum_y) && _is_transient)
      62         246 :                            ? adCoupledDot(NS::superficial_momentum_y)
      63             :                            : _ad_zero),
      64         384 :     _var_sup_mom_z_dot((isCoupled(NS::superficial_momentum_z) && _is_transient)
      65         192 :                            ? adCoupledDot(NS::superficial_momentum_z)
      66             :                            : _ad_zero),
      67             :     // porosity
      68         192 :     _epsilon(getMaterialProperty<Real>(NS::porosity)),
      69             :     // properties: primitives
      70         192 :     _pressure(declareADProperty<Real>(NS::pressure)),
      71         192 :     _grad_pressure(declareADProperty<RealVectorValue>(NS::grad(NS::pressure))),
      72         192 :     _T_fluid(declareADProperty<Real>(NS::T_fluid)),
      73         192 :     _grad_T_fluid(declareADProperty<RealVectorValue>(NS::grad(NS::T_fluid))),
      74         192 :     _sup_vel(declareADProperty<RealVectorValue>(NS::superficial_velocity)),
      75         192 :     _sup_vel_x(declareADProperty<Real>(NS::superficial_velocity_x)),
      76         192 :     _grad_sup_vel_x(declareADProperty<RealVectorValue>(NS::grad(NS::superficial_velocity_x))),
      77         192 :     _sup_vel_y(declareADProperty<Real>(NS::superficial_velocity_y)),
      78         192 :     _grad_sup_vel_y(declareADProperty<RealVectorValue>(NS::grad(NS::superficial_velocity_y))),
      79         192 :     _sup_vel_z(declareADProperty<Real>(NS::superficial_velocity_z)),
      80         192 :     _grad_sup_vel_z(declareADProperty<RealVectorValue>(NS::grad(NS::superficial_velocity_z))),
      81             :     // properties: for viz
      82         192 :     _rho(declareADProperty<Real>(NS::density)),
      83         192 :     _sup_rho_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_density))),
      84         192 :     _velocity(declareADProperty<RealVectorValue>(NS::velocity)),
      85         192 :     _vel_x(declareADProperty<Real>(NS::velocity_x)),
      86         192 :     _vel_y(declareADProperty<Real>(NS::velocity_y)),
      87         192 :     _vel_z(declareADProperty<Real>(NS::velocity_z)),
      88         192 :     _sup_mom_x(declareADProperty<Real>(NS::superficial_momentum_x)),
      89         192 :     _sup_mom_y(declareADProperty<Real>(NS::superficial_momentum_y)),
      90         192 :     _sup_mom_z(declareADProperty<Real>(NS::superficial_momentum_z)),
      91         192 :     _sup_mom_x_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_momentum_x))),
      92         192 :     _sup_mom_y_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_momentum_y))),
      93         192 :     _sup_mom_z_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_momentum_z))),
      94         192 :     _sup_rho_et_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_total_energy_density))),
      95         192 :     _mom(declareADProperty<RealVectorValue>(NS::momentum)),
      96         192 :     _mom_x(declareADProperty<Real>(NS::momentum_x)),
      97         192 :     _mom_y(declareADProperty<Real>(NS::momentum_y)),
      98         192 :     _mom_z(declareADProperty<Real>(NS::momentum_z)),
      99         192 :     _speed(declareADProperty<Real>(NS::speed)),
     100         192 :     _rho_et(declareADProperty<Real>(NS::total_energy_density)),
     101         192 :     _e(declareADProperty<Real>(NS::specific_internal_energy)),
     102         384 :     _ht(declareADProperty<Real>(NS::specific_total_enthalpy))
     103             : {
     104         192 :   if (_mesh.dimension() >= 2 && !isCoupled(NS::superficial_momentum_y))
     105           0 :     mooseError("You must couple in a superficial y-momentum when solving 2D or 3D problems.");
     106             : 
     107         192 :   if (_mesh.dimension() >= 3 && !isCoupled(NS::superficial_momentum_z))
     108           0 :     mooseError("You must couple in a superficial z-momentum when solving 3D problems.");
     109         192 : }
     110             : 
     111             : void
     112     2955564 : PorousMixedVarMaterial::computeQpProperties()
     113             : {
     114             :   // Our primitive variable set
     115     2955564 :   _pressure[_qp] = _var_pressure[_qp];
     116     2955564 :   _grad_pressure[_qp] = _grad_var_pressure[_qp];
     117     2955564 :   _T_fluid[_qp] = _var_T_fluid[_qp];
     118     2955564 :   _grad_T_fluid[_qp] = _grad_var_T_fluid[_qp];
     119             :   const VectorValue<ADReal> superficial_momentum = {
     120     2955564 :       _var_sup_mom_x[_qp], _var_sup_mom_y[_qp], _var_sup_mom_z[_qp]};
     121     2955564 :   _sup_mom_x[_qp] = superficial_momentum(0);
     122     2955564 :   _sup_mom_y[_qp] = superficial_momentum(1);
     123     2955564 :   _sup_mom_z[_qp] = superficial_momentum(2);
     124     2955564 :   _sup_mom_x_dot[_qp] = _var_sup_mom_x_dot[_qp];
     125     2955564 :   _sup_mom_y_dot[_qp] = _var_sup_mom_y_dot[_qp];
     126     2955564 :   _sup_mom_z_dot[_qp] = _var_sup_mom_z_dot[_qp];
     127             : 
     128             :   ADReal drho_dp, drho_dT;
     129     2955564 :   _fluid.rho_from_p_T(_pressure[_qp], _T_fluid[_qp], _rho[_qp], drho_dp, drho_dT);
     130     5911128 :   const auto rho_dot = drho_dp * _pressure_dot[_qp] + drho_dT * _T_fluid_dot[_qp];
     131     2955564 :   const auto grad_rho = drho_dp * _grad_pressure[_qp] + drho_dT * _grad_T_fluid[_qp];
     132     5911128 :   _sup_rho_dot[_qp] = _epsilon[_qp] * rho_dot;
     133             : 
     134     5911128 :   _sup_vel[_qp] = superficial_momentum / _rho[_qp];
     135     2955564 :   _sup_vel_x[_qp] = _sup_vel[_qp](0);
     136     2955564 :   _sup_vel_y[_qp] = _sup_vel[_qp](1);
     137     2955564 :   _sup_vel_z[_qp] = _sup_vel[_qp](2);
     138     5911128 :   _grad_sup_vel_x[_qp] = _grad_var_sup_mom_x[_qp] / _rho[_qp] -
     139     2955564 :                          superficial_momentum(0) / (_rho[_qp] * _rho[_qp]) * grad_rho;
     140     5911128 :   _grad_sup_vel_y[_qp] = _grad_var_sup_mom_y[_qp] / _rho[_qp] -
     141     2955564 :                          superficial_momentum(1) / (_rho[_qp] * _rho[_qp]) * grad_rho;
     142     5911128 :   _grad_sup_vel_z[_qp] = _grad_var_sup_mom_z[_qp] / _rho[_qp] -
     143     2955564 :                          superficial_momentum(2) / (_rho[_qp] * _rho[_qp]) * grad_rho;
     144     2955564 :   const auto sup_vel_x_dot = _var_sup_mom_x_dot[_qp] / _rho[_qp] -
     145     2955564 :                              superficial_momentum(0) / (_rho[_qp] * _rho[_qp]) * rho_dot;
     146     2955564 :   const auto sup_vel_y_dot = _var_sup_mom_y_dot[_qp] / _rho[_qp] -
     147     2955564 :                              superficial_momentum(1) / (_rho[_qp] * _rho[_qp]) * rho_dot;
     148     2955564 :   const auto sup_vel_z_dot = _var_sup_mom_z_dot[_qp] / _rho[_qp] -
     149     2955564 :                              superficial_momentum(2) / (_rho[_qp] * _rho[_qp]) * rho_dot;
     150             : 
     151     5911128 :   _velocity[_qp] = _sup_vel[_qp] / _epsilon[_qp];
     152     2955564 :   _vel_x[_qp] = _velocity[_qp](0);
     153     2955564 :   _vel_y[_qp] = _velocity[_qp](1);
     154     2955564 :   _vel_z[_qp] = _velocity[_qp](2);
     155             : 
     156     2955564 :   const auto v = 1. / _rho[_qp];
     157     8866692 :   const auto v_dot = -rho_dot / (_rho[_qp] * _rho[_qp]);
     158             :   ADReal de_dT, de_dv;
     159     2955564 :   _fluid.e_from_T_v(_T_fluid[_qp], v, _e[_qp], de_dT, de_dv);
     160     2955564 :   const auto e_dot = de_dT * _T_fluid_dot[_qp] + de_dv * v_dot;
     161     5911128 :   const auto et = _e[_qp] + _velocity[_qp] * _velocity[_qp] / 2.;
     162             :   const auto velocity_dot =
     163     2955564 :       VectorValue<ADReal>(sup_vel_x_dot, sup_vel_y_dot, sup_vel_z_dot) / _epsilon[_qp];
     164     2955564 :   const auto et_dot = e_dot + _velocity[_qp] * velocity_dot;
     165     8866692 :   _sup_rho_et_dot[_qp] = _epsilon[_qp] * (rho_dot * et + et_dot * _rho[_qp]);
     166             : 
     167     5911128 :   _mom_x[_qp] = _sup_mom_x[_qp] / _epsilon[_qp];
     168     5911128 :   _mom_y[_qp] = _sup_mom_y[_qp] / _epsilon[_qp];
     169     5911128 :   _mom_z[_qp] = _sup_mom_z[_qp] / _epsilon[_qp];
     170     2955564 :   _mom[_qp] = {_mom_x[_qp], _mom_y[_qp], _mom_z[_qp]};
     171             : 
     172     2955564 :   _speed[_qp] = NS::computeSpeed<ADReal>(_velocity[_qp]);
     173             : 
     174     5911128 :   _rho_et[_qp] = _rho[_qp] * et;
     175     5911128 :   _ht[_qp] = et + _pressure[_qp] / _rho[_qp];
     176     2955564 : }

Generated by: LCOV version 1.14