https://mooseframework.inl.gov
Loading...
Searching...
No Matches
KernelScalarBase.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
10#include "KernelScalarBase.h"
11
12#include "Assembly.h"
13#include "FEProblemBase.h"
14#include "SubProblem.h"
15#include "SystemBase.h"
16#include "MooseVariableFE.h"
17#include "MooseVariableScalar.h"
18
19#include "libmesh/quadrature.h"
20
23{
25 // This parameter can get renamed in derived class to a more relevant variable name
26 params.addCoupledVar("scalar_variable", "Primary coupled scalar variable");
27 params.addParam<bool>("compute_scalar_residuals", true, "Whether to compute scalar residuals");
28 params.addParam<bool>(
29 "compute_field_residuals", true, "Whether to compute residuals for the field variable.");
30 return params;
31}
32
34 : Kernel(parameters),
35 _use_scalar(isParamValid("scalar_variable") ? true : false),
36 _compute_scalar_residuals(!_use_scalar ? false : getParam<bool>("compute_scalar_residuals")),
37 _compute_field_residuals(getParam<bool>("compute_field_residuals")),
38 _kappa_var_ptr(_use_scalar ? getScalarVar("scalar_variable", 0) : nullptr),
39 _kappa_var(_use_scalar ? _kappa_var_ptr->number() : 0),
40 _k_order(_use_scalar ? _kappa_var_ptr->order() : 0),
41 _kappa(_use_scalar ? (_is_implicit ? _kappa_var_ptr->sln() : _kappa_var_ptr->slnOld()) : _zero)
42{
43}
44
45void
47{
49 Kernel::computeResidual(); // compute and assemble regular variable contributions
50
53}
54
55void
57{
58 std::vector<Real> scalar_residuals(_k_order);
59
60 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
61 {
63 for (_h = 0; _h < _k_order; _h++)
64 scalar_residuals[_h] += _JxW[_qp] * _coord[_qp] * computeScalarQpResidual();
65 }
66
69}
70
71void
80
81void
100
101void
103{
104 if (_use_scalar)
105 {
106 if (jvar_num == variable().number()) // column for this kernel's variable
107 {
109 Kernel::computeJacobian(); // d-_var-residual / d-_var
111 computeScalarOffDiagJacobian(jvar_num); // d-_kappa-residual / d-_var
112 }
113 else if (jvar_num == _kappa_var) // column for this kernel's scalar variable
114 // handle these in computeOffDiagJacobianScalar
115 return;
116 else // some other column for regular variable
117 {
119 Kernel::computeOffDiagJacobian(jvar_num); // d-_var-residual / d-jvar
121 computeScalarOffDiagJacobian(jvar_num); // d-_kappa-residual / d-jvar
122 }
123 }
124 else
125 {
126 if (jvar_num == variable().number()) // column for this kernel's variable
127 {
129 Kernel::computeJacobian(); // d-_var-residual / d-_var
130 }
131 else // some other column for regular variable
132 {
134 Kernel::computeOffDiagJacobian(jvar_num); // d-_var-residual / d-jvar
135 }
136 }
137}
138
139void
141{
142 const auto & jvar = getVariable(jvar_num);
143 if (jvar.fieldType() == Moose::VarFieldType::VAR_FIELD_STANDARD)
144 {
145 // Get dofs and order of this variable; at least one will be _var
146 // const auto & jv0 = cast_ref<const MooseVariable &>(jvar);
147 // const auto & loc_phi = jv0.phi();
148 const auto jvar_size = jvar.phiSize();
149 _local_ke.resize(_k_order, jvar_size);
150
151 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
152 {
154 for (_h = 0; _h < _k_order; _h++)
155 for (_j = 0; _j < jvar_size; _j++)
157 }
158 }
159 else if (jvar.fieldType() == Moose::VarFieldType::VAR_FIELD_ARRAY)
160 mooseError("Array variable cannot be coupled into Kernel Scalar currently");
161 else
162 mooseError("Vector variable cannot be coupled into Kernel Scalar currently");
163
165 _local_ke,
167 jvar.dofIndices(),
169}
170
171void
173{
174 // Get dofs and order of this scalar; at least one will be _kappa_var
175 const auto & svar = _sys.getScalarVariable(_tid, svar_num);
176 const unsigned int s_order = svar.order();
177 _local_ke.resize(_test.size(), s_order);
178
179 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
180 {
181 initScalarQpJacobian(svar_num);
182 for (_i = 0; _i < _test.size(); _i++)
183 for (_l = 0; _l < s_order; _l++)
185 }
186
188}
189
190void
192{
194 if (_use_scalar)
195 {
196 if (svar_num == variable().number()) // column for this kernel's variable
197 // this kernel's variable is not a scalar
198 return;
199 else if (svar_num == _kappa_var) // column for this kernel's scalar variable
200 {
201 // Perform assembly using method in Kernel; works for simple cases but not general
202 // Kernel::computeOffDiagJacobianScalar(svar_num); // d-_var-residual / d-_kappa
203 // Perform assembly using local_ke like d-_kappa_var-residual / d-_var
205 computeOffDiagJacobianScalarLocal(svar_num); // d-_var-residual / d-_kappa
207 computeScalarJacobian(); // d-_kappa-residual / d-_kappa
208 }
209 else // some other column for scalar variable
210 {
211 // Perform assembly using method in Kernel; works for simple cases but not general
212 // Kernel::computeOffDiagJacobianScalar(svar_num); // d-_var-residual / d-jvar
213 // Perform assembly using local_ke like d-_kappa_var-residual / d-_var
215 computeOffDiagJacobianScalarLocal(svar_num); // d-_var-residual / d-svar
217 computeScalarOffDiagJacobianScalar(svar_num); // d-_kappa-residual / d-svar
218 }
219 }
221 Kernel::computeOffDiagJacobianScalar(svar_num); // d-_var-residual / d-svar
222}
223
224void
226{
227 // Get dofs and order of this scalar; at least one will be _kappa_var
228 const auto & svar = _sys.getScalarVariable(_tid, svar_num);
229 const unsigned int s_order = svar.order();
230 _local_ke.resize(_k_order, s_order);
231
232 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
233 {
234 initScalarQpJacobian(svar_num);
235 for (_h = 0; _h < _k_order; _h++)
236 for (_l = 0; _l < s_order; _l++)
237 _local_ke(_h, _l) +=
239 }
240
242 _local_ke,
244 svar.dofIndices(),
246}
247
248void
250{
251 Kernel::computeResidualAndJacobian(); // compute and assemble regular variable contributions
252
253 // only if this coupling is being used by the preconditioner (otherwise the value is zero)
254 if (_is_implicit)
255 for (const auto * jvar : getCoupledMooseScalarVars())
256 if (_fe_problem.areCoupled(_var.number(), jvar->number(), _sys.number()))
257 computeOffDiagJacobianScalar(jvar->number());
258}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
bool areCoupled(const unsigned int ivar, const unsigned int jvar, const unsigned int nl_sys_num) const
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
void addCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
const MooseArray< Real > & _coord
The scaling factor to convert from cartesian to another coordinate system (e.g rz,...
Definition KernelBase.h:55
unsigned int _qp
The current quadrature point index.
Definition KernelBase.h:43
const MooseArray< Real > & _JxW
The current quadrature point weight value.
Definition KernelBase.h:52
unsigned int _j
current index for the shape function
Definition KernelBase.h:61
unsigned int _i
current index for the test function
Definition KernelBase.h:58
const QBase *const & _qrule
active quadrature rule
Definition KernelBase.h:49
virtual void precalculateOffDiagJacobianScalar(unsigned int)
Precalculate method that is executed prior to scalar coupled variable loop within computeOffDiagJacob...
virtual void computeScalarOffDiagJacobian(const unsigned int jvar_num)
Method for computing an off-diagonal jacobian component d-_kappa-residual / d-jvar.
virtual void computeOffDiagJacobian(unsigned int jvar_num) override
Computes d-_var-residual / d-jvar as well as d-_kappa-residual / d-jvar.
virtual void computeJacobian() override
Compute this Kernel's contribution to the diagonal Jacobian entries.
virtual void initScalarQpJacobian(const unsigned int)
Put necessary evaluations depending on qp but independent of test and shape functions here.
virtual void computeScalarJacobian()
Method for computing the scalar variable part of Jacobian.
virtual Real computeScalarQpOffDiagJacobian(const unsigned int)
Method for computing an off-diagonal jacobian component at quadrature points.
virtual Real computeScalarQpResidual()
Method for computing the scalar part of residual at quadrature points.
virtual Real computeScalarQpJacobian()
Method for computing the scalar variable part of Jacobian at quadrature points.
const unsigned int _kappa_var
The unknown scalar variable ID.
virtual void initScalarQpOffDiagJacobian(const MooseVariableFEBase &)
Put necessary evaluations depending on qp but independent of test and shape functions here for off-di...
const unsigned int _k_order
Order of the scalar variable, used in several places.
void computeOffDiagJacobianScalar(unsigned int svar_num) override
Computes jacobian block with respect to a scalar variable.
virtual void computeResidualAndJacobian() override
Compute the residual and Jacobian together.
const bool _compute_field_residuals
Whether to compute field contributions for this instance.
virtual void initScalarQpResidual()
Put necessary evaluations depending on qp but independent of test functions here.
virtual void computeResidual() override
Compute this Kernel's contribution to the residual.
unsigned int _h
Used internally to iterate over each scalar component.
virtual void computeOffDiagJacobianScalarLocal(const unsigned int svar_num)
Method for computing an off-diagonal jacobian component d-_var-residual / d-scalar Revised version of...
virtual void computeScalarOffDiagJacobianScalar(const unsigned int svar_num)
Method for computing an off-diagonal jacobian component d-_kappa-residual / d-scalar.
virtual Real computeScalarQpOffDiagJacobianScalar(const unsigned int)
Method for computing an off-diagonal jacobian component at quadrature points.
const MooseVariableScalar *const _kappa_var_ptr
(Pointer to) Scalar variable this kernel operates on
static InputParameters validParams()
KernelScalarBase(const InputParameters &parameters)
const bool _use_scalar
Whether a scalar variable is declared for this kernel.
virtual void computeScalarResidual()
Method for computing the scalar part of residual.
const bool _compute_scalar_residuals
Whether to compute scalar contributions for this instance.
virtual void computeResidual() override
Compute this Kernel's contribution to the residual.
Definition Kernel.C:92
virtual void computeOffDiagJacobianScalar(unsigned int jvar) override
Computes jacobian block with respect to a scalar variable.
Definition Kernel.C:185
virtual void computeResidualAndJacobian() override
Compute the residual and Jacobian together.
Definition Kernel.C:199
virtual void computeOffDiagJacobian(unsigned int jvar) override
Computes d-residual / d-jvar... storing the result in Ke.
Definition Kernel.C:133
MooseVariable & _var
This is a regular kernel so we cast to a regular MooseVariable.
Definition Kernel.h:72
virtual void computeJacobian() override
Compute this Kernel's contribution to the diagonal Jacobian entries.
Definition Kernel.C:112
const VariableTestValue & _test
the current test function
Definition Kernel.h:75
static InputParameters validParams()
Definition Kernel.C:24
virtual Real computeQpOffDiagJacobianScalar(unsigned int)
For coupling scalar variables.
Definition Kernel.h:61
virtual const MooseVariable & variable() const override
Returns the variable that this object operates on.
Definition Kernel.h:40
virtual const std::vector< dof_id_type > & dofIndices() const
Get local DoF indices.
void scalingFactor(const std::vector< Real > &factor)
Set the scaling factor for this variable.
libMesh::Order order() const
Get the order of this variable Note: Order enum can be implicitly converted to unsigned int.
unsigned int number() const
Get variable number coming from libMesh.
const std::vector< dof_id_type > & dofIndices() const final
Get local DoF indices.
THREAD_ID _tid
The thread ID for this kernel.
Assembly & _assembly
Reference to this Kernel's assembly object.
const MooseVariableFieldBase & getVariable(unsigned int jvar_num) const
Retrieve the variable object from our system associated with jvar_num.
SystemBase & _sys
Reference to the EquationSystem object.
FEProblemBase & _fe_problem
Reference to this kernel's FEProblemBase.
const std::vector< MooseVariableScalar * > & getCoupledMooseScalarVars()
Get the list of coupled scalar variables.
unsigned int number() const
Gets the number of this system.
virtual MooseVariableScalar & getScalarVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a scalar variable with specified number.
Definition SystemBase.C:144
DenseMatrix< Number > _local_ke
Holds local Jacobian entries as they are accumulated by this Kernel.
void addJacobian(Assembly &assembly, const Residuals &residuals, const Indices &dof_indices, Real scaling_factor)
Add the provided residual derivatives into the Jacobian for the provided dof indices.
void addResiduals(Assembly &assembly, const Residuals &residuals, const Indices &dof_indices, Real scaling_factor)
Add the provided incoming residuals corresponding to the provided dof indices.
bool _is_implicit
If the object is using implicit or explicit form.
void resize(const unsigned int new_m, const unsigned int new_n)
@ VAR_FIELD_STANDARD
Definition MooseTypes.h:777
@ VAR_FIELD_ARRAY
Definition MooseTypes.h:780