17#include "libmesh/tensor_tools.h"
18#include "libmesh/vector_value.h"
19#include "libmesh/tensor_value.h"
20#include "libmesh/type_n_tensor.h"
21#include "libmesh/enum_fe_family.h"
22#include "libmesh/fe_type.h"
48template <
typename OutputType>
97 const QBase *
const & qrule_in,
98 const QBase *
const & qrule_face_in,
100 const Elem *
const & elem);
128 template <
bool constant_monomial>
129 void computeAD(
const unsigned int num_dofs,
const unsigned int nqp);
397 void getDofIndices(
const Elem * elem, std::vector<dof_id_type> & dof_indices)
const;
421 void reinitNodes(
const std::vector<dof_id_type> & nodes);
485 template <
bool constant_monomial>
488 template <
bool constant_monomial,
489 typename DestinationType,
491 typename DofValuesType>
492 void fill(DestinationType & dest,
494 const DofValuesType & dof_values,
496 std::size_t num_shapes);
651 std::function<const typename OutputTools<OutputType>::VariablePhiValue &(
const Assembly &,
654 std::function<const typename OutputTools<OutputShape>::VariablePhiValue &(
const Assembly &,
658 std::function<const typename OutputTools<OutputShape>::VariablePhiGradient &(
const Assembly &,
661 std::function<const typename OutputTools<OutputShape>::VariablePhiGradient &(
const Assembly &,
665 std::function<const typename OutputTools<OutputShape>::VariablePhiSecond &(
const Assembly &,
668 std::function<const typename OutputTools<OutputShape>::VariablePhiSecond &(
const Assembly &,
672 std::function<const typename OutputTools<OutputShape>::VariablePhiCurl &(
const Assembly &,
675 std::function<const typename OutputTools<OutputShape>::VariablePhiCurl &(
const Assembly &,
679 std::function<const typename OutputTools<OutputShape>::VariablePhiDivergence &(
const Assembly &,
683 std::function<const typename OutputTools<OutputShape>::VariablePhiDivergence &(
const Assembly &,
687 std::function<const ADTemplateVariablePhiGradient<OutputShape> &(
const Assembly &,
690 std::function<const ADTemplateVariablePhiGradient<OutputShape> &(
const Assembly &,
770template <
typename OutputType>
775 return _ad_dof_values;
778template <
typename OutputType>
782 _need_ad = _need_ad_u_dot =
true;
783 if (!_time_integrator)
789template <
typename OutputType>
794 return _ad_nodal_value;
797template <
typename OutputType>
801 _need_ad = _need_ad_u_dot =
true;
803 if (!_time_integrator)
813template <
typename OutputType>
817 _need_ad = _need_ad_u_dotdot =
true;
819 if (!_time_integrator)
824 _need_u_dotdot =
true;
829template <
typename OutputType>
835 mooseAssert(_ad_grad_phi,
"this should be non-null");
836 return *_ad_grad_phi;
839template <
typename OutputType>
845 mooseAssert(_ad_grad_phi_face,
"this should be non-null");
846 return *_ad_grad_phi_face;
DualNumber< Real, DNDerivativeType, true > ADReal
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
OutputTools< Real >::VariableValue VariableValue
typename OutputTools< typename Moose::ADType< T >::type >::VariableSecond ADTemplateVariableSecond
typename OutputTools< typename Moose::ADType< T >::type >::VariableValue ADTemplateVariableValue
std::vector< std::vector< Eigen::Map< RealDIMValue > > > MappedArrayVariablePhiGradient
typename OutputTools< typename Moose::ADType< T >::type >::VariablePhiGradient ADTemplateVariablePhiGradient
typename OutputTools< typename Moose::ADType< T >::type >::VariableCurl ADTemplateVariableCurl
typename OutputTools< typename Moose::ADType< T >::type >::VariableGradient ADTemplateVariableGradient
std::array< Real, 2 > values
ShapeType
Users of this template class must specify the type of shape functions that will be used in the Jacobi...
Keeps track of stuff related to assembling.
unsigned int size() const
The number of elements that can currently be stored in the array.
OutputType _nodal_value_dotdot
nodal values of u_dotdot
MooseArray< OutputGradient > FieldVariableGradient
std::vector< dof_id_type > _dof_indices
The dof indices for the current element.
OutputType _nodal_value_dot_old
nodal values of u_dot_old
bool _need_dof_values_dot
local solution flags
std::vector< FieldVariableValue > _vector_tag_u
TagID _previous_nl_solution_tag
The vector tag ID corresponding to the previous nonlinear iteration's solution vector.
bool _need_u_dot
u dot flags
DofValues _dof_values_dotdot
second time derivative of the solution values
TagID _old_solution_tag
The vector tag ID corresponding to the old solution vector.
SystemBase & _sys
The MOOSE system which ultimately holds the vectors and matrices relevant to this variable data.
std::vector< FieldVariableValue > _matrix_tag_u
bool _need_dof_du_dotdot_du
std::vector< bool > _need_matrix_tag_u
Moose::DOFType< OutputType >::type DofValue
void fetchDofValues()
Helper methods for assigning dof values from their corresponding solution values.
const libMesh::DofMap & _dof_map
The degree of freedom map from libMesh.
OutputType _nodal_value_dotdot_old
nodal values of u_dotdot_old
std::vector< DofValues > _vector_tags_dof_u
libMesh::TensorTools::DecrementRank< OutputType >::type OutputDivergence
TagID _solution_tag
The vector tag ID corresponding to the solution vector.
bool _need_dof_values_dotdot_old
std::vector< bool > _need_matrix_tag_dof_u
std::vector< DofValues > _matrix_tags_dof_u
bool _need_dof_values_dotdot
TagID _older_solution_tag
The vector tag ID corresponding to the older solution vector.
std::vector< bool > _need_vector_tag_u
DofValues _dof_values_dot_old
the previous time step's solution value time derivative
MooseArray< OutputType > FieldVariableValue
DofValues _dof_values_dot
time derivative of the solution values
MooseArray< libMesh::Number > _dof_du_dotdot_du
derivatives of the solution value second time derivative with respect to the degrees of freedom
std::vector< FieldVariableGradient > _vector_tag_grad
Moose::ADType< DofValue >::type ADDofValue
MooseArray< DofValue > DofValues
DofValues _dof_values_dotdot_old
the previous time step's solution value second time derivative
virtual const MooseVariableField< OutputType > & var() const
bool _need_dof_values_dot_old
MooseArray< ADDofValue > ADDofValues
std::set< TagID > _required_vector_tags
The set of vector tags (residual + solution) we need to evaluate.
const THREAD_ID _tid
The thread ID that this object is on.
std::vector< bool > _need_vector_tag_dof_u
bool _need_grad_dot
gradient dot flags
unsigned int _count
Number of components of the associated variable.
OutputType _nodal_value_dot
nodal values of u_dot
const SubProblem & _subproblem
The subproblem which we can query for information related to tagged vectors and matrices.
bool _has_dof_values
Whether we currently have degree of freedom values stored in our local containers (corresponding to t...
MooseArray< libMesh::Number > _dof_du_dot_du
derivatives of the solution value time derivative with respect to the degrees of freedom
std::vector< bool > _need_vector_tag_grad
const VariableValue & duDotDu() const
const ADTemplateVariablePhiGradient< OutputShape > & adGradPhiFace() const
ad_grad_phi_face getter
MooseArray< std::vector< OutputShapeDivergence > > FieldVariableTestDivergence
const OutputType & nodalValueDotDot() const
void setGeometry(Moose::GeometryType gm_type)
Set the geometry type before calculating variables values.
VariableValue _du_dotdot_du
derivative of u_dotdot wrt u
std::function< const typename OutputTools< OutputShape >::VariablePhiSecond &(const Assembly &, libMesh::FEType)> _second_phi_assembly_method
MooseArray< std::vector< OutputShapeSecond > > FieldVariableTestSecond
bool _need_curl
curl flags
const OutputType & nodalValueDot() const
const FieldVariableDivergence & divSln(Moose::SolutionState state) const
Local solution divergence getter.
void reinitNode()
Prepare degrees of freedom for the current node.
bool _need_second_previous_nl
FieldVariableCurl _curl_u
curl_u
bool usesSecondPhi() const
Whether or not this variable is computing any second derivatives.
const FieldVariableCurl & curlSln(Moose::SolutionState state) const
Local solution curl getter.
const FieldVariablePhiSecond * _second_phi_face
const libMesh::FEType & _fe_type
const FieldVariablePhiDivergence & divPhiFace() const
divergence_phi_face getter
const FieldVariablePhiCurl & curlPhi() const
curl_phi getter
void setDofValue(const DofValue &value, unsigned int index)
dof value setters
const ADTemplateVariableValue< OutputType > & adUDot() const
const FieldVariableGradient & gradSlnDotDot() const
Local second time derivative of solution gradient getter.
void reinitNodes(const std::vector< dof_id_type > &nodes)
Set _dof_indices to the degrees of freedom existing on the passed-in nodes.
const FieldVariableValue & uDotDot() const
void computeConstantMonomialValues()
compute the values for const monomial variables
std::function< const typename OutputTools< OutputShape >::VariablePhiSecond &(const Assembly &, libMesh::FEType)> _second_phi_face_assembly_method
ADTemplateVariableGradient< OutputType > _ad_grad_u_dot
FieldVariableGradient _grad_u_dot
grad_u dots
MooseArray< std::vector< OutputShapeSecond > > FieldVariablePhiSecond
const FieldVariablePhiCurl * _curl_phi_face
std::function< const typename OutputTools< OutputShape >::VariablePhiDivergence &(const Assembly &, libMesh::FEType)> _div_phi_face_assembly_method
ADTemplateVariableSecond< OutputType > _ad_second_u
bool computingDiv() const
Whether or not this variable is computing the divergence.
const FieldVariablePhiValue & phi() const
phi getter
const FieldVariableGradient & gradSlnDot() const
Local time derivative of solution gradient getter.
MappedArrayVariablePhiGradient _mapped_grad_phi
std::function< const typename OutputTools< OutputShape >::VariablePhiCurl &(const Assembly &, libMesh::FEType)> _curl_phi_face_assembly_method
std::size_t phiSize() const
Return phi size.
const FieldVariableValue & uDotOld() const
const FieldVariablePhiGradient * _grad_phi_face
void computeIncrementAtQps(const libMesh::NumericVector< libMesh::Number > &increment_vec)
Compute and store incremental change in solution at QPs based on increment_vec.
const QBase *const & _qrule
The current qrule.
const FieldVariablePhiGradient & gradPhiFace() const
grad_phi_face getter
MooseArray< std::vector< OutputShape > > FieldVariableTestValue
bool _need_second
SolutionState second_u flags.
libMesh::TensorTools::DecrementRank< OutputShape >::type OutputShapeDivergence
void computeIncrementAtNode(const libMesh::NumericVector< libMesh::Number > &increment_vec)
Compute and store incremental change at the current node based on increment_vec.
Moose::ShapeType< OutputType >::type OutputShape
FieldVariableSecond _second_u_previous_nl
MooseArray< std::vector< OutputShape > > FieldVariablePhiValue
Moose::ADType< OutputType >::type _ad_nodal_value
AD nodal value.
FieldVariableValue _u_dot_old
u_dot_old (time derivative)
const dof_id_type & nodalDofIndex() const
const ADTemplateVariableCurl< OutputType > & adCurlSln() const
const OutputType & nodalValueDuDotDu() const
const FieldVariablePhiGradient * _current_grad_phi
std::size_t phiFaceSize() const
Return phiFace size.
const ADTemplateVariableGradient< OutputType > & adGradSlnDot() const
std::function< const ADTemplateVariablePhiGradient< OutputShape > &(const Assembly &, libMesh::FEType)> _ad_grad_phi_assembly_method
FieldVariableDivergence _div_u
divergence_u
DofValue getNodalValue(const Node &node, Moose::SolutionState state) const
const FieldVariablePhiGradient & gradPhi() const
grad_phi getter
const FieldVariablePhiSecond * _second_phi
const ADDofValues & adDofValues() const
Return the AD dof values.
const Moose::ADType< OutputType >::type & adNodalValue() const
bool needsAD() const
Returns whether this data structure needs automatic differentiation calculations.
bool hasDoFsOnNodes() const override
Whether this data is associated with a variable that has DoFs on nodes.
bool _is_nodal
if variable is nodal
const MooseVariableFE< OutputType > & _var
A const reference to the owning MooseVariableFE object.
FieldVariableValue _u_dot
u_dot (time derivative)
MooseArray< ADRealEigenVector > _ad_dofs_dot_eigen
const QBase * _current_qrule
const FieldVariablePhiValue * _phi
const DofValues & dofValuesDot() const
std::function< const typename OutputTools< OutputShape >::VariablePhiGradient &(const Assembly &, libMesh::FEType)> _grad_phi_assembly_method
FieldVariableDivergence _div_u_old
const FieldVariablePhiValue * _phi_face
void computeNodalValues()
compute nodal things
MooseArray< std::vector< OutputShapeGradient > > FieldVariablePhiGradient
ADReal _ad_zero
A zero AD variable.
const VariableValue & duDotDotDu() const
void computeValuesInternal()
Internal method for computeValues() and computeConstantMonomialValues()
MooseArray< std::vector< OutputShape > > FieldVariablePhiCurl
const unsigned int _var_num
const FieldVariablePhiGradient * _grad_phi
const ADTemplateVariablePhiGradient< OutputShape > * _ad_grad_phi
MooseArray< std::vector< OutputShapeDivergence > > FieldVariablePhiDivergence
ADTemplateVariableGradient< OutputType > _ad_grad_u
FieldVariableSecond _second_u
second_u
const ADTemplateVariableSecond< OutputType > & adSecondSln() const
MooseArray< OutputSecond > FieldVariableSecond
const unsigned int & currentSide() const
The current side.
const FieldVariablePhiSecond & secondPhi() const
second_phi getter
const FieldVariablePhiCurl * _curl_phi
const ADTemplateVariablePhiGradient< OutputShape > * _current_ad_grad_phi
std::function< const typename OutputTools< OutputShape >::VariablePhiCurl &(const Assembly &, libMesh::FEType)> _curl_phi_assembly_method
FieldVariableCurl _curl_u_old
const MappedArrayVariablePhiGradient & arrayGradPhi() const
mapped_grad_phi getter
const ADTemplateVariablePhiGradient< OutputShape > * _ad_grad_phi_face
FieldVariableValue _u_dotdot
u_dotdot (second time derivative)
void getDofIndices(const Elem *elem, std::vector< dof_id_type > &dof_indices) const
const FieldVariablePhiDivergence & divPhi() const
divergence_phi getter
const QBase *const & _qrule_face
ADTemplateVariableCurl< OutputType > _ad_curl_u
const FieldVariableSecond & secondSln(Moose::SolutionState state) const
Local solution second spatial derivative getter.
bool computingCurl() const
Whether or not this variable is computing the curl.
const FieldVariablePhiSecond * _current_second_phi
void setDofValues(const DenseVector< DofValue > &values)
Set local DOF values and evaluate the values on quadrature points.
const FieldVariableValue & uDotDotOld() const
const MappedArrayVariablePhiGradient & arrayGradPhiFace() const
mapped_grad_phi_face getter
void addSolution(libMesh::NumericVector< libMesh::Number > &sol, const DenseVector< libMesh::Number > &v) const
Add passed in local DOF values to a solution vector.
MappedArrayVariablePhiGradient _mapped_grad_phi_neighbor
const FieldVariableValue & increment() const
Increment getter.
const FieldVariableValue & uDot() const
ADReal _ad_real_dummy
A dummy ADReal variable.
bool isNodal() const override
ADTemplateVariableValue< OutputType > _ad_u_dot
const OutputType & nodalValueDuDotDotDu() const
ADDofValues _ad_dof_values
FieldVariableSecond _second_u_old
void prepare()
Get the dof indices corresponding to the current element.
bool isNodalDefined() const
std::function< const typename OutputTools< OutputShape >::VariablePhiGradient &(const Assembly &, libMesh::FEType)> _grad_phi_face_assembly_method
FieldVariableDivergence _div_u_older
ADTemplateVariableValue< OutputType > _ad_u
AD u.
std::function< const ADTemplateVariablePhiGradient< OutputShape > &(const Assembly &, libMesh::FEType)> _ad_grad_phi_face_assembly_method
FieldVariableValue _increment
Increment in the variable used in dampers.
const Elem *const & _elem
The current elem.
const MooseArray< libMesh::Number > & dofValuesDuDotDu() const
void prepareIC()
prepare the initial condition
const ADTemplateVariableValue< OutputType > & adSln() const
const bool _displaced
Whether this variable is being calculated on a displaced system.
MooseArray< ADRealEigenVector > _ad_dofs_dotdot_eigen
void fill(DestinationType &dest, const ShapeType &phi, const DofValuesType &dof_values, unsigned int nqp, std::size_t num_shapes)
MooseArray< std::vector< OutputShapeGradient > > FieldVariableTestGradient
FieldVariableSecond _second_u_older
MappedArrayVariablePhiGradient _mapped_grad_phi_face_neighbor
const Node *const & _node
The current node.
std::function< const typename OutputTools< OutputShape >::VariablePhiDivergence &(const Assembly &, libMesh::FEType)> _div_phi_assembly_method
const OutputType & nodalValueDotOld() const
MappedArrayVariablePhiGradient _mapped_grad_phi_face
void fetchADDofValues()
Helper method for assigning the ad_dof* arrays.
void assignADNodalValue()
Helper method for assigning nodal values from their corresponding solution values (dof values as they...
const FieldVariablePhiCurl * _current_curl_phi
const TimeIntegrator * _time_integrator
Pointer to time integrator.
void computeValues()
compute the variable values
const FieldVariablePhiDivergence * _current_div_phi
const unsigned int & _current_side
The current element side.
void reinitAux()
Prepare dof indices and solution values for elemental auxiliary variables.
const FieldVariablePhiDivergence * _div_phi
const Elem *const & currentElem() const
The current element.
ADTemplateVariableValue< OutputType > _ad_u_dotdot
DofValue getElementalValue(const Elem *elem, Moose::SolutionState state, unsigned int idx=0) const
const ADTemplateVariablePhiGradient< OutputShape > & adGradPhi() const
ad_grad_phi getter
const Assembly & _assembly
Moose::ElementType _element_type
The element type this object is storing data for. This is either Element, Neighbor,...
const ADTemplateVariableGradient< OutputType > & adGradSln() const
libMesh::TensorTools::IncrementRank< OutputShape >::type OutputShapeGradient
bool _need_div
divergence flags
void insertNodalValue(libMesh::NumericVector< libMesh::Number > &residual, const DofValue &v)
Write a nodal value to the passed-in solution vector.
libMesh::FEContinuity _continuity
Continuity type of the variable.
unsigned int numberOfDofs() const
const Node *const & node() const
const FieldVariablePhiCurl & curlPhiFace() const
curl_phi_face getter
const FieldVariablePhiDivergence * _div_phi_face
const ADTemplateVariableValue< OutputType > & adUDotDot() const
const FieldVariablePhiSecond & secondPhiFace() const
second_phi_face getter
const DofValues & dofValuesDotDotOld() const
ADDofValues _ad_dofs_dotdot
FieldVariableValue _u_dotdot_old
u_dotdot_old (second time derivative)
const OutputType & nodalValueDotDotOld() const
const FieldVariablePhiValue * _current_phi
const DofValues & dofValuesDotOld() const
const std::vector< dof_id_type > & dofIndices() const
VariableValue _du_dot_du
derivative of u_dot wrt u
MooseArray< OutputType > FieldVariableCurl
const FieldVariablePhiValue & phiFace() const
phi_face getter
libMesh::TensorTools::IncrementRank< OutputShapeGradient >::type OutputShapeSecond
std::function< const typename OutputTools< OutputShape >::VariablePhiValue &(const Assembly &, libMesh::FEType)> _phi_face_assembly_method
void computeAD(const unsigned int num_dofs, const unsigned int nqp)
compute AD things
libMesh::FEContinuity getContinuity() const override
Return the variable continuity.
MooseArray< std::vector< OutputShape > > FieldVariableTestCurl
const ADDofValues & adDofValuesDot() const
Return the AD time derivative values of degrees of freedom.
MooseArray< OutputDivergence > FieldVariableDivergence
const DofValues & dofValuesDotDot() const
const MooseArray< libMesh::Number > & dofValuesDuDotDotDu() const
dof_id_type _nodal_dof_index
The dof index for the current node.
std::function< const typename OutputTools< OutputType >::VariablePhiValue &(const Assembly &, libMesh::FEType)> _phi_assembly_method
FieldVariableCurl _curl_u_older
FieldVariableGradient _grad_u_dotdot
Class for stuff related to variables.
Generic class for solving transient nonlinear problems.
Base class for a system (of equations)
Base class for time integrators.
std::string stringify(const T &t)
conversion to string
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...