20 #include "libmesh/numeric_vector.h" 21 #include "libmesh/dof_map.h" 22 #include "libmesh/quadrature.h" 23 #include "libmesh/boundary_info.h" 25 template <
typename ComputeValueType>
39 template <
typename ComputeValueType>
44 parameters.getCheckedPointerParam<
SystemBase *>(
"_sys")
46 parameters.
get<AuxVariableName>(
"variable"))
56 _var(_aux_sys.getActualFieldVariable<ComputeValueType>(
57 _tid, parameters.
get<AuxVariableName>(
"variable"))),
58 _nodal(_var.isNodal()),
59 _u(_nodal ? _var.nodalValueArray() : _var.sln()),
61 _test(_bnd ? _var.phiFace() : _var.phi()),
62 _q_point(_bnd ? _assembly.qPointsFace() : _assembly.qPoints()),
63 _qrule(_bnd ? _assembly.qRuleFace() : _assembly.qRule()),
64 _JxW(_bnd ? _assembly.JxWFace() : _assembly.JxW()),
65 _coord(_assembly.coordTransformation()),
67 _current_elem(_assembly.elem()),
68 _current_side(_assembly.side()),
69 _current_elem_volume(_assembly.elemVolume()),
70 _current_side_volume(_assembly.sideElemVolume()),
72 _current_node(_assembly.node()),
73 _current_boundary_id(_assembly.currentBoundaryID()),
74 _solution(_aux_sys.solution()),
76 _current_lower_d_elem(_assembly.lowerDElem())
80 template <
typename ComputeValueType>
84 auto var = getVar(var_name, comp);
88 ": Unable to couple time derivative of an auxiliary variable into the auxiliary system.");
93 template <
typename ComputeValueType>
96 unsigned int comp)
const 98 auto var = getVar(var_name, comp);
102 ": Unable to couple time derivative of an auxiliary variable into the auxiliary system.");
112 "Should only be calling setDofValue if there is one dof for the aux var");
123 template <
typename ComputeValueType>
127 if (_coincident_lower_d_calc)
128 _var.insertLower(_aux_sys.solution());
130 _var.insert(_aux_sys.solution());
133 template <
typename ComputeValueType>
141 mooseAssert(!_coincident_lower_d_calc,
142 "Nodal evaluations are point evaluations. We don't have to concern ourselves with " 143 "coincidence of lower-d blocks and higher-d faces because they share nodes");
144 if (_var.isNodalDefined())
147 ComputeValueType
value = computeValue();
149 _var.setNodalValue(
value);
154 _n_shapes = _coincident_lower_d_calc ? _var.dofIndicesLower().size() : _var.numberOfDofs();
156 if (_coincident_lower_d_calc)
158 static const std::string lower_error =
"Make sure that the lower-d variable lives on a " 159 "lower-d block that is a superset of the boundary";
160 if (!_current_lower_d_elem)
161 mooseError(
"No lower-dimensional element. ", lower_error);
163 mooseError(
"No degrees of freedom. ", lower_error);
168 ComputeValueType
value = 0;
169 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
170 value += _JxW[_qp] * _coord[_qp] * computeValue();
171 value /= (_bnd ? _current_side_volume : _current_elem_volume);
173 setDofValueHelper(
value);
179 if (_coincident_lower_d_calc)
181 _local_sol.resize(1);
182 if constexpr (std::is_same<Real, ComputeValueType>::value)
183 _local_sol(0) =
value;
185 mooseAssert(
false,
"We should not enter the single dof branch with a vector variable");
186 _var.setLowerDofValues(_local_sol);
189 _var.setNodalValue(
value);
194 _local_re.resize(_n_shapes);
196 _local_ke.resize(_n_shapes, _n_shapes);
199 const auto & test = _coincident_lower_d_calc ? _var.phiLower() : _test;
202 for (
unsigned int i = 0; i < test.size(); i++)
203 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
205 ComputeValueType t = _JxW[_qp] * _coord[_qp] * test[i][_qp];
206 _local_re(i) += t * computeValue();
207 for (
unsigned int j = 0; j < test.size(); j++)
208 _local_ke(i, j) += t * test[j][_qp];
211 _local_sol.resize(_n_shapes);
213 _local_ke.svd_solve(_local_re, _local_sol);
215 _local_ke.cholesky_solve(_local_re, _local_sol);
217 _coincident_lower_d_calc ? _var.setLowerDofValues(_local_sol) : _var.setDofValues(_local_sol);
230 if (_var.isNodalDefined())
235 _var.setNodalValue(
value);
241 _var.numberOfDofs() % _var.count() == 0,
242 "The number of degrees of freedom should be cleanly divisible by the variable count");
243 _n_shapes = _var.numberOfDofs() / _var.count();
247 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
248 value += _JxW[_qp] * _coord[_qp] * computeValue();
249 value /= (_bnd ? _current_side_volume : _current_elem_volume);
253 _var.setNodalValue(
value);
257 _local_re.resize(_n_shapes);
258 for (
unsigned int i = 0; i < _local_re.size(); ++i)
259 _local_re(i) = RealEigenVector::Zero(_var.count());
260 _local_ke.resize(_n_shapes, _n_shapes);
264 for (
unsigned int i = 0; i < _test.size(); i++)
265 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
267 Real t = _JxW[_qp] * _coord[_qp] * _test[i][_qp];
268 _local_re(i) += t * computeValue();
269 for (
unsigned int j = 0; j < _test.size(); j++)
270 _local_ke(i, j) += t * _test[j][_qp];
274 _local_sol.resize(_n_shapes);
275 for (
unsigned int i = 0; i < _local_re.size(); ++i)
276 _local_sol(i) = RealEigenVector::Zero(_var.count());
279 for (
unsigned int i = 0; i < _var.count(); ++i)
281 for (
unsigned int j = 0; j < _n_shapes; ++j)
282 re(j) = _local_re(j)(i);
285 _local_ke.svd_solve(re, sol);
287 _local_ke.cholesky_solve(re, sol);
289 for (
unsigned int j = 0; j < _n_shapes; ++j)
290 _local_sol(j)(i) = sol(j);
293 _var.setDofValues(_local_sol);
298 template <
typename ComputeValueType>
302 if (_sys.solutionStatesInitialized())
303 mooseError(
"The solution states have already been initialized when calling ",
306 "Make sure to call uOld() within the object constructor.");
308 return _nodal ? _var.nodalValueOldArray() : _var.slnOld();
311 template <
typename ComputeValueType>
315 if (_sys.solutionStatesInitialized())
316 mooseError(
"The solution states have already been initialized when calling ",
319 "Make sure to call uOlder() within the object constructor.");
321 return _nodal ? _var.nodalValueOlderArray() : _var.slnOlder();
324 template <
typename ComputeValueType>
std::string name(const ElemQuality q)
Base class for auxiliary kernels.
const OutputTools< ComputeValueType >::VariableValue & uOlder() const
Retrieves the older value of the variable that this AuxKernel operates on.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
virtual void compute() override
Computes the value and stores it in the solution vector.
virtual const VariableValue & coupledDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled variable.
Base class for a system (of equations)
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
unsigned int _n_shapes
number of shape functions for the finite element type and current DofObject
VarKindType
Framework-wide stuff.
AuxKernelTempl(const InputParameters ¶meters)
virtual const OutputTools< ComputeValueType >::VariableValue & value()
The value of the variable this object is operating on.
Base class for creating new nodally-based mortar auxiliary kernels.
virtual const VariableValue & coupledDot(const std::string &var_name, unsigned int comp=0) const override
Time derivative of a coupled variable.
static InputParameters validParams()
OutputTools< Real >::VariableValue VariableValue
virtual const VariableValue & coupledDotDu(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled variable with respect to the coefficients.
const OutputTools< ComputeValueType >::VariableValue & uOld() const
Retrieves the old value of the variable that this AuxKernel operates on.
void insert()
Insert the just computed values into the auxiliary solution vector.
MooseVariableField< ComputeValueType > & _var
This is a regular kernel so we cast to a regular MooseVariable, hides base _var.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void setDofValue(const DofValue &value, unsigned int index)=0
Degree of freedom value setters.
Interface for objects that need to get values of MooseVariables.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
static InputParameters validParams()
Eigen::Matrix< Real, Eigen::Dynamic, 1 > RealEigenVector
Base class for creating new auxiliary kernels and auxiliary boundary conditions.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
virtual const VariableValue & coupledDotDu(const std::string &var_name, unsigned int comp=0) const override
Time derivative of a coupled variable with respect to the coefficients.
void setDofValueHelper(const ComputeValueType &dof_value)
Currently only used when the auxiliary variable is a finite volume variable, this helps call through ...
const Elem & get(const ElemType type_in)