20#include "libmesh/libmesh_common.h"
21#include "libmesh/quadrature.h"
28 if (std::is_same<T, Real>::value)
30 else if (std::is_same<T, RealVectorValue>::value)
33 ::mooseError(
"unsupported DiracKernelTempl specialization");
43 Moose::VarKindType::VAR_SOLVER,
44 std::is_same<T, Real>::value ?
Moose::VarFieldType::VAR_FIELD_STANDARD
45 :
Moose::VarFieldType::VAR_FIELD_VECTOR),
46 _var(this->mooseVariableField()),
47 _phi(_assembly.phi(_var)),
48 _grad_phi(_assembly.gradPhi(_var)),
50 _grad_test(_var.gradPhi()),
52 _grad_u(_var.gradSln())
64 prepareVectorTag(_assembly, _var.number());
66 const std::vector<Real> * point_values =
67 _drop_duplicate_points ? NULL : &_local_dirac_kernel_info.getPoints()[_current_elem].second;
68 unsigned int local_qp = 0;
69 Real point_value = 1.0;
71 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
73 _current_point = _physical_point[_qp];
74 if (isActiveAtPoint(_current_elem, _current_point))
76 if (!_drop_duplicate_points)
77 point_value = (*point_values)[local_qp++];
79 for (_i = 0; _i < _test.size(); _i++)
80 _local_re(_i) += point_value * computeQpResidual();
84 accumulateTaggedLocalResidual();
91 prepareMatrixTag(_assembly, _var.number(), _var.number());
93 const std::vector<Real> * point_values =
94 _drop_duplicate_points ? NULL : &_local_dirac_kernel_info.getPoints()[_current_elem].second;
95 unsigned int local_qp = 0;
96 Real point_value = 1.0;
98 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
100 _current_point = _physical_point[_qp];
101 if (isActiveAtPoint(_current_elem, _current_point))
103 if (!_drop_duplicate_points)
104 point_value = (*point_values)[local_qp++];
106 for (_i = 0; _i < _test.size(); _i++)
107 for (_j = 0; _j < _phi.size(); _j++)
108 _local_ke(_i, _j) += point_value * computeQpJacobian();
112 accumulateTaggedLocalMatrix();
119 if (jvar_num == _var.number())
125 prepareMatrixTag(_assembly, _var.number(), jvar_num);
127 const std::vector<Real> * point_values =
128 _drop_duplicate_points ? NULL : &_local_dirac_kernel_info.getPoints()[_current_elem].second;
129 unsigned int local_qp = 0;
130 Real point_value = 1.0;
132 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
134 _current_point = _physical_point[_qp];
135 if (isActiveAtPoint(_current_elem, _current_point))
137 if (!_drop_duplicate_points)
138 point_value = (*point_values)[local_qp++];
140 for (_i = 0; _i < _test.size(); _i++)
141 for (_j = 0; _j < _phi.size(); _j++)
142 _local_ke(_i, _j) += point_value * computeQpOffDiagJacobian(jvar_num);
146 accumulateTaggedLocalMatrix();
156 const auto subdomain = _current_elem->subdomain_id();
158 for (
const auto & [ivariable, jvariable] : _fe_problem.couplingEntries(_tid, _sys.number()))
160 const unsigned int ivar = ivariable->number();
161 const unsigned int jvar = jvariable->number();
163 if (ivar != _var.number() || !ivariable->activeOnSubdomain(subdomain) ||
164 !jvariable->activeOnSubdomain(subdomain) || jvariable->numberOfDofs() == 0)
168 computeOffDiagJacobian(jvar);
DiracKernelBase is the base class for all DiracKernel type classes.
static InputParameters validParams()
A DiracKernel is used when you need to add contributions to the residual by means of multiplying some...
virtual void computeResidualAndJacobian() override
Computes the residual and Jacobian together for the current element.
virtual void computeResidual() override
Computes the residual for the current element.
static InputParameters validParams()
virtual Real computeQpJacobian()
This is the virtual that derived classes should override for computing the Jacobian.
virtual void computeOffDiagJacobian(unsigned int jvar) override
Computes the off-diagonal Jacobian for variable jvar.
DiracKernelTempl(const InputParameters ¶meters)
virtual void computeJacobian() override
Computes the jacobian for the current element.
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
This gets called by computeOffDiagJacobian() at each quadrature point.
void statefulPropertiesAllowed(bool)
Derived classes can declare whether or not they work with stateful material properties.
void addMooseVariableDependency(MooseVariableFieldBase *var)
Call this function to add the passed in MooseVariableFieldBase as a variable that this object depends...
Interface for objects that need to get values of MooseVariables.
MooseVariableField< T > & mooseVariableField()
Return the MooseVariableField object that this interface acts on.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...