https://mooseframework.inl.gov
DiffusionLHDGAssemblyHelper.C
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 
12 #include "MooseVariableFE.h"
13 #include "SystemBase.h"
14 #include "MooseObject.h"
16 #include "NonlinearThread.h"
17 #include "TransientInterface.h"
18 
19 using namespace libMesh;
20 
23 {
24  auto params = emptyInputParameters();
25  params.addRequiredParam<NonlinearVariableName>(
26  "gradient_variable", "The gradient of the diffusing specie concentration");
27  params.addRequiredParam<NonlinearVariableName>(
28  "face_variable", "The concentration of the diffusing specie on faces");
29  params.addRequiredParam<MaterialPropertyName>("diffusivity", "The diffusivity");
30  params.addParam<Real>("tau",
31  1,
32  "The stabilization coefficient required for discontinuous Galerkin "
33  "schemes. This may be set to 0 for a mixed method with Raviart-Thomas.");
34  return params;
35 }
36 
38  const MooseObject * const moose_obj,
39  MaterialPropertyInterface * const mpi,
41  const TransientInterface * const ti,
42  const FEProblemBase & fe_problem,
43  SystemBase & sys,
44  const THREAD_ID tid)
45  : ADFunctorInterface(moose_obj),
46  _u_var(sys.getFieldVariable<Real>(tid, moose_obj->getParam<NonlinearVariableName>("variable"))),
47  _grad_u_var(sys.getFieldVariable<RealVectorValue>(
48  tid, moose_obj->getParam<NonlinearVariableName>("gradient_variable"))),
49  _u_face_var(sys.getFieldVariable<Real>(
50  tid, moose_obj->getParam<NonlinearVariableName>("face_variable"))),
51  _qu_dof_indices(_grad_u_var.dofIndices()),
52  _u_dof_indices(_u_var.dofIndices()),
53  _lm_u_dof_indices(_u_face_var.dofIndices()),
54  _qu_sol(_grad_u_var.sln()),
55  _u_sol(_u_var.sln()),
56  _lm_u_sol(_u_face_var.sln()),
57  _vector_phi(_grad_u_var.phi()),
58  _scalar_phi(_u_var.phi()),
59  _grad_scalar_phi(_u_var.gradPhi()),
60  _div_vector_phi(_grad_u_var.divPhi()),
61  _vector_phi_face(_grad_u_var.phiFace()),
62  _scalar_phi_face(_u_var.phiFace()),
63  _lm_phi_face(_u_face_var.phiFace()),
64  _diff(mpi->getMaterialProperty<Real>("diffusivity")),
65  _ti(*ti),
66  _tau(moose_obj->getParam<Real>("tau")),
67  _cached_elem(nullptr),
68  _moose_obj(*moose_obj),
69  _dhah_fe_problem(fe_problem),
70  _dhah_sys(sys)
71 {
74 }
75 
76 void
78 {
79  // This check must occur after FEProblemBase::init()
81  return;
83  {
84  const auto * const cm = _dhah_fe_problem.couplingMatrix(_dhah_sys.number());
85  for (const auto i : make_range(cm->size()))
86  for (const auto j : make_range(cm->size()))
87  if ((*cm)(i, j) != true)
88  goto error;
89 
90  return;
91  }
92 
93 error:
95  "This class encodes the full Jacobian regardless of user input file specification, "
96  "so please request full coupling for system ",
97  _dhah_sys.name(),
98  " in your Preconditioning block for consistency");
99 }
100 
101 void
103  const MooseArray<Number> & scalar_sol,
104  const MooseArray<Real> & JxW,
105  const QBase & qrule,
106  DenseVector<Number> & vector_re)
107 {
108  for (const auto qp : make_range(qrule.n_points()))
109  {
110  const auto vector_qp_term = JxW[qp] * vector_sol[qp];
111  const auto scalar_qp_term = JxW[qp] * scalar_sol[qp];
112  for (const auto i : index_range(vector_re))
113  {
114  // Vector equation dependence on vector dofs
115  vector_re(i) += _vector_phi[i][qp] * vector_qp_term;
116 
117  // Vector equation dependence on scalar dofs
118  vector_re(i) += _div_vector_phi[i][qp] * scalar_qp_term;
119  }
120  }
121 }
122 
123 void
125  const QBase & qrule,
126  DenseMatrix<Number> & vector_vector_jac,
127  DenseMatrix<Number> & vector_scalar_jac)
128 {
129  for (const auto qp : make_range(qrule.n_points()))
130  for (const auto i : make_range(vector_vector_jac.m()))
131  {
132  // Vector equation dependence on vector dofs
133  const auto vector_qpi_term = JxW[qp] * _vector_phi[i][qp];
134  for (const auto j : make_range(vector_vector_jac.n()))
135  vector_vector_jac(i, j) += vector_qpi_term * _vector_phi[j][qp];
136 
137  // Vector equation dependence on scalar dofs
138  const auto scalar_qpi_term = JxW[qp] * _div_vector_phi[i][qp];
139  for (const auto j : make_range(vector_scalar_jac.n()))
140  vector_scalar_jac(i, j) += scalar_qpi_term * _scalar_phi[j][qp];
141  }
142 }
143 
144 void
146  const Moose::Functor<Real> & source,
147  const MooseArray<Real> & JxW,
148  const QBase & qrule,
149  const Elem * const current_elem,
150  const MooseArray<Point> & q_point,
151  DenseVector<Number> & scalar_re)
152 {
153  for (const auto qp : make_range(qrule.n_points()))
154  {
155  const auto vector_qp_term = JxW[qp] * _diff[qp] * vector_field[qp];
156  // Evaluate source
157  const auto f =
158  source(Moose::ElemQpArg{current_elem, qp, &qrule, q_point[qp]}, _ti.determineState());
159  const auto source_qp_term = JxW[qp] * f;
160 
161  for (const auto i : index_range(scalar_re))
162  {
163  scalar_re(i) += _grad_scalar_phi[i][qp] * vector_qp_term;
164 
165  // Scalar equation RHS
166  scalar_re(i) -= _scalar_phi[i][qp] * source_qp_term;
167  }
168  }
169 }
170 
171 void
173  const QBase & qrule,
174  DenseMatrix<Number> & scalar_vector_jac)
175 {
176  for (const auto qp : make_range(qrule.n_points()))
177  {
178  const auto qp_term = JxW[qp] * _diff[qp];
179  for (const auto i : make_range(scalar_vector_jac.m()))
180  {
181  const auto qpi_term = qp_term * _grad_scalar_phi[i][qp];
182  // Scalar equation dependence on vector dofs
183  for (const auto j : make_range(scalar_vector_jac.n()))
184  scalar_vector_jac(i, j) += qpi_term * _vector_phi[j][qp];
185  }
186  }
187 }
188 
189 void
191  const MooseArray<Real> & JxW_face,
192  const QBase & qrule_face,
193  const MooseArray<Point> & normals,
194  DenseVector<Number> & vector_re)
195 {
196  // Vector equation dependence on LM dofs
197  for (const auto qp : make_range(qrule_face.n_points()))
198  {
199  const auto qp_term = JxW_face[qp] * lm_sol[qp] * normals[qp];
200  for (const auto i : index_range(vector_re))
201  vector_re(i) -= _vector_phi_face[i][qp] * qp_term;
202  }
203 }
204 
205 void
207  const QBase & qrule_face,
208  const MooseArray<Point> & normals,
209  DenseMatrix<Number> & vector_lm_jac)
210 {
211  for (const auto qp : make_range(qrule_face.n_points()))
212  {
213  const auto qp_term = JxW_face[qp] * normals[qp];
214  // Vector equation dependence on LM dofs
215  for (const auto i : make_range(vector_lm_jac.m()))
216  {
217  const auto qpi_term = qp_term * _vector_phi_face[i][qp];
218  for (const auto j : make_range(vector_lm_jac.n()))
219  vector_lm_jac(i, j) -= qpi_term * _lm_phi_face[j][qp];
220  }
221  }
222 }
223 
224 void
226  const MooseArray<Number> & scalar_sol,
227  const MooseArray<Number> & lm_sol,
228  const MooseArray<Real> & JxW_face,
229  const QBase & qrule_face,
230  const MooseArray<Point> & normals,
231  DenseVector<Number> & scalar_re)
232 {
233  for (const auto qp : make_range(qrule_face.n_points()))
234  {
235  // vector
236  const auto vector_qp_term = JxW_face[qp] * _diff[qp] * (vector_sol[qp] * normals[qp]);
237  // stabilization term
238  const auto stab_qp_term = JxW_face[qp] * _tau * (normals[qp] * normals[qp]);
239  // scalar from stabilization term
240  const auto scalar_qp_term = stab_qp_term * scalar_sol[qp];
241  // lm from stabilization term
242  const auto lm_qp_term = stab_qp_term * lm_sol[qp];
243  for (const auto i : index_range(scalar_re))
244  scalar_re(i) += _scalar_phi_face[i][qp] * (scalar_qp_term - vector_qp_term - lm_qp_term);
245  }
246 }
247 
248 void
250  const QBase & qrule_face,
251  const MooseArray<Point> & normals,
252  DenseMatrix<Number> & scalar_vector_jac,
253  DenseMatrix<Number> & scalar_scalar_jac,
254  DenseMatrix<Number> & scalar_lm_jac)
255 {
256  for (const auto qp : make_range(qrule_face.n_points()))
257  {
258  const auto vector_qp_term = JxW_face[qp] * _diff[qp] * normals[qp];
259  const auto stab_qp_term = JxW_face[qp] * _tau * normals[qp] * normals[qp];
260 
261  for (const auto i : make_range(scalar_vector_jac.m()))
262  {
263  const auto vector_qpi_term = vector_qp_term * _scalar_phi_face[i][qp];
264  for (const auto j : make_range(scalar_vector_jac.n()))
265  scalar_vector_jac(i, j) -= vector_qpi_term * _vector_phi_face[j][qp];
266 
267  const auto scalar_qpi_term = stab_qp_term * _scalar_phi_face[i][qp];
268  for (const auto j : make_range(scalar_scalar_jac.n()))
269  scalar_scalar_jac(i, j) += scalar_qpi_term * _scalar_phi_face[j][qp];
270  for (const auto j : make_range(scalar_lm_jac.n()))
271  scalar_lm_jac(i, j) -= scalar_qpi_term * _lm_phi_face[j][qp];
272  }
273  }
274 }
275 
276 void
278  const MooseArray<Number> & scalar_sol,
279  const MooseArray<Number> & lm_sol,
280  const MooseArray<Real> & JxW_face,
281  const QBase & qrule_face,
282  const MooseArray<Point> & normals,
283  DenseVector<Number> & lm_re)
284 {
285  for (const auto qp : make_range(qrule_face.n_points()))
286  {
287  // vector
288  const auto vector_qp_term = JxW_face[qp] * _diff[qp] * (vector_sol[qp] * normals[qp]);
289  // stabilization term
290  const auto stab_qp_term = JxW_face[qp] * _tau * (normals[qp] * normals[qp]);
291  // scalar from stabilization term
292  const auto scalar_qp_term = stab_qp_term * scalar_sol[qp];
293  // lm from stabilization term
294  const auto lm_qp_term = stab_qp_term * lm_sol[qp];
295  for (const auto i : index_range(lm_re))
296  lm_re(i) += _lm_phi_face[i][qp] * (scalar_qp_term - vector_qp_term - lm_qp_term);
297  }
298 }
299 
300 void
302  const QBase & qrule_face,
303  const MooseArray<Point> & normals,
304  DenseMatrix<Number> & lm_vec_jac,
305  DenseMatrix<Number> & lm_scalar_jac,
306  DenseMatrix<Number> & lm_lm_jac)
307 {
308  for (const auto qp : make_range(qrule_face.n_points()))
309  {
310  const auto vector_qp_term = JxW_face[qp] * _diff[qp] * normals[qp];
311  const auto stab_qp_term = JxW_face[qp] * _tau * normals[qp] * normals[qp];
312 
313  for (const auto i : make_range(lm_vec_jac.m()))
314  {
315  const auto vector_qpi_term = vector_qp_term * _lm_phi_face[i][qp];
316  for (const auto j : make_range(lm_vec_jac.n()))
317  lm_vec_jac(i, j) -= vector_qpi_term * _vector_phi_face[j][qp];
318 
319  const auto lm_qpi_term = stab_qp_term * _lm_phi_face[i][qp];
320  for (const auto j : make_range(lm_scalar_jac.n()))
321  lm_scalar_jac(i, j) += lm_qpi_term * _scalar_phi_face[j][qp];
322  for (const auto j : make_range(lm_lm_jac.n()))
323  lm_lm_jac(i, j) -= lm_qpi_term * _lm_phi_face[j][qp];
324  }
325  }
326 }
327 
328 void
330  const MooseArray<Real> & JxW_face,
331  const QBase & qrule_face,
332  const MooseArray<Point> & normals,
333  const Elem * const current_elem,
334  const unsigned int current_side,
335  const MooseArray<Point> & q_point_face,
336  DenseVector<Number> & vector_re)
337 {
338  for (const auto qp : make_range(qrule_face.n_points()))
339  {
340  const auto scalar_value = dirichlet_value(
341  Moose::ElemSideQpArg{current_elem, current_side, qp, &qrule_face, q_point_face[qp]},
342  _ti.determineState());
343  const auto qp_term = JxW_face[qp] * normals[qp] * scalar_value;
344 
345  // External boundary -> Dirichlet faces -> Vector equation RHS
346  for (const auto i : index_range(_qu_dof_indices))
347  vector_re(i) -= qp_term * _vector_phi_face[i][qp];
348  }
349 }
350 
351 void
353  const MooseArray<Number> & scalar_sol,
354  const Moose::Functor<Real> & dirichlet_value,
355  const MooseArray<Real> & JxW_face,
356  const QBase & qrule_face,
357  const MooseArray<Point> & normals,
358  const Elem * const current_elem,
359  const unsigned int current_side,
360  const MooseArray<Point> & q_point_face,
361  DenseVector<Number> & scalar_re)
362 {
363  for (const auto qp : make_range(qrule_face.n_points()))
364  {
365  const auto scalar_value = dirichlet_value(
366  Moose::ElemSideQpArg{current_elem, current_side, qp, &qrule_face, q_point_face[qp]},
367  _ti.determineState());
368  const auto vector_qp_term = JxW_face[qp] * _diff[qp] * (vector_sol[qp] * normals[qp]);
369  const auto stab_qp_term = JxW_face[qp] * _tau * normals[qp] * normals[qp];
370  const auto scalar_qp_term = stab_qp_term * scalar_sol[qp];
371  const auto lm_qp_term = stab_qp_term * scalar_value;
372 
373  for (const auto i : index_range(_u_dof_indices))
374  scalar_re(i) += (scalar_qp_term - vector_qp_term - lm_qp_term) * _scalar_phi_face[i][qp];
375  }
376 }
377 
378 void
380  const QBase & qrule_face,
381  const MooseArray<Point> & normals,
382  DenseMatrix<Number> & scalar_vector_jac,
383  DenseMatrix<Number> & scalar_scalar_jac)
384 {
385  for (const auto qp : make_range(qrule_face.n_points()))
386  {
387  const auto vector_qp_term = JxW_face[qp] * _diff[qp] * normals[qp];
388  const auto scalar_qp_term = JxW_face[qp] * _tau * normals[qp] * normals[qp];
389  for (const auto i : index_range(_u_dof_indices))
390  {
391  const auto vector_qpi_term = vector_qp_term * _scalar_phi_face[i][qp];
392  for (const auto j : index_range(_qu_dof_indices))
393  scalar_vector_jac(i, j) -= vector_qpi_term * _vector_phi_face[j][qp];
394 
395  const auto scalar_qpi_term = scalar_qp_term * _scalar_phi_face[i][qp];
396  for (const auto j : index_range(_u_dof_indices))
397  scalar_scalar_jac(i, j) += scalar_qpi_term * _scalar_phi_face[j][qp];
398  }
399  }
400 }
401 
402 void
404  const QBase & qrule,
405  const MooseArray<std::vector<Real>> & phi,
406  const MooseArray<Number> & sol,
407  DenseVector<Number> & re)
408 {
409  for (const auto qp : make_range(qrule.n_points()))
410  {
411  const auto qp_term = JxW[qp] * sol[qp];
412  for (const auto i : index_range(phi))
413  re(i) -= phi[i][qp] * qp_term;
414  }
415 }
416 
417 void
419  const QBase & qrule,
420  const MooseArray<std::vector<Real>> & phi,
421  DenseMatrix<Number> & ke)
422 {
423  for (const auto qp : make_range(qrule.n_points()))
424  for (const auto i : index_range(phi))
425  {
426  const auto qpi_term = JxW[qp] * phi[i][qp];
427  for (const auto j : index_range(phi))
428  ke(i, j) -= phi[j][qp] * qpi_term;
429  }
430 }
const FEProblemBase & _dhah_fe_problem
A reference to the finite element problem used for coupling checks.
const MooseArray< std::vector< Real > > & _scalar_phi_face
const MooseArray< std::vector< Real > > & _scalar_phi
void scalarDirichletResidual(const MooseArray< Gradient > &vector_sol, const MooseArray< Number > &scalar_sol, const Moose::Functor< Real > &dirichlet_value, const MooseArray< Real > &JxW_face, const libMesh::QBase &qrule_face, const MooseArray< Point > &normals, const Elem *const current_elem, const unsigned int current_side, const MooseArray< Point > &q_point_face, DenseVector< Number > &scalar_re)
Weakly imposes a Dirichlet condition for the scalar field in the scalar field equation.
const MooseArray< std::vector< Real > > & _div_vector_phi
void vectorVolumeJacobian(const MooseArray< Real > &JxW, const libMesh::QBase &qrule, DenseMatrix< Number > &vector_vector_jac, DenseMatrix< Number > &vector_scalar_jac)
Computes a local Jacobian matrix for the weak form: (q, v) + (u, div(v)) where q is the vector field ...
const std::vector< dof_id_type > & _u_dof_indices
void vectorFaceResidual(const MooseArray< Number > &lm_sol, const MooseArray< Real > &JxW_face, const libMesh::QBase &qrule_face, const MooseArray< Point > &normals, DenseVector< Number > &vector_re)
Computes a local residual vector for the weak form: -<{u}, n*v> where {u} is the trace of the scalar ...
const MooseArray< std::vector< Real > > & _lm_phi_face
Moose::StateArg determineState() const
Create a functor state argument that corresponds to the implicit state of this object.
This is a wrapper that forwards calls to the implementation, which can be switched out at any time wi...
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
const MooseArray< std::vector< RealVectorValue > > & _grad_scalar_phi
unsigned int m() const
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
Base class for a system (of equations)
Definition: SystemBase.h:84
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
InputParameters emptyInputParameters()
An interface for accessing Moose::Functors for systems that care about automatic differentiation, e.g.
const libMesh::CouplingMatrix * couplingMatrix(const unsigned int nl_sys_num) const override
The coupling matrix defining what blocks exist in the preconditioning matrix.
const std::vector< dof_id_type > & _qu_dof_indices
virtual const std::string & name() const
Definition: SystemBase.C:1330
Interface for objects that needs transient capabilities.
const SystemBase & _dhah_sys
A reference to the nonlinear system used for coupling checks.
void scalarDirichletJacobian(const MooseArray< Real > &JxW_face, const libMesh::QBase &qrule_face, const MooseArray< Point > &normals, DenseMatrix< Number > &scalar_vector_jac, DenseMatrix< Number > &scalar_scalar_jac)
Computes the Jacobian for a Dirichlet condition for the scalar field in the scalar field equation...
Every object that can be built by the factory should be derived from this class.
Definition: MooseObject.h:28
void vectorVolumeResidual(const MooseArray< Gradient > &vector_sol, const MooseArray< Number > &scalar_sol, const MooseArray< Real > &JxW, const libMesh::QBase &qrule, DenseVector< Number > &vector_re)
Computes a local residual vector for the weak form: (q, v) + (u, div(v)) where q is the vector field ...
static InputParameters validParams()
void scalarFaceJacobian(const MooseArray< Real > &JxW_face, const libMesh::QBase &qrule_face, const MooseArray< Point > &normals, DenseMatrix< Number > &scalar_vector_jac, DenseMatrix< Number > &scalar_scalar_jac, DenseMatrix< Number > &scalar_lm_jac)
Computes a local Jacobian matrix for the weak form: -<Dq*n, w> + < * (u - {u}) * n * n...
void lmFaceJacobian(const MooseArray< Real > &JxW_face, const libMesh::QBase &qrule_face, const MooseArray< Point > &normals, DenseMatrix< Number > &lm_vec_jac, DenseMatrix< Number > &lm_scalar_jac, DenseMatrix< Number > &lm_lm_jac)
Computes a local Jacobian matrix for the weak form: -<Dq*n, > + < * (u - {u}) * n * n...
void lmFaceResidual(const MooseArray< Gradient > &vector_sol, const MooseArray< Number > &scalar_sol, const MooseArray< Number > &lm_sol, const MooseArray< Real > &JxW_face, const libMesh::QBase &qrule_face, const MooseArray< Point > &normals, DenseVector< Number > &lm_re)
Computes a local residual vector for the weak form: -<Dq*n, > + < * (u - {u}) * n * n...
unsigned int n_points() const
Argument for requesting functor evaluation at a quadrature point location in an element.
Moose::CouplingType coupling() const
unsigned int number() const
Gets the number of this system.
Definition: SystemBase.C:1159
void vectorDirichletResidual(const Moose::Functor< Real > &dirichlet_value, const MooseArray< Real > &JxW_face, const libMesh::QBase &qrule_face, const MooseArray< Point > &normals, const Elem *const current_elem, const unsigned int current_side, const MooseArray< Point > &q_point_face, DenseVector< Number > &vector_re)
Weakly imposes a Dirichlet condition for the scalar field in the vector (gradient) equation...
const MaterialProperty< Real > & _diff
The diffusivity.
void scalarVolumeResidual(const MooseArray< Gradient > &vector_field, const Moose::Functor< Real > &source, const MooseArray< Real > &JxW, const libMesh::QBase &qrule, const Elem *const current_elem, const MooseArray< Point > &q_point, DenseVector< Number > &scalar_re)
Computes a local residual vector for the weak form: (Dq, grad(w)) - (f, w) where D is the diffusivity...
void vectorFaceJacobian(const MooseArray< Real > &JxW_face, const libMesh::QBase &qrule_face, const MooseArray< Point > &normals, DenseMatrix< Number > &vector_lm_jac)
Computes a local Jacobian matrix for the weak form: -<{u}, n*v> where {u} is the trace of the scalar ...
const TransientInterface & _ti
Reference to transient interface.
const MooseVariableFE< Real > & _u_face_var
forward declarations
void addMooseVariableDependency(MooseVariableFieldBase *var)
Call this function to add the passed in MooseVariableFieldBase as a variable that this object depends...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Real _tau
Our stabilization coefficient.
An interface for accessing Materials.
const MooseObject & _moose_obj
A reference to our associated MooseObject for error reporting.
void createIdentityResidual(const MooseArray< Real > &JxW, const libMesh::QBase &qrule, const MooseArray< std::vector< Real >> &phi, const MooseArray< Number > &sol, DenseVector< Number > &re)
Creates residuals corresponding to the weak form (v, {u}), or stated simply this routine can be used ...
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
void scalarVolumeJacobian(const MooseArray< Real > &JxW, const libMesh::QBase &qrule, DenseMatrix< Number > &scalar_vector_jac)
Computes a local Jacobian matrix for the weak form: (Dq, grad(w)) - (f, w) where D is the diffusivity...
const MooseArray< std::vector< RealVectorValue > > & _vector_phi
const MooseVariableFE< RealVectorValue > & _grad_u_var
void scalarFaceResidual(const MooseArray< Gradient > &vector_sol, const MooseArray< Number > &scalar_sol, const MooseArray< Number > &lm_sol, const MooseArray< Real > &JxW_face, const libMesh::QBase &qrule_face, const MooseArray< Point > &normals, DenseVector< Number > &scalar_re)
Computes a local residual vector for the weak form: -<Dq*n, w> + < * (u - {u}) * n * n...
unsigned int n() const
void createIdentityJacobian(const MooseArray< Real > &JxW, const libMesh::QBase &qrule, const MooseArray< std::vector< Real >> &phi, DenseMatrix< Number > &ke)
As above, but for the Jacobians.
const MooseArray< std::vector< RealVectorValue > > & _vector_phi_face
DiffusionLHDGAssemblyHelper(const MooseObject *const moose_obj, MaterialPropertyInterface *const mpi, MooseVariableDependencyInterface *const mvdi, const TransientInterface *const ti, const FEProblemBase &fe_problem, SystemBase &sys, const THREAD_ID tid)
auto index_range(const T &sizable)
Argument for requesting functor evaluation at quadrature point locations on an element side...
unsigned int THREAD_ID
Definition: MooseTypes.h:209