https://mooseframework.inl.gov
FlowModel1PhaseUtils.h
Go to the documentation of this file.
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 #pragma once
11 
13 #include "THMIndicesVACE.h"
14 #include "MooseVariable.h"
15 
16 #include "libmesh/elem.h"
17 
19 {
20 
27 template <bool is_ad>
28 std::vector<GenericReal<is_ad>>
31 {
32  const auto & rhoA = U[THMVACE1D::RHOA];
33  const auto & rhouA = U[THMVACE1D::RHOUA];
34  const auto & rhoEA = U[THMVACE1D::RHOEA];
35  const auto & A = U[THMVACE1D::AREA];
36  const auto n_passives = U.size() - THMVACE1D::N_FLUX_INPUTS;
37 
38  const auto rho = rhoA / A;
39  const auto vel = rhouA / rhoA;
40  const auto v = 1.0 / rho;
41  const auto e = rhoEA / rhoA - 0.5 * vel * vel;
42  const auto p = fp.p_from_v_e(v, e);
43  const auto T = fp.T_from_v_e(v, e);
44 
45  std::vector<GenericReal<is_ad>> W(THMVACE1D::N_PRIM_VARS + n_passives);
46  W[THMVACE1D::PRESSURE] = fp.p_from_v_e(v, e);
47  W[THMVACE1D::VELOCITY] = vel;
48  W[THMVACE1D::TEMPERATURE] = fp.T_from_v_e(v, e);
49  for (const auto i : make_range(n_passives))
51 
52  return W;
53 }
54 
62 template <bool is_ad>
63 std::vector<GenericReal<is_ad>>
65  const GenericReal<is_ad> & A,
67 {
68  const auto & p = W[THMVACE1D::PRESSURE];
69  const auto & T = W[THMVACE1D::TEMPERATURE];
70  const auto & vel = W[THMVACE1D::VELOCITY];
71  const auto n_passives = W.size() - THMVACE1D::N_PRIM_VARS;
72 
73  const ADReal rho = fp.rho_from_p_T(p, T);
74  const ADReal e = fp.e_from_p_rho(p, rho);
75  const ADReal E = e + 0.5 * vel * vel;
76 
77  std::vector<GenericReal<is_ad>> U(THMVACE1D::N_FLUX_INPUTS + n_passives);
78  U[THMVACE1D::RHOA] = rho * A;
79  U[THMVACE1D::RHOUA] = U[THMVACE1D::RHOA] * vel;
81  U[THMVACE1D::AREA] = A;
82  for (const auto i : make_range(n_passives))
84 
85  return U;
86 }
87 
95 template <bool is_ad>
96 std::vector<GenericReal<is_ad>>
98  const GenericReal<is_ad> & A,
100 {
101  const auto & p = W[THMVACE1D::PRESSURE];
102  const auto & T = W[THMVACE1D::TEMPERATURE];
103  const auto & vel = W[THMVACE1D::VELOCITY];
104  const auto n_passives = W.size() - THMVACE1D::N_PRIM_VARS;
105 
106  const auto rho = fp.rho_from_p_T(p, T);
107  const auto e = fp.e_from_p_rho(p, rho);
108  const auto E = e + 0.5 * vel * vel;
109 
110  std::vector<ADReal> F(THMVACE1D::N_FLUX_OUTPUTS + n_passives, 0.0);
111  F[THMVACE1D::MASS] = rho * vel * A;
112  F[THMVACE1D::MOMENTUM] = (rho * vel * vel + p) * A;
113  F[THMVACE1D::ENERGY] = vel * (rho * E + p) * A;
114  for (const auto i : make_range(n_passives))
115  F[THMVACE1D::N_FLUX_OUTPUTS + i] = vel * W[THMVACE1D::N_PRIM_VARS + i] * A;
116 
117  return F;
118 }
119 
127 template <bool is_ad>
128 std::vector<GenericReal<is_ad>>
129 getElementalSolutionVector(const Elem * elem,
130  const std::vector<MooseVariable *> & U_vars,
131  bool is_implicit)
132 {
133  mooseAssert(elem, "The supplied element is a nullptr.");
134 
135  std::vector<GenericReal<is_ad>> U(U_vars.size(), 0.0);
136 
137  if (is_implicit)
138  {
139  for (const auto i : make_range(U_vars.size()))
140  {
141  mooseAssert(U_vars[i], "The supplied variable is a nullptr.");
142  U[i] = U_vars[i]->getElementalValue(elem);
143 
144  if (i != THMVACE1D::AREA)
145  {
146  std::vector<dof_id_type> dof_indices;
147  U_vars[i]->dofMap().dof_indices(elem, dof_indices, U_vars[i]->number());
148  Moose::derivInsert(U[i].derivatives(), dof_indices[0], 1.0);
149  }
150  }
151  }
152  else
153  {
154  for (const auto i : make_range(U_vars.size()))
155  U[i] = U_vars[i]->getElementalValueOld(elem);
156  }
157 
158  return U;
159 }
160 }
Moose::GenericType< Real, is_ad > GenericReal
const double T
std::vector< GenericReal< is_ad > > computeConservativeSolutionVector(const std::vector< GenericReal< is_ad >> &W, const GenericReal< is_ad > &A, const SinglePhaseFluidProperties &fp)
Computes the conservative solution vector from the primitive solution vector.
const double v
std::vector< GenericReal< is_ad > > computeFluxFromPrimitive(const std::vector< GenericReal< is_ad >> &W, const GenericReal< is_ad > &A, const SinglePhaseFluidProperties &fp)
Computes the numerical flux vector from the primitive solution vector.
static const std::string F
Definition: NS.h:169
std::vector< GenericReal< is_ad > > computePrimitiveSolutionVector(const std::vector< GenericReal< is_ad >> &U, const SinglePhaseFluidProperties &fp)
Computes the primitive solution vector from the conservative solution vector.
const double rho
Common class for single phase fluid properties.
static const unsigned int N_FLUX_INPUTS
Number of numerical flux function inputs for 1D.
std::vector< GenericReal< is_ad > > getElementalSolutionVector(const Elem *elem, const std::vector< MooseVariable *> &U_vars, bool is_implicit)
Gets the elemental conservative solution vector.
static const unsigned int N_FLUX_OUTPUTS
Number of numerical flux function outputs for 1D.
static const unsigned int N_PRIM_VARS
const Real p
IntRange< T > make_range(T beg, T end)
void derivInsert(SemiDynamicSparseNumberArray< Real, libMesh::dof_id_type, NWrapper< N >> &derivs, libMesh::dof_id_type index, Real value)